diff options
837 files changed, 113990 insertions, 32865 deletions
diff --git a/.gitignore b/.gitignore index 9096ff228a..19490b9878 100644 --- a/.gitignore +++ b/.gitignore @@ -21,6 +21,7 @@ project.properties platform/android/java/lib/.cxx/ platform/android/java/libs/* platform/android/java/app/libs/* +platform/android/java/lib/.cxx/* # General c++ generated files *.lib @@ -26,6 +26,7 @@ Clay John <claynjohn@gmail.com> <clayjohn@shaw.ca> Dana Olson <dana@shineuponthee.com> <adolson@gmail.com> dankan1890 <mewuidev2@gmail.com> Daniel J. Ramirez <djrmuv@gmail.com> +Dominik 'dreamsComeTrue' Jasiński <dominikjasinski@o2.pl> Emmanuel Barroga <emmanuelbarroga@gmail.com> Erik Selecký <35656626+rxlecky@users.noreply.github.com> Erik Selecký <35656626+rxlecky@users.noreply.github.com> <35656626+SeleckyErik@users.noreply.github.com> @@ -75,6 +76,7 @@ Mariano Javier Suligoy <marianognu.easyrpg@gmail.com> Mario Schlack <m4r10.5ch14ck@gmail.com> marxin <mliska@suse.cz> marynate <mary.w.nate@gmail.com> <marynate@github.com> +Mateo Kuruk Miccino <mateomiccino@gmail.com> Max Hilbrunner <m.hilbrunner@gmail.com> Max Hilbrunner <m.hilbrunner@gmail.com> <mhilbrunner@users.noreply.github.com> Michael Alexsander <michaelalexsander@protonmail.com> diff --git a/.travis.yml b/.travis.yml index 14ee95e77e..8cfd7a1a7f 100644 --- a/.travis.yml +++ b/.travis.yml @@ -55,17 +55,15 @@ matrix: packages: - *linux_deps -# TODO: Android support - -# - name: Android export template (release_debug, Clang) -# stage: build -# env: PLATFORM=android TOOLS=no TARGET=release_debug CACHE_NAME=${PLATFORM}-clang EXTRA_ARGS="warnings=extra werror=yes" -# os: linux -# compiler: clang -# addons: -# apt: -# packages: -# - openjdk-8-jdk + - name: Android export template (release_debug, Clang) + stage: build + env: PLATFORM=android TOOLS=no TARGET=release_debug CACHE_NAME=${PLATFORM}-clang EXTRA_ARGS="warnings=extra werror=yes" + os: linux + compiler: clang + addons: + apt: + packages: + - openjdk-8-jdk - name: macOS editor (debug, Clang) stage: build @@ -92,21 +90,6 @@ matrix: # packages: # - scons -# TODO: Dummy/Offscreen rasterizer - -# - name: Linux headless editor (release_debug, GCC 9, testing project exporting and script running) -# stage: build -# env: PLATFORM=server TOOLS=yes TARGET=release_debug CACHE_NAME=${PLATFORM}-tools-gcc-9 MATRIX_EVAL="CC=gcc-9 && CXX=g++-9" EXTRA_ARGS="warnings=extra werror=yes" TEST_PROJECT=yes -# os: linux -# compiler: gcc-9 -# addons: -# apt: -# sources: -# - sourceline: "ppa:ubuntu-toolchain-r/test" -# packages: -# - *gcc9_deps -# - *linux_deps - - name: Linux export template (release_debug, GCC 7, without 3D support) stage: build env: PLATFORM=linuxbsd TOOLS=no TARGET=release_debug CACHE_NAME=${PLATFORM}-gcc-7 EXTRA_ARGS="disable_3d=yes" diff --git a/AUTHORS.md b/AUTHORS.md index a3269a73f7..0f002cfaed 100644 --- a/AUTHORS.md +++ b/AUTHORS.md @@ -61,6 +61,7 @@ name is available. David Sichma (DavidSichma) Dharkael (lupoDharkael) Dmitry Koteroff (Krakean) + Dominik Jasiński (dreamsComeTrue) DualMatrix Emmanuel Barroga (codecustard) Emmanuel Leblond (touilleMan) @@ -104,6 +105,7 @@ name is available. Kelly Thomas (KellyThomas) Kostadin Damyanov (Max-Might) K. S. Ernest (iFire) Lee (fire) + lawnjelly Leon Krause (eska014) Lucien Menassol (Kanabenki) m4nu3lf @@ -118,6 +120,7 @@ name is available. Martin Sjursen (binbitten) marynate Masoud BH (masoudbh3) + Mateo Kuruk Miccino (kuruk-mm) Matthias Hölzl (hoelzl) Max Hilbrunner (mhilbrunner) merumelu @@ -157,6 +160,7 @@ name is available. Shiqing (kawa-yoiko) Simon Wenner (swenner) Swarnim Arun (minraws) + Thakee Nathees (ThakeeNathees) Theo Hallenius (TheoXD) Thomas Herzog (karroffel) Timo Schwarzer (timoschwarzer) 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 @@ -40,6 +40,7 @@ generous deed immortalized in the next stable release of Godot Engine. Grady Hein-Pieter van Braam Jacob McKenney + Jasper Brooks Javary Co. Jeffery Chiu Justin Arnold @@ -62,6 +63,7 @@ generous deed immortalized in the next stable release of Godot Engine. Andrei Dave David Gehrig + David Graham David Snopek Ed Morley Florian Krick @@ -69,7 +71,6 @@ generous deed immortalized in the next stable release of Godot Engine. Jakub Grzesik Manuele Finocchiaro Officine Pixel S.n.c. - Retro Village Ronan Zeegers Sofox Taylor Ritenour @@ -99,6 +100,7 @@ generous deed immortalized in the next stable release of Godot Engine. Matthew Hillier Mohamed Ikbel Boulabiar Mored4u + Retro Village Rob Messick Ryan Badour Sandro Jenny @@ -106,10 +108,12 @@ generous deed immortalized in the next stable release of Godot Engine. Sergey thechris Tom Langwaldt + Tricky Fat Cat tukon William Wold Alex Khayrullin + alice gambrell Chris Goddard Chris Serino Christian Padilla @@ -151,6 +155,7 @@ generous deed immortalized in the next stable release of Godot Engine. Charlie Whitfield Chase Taranto Chris Petrich + Christian Alexander Bjørklund Bøhler Christian Leth Jeppesen Christoph Schröder Cody Parker @@ -186,6 +191,7 @@ generous deed immortalized in the next stable release of Godot Engine. Joshua Lesperance Juan Velandia Juraj Móza + Kelteseth kinfox Marcelo Dornbusch Lopes Markus Fehr @@ -193,9 +199,11 @@ generous deed immortalized in the next stable release of Godot Engine. Martin Eigel Matt Eunson Max Bulai + m kaersten MuffinManKen Nick Nikitin Oliver Dick + Oscar Campos Patrick Ting Paul Hocker Paul Von Zimmerman @@ -205,9 +213,12 @@ generous deed immortalized in the next stable release of Godot Engine. Robert Larnach Rocknight Studios Romildo Franco + Ryan Samuel Judd Scott Pilet Sean Morgan + Serban Serafimescu + Sindre Sømme SleepCircle spilldata Steve Hyatt @@ -216,7 +227,6 @@ generous deed immortalized in the next stable release of Godot Engine. Thomas Krampl Thomas Kurz Tobias Bocanegra - Tricky Fat Cat Urho William Foster Zhou Tuizhi @@ -232,6 +242,7 @@ generous deed immortalized in the next stable release of Godot Engine. Adam Carr Adam Long Adam McCurdy + Adam Netzel Adam N Webber Adam Smeltzer Adam Szymański @@ -244,6 +255,7 @@ generous deed immortalized in the next stable release of Godot Engine. Alan Stice Albin Jonasson Svärdsby Alder Stefano + AleMax Alessandro Senese Alexander Erlemann alex clavelle @@ -253,6 +265,7 @@ generous deed immortalized in the next stable release of Godot Engine. Andreas Krampitz André Simões Andrew Thomas + Anthony Avina Anthony Staunton AP Condomines Arda Erol @@ -260,6 +273,7 @@ generous deed immortalized in the next stable release of Godot Engine. Arseniy M Arthur S. Muszynski Asger + Ashley Claymore Aubrey Falconer Avencherus B A @@ -269,6 +283,7 @@ generous deed immortalized in the next stable release of Godot Engine. Ben Phelan Ben Vercammen Bernd Jänichen + Bjarne Black Block Blair Allen Bobby CC Wong @@ -276,6 +291,7 @@ generous deed immortalized in the next stable release of Godot Engine. bugcaptor Burney Waring Cameron Meyer + Carlo Sitaro Carl van der Geest Carwyn Edwards Cassidy James @@ -284,11 +300,11 @@ generous deed immortalized in the next stable release of Godot Engine. Christian Winter Christoffer Sundbom Christoph Brodmann + Christophe Gagnier Christopher Schmitt Christoph Woinke Clay Heaton Curt King - Dancin Liao Daniel Johnson Daniel Kimblad Daniel Pontillo @@ -328,7 +344,6 @@ generous deed immortalized in the next stable release of Godot Engine. Gary Thomas George Marques GiulianoB - Gordian Arragon Greg Olson GREGORY C FEIN Greg P @@ -337,13 +352,13 @@ generous deed immortalized in the next stable release of Godot Engine. Guldoman Hal A Heribert Hirth - Hudson Thorpe-Doubble Hunter Jones Hylpher Ichiro Dohi Iiari iKlem IndustrialRobot + Jacob Jaiden Gerig Jaime Ruiz-Borau Vizárraga Jako Danar @@ -351,7 +366,6 @@ generous deed immortalized in the next stable release of Godot Engine. Janders Jannik Gröger JARKKO PARVIAINEN - Jarrod Davis Jeff Hungerford Jennifer Graves Jeremy Kahn @@ -362,8 +376,10 @@ generous deed immortalized in the next stable release of Godot Engine. Johannes Wuensch John Gabriel Jomei Jackson + Jonas Bernemann Jonas Rudlang Jonas Yamazaki + Jonatan R Jonathan G Jonathon Jon Bonazza @@ -376,6 +392,7 @@ generous deed immortalized in the next stable release of Godot Engine. Judd Julian Murgia JungleRobba + Justin Hamilton Justin Spedding KaDokta Kauzig @@ -383,6 +400,7 @@ generous deed immortalized in the next stable release of Godot Engine. Keith Bradner Kevin McPhillips kickmaniac + Kiri Jolly Kiyohiro Kawamura (kyorohiro) Kjetil Haugland Klagsam @@ -394,6 +412,7 @@ generous deed immortalized in the next stable release of Godot Engine. Laurent Tréguier Leonardo Dimano Levi Lindsey + Lin Chear Linus Lind Lundgren Lionel Gaillard Luigi Renna @@ -418,8 +437,10 @@ generous deed immortalized in the next stable release of Godot Engine. Melissa Mears mewin mhilbrunner + Michael Dürwald Michael Haney Michael Labbe + Michał Skwarek Mikael Olsson Mikayla Mike Birkhead @@ -479,6 +500,7 @@ generous deed immortalized in the next stable release of Godot Engine. Scott D. Yelich Scott Longley Sebastian Michailidis + Sebastian Vetter Sergio Mello-Grand sgnsajgon Shane @@ -489,6 +511,7 @@ generous deed immortalized in the next stable release of Godot Engine. SK smbe19 smo1704 + Stefano Caronia Svenne Krap Terry tezuvholovdr @@ -498,7 +521,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 Torgeir Lilleskog Torsten Crass Travis O'Brien diff --git a/SConstruct b/SConstruct index 8fc333a8fa..e866a4c998 100644 --- a/SConstruct +++ b/SConstruct @@ -12,6 +12,7 @@ import sys # Local import methods import gles_builders +import version from platform_methods import run_in_subprocess # Scan possible build platforms @@ -72,6 +73,7 @@ env_base.disabled_modules = [] env_base.use_ptrcall = False env_base.module_version_string = "" env_base.msvc = False +env_base.stable_release = version.status == "stable" env_base.__class__.disable_module = methods.disable_module @@ -126,7 +128,7 @@ opts.Add(BoolVariable("xaudio2", "Enable the XAudio2 audio driver", False)) opts.Add(BoolVariable("verbose", "Enable verbose output for the compilation", False)) opts.Add(BoolVariable("progress", "Show a progress indicator during compilation", True)) opts.Add(EnumVariable("warnings", "Level of compilation warnings", "all", ("extra", "all", "moderate", "no"))) -opts.Add(BoolVariable("werror", "Treat compiler warnings as errors", True)) +opts.Add(BoolVariable("werror", "Treat compiler warnings as errors", not env_base.stable_release)) opts.Add(BoolVariable("dev", "If yes, alias for verbose=yes warnings=extra werror=yes", False)) opts.Add("extra_suffix", "Custom extra suffix added to the base filename of all generated binary files", "") opts.Add(BoolVariable("vsproj", "Generate a Visual Studio solution", False)) diff --git a/core/array.cpp b/core/array.cpp index d65bddae61..cd4e0fb4c8 100644 --- a/core/array.cpp +++ b/core/array.cpp @@ -30,8 +30,10 @@ #include "array.h" +#include "container_type_validate.h" #include "core/hashfuncs.h" #include "core/object.h" +#include "core/script_language.h" #include "core/variant.h" #include "core/vector.h" @@ -39,6 +41,8 @@ class ArrayPrivate { public: SafeRefCount refcount; Vector<Variant> array; + + ContainerTypeValidate typed; }; void Array::_ref(const Array &p_from) const { @@ -108,12 +112,59 @@ uint32_t Array::hash() const { } return h; } -void Array::operator=(const Array &p_array) { - _ref(p_array); +void Array::_assign(const Array &p_array) { + + if (_p->typed.type != Variant::OBJECT && _p->typed.type == p_array._p->typed.type) { + //same type or untyped, just reference, shuold be fine + _ref(p_array); + } else if (_p->typed.type == Variant::NIL) { //from typed to untyped, must copy, but this is cheap anyway + _p->array = p_array._p->array; + } else if (p_array._p->typed.type == Variant::NIL) { //from untyped to typed, must try to check if they are all valid + if (_p->typed.type == Variant::OBJECT) { + //for objects, it needs full validation, either can be converted or fail + for (int i = 0; i < p_array._p->array.size(); i++) { + if (!_p->typed.validate(p_array._p->array[i], "assign")) { + return; + } + } + _p->array = p_array._p->array; //then just copy, which is cheap anyway + + } else { + //for non objects, we need to check if there is a valid conversion, which needs to happen one by one, so this is the worst case. + Vector<Variant> new_array; + new_array.resize(p_array._p->array.size()); + for (int i = 0; i < p_array._p->array.size(); i++) { + Variant src_val = p_array._p->array[i]; + if (src_val.get_type() == _p->typed.type) { + new_array.write[i] = src_val; + } else if (Variant::can_convert_strict(src_val.get_type(), _p->typed.type)) { + Variant *ptr = &src_val; + Callable::CallError ce; + new_array.write[i] = Variant::construct(_p->typed.type, (const Variant **)&ptr, 1, ce, true); + if (ce.error != Callable::CallError::CALL_OK) { + ERR_FAIL_MSG("Unable to convert array index " + itos(i) + " from '" + Variant::get_type_name(src_val.get_type()) + "' to '" + Variant::get_type_name(_p->typed.type) + "'."); + } + } else { + ERR_FAIL_MSG("Unable to convert array index " + itos(i) + " from '" + Variant::get_type_name(src_val.get_type()) + "' to '" + Variant::get_type_name(_p->typed.type) + "'."); + } + } + + _p->array = new_array; + } + } else if (_p->typed.can_reference(p_array._p->typed)) { //same type or compatible + _ref(p_array); + } else { + ERR_FAIL_MSG("Assignment of arrays of incompatible types."); + } +} + +void Array::operator=(const Array &p_array) { + _assign(p_array); } void Array::push_back(const Variant &p_value) { + ERR_FAIL_COND(!_p->typed.validate(p_value, "push_back")); _p->array.push_back(p_value); } @@ -124,11 +175,13 @@ Error Array::resize(int p_new_size) { void Array::insert(int p_pos, const Variant &p_value) { + ERR_FAIL_COND(!_p->typed.validate(p_value, "insert")); _p->array.insert(p_pos, p_value); } void Array::erase(const Variant &p_value) { + ERR_FAIL_COND(!_p->typed.validate(p_value, "erase")); _p->array.erase(p_value); } @@ -144,6 +197,7 @@ Variant Array::back() const { int Array::find(const Variant &p_value, int p_from) const { + ERR_FAIL_COND_V(!_p->typed.validate(p_value, "find"), -1); return _p->array.find(p_value, p_from); } @@ -151,6 +205,7 @@ int Array::rfind(const Variant &p_value, int p_from) const { if (_p->array.size() == 0) return -1; + ERR_FAIL_COND_V(!_p->typed.validate(p_value, "rfind"), -1); if (p_from < 0) { // Relative offset from the end @@ -173,11 +228,13 @@ int Array::rfind(const Variant &p_value, int p_from) const { int Array::find_last(const Variant &p_value) const { + ERR_FAIL_COND_V(!_p->typed.validate(p_value, "find_last"), -1); return rfind(p_value); } int Array::count(const Variant &p_value) const { + ERR_FAIL_COND_V(!_p->typed.validate(p_value, "count"), 0); if (_p->array.size() == 0) return 0; @@ -193,6 +250,8 @@ int Array::count(const Variant &p_value) const { } bool Array::has(const Variant &p_value) const { + ERR_FAIL_COND_V(!_p->typed.validate(p_value, "use 'has'"), false); + return _p->array.find(p_value, 0) != -1; } @@ -203,6 +262,8 @@ void Array::remove(int p_pos) { void Array::set(int p_idx, const Variant &p_value) { + ERR_FAIL_COND(!_p->typed.validate(p_value, "set")); + operator[](p_idx) = p_value; } @@ -216,6 +277,7 @@ Array Array::duplicate(bool p_deep) const { Array new_arr; int element_count = size(); new_arr.resize(element_count); + new_arr._p->typed = _p->typed; for (int i = 0; i < element_count; i++) { new_arr[i] = p_deep ? get(i).duplicate(p_deep) : get(i); } @@ -369,11 +431,13 @@ _FORCE_INLINE_ int bisect(const Vector<Variant> &p_array, const Variant &p_value int Array::bsearch(const Variant &p_value, bool p_before) { + ERR_FAIL_COND_V(!_p->typed.validate(p_value, "binary search"), -1); return bisect(_p->array, p_value, p_before, _ArrayVariantSort()); } int Array::bsearch_custom(const Variant &p_value, Object *p_obj, const StringName &p_function, bool p_before) { + ERR_FAIL_COND_V(!_p->typed.validate(p_value, "custom binary search"), -1); ERR_FAIL_NULL_V(p_obj, 0); _ArrayVariantSortCustom less; @@ -391,6 +455,7 @@ Array &Array::invert() { void Array::push_front(const Variant &p_value) { + ERR_FAIL_COND(!_p->typed.validate(p_value, "push_front")); _p->array.insert(0, p_value); } @@ -465,6 +530,27 @@ const void *Array::id() const { return _p->array.ptr(); } +Array::Array(const Array &p_from, uint32_t p_type, const StringName &p_class_name, const Variant &p_script) { + _p = memnew(ArrayPrivate); + _p->refcount.init(); + set_typed(p_type, p_class_name, p_script); + _assign(p_from); +} + +void Array::set_typed(uint32_t p_type, const StringName &p_class_name, const Variant &p_script) { + ERR_FAIL_COND_MSG(_p->array.size() > 0, "Type can only be set when array is empty."); + ERR_FAIL_COND_MSG(_p->refcount.get() > 1, "Type can only be set when array has no more than one user."); + ERR_FAIL_COND_MSG(_p->typed.type != Variant::NIL, "Type can only be set once."); + ERR_FAIL_COND_MSG(p_class_name != StringName() && p_type != Variant::OBJECT, "Class names can only be set for type OBJECT"); + Ref<Script> script = p_script; + ERR_FAIL_COND_MSG(script.is_valid() && p_class_name == StringName(), "Script class can only be set together with base class name"); + + _p->typed.type = Variant::Type(p_type); + _p->typed.class_name = p_class_name; + _p->typed.script = script; + _p->typed.where = "TypedArray"; +} + Array::Array(const Array &p_from) { _p = nullptr; diff --git a/core/array.h b/core/array.h index 3b14bdb9fe..2840ce199c 100644 --- a/core/array.h +++ b/core/array.h @@ -47,6 +47,10 @@ class Array { int _clamp_index(int p_index) const; static int _fix_slice_index(int p_index, int p_arr_len, int p_top_mod); +protected: + Array(const Array &p_base, uint32_t p_type, const StringName &p_class_name, const Variant &p_script); + void _assign(const Array &p_array); + public: Variant &operator[](int p_idx); const Variant &operator[](int p_idx) const; @@ -101,6 +105,7 @@ public: const void *id() const; + void set_typed(uint32_t p_type, const StringName &p_class_name, const Variant &p_script); Array(const Array &p_from); Array(); ~Array(); 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/callable_method_pointer.h b/core/callable_method_pointer.h index a931a344e6..fb809c2b44 100644 --- a/core/callable_method_pointer.h +++ b/core/callable_method_pointer.h @@ -34,6 +34,7 @@ #include "core/callable.h" #include "core/hashfuncs.h" #include "core/object.h" +#include "core/os/copymem.h" #include "core/simple_type.h" class CallableCustomMethodPointerBase : public CallableCustom { diff --git a/core/class_db.cpp b/core/class_db.cpp index 691b5a20fd..5e49688e9b 100644 --- a/core/class_db.cpp +++ b/core/class_db.cpp @@ -930,6 +930,15 @@ void ClassDB::add_property_group(StringName p_class, const String &p_name, const type->property_list.push_back(PropertyInfo(Variant::NIL, p_name, PROPERTY_HINT_NONE, p_prefix, PROPERTY_USAGE_GROUP)); } +void ClassDB::add_property_subgroup(StringName p_class, const String &p_name, const String &p_prefix) { + + OBJTYPE_WLOCK; + ClassInfo *type = classes.getptr(p_class); + ERR_FAIL_COND(!type); + + type->property_list.push_back(PropertyInfo(Variant::NIL, p_name, PROPERTY_HINT_NONE, p_prefix, PROPERTY_USAGE_SUBGROUP)); +} + void ClassDB::add_property(StringName p_class, const PropertyInfo &p_pinfo, const StringName &p_setter, const StringName &p_getter, int p_index) { lock->read_lock(); diff --git a/core/class_db.h b/core/class_db.h index 1cbff34ea1..f760aa1738 100644 --- a/core/class_db.h +++ b/core/class_db.h @@ -349,6 +349,7 @@ public: static void get_signal_list(StringName p_class, List<MethodInfo> *p_signals, bool p_no_inheritance = false); static void add_property_group(StringName p_class, const String &p_name, const String &p_prefix = ""); + static void add_property_subgroup(StringName p_class, const String &p_name, const String &p_prefix = ""); static void add_property(StringName p_class, const PropertyInfo &p_pinfo, const StringName &p_setter, const StringName &p_getter, int p_index = -1); static void set_property_default_value(StringName p_class, const StringName &p_name, const Variant &p_default); static void get_property_list(StringName p_class, List<PropertyInfo> *p_list, bool p_no_inheritance = false, const Object *p_validator = nullptr); diff --git a/core/color.h b/core/color.h index 16dc721072..d95e80f5da 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; diff --git a/core/container_type_validate.h b/core/container_type_validate.h new file mode 100644 index 0000000000..3721668033 --- /dev/null +++ b/core/container_type_validate.h @@ -0,0 +1,98 @@ +#ifndef CONTAINER_TYPE_VALIDATE_H +#define CONTAINER_TYPE_VALIDATE_H + +#include "core/script_language.h" +#include "core/variant.h" + +struct ContainerTypeValidate { + + Variant::Type type = Variant::NIL; + StringName class_name; + Ref<Script> script; + const char *where = "conatiner"; + + _FORCE_INLINE_ bool can_reference(const ContainerTypeValidate &p_type) const { + if (type == p_type.type) { + if (type != Variant::OBJECT) { + return true; //nothing else to check + } + } else { + return false; + } + + //both are object + + if ((class_name != StringName()) != (p_type.class_name != StringName())) { + return false; //both need to have class or none + } + + if (class_name != p_type.class_name) { + if (!ClassDB::is_parent_class(p_type.class_name, class_name)) { + return false; + } + } + + if (script.is_null() != p_type.script.is_null()) { + return false; + } + + if (script != p_type.script) { + if (!p_type.script->inherits_script(script)) { + return false; + } + } + + return true; + } + + _FORCE_INLINE_ bool validate(const Variant &p_variant, const char *p_operation = "use") { + + if (type == Variant::NIL) { + return true; + } + + ERR_FAIL_COND_V_MSG(type != p_variant.get_type(), false, "Attempted to " + String(p_operation) + " a variable of type '" + Variant::get_type_name(p_variant.get_type()) + "' into a " + where + " of type '" + Variant::get_type_name(type) + "'."); + if (type != p_variant.get_type()) { + return false; + } + + if (type != Variant::OBJECT) { + return true; + } +#ifdef DEBUG_ENABLED + ObjectID object_id = p_variant; + if (object_id == ObjectID()) { + return true; //fine its null; + } + Object *object = ObjectDB::get_instance(object_id); + ERR_FAIL_COND_V_MSG(object == nullptr, false, "Attempted to " + String(p_operation) + " an invalid (previously freed?) object instance into a '" + String(where) + "."); +#else + Object *object = p_variant; + if (object == nullptr) { + return true; //fine + } +#endif + if (class_name == StringName()) { + return true; //all good, no class type requested + } + + StringName obj_class = object->get_class_name(); + if (obj_class != class_name) { + ERR_FAIL_COND_V_MSG(!ClassDB::is_parent_class(object->get_class_name(), class_name), false, "Attempted to " + String(p_operation) + " an object of type '" + object->get_class() + "' into a " + where + ", which does not inherit from '" + String(class_name) + "'."); + } + + if (script.is_null()) { + return true; //all good + } + + Ref<Script> other_script = object->get_script(); + + //check base script.. + ERR_FAIL_COND_V_MSG(other_script.is_null(), false, "Attempted to " + String(p_operation) + " an object into a " + String(where) + ", that does not inherit from '" + String(script->get_class_name()) + "'."); + ERR_FAIL_COND_V_MSG(!other_script->inherits_script(script), false, "Attempted to " + String(p_operation) + " an object into a " + String(where) + ", that does not inherit from '" + String(script->get_class_name()) + "'."); + + return true; + } +}; + +#endif // CONTAINER_TYPE_VALIDATE_H diff --git a/core/crypto/crypto.cpp b/core/crypto/crypto.cpp index ab8548e3ba..233f62bd15 100644 --- a/core/crypto/crypto.cpp +++ b/core/crypto/crypto.cpp @@ -99,7 +99,7 @@ Crypto::Crypto() { /// Resource loader/saver -RES ResourceFormatLoaderCrypto::load(const String &p_path, const String &p_original_path, Error *r_error, bool p_use_sub_threads, float *r_progress) { +RES ResourceFormatLoaderCrypto::load(const String &p_path, const String &p_original_path, Error *r_error, bool p_use_sub_threads, float *r_progress, bool p_no_cache) { String el = p_path.get_extension().to_lower(); if (el == "crt") { diff --git a/core/crypto/crypto.h b/core/crypto/crypto.h index e515367de5..d9becab958 100644 --- a/core/crypto/crypto.h +++ b/core/crypto/crypto.h @@ -84,18 +84,14 @@ public: }; class ResourceFormatLoaderCrypto : public ResourceFormatLoader { - GDCLASS(ResourceFormatLoaderCrypto, ResourceFormatLoader); - public: - virtual RES load(const String &p_path, const String &p_original_path = "", Error *r_error = nullptr, bool p_use_sub_threads = false, float *r_progress = nullptr); + virtual RES load(const String &p_path, const String &p_original_path = "", Error *r_error = nullptr, bool p_use_sub_threads = false, float *r_progress = nullptr, bool p_no_cache = false); virtual void get_recognized_extensions(List<String> *p_extensions) const; virtual bool handles_type(const String &p_type) const; virtual String get_resource_type(const String &p_path) const; }; class ResourceFormatSaverCrypto : public ResourceFormatSaver { - GDCLASS(ResourceFormatSaverCrypto, ResourceFormatSaver); - public: virtual Error save(const String &p_path, const RES &p_resource, uint32_t p_flags = 0); virtual void get_recognized_extensions(const RES &p_resource, List<String> *p_extensions) const; diff --git a/core/debugger/remote_debugger.cpp b/core/debugger/remote_debugger.cpp index c2996e552f..fd109c62b6 100644 --- a/core/debugger/remote_debugger.cpp +++ b/core/debugger/remote_debugger.cpp @@ -33,7 +33,7 @@ #include "core/debugger/debugger_marshalls.h" #include "core/debugger/engine_debugger.h" #include "core/debugger/script_debugger.h" -#include "core/input/input_filter.h" +#include "core/input/input.h" #include "core/os/os.h" #include "core/project_settings.h" #include "core/script_language.h" @@ -318,7 +318,7 @@ struct RemoteDebugger::ServersProfiler { void _send_frame_data(bool p_final) { DebuggerMarshalls::ServersProfilerFrame frame; - frame.frame_number = Engine::get_singleton()->get_frames_drawn(); + frame.frame_number = Engine::get_singleton()->get_idle_frames(); frame.frame_time = frame_time; frame.idle_time = idle_time; frame.physics_time = physics_time; @@ -659,9 +659,9 @@ void RemoteDebugger::debug(bool p_can_continue, bool p_is_error_breakpoint) { servers_profiler->skip_profile_frame = true; // Avoid frame time spike in debug. - InputFilter::MouseMode mouse_mode = InputFilter::get_singleton()->get_mouse_mode(); - if (mouse_mode != InputFilter::MOUSE_MODE_VISIBLE) - InputFilter::get_singleton()->set_mouse_mode(InputFilter::MOUSE_MODE_VISIBLE); + Input::MouseMode mouse_mode = Input::get_singleton()->get_mouse_mode(); + if (mouse_mode != Input::MOUSE_MODE_VISIBLE) + Input::get_singleton()->set_mouse_mode(Input::MOUSE_MODE_VISIBLE); uint64_t loop_begin_usec = 0; uint64_t loop_time_sec = 0; @@ -779,8 +779,8 @@ void RemoteDebugger::debug(bool p_can_continue, bool p_is_error_breakpoint) { send_message("debug_exit", Array()); - if (mouse_mode != InputFilter::MOUSE_MODE_VISIBLE) - InputFilter::get_singleton()->set_mouse_mode(mouse_mode); + if (mouse_mode != Input::MOUSE_MODE_VISIBLE) + Input::get_singleton()->set_mouse_mode(mouse_mode); } void RemoteDebugger::poll_events(bool p_is_idle) { diff --git a/core/engine.cpp b/core/engine.cpp index 36987eab31..5361e09a8a 100644 --- a/core/engine.cpp +++ b/core/engine.cpp @@ -60,7 +60,7 @@ void Engine::set_target_fps(int p_fps) { _target_fps = p_fps > 0 ? p_fps : 0; } -float Engine::get_target_fps() const { +int Engine::get_target_fps() const { return _target_fps; } diff --git a/core/engine.h b/core/engine.h index 4cfdeffa82..8512779d4c 100644 --- a/core/engine.h +++ b/core/engine.h @@ -86,7 +86,7 @@ public: float get_physics_jitter_fix() const; virtual void set_target_fps(int p_fps); - virtual float get_target_fps() const; + virtual int get_target_fps() const; virtual float get_frames_per_second() const { return _fps; } diff --git a/core/global_constants.cpp b/core/global_constants.cpp index 8706a38453..afcb283e05 100644 --- a/core/global_constants.cpp +++ b/core/global_constants.cpp @@ -568,9 +568,7 @@ void register_global_constants() { BIND_GLOBAL_ENUM_CONSTANT(PROPERTY_USAGE_INTERNATIONALIZED); BIND_GLOBAL_ENUM_CONSTANT(PROPERTY_USAGE_GROUP); BIND_GLOBAL_ENUM_CONSTANT(PROPERTY_USAGE_CATEGORY); - //deprecated, replaced by ClassDB function to check default value - //BIND_GLOBAL_ENUM_CONSTANT(PROPERTY_USAGE_STORE_IF_NONZERO); - //BIND_GLOBAL_ENUM_CONSTANT(PROPERTY_USAGE_STORE_IF_NONONE); + BIND_GLOBAL_ENUM_CONSTANT(PROPERTY_USAGE_SUBGROUP); BIND_GLOBAL_ENUM_CONSTANT(PROPERTY_USAGE_NO_INSTANCE_STATE); BIND_GLOBAL_ENUM_CONSTANT(PROPERTY_USAGE_RESTART_IF_CHANGED); BIND_GLOBAL_ENUM_CONSTANT(PROPERTY_USAGE_SCRIPT_VARIABLE); diff --git a/core/hashfuncs.h b/core/hashfuncs.h index 219b8b2658..a41a034843 100644 --- a/core/hashfuncs.h +++ b/core/hashfuncs.h @@ -35,10 +35,10 @@ #include "core/math/math_funcs.h" #include "core/node_path.h" #include "core/object_id.h" +#include "core/rid.h" #include "core/string_name.h" #include "core/typedefs.h" #include "core/ustring.h" - /** * Hashing functions */ @@ -150,6 +150,7 @@ struct HashMapHasherDefault { static _FORCE_INLINE_ uint32_t hash(const uint8_t p_int) { return p_int; } static _FORCE_INLINE_ uint32_t hash(const int8_t p_int) { return (uint32_t)p_int; } static _FORCE_INLINE_ uint32_t hash(const wchar_t p_wchar) { return (uint32_t)p_wchar; } + static _FORCE_INLINE_ uint32_t hash(const RID &p_rid) { return hash_one_uint64(p_rid.get_id()); } static _FORCE_INLINE_ uint32_t hash(const StringName &p_string_name) { return p_string_name.hash(); } static _FORCE_INLINE_ uint32_t hash(const NodePath &p_path) { return p_path.hash(); } diff --git a/core/image.cpp b/core/image.cpp index 2097f27b01..58351ae2e5 100644 --- a/core/image.cpp +++ b/core/image.cpp @@ -879,6 +879,9 @@ void Image::resize_to_po2(bool p_square) { int w = next_power_of_2(width); int h = next_power_of_2(height); + if (p_square) { + w = h = MAX(w, h); + } if (w == width && h == height) { diff --git a/core/input/SCsub b/core/input/SCsub index d46e52a347..c641819698 100644 --- a/core/input/SCsub +++ b/core/input/SCsub @@ -8,8 +8,6 @@ import input_builders # Order matters here. Higher index controller database files write on top of lower index database files. controller_databases = [ - "#core/input/gamecontrollerdb_204.txt", - "#core/input/gamecontrollerdb_205.txt", "#core/input/gamecontrollerdb.txt", "#core/input/godotcontrollerdb.txt", ] diff --git a/core/input/gamecontrollerdb_204.txt b/core/input/gamecontrollerdb_204.txt deleted file mode 100644 index 7fbe925b25..0000000000 --- a/core/input/gamecontrollerdb_204.txt +++ /dev/null @@ -1,269 +0,0 @@ -# Game Controller DB for SDL in 2.0.4 format -# Source: https://github.com/gabomdq/SDL_GameControllerDB - -# Windows -02200090000000000000504944564944,8Bitdo NES30 PRO USB,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a3,righty:a4,start:b11,x:b3,y:b4,platform:Windows, -20380900000000000000504944564944,8Bitdo NES30 PRO Wireless,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a3,righty:a4,start:b11,x:b3,y:b4,platform:Windows, -10280900000000000000504944564944,8Bitdo SFC30 GamePad,a:b1,b:b0,back:b10,leftshoulder:b6,leftx:a0,lefty:a1,rightshoulder:b7,start:b11,x:b4,y:b3,platform:Windows, -8f0e1200000000000000504944564944,Acme,a:b0,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b5,leftx:a0,lefty:a1,rightshoulder:b6,rightstick:b11,righttrigger:b7,rightx:a3,righty:a2,start:b9,x:b2,y:b3,platform:Windows, -341a3608000000000000504944564944,Afterglow PS3 Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Windows, -c0111352000000000000504944564944,Battalife Joystick,a:b6,b:b7,back:b2,leftshoulder:b0,leftx:a0,lefty:a1,rightshoulder:b1,start:b3,x:b4,y:b5,platform:Windows, -d81d0b00000000000000504944564944,BUFFALO BSGP1601 Series ,a:b5,b:b3,back:b12,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b8,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b9,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b13,x:b4,y:b2,platform:Windows, -e8206058000000000000504944564944,Cideko AK08b,a:b2,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b3,y:b0,platform:Windows, -5e048e02000000000000504944564944,Controller (XBOX 360 For Windows),a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b8,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b9,righttrigger:a2,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Windows, -791d0103000000000000504944564944,Dual Box WII,a:b2,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b10,leftshoulder:b6,lefttrigger:b4,leftx:a0,lefty:a1,rightshoulder:b7,righttrigger:b5,rightx:a2,righty:a3,start:b9,x:b3,y:b0,platform:Windows, -4f0423b3000000000000504944564944,Dual Trigger 3-in-1,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Windows, -341a0108000000000000504944564944,EXEQ RF USB Gamepad 8206,a:b0,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b8,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b7,rightx:a2,righty:a3,start:b9,x:b2,y:b3,platform:Windows, -0d0f8500000000000000504944564944,Fighting Commander 2016 PS3,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Windows, -0d0f5e00000000000000504944564944,Fighting Commander 4,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b5,leftstick:b10,lefttrigger:a4,leftx:a0,lefty:a1,rightshoulder:b4,rightstick:b11,righttrigger:a3,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Windows, -0d0f5f00000000000000504944564944,Fighting Commander 4,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Windows, -0d0f8400000000000000504944564944,Fighting Commander 5,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Windows, -0d0f8700000000000000504944564944,Fighting Stick mini 4,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,lefttrigger:b6,rightshoulder:b5,righttrigger:b7,start:b9,x:b0,y:b3,platform:Windows, -0d0f8800000000000000504944564944,Fighting Stick mini 4,a:b1,b:b2,back:b9,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,lefttrigger:b6,rightshoulder:b5,righttrigger:b7,start:b8,x:b0,y:b3,platform:Windows, -0d0f2700000000000000504944564944,FIGHTING STICK V3,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,lefttrigger:b6,rightshoulder:b5,righttrigger:b7,start:b9,x:b0,y:b3,platform:Windows, -79000600000000000000504944564944,G-Shark GS-GP702,a:b2,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a4,start:b9,x:b3,y:b0,platform:Windows, -28040140000000000000504944564944,GamePad Pro USB,a:b1,b:b2,back:b8,leftshoulder:b4,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,righttrigger:b7,start:b9,x:b0,y:b3,platform:Windows, -ffff0000000000000000504944564944,GameStop Gamepad,a:b0,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b2,y:b3,platform:Windows, -6d0416c2000000000000504944564944,Generic DirectInput Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Windows, -45130010000000000000504944564944,Generic USB Joystick,a:b0,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b2,y:b3,platform:Windows, -0d0f4900000000000000504944564944,Hatsune Miku Sho Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Windows, -d8140862000000000000504944564944,HitBox Edition Cthulhu+,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b5,lefttrigger:b4,rightshoulder:b7,righttrigger:b6,start:b9,x:b0,y:b3,platform:Windows, -0d0f4000000000000000504944564944,Hori Fighting Stick Mini 3,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b5,lefttrigger:b4,rightshoulder:b7,righttrigger:b6,start:b9,x:b0,y:b3,platform:Windows, -0d0f6e00000000000000504944564944,HORIPAD 4,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Windows, -0d0fee00000000000000504944564944,HORIPAD mini4,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Windows, -0d0f4d00000000000000504944564944,HORIPAD3 A,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Windows, -25090017000000000000504944564944,HRAP2 on PS/SS/N64 Joypad to USB BOX,a:b2,b:b1,back:b9,leftshoulder:b5,lefttrigger:b4,leftx:a0,lefty:a1,rightshoulder:b7,righttrigger:b6,start:b8,x:b3,y:b0,platform:Windows, -d81d0f00000000000000504944564944,iBUFFALO BSGP1204 Series,a:b2,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b10,lefttrigger:b4,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b11,righttrigger:b5,rightx:a2,righty:a3,start:b9,x:b3,y:b0,platform:Windows, -d81d1000000000000000504944564944,iBUFFALO BSGP1204P Series,a:b2,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b10,lefttrigger:b4,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b11,righttrigger:b5,rightx:a2,righty:a3,start:b9,x:b3,y:b0,platform:Windows, -83056020000000000000504944564944,iBuffalo USB 2-axis 8-button Gamepad,a:b1,b:b0,back:b6,leftshoulder:b4,leftx:a0,lefty:a1,rightshoulder:b5,start:b7,x:b3,y:b2,platform:Windows, -6f0e2401000000000000504944564944,INJUSTICE FightStick for PS3,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,lefttrigger:b6,rightshoulder:b5,righttrigger:b7,start:b9,x:b0,y:b3,platform:Windows, -49190204000000000000504944564944,Ipega PG-9023,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a3,righty:a4,start:b11,x:b3,y:b4,platform:Windows, -6d0418c2000000000000504944564944,Logitech F510 Gamepad,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Windows, -6d0419c2000000000000504944564944,Logitech F710 Gamepad,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Windows, -38075032000000000000504944564944,Mad Catz FightPad PRO PS3,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Windows, -38075082000000000000504944564944,Mad Catz FightPad PRO PS4,a:b1,b:b2,back:b13,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Windows, -38078433000000000000504944564944,Mad Catz FightStick TE S+ PS3,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,lefttrigger:b6,rightshoulder:b5,righttrigger:b7,start:b9,x:b0,y:b3,platform:Windows, -38078483000000000000504944564944,Mad Catz FightStick TE S+ PS4,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b6,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Windows, -38078134000000000000504944564944,Mad Catz FightStick TE2+ PS3,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b7,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b4,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Windows, -38078184000000000000504944564944,Mad Catz FightStick TE2+ PS4,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b5,leftstick:b10,lefttrigger:a4,leftx:a0,lefty:a1,rightshoulder:b4,rightstick:b11,righttrigger:b7,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Windows, -38078034000000000000504944564944,Mad Catz TE2 PS3 Fightstick,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Windows, -38078084000000000000504944564944,Mad Catz TE2 PS4 Fightstick,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Windows, -38078532000000000000504944564944,Madcatz Arcade Fightstick TE S PS3,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Windows, -38073888000000000000504944564944,Madcatz Arcade Fightstick TE S+ PS3,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Windows, -38071888000000000000504944564944,MadCatz SFIV FightStick PS3,a:b0,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b5,lefttrigger:b7,leftx:a0,lefty:a1,rightshoulder:b4,righttrigger:b6,rightx:a2,righty:a3,start:b9,x:b2,y:b3,platform:Windows, -03000000380700008081000000000000,MADCATZ SFV Arcade FightStick Alpha PS4,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,righttrigger:b7,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Windows, -25090128000000000000504944564944,Mayflash Arcade Stick,a:b1,b:b2,back:b8,leftshoulder:b0,lefttrigger:b4,leftx:a0,lefty:a1,rightshoulder:b3,righttrigger:b7,start:b9,x:b5,y:b6,platform:Windows, -79004318000000000000504944564944,Mayflash GameCube Controller Adapter,a:b1,b:b2,back:b0,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b0,leftshoulder:b4,leftstick:b0,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b0,righttrigger:a4,rightx:a5,righty:a2,start:b9,x:b0,y:b3,platform:Windows, -8f0e1030000000000000504944564944,Mayflash USB Adapter for original Sega Saturn controller,a:b0,b:b1,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,lefttrigger:b5,rightshoulder:b2,righttrigger:b7,start:b9,x:b3,y:b4,platform:Windows, -2509e803000000000000504944564944,Mayflash Wii Classic Controller,a:b1,b:b0,back:b8,dpdown:b13,dpleft:b12,dpright:b14,dpup:b11,guide:b10,leftshoulder:b4,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b3,y:b2,platform:Windows, -79000018000000000000504944564944,Mayflash WiiU Pro Game Controller Adapter (DInput),a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Windows, -8f0e0d31000000000000504944564944,Multilaser JS071 USB,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Windows, -100801e5000000000000504944564944,NEXT Classic USB Game Controller,a:b2,b:b1,back:b8,leftshoulder:b4,leftx:a0,lefty:a1,rightshoulder:b6,righttrigger:b5,rightx:a2,righty:a3,start:b9,x:b3,y:b0,platform:Windows, -bd1215d0000000000000504944564944,Nintendo Retrolink USB Super SNES Classic Controller,a:b2,b:b1,back:b8,leftshoulder:b4,leftx:a0,lefty:a1,rightshoulder:b5,start:b9,x:b3,y:b0,platform:Windows, -4b12014d000000000000504944564944,NYKO AIRFLO,a:b0,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b10,leftshoulder:a3,leftstick:a0,lefttrigger:b6,rightshoulder:b5,rightstick:a2,righttrigger:b7,start:b9,x:b2,y:b3,platform:Windows, -36280100000000000000504944564944,OUYA Controller,a:b0,b:b3,dpdown:b9,dpleft:b10,dpright:b11,dpup:b8,guide:b15,leftshoulder:b4,leftstick:b6,lefttrigger:b12,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b7,righttrigger:b13,rightx:a3,righty:a4,start:b14,x:b1,y:b2,platform:Windows, -4d6963726f736f66742050432d6a6f79,OUYA Controller,a:b0,b:b3,dpdown:b9,dpleft:b10,dpright:b11,dpup:b8,guide:b14,leftshoulder:b4,leftstick:b6,lefttrigger:b12,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b7,righttrigger:b13,rightx:a5,righty:a4,x:b1,y:b2,platform:Windows, -120cf60e000000000000504944564944,P4 Wired Gamepad,a:b1,b:b2,back:b12,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b5,lefttrigger:b7,rightshoulder:b4,righttrigger:b6,start:b9,x:b0,y:b3,platform:Windows, -8f0e0300000000000000504944564944,Piranha xtreme,a:b2,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b10,lefttrigger:b4,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b11,righttrigger:b5,rightx:a3,righty:a2,start:b9,x:b3,y:b0,platform:Windows, -d6206dca000000000000504944564944,PowerA Pro Ex,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Windows, -10080100000000000000504944564944,PS1 USB,a:b2,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b10,lefttrigger:b4,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b11,righttrigger:b5,rightx:a3,righty:a2,start:b9,x:b3,y:b0,platform:Windows, -10080300000000000000504944564944,PS2 USB,a:b2,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b10,lefttrigger:b4,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b11,righttrigger:b5,rightx:a4,righty:a2,start:b9,x:b3,y:b0,platform:Windows, -4c056802000000000000504944564944,PS3 Controller,a:b14,b:b13,back:b0,dpdown:b6,dpleft:b7,dpright:b5,dpup:b4,guide:b16,leftshoulder:b10,leftstick:b1,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b11,rightstick:b2,righttrigger:b9,rightx:a2,righty:a3,start:b3,x:b15,y:b12,platform:Windows, -88880803000000000000504944564944,PS3 Controller,a:b2,b:b1,back:b8,dpdown:h0.8,dpleft:h0.4,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b9,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:b7,rightx:a3,righty:a4,start:b11,x:b0,y:b3,platform:Windows, -25090500000000000000504944564944,PS3 DualShock,a:b2,b:b1,back:b9,dpdown:h0.8,dpleft:h0.4,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b10,lefttrigger:b4,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b11,righttrigger:b5,rightx:a2,righty:a3,start:b8,x:b0,y:b3,platform:Windows, -10008200000000000000504944564944,PS360+ v1.66,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,lefttrigger:b6,leftx:h0.4,rightshoulder:b5,righttrigger:b7,start:b9,x:b0,y:b3,platform:Windows, -4c05c405000000000000504944564944,PS4 Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Windows, -300f0011000000000000504944564944,QanBa Arcade JoyStick 1008,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,righttrigger:b7,start:b10,x:b0,y:b3,platform:Windows, -300f1611000000000000504944564944,QanBa Arcade JoyStick 4018,a:b1,b:b2,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b9,leftshoulder:b4,lefttrigger:b6,rightshoulder:b5,righttrigger:b7,start:b8,x:b0,y:b3,platform:Windows, -222c0020000000000000504944564944,QANBA DRONE ARCADE JOYSTICK,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,lefttrigger:a3,rightshoulder:b5,righttrigger:a4,start:b9,x:b0,y:b3,platform:Windows, -300f1210000000000000504944564944,QanBa Joystick Plus,a:b0,b:b1,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,rightshoulder:b5,start:b9,x:b2,y:b3,platform:Windows, -341a0104000000000000504944564944,QanBa Joystick Q4RAF,a:b5,b:b6,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b10,leftshoulder:b0,lefttrigger:b4,leftx:a0,lefty:a1,rightshoulder:b3,righttrigger:b7,start:b9,x:b1,y:b2,platform:Windows, -222c0223000000000000504944564944,Qanba Obsidian Arcade Joystick PS3 Mode,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Windows, -222c0023000000000000504944564944,Qanba Obsidian Arcade Joystick PS4 Mode,a:b1,b:b2,back:b13,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Windows, -0d0f1100000000000000504944564944,REAL ARCADE PRO.3,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,rightshoulder:b5,rightstick:b11,righttrigger:b7,start:b9,x:b0,y:b3,platform:Windows, -0d0f6a00000000000000504944564944,Real Arcade Pro.4,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Windows, -0d0f6b00000000000000504944564944,Real Arcade Pro.4,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Windows, -0d0f8a00000000000000504944564944,Real Arcade Pro.4,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Windows, -0d0f8b00000000000000504944564944,Real Arcade Pro.4,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Windows, -0d0f7000000000000000504944564944,REAL ARCADE PRO.4 VLX,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,rightshoulder:b5,rightstick:b11,righttrigger:b7,start:b9,x:b0,y:b3,platform:Windows, -0d0f2200000000000000504944564944,REAL ARCADE Pro.V3,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Windows, -00f00300000000000000504944564944,RetroUSB.com RetroPad,a:b1,b:b5,back:b2,leftshoulder:b6,leftx:a0,lefty:a1,rightshoulder:b7,start:b3,x:b0,y:b4,platform:Windows, -00f0f100000000000000504944564944,RetroUSB.com Super RetroPort,a:b1,b:b5,back:b2,leftshoulder:b6,leftx:a0,lefty:a1,rightshoulder:b7,start:b3,x:b0,y:b4,platform:Windows, -6f0e1e01000000000000504944564944,Rock Candy Gamepad for PS3,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Windows, -300f1201000000000000504944564944,Saitek Dual Analog Pad,a:b2,b:b3,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b5,leftx:a0,lefty:a1,rightshoulder:b6,rightstick:b11,righttrigger:b7,rightx:a3,righty:a2,start:b9,x:b0,y:b1,platform:Windows, -a3060cff000000000000504944564944,Saitek P2500,a:b2,b:b3,back:b5,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b10,leftshoulder:b6,leftstick:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b9,rightx:a2,righty:a3,start:b4,x:b0,y:b1,platform:Windows, -300f1001000000000000504944564944,Saitek P480 Rumble Pad,a:b2,b:b3,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b5,leftx:a0,lefty:a1,rightshoulder:b6,rightstick:b11,righttrigger:b7,rightx:a3,righty:a2,start:b9,x:b0,y:b1,platform:Windows, -9b280500000000000000504944564944,Saturn_Adapter_2.0,a:b1,b:b2,leftshoulder:b6,lefttrigger:b4,leftx:a0,lefty:a1,rightshoulder:b7,righttrigger:b5,start:b9,x:b0,y:b3,platform:Windows, -79001100000000000000504944564944,Sega Saturn Gamepad,a:b1,b:b2,leftshoulder:b6,lefttrigger:b3,leftx:a0,lefty:a4,rightshoulder:b7,righttrigger:b0,start:b8,x:b4,y:b5,platform:Windows, -4c05cc09000000000000504944564944,Sony DualShock 4,a:b1,b:b2,back:b13,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Windows, -4c05a00b000000000000504944564944,Sony DualShock 4 Wireless Adaptor,a:b1,b:b2,back:b13,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Windows, -ff113133000000000000504944564944,SVEN X-PAD,a:b2,b:b3,back:b4,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,righttrigger:b9,rightx:a2,righty:a4,start:b5,x:b0,y:b1,platform:Windows, -4f0415b3000000000000504944564944,Thrustmaster Dual Analog 3.2,a:b0,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b5,leftx:a0,lefty:a1,rightshoulder:b6,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b1,y:b3,platform:Windows, -4f0400b3000000000000504944564944,Thrustmaster Firestorm Dual Power,a:b0,b:b2,back:b9,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b11,lefttrigger:b5,leftx:a0,lefty:a1,rightshoulder:b6,rightstick:b12,righttrigger:b7,rightx:a2,righty:a3,start:b10,x:b1,y:b3,platform:Windows, -66660488000000000000504944564944,TigerGame PS/PS2 Game Controller Adapter,a:b2,b:b1,back:b9,dpdown:b14,dpleft:b15,dpright:b13,dpup:b12,leftshoulder:b6,leftstick:b10,lefttrigger:b4,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b11,righttrigger:b5,rightx:a2,righty:a3,start:b8,x:b3,y:b0,platform:Windows, -38076652000000000000504944564944,UnKnown,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a3,righty:a4,start:b9,x:b0,y:b3,platform:Windows, -63252305000000000000504944564944,USB Vibration Joystick (BM),a:b2,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b3,y:b0,platform:Windows, -79001b18000000000000504944564944,Venom Arcade Joystick,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,lefttrigger:b6,rightshoulder:b5,righttrigger:b7,start:b9,x:b0,y:b3,platform:Windows, -xinput,XInput Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b10,leftshoulder:b4,leftstick:b8,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b9,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Windows, - -# Mac OS X -10280000000000000900000000000000,8Bitdo SFC30 GamePad,a:b1,b:b0,back:b10,leftshoulder:b6,leftx:a0,lefty:a1,rightshoulder:b7,start:b11,x:b4,y:b3,platform:Mac OS X, -830500000000000031b0000000000000,Cideko AK08b,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Mac OS X, -79000000000000000600000000000000,G-Shark GP-702,a:b2,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a3,righty:a4,start:b9,x:b3,y:b0,platform:Mac OS X, -AD1B00000000000001F9000000000000,Gamestop BB-070 X360 Controller,a:b0,b:b1,back:b9,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,guide:b10,leftshoulder:b4,leftstick:b6,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b7,righttrigger:a5,rightx:a3,righty:a4,start:b8,x:b2,y:b3,platform:Mac OS X, -0500000047532047616d657061640000,GameStop Gamepad,a:b0,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b2,y:b3,platform:Mac OS X, -0d0f0000000000004d00000000000000,HORI Gem Pad 3,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Mac OS X, -0d0f0000000000006600000000000000,HORIPAD FPS PLUS 4,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Mac OS X, -83050000000000006020000000000000,iBuffalo USB 2-axis 8-button Gamepad,a:b1,b:b0,back:b6,leftshoulder:b4,leftx:a0,lefty:a1,rightshoulder:b5,start:b7,x:b3,y:b2,platform:Mac OS X, -6d0400000000000016c2000000000000,Logitech F310 Gamepad (DInput),a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Mac OS X, -6d0400000000000018c2000000000000,Logitech F510 Gamepad (DInput),a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Mac OS X, -6d040000000000001fc2000000000000,Logitech F710 Gamepad (XInput),a:b0,b:b1,back:b9,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,guide:b10,leftshoulder:b4,leftstick:b6,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b7,righttrigger:a5,rightx:a3,righty:a4,start:b8,x:b2,y:b3,platform:Mac OS X, -6d0400000000000019c2000000000000,Logitech Wireless Gamepad (DInput),a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Mac OS X, -2509000000000000e803000000000000,Mayflash Wii Classic Controller,a:b1,b:b0,back:b8,dpdown:b13,dpleft:b12,dpright:b14,dpup:b11,guide:b10,leftshoulder:b4,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b3,y:b2,platform:Mac OS X, -79000000000000000018000000000000,Mayflash WiiU Pro Game Controller Adapter (DInput),a:b4,b:b8,back:b32,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b16,leftstick:b40,lefttrigger:b24,leftx:a0,lefty:a4,rightshoulder:b20,rightstick:b44,righttrigger:b28,rightx:a8,righty:a12,start:b36,x:b0,y:b12,platform:Mac OS X, -d814000000000000cecf000000000000,MC Cthulhu,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,lefttrigger:b6,rightshoulder:b5,righttrigger:b7,start:b9,x:b0,y:b3,platform:Mac OS X, -8f0e0000000000000300000000000000,Piranha xtreme,a:b2,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b10,lefttrigger:b4,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b11,righttrigger:b5,rightx:a3,righty:a2,start:b9,x:b3,y:b0,platform:Mac OS X, -4c050000000000006802000000000000,PS3 Controller,a:b14,b:b13,back:b0,dpdown:b6,dpleft:b7,dpright:b5,dpup:b4,guide:b16,leftshoulder:b10,leftstick:b1,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b11,rightstick:b2,righttrigger:b9,rightx:a2,righty:a3,start:b3,x:b15,y:b12,platform:Mac OS X, -4c05000000000000c405000000000000,PS4 Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Mac OS X, -891600000000000000fd000000000000,Razer Onza Tournament,a:b0,b:b1,back:b9,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,guide:b10,leftshoulder:b4,leftstick:b6,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b7,righttrigger:a5,rightx:a3,righty:a4,start:b8,x:b2,y:b3,platform:Mac OS X, -79000000000000001100000000000000,Retrolink Classic Controller,a:b2,b:b1,back:b8,leftshoulder:b4,leftx:a3,lefty:a4,rightshoulder:b5,start:b9,x:b3,y:b0,platform:Mac OS X, -81170000000000007e05000000000000,Sega Saturn,a:b2,b:b4,dpdown:b16,dpleft:b15,dpright:b14,dpup:b17,leftshoulder:b8,lefttrigger:a5,leftx:a0,lefty:a2,rightshoulder:b9,righttrigger:a4,start:b13,x:b0,y:b6,platform:Mac OS X, -b4040000000000000a01000000000000,Sega Saturn USB Gamepad,a:b0,b:b1,back:b5,guide:b2,leftshoulder:b6,leftx:a0,lefty:a1,rightshoulder:b7,start:b8,x:b3,y:b4,platform:Mac OS X, -351200000000000021ab000000000000,SFC30 Joystick,a:b1,b:b0,back:b10,leftshoulder:b6,leftx:a0,lefty:a1,rightshoulder:b7,start:b11,x:b4,y:b3,platform:Mac OS X, -4c05000000000000cc09000000000000,Sony DualShock 4 V2,a:b1,b:b2,back:b13,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Mac OS X, -4c05000000000000a00b000000000000,Sony DualShock 4 Wireless Adaptor,a:b1,b:b2,back:b13,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Mac OS X, -11010000000000002014000000000000,SteelSeries Nimbus,a:b0,b:b1,dpdown:b9,dpleft:b11,dpright:b10,dpup:b8,leftshoulder:b4,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,righttrigger:b7,rightx:a2,righty:a3,start:b12,x:b2,y:b3,platform:Mac OS X, -11010000000000001714000000000000,SteelSeries Stratus XL,a:b0,b:b1,dpdown:b9,dpleft:b11,dpright:b10,dpup:b8,leftshoulder:b4,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,righttrigger:b7,rightx:a2,righty:a3,start:b12,x:b2,y:b3,platform:Mac OS X, -4f0400000000000015b3000000000000,Thrustmaster Dual Analog 3.2,a:b0,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b5,leftx:a0,lefty:a1,rightshoulder:b6,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b1,y:b3,platform:Mac OS X, -4f0400000000000000b3000000000000,Thrustmaster Firestorm Dual Power,a:b0,b:b2,back:b9,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b11,lefttrigger:b5,leftx:a0,lefty:a1,rightshoulder:b6,righttrigger:b7,rightx:a2,righty:a3,start:b10,x:b1,y:b3,platform:Mac OS X, -bd1200000000000015d0000000000000,Tomee SNES USB Controller,a:b2,b:b1,back:b8,leftshoulder:b4,leftx:a0,lefty:a1,rightshoulder:b5,start:b9,x:b3,y:b0,platform:Mac OS X, -10080000000000000100000000000000,Twin USB Joystick,a:b4,b:b2,back:b16,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b12,leftstick:b20,lefttrigger:b8,leftx:a0,lefty:a2,rightshoulder:b14,rightstick:b22,righttrigger:b10,rightx:a6,righty:a4,start:b18,x:b6,y:b0,platform:Mac OS X, -050000005769696d6f74652028303000,Wii Remote,a:b4,b:b5,back:b7,dpdown:b3,dpleft:b0,dpright:b1,dpup:b2,guide:b8,leftshoulder:b11,lefttrigger:b12,leftx:a0,lefty:a1,start:b6,x:b10,y:b9,platform:Mac OS X, -050000005769696d6f74652028313800,Wii U Pro Controller,a:b16,b:b15,back:b7,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,guide:b8,leftshoulder:b19,leftstick:b23,lefttrigger:b21,leftx:a0,lefty:a1,rightshoulder:b20,rightstick:b24,righttrigger:b22,rightx:a2,righty:a3,start:b6,x:b18,y:b17,platform:Mac OS X, -5e040000000000008e02000000000000,X360 Controller,a:b0,b:b1,back:b9,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,guide:b10,leftshoulder:b4,leftstick:b6,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b7,righttrigger:a5,rightx:a3,righty:a4,start:b8,x:b2,y:b3,platform:Mac OS X, -5e04000000000000dd02000000000000,Xbox One Wired Controller,a:b0,b:b1,back:b9,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,guide:b10,leftshoulder:b4,leftstick:b6,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b7,righttrigger:a5,rightx:a3,righty:a4,start:b8,x:b2,y:b3,platform:Mac OS X, -5e04000000000000e002000000000000,Xbox Wireless Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b10,leftshoulder:b4,leftstick:b8,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b9,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Mac OS X, -5e04000000000000ea02000000000000,Xbox Wireless Controller,a:b0,b:b1,back:b9,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,guide:b10,leftshoulder:b4,leftstick:b6,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b7,righttrigger:a5,rightx:a3,righty:a4,start:b8,x:b2,y:b3,platform:Mac OS X, - -# Linux -05000000102800000900000000010000,8Bitdo SFC30 GamePad,a:b1,b:b0,back:b10,leftshoulder:b6,leftx:a0,lefty:a1,rightshoulder:b7,start:b11,x:b4,y:b3,platform:Linux, -05000000a00500003232000001000000,8Bitdo Zero GamePad,a:b0,b:b1,back:b10,leftshoulder:b6,leftx:a0,lefty:a1,rightshoulder:b7,start:b11,x:b3,y:b4,platform:Linux, -030000006f0e00003901000020060000,Afterglow Wired Controller for Xbox One,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux, -03000000e82000006058000001010000,Cideko AK08b,a:b2,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b3,y:b0,platform:Linux, -03000000790000000600000010010000,DragonRise Inc. Generic USB Joystick ,a:b2,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a3,righty:a4,start:b9,x:b3,y:b0,platform:Linux, -030000006f0e00003001000001010000,EA Sports PS3 Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Linux, -03000000341a000005f7000010010000,GameCube {HuiJia USB box},a:b1,b:b2,dpdown:b14,dpleft:b15,dpright:b13,dpup:b12,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b7,righttrigger:a4,rightx:a5,righty:a2,start:b9,x:b0,y:b3,platform:Linux, -03000000260900008888000000010000,GameCube {WiseGroup USB box},a:b0,b:b2,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,lefttrigger:a4,leftx:a0,lefty:a1,rightshoulder:b6,righttrigger:a5,rightx:a2,righty:a3,start:b7,x:b1,y:b3,platform:Linux, -0500000047532047616d657061640000,GameStop Gamepad,a:b0,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b2,y:b3,platform:Linux, -030000006f0e00000104000000010000,Gamestop Logic3 Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux, -030000006f0e00001304000000010000,Generic X-Box pad,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:a0,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:a3,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux, -030000006f0e00001f01000000010000,Generic X-Box pad,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux, -03000000f0250000c183000010010000,Goodbetterbest Ltd USB Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Linux, -03000000280400000140000000010000,Gravis GamePad Pro USB ,a:b1,b:b2,back:b8,leftshoulder:b4,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,righttrigger:b7,start:b9,x:b0,y:b3,platform:Linux, -030000008f0e00000300000010010000,GreenAsia Inc. USB Joystick ,a:b2,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b10,lefttrigger:b4,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b11,righttrigger:b5,rightx:a3,righty:a2,start:b9,x:b3,y:b0,platform:Linux, -030000008f0e00001200000010010000,GreenAsia Inc. USB Joystick ,a:b0,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b5,leftx:a0,lefty:a1,rightshoulder:b6,rightstick:b11,righttrigger:b7,rightx:a3,righty:a2,start:b9,x:b2,y:b3,platform:Linux, -03000000ff1100004133000010010000,GreenAsia Inc.USB Joystick,a:b2,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b10,lefttrigger:b4,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b11,righttrigger:b5,rightx:a3,righty:a2,start:b9,x:b3,y:b0,platform:Linux, -06000000adde0000efbe000002010000,Hidromancer Game Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux, -03000000d81400000862000011010000,HitBox (PS3/PC) Analog Mode,a:b1,b:b2,back:b8,guide:b9,leftshoulder:b4,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,righttrigger:b7,start:b12,x:b0,y:b3,platform:Linux, -03000000c9110000f055000011010000,HJC Game GAMEPAD,a:b0,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b2,y:b3,platform:Linux, -030000000d0f00000d00000000010000,hori,a:b0,b:b6,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b10,leftshoulder:b3,leftx:b4,lefty:b5,rightshoulder:b7,start:b9,x:b1,y:b2,platform:Linux, -030000000d0f00001000000011010000,HORI CO. LTD. FIGHTING STICK 3,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,lefttrigger:b6,rightshoulder:b5,righttrigger:b7,start:b9,x:b0,y:b3,platform:Linux, -030000000d0f00002200000011010000,HORI CO. LTD. REAL ARCADE Pro.V3,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,lefttrigger:b6,rightshoulder:b5,righttrigger:b7,start:b9,x:b0,y:b3,platform:Linux, -03000000ad1b000001f5000033050000,Hori Pad EX Turbo 2,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux, -03000000830500006020000010010000,iBuffalo USB 2-axis 8-button Gamepad,a:b1,b:b0,back:b6,leftshoulder:b4,leftx:a0,lefty:a1,rightshoulder:b5,start:b7,x:b3,y:b2,platform:Linux, -03000000fd0500000030000000010000,InterAct GoPad I-73000 (Fighting Game Layout),a:b3,b:b4,back:b6,leftx:a0,lefty:a1,rightshoulder:b2,righttrigger:b5,start:b7,x:b0,y:b1,platform:Linux, -030000006e0500000320000010010000,JC-U3613M - DirectInput Mode,a:b2,b:b3,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b8,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b9,righttrigger:b7,rightx:a2,righty:a3,start:b11,x:b0,y:b1,platform:Linux, -03000000300f00001001000010010000,Jess Tech Dual Analog Rumble Pad,a:b2,b:b3,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b5,leftx:a0,lefty:a1,rightshoulder:b6,rightstick:b11,righttrigger:b7,rightx:a3,righty:a2,start:b9,x:b0,y:b1,platform:Linux, -03000000ba2200002010000001010000,Jess Technology USB Game Controller,a:b2,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,righttrigger:b7,rightx:a3,righty:a2,start:b9,x:b3,y:b0,platform:Linux, -030000006f0e00000103000000020000,Logic3 Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux, -030000006d04000019c2000010010000,Logitech Cordless RumblePad 2,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Linux, -030000006d04000016c2000011010000,Logitech F310 Gamepad (DInput),a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Linux, -030000006d0400001dc2000014400000,Logitech F310 Gamepad (XInput),a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux, -030000006d0400001ec2000020200000,Logitech F510 Gamepad (XInput),a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux, -030000006d04000019c2000011010000,Logitech F710 Gamepad (DInput),a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Linux, -030000006d0400001fc2000005030000,Logitech F710 Gamepad (XInput),a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux, -030000006d04000016c2000010010000,Logitech Logitech Dual Action,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Linux, -030000006d04000018c2000010010000,Logitech RumblePad 2,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Linux, -030000006d04000011c2000010010000,Logitech WingMan Cordless RumblePad,a:b0,b:b1,back:b2,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b5,leftshoulder:b6,lefttrigger:b9,leftx:a0,lefty:a1,rightshoulder:b7,righttrigger:b10,rightx:a3,righty:a4,start:b8,x:b3,y:b4,platform:Linux, -05000000380700006652000025010000,Mad Catz C.T.R.L.R ,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Linux, -03000000ad1b00002ef0000090040000,Mad Catz Fightpad SFxT,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,lefttrigger:a2,rightshoulder:b5,righttrigger:a5,start:b7,x:b2,y:b3,platform:Linux, -03000000380700001647000010040000,Mad Catz Wired Xbox 360 Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux, -03000000ad1b000016f0000090040000,Mad Catz Xbox 360 Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux, -03000000780000000600000010010000,Microntek USB Joystick,a:b2,b:b1,back:b8,leftshoulder:b6,lefttrigger:b4,leftx:a0,lefty:a1,rightshoulder:b7,righttrigger:b5,start:b9,x:b3,y:b0,platform:Linux, -030000005e0400008e02000004010000,Microsoft X-Box 360 pad,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux, -030000005e0400008e02000062230000,Microsoft X-Box 360 pad,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux, -030000005e040000dd02000003020000,Microsoft X-Box One pad v2,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux, -030000005e0400008502000000010000,Microsoft X-Box pad (Japan),a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b5,leftstick:b8,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b2,rightstick:b9,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b3,y:b4,platform:Linux, -030000005e0400008902000021010000,Microsoft X-Box pad v2 (US),a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b5,leftstick:b8,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b2,rightstick:b9,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b3,y:b4,platform:Linux, -05000000d6200000ad0d000001000000,Moga Pro,a:b0,b:b1,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b7,lefttrigger:a5,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b8,righttrigger:a4,rightx:a2,righty:a3,start:b6,x:b2,y:b3,platform:Linux, -030000001008000001e5000010010000,NEXT Classic USB Game Controller,a:b2,b:b1,back:b8,leftshoulder:b4,leftx:a0,lefty:a1,rightshoulder:b6,righttrigger:b5,rightx:a2,righty:a3,start:b9,x:b3,y:b0,platform:Linux, -050000007e0500003003000001000000,Nintendo Wii Remote Pro Controller,a:b1,b:b0,back:b8,dpdown:b14,dpleft:b15,dpright:b16,dpup:b13,guide:b10,leftshoulder:b4,leftstick:b11,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b12,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b2,y:b3,platform:Linux, -05000000010000000100000003000000,Nintendo Wiimote,a:b0,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b10,leftshoulder:b4,leftstick:b11,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b12,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b2,y:b3,platform:Linux, -03000000550900001072000011010000,NVIDIA Controller,a:b0,b:b1,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b8,lefttrigger:a5,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b9,righttrigger:a4,rightx:a2,righty:a3,start:b7,x:b2,y:b3,platform:Linux, -03000000451300000830000010010000,NYKO CORE,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Linux, -05000000362800000100000002010000,OUYA Game Controller,a:b0,b:b3,dpdown:b9,dpleft:b10,dpright:b11,dpup:b8,guide:b14,leftshoulder:b4,leftstick:b6,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b7,righttrigger:a5,rightx:a3,righty:a4,x:b1,y:b2,platform:Linux, -05000000362800000100000003010000,OUYA Game Controller,a:b0,b:b3,dpdown:b9,dpleft:b10,dpright:b11,dpup:b8,guide:b14,leftshoulder:b4,leftstick:b6,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b7,righttrigger:a5,rightx:a3,righty:a4,x:b1,y:b2,platform:Linux, -03000000ff1100003133000010010000,PC Game Controller,a:b2,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b3,y:b0,platform:Linux, -03000000341a00003608000011010000,PS3 Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Linux, -030000004c0500006802000011010000,PS3 Controller,a:b14,b:b13,back:b0,dpdown:b6,dpleft:b7,dpright:b5,dpup:b4,guide:b16,leftshoulder:b10,leftstick:b1,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b11,rightstick:b2,righttrigger:b9,rightx:a2,righty:a3,start:b3,x:b15,y:b12,platform:Linux, -050000004c0500006802000000010000,PS3 Controller (Bluetooth),a:b14,b:b13,back:b0,dpdown:b6,dpleft:b7,dpright:b5,dpup:b4,guide:b16,leftshoulder:b10,leftstick:b1,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b11,rightstick:b2,righttrigger:b9,rightx:a2,righty:a3,start:b3,x:b15,y:b12,platform:Linux, -05000000504c415953544154494f4e00,PS3 Controller (Bluetooth),a:b14,b:b13,back:b0,dpdown:b6,dpleft:b7,dpright:b5,dpup:b4,guide:b16,leftshoulder:b10,leftstick:b1,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b11,rightstick:b2,righttrigger:b9,rightx:a2,righty:a3,start:b3,x:b15,y:b12,platform:Linux, -060000004c0500006802000000010000,PS3 Controller (Bluetooth),a:b14,b:b13,back:b0,dpdown:b6,dpleft:b7,dpright:b5,dpup:b4,guide:b16,leftshoulder:b10,leftstick:b1,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b11,rightstick:b2,righttrigger:b9,rightx:a2,righty:a3,start:b3,x:b15,y:b12,platform:Linux, -030000004c050000c405000011010000,PS4 Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Linux, -050000004c050000c405000000010000,PS4 Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Linux, -030000009b2800000300000001010000,raphnet.net 4nes4snes v1.5,a:b0,b:b4,back:b2,leftshoulder:b6,leftx:a0,lefty:a1,rightshoulder:b7,start:b3,x:b1,y:b5,platform:Linux, -030000008916000001fd000024010000,Razer Onza Classic Edition,a:b0,b:b1,back:b6,dpdown:b14,dpleft:b11,dpright:b12,dpup:b13,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux, -030000008916000000fd000024010000,Razer Onza Tournament,a:b0,b:b1,back:b6,dpdown:b14,dpleft:b11,dpright:b12,dpup:b13,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux, -03000000c6240000045d000025010000,Razer Sabertooth,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux, -03000000321500000009000011010000,Razer Serval,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a5,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a4,rightx:a2,righty:a3,start:b7,x:b2,y:b3,platform:Linux, -050000003215000000090000163a0000,Razer Serval,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a5,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a4,rightx:a2,righty:a3,start:b7,x:b2,y:b3,platform:Linux, -03000000790000001100000010010000,RetroLink Saturn Classic Controller,a:b0,b:b1,back:b5,guide:b2,leftshoulder:b6,leftx:a0,lefty:a1,rightshoulder:b7,start:b8,x:b3,y:b4,platform:Linux, -0300000000f000000300000000010000,RetroUSB.com RetroPad,a:b1,b:b5,back:b2,leftshoulder:b6,leftx:a0,lefty:a1,rightshoulder:b7,start:b3,x:b0,y:b4,platform:Linux, -0300000000f00000f100000000010000,RetroUSB.com Super RetroPort,a:b1,b:b5,back:b2,leftshoulder:b6,leftx:a0,lefty:a1,rightshoulder:b7,start:b3,x:b0,y:b4,platform:Linux, -030000006f0e00001e01000011010000,Rock Candy Gamepad for PS3,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Linux, -030000006f0e00004601000001010000,Rock Candy Wired Controller for Xbox One,a:b0,b:b1,back:b6,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux, -03000000a306000023f6000011010000,Saitek Cyborg V.1 Game Pad,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a4,start:b9,x:b0,y:b3,platform:Linux, -03000000a30600000c04000011010000,Saitek P2900 Wireless Pad,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b9,leftshoulder:b6,leftstick:b10,lefttrigger:b4,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b11,righttrigger:b5,rightx:a3,righty:a2,start:b12,x:b0,y:b3,platform:Linux, -03000000a30600000901000000010000,Saitek P880,a:b2,b:b3,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b8,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b9,righttrigger:b7,rightx:a3,righty:a2,x:b0,y:b1,platform:Linux, -03000000a306000018f5000010010000,Saitek PLC Saitek P3200 Rumble Pad,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a3,righty:a4,start:b9,x:b0,y:b3,platform:Linux, -03000000c01600008704000011010000,Serial/Keyboard/Mouse/Joystick,a:b12,b:b10,back:b4,dpdown:b2,dpleft:b3,dpright:b1,dpup:b0,leftshoulder:b9,leftstick:b14,lefttrigger:b6,leftx:a1,lefty:a0,rightshoulder:b8,rightstick:b15,righttrigger:b7,rightx:a2,righty:a3,start:b5,x:b13,y:b11,platform:Linux, -030000004c050000c405000011810000,Sony DualShock 4,a:b0,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b10,leftshoulder:b4,leftstick:b11,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b12,righttrigger:a5,rightx:a3,righty:a4,start:b9,x:b3,y:b2,platform:Linux, -050000004c050000cc09000000810000,Sony DualShock 4 (CUH-ZCT2U) (Bluetooth),a:b0,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b10,leftshoulder:b4,leftstick:b11,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b12,righttrigger:a5,rightx:a3,righty:a4,start:b9,x:b3,y:b2,platform:Linux, -030000004c050000cc09000011810000,Sony DualShock 4 (CUH-ZCT2U) (USB),a:b0,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b10,leftshoulder:b4,leftstick:b11,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b12,righttrigger:a5,rightx:a3,righty:a4,start:b9,x:b3,y:b2,platform:Linux, -030000004c050000cc09000011010000,Sony DualShock 4 V2,a:b1,b:b2,back:b13,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Linux, -050000004c050000cc09000000010000,Sony DualShock 4 V2 BT,a:b1,b:b2,back:b13,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Linux, -030000004c050000a00b000011010000,Sony DualShock 4 Wireless Adaptor,a:b1,b:b2,back:b13,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Linux, -03000000250900000500000000010000,Sony PS2 pad with SmartJoy adapter,a:b2,b:b1,back:b9,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b10,lefttrigger:b4,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b11,righttrigger:b5,rightx:a2,righty:a3,start:b8,x:b3,y:b0,platform:Linux, -030000005e0400008e02000073050000,Speedlink TORID Wireless Gamepad,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux, -030000005e0400008e02000020200000,SpeedLink XEOX Pro Analog Gamepad pad,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux, -03000000de280000fc11000001000000,Steam Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux, -03000000666600000488000000010000,Super Joy Box 5 Pro,a:b2,b:b1,back:b9,dpdown:b14,dpleft:b15,dpright:b13,dpup:b12,leftshoulder:b6,leftstick:b10,lefttrigger:b4,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b11,righttrigger:b5,rightx:a2,righty:a3,start:b8,x:b3,y:b0,platform:Linux, -030000004f04000020b3000010010000,Thrustmaster 2 in 1 DT,a:b0,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b5,leftx:a0,lefty:a1,rightshoulder:b6,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b1,y:b3,platform:Linux, -030000004f04000015b3000010010000,Thrustmaster Dual Analog 4,a:b0,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b5,leftx:a0,lefty:a1,rightshoulder:b6,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b1,y:b3,platform:Linux, -030000004f04000023b3000000010000,Thrustmaster Dual Trigger 3-in-1,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Linux, -030000004f04000000b3000010010000,Thrustmaster Firestorm Dual Power,a:b0,b:b2,back:b9,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b11,lefttrigger:b5,leftx:a0,lefty:a1,rightshoulder:b6,rightstick:b12,righttrigger:b7,rightx:a2,righty:a3,start:b10,x:b1,y:b3,platform:Linux, -030000004f04000008d0000000010000,Thrustmaster Run N Drive Wireless,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Linux, -030000004f04000009d0000000010000,Thrustmaster Run N Drive Wireless PS3,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Linux, -03000000bd12000015d0000010010000,Tomee SNES USB Controller,a:b2,b:b1,back:b8,leftshoulder:b4,leftx:a0,lefty:a1,rightshoulder:b5,start:b9,x:b3,y:b0,platform:Linux, -03000000d814000007cd000011010000,Toodles 2008 Chimp PC/PS3,a:b0,b:b1,back:b8,leftshoulder:b4,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,righttrigger:b7,start:b9,x:b3,y:b2,platform:Linux, -03000000100800000100000010010000,Twin USB PS2 Adapter,a:b2,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b10,lefttrigger:b4,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b11,righttrigger:b5,rightx:a3,righty:a2,start:b9,x:b3,y:b0,platform:Linux, -03000000100800000300000010010000,USB Gamepad,a:b2,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b10,lefttrigger:b4,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b11,righttrigger:b5,rightx:a3,righty:a2,start:b9,x:b3,y:b0,platform:Linux, -03000000de280000ff11000001000000,Valve Streaming Gamepad,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux, -05000000ac0500003232000001000000,VR-BOX,a:b0,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b10,lefttrigger:b4,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b11,righttrigger:b5,rightx:a3,righty:a2,start:b9,x:b2,y:b3,platform:Linux, -030000005e0400008e02000010010000,X360 Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux, -030000005e0400008e02000014010000,X360 Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux, -030000005e0400001907000000010000,X360 Wireless Controller,a:b0,b:b1,back:b6,dpdown:b14,dpleft:b11,dpright:b12,dpup:b13,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux, -030000005e0400009102000007010000,X360 Wireless Controller,a:b0,b:b1,back:b6,dpdown:b14,dpleft:b11,dpright:b12,dpup:b13,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux, -030000005e040000a102000000010000,X360 Wireless Controller,a:b0,b:b1,back:b6,dpdown:b14,dpleft:b11,dpright:b12,dpup:b13,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux, -0000000058626f782047616d65706100,Xbox Gamepad (userspace driver),a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a5,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a4,rightx:a2,righty:a3,start:b7,x:b2,y:b3,platform:Linux, -030000005e040000d102000001010000,Xbox One Wireless Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux, -050000005e040000e002000003090000,Xbox One Wireless Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b10,leftshoulder:b4,leftstick:b8,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b9,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux, -03000000c0160000e105000001010000,Xin-Mo Xin-Mo Dual Arcade,a:b4,b:b3,back:b6,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,guide:b9,leftshoulder:b2,leftx:a0,lefty:a1,rightshoulder:b5,start:b7,x:b1,y:b0,platform:Linux, -xinput,XInput Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux, - -# Android -4e564944494120436f72706f72617469,NVIDIA Controller,a:b0,b:b1,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b9,leftstick:b7,lefttrigger:a4,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:a5,rightx:a2,righty:a3,start:b6,x:b2,y:b3,platform:Android, - -# iOS -4d466947616d65706164010000000000,MFi Extended Gamepad,a:b0,b:b1,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,righttrigger:a5,rightx:a3,righty:a4,start:b6,x:b2,y:b3,platform:iOS, -4d466947616d65706164020000000000,MFi Gamepad,a:b0,b:b1,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,rightshoulder:b5,start:b6,x:b2,y:b3,platform:iOS, diff --git a/core/input/gamecontrollerdb_205.txt b/core/input/gamecontrollerdb_205.txt deleted file mode 100644 index 55c45eb148..0000000000 --- a/core/input/gamecontrollerdb_205.txt +++ /dev/null @@ -1,337 +0,0 @@ -# Game Controller DB for SDL in 2.0.5 format -# Source: https://github.com/gabomdq/SDL_GameControllerDB - -# Windows -03000000022000000090000000000000,8Bitdo NES30 PRO USB,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a3,righty:a4,start:b11,x:b3,y:b4,platform:Windows, -03000000203800000900000000000000,8Bitdo NES30 PRO Wireless,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a3,righty:a4,start:b11,x:b3,y:b4,platform:Windows, -03000000102800000900000000000000,8Bitdo SFC30 GamePad,a:b1,b:b0,back:b10,leftshoulder:b6,leftx:a0,lefty:a1,rightshoulder:b7,start:b11,x:b4,y:b3,platform:Windows, -10280900000000000000504944564944,8Bitdo SFC30 GamePad,a:b1,b:b0,back:b10,leftshoulder:b6,leftx:a0,lefty:a1,rightshoulder:b7,start:b11,x:b4,y:b3,platform:Windows, -030000008f0e00001200000000000000,Acme,a:b0,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b5,leftx:a0,lefty:a1,rightshoulder:b6,rightstick:b11,righttrigger:b7,rightx:a3,righty:a2,start:b9,x:b2,y:b3,platform:Windows, -03000000341a00003608000000000000,Afterglow PS3 Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Windows, -341a3608000000000000504944564944,Afterglow PS3 Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Windows, -03000000c01100001352000000000000,Battalife Joystick,a:b6,b:b7,back:b2,leftshoulder:b0,leftx:a0,lefty:a1,rightshoulder:b1,start:b3,x:b4,y:b5,platform:Windows, -030000006b1400000055000000000000,bigben ps3padstreetnew,a:b0,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b2,y:b3,platform:Windows, -0300000066f700000500000000000000,BrutalLegendTest,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a3,righty:a2,start:b9,x:b0,y:b3,platform:Windows, -03000000d81d00000b00000000000000,BUFFALO BSGP1601 Series ,a:b5,b:b3,back:b12,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b8,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b9,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b13,x:b4,y:b2,platform:Windows, -e8206058000000000000504944564944,Cideko AK08b,a:b2,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b3,y:b0,platform:Windows, -030000005e0400008e02000000000000,Controller (XBOX 360 For Windows),a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b8,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b9,righttrigger:a2,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Windows, -030000004f04000023b3000000000000,Dual Trigger 3-in-1,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Windows, -03000000341a00000108000000000000,EXEQ RF USB Gamepad 8206,a:b0,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b8,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b7,rightx:a2,righty:a3,start:b9,x:b2,y:b3,platform:Windows, -030000000d0f00008500000000000000,Fighting Commander 2016 PS3,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Windows, -030000000d0f00005e00000000000000,Fighting Commander 4,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b5,leftstick:b10,lefttrigger:a4,leftx:a0,lefty:a1,rightshoulder:b4,rightstick:b11,righttrigger:a3,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Windows, -030000000d0f00005f00000000000000,Fighting Commander 4,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Windows, -030000000d0f00008400000000000000,Fighting Commander 5,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Windows, -030000000d0f00008700000000000000,Fighting Stick mini 4,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,lefttrigger:b6,rightshoulder:b5,righttrigger:b7,start:b9,x:b0,y:b3,platform:Windows, -030000000d0f00008800000000000000,Fighting Stick mini 4,a:b1,b:b2,back:b9,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,lefttrigger:b6,rightshoulder:b5,righttrigger:b7,start:b8,x:b0,y:b3,platform:Windows, -030000000d0f00002700000000000000,FIGHTING STICK V3,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,lefttrigger:b6,rightshoulder:b5,righttrigger:b7,start:b9,x:b0,y:b3,platform:Windows, -78696e70757403000000000000000000,Fightstick TES,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b10,leftshoulder:b4,lefttrigger:a2,rightshoulder:b5,righttrigger:a5,start:b7,x:b2,y:b3,platform:Windows, -03000000790000000600000000000000,G-Shark GS-GP702,a:b2,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a4,start:b9,x:b3,y:b0,platform:Windows, -03000000260900002625000000000000,Gamecube Controller,a:b0,b:b1,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b6,lefttrigger:a4,leftx:a0,lefty:a1,righttrigger:a5,rightx:a2,righty:a3,start:b7,x:b2,y:b3,platform:Windows, -030000008f0e00000d31000000000000,GAMEPAD 3 TURBO,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Windows, -03000000280400000140000000000000,GamePad Pro USB,a:b1,b:b2,back:b8,leftshoulder:b4,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,righttrigger:b7,start:b9,x:b0,y:b3,platform:Windows, -03000000ffff00000000000000000000,GameStop Gamepad,a:b0,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b2,y:b3,platform:Windows, -ffff0000000000000000504944564944,GameStop Gamepad,a:b0,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b2,y:b3,platform:Windows, -030000006d04000016c2000000000000,Generic DirectInput Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Windows, -6d0416c2000000000000504944564944,Generic DirectInput Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Windows, -03000000451300000010000000000000,Generic USB Joystick,a:b0,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b2,y:b3,platform:Windows, -03000000341a00000302000000000000,Hama Scorpad,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Windows, -030000000d0f00004900000000000000,Hatsune Miku Sho Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Windows, -03000000d81400000862000000000000,HitBox Edition Cthulhu+,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b5,lefttrigger:b4,rightshoulder:b7,righttrigger:b6,start:b9,x:b0,y:b3,platform:Windows, -030000000d0f00004000000000000000,Hori Fighting Stick Mini 3,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b5,lefttrigger:b4,rightshoulder:b7,righttrigger:b6,start:b9,x:b0,y:b3,platform:Windows, -030000000d0f00006e00000000000000,HORIPAD 4,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Windows, -030000000d0f00004d00000000000000,HORIPAD3 A,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Windows, -03000000250900000017000000000000,HRAP2 on PS/SS/N64 Joypad to USB BOX,a:b2,b:b1,back:b9,leftshoulder:b5,lefttrigger:b4,leftx:a0,lefty:a1,rightshoulder:b7,righttrigger:b6,start:b8,x:b3,y:b0,platform:Windows, -03000000d81d00000f00000000000000,iBUFFALO BSGP1204 Series,a:b2,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b10,lefttrigger:b4,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b11,righttrigger:b5,rightx:a2,righty:a3,start:b9,x:b3,y:b0,platform:Windows, -03000000d81d00001000000000000000,iBUFFALO BSGP1204P Series,a:b2,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b10,lefttrigger:b4,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b11,righttrigger:b5,rightx:a2,righty:a3,start:b9,x:b3,y:b0,platform:Windows, -03000000830500006020000000000000,iBuffalo USB 2-axis 8-button Gamepad,a:b1,b:b0,back:b6,leftshoulder:b4,leftx:a0,lefty:a1,rightshoulder:b5,start:b7,x:b3,y:b2,platform:Windows, -03000000b50700001403000000000000,IMPACT BLACK,a:b2,b:b3,back:b8,leftshoulder:b4,leftstick:b10,lefttrigger:b5,leftx:a0,lefty:a1,rightshoulder:b6,rightstick:b11,righttrigger:b7,rightx:a3,righty:a2,start:b9,x:b0,y:b1,platform:Windows, -030000006f0e00002401000000000000,INJUSTICE FightStick for PS3,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,lefttrigger:b6,rightshoulder:b5,righttrigger:b7,start:b9,x:b0,y:b3,platform:Windows, -03000000491900000204000000000000,Ipega PG-9023,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a3,righty:a4,start:b11,x:b3,y:b4,platform:Windows, -030000006d04000019c2000000000000,Logitech Cordless RumblePad 2 USB,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Windows, -030000006d04000011c2000000000000,Logitech Cordless Wingman,a:b0,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b9,leftstick:b5,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b2,righttrigger:b7,rightx:a3,righty:a4,x:b4,platform:Windows, -6d0418c2000000000000504944564944,Logitech F510 Gamepad,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Windows, -6d0419c2000000000000504944564944,Logitech F710 Gamepad,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Windows, -030000006d04000018c2000000000000,Logitech RumblePad 2,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Windows, -03000000380700005032000000000000,Mad Catz FightPad PRO PS3,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Windows, -03000000380700005082000000000000,Mad Catz FightPad PRO PS4,a:b1,b:b2,back:b13,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Windows, -03000000380700008433000000000000,Mad Catz FightStick TE S+ PS3,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,lefttrigger:b6,rightshoulder:b5,righttrigger:b7,start:b9,x:b0,y:b3,platform:Windows, -03000000380700008483000000000000,Mad Catz FightStick TE S+ PS4,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b6,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Windows, -03000000380700008134000000000000,Mad Catz FightStick TE2+ PS3,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b7,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b4,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Windows, -03000000380700008184000000000000,Mad Catz FightStick TE2+ PS4,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b5,leftstick:b10,lefttrigger:a4,leftx:a0,lefty:a1,rightshoulder:b4,rightstick:b11,righttrigger:b7,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Windows, -03000000380700008034000000000000,Mad Catz TE2 PS3 Fightstick,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Windows, -03000000380700008084000000000000,Mad Catz TE2 PS4 Fightstick,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Windows, -03000000380700008532000000000000,Madcatz Arcade Fightstick TE S PS3,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Windows, -03000000380700003888000000000000,Madcatz Arcade Fightstick TE S+ PS3,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Windows, -03000000380700001888000000000000,MadCatz SFIV FightStick PS3,a:b0,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b5,lefttrigger:b7,leftx:a0,lefty:a1,rightshoulder:b4,righttrigger:b6,rightx:a2,righty:a3,start:b9,x:b2,y:b3,platform:Windows, -03000000380700008081000000000000,MADCATZ SFV Arcade FightStick Alpha PS4,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,righttrigger:b7,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Windows, -030000008305000031b0000000000000,MaxfireBlaze3,a:b0,b:b1,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b2,y:b3,platform:Windows, -03000000250900000128000000000000,Mayflash Arcade Stick,a:b1,b:b2,back:b8,leftshoulder:b0,lefttrigger:b4,leftx:a0,lefty:a1,rightshoulder:b3,righttrigger:b7,start:b9,x:b5,y:b6,platform:Windows, -03000000790000004318000000000000,Mayflash GameCube Controller Adapter,a:b1,b:b2,back:b0,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b0,leftshoulder:b4,leftstick:b0,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b0,righttrigger:a4,rightx:a5,righty:a2,start:b9,x:b0,y:b3,platform:Windows, -030000008f0e00001030000000000000,Mayflash USB Adapter for original Sega Saturn controller,a:b0,b:b1,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,lefttrigger:b5,rightshoulder:b2,righttrigger:b7,start:b9,x:b3,y:b4,platform:Windows, -0300000025090000e803000000000000,Mayflash Wii Classic Controller,a:b1,b:b0,back:b8,dpdown:b13,dpleft:b12,dpright:b14,dpup:b11,guide:b10,leftshoulder:b4,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b3,y:b2,platform:Windows, -03000000790000000018000000000000,Mayflash WiiU Pro Game Controller Adapter (DInput),a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Windows, -030000001008000001e5000000000000,NEXT Classic USB Game Controller,a:b2,b:b1,back:b8,leftshoulder:b4,leftx:a0,lefty:a1,rightshoulder:b6,righttrigger:b5,rightx:a2,righty:a3,start:b9,x:b3,y:b0,platform:Windows, -03000000bd12000015d0000000000000,Nintendo Retrolink USB Super SNES Classic Controller,a:b2,b:b1,back:b8,leftshoulder:b4,leftx:a0,lefty:a1,rightshoulder:b5,start:b9,x:b3,y:b0,platform:Windows, -030000004b120000014d000000000000,NYKO AIRFLO,a:b0,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b10,leftshoulder:a3,leftstick:a0,lefttrigger:b6,rightshoulder:b5,rightstick:a2,righttrigger:b7,start:b9,x:b2,y:b3,platform:Windows, -03000000362800000100000000000000,OUYA Controller,a:b0,b:b3,dpdown:b9,dpleft:b10,dpright:b11,dpup:b8,guide:b15,leftshoulder:b4,leftstick:b6,lefttrigger:b12,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b7,righttrigger:b13,rightx:a3,righty:a4,start:b14,x:b1,y:b2,platform:Windows, -4d6963726f736f66742050432d6a6f79,OUYA Controller,a:b0,b:b3,dpdown:b9,dpleft:b10,dpright:b11,dpup:b8,guide:b14,leftshoulder:b4,leftstick:b6,lefttrigger:b12,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b7,righttrigger:b13,rightx:a5,righty:a4,x:b1,y:b2,platform:Windows, -03000000120c0000f60e000000000000,P4 Wired Gamepad,a:b1,b:b2,back:b12,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b5,lefttrigger:b7,rightshoulder:b4,righttrigger:b6,start:b9,x:b0,y:b3,platform:Windows, -030000008f0e00000300000000000000,Piranha xtreme,a:b2,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b10,lefttrigger:b4,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b11,righttrigger:b5,rightx:a3,righty:a2,start:b9,x:b3,y:b0,platform:Windows, -03000000d62000006dca000000000000,PowerA Pro Ex,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Windows, -030000008f0e00007530000000000000,PS (R) Gamepad,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b1,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Windows, -03000000e30500009605000000000000,PS to USB convert cable,a:b2,b:b1,back:b9,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b10,lefttrigger:b4,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b11,righttrigger:b5,rightx:a2,righty:a3,start:b8,x:b3,y:b0,platform:Windows, -03000000100800000100000000000000,PS1 USB,a:b2,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b10,lefttrigger:b4,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b11,righttrigger:b5,rightx:a3,righty:a2,start:b9,x:b3,y:b0,platform:Windows, -03000000100800000300000000000000,PS2 USB,a:b2,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b10,lefttrigger:b4,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b11,righttrigger:b5,rightx:a4,righty:a2,start:b9,x:b3,y:b0,platform:Windows, -03000000888800000803000000000000,PS3,a:b2,b:b1,back:b8,dpdown:h0.8,dpleft:h0.4,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a3,righty:a4,start:b9,x:b3,y:b0,platform:Windows, -030000004c0500006802000000000000,PS3 Controller,a:b14,b:b13,back:b0,dpdown:b6,dpleft:b7,dpright:b5,dpup:b4,guide:b16,leftshoulder:b10,leftstick:b1,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b11,rightstick:b2,righttrigger:b9,rightx:a2,righty:a3,start:b3,x:b15,y:b12,platform:Windows, -4c056802000000000000504944564944,PS3 Controller,a:b14,b:b13,back:b0,dpdown:b6,dpleft:b7,dpright:b5,dpup:b4,guide:b16,leftshoulder:b10,leftstick:b1,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b11,rightstick:b2,righttrigger:b9,rightx:a2,righty:a3,start:b3,x:b15,y:b12,platform:Windows, -88880803000000000000504944564944,PS3 Controller,a:b2,b:b1,back:b8,dpdown:h0.8,dpleft:h0.4,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b9,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:b7,rightx:a3,righty:a4,start:b11,x:b0,y:b3,platform:Windows, -03000000250900000500000000000000,PS3 DualShock,a:b2,b:b1,back:b9,dpdown:h0.8,dpleft:h0.4,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b10,lefttrigger:b4,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b11,righttrigger:b5,rightx:a2,righty:a3,start:b8,x:b0,y:b3,platform:Windows, -25090500000000000000504944564944,PS3 DualShock,a:b2,b:b1,back:b9,dpdown:h0.8,dpleft:h0.4,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b10,lefttrigger:b4,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b11,righttrigger:b5,rightx:a2,righty:a3,start:b8,x:b0,y:b3,platform:Windows, -03000000100000008200000000000000,PS360+ v1.66,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,lefttrigger:b6,leftx:h0.4,rightshoulder:b5,righttrigger:b7,start:b9,x:b0,y:b3,platform:Windows, -030000004c050000c405000000000000,PS4 Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Windows, -4c05c405000000000000504944564944,PS4 Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Windows, -03000000300f00000011000000000000,QanBa Arcade JoyStick 1008,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,righttrigger:b7,start:b10,x:b0,y:b3,platform:Windows, -03000000300f00001611000000000000,QanBa Arcade JoyStick 4018,a:b1,b:b2,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b9,leftshoulder:b4,lefttrigger:b6,rightshoulder:b5,righttrigger:b7,start:b8,x:b0,y:b3,platform:Windows, -03000000222c00000020000000000000,QANBA DRONE ARCADE JOYSTICK,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,lefttrigger:a3,rightshoulder:b5,righttrigger:a4,start:b9,x:b0,y:b3,platform:Windows, -03000000300f00001210000000000000,QanBa Joystick Plus,a:b0,b:b1,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,rightshoulder:b5,start:b9,x:b2,y:b3,platform:Windows, -03000000341a00000104000000000000,QanBa Joystick Q4RAF,a:b5,b:b6,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b10,leftshoulder:b0,lefttrigger:b4,leftx:a0,lefty:a1,rightshoulder:b3,righttrigger:b7,start:b9,x:b1,y:b2,platform:Windows, -03000000222c00000223000000000000,Qanba Obsidian Arcade Joystick PS3 Mode,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Windows, -03000000222c00000023000000000000,Qanba Obsidian Arcade Joystick PS4 Mode,a:b1,b:b2,back:b13,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Windows, -03000000321500000003000000000000,Razer Hydra,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b8,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b9,righttrigger:a2,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Windows, -030000000d0f00001100000000000000,REAL ARCADE PRO.3,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,rightshoulder:b5,rightstick:b11,righttrigger:b7,start:b9,x:b0,y:b3,platform:Windows, -030000000d0f00006a00000000000000,Real Arcade Pro.4,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Windows, -030000000d0f00006b00000000000000,Real Arcade Pro.4,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Windows, -030000000d0f00008a00000000000000,Real Arcade Pro.4,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Windows, -030000000d0f00008b00000000000000,Real Arcade Pro.4,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Windows, -030000000d0f00007000000000000000,REAL ARCADE PRO.4 VLX,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,rightshoulder:b5,rightstick:b11,righttrigger:b7,start:b9,x:b0,y:b3,platform:Windows, -030000000d0f00002200000000000000,REAL ARCADE Pro.V3,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Windows, -030000000d0f00005b00000000000000,Real Arcade Pro.V4,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Windows, -030000000d0f00005c00000000000000,Real Arcade Pro.V4,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Windows, -0300000000f000000300000000000000,RetroUSB.com RetroPad,a:b1,b:b5,back:b2,leftshoulder:b6,leftx:a0,lefty:a1,rightshoulder:b7,start:b3,x:b0,y:b4,platform:Windows, -0300000000f00000f100000000000000,RetroUSB.com Super RetroPort,a:b1,b:b5,back:b2,leftshoulder:b6,leftx:a0,lefty:a1,rightshoulder:b7,start:b3,x:b0,y:b4,platform:Windows, -030000006f0e00001e01000000000000,Rock Candy Gamepad for PS3,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Windows, -030000004f04000003d0000000000000,run'n'drive,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b7,leftshoulder:a3,leftstick:b10,lefttrigger:b4,leftx:a0,lefty:a1,rightshoulder:a4,rightstick:b11,righttrigger:b5,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Windows, -03000000a30600001af5000000000000,Saitek Cyborg,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a3,righty:a4,start:b9,x:b0,y:b3,platform:Windows, -03000000a306000023f6000000000000,Saitek Cyborg V.1 Game pad,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a4,start:b9,x:b0,y:b3,platform:Windows, -03000000300f00001201000000000000,Saitek Dual Analog Pad,a:b2,b:b3,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b5,leftx:a0,lefty:a1,rightshoulder:b6,rightstick:b11,righttrigger:b7,rightx:a3,righty:a2,start:b9,x:b0,y:b1,platform:Windows, -03000000a30600000cff000000000000,Saitek P2500,a:b2,b:b3,back:b5,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b10,leftshoulder:b6,leftstick:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b9,rightx:a2,righty:a3,start:b4,x:b0,y:b1,platform:Windows, -03000000a30600000c04000000000000,Saitek P2900,a:b1,b:b2,back:b12,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a3,righty:a2,start:b9,x:b0,y:b3,platform:Windows, -03000000300f00001001000000000000,Saitek P480 Rumble Pad,a:b2,b:b3,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b5,leftx:a0,lefty:a1,rightshoulder:b6,rightstick:b11,righttrigger:b7,rightx:a3,righty:a2,start:b9,x:b0,y:b1,platform:Windows, -03000000a30600000b04000000000000,Saitek P990,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a3,righty:a2,start:b9,x:b0,y:b3,platform:Windows, -03000000300f00001101000000000000,saitek rumble pad,a:b2,b:b3,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b10,lefttrigger:b5,leftx:a0,lefty:a1,rightshoulder:b6,rightstick:b11,righttrigger:b7,rightx:a3,righty:a2,start:b9,x:b0,y:b1,platform:Windows, -0300000000050000289b000000000000,Saturn_Adapter_2.0,a:b1,b:b2,leftshoulder:b6,lefttrigger:b4,leftx:a0,lefty:a1,rightshoulder:b7,righttrigger:b5,start:b9,x:b0,y:b3,platform:Windows, -030000009b2800000500000000000000,Saturn_Adapter_2.0,a:b1,b:b2,leftshoulder:b6,lefttrigger:b4,leftx:a0,lefty:a1,rightshoulder:b7,righttrigger:b5,start:b9,x:b0,y:b3,platform:Windows, -03000000790000001100000000000000,Sega Saturn Gamepad,a:b1,b:b2,leftshoulder:b6,lefttrigger:b3,leftx:a0,lefty:a4,rightshoulder:b7,righttrigger:b0,start:b8,x:b4,y:b5,platform:Windows, -03000000341a00000208000000000000,SL-6555-SBK,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b8,lefttrigger:-a4,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b9,righttrigger:a4,rightx:a3,righty:a2,start:b7,x:b2,y:b3,platform:Windows, -030000004c050000cc09000000000000,Sony DualShock 4,a:b1,b:b2,back:b13,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Windows, -030000004c050000a00b000000000000,Sony DualShock 4 Wireless Adaptor,a:b1,b:b2,back:b13,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Windows, -030000008f0e00000800000000000000,SpeedLink Strike FX Wireless,a:b2,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b3,y:b0,platform:Windows, -03000000ff1100003133000000000000,SVEN X-PAD,a:b2,b:b3,back:b4,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,righttrigger:b9,rightx:a2,righty:a4,start:b5,x:b0,y:b1,platform:Windows, -03000000fa1900000706000000000000,Team 5,a:b2,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b3,y:b0,platform:Windows, -03000000b50700001203000000000000,Techmobility X6-38V,a:b2,b:b3,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b5,leftx:a0,lefty:a1,rightshoulder:b6,rightstick:b11,righttrigger:b7,rightx:a3,righty:a2,start:b9,x:b0,y:b1,platform:Windows, -030000004f04000015b3000000000000,Thrustmaster Dual Analog 2,a:b0,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b5,leftx:a0,lefty:a1,rightshoulder:b6,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b1,y:b3,platform:Windows, -030000004f04000000b3000000000000,Thrustmaster Firestorm Dual Power,a:b0,b:b2,back:b9,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b11,lefttrigger:b5,leftx:a0,lefty:a1,rightshoulder:b6,rightstick:b12,righttrigger:b7,rightx:a2,righty:a3,start:b10,x:b1,y:b3,platform:Windows, -030000004f04000004b3000000000000,Thrustmaster Firestorm Dual Power 3,a:b0,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b5,leftx:a0,lefty:a1,rightshoulder:b6,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b1,y:b3,platform:Windows, -03000000666600000488000000000000,TigerGame PS/PS2 Game Controller Adapter,a:b2,b:b1,back:b9,dpdown:b14,dpleft:b15,dpright:b13,dpup:b12,leftshoulder:b6,leftstick:b10,lefttrigger:b4,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b11,righttrigger:b5,rightx:a2,righty:a3,start:b8,x:b3,y:b0,platform:Windows, -03000000d90400000200000000000000,TwinShock PS2,a:b2,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b10,lefttrigger:b4,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b11,righttrigger:b5,rightx:a3,righty:a2,start:b9,x:b3,y:b0,platform:Windows, -03000000380700006652000000000000,UnKnown,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a3,righty:a4,start:b9,x:b0,y:b3,platform:Windows, -03000000632500002305000000000000,USB Vibration Joystick (BM),a:b2,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b3,y:b0,platform:Windows, -03000000790000001b18000000000000,Venom Arcade Joystick,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,lefttrigger:b6,rightshoulder:b5,righttrigger:b7,start:b9,x:b0,y:b3,platform:Windows, -03000000786901006e70000000000000,XInput Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b10,leftshoulder:b4,leftstick:b8,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b9,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Windows, -xinput,XInput Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b10,leftshoulder:b4,leftstick:b8,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b9,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Windows, - -# Mac OS X -03000000102800000900000000000000,8Bitdo SFC30 GamePad,a:b1,b:b0,back:b10,leftshoulder:b6,leftx:a0,lefty:a1,rightshoulder:b7,start:b11,x:b4,y:b3,platform:Mac OS X, -10280000000000000900000000000000,8Bitdo SFC30 GamePad Joystick,a:b1,b:b0,back:b10,leftshoulder:b6,leftx:a0,lefty:a1,rightshoulder:b7,start:b11,x:b4,y:b3,platform:Mac OS X, -830500000000000031b0000000000000,Cideko AK08b,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Mac OS X, -03000000790000000600000000000000,G-Shark GP-702,a:b2,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a3,righty:a4,start:b9,x:b3,y:b0,platform:Mac OS X, -03000000ad1b000001f9000000000000,Gamestop BB-070 X360 Controller,a:b0,b:b1,back:b9,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,guide:b10,leftshoulder:b4,leftstick:b6,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b7,righttrigger:a5,rightx:a3,righty:a4,start:b8,x:b2,y:b3,platform:Mac OS X, -0500000047532047616d657061640000,GameStop Gamepad,a:b0,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b2,y:b3,platform:Mac OS X, -030000000d0f00005f00000000000000,HORI Fighting Commander 4 PS3,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Mac OS X, -030000000d0f00005e00000000000000,HORI Fighting Commander 4 PS4,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Mac OS X, -030000000d0f00004d00000000000000,HORI Gem Pad 3,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Mac OS X, -030000000d0f00006600000000000000,HORIPAD FPS PLUS 4,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Mac OS X, -03000000830500006020000000000000,iBuffalo USB 2-axis 8-button Gamepad,a:b1,b:b0,back:b6,leftshoulder:b4,leftx:a0,lefty:a1,rightshoulder:b5,start:b7,x:b3,y:b2,platform:Mac OS X, -030000006d04000016c2000000000000,Logitech F310 Gamepad (DInput),a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Mac OS X, -6d0400000000000016c2000000000000,Logitech F310 Gamepad (DInput),a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Mac OS X, -030000006d04000018c2000000000000,Logitech F510 Gamepad (DInput),a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Mac OS X, -6d0400000000000018c2000000000000,Logitech F510 Gamepad (DInput),a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Mac OS X, -030000006d0400001fc2000000000000,Logitech F710 Gamepad (XInput),a:b0,b:b1,back:b9,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,guide:b10,leftshoulder:b4,leftstick:b6,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b7,righttrigger:a5,rightx:a3,righty:a4,start:b8,x:b2,y:b3,platform:Mac OS X, -6d040000000000001fc2000000000000,Logitech F710 Gamepad (XInput),a:b0,b:b1,back:b9,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,guide:b10,leftshoulder:b4,leftstick:b6,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b7,righttrigger:a5,rightx:a3,righty:a4,start:b8,x:b2,y:b3,platform:Mac OS X, -030000006d04000019c2000000000000,Logitech Wireless Gamepad (DInput),a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Mac OS X, -6d0400000000000019c2000000000000,Logitech Wireless Gamepad (DInput),a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Mac OS X, -0300000025090000e803000000000000,Mayflash Wii Classic Controller,a:b1,b:b0,back:b8,dpdown:b13,dpleft:b12,dpright:b14,dpup:b11,guide:b10,leftshoulder:b4,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b3,y:b2,platform:Mac OS X, -03000000790000000018000000000000,Mayflash WiiU Pro Game Controller Adapter (DInput),a:b4,b:b8,back:b32,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b16,leftstick:b40,lefttrigger:b24,leftx:a0,lefty:a4,rightshoulder:b20,rightstick:b44,righttrigger:b28,rightx:a8,righty:a12,start:b36,x:b0,y:b12,platform:Mac OS X, -03000000d8140000cecf000000000000,MC Cthulhu,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,lefttrigger:b6,rightshoulder:b5,righttrigger:b7,start:b9,x:b0,y:b3,platform:Mac OS X, -030000008f0e00000300000000000000,Piranha xtreme,a:b2,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b10,lefttrigger:b4,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b11,righttrigger:b5,rightx:a3,righty:a2,start:b9,x:b3,y:b0,platform:Mac OS X, -030000004c0500006802000000000000,PS3 Controller,a:b14,b:b13,back:b0,dpdown:b6,dpleft:b7,dpright:b5,dpup:b4,guide:b16,leftshoulder:b10,leftstick:b1,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b11,rightstick:b2,righttrigger:b9,rightx:a2,righty:a3,start:b3,x:b15,y:b12,platform:Mac OS X, -4c050000000000006802000000000000,PS3 Controller,a:b14,b:b13,back:b0,dpdown:b6,dpleft:b7,dpright:b5,dpup:b4,guide:b16,leftshoulder:b10,leftstick:b1,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b11,rightstick:b2,righttrigger:b9,rightx:a2,righty:a3,start:b3,x:b15,y:b12,platform:Mac OS X, -030000004c050000c405000000000000,PS4 Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Mac OS X, -4c05000000000000c405000000000000,PS4 Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Mac OS X, -030000008916000000fd000000000000,Razer Onza TE,a:b0,b:b1,back:b9,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,guide:b10,leftshoulder:b4,leftstick:b6,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b7,righttrigger:a5,rightx:a3,righty:a4,start:b8,x:b2,y:b3,platform:Mac OS X, -03000000790000001100000000000000,Retrolink Classic Controller,a:b2,b:b1,back:b8,leftshoulder:b4,leftx:a3,lefty:a4,rightshoulder:b5,start:b9,x:b3,y:b0,platform:Mac OS X, -03000000811700007e05000000000000,Sega Saturn,a:b2,b:b4,dpdown:b16,dpleft:b15,dpright:b14,dpup:b17,leftshoulder:b8,lefttrigger:a5,leftx:a0,lefty:a2,rightshoulder:b9,righttrigger:a4,start:b13,x:b0,y:b6,platform:Mac OS X, -03000000b40400000a01000000000000,Sega Saturn USB Gamepad,a:b0,b:b1,back:b5,guide:b2,leftshoulder:b6,leftx:a0,lefty:a1,rightshoulder:b7,start:b8,x:b3,y:b4,platform:Mac OS X, -030000003512000021ab000000000000,SFC30 Joystick,a:b1,b:b0,back:b10,leftshoulder:b6,leftx:a0,lefty:a1,rightshoulder:b7,start:b11,x:b4,y:b3,platform:Mac OS X, -351200000000000021ab000000000000,SFC30 Joystick,a:b1,b:b0,back:b10,leftshoulder:b6,leftx:a0,lefty:a1,rightshoulder:b7,start:b11,x:b4,y:b3,platform:Mac OS X, -030000004c050000cc09000000000000,Sony DualShock 4 V2,a:b1,b:b2,back:b13,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Mac OS X, -030000004c050000a00b000000000000,Sony DualShock 4 Wireless Adaptor,a:b1,b:b2,back:b13,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Mac OS X, -11010000000000002014000000000000,SteelSeries Nimbus,a:b0,b:b1,dpdown:b9,dpleft:b11,dpright:b10,dpup:b8,leftshoulder:b4,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,righttrigger:b7,rightx:a2,righty:a3,start:b12,x:b2,y:b3,platform:Mac OS X, -11010000000000001714000000000000,SteelSeries Stratus XL,a:b0,b:b1,dpdown:b9,dpleft:b11,dpright:b10,dpup:b8,leftshoulder:b4,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,righttrigger:b7,rightx:a2,righty:a3,start:b12,x:b2,y:b3,platform:Mac OS X, -030000004f04000015b3000000000000,Thrustmaster Dual Analog 3.2,a:b0,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b5,leftx:a0,lefty:a1,rightshoulder:b6,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b1,y:b3,platform:Mac OS X, -030000004f04000000b3000000000000,Thrustmaster Firestorm Dual Power,a:b0,b:b2,back:b9,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b11,lefttrigger:b5,leftx:a0,lefty:a1,rightshoulder:b6,righttrigger:b7,rightx:a2,righty:a3,start:b10,x:b1,y:b3,platform:Mac OS X, -03000000bd12000015d0000000000000,Tomee SNES USB Controller,a:b2,b:b1,back:b8,leftshoulder:b4,leftx:a0,lefty:a1,rightshoulder:b5,start:b9,x:b3,y:b0,platform:Mac OS X, -03000000100800000100000000000000,Twin USB Joystick,a:b4,b:b2,back:b16,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b12,leftstick:b20,lefttrigger:b8,leftx:a0,lefty:a2,rightshoulder:b14,rightstick:b22,righttrigger:b10,rightx:a6,righty:a4,start:b18,x:b6,y:b0,platform:Mac OS X, -050000005769696d6f74652028303000,Wii Remote,a:b4,b:b5,back:b7,dpdown:b3,dpleft:b0,dpright:b1,dpup:b2,guide:b8,leftshoulder:b11,lefttrigger:b12,leftx:a0,lefty:a1,start:b6,x:b10,y:b9,platform:Mac OS X, -050000005769696d6f74652028313800,Wii U Pro Controller,a:b16,b:b15,back:b7,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,guide:b8,leftshoulder:b19,leftstick:b23,lefttrigger:b21,leftx:a0,lefty:a1,rightshoulder:b20,rightstick:b24,righttrigger:b22,rightx:a2,righty:a3,start:b6,x:b18,y:b17,platform:Mac OS X, -030000005e0400008e02000000000000,X360 Controller,a:b0,b:b1,back:b9,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,guide:b10,leftshoulder:b4,leftstick:b6,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b7,righttrigger:a5,rightx:a3,righty:a4,start:b8,x:b2,y:b3,platform:Mac OS X, -5e040000000000008e02000000000000,X360 Controller,a:b0,b:b1,back:b9,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,guide:b10,leftshoulder:b4,leftstick:b6,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b7,righttrigger:a5,rightx:a3,righty:a4,start:b8,x:b2,y:b3,platform:Mac OS X, -030000005e040000dd02000000000000,Xbox One Wired Controller,a:b0,b:b1,back:b9,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,guide:b10,leftshoulder:b4,leftstick:b6,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b7,righttrigger:a5,rightx:a3,righty:a4,start:b8,x:b2,y:b3,platform:Mac OS X, -030000005e040000e002000000000000,Xbox Wireless Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b10,leftshoulder:b4,leftstick:b8,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b9,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Mac OS X, -030000005e040000ea02000000000000,Xbox Wireless Controller,a:b0,b:b1,back:b9,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,guide:b10,leftshoulder:b4,leftstick:b6,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b7,righttrigger:a5,rightx:a3,righty:a4,start:b8,x:b2,y:b3,platform:Mac OS X, - -# Linux -05000000203800000900000000010000,8Bitdo NES30 Pro,a:b1,b:b0,back:b10,leftshoulder:b6,leftstick:b13,lefttrigger:a5,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:a6,rightx:a2,righty:a3,start:b11,x:b4,y:b3,platform:Linux, -05000000c82d00002038000000010000,8Bitdo NES30 Pro,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b2,leftshoulder:b6,leftstick:b13,lefttrigger:a5,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:a4,rightx:a2,righty:a3,start:b11,x:b4,y:b3,platform:Linux, -03000000c82d00000190000011010000,8Bitdo NES30 Pro 8Bitdo NES30 Pro,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b13,lefttrigger:a4,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:a5,rightx:a2,righty:a3,start:b11,x:b4,y:b3,platform:Linux, -05000000102800000900000000010000,8Bitdo SFC30 GamePad,a:b1,b:b0,back:b10,leftshoulder:b6,leftx:a0,lefty:a1,rightshoulder:b7,start:b11,x:b4,y:b3,platform:Linux, -05000000a00500003232000001000000,8Bitdo Zero GamePad,a:b0,b:b1,back:b10,leftshoulder:b6,leftx:a0,lefty:a1,rightshoulder:b7,start:b11,x:b3,y:b4,platform:Linux, -030000006f0e00003901000020060000,Afterglow Wired Controller for Xbox One,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux, -03000000100000008200000011010000,Akishop Customs PS360+ v1.66,a:b1,b:b2,back:b12,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,lefttrigger:b6,rightshoulder:b5,righttrigger:b7,start:b9,x:b0,y:b3,platform:Linux, -03000000666600006706000000010000,boom PSX to PC Converter,a:b2,b:b1,back:b8,dpdown:b14,dpleft:b15,dpright:b13,dpup:b12,leftshoulder:b6,leftstick:b9,lefttrigger:b4,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b10,righttrigger:b5,rightx:a2,righty:a3,start:b11,x:b3,y:b0,platform:Linux, -03000000e82000006058000001010000,Cideko AK08b,a:b2,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b3,y:b0,platform:Linux, -03000000b40400000a01000000010000,CYPRESS USB Gamepad,a:b0,b:b1,back:b5,guide:b2,leftshoulder:b6,leftx:a0,lefty:a1,rightshoulder:b7,start:b8,x:b3,y:b4,platform:Linux, -03000000790000000600000010010000,DragonRise Inc. Generic USB Joystick,a:b2,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a3,righty:a4,start:b9,x:b3,y:b0,platform:Linux, -030000006f0e00003001000001010000,EA Sports PS3 Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Linux, -03000000341a000005f7000010010000,GameCube {HuiJia USB box},a:b1,b:b2,dpdown:b14,dpleft:b15,dpright:b13,dpup:b12,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b7,righttrigger:a4,rightx:a5,righty:a2,start:b9,x:b0,y:b3,platform:Linux, -03000000260900008888000000010000,GameCube {WiseGroup USB box},a:b0,b:b2,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,lefttrigger:a4,leftx:a0,lefty:a1,rightshoulder:b6,righttrigger:a5,rightx:a2,righty:a3,start:b7,x:b1,y:b3,platform:Linux, -0500000047532047616d657061640000,GameStop Gamepad,a:b0,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b2,y:b3,platform:Linux, -030000006f0e00000104000000010000,Gamestop Logic3 Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux, -030000006f0e00001304000000010000,Generic X-Box pad,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:a0,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:a3,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux, -030000006f0e00001f01000000010000,Generic X-Box pad,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux, -03000000f0250000c183000010010000,Goodbetterbest Ltd USB Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Linux, -03000000280400000140000000010000,Gravis GamePad Pro USB ,a:b1,b:b2,back:b8,leftshoulder:b4,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,righttrigger:b7,start:b9,x:b0,y:b3,platform:Linux, -030000008f0e00000300000010010000,GreenAsia Inc. USB Joystick,a:b2,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b10,lefttrigger:b4,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b11,righttrigger:b5,rightx:a3,righty:a2,start:b9,x:b3,y:b0,platform:Linux, -030000008f0e00001200000010010000,GreenAsia Inc. USB Joystick,a:b0,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b5,leftx:a0,lefty:a1,rightshoulder:b6,rightstick:b11,righttrigger:b7,rightx:a3,righty:a2,start:b9,x:b2,y:b3,platform:Linux, -03000000ff1100004133000010010000,GreenAsia Inc.USB Joystick,a:b2,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b10,lefttrigger:b4,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b11,righttrigger:b5,rightx:a3,righty:a2,start:b9,x:b3,y:b0,platform:Linux, -0500000047532067616d657061640000,GS gamepad,a:b0,b:b1,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b2,y:b3,platform:Linux, -06000000adde0000efbe000002010000,Hidromancer Game Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux, -03000000d81400000862000011010000,HitBox (PS3/PC) Analog Mode,a:b1,b:b2,back:b8,guide:b9,leftshoulder:b4,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,righttrigger:b7,start:b12,x:b0,y:b3,platform:Linux, -03000000c9110000f055000011010000,HJC Game GAMEPAD,a:b0,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b2,y:b3,platform:Linux, -030000000d0f00000d00000000010000,hori,a:b0,b:b6,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b10,leftshoulder:b3,leftx:b4,lefty:b5,rightshoulder:b7,start:b9,x:b1,y:b2,platform:Linux, -030000000d0f00001000000011010000,HORI CO. LTD. FIGHTING STICK 3,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,lefttrigger:b6,rightshoulder:b5,righttrigger:b7,start:b9,x:b0,y:b3,platform:Linux, -030000000d0f00002200000011010000,HORI CO. LTD. REAL ARCADE Pro.V3,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,lefttrigger:b6,rightshoulder:b5,righttrigger:b7,start:b9,x:b0,y:b3,platform:Linux, -03000000ad1b000001f5000033050000,Hori Pad EX Turbo 2,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux, -030000000d0f00006700000001010000,HORIPAD ONE,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux, -03000000830500006020000010010000,iBuffalo USB 2-axis 8-button Gamepad,a:b1,b:b0,back:b6,leftshoulder:b4,leftx:a0,lefty:a1,rightshoulder:b5,start:b7,x:b3,y:b2,platform:Linux, -050000006964726f69643a636f6e0000,idroid:con,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Linux, -03000000fd0500000030000000010000,InterAct GoPad I-73000 (Fighting Game Layout),a:b3,b:b4,back:b6,leftx:a0,lefty:a1,rightshoulder:b2,righttrigger:b5,start:b7,x:b0,y:b1,platform:Linux, -030000006e0500000320000010010000,JC-U3613M - DirectInput Mode,a:b2,b:b3,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b8,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b9,righttrigger:b7,rightx:a2,righty:a3,start:b11,x:b0,y:b1,platform:Linux, -03000000300f00001001000010010000,Jess Tech Dual Analog Rumble Pad,a:b2,b:b3,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b5,leftx:a0,lefty:a1,rightshoulder:b6,rightstick:b11,righttrigger:b7,rightx:a3,righty:a2,start:b9,x:b0,y:b1,platform:Linux, -03000000ba2200002010000001010000,Jess Technology USB Game Controller,a:b2,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,righttrigger:b7,rightx:a3,righty:a2,start:b9,x:b3,y:b0,platform:Linux, -030000006f0e00000103000000020000,Logic3 Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux, -030000006d04000019c2000010010000,Logitech Cordless RumblePad 2,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Linux, -030000006d04000016c2000011010000,Logitech F310 Gamepad (DInput),a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Linux, -030000006d0400001dc2000014400000,Logitech F310 Gamepad (XInput),a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux, -030000006d0400001ec2000020200000,Logitech F510 Gamepad (XInput),a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux, -030000006d04000019c2000011010000,Logitech F710 Gamepad (DInput),a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Linux, -030000006d0400001fc2000005030000,Logitech F710 Gamepad (XInput),a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux, -030000006d04000016c2000010010000,Logitech Logitech Dual Action,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Linux, -030000006d04000018c2000010010000,Logitech RumblePad 2,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Linux, -030000006d04000011c2000010010000,Logitech WingMan Cordless RumblePad,a:b0,b:b1,back:b2,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b5,leftshoulder:b6,lefttrigger:b9,leftx:a0,lefty:a1,rightshoulder:b7,righttrigger:b10,rightx:a3,righty:a4,start:b8,x:b3,y:b4,platform:Linux, -05000000380700006652000025010000,Mad Catz C.T.R.L.R ,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Linux, -03000000ad1b00002ef0000090040000,Mad Catz Fightpad SFxT,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,lefttrigger:a2,rightshoulder:b5,righttrigger:a5,start:b7,x:b2,y:b3,platform:Linux, -03000000380700008034000011010000,Mad Catz fightstick (PS3),a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Linux, -03000000380700008084000011010000,Mad Catz fightstick (PS4),a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Linux, -03000000380700008433000011010000,Mad Catz FightStick TE S+ PS3,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Linux, -03000000380700008483000011010000,Mad Catz FightStick TE S+ PS4,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Linux, -03000000380700001647000010040000,Mad Catz Wired Xbox 360 Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux, -03000000380700003847000090040000,Mad Catz Wired Xbox 360 Controller (SFIV),a:b0,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b10,leftshoulder:b4,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b2,y:b3,platform:Linux, -03000000ad1b000016f0000090040000,Mad Catz Xbox 360 Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux, -03000000380700001888000010010000,MadCatz PC USB Wired Stick 8818,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Linux, -03000000380700003888000010010000,MadCatz PC USB Wired Stick 8838,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:a0,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Linux, -03000000780000000600000010010000,Microntek USB Joystick,a:b2,b:b1,back:b8,leftshoulder:b6,lefttrigger:b4,leftx:a0,lefty:a1,rightshoulder:b7,righttrigger:b5,start:b9,x:b3,y:b0,platform:Linux, -030000005e0400008e02000004010000,Microsoft X-Box 360 pad,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux, -030000005e0400008e02000062230000,Microsoft X-Box 360 pad,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux, -030000005e040000dd02000003020000,Microsoft X-Box One pad v2,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux, -030000005e0400008502000000010000,Microsoft X-Box pad (Japan),a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b5,leftstick:b8,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b2,rightstick:b9,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b3,y:b4,platform:Linux, -030000005e0400008902000021010000,Microsoft X-Box pad v2 (US),a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b5,leftstick:b8,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b2,rightstick:b9,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b3,y:b4,platform:Linux, -05000000d6200000ad0d000001000000,Moga Pro,a:b0,b:b1,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b7,lefttrigger:a5,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b8,righttrigger:a4,rightx:a2,righty:a3,start:b6,x:b2,y:b3,platform:Linux, -030000001008000001e5000010010000,NEXT Classic USB Game Controller,a:b2,b:b1,back:b8,leftshoulder:b4,leftx:a0,lefty:a1,rightshoulder:b6,righttrigger:b5,rightx:a2,righty:a3,start:b9,x:b3,y:b0,platform:Linux, -050000007e0500003003000001000000,Nintendo Wii Remote Pro Controller,a:b1,b:b0,back:b8,dpdown:b14,dpleft:b15,dpright:b16,dpup:b13,guide:b10,leftshoulder:b4,leftstick:b11,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b12,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b2,y:b3,platform:Linux, -05000000010000000100000003000000,Nintendo Wiimote,a:b0,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b10,leftshoulder:b4,leftstick:b11,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b12,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b2,y:b3,platform:Linux, -03000000550900001072000011010000,NVIDIA Controller,a:b0,b:b1,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b8,lefttrigger:a5,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b9,righttrigger:a4,rightx:a2,righty:a3,start:b7,x:b2,y:b3,platform:Linux, -03000000451300000830000010010000,NYKO CORE,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Linux, -030000005e0400000202000000010000,Old Xbox pad,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b5,leftstick:b8,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b2,rightstick:b9,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b3,y:b4,platform:Linux, -05000000362800000100000002010000,OUYA Game Controller,a:b0,b:b3,dpdown:b9,dpleft:b10,dpright:b11,dpup:b8,guide:b14,leftshoulder:b4,leftstick:b6,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b7,righttrigger:a5,rightx:a3,righty:a4,x:b1,y:b2,platform:Linux, -05000000362800000100000003010000,OUYA Game Controller,a:b0,b:b3,dpdown:b9,dpleft:b10,dpright:b11,dpup:b8,guide:b14,leftshoulder:b4,leftstick:b6,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b7,righttrigger:a5,rightx:a3,righty:a4,x:b1,y:b2,platform:Linux, -03000000ff1100003133000010010000,PC Game Controller,a:b2,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b3,y:b0,platform:Linux, -03000000341a00003608000011010000,PS3 Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Linux, -030000004c0500006802000011010000,PS3 Controller,a:b14,b:b13,back:b0,dpdown:b6,dpleft:b7,dpright:b5,dpup:b4,guide:b16,leftshoulder:b10,leftstick:b1,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b11,rightstick:b2,righttrigger:b9,rightx:a2,righty:a3,start:b3,x:b15,y:b12,platform:Linux, -050000004c0500006802000000010000,PS3 Controller (Bluetooth),a:b14,b:b13,back:b0,dpdown:b6,dpleft:b7,dpright:b5,dpup:b4,guide:b16,leftshoulder:b10,leftstick:b1,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b11,rightstick:b2,righttrigger:b9,rightx:a2,righty:a3,start:b3,x:b15,y:b12,platform:Linux, -05000000504c415953544154494f4e00,PS3 Controller (Bluetooth),a:b14,b:b13,back:b0,dpdown:b6,dpleft:b7,dpright:b5,dpup:b4,guide:b16,leftshoulder:b10,leftstick:b1,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b11,rightstick:b2,righttrigger:b9,rightx:a2,righty:a3,start:b3,x:b15,y:b12,platform:Linux, -060000004c0500006802000000010000,PS3 Controller (Bluetooth),a:b14,b:b13,back:b0,dpdown:b6,dpleft:b7,dpright:b5,dpup:b4,guide:b16,leftshoulder:b10,leftstick:b1,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b11,rightstick:b2,righttrigger:b9,rightx:a2,righty:a3,start:b3,x:b15,y:b12,platform:Linux, -030000004c050000c405000011010000,PS4 Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Linux, -030000004c050000cc09000011010000,PS4 Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Linux, -050000004c050000c405000000010000,PS4 Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Linux, -050000004c050000cc09000000010000,PS4 Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Linux, -030000009b2800000300000001010000,raphnet.net 4nes4snes v1.5,a:b0,b:b4,back:b2,leftshoulder:b6,leftx:a0,lefty:a1,rightshoulder:b7,start:b3,x:b1,y:b5,platform:Linux, -030000008916000001fd000024010000,Razer Onza Classic Edition,a:b0,b:b1,back:b6,dpdown:b14,dpleft:b11,dpright:b12,dpup:b13,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux, -030000008916000000fd000024010000,Razer Onza Tournament,a:b0,b:b1,back:b6,dpdown:b14,dpleft:b11,dpright:b12,dpup:b13,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux, -03000000c6240000045d000025010000,Razer Sabertooth,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux, -03000000321500000009000011010000,Razer Serval,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a5,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a4,rightx:a2,righty:a3,start:b7,x:b2,y:b3,platform:Linux, -050000003215000000090000163a0000,Razer Serval,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a5,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a4,rightx:a2,righty:a3,start:b7,x:b2,y:b3,platform:Linux, -03000000790000001100000010010000,RetroLink Saturn Classic Controller,a:b0,b:b1,back:b5,guide:b2,leftshoulder:b6,leftx:a0,lefty:a1,rightshoulder:b7,start:b8,x:b3,y:b4,platform:Linux, -0300000000f000000300000000010000,RetroUSB.com RetroPad,a:b1,b:b5,back:b2,leftshoulder:b6,leftx:a0,lefty:a1,rightshoulder:b7,start:b3,x:b0,y:b4,platform:Linux, -0300000000f00000f100000000010000,RetroUSB.com Super RetroPort,a:b1,b:b5,back:b2,leftshoulder:b6,leftx:a0,lefty:a1,rightshoulder:b7,start:b3,x:b0,y:b4,platform:Linux, -030000006f0e00001e01000011010000,Rock Candy Gamepad for PS3,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Linux, -030000006f0e00004601000001010000,Rock Candy Wired Controller for Xbox One,a:b0,b:b1,back:b6,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux, -03000000a306000023f6000011010000,Saitek Cyborg V.1 Game Pad,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a4,start:b9,x:b0,y:b3,platform:Linux, -03000000a30600000c04000011010000,Saitek P2900 Wireless Pad,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b9,leftshoulder:b6,leftstick:b10,lefttrigger:b4,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b11,righttrigger:b5,rightx:a3,righty:a2,start:b12,x:b0,y:b3,platform:Linux, -03000000a30600000901000000010000,Saitek P880,a:b2,b:b3,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b8,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b9,righttrigger:b7,rightx:a3,righty:a2,x:b0,y:b1,platform:Linux, -03000000a306000018f5000010010000,Saitek PLC Saitek P3200 Rumble Pad,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a3,righty:a4,start:b9,x:b0,y:b3,platform:Linux, -03000000c01600008704000011010000,Serial/Keyboard/Mouse/Joystick,a:b12,b:b10,back:b4,dpdown:b2,dpleft:b3,dpright:b1,dpup:b0,leftshoulder:b9,leftstick:b14,lefttrigger:b6,leftx:a1,lefty:a0,rightshoulder:b8,rightstick:b15,righttrigger:b7,rightx:a2,righty:a3,start:b5,x:b13,y:b11,platform:Linux, -030000004c050000c405000011810000,Sony DualShock 4,a:b0,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b10,leftshoulder:b4,leftstick:b11,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b12,righttrigger:a5,rightx:a3,righty:a4,start:b9,x:b3,y:b2,platform:Linux, -050000004c050000cc09000000810000,Sony DualShock 4 (CUH-ZCT2U) (Bluetooth),a:b0,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b10,leftshoulder:b4,leftstick:b11,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b12,righttrigger:a5,rightx:a3,righty:a4,start:b9,x:b3,y:b2,platform:Linux, -030000004c050000cc09000011810000,Sony DualShock 4 (CUH-ZCT2U) (USB),a:b0,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b10,leftshoulder:b4,leftstick:b11,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b12,righttrigger:a5,rightx:a3,righty:a4,start:b9,x:b3,y:b2,platform:Linux, -030000004c050000a00b000011010000,Sony DualShock 4 Wireless Adaptor,a:b1,b:b2,back:b13,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Linux, -030000004c0500006802000011810000,Sony PLAYSTATION(R)3 Controller,a:b0,b:b1,back:b8,dpdown:b14,dpleft:b15,dpright:b16,dpup:b13,guide:b10,leftshoulder:b4,leftstick:b11,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b12,righttrigger:a5,rightx:a3,righty:a4,start:b9,x:b3,y:b2,platform:Linux, -050000004c0500006802000000810000,Sony PLAYSTATION(R)3 Controller,a:b0,b:b1,back:b8,dpdown:b14,dpleft:b15,dpright:b16,dpup:b13,guide:b10,leftshoulder:b4,leftstick:b11,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b12,righttrigger:a5,rightx:a3,righty:a4,start:b9,x:b3,y:b2,platform:Linux, -03000000250900000500000000010000,Sony PS2 pad with SmartJoy adapter,a:b2,b:b1,back:b9,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b10,lefttrigger:b4,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b11,righttrigger:b5,rightx:a2,righty:a3,start:b8,x:b3,y:b0,platform:Linux, -030000005e0400008e02000073050000,Speedlink TORID Wireless Gamepad,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux, -030000005e0400008e02000020200000,SpeedLink XEOX Pro Analog Gamepad pad,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux, -03000000de280000fc11000001000000,Steam Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux, -03000000666600000488000000010000,Super Joy Box 5 Pro,a:b2,b:b1,back:b9,dpdown:b14,dpleft:b15,dpright:b13,dpup:b12,leftshoulder:b6,leftstick:b10,lefttrigger:b4,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b11,righttrigger:b5,rightx:a2,righty:a3,start:b8,x:b3,y:b0,platform:Linux, -030000004f04000020b3000010010000,Thrustmaster 2 in 1 DT,a:b0,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b5,leftx:a0,lefty:a1,rightshoulder:b6,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b1,y:b3,platform:Linux, -030000004f04000015b3000010010000,Thrustmaster Dual Analog 4,a:b0,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b5,leftx:a0,lefty:a1,rightshoulder:b6,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b1,y:b3,platform:Linux, -030000004f04000023b3000000010000,Thrustmaster Dual Trigger 3-in-1,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Linux, -030000004f04000000b3000010010000,Thrustmaster Firestorm Dual Power,a:b0,b:b2,back:b9,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b11,lefttrigger:b5,leftx:a0,lefty:a1,rightshoulder:b6,rightstick:b12,righttrigger:b7,rightx:a2,righty:a3,start:b10,x:b1,y:b3,platform:Linux, -030000004f04000008d0000000010000,Thrustmaster Run N Drive Wireless,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Linux, -030000004f04000009d0000000010000,Thrustmaster Run N Drive Wireless PS3,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Linux, -03000000bd12000015d0000010010000,Tomee SNES USB Controller,a:b2,b:b1,back:b8,leftshoulder:b4,leftx:a0,lefty:a1,rightshoulder:b5,start:b9,x:b3,y:b0,platform:Linux, -03000000d814000007cd000011010000,Toodles 2008 Chimp PC/PS3,a:b0,b:b1,back:b8,leftshoulder:b4,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,righttrigger:b7,start:b9,x:b3,y:b2,platform:Linux, -03000000100800000100000010010000,Twin USB PS2 Adapter,a:b2,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b10,lefttrigger:b4,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b11,righttrigger:b5,rightx:a3,righty:a2,start:b9,x:b3,y:b0,platform:Linux, -03000000100800000300000010010000,USB Gamepad,a:b2,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b10,lefttrigger:b4,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b11,righttrigger:b5,rightx:a3,righty:a2,start:b9,x:b3,y:b0,platform:Linux, -03000000790000001100000000010000,USB Gamepad1,a:b2,b:b1,back:b8,dpdown:a0,dpleft:a1,dpright:a2,dpup:a4,start:b9,platform:Linux, -03000000de280000ff11000001000000,Valve Streaming Gamepad,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux, -05000000ac0500003232000001000000,VR-BOX,a:b0,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b10,lefttrigger:b4,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b11,righttrigger:b5,rightx:a3,righty:a2,start:b9,x:b2,y:b3,platform:Linux, -030000005e0400008e02000010010000,X360 Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux, -030000005e0400008e02000014010000,X360 Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux, -030000005e0400001907000000010000,X360 Wireless Controller,a:b0,b:b1,back:b6,dpdown:b14,dpleft:b11,dpright:b12,dpup:b13,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux, -030000005e0400009102000007010000,X360 Wireless Controller,a:b0,b:b1,back:b6,dpdown:b14,dpleft:b11,dpright:b12,dpup:b13,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux, -030000005e040000a102000000010000,X360 Wireless Controller,a:b0,b:b1,back:b6,dpdown:b14,dpleft:b11,dpright:b12,dpup:b13,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux, -030000005e040000a102000007010000,X360 Wireless Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux, -0000000058626f782033363020576900,Xbox 360 Wireless Controller,a:b0,b:b1,back:b14,dpdown:b11,dpleft:b12,dpright:b13,dpup:b10,guide:b7,leftshoulder:b4,leftstick:b8,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b9,righttrigger:a5,rightx:a3,righty:a4,start:b6,x:b2,y:b3,platform:Linux, -0000000058626f782047616d65706100,Xbox Gamepad (userspace driver),a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a5,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a4,rightx:a2,righty:a3,start:b7,x:b2,y:b3,platform:Linux, -030000005e040000d102000001010000,Xbox One Wireless Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux, -050000005e040000e002000003090000,Xbox One Wireless Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b10,leftshoulder:b4,leftstick:b8,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b9,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux, -03000000c0160000e105000001010000,Xin-Mo Xin-Mo Dual Arcade,a:b4,b:b3,back:b6,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,guide:b9,leftshoulder:b2,leftx:a0,lefty:a1,rightshoulder:b5,start:b7,x:b1,y:b0,platform:Linux, -xinput,XInput Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux, - -# Android -4e564944494120436f72706f72617469,NVIDIA Controller,a:b0,b:b1,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b9,leftstick:b7,lefttrigger:a4,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:a5,rightx:a2,righty:a3,start:b6,x:b2,y:b3,platform:Android, - -# iOS -4d466947616d65706164010000000000,MFi Extended Gamepad,a:b0,b:b1,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,righttrigger:a5,rightx:a3,righty:a4,start:b6,x:b2,y:b3,platform:iOS, -4d466947616d65706164020000000000,MFi Gamepad,a:b0,b:b1,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,rightshoulder:b5,start:b6,x:b2,y:b3,platform:iOS, diff --git a/core/input/godotcontrollerdb.txt b/core/input/godotcontrollerdb.txt index 472b01947b..f6411e2429 100644 --- a/core/input/godotcontrollerdb.txt +++ b/core/input/godotcontrollerdb.txt @@ -1,29 +1,6 @@ -# Game Controller DB for SDL in 2.0.6+ format +# Game Controller DB for Godot in SDL 2.0.10 format # Source: https://github.com/godotengine/godot -# Windows -9000318000000000000504944564944,Mayflash Wiimote PC Adapter,a:b2,b:h0.4,x:b0,y:b1,back:b4,start:b5,guide:b11,leftshoulder:b6,rightshoulder:b3,leftx:a0,lefty:a1,platform:Windows, -c911f055000000000000504944564944,GAMEPAD,a:b0,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b2,y:b3,platform:Windows, -__XINPUT_DEVICE__,XInput Gamepad,a:b12,b:b13,x:b14,y:b15,start:b4,back:b5,leftstick:b6,rightstick:b7,leftshoulder:b8,rightshoulder:b9,dpup:b0,dpdown:b1,dpleft:b2,dpright:b3,leftx:a0,lefty:a1,rightx:a2,righty:a3,lefttrigger:a4,righttrigger:a5,platform:Windows, - -# Linux -030000006f0e00001302000000010000,Afterglow Gamepad for Xbox 360,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux, -05000000362800000100000004010000,OUYA Game Controller,leftx:a0,lefty:a1,dpdown:b9,rightstick:b7,rightshoulder:b5,rightx:a3,start:b16,righty:a4,dpleft:b10,lefttrigger:b12,x:b1,dpup:b8,back:b14,leftstick:b6,leftshoulder:b4,y:b2,a:b0,dpright:b11,righttrigger:b13,b:b3,platform:Linux, -030000005e0400008e02000001000000,Microsoft X-Box 360 pad,leftstick:b9,leftx:a0,lefty:a1,dpdown:h0.1,rightstick:b10,rightshoulder:b5,rightx:a3,start:b7,righty:a4,dpleft:h0.2,lefttrigger:a2,x:b2,dpup:h0.4,back:b6,leftshoulder:b4,y:b3,a:b0,dpright:h0.8,righttrigger:a5,b:b1,platform:Linux, -03000000fd0500002a26000000010000,3dfx InterAct HammerHead FX,leftx:a0,lefty:a1,dpdown:h0.4,rightstick:b5,rightshoulder:b7,rightx:a2,start:b11,righty:a3,dpleft:h0.8,lefttrigger:b8,x:b0,dpup:h0.1,back:b10,leftstick:b2,leftshoulder:b6,y:b1,a:b3,dpright:h0.2,righttrigger:b9,b:b4,platform:Linux, -030000006f0e00002801000011010000,PDP Rock Candy Wireless Controller for PS3,leftx:a0,lefty:a1,dpdown:h0.4,rightstick:b11,rightshoulder:b5,rightx:a2,start:b9,righty:a3,dpleft:h0.8,lefttrigger:b6,x:b0,dpup:h0.1,back:b8,leftstick:b10,leftshoulder:b4,y:b3,a:b1,dpright:h0.2,righttrigger:b7,b:b2,platform:Linux, -030000000d0f00004d00000011010000,HORI Gem Pad 3,x:b0,a:b1,b:b2,y:b3,back:b8,guide:b12,start:b9,dpleft:h0.8,dpdown:h0.4,dpright:h0.2,dpup:h0.1,leftshoulder:b4,lefttrigger:b6,rightshoulder:b5,righttrigger:b7,leftstick:b10,rightstick:b11,leftx:a0,lefty:a1,rightx:a2,righty:a3,platform:Linux, -030000005e040000ea02000001030000,Xbox One Wireless Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux, - -# Android -4f5559412047616d6520436f6e74726f,OUYA Game Controller,leftx:a1,lefty:a3,dpdown:b12,rightstick:b8,rightshoulder:b10,rightx:a6,start:b-86,righty:a7,dpleft:b13,lefttrigger:b15,x:b2,dpup:b11,leftstick:b7,leftshoulder:b9,y:b3,a:b0,dpright:b14,righttrigger:b16,b:b1,platform:Android, -Default Android Gamepad,Default Controller,leftx:a0,lefty:a1,dpdown:h0.4,rightstick:b8,rightshoulder:b10,rightx:a2,start:b6,righty:a3,dpleft:h0.8,lefttrigger:a4,x:b2,dpup:h0.1,back:b4,leftstick:b7,leftshoulder:b9,y:b3,a:b0,dpright:h0.2,righttrigger:a5,b:b1,platform:Android, -532e542e442e20496e74657261637420,3dfx InterAct HammerHead FX,leftx:a0,lefty:a1,dpdown:h0.4,rightstick:b25,rightshoulder:b27,rightx:a2,start:b31,righty:a3,dpleft:h0.8,lefttrigger:b28,x:b20,dpup:h0.1,back:b30,leftstick:b22,leftshoulder:b26,y:b21,a:b23,dpright:h0.2,righttrigger:b29,b:b24,platform:Android, -506572666f726d616e63652044657369,PDP Rock Candy Wireless Controller for PS3,leftx:a0,lefty:a1,dpdown:h0.4,rightstick:b6,rightshoulder:b18,rightx:a2,start:b16,righty:a3,dpleft:h0.8,lefttrigger:b9,x:b0,dpup:h0.1,back:h0.2,leftstick:b4,leftshoulder:b3,y:b2,a:b1,dpright:h0.2,righttrigger:b10,b:b17,platform:Android, -4d6963726f736f667420582d426f7820,Microsoft X-Box 360 pad,leftx:a0,lefty:a1,dpdown:h0.4,rightstick:b8,rightshoulder:b10,rightx:a2,start:b6,righty:a3,dpleft:h0.8,lefttrigger:a4,x:b2,dpup:h0.1,leftstick:b7,leftshoulder:b9,y:b3,a:b0,dpright:h0.2,righttrigger:a5,b:b1,platform:Android, -484f524920434f2e2c4c544420205041,Hori Gem Pad 3,leftx:a0,lefty:a1,dpdown:h0.4,rightstick:b6,rightshoulder:b18,rightx:a2,start:b16,righty:a3,dpleft:h0.8,lefttrigger:b9,x:b0,dpup:h0.1,back:b15,leftstick:b4,leftshoulder:b3,y:b2,a:b1,dpright:h0.2,righttrigger:b10,b:b17,platform:Android, -47656e6572696320582d426f78207061,Logitech F-310,leftx:a0,lefty:a1,dpdown:h0.4,rightstick:b8,rightshoulder:b10,rightx:a2,start:b6,righty:a3,dpleft:h0.8,lefttrigger:a5,x:b2,dpup:h0.1,leftstick:b7,leftshoulder:b9,y:b3,a:b0,dpright:h0.2,righttrigger:a4,b:b1,platform:Android, - # Javascript Default HTML5 Gamepad, Default Mapping,leftx:a0,lefty:a1,dpdown:b13,rightstick:b11,rightshoulder:b5,rightx:a2,start:b9,righty:a3,dpleft:b14,lefttrigger:a6,x:b2,dpup:b12,back:b8,leftstick:b10,leftshoulder:b4,y:b3,a:b0,dpright:b15,righttrigger:a7,b:b1,platform:Javascript, c2a94d6963726f736f66742058626f78,Wireless X360 Controller,leftx:a0,lefty:a1,dpdown:b14,rightstick:b10,rightshoulder:b5,rightx:a3,start:b7,righty:a4,dpleft:b11,lefttrigger:a2,x:b2,dpup:b13,back:b6,leftstick:b9,leftshoulder:b4,y:b3,a:b0,dpright:b12,righttrigger:a5,b:b1,platform:Javascript, diff --git a/core/input/input_filter.cpp b/core/input/input.cpp index 2e8442a905..357e4c06c1 100644 --- a/core/input/input_filter.cpp +++ b/core/input/input.cpp @@ -1,5 +1,5 @@ /*************************************************************************/ -/* input_filter.cpp */ +/* input.cpp */ /*************************************************************************/ /* This file is part of: */ /* GODOT ENGINE */ @@ -28,7 +28,7 @@ /* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ /*************************************************************************/ -#include "input_filter.h" +#include "input.h" #include "core/input/default_controller_mappings.h" #include "core/input/input_map.h" @@ -39,71 +39,71 @@ #include "editor/editor_settings.h" #endif -InputFilter *InputFilter::singleton = nullptr; +Input *Input::singleton = nullptr; -void (*InputFilter::set_mouse_mode_func)(InputFilter::MouseMode) = nullptr; -InputFilter::MouseMode (*InputFilter::get_mouse_mode_func)() = nullptr; -void (*InputFilter::warp_mouse_func)(const Vector2 &p_to_pos) = nullptr; -InputFilter::CursorShape (*InputFilter::get_current_cursor_shape_func)() = nullptr; -void (*InputFilter::set_custom_mouse_cursor_func)(const RES &, InputFilter::CursorShape, const Vector2 &) = nullptr; +void (*Input::set_mouse_mode_func)(Input::MouseMode) = nullptr; +Input::MouseMode (*Input::get_mouse_mode_func)() = nullptr; +void (*Input::warp_mouse_func)(const Vector2 &p_to_pos) = nullptr; +Input::CursorShape (*Input::get_current_cursor_shape_func)() = nullptr; +void (*Input::set_custom_mouse_cursor_func)(const RES &, Input::CursorShape, const Vector2 &) = nullptr; -InputFilter *InputFilter::get_singleton() { +Input *Input::get_singleton() { return singleton; } -void InputFilter::set_mouse_mode(MouseMode p_mode) { +void Input::set_mouse_mode(MouseMode p_mode) { ERR_FAIL_INDEX((int)p_mode, 4); set_mouse_mode_func(p_mode); } -InputFilter::MouseMode InputFilter::get_mouse_mode() const { +Input::MouseMode Input::get_mouse_mode() const { return get_mouse_mode_func(); } -void InputFilter::_bind_methods() { - - ClassDB::bind_method(D_METHOD("is_key_pressed", "keycode"), &InputFilter::is_key_pressed); - ClassDB::bind_method(D_METHOD("is_mouse_button_pressed", "button"), &InputFilter::is_mouse_button_pressed); - ClassDB::bind_method(D_METHOD("is_joy_button_pressed", "device", "button"), &InputFilter::is_joy_button_pressed); - ClassDB::bind_method(D_METHOD("is_action_pressed", "action"), &InputFilter::is_action_pressed); - ClassDB::bind_method(D_METHOD("is_action_just_pressed", "action"), &InputFilter::is_action_just_pressed); - ClassDB::bind_method(D_METHOD("is_action_just_released", "action"), &InputFilter::is_action_just_released); - ClassDB::bind_method(D_METHOD("get_action_strength", "action"), &InputFilter::get_action_strength); - ClassDB::bind_method(D_METHOD("add_joy_mapping", "mapping", "update_existing"), &InputFilter::add_joy_mapping, DEFVAL(false)); - ClassDB::bind_method(D_METHOD("remove_joy_mapping", "guid"), &InputFilter::remove_joy_mapping); - ClassDB::bind_method(D_METHOD("joy_connection_changed", "device", "connected", "name", "guid"), &InputFilter::joy_connection_changed); - ClassDB::bind_method(D_METHOD("is_joy_known", "device"), &InputFilter::is_joy_known); - ClassDB::bind_method(D_METHOD("get_joy_axis", "device", "axis"), &InputFilter::get_joy_axis); - ClassDB::bind_method(D_METHOD("get_joy_name", "device"), &InputFilter::get_joy_name); - ClassDB::bind_method(D_METHOD("get_joy_guid", "device"), &InputFilter::get_joy_guid); - ClassDB::bind_method(D_METHOD("get_connected_joypads"), &InputFilter::get_connected_joypads); - ClassDB::bind_method(D_METHOD("get_joy_vibration_strength", "device"), &InputFilter::get_joy_vibration_strength); - ClassDB::bind_method(D_METHOD("get_joy_vibration_duration", "device"), &InputFilter::get_joy_vibration_duration); - ClassDB::bind_method(D_METHOD("get_joy_button_string", "button_index"), &InputFilter::get_joy_button_string); - ClassDB::bind_method(D_METHOD("get_joy_button_index_from_string", "button"), &InputFilter::get_joy_button_index_from_string); - ClassDB::bind_method(D_METHOD("get_joy_axis_string", "axis_index"), &InputFilter::get_joy_axis_string); - ClassDB::bind_method(D_METHOD("get_joy_axis_index_from_string", "axis"), &InputFilter::get_joy_axis_index_from_string); - ClassDB::bind_method(D_METHOD("start_joy_vibration", "device", "weak_magnitude", "strong_magnitude", "duration"), &InputFilter::start_joy_vibration, DEFVAL(0)); - ClassDB::bind_method(D_METHOD("stop_joy_vibration", "device"), &InputFilter::stop_joy_vibration); - ClassDB::bind_method(D_METHOD("vibrate_handheld", "duration_ms"), &InputFilter::vibrate_handheld, DEFVAL(500)); - ClassDB::bind_method(D_METHOD("get_gravity"), &InputFilter::get_gravity); - ClassDB::bind_method(D_METHOD("get_accelerometer"), &InputFilter::get_accelerometer); - ClassDB::bind_method(D_METHOD("get_magnetometer"), &InputFilter::get_magnetometer); - ClassDB::bind_method(D_METHOD("get_gyroscope"), &InputFilter::get_gyroscope); - ClassDB::bind_method(D_METHOD("get_last_mouse_speed"), &InputFilter::get_last_mouse_speed); - ClassDB::bind_method(D_METHOD("get_mouse_button_mask"), &InputFilter::get_mouse_button_mask); - ClassDB::bind_method(D_METHOD("set_mouse_mode", "mode"), &InputFilter::set_mouse_mode); - ClassDB::bind_method(D_METHOD("get_mouse_mode"), &InputFilter::get_mouse_mode); - ClassDB::bind_method(D_METHOD("warp_mouse_position", "to"), &InputFilter::warp_mouse_position); - ClassDB::bind_method(D_METHOD("action_press", "action", "strength"), &InputFilter::action_press, DEFVAL(1.f)); - ClassDB::bind_method(D_METHOD("action_release", "action"), &InputFilter::action_release); - ClassDB::bind_method(D_METHOD("set_default_cursor_shape", "shape"), &InputFilter::set_default_cursor_shape, DEFVAL(CURSOR_ARROW)); - ClassDB::bind_method(D_METHOD("get_current_cursor_shape"), &InputFilter::get_current_cursor_shape); - ClassDB::bind_method(D_METHOD("set_custom_mouse_cursor", "image", "shape", "hotspot"), &InputFilter::set_custom_mouse_cursor, DEFVAL(CURSOR_ARROW), DEFVAL(Vector2())); - ClassDB::bind_method(D_METHOD("parse_input_event", "event"), &InputFilter::parse_input_event); - ClassDB::bind_method(D_METHOD("set_use_accumulated_input", "enable"), &InputFilter::set_use_accumulated_input); +void Input::_bind_methods() { + + ClassDB::bind_method(D_METHOD("is_key_pressed", "keycode"), &Input::is_key_pressed); + ClassDB::bind_method(D_METHOD("is_mouse_button_pressed", "button"), &Input::is_mouse_button_pressed); + ClassDB::bind_method(D_METHOD("is_joy_button_pressed", "device", "button"), &Input::is_joy_button_pressed); + ClassDB::bind_method(D_METHOD("is_action_pressed", "action"), &Input::is_action_pressed); + ClassDB::bind_method(D_METHOD("is_action_just_pressed", "action"), &Input::is_action_just_pressed); + ClassDB::bind_method(D_METHOD("is_action_just_released", "action"), &Input::is_action_just_released); + ClassDB::bind_method(D_METHOD("get_action_strength", "action"), &Input::get_action_strength); + ClassDB::bind_method(D_METHOD("add_joy_mapping", "mapping", "update_existing"), &Input::add_joy_mapping, DEFVAL(false)); + ClassDB::bind_method(D_METHOD("remove_joy_mapping", "guid"), &Input::remove_joy_mapping); + ClassDB::bind_method(D_METHOD("joy_connection_changed", "device", "connected", "name", "guid"), &Input::joy_connection_changed); + ClassDB::bind_method(D_METHOD("is_joy_known", "device"), &Input::is_joy_known); + ClassDB::bind_method(D_METHOD("get_joy_axis", "device", "axis"), &Input::get_joy_axis); + ClassDB::bind_method(D_METHOD("get_joy_name", "device"), &Input::get_joy_name); + ClassDB::bind_method(D_METHOD("get_joy_guid", "device"), &Input::get_joy_guid); + ClassDB::bind_method(D_METHOD("get_connected_joypads"), &Input::get_connected_joypads); + ClassDB::bind_method(D_METHOD("get_joy_vibration_strength", "device"), &Input::get_joy_vibration_strength); + ClassDB::bind_method(D_METHOD("get_joy_vibration_duration", "device"), &Input::get_joy_vibration_duration); + ClassDB::bind_method(D_METHOD("get_joy_button_string", "button_index"), &Input::get_joy_button_string); + ClassDB::bind_method(D_METHOD("get_joy_button_index_from_string", "button"), &Input::get_joy_button_index_from_string); + ClassDB::bind_method(D_METHOD("get_joy_axis_string", "axis_index"), &Input::get_joy_axis_string); + ClassDB::bind_method(D_METHOD("get_joy_axis_index_from_string", "axis"), &Input::get_joy_axis_index_from_string); + ClassDB::bind_method(D_METHOD("start_joy_vibration", "device", "weak_magnitude", "strong_magnitude", "duration"), &Input::start_joy_vibration, DEFVAL(0)); + ClassDB::bind_method(D_METHOD("stop_joy_vibration", "device"), &Input::stop_joy_vibration); + ClassDB::bind_method(D_METHOD("vibrate_handheld", "duration_ms"), &Input::vibrate_handheld, DEFVAL(500)); + ClassDB::bind_method(D_METHOD("get_gravity"), &Input::get_gravity); + ClassDB::bind_method(D_METHOD("get_accelerometer"), &Input::get_accelerometer); + ClassDB::bind_method(D_METHOD("get_magnetometer"), &Input::get_magnetometer); + ClassDB::bind_method(D_METHOD("get_gyroscope"), &Input::get_gyroscope); + ClassDB::bind_method(D_METHOD("get_last_mouse_speed"), &Input::get_last_mouse_speed); + ClassDB::bind_method(D_METHOD("get_mouse_button_mask"), &Input::get_mouse_button_mask); + ClassDB::bind_method(D_METHOD("set_mouse_mode", "mode"), &Input::set_mouse_mode); + ClassDB::bind_method(D_METHOD("get_mouse_mode"), &Input::get_mouse_mode); + ClassDB::bind_method(D_METHOD("warp_mouse_position", "to"), &Input::warp_mouse_position); + ClassDB::bind_method(D_METHOD("action_press", "action", "strength"), &Input::action_press, DEFVAL(1.f)); + ClassDB::bind_method(D_METHOD("action_release", "action"), &Input::action_release); + ClassDB::bind_method(D_METHOD("set_default_cursor_shape", "shape"), &Input::set_default_cursor_shape, DEFVAL(CURSOR_ARROW)); + ClassDB::bind_method(D_METHOD("get_current_cursor_shape"), &Input::get_current_cursor_shape); + ClassDB::bind_method(D_METHOD("set_custom_mouse_cursor", "image", "shape", "hotspot"), &Input::set_custom_mouse_cursor, DEFVAL(CURSOR_ARROW), DEFVAL(Vector2())); + ClassDB::bind_method(D_METHOD("parse_input_event", "event"), &Input::parse_input_event); + ClassDB::bind_method(D_METHOD("set_use_accumulated_input", "enable"), &Input::set_use_accumulated_input); BIND_ENUM_CONSTANT(MOUSE_MODE_VISIBLE); BIND_ENUM_CONSTANT(MOUSE_MODE_HIDDEN); @@ -131,7 +131,7 @@ void InputFilter::_bind_methods() { ADD_SIGNAL(MethodInfo("joy_connection_changed", PropertyInfo(Variant::INT, "device"), PropertyInfo(Variant::BOOL, "connected"))); } -void InputFilter::get_argument_options(const StringName &p_function, int p_idx, List<String> *r_options) const { +void Input::get_argument_options(const StringName &p_function, int p_idx, List<String> *r_options) const { #ifdef TOOLS_ENABLED const String quote_style = EDITOR_DEF("text_editor/completion/use_single_quotes", 0) ? "'" : "\""; @@ -155,7 +155,7 @@ void InputFilter::get_argument_options(const StringName &p_function, int p_idx, #endif } -void InputFilter::SpeedTrack::update(const Vector2 &p_delta_p) { +void Input::SpeedTrack::update(const Vector2 &p_delta_p) { uint64_t tick = OS::get_singleton()->get_ticks_usec(); uint32_t tdiff = tick - last_tick; @@ -175,30 +175,30 @@ void InputFilter::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); } } -void InputFilter::SpeedTrack::reset() { +void Input::SpeedTrack::reset() { last_tick = OS::get_singleton()->get_ticks_usec(); speed = Vector2(); accum_t = 0; } -InputFilter::SpeedTrack::SpeedTrack() { +Input::SpeedTrack::SpeedTrack() { min_ref_frame = 0.1; max_ref_frame = 0.3; reset(); } -bool InputFilter::is_key_pressed(int p_keycode) const { +bool Input::is_key_pressed(int p_keycode) const { _THREAD_SAFE_METHOD_ return keys_pressed.has(p_keycode); } -bool InputFilter::is_mouse_button_pressed(int p_button) const { +bool Input::is_mouse_button_pressed(int p_button) const { _THREAD_SAFE_METHOD_ return (mouse_button_mask & (1 << (p_button - 1))) != 0; @@ -209,18 +209,18 @@ static int _combine_device(int p_value, int p_device) { return p_value | (p_device << 20); } -bool InputFilter::is_joy_button_pressed(int p_device, int p_button) const { +bool Input::is_joy_button_pressed(int p_device, int p_button) const { _THREAD_SAFE_METHOD_ return joy_buttons_pressed.has(_combine_device(p_button, p_device)); } -bool InputFilter::is_action_pressed(const StringName &p_action) const { +bool Input::is_action_pressed(const StringName &p_action) const { return action_state.has(p_action) && action_state[p_action].pressed; } -bool InputFilter::is_action_just_pressed(const StringName &p_action) const { +bool Input::is_action_just_pressed(const StringName &p_action) const { const Map<StringName, Action>::Element *E = action_state.find(p_action); if (!E) @@ -233,7 +233,7 @@ bool InputFilter::is_action_just_pressed(const StringName &p_action) const { } } -bool InputFilter::is_action_just_released(const StringName &p_action) const { +bool Input::is_action_just_released(const StringName &p_action) const { const Map<StringName, Action>::Element *E = action_state.find(p_action); if (!E) @@ -246,7 +246,7 @@ bool InputFilter::is_action_just_released(const StringName &p_action) const { } } -float InputFilter::get_action_strength(const StringName &p_action) const { +float Input::get_action_strength(const StringName &p_action) const { const Map<StringName, Action>::Element *E = action_state.find(p_action); if (!E) return 0.0f; @@ -254,7 +254,7 @@ float InputFilter::get_action_strength(const StringName &p_action) const { return E->get().strength; } -float InputFilter::get_joy_axis(int p_device, int p_axis) const { +float Input::get_joy_axis(int p_device, int p_axis) const { _THREAD_SAFE_METHOD_ int c = _combine_device(p_axis, p_device); @@ -265,13 +265,13 @@ float InputFilter::get_joy_axis(int p_device, int p_axis) const { } } -String InputFilter::get_joy_name(int p_idx) { +String Input::get_joy_name(int p_idx) { _THREAD_SAFE_METHOD_ return joy_names[p_idx].name; }; -Vector2 InputFilter::get_joy_vibration_strength(int p_device) { +Vector2 Input::get_joy_vibration_strength(int p_device) { if (joy_vibration.has(p_device)) { return Vector2(joy_vibration[p_device].weak_magnitude, joy_vibration[p_device].strong_magnitude); } else { @@ -279,7 +279,7 @@ Vector2 InputFilter::get_joy_vibration_strength(int p_device) { } } -uint64_t InputFilter::get_joy_vibration_timestamp(int p_device) { +uint64_t Input::get_joy_vibration_timestamp(int p_device) { if (joy_vibration.has(p_device)) { return joy_vibration[p_device].timestamp; } else { @@ -287,7 +287,7 @@ uint64_t InputFilter::get_joy_vibration_timestamp(int p_device) { } } -float InputFilter::get_joy_vibration_duration(int p_device) { +float Input::get_joy_vibration_duration(int p_device) { if (joy_vibration.has(p_device)) { return joy_vibration[p_device].duration; } else { @@ -307,7 +307,7 @@ static String _hex_str(uint8_t p_byte) { return ret; }; -void InputFilter::joy_connection_changed(int p_idx, bool p_connected, String p_name, String p_guid) { +void Input::joy_connection_changed(int p_idx, bool p_connected, String p_name, String p_guid) { _THREAD_SAFE_METHOD_ Joypad js; @@ -349,36 +349,36 @@ void InputFilter::joy_connection_changed(int p_idx, bool p_connected, String p_n emit_signal("joy_connection_changed", p_idx, p_connected); }; -Vector3 InputFilter::get_gravity() const { +Vector3 Input::get_gravity() const { _THREAD_SAFE_METHOD_ return gravity; } -Vector3 InputFilter::get_accelerometer() const { +Vector3 Input::get_accelerometer() const { _THREAD_SAFE_METHOD_ return accelerometer; } -Vector3 InputFilter::get_magnetometer() const { +Vector3 Input::get_magnetometer() const { _THREAD_SAFE_METHOD_ return magnetometer; } -Vector3 InputFilter::get_gyroscope() const { +Vector3 Input::get_gyroscope() const { _THREAD_SAFE_METHOD_ return gyroscope; } -void InputFilter::parse_input_event(const Ref<InputEvent> &p_event) { +void Input::parse_input_event(const Ref<InputEvent> &p_event) { _parse_input_event_impl(p_event, false); } -void InputFilter::_parse_input_event_impl(const Ref<InputEvent> &p_event, bool p_is_emulated) { +void Input::_parse_input_event_impl(const Ref<InputEvent> &p_event, bool p_is_emulated) { // Notes on mouse-touch emulation: // - Emulated mouse events are parsed, that is, re-routed to this method, so they make the same effects @@ -561,14 +561,14 @@ void InputFilter::_parse_input_event_impl(const Ref<InputEvent> &p_event, bool p event_dispatch_function(p_event); } -void InputFilter::set_joy_axis(int p_device, int p_axis, float p_value) { +void Input::set_joy_axis(int p_device, int p_axis, float p_value) { _THREAD_SAFE_METHOD_ int c = _combine_device(p_axis, p_device); _joy_axis[c] = p_value; } -void InputFilter::start_joy_vibration(int p_device, float p_weak_magnitude, float p_strong_magnitude, float p_duration) { +void Input::start_joy_vibration(int p_device, float p_weak_magnitude, float p_strong_magnitude, float p_duration) { _THREAD_SAFE_METHOD_ if (p_weak_magnitude < 0.f || p_weak_magnitude > 1.f || p_strong_magnitude < 0.f || p_strong_magnitude > 1.f) { return; @@ -581,7 +581,7 @@ void InputFilter::start_joy_vibration(int p_device, float p_weak_magnitude, floa joy_vibration[p_device] = vibration; } -void InputFilter::stop_joy_vibration(int p_device) { +void Input::stop_joy_vibration(int p_device) { _THREAD_SAFE_METHOD_ VibrationInfo vibration; vibration.weak_magnitude = 0; @@ -591,63 +591,63 @@ void InputFilter::stop_joy_vibration(int p_device) { joy_vibration[p_device] = vibration; } -void InputFilter::vibrate_handheld(int p_duration_ms) { +void Input::vibrate_handheld(int p_duration_ms) { OS::get_singleton()->vibrate_handheld(p_duration_ms); } -void InputFilter::set_gravity(const Vector3 &p_gravity) { +void Input::set_gravity(const Vector3 &p_gravity) { _THREAD_SAFE_METHOD_ gravity = p_gravity; } -void InputFilter::set_accelerometer(const Vector3 &p_accel) { +void Input::set_accelerometer(const Vector3 &p_accel) { _THREAD_SAFE_METHOD_ accelerometer = p_accel; } -void InputFilter::set_magnetometer(const Vector3 &p_magnetometer) { +void Input::set_magnetometer(const Vector3 &p_magnetometer) { _THREAD_SAFE_METHOD_ magnetometer = p_magnetometer; } -void InputFilter::set_gyroscope(const Vector3 &p_gyroscope) { +void Input::set_gyroscope(const Vector3 &p_gyroscope) { _THREAD_SAFE_METHOD_ gyroscope = p_gyroscope; } -void InputFilter::set_mouse_position(const Point2 &p_posf) { +void Input::set_mouse_position(const Point2 &p_posf) { mouse_speed_track.update(p_posf - mouse_pos); mouse_pos = p_posf; } -Point2 InputFilter::get_mouse_position() const { +Point2 Input::get_mouse_position() const { return mouse_pos; } -Point2 InputFilter::get_last_mouse_speed() const { +Point2 Input::get_last_mouse_speed() const { return mouse_speed_track.speed; } -int InputFilter::get_mouse_button_mask() const { +int Input::get_mouse_button_mask() const { return mouse_button_mask; // do not trust OS implementation, should remove it - OS::get_singleton()->get_mouse_button_state(); } -void InputFilter::warp_mouse_position(const Vector2 &p_to) { +void Input::warp_mouse_position(const Vector2 &p_to) { warp_mouse_func(p_to); } -Point2i InputFilter::warp_mouse_motion(const Ref<InputEventMouseMotion> &p_motion, const Rect2 &p_rect) { +Point2i Input::warp_mouse_motion(const Ref<InputEventMouseMotion> &p_motion, const Rect2 &p_rect) { // The relative distance reported for the next event after a warp is in the boundaries of the // size of the rect on that axis, but it may be greater, in which case there's not problem as fmod() @@ -673,10 +673,10 @@ Point2i InputFilter::warp_mouse_motion(const Ref<InputEventMouseMotion> &p_motio return rel_warped; } -void InputFilter::iteration(float p_step) { +void Input::iteration(float p_step) { } -void InputFilter::action_press(const StringName &p_action, float p_strength) { +void Input::action_press(const StringName &p_action, float p_strength) { Action action; @@ -688,7 +688,7 @@ void InputFilter::action_press(const StringName &p_action, float p_strength) { action_state[p_action] = action; } -void InputFilter::action_release(const StringName &p_action) { +void Input::action_release(const StringName &p_action) { Action action; @@ -700,19 +700,19 @@ void InputFilter::action_release(const StringName &p_action) { action_state[p_action] = action; } -void InputFilter::set_emulate_touch_from_mouse(bool p_emulate) { +void Input::set_emulate_touch_from_mouse(bool p_emulate) { emulate_touch_from_mouse = p_emulate; } -bool InputFilter::is_emulating_touch_from_mouse() const { +bool Input::is_emulating_touch_from_mouse() const { return emulate_touch_from_mouse; } // Calling this whenever the game window is focused helps unstucking the "touch mouse" // if the OS or its abstraction class hasn't properly reported that touch pointers raised -void InputFilter::ensure_touch_mouse_raised() { +void Input::ensure_touch_mouse_raised() { if (mouse_from_touch_index != -1) { mouse_from_touch_index = -1; @@ -731,22 +731,22 @@ void InputFilter::ensure_touch_mouse_raised() { } } -void InputFilter::set_emulate_mouse_from_touch(bool p_emulate) { +void Input::set_emulate_mouse_from_touch(bool p_emulate) { emulate_mouse_from_touch = p_emulate; } -bool InputFilter::is_emulating_mouse_from_touch() const { +bool Input::is_emulating_mouse_from_touch() const { return emulate_mouse_from_touch; } -InputFilter::CursorShape InputFilter::get_default_cursor_shape() const { +Input::CursorShape Input::get_default_cursor_shape() const { return default_shape; } -void InputFilter::set_default_cursor_shape(CursorShape p_shape) { +void Input::set_default_cursor_shape(CursorShape p_shape) { if (default_shape == p_shape) return; @@ -761,19 +761,19 @@ void InputFilter::set_default_cursor_shape(CursorShape p_shape) { parse_input_event(mm); } -InputFilter::CursorShape InputFilter::get_current_cursor_shape() const { +Input::CursorShape Input::get_current_cursor_shape() const { return get_current_cursor_shape_func(); } -void InputFilter::set_custom_mouse_cursor(const RES &p_cursor, CursorShape p_shape, const Vector2 &p_hotspot) { +void Input::set_custom_mouse_cursor(const RES &p_cursor, CursorShape p_shape, const Vector2 &p_hotspot) { if (Engine::get_singleton()->is_editor_hint()) return; set_custom_mouse_cursor_func(p_cursor, p_shape, p_hotspot); } -void InputFilter::accumulate_input_event(const Ref<InputEvent> &p_event) { +void Input::accumulate_input_event(const Ref<InputEvent> &p_event) { ERR_FAIL_COND(p_event.is_null()); if (!use_accumulated_input) { @@ -786,7 +786,7 @@ void InputFilter::accumulate_input_event(const Ref<InputEvent> &p_event) { accumulated_events.push_back(p_event); } -void InputFilter::flush_accumulated_events() { +void Input::flush_accumulated_events() { while (accumulated_events.front()) { parse_input_event(accumulated_events.front()->get()); @@ -794,12 +794,12 @@ void InputFilter::flush_accumulated_events() { } } -void InputFilter::set_use_accumulated_input(bool p_enable) { +void Input::set_use_accumulated_input(bool p_enable) { use_accumulated_input = p_enable; } -void InputFilter::release_pressed_events() { +void Input::release_pressed_events() { flush_accumulated_events(); // this is needed to release actions strengths @@ -807,17 +807,17 @@ void InputFilter::release_pressed_events() { joy_buttons_pressed.clear(); _joy_axis.clear(); - for (Map<StringName, InputFilter::Action>::Element *E = action_state.front(); E; E = E->next()) { + for (Map<StringName, Input::Action>::Element *E = action_state.front(); E; E = E->next()) { if (E->get().pressed) action_release(E->key()); } } -void InputFilter::set_event_dispatch_function(EventDispatchFunc p_function) { +void Input::set_event_dispatch_function(EventDispatchFunc p_function) { event_dispatch_function = p_function; } -void InputFilter::joy_button(int p_device, int p_button, bool p_pressed) { +void Input::joy_button(int p_device, int p_button, bool p_pressed) { _THREAD_SAFE_METHOD_; Joypad &joy = joy_names[p_device]; @@ -856,7 +856,7 @@ void InputFilter::joy_button(int p_device, int p_button, bool p_pressed) { // no event? } -void InputFilter::joy_axis(int p_device, int p_axis, const JoyAxis &p_value) { +void Input::joy_axis(int p_device, int p_axis, const JoyAxis &p_value) { _THREAD_SAFE_METHOD_; @@ -971,7 +971,7 @@ void InputFilter::joy_axis(int p_device, int p_axis, const JoyAxis &p_value) { //printf("invalid mapping\n"); } -void InputFilter::joy_hat(int p_device, int p_val) { +void Input::joy_hat(int p_device, int p_val) { _THREAD_SAFE_METHOD_; const Joypad &joy = joy_names[p_device]; @@ -1003,7 +1003,7 @@ void InputFilter::joy_hat(int p_device, int p_val) { joy_names[p_device].hat_current = p_val; } -void InputFilter::_button_event(int p_device, int p_index, bool p_pressed) { +void Input::_button_event(int p_device, int p_index, bool p_pressed) { Ref<InputEventJoypadButton> ievent; ievent.instance(); @@ -1014,7 +1014,7 @@ void InputFilter::_button_event(int p_device, int p_index, bool p_pressed) { parse_input_event(ievent); } -void InputFilter::_axis_event(int p_device, int p_axis, float p_value) { +void Input::_axis_event(int p_device, int p_axis, float p_value) { Ref<InputEventJoypadMotion> ievent; ievent.instance(); @@ -1025,7 +1025,7 @@ void InputFilter::_axis_event(int p_device, int p_axis, float p_value) { parse_input_event(ievent); }; -InputFilter::JoyEvent InputFilter::_find_to_event(String p_to) { +Input::JoyEvent Input::_find_to_event(String p_to) { // string names of the SDL buttons in the same order as input_event.h godot buttons static const char *buttons[] = { "a", "b", "x", "y", "leftshoulder", "rightshoulder", "lefttrigger", "righttrigger", "leftstick", "rightstick", "back", "start", "dpup", "dpdown", "dpleft", "dpright", "guide", nullptr }; @@ -1063,7 +1063,7 @@ InputFilter::JoyEvent InputFilter::_find_to_event(String p_to) { return ret; }; -void InputFilter::parse_mapping(String p_mapping) { +void Input::parse_mapping(String p_mapping) { _THREAD_SAFE_METHOD_; JoyDeviceMapping mapping; @@ -1128,7 +1128,7 @@ void InputFilter::parse_mapping(String p_mapping) { //printf("added mapping with uuid %ls\n", mapping.uid.c_str()); }; -void InputFilter::add_joy_mapping(String p_mapping, bool p_update_existing) { +void Input::add_joy_mapping(String p_mapping, bool p_update_existing) { parse_mapping(p_mapping); if (p_update_existing) { Vector<String> entry = p_mapping.split(","); @@ -1141,7 +1141,7 @@ void InputFilter::add_joy_mapping(String p_mapping, bool p_update_existing) { } } -void InputFilter::remove_joy_mapping(String p_guid) { +void Input::remove_joy_mapping(String p_guid) { for (int i = map_db.size() - 1; i >= 0; i--) { if (p_guid == map_db[i].uid) { map_db.remove(i); @@ -1154,7 +1154,7 @@ void InputFilter::remove_joy_mapping(String p_guid) { } } -void InputFilter::set_fallback_mapping(String p_guid) { +void Input::set_fallback_mapping(String p_guid) { for (int i = 0; i < map_db.size(); i++) { if (map_db[i].uid == p_guid) { @@ -1165,17 +1165,17 @@ void InputFilter::set_fallback_mapping(String p_guid) { } //platforms that use the remapping system can override and call to these ones -bool InputFilter::is_joy_known(int p_device) { +bool Input::is_joy_known(int p_device) { int mapping = joy_names[p_device].mapping; return mapping != -1 ? (mapping != fallback_mapping) : false; } -String InputFilter::get_joy_guid(int p_device) const { +String Input::get_joy_guid(int p_device) const { ERR_FAIL_COND_V(!joy_names.has(p_device), ""); return joy_names[p_device].uid; } -Array InputFilter::get_connected_joypads() { +Array Input::get_connected_joypads() { Array ret; Map<int, Joypad>::Element *elem = joy_names.front(); while (elem) { @@ -1219,12 +1219,12 @@ static const char *_axes[JOY_AXIS_MAX] = { "" }; -String InputFilter::get_joy_button_string(int p_button) { +String Input::get_joy_button_string(int p_button) { ERR_FAIL_INDEX_V(p_button, JOY_BUTTON_MAX, ""); return _buttons[p_button]; } -int InputFilter::get_joy_button_index_from_string(String p_button) { +int Input::get_joy_button_index_from_string(String p_button) { for (int i = 0; i < JOY_BUTTON_MAX; i++) { if (p_button == _buttons[i]) { return i; @@ -1233,7 +1233,7 @@ int InputFilter::get_joy_button_index_from_string(String p_button) { ERR_FAIL_V(-1); } -int InputFilter::get_unused_joy_id() { +int Input::get_unused_joy_id() { for (int i = 0; i < JOYPADS_MAX; i++) { if (!joy_names.has(i) || !joy_names[i].connected) { return i; @@ -1242,12 +1242,12 @@ int InputFilter::get_unused_joy_id() { return -1; } -String InputFilter::get_joy_axis_string(int p_axis) { +String Input::get_joy_axis_string(int p_axis) { ERR_FAIL_INDEX_V(p_axis, JOY_AXIS_MAX, ""); return _axes[p_axis]; } -int InputFilter::get_joy_axis_index_from_string(String p_axis) { +int Input::get_joy_axis_index_from_string(String p_axis) { for (int i = 0; i < JOY_AXIS_MAX; i++) { if (p_axis == _axes[i]) { return i; @@ -1256,7 +1256,7 @@ int InputFilter::get_joy_axis_index_from_string(String p_axis) { ERR_FAIL_V(-1); } -InputFilter::InputFilter() { +Input::Input() { singleton = this; use_accumulated_input = true; diff --git a/core/input/input_filter.h b/core/input/input.h index 908a005228..2e136dbf02 100644 --- a/core/input/input_filter.h +++ b/core/input/input.h @@ -1,5 +1,5 @@ /*************************************************************************/ -/* input_filter.h */ +/* input.h */ /*************************************************************************/ /* This file is part of: */ /* GODOT ENGINE */ @@ -35,12 +35,12 @@ #include "core/object.h" #include "core/os/thread_safe.h" -class InputFilter : public Object { +class Input : public Object { - GDCLASS(InputFilter, Object); + GDCLASS(Input, Object); _THREAD_SAFE_CLASS_ - static InputFilter *singleton; + static Input *singleton; public: enum MouseMode { @@ -127,15 +127,6 @@ private: int mouse_from_touch_index; - struct VibrationInfo { - float weak_magnitude; - float strong_magnitude; - float duration; // Duration in seconds - uint64_t timestamp; - }; - - Map<int, VibrationInfo> joy_vibration; - struct SpeedTrack { uint64_t last_tick; @@ -232,6 +223,15 @@ private: EventDispatchFunc event_dispatch_function; protected: + struct VibrationInfo { + float weak_magnitude; + float strong_magnitude; + float duration; // Duration in seconds + uint64_t timestamp; + }; + + Map<int, VibrationInfo> joy_vibration; + static void _bind_methods(); public: @@ -239,7 +239,7 @@ public: MouseMode get_mouse_mode() const; void get_argument_options(const StringName &p_function, int p_idx, List<String> *r_options) const; - static InputFilter *get_singleton(); + static Input *get_singleton(); bool is_key_pressed(int p_keycode) const; bool is_mouse_button_pressed(int p_button) const; @@ -299,7 +299,7 @@ public: CursorShape get_default_cursor_shape() const; void set_default_cursor_shape(CursorShape p_shape); CursorShape get_current_cursor_shape() const; - void set_custom_mouse_cursor(const RES &p_cursor, CursorShape p_shape = InputFilter::CURSOR_ARROW, const Vector2 &p_hotspot = Vector2()); + void set_custom_mouse_cursor(const RES &p_cursor, CursorShape p_shape = Input::CURSOR_ARROW, const Vector2 &p_hotspot = Vector2()); void parse_mapping(String p_mapping); void joy_button(int p_device, int p_button, bool p_pressed); @@ -328,10 +328,10 @@ public: void set_event_dispatch_function(EventDispatchFunc p_function); - InputFilter(); + Input(); }; -VARIANT_ENUM_CAST(InputFilter::MouseMode); -VARIANT_ENUM_CAST(InputFilter::CursorShape); +VARIANT_ENUM_CAST(Input::MouseMode); +VARIANT_ENUM_CAST(Input::CursorShape); #endif // INPUT_H diff --git a/core/input/input_event.cpp b/core/input/input_event.cpp index 80219331c0..d18adb1983 100644 --- a/core/input/input_event.cpp +++ b/core/input/input_event.cpp @@ -477,7 +477,7 @@ void InputEventMouseButton::set_factor(float p_factor) { factor = p_factor; } -float InputEventMouseButton::get_factor() { +float InputEventMouseButton::get_factor() const { return factor; } diff --git a/core/input/input_event.h b/core/input/input_event.h index 2fdcdd0319..8774b3b1db 100644 --- a/core/input/input_event.h +++ b/core/input/input_event.h @@ -349,7 +349,7 @@ protected: public: void set_factor(float p_factor); - float get_factor(); + float get_factor() const; void set_button_index(int p_index); int get_button_index() const; diff --git a/core/io/image_loader.cpp b/core/io/image_loader.cpp index 2770adbd36..01e6bb5618 100644 --- a/core/io/image_loader.cpp +++ b/core/io/image_loader.cpp @@ -129,7 +129,7 @@ void ImageLoader::cleanup() { ///////////////// -RES ResourceFormatLoaderImage::load(const String &p_path, const String &p_original_path, Error *r_error, bool p_use_sub_threads, float *r_progress) { +RES ResourceFormatLoaderImage::load(const String &p_path, const String &p_original_path, Error *r_error, bool p_use_sub_threads, float *r_progress, bool p_no_cache) { FileAccess *f = FileAccess::open(p_path, FileAccess::READ); if (!f) { diff --git a/core/io/image_loader.h b/core/io/image_loader.h index 18b4df98f7..15ce6031d7 100644 --- a/core/io/image_loader.h +++ b/core/io/image_loader.h @@ -73,7 +73,7 @@ public: class ResourceFormatLoaderImage : public ResourceFormatLoader { public: - virtual RES load(const String &p_path, const String &p_original_path = "", Error *r_error = nullptr, bool p_use_sub_threads = false, float *r_progress = nullptr); + virtual RES load(const String &p_path, const String &p_original_path = "", Error *r_error = nullptr, bool p_use_sub_threads = false, float *r_progress = nullptr, bool p_no_cache = false); virtual void get_recognized_extensions(List<String> *p_extensions) const; virtual bool handles_type(const String &p_type) const; virtual String get_resource_type(const String &p_path) const; diff --git a/core/io/resource_format_binary.cpp b/core/io/resource_format_binary.cpp index a640565ecf..8c7559479b 100644 --- a/core/io/resource_format_binary.cpp +++ b/core/io/resource_format_binary.cpp @@ -337,12 +337,16 @@ Error ResourceLoaderBinary::parse_variant(Variant &r_v) { } break; case OBJECT_INTERNAL_RESOURCE: { uint32_t index = f->get_32(); - String path = res_path + "::" + itos(index); - RES res = ResourceLoader::load(path); - if (res.is_null()) { - WARN_PRINT(String("Couldn't load resource: " + path).utf8().get_data()); + if (use_nocache) { + r_v = internal_resources[index].cache; + } else { + String path = res_path + "::" + itos(index); + RES res = ResourceLoader::load(path); + if (res.is_null()) { + WARN_PRINT(String("Couldn't load resource: " + path).utf8().get_data()); + } + r_v = res; } - r_v = res; } break; case OBJECT_EXTERNAL_RESOURCE: { @@ -716,22 +720,24 @@ Error ResourceLoaderBinary::load() { if (!main) { - path = internal_resources[i].path; - if (path.begins_with("local://")) { - path = path.replace_first("local://", ""); - subindex = path.to_int(); - path = res_path + "::" + path; - } + if (!use_nocache) { + path = internal_resources[i].path; + if (path.begins_with("local://")) { + path = path.replace_first("local://", ""); + subindex = path.to_int(); + path = res_path + "::" + path; + } - if (ResourceCache::has(path)) { - //already loaded, don't do anything - stage++; - error = OK; - continue; + if (ResourceCache::has(path)) { + //already loaded, don't do anything + stage++; + error = OK; + continue; + } } } else { - if (!ResourceCache::has(res_path)) + if (!use_nocache && !ResourceCache::has(res_path)) path = res_path; } @@ -757,9 +763,15 @@ Error ResourceLoaderBinary::load() { RES res = RES(r); - r->set_path(path); + if (path != String()) { + r->set_path(path); + } r->set_subindex(subindex); + if (!main) { + internal_resources.write[i].cache = res; + } + int pc = f->get_32(); //set properties @@ -1013,6 +1025,7 @@ ResourceLoaderBinary::ResourceLoaderBinary() : importmd_ofs(0), error(OK) { + use_nocache = false; progress = nullptr; use_sub_threads = false; } @@ -1023,7 +1036,7 @@ ResourceLoaderBinary::~ResourceLoaderBinary() { memdelete(f); } -RES ResourceFormatLoaderBinary::load(const String &p_path, const String &p_original_path, Error *r_error, bool p_use_sub_threads, float *r_progress) { +RES ResourceFormatLoaderBinary::load(const String &p_path, const String &p_original_path, Error *r_error, bool p_use_sub_threads, float *r_progress, bool p_no_cache) { if (r_error) *r_error = ERR_FILE_CANT_OPEN; @@ -1034,6 +1047,7 @@ RES ResourceFormatLoaderBinary::load(const String &p_path, const String &p_origi ERR_FAIL_COND_V_MSG(err != OK, RES(), "Cannot open file '" + p_path + "'."); ResourceLoaderBinary loader; + loader.use_nocache = p_no_cache; loader.use_sub_threads = p_use_sub_threads; loader.progress = r_progress; String path = p_original_path != "" ? p_original_path : p_path; diff --git a/core/io/resource_format_binary.h b/core/io/resource_format_binary.h index da67e1e648..0f8fc9445b 100644 --- a/core/io/resource_format_binary.h +++ b/core/io/resource_format_binary.h @@ -68,6 +68,7 @@ class ResourceLoaderBinary { struct IntResource { String path; uint64_t offset; + RES cache; }; Vector<IntResource> internal_resources; @@ -78,6 +79,8 @@ class ResourceLoaderBinary { Map<String, String> remaps; Error error; + bool use_nocache; + friend class ResourceFormatLoaderBinary; Error parse_variant(Variant &r_v); @@ -101,7 +104,7 @@ public: class ResourceFormatLoaderBinary : public ResourceFormatLoader { public: - virtual RES load(const String &p_path, const String &p_original_path = "", Error *r_error = nullptr, bool p_use_sub_threads = false, float *r_progress = nullptr); + virtual RES load(const String &p_path, const String &p_original_path = "", Error *r_error = nullptr, bool p_use_sub_threads = false, float *r_progress = nullptr, bool p_no_cache = false); virtual void get_recognized_extensions_for_type(const String &p_type, List<String> *p_extensions) const; virtual void get_recognized_extensions(List<String> *p_extensions) const; virtual bool handles_type(const String &p_type) const; diff --git a/core/io/resource_importer.cpp b/core/io/resource_importer.cpp index ceb73cab77..643df53f8c 100644 --- a/core/io/resource_importer.cpp +++ b/core/io/resource_importer.cpp @@ -117,7 +117,7 @@ Error ResourceFormatImporter::_get_path_and_type(const String &p_path, PathAndTy return OK; } -RES ResourceFormatImporter::load(const String &p_path, const String &p_original_path, Error *r_error, bool p_use_sub_threads, float *r_progress) { +RES ResourceFormatImporter::load(const String &p_path, const String &p_original_path, Error *r_error, bool p_use_sub_threads, float *r_progress, bool p_no_cache) { PathAndType pat; Error err = _get_path_and_type(p_path, pat); @@ -130,7 +130,7 @@ RES ResourceFormatImporter::load(const String &p_path, const String &p_original_ return RES(); } - RES res = ResourceLoader::_load(pat.path, p_path, pat.type, false, r_error, p_use_sub_threads, r_progress); + RES res = ResourceLoader::_load(pat.path, p_path, pat.type, p_no_cache, r_error, p_use_sub_threads, r_progress); #ifdef TOOLS_ENABLED if (res.is_valid()) { diff --git a/core/io/resource_importer.h b/core/io/resource_importer.h index dbac80599a..6b76912494 100644 --- a/core/io/resource_importer.h +++ b/core/io/resource_importer.h @@ -58,7 +58,7 @@ class ResourceFormatImporter : public ResourceFormatLoader { public: static ResourceFormatImporter *get_singleton() { return singleton; } - virtual RES load(const String &p_path, const String &p_original_path = "", Error *r_error = nullptr, bool p_use_sub_threads = false, float *r_progress = nullptr); + virtual RES load(const String &p_path, const String &p_original_path = "", Error *r_error = nullptr, bool p_use_sub_threads = false, float *r_progress = nullptr, bool p_no_cache = false); virtual void get_recognized_extensions(List<String> *p_extensions) const; virtual void get_recognized_extensions_for_type(const String &p_type, List<String> *p_extensions) const; virtual bool recognize_path(const String &p_path, const String &p_for_type = String()) const; diff --git a/core/io/resource_loader.cpp b/core/io/resource_loader.cpp index 05a41013c2..d90802d7e2 100644 --- a/core/io/resource_loader.cpp +++ b/core/io/resource_loader.cpp @@ -119,7 +119,7 @@ void ResourceFormatLoader::get_recognized_extensions(List<String> *p_extensions) } } -RES ResourceFormatLoader::load(const String &p_path, const String &p_original_path, Error *r_error, bool p_use_sub_threads, float *r_progress) { +RES ResourceFormatLoader::load(const String &p_path, const String &p_original_path, Error *r_error, bool p_use_sub_threads, float *r_progress, bool p_no_cache) { if (get_script_instance() && get_script_instance()->has_method("load")) { Variant res = get_script_instance()->call("load", p_path, p_original_path, p_use_sub_threads); @@ -200,7 +200,7 @@ RES ResourceLoader::_load(const String &p_path, const String &p_original_path, c continue; } found = true; - RES res = loader[i]->load(p_path, p_original_path != String() ? p_original_path : p_path, r_error, p_use_sub_threads, r_progress); + RES res = loader[i]->load(p_path, p_original_path != String() ? p_original_path : p_path, r_error, p_use_sub_threads, r_progress, p_no_cache); if (res.is_null()) { continue; } diff --git a/core/io/resource_loader.h b/core/io/resource_loader.h index be4adf9091..2d95d5545f 100644 --- a/core/io/resource_loader.h +++ b/core/io/resource_loader.h @@ -43,7 +43,7 @@ protected: static void _bind_methods(); public: - virtual RES load(const String &p_path, const String &p_original_path = "", Error *r_error = nullptr, bool p_use_sub_threads = false, float *r_progress = nullptr); + virtual RES load(const String &p_path, const String &p_original_path = "", Error *r_error = nullptr, bool p_use_sub_threads = false, float *r_progress = nullptr, bool p_no_cache = false); virtual bool exists(const String &p_path) const; virtual void get_recognized_extensions(List<String> *p_extensions) const; virtual void get_recognized_extensions_for_type(const String &p_type, List<String> *p_extensions) const; diff --git a/core/io/translation_loader_po.cpp b/core/io/translation_loader_po.cpp index 5da236d029..bce5361c76 100644 --- a/core/io/translation_loader_po.cpp +++ b/core/io/translation_loader_po.cpp @@ -185,7 +185,7 @@ RES TranslationLoaderPO::load_translation(FileAccess *f, Error *r_error) { return translation; } -RES TranslationLoaderPO::load(const String &p_path, const String &p_original_path, Error *r_error, bool p_use_sub_threads, float *r_progress) { +RES TranslationLoaderPO::load(const String &p_path, const String &p_original_path, Error *r_error, bool p_use_sub_threads, float *r_progress, bool p_no_cache) { if (r_error) *r_error = ERR_CANT_OPEN; diff --git a/core/io/translation_loader_po.h b/core/io/translation_loader_po.h index 9d3117b630..137dfd1768 100644 --- a/core/io/translation_loader_po.h +++ b/core/io/translation_loader_po.h @@ -38,7 +38,7 @@ class TranslationLoaderPO : public ResourceFormatLoader { public: static RES load_translation(FileAccess *f, Error *r_error = nullptr); - virtual RES load(const String &p_path, const String &p_original_path = "", Error *r_error = nullptr, bool p_use_sub_threads = false, float *r_progress = nullptr); + virtual RES load(const String &p_path, const String &p_original_path = "", Error *r_error = nullptr, bool p_use_sub_threads = false, float *r_progress = nullptr, bool p_no_cache = false); virtual void get_recognized_extensions(List<String> *p_extensions) const; virtual bool handles_type(const String &p_type) const; virtual String get_resource_type(const String &p_path) const; 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/basis.cpp b/core/math/basis.cpp index 14079f811d..0f519a20d8 100644 --- a/core/math/basis.cpp +++ b/core/math/basis.cpp @@ -77,10 +77,6 @@ void Basis::invert() { void Basis::orthonormalize() { -#ifdef MATH_CHECKS - ERR_FAIL_COND(determinant() == 0); -#endif - // Gram-Schmidt Process Vector3 x = get_axis(0); diff --git a/core/math/camera_matrix.cpp b/core/math/camera_matrix.cpp index c4981b954b..c36070e47f 100644 --- a/core/math/camera_matrix.cpp +++ b/core/math/camera_matrix.cpp @@ -145,7 +145,7 @@ void CameraMatrix::set_for_hmd(int p_eye, real_t p_aspect, real_t p_intraocular_ f3 *= p_oversample; // always apply KEEP_WIDTH aspect ratio - f3 *= p_aspect; + f3 /= p_aspect; switch (p_eye) { case 1: { // left eye 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..2060a61b4b 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); } } @@ -1291,11 +1293,15 @@ int Octree<T, use_pairs, AL>::cull_convex(const Vector<Plane> &p_convex, T **p_r if (!root) return 0; + Vector<Vector3> convex_points = Geometry::compute_convex_mesh_points(&p_convex[0], p_convex.size()); + int result_count = 0; pass++; _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..97a9216a5a 100644 --- a/core/math/transform_2d.cpp +++ b/core/math/transform_2d.cpp @@ -267,7 +267,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 +275,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/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.cpp b/core/math/vector2.cpp index f4259e388b..f46badd19e 100644 --- a/core/math/vector2.cpp +++ b/core/math/vector2.cpp @@ -119,11 +119,11 @@ Vector2 Vector2::round() const { } Vector2 Vector2::rotated(real_t p_by) const { - - Vector2 v; - v.set_rotation(angle() + p_by); - v *= length(); - return v; + real_t sine = Math::sin(p_by); + real_t cosi = Math::cos(p_by); + return Vector2( + x * cosi - y * sine, + x * sine + y * cosi); } Vector2 Vector2::posmod(const real_t p_mod) const { diff --git a/core/math/vector2.h b/core/math/vector2.h index ba5558102f..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; @@ -123,12 +122,6 @@ struct Vector2 { real_t angle() const; - void set_rotation(real_t p_radians) { - - x = Math::cos(p_radians); - y = Math::sin(p_radians); - } - _FORCE_INLINE_ Vector2 abs() const { return Vector2(Math::abs(x), Math::abs(y)); @@ -230,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; @@ -254,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/method_bind.h b/core/method_bind.h index 588b472b62..d39f107ba6 100644 --- a/core/method_bind.h +++ b/core/method_bind.h @@ -39,6 +39,7 @@ #include "core/method_ptrcall.h" #include "core/object.h" #include "core/type_info.h" +#include "core/typedefs.h" #include "core/variant.h" #include <stdio.h> diff --git a/core/object.h b/core/object.h index 40032de271..b40aef2a42 100644 --- a/core/object.h +++ b/core/object.h @@ -60,7 +60,6 @@ enum PropertyHint { PROPERTY_HINT_ENUM, ///< hint_text= "val1,val2,val3,etc" PROPERTY_HINT_EXP_EASING, /// exponential easing function (Math::ease) use "attenuation" hint string to revert (flip h), "full" to also include in/out. (ie: "attenuation,inout") PROPERTY_HINT_LENGTH, ///< hint_text= "length" (as integer) - PROPERTY_HINT_SPRITE_FRAME, // FIXME: Obsolete: drop whenever we can break compat. Keeping now for GDNative compat. PROPERTY_HINT_KEY_ACCEL, ///< hint_text= "length" (as integer) PROPERTY_HINT_FLAGS, ///< hint_text= "flag1,flag2,etc" (as bit flags) PROPERTY_HINT_LAYERS_2D_RENDER, @@ -92,6 +91,7 @@ enum PropertyHint { PROPERTY_HINT_NODE_PATH_VALID_TYPES, PROPERTY_HINT_SAVE_FILE, ///< a file path must be passed, hint_text (optionally) is a filter "*.png,*.wav,*.doc,". This opens a save dialog PROPERTY_HINT_INT_IS_OBJECTID, + PROPERTY_HINT_ARRAY_TYPE, PROPERTY_HINT_MAX, // When updating PropertyHint, also sync the hardcoded list in VisualScriptEditorVariableEdit }; @@ -107,10 +107,7 @@ enum PropertyUsageFlags { PROPERTY_USAGE_INTERNATIONALIZED = 64, //hint for internationalized strings PROPERTY_USAGE_GROUP = 128, //used for grouping props in the editor PROPERTY_USAGE_CATEGORY = 256, - // FIXME: Drop in 4.0, possibly reorder other flags? - // Those below are deprecated thanks to ClassDB's now class value cache - //PROPERTY_USAGE_STORE_IF_NONZERO = 512, //only store if nonzero - //PROPERTY_USAGE_STORE_IF_NONONE = 1024, //only store if false + PROPERTY_USAGE_SUBGROUP = 512, PROPERTY_USAGE_NO_INSTANCE_STATE = 2048, PROPERTY_USAGE_RESTART_IF_CHANGED = 4096, PROPERTY_USAGE_SCRIPT_VARIABLE = 8192, @@ -138,6 +135,7 @@ enum PropertyUsageFlags { #define ADD_PROPERTYI(m_property, m_setter, m_getter, m_index) ClassDB::add_property(get_class_static(), m_property, _scs_create(m_setter), _scs_create(m_getter), m_index) #define ADD_PROPERTY_DEFAULT(m_property, m_default) ClassDB::set_property_default_value(get_class_static(), m_property, m_default) #define ADD_GROUP(m_name, m_prefix) ClassDB::add_property_group(get_class_static(), m_name, m_prefix) +#define ADD_SUBGROUP(m_name, m_prefix) ClassDB::add_property_subgroup(get_class_static(), m_name, m_prefix) struct PropertyInfo { diff --git a/core/os/midi_driver.cpp b/core/os/midi_driver.cpp index 985f6f38e5..efd87d3ab6 100644 --- a/core/os/midi_driver.cpp +++ b/core/os/midi_driver.cpp @@ -30,7 +30,7 @@ #include "midi_driver.h" -#include "core/input/input_filter.h" +#include "core/input/input.h" #include "core/os/os.h" uint8_t MIDIDriver::last_received_message = 0x00; @@ -117,7 +117,7 @@ void MIDIDriver::receive_input_packet(uint64_t timestamp, uint8_t *data, uint32_ break; } - InputFilter *id = InputFilter::get_singleton(); + Input *id = Input::get_singleton(); id->parse_input_event(event); } diff --git a/core/os/os.cpp b/core/os/os.cpp index 0636810e4b..425132fbec 100644 --- a/core/os/os.cpp +++ b/core/os/os.cpp @@ -30,7 +30,7 @@ #include "os.h" -#include "core/input/input_filter.h" +#include "core/input/input.h" #include "core/os/dir_access.h" #include "core/os/file_access.h" #include "core/os/midi_driver.h" diff --git a/core/register_core_types.cpp b/core/register_core_types.cpp index 905f43d61b..23f549be1a 100644 --- a/core/register_core_types.cpp +++ b/core/register_core_types.cpp @@ -38,7 +38,7 @@ #include "core/crypto/hashing_context.h" #include "core/engine.h" #include "core/func_ref.h" -#include "core/input/input_filter.h" +#include "core/input/input.h" #include "core/input/input_map.h" #include "core/io/config_file.h" #include "core/io/dtls_server.h" @@ -249,7 +249,7 @@ void register_core_singletons() { ClassDB::register_class<_ClassDB>(); ClassDB::register_class<_Marshalls>(); ClassDB::register_class<TranslationServer>(); - ClassDB::register_virtual_class<InputFilter>(); + ClassDB::register_virtual_class<Input>(); ClassDB::register_class<InputMap>(); ClassDB::register_class<_JSON>(); ClassDB::register_class<Expression>(); @@ -264,7 +264,7 @@ void register_core_singletons() { Engine::get_singleton()->add_singleton(Engine::Singleton("ClassDB", _classdb)); Engine::get_singleton()->add_singleton(Engine::Singleton("Marshalls", _Marshalls::get_singleton())); Engine::get_singleton()->add_singleton(Engine::Singleton("TranslationServer", TranslationServer::get_singleton())); - Engine::get_singleton()->add_singleton(Engine::Singleton("Input", InputFilter::get_singleton())); + Engine::get_singleton()->add_singleton(Engine::Singleton("Input", Input::get_singleton())); Engine::get_singleton()->add_singleton(Engine::Singleton("InputMap", InputMap::get_singleton())); Engine::get_singleton()->add_singleton(Engine::Singleton("JSON", _JSON::get_singleton())); } diff --git a/core/resource.cpp b/core/resource.cpp index d1883d8043..8d5c441b21 100644 --- a/core/resource.cpp +++ b/core/resource.cpp @@ -477,6 +477,9 @@ void ResourceCache::clear() { resources.clear(); memdelete(lock); +#ifdef TOOLS_ENABLED + memdelete(path_cache_lock); +#endif } void ResourceCache::reload_externals() { diff --git a/core/rid.h b/core/rid.h index 3cc0ee3084..a2f73423a3 100644 --- a/core/rid.h +++ b/core/rid.h @@ -31,11 +31,6 @@ #ifndef RID_H #define RID_H -#include "core/list.h" -#include "core/oa_hash_map.h" -#include "core/os/memory.h" -#include "core/safe_refcount.h" -#include "core/set.h" #include "core/typedefs.h" class RID_AllocBase; diff --git a/core/rid_owner.h b/core/rid_owner.h index 946b2e396c..ad6996b9a7 100644 --- a/core/rid_owner.h +++ b/core/rid_owner.h @@ -31,8 +31,13 @@ #ifndef RID_OWNER_H #define RID_OWNER_H +#include "core/list.h" +#include "core/oa_hash_map.h" +#include "core/os/memory.h" #include "core/print_string.h" #include "core/rid.h" +#include "core/safe_refcount.h" +#include "core/set.h" #include "core/spin_lock.h" #include <stdio.h> #include <typeinfo> diff --git a/core/script_language.h b/core/script_language.h index 2d86c5166d..5cc240efcb 100644 --- a/core/script_language.h +++ b/core/script_language.h @@ -135,6 +135,8 @@ public: virtual Ref<Script> get_base_script() const = 0; //for script inheritance + virtual bool inherits_script(const Ref<Script> &p_script) const = 0; + virtual StringName get_instance_base_type() const = 0; // this may not work in all scripts, will return empty if so virtual ScriptInstance *instance_create(Object *p_this) = 0; virtual PlaceHolderScriptInstance *placeholder_instance_create(Object *p_this) { return nullptr; } diff --git a/core/typed_array.cpp b/core/typed_array.cpp new file mode 100644 index 0000000000..55e45f0b3f --- /dev/null +++ b/core/typed_array.cpp @@ -0,0 +1 @@ +#include "typed_array.h" diff --git a/core/typed_array.h b/core/typed_array.h new file mode 100644 index 0000000000..5e95e81ea3 --- /dev/null +++ b/core/typed_array.h @@ -0,0 +1,202 @@ +#ifndef TYPED_ARRAY_H +#define TYPED_ARRAY_H + +#include "core/array.h" +#include "core/method_ptrcall.h" +#include "core/variant.h" + +template <class T> +class TypedArray : public Array { +public: + template <class U> + _FORCE_INLINE_ void operator=(const TypedArray<U> &p_array) { + static_assert(__is_base_of(T, U)); + _assign(p_array); + } + + _FORCE_INLINE_ void operator=(const Array &p_array) { + _assign(p_array); + } + _FORCE_INLINE_ TypedArray(const Variant &p_variant) : + Array(Array(p_variant), Variant::OBJECT, T::get_class_static(), Variant()) { + } + _FORCE_INLINE_ TypedArray(const Array &p_array) : + Array(p_array, Variant::OBJECT, T::get_class_static(), Variant()) { + } + _FORCE_INLINE_ TypedArray() { + set_typed(Variant::OBJECT, T::get_class_static(), Variant()); + } +}; + +//specialization for the rest of variant types + +#define MAKE_TYPED_ARRAY(m_type, m_variant_type) \ + template <> \ + class TypedArray<m_type> : public Array { \ + public: \ + _FORCE_INLINE_ void operator=(const Array &p_array) { \ + _assign(p_array); \ + } \ + _FORCE_INLINE_ TypedArray(const Variant &p_variant) : \ + Array(Array(p_variant), m_variant_type, StringName(), Variant()) { \ + } \ + _FORCE_INLINE_ TypedArray(const Array &p_array) : \ + Array(p_array, m_variant_type, StringName(), Variant()) { \ + } \ + _FORCE_INLINE_ TypedArray() { \ + set_typed(m_variant_type, StringName(), Variant()); \ + } \ + }; + +MAKE_TYPED_ARRAY(bool, Variant::BOOL) +MAKE_TYPED_ARRAY(uint8_t, Variant::INT) +MAKE_TYPED_ARRAY(int8_t, Variant::INT) +MAKE_TYPED_ARRAY(uint16_t, Variant::INT) +MAKE_TYPED_ARRAY(int16_t, Variant::INT) +MAKE_TYPED_ARRAY(uint32_t, Variant::INT) +MAKE_TYPED_ARRAY(int32_t, Variant::INT) +MAKE_TYPED_ARRAY(uint64_t, Variant::INT) +MAKE_TYPED_ARRAY(int64_t, Variant::INT) +MAKE_TYPED_ARRAY(float, Variant::FLOAT) +MAKE_TYPED_ARRAY(double, Variant::FLOAT) +MAKE_TYPED_ARRAY(String, Variant::STRING) +MAKE_TYPED_ARRAY(Vector2, Variant::VECTOR2) +MAKE_TYPED_ARRAY(Vector2i, Variant::VECTOR2I) +MAKE_TYPED_ARRAY(Rect2, Variant::RECT2) +MAKE_TYPED_ARRAY(Rect2i, Variant::RECT2I) +MAKE_TYPED_ARRAY(Vector3, Variant::VECTOR3) +MAKE_TYPED_ARRAY(Vector3i, Variant::VECTOR3I) +MAKE_TYPED_ARRAY(Transform2D, Variant::TRANSFORM2D) +MAKE_TYPED_ARRAY(Plane, Variant::PLANE) +MAKE_TYPED_ARRAY(Quat, Variant::QUAT) +MAKE_TYPED_ARRAY(AABB, Variant::AABB) +MAKE_TYPED_ARRAY(Basis, Variant::BASIS) +MAKE_TYPED_ARRAY(Transform, Variant::TRANSFORM) +MAKE_TYPED_ARRAY(Color, Variant::COLOR) +MAKE_TYPED_ARRAY(StringName, Variant::STRING_NAME) +MAKE_TYPED_ARRAY(NodePath, Variant::NODE_PATH) +MAKE_TYPED_ARRAY(RID, Variant::_RID) +MAKE_TYPED_ARRAY(Callable, Variant::CALLABLE) +MAKE_TYPED_ARRAY(Signal, Variant::SIGNAL) +MAKE_TYPED_ARRAY(Dictionary, Variant::DICTIONARY) +MAKE_TYPED_ARRAY(Array, Variant::ARRAY) +MAKE_TYPED_ARRAY(Vector<uint8_t>, Variant::PACKED_BYTE_ARRAY) +MAKE_TYPED_ARRAY(Vector<int32_t>, Variant::PACKED_INT32_ARRAY) +MAKE_TYPED_ARRAY(Vector<int64_t>, Variant::PACKED_INT64_ARRAY) +MAKE_TYPED_ARRAY(Vector<float>, Variant::PACKED_FLOAT32_ARRAY) +MAKE_TYPED_ARRAY(Vector<double>, Variant::PACKED_FLOAT64_ARRAY) +MAKE_TYPED_ARRAY(Vector<String>, Variant::PACKED_STRING_ARRAY) +MAKE_TYPED_ARRAY(Vector<Vector2>, Variant::PACKED_VECTOR2_ARRAY) +MAKE_TYPED_ARRAY(Vector<Vector3>, Variant::PACKED_VECTOR3_ARRAY) +MAKE_TYPED_ARRAY(Vector<Color>, Variant::PACKED_COLOR_ARRAY) + +#ifdef PTRCALL_ENABLED + +template <class T> +struct PtrToArg<TypedArray<T>> { + + _FORCE_INLINE_ static TypedArray<T> convert(const void *p_ptr) { + + return TypedArray<T>(*reinterpret_cast<const Array *>(p_ptr)); + } + + _FORCE_INLINE_ static void encode(TypedArray<T> p_val, void *p_ptr) { + + *(Array *)p_ptr = p_val; + } +}; + +template <class T> +struct PtrToArg<const TypedArray<T> &> { + + _FORCE_INLINE_ static TypedArray<T> convert(const void *p_ptr) { + + return TypedArray<T>(*reinterpret_cast<const Array *>(p_ptr)); + } +}; + +#endif // PTRCALL_ENABLED + +#ifdef DEBUG_METHODS_ENABLED + +template <class T> +struct GetTypeInfo<TypedArray<T>> { + static const Variant::Type VARIANT_TYPE = Variant::ARRAY; + static const GodotTypeInfo::Metadata METADATA = GodotTypeInfo::METADATA_NONE; + static inline PropertyInfo get_class_info() { + return PropertyInfo(Variant::ARRAY, String(), PROPERTY_HINT_ARRAY_TYPE, T::get_class_static()); + } +}; + +template <class T> +struct GetTypeInfo<const TypedArray<T> &> { + static const Variant::Type VARIANT_TYPE = Variant::ARRAY; + static const GodotTypeInfo::Metadata METADATA = GodotTypeInfo::METADATA_NONE; + static inline PropertyInfo get_class_info() { + return PropertyInfo(Variant::ARRAY, String(), PROPERTY_HINT_ARRAY_TYPE, T::get_class_static()); + } +}; + +#define MAKE_TYPED_ARRAY_INFO(m_type, m_variant_type) \ + template <> \ + struct GetTypeInfo<TypedArray<m_type>> { \ + static const Variant::Type VARIANT_TYPE = Variant::ARRAY; \ + static const GodotTypeInfo::Metadata METADATA = GodotTypeInfo::METADATA_NONE; \ + static inline PropertyInfo get_class_info() { \ + return PropertyInfo(Variant::ARRAY, String(), PROPERTY_HINT_ARRAY_TYPE, Variant::get_type_name(m_variant_type)); \ + } \ + }; \ + template <> \ + struct GetTypeInfo<const TypedArray<m_type> &> { \ + static const Variant::Type VARIANT_TYPE = Variant::ARRAY; \ + static const GodotTypeInfo::Metadata METADATA = GodotTypeInfo::METADATA_NONE; \ + static inline PropertyInfo get_class_info() { \ + return PropertyInfo(Variant::ARRAY, String(), PROPERTY_HINT_ARRAY_TYPE, Variant::get_type_name(m_variant_type)); \ + } \ + }; + +MAKE_TYPED_ARRAY_INFO(bool, Variant::BOOL) +MAKE_TYPED_ARRAY_INFO(uint8_t, Variant::INT) +MAKE_TYPED_ARRAY_INFO(int8_t, Variant::INT) +MAKE_TYPED_ARRAY_INFO(uint16_t, Variant::INT) +MAKE_TYPED_ARRAY_INFO(int16_t, Variant::INT) +MAKE_TYPED_ARRAY_INFO(uint32_t, Variant::INT) +MAKE_TYPED_ARRAY_INFO(int32_t, Variant::INT) +MAKE_TYPED_ARRAY_INFO(uint64_t, Variant::INT) +MAKE_TYPED_ARRAY_INFO(int64_t, Variant::INT) +MAKE_TYPED_ARRAY_INFO(float, Variant::FLOAT) +MAKE_TYPED_ARRAY_INFO(double, Variant::FLOAT) +MAKE_TYPED_ARRAY_INFO(String, Variant::STRING) +MAKE_TYPED_ARRAY_INFO(Vector2, Variant::VECTOR2) +MAKE_TYPED_ARRAY_INFO(Vector2i, Variant::VECTOR2I) +MAKE_TYPED_ARRAY_INFO(Rect2, Variant::RECT2) +MAKE_TYPED_ARRAY_INFO(Rect2i, Variant::RECT2I) +MAKE_TYPED_ARRAY_INFO(Vector3, Variant::VECTOR3) +MAKE_TYPED_ARRAY_INFO(Vector3i, Variant::VECTOR3I) +MAKE_TYPED_ARRAY_INFO(Transform2D, Variant::TRANSFORM2D) +MAKE_TYPED_ARRAY_INFO(Plane, Variant::PLANE) +MAKE_TYPED_ARRAY_INFO(Quat, Variant::QUAT) +MAKE_TYPED_ARRAY_INFO(AABB, Variant::AABB) +MAKE_TYPED_ARRAY_INFO(Basis, Variant::BASIS) +MAKE_TYPED_ARRAY_INFO(Transform, Variant::TRANSFORM) +MAKE_TYPED_ARRAY_INFO(Color, Variant::COLOR) +MAKE_TYPED_ARRAY_INFO(StringName, Variant::STRING_NAME) +MAKE_TYPED_ARRAY_INFO(NodePath, Variant::NODE_PATH) +MAKE_TYPED_ARRAY_INFO(RID, Variant::_RID) +MAKE_TYPED_ARRAY_INFO(Callable, Variant::CALLABLE) +MAKE_TYPED_ARRAY_INFO(Signal, Variant::SIGNAL) +MAKE_TYPED_ARRAY_INFO(Dictionary, Variant::DICTIONARY) +MAKE_TYPED_ARRAY_INFO(Array, Variant::ARRAY) +MAKE_TYPED_ARRAY_INFO(Vector<uint8_t>, Variant::PACKED_BYTE_ARRAY) +MAKE_TYPED_ARRAY_INFO(Vector<int32_t>, Variant::PACKED_INT32_ARRAY) +MAKE_TYPED_ARRAY_INFO(Vector<int64_t>, Variant::PACKED_INT64_ARRAY) +MAKE_TYPED_ARRAY_INFO(Vector<float>, Variant::PACKED_FLOAT32_ARRAY) +MAKE_TYPED_ARRAY_INFO(Vector<double>, Variant::PACKED_FLOAT64_ARRAY) +MAKE_TYPED_ARRAY_INFO(Vector<String>, Variant::PACKED_STRING_ARRAY) +MAKE_TYPED_ARRAY_INFO(Vector<Vector2>, Variant::PACKED_VECTOR2_ARRAY) +MAKE_TYPED_ARRAY_INFO(Vector<Vector3>, Variant::PACKED_VECTOR3_ARRAY) +MAKE_TYPED_ARRAY_INFO(Vector<Color>, Variant::PACKED_COLOR_ARRAY) + +#endif + +#endif // TYPED_ARRAY_H diff --git a/core/undo_redo.cpp b/core/undo_redo.cpp index 8bd5a4915d..62ad3e9f98 100644 --- a/core/undo_redo.cpp +++ b/core/undo_redo.cpp @@ -511,8 +511,7 @@ void UndoRedo::_bind_methods() { ClassDB::bind_method(D_METHOD("create_action", "name", "merge_mode"), &UndoRedo::create_action, DEFVAL(MERGE_DISABLE)); ClassDB::bind_method(D_METHOD("commit_action"), &UndoRedo::commit_action); - // FIXME: Typo in "commiting", fix in 4.0 when breaking compat. - ClassDB::bind_method(D_METHOD("is_commiting_action"), &UndoRedo::is_committing_action); + ClassDB::bind_method(D_METHOD("is_committing_action"), &UndoRedo::is_committing_action); { MethodInfo mi; diff --git a/core/ustring.cpp b/core/ustring.cpp index e56f177103..fbe3fcb1b2 100644 --- a/core/ustring.cpp +++ b/core/ustring.cpp @@ -647,13 +647,13 @@ String String::camelcase_to_underscore(bool lowercase) const { } String String::get_with_code_lines() const { - Vector<String> lines = split("\n"); + const Vector<String> lines = split("\n"); String ret; for (int i = 0; i < lines.size(); i++) { if (i > 0) { ret += "\n"; } - ret += itos(i + 1) + " " + lines[i]; + ret += vformat("%4d | %s", i + 1, lines[i]); } return ret; } diff --git a/core/variant_call.cpp b/core/variant_call.cpp index 391c293810..39bfd04a0b 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); @@ -860,42 +860,42 @@ struct _VariantCall { VCALL_PTR1R(Transform2D, is_equal_approx); static void _call_Transform2D_xform(Variant &r_ret, Variant &p_self, const Variant **p_args) { - switch (p_args[0]->type) { - case Variant::VECTOR2: r_ret = reinterpret_cast<Transform2D *>(p_self._data._ptr)->xform(p_args[0]->operator Vector2()); return; case Variant::RECT2: r_ret = reinterpret_cast<Transform2D *>(p_self._data._ptr)->xform(p_args[0]->operator Rect2()); return; case Variant::PACKED_VECTOR2_ARRAY: r_ret = reinterpret_cast<Transform2D *>(p_self._data._ptr)->xform(p_args[0]->operator PackedVector2Array()); return; - default: r_ret = Variant(); + default: + r_ret = Variant(); + ERR_PRINT("Invalid type in function 'xform' in base 'Transform2D'. Valid types are Vector2, Rect2, and PackedVector2Array."); } } static void _call_Transform2D_xform_inv(Variant &r_ret, Variant &p_self, const Variant **p_args) { - switch (p_args[0]->type) { - case Variant::VECTOR2: r_ret = reinterpret_cast<Transform2D *>(p_self._data._ptr)->xform_inv(p_args[0]->operator Vector2()); return; case Variant::RECT2: r_ret = reinterpret_cast<Transform2D *>(p_self._data._ptr)->xform_inv(p_args[0]->operator Rect2()); return; case Variant::PACKED_VECTOR2_ARRAY: r_ret = reinterpret_cast<Transform2D *>(p_self._data._ptr)->xform_inv(p_args[0]->operator PackedVector2Array()); return; - default: r_ret = Variant(); + default: + r_ret = Variant(); + ERR_PRINT("Invalid type in function 'xform_inv' in base 'Transform2D'. Valid types are Vector2, Rect2, and PackedVector2Array."); } } static void _call_Transform2D_basis_xform(Variant &r_ret, Variant &p_self, const Variant **p_args) { - switch (p_args[0]->type) { - case Variant::VECTOR2: r_ret = reinterpret_cast<Transform2D *>(p_self._data._ptr)->basis_xform(p_args[0]->operator Vector2()); return; - default: r_ret = Variant(); + default: + r_ret = Variant(); + ERR_PRINT("Invalid type in function 'basis_xform' in base 'Transform2D'. Only Vector2 is valid."); } } static void _call_Transform2D_basis_xform_inv(Variant &r_ret, Variant &p_self, const Variant **p_args) { - switch (p_args[0]->type) { - case Variant::VECTOR2: r_ret = reinterpret_cast<Transform2D *>(p_self._data._ptr)->basis_xform_inv(p_args[0]->operator Vector2()); return; - default: r_ret = Variant(); + default: + r_ret = Variant(); + ERR_PRINT("Invalid type in function 'basis_xform_inv' in base 'Transform2D'. Only Vector2 is valid."); } } @@ -928,37 +928,29 @@ struct _VariantCall { VCALL_PTR1R(Transform, is_equal_approx); static void _call_Transform_xform(Variant &r_ret, Variant &p_self, const Variant **p_args) { - switch (p_args[0]->type) { - case Variant::VECTOR3: r_ret = reinterpret_cast<Transform *>(p_self._data._ptr)->xform(p_args[0]->operator Vector3()); return; case Variant::PLANE: r_ret = reinterpret_cast<Transform *>(p_self._data._ptr)->xform(p_args[0]->operator Plane()); return; case Variant::AABB: r_ret = reinterpret_cast<Transform *>(p_self._data._ptr)->xform(p_args[0]->operator ::AABB()); return; case Variant::PACKED_VECTOR3_ARRAY: r_ret = reinterpret_cast<Transform *>(p_self._data._ptr)->xform(p_args[0]->operator ::PackedVector3Array()); return; - default: r_ret = Variant(); + default: + r_ret = Variant(); + ERR_PRINT("Invalid type in function 'xform' in base 'Transform'. Valid types are Vector3, Plane, AABB, and PackedVector3Array."); } } static void _call_Transform_xform_inv(Variant &r_ret, Variant &p_self, const Variant **p_args) { - switch (p_args[0]->type) { - case Variant::VECTOR3: r_ret = reinterpret_cast<Transform *>(p_self._data._ptr)->xform_inv(p_args[0]->operator Vector3()); return; case Variant::PLANE: r_ret = reinterpret_cast<Transform *>(p_self._data._ptr)->xform_inv(p_args[0]->operator Plane()); return; case Variant::AABB: r_ret = reinterpret_cast<Transform *>(p_self._data._ptr)->xform_inv(p_args[0]->operator ::AABB()); return; case Variant::PACKED_VECTOR3_ARRAY: r_ret = reinterpret_cast<Transform *>(p_self._data._ptr)->xform_inv(p_args[0]->operator ::PackedVector3Array()); return; - default: r_ret = Variant(); + default: + r_ret = Variant(); + ERR_PRINT("Invalid type in function 'xform_inv' in base 'Transform'. Valid types are Vector3, Plane, AABB, and PackedVector3Array."); } } - /* - VCALL_PTR0( Transform, invert ); - VCALL_PTR0( Transform, affine_invert ); - VCALL_PTR2( Transform, rotate ); - VCALL_PTR1( Transform, scale ); - VCALL_PTR1( Transform, translate ); - VCALL_PTR0( Transform, orthonormalize ); */ - struct ConstructData { int arg_count; @@ -1809,7 +1801,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()); @@ -1874,7 +1866,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()); @@ -1933,7 +1925,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()); 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 8c6821eaac..b3cd1c1af7 100644 --- a/doc/classes/@GlobalScope.xml +++ b/doc/classes/@GlobalScope.xml @@ -12,9 +12,6 @@ <methods> </methods> <members> - <member name="ARVRServer" type="ARVRServer" setter="" getter=""> - The [ARVRServer] singleton. - </member> <member name="AudioServer" type="AudioServer" setter="" getter=""> The [AudioServer] singleton. </member> @@ -24,20 +21,20 @@ <member name="ClassDB" type="ClassDB" setter="" getter=""> The [ClassDB] singleton. </member> + <member name="DisplayServer" type="DisplayServer" setter="" getter=""> + The [DisplayServer] singleton. + </member> <member name="Engine" type="Engine" setter="" getter=""> The [Engine] singleton. </member> <member name="Geometry" type="Geometry" setter="" getter=""> The [Geometry] singleton. </member> - <member name="GodotSharp" type="GodotSharp" setter="" getter=""> - The [GodotSharp] singleton. Only available when using Godot's Mono build. - </member> <member name="IP" type="IP" setter="" getter=""> The [IP] singleton. </member> - <member name="Input" type="InputFilter" setter="" getter=""> - The [InputFilter] singleton. + <member name="Input" type="Input" setter="" getter=""> + The [Input] singleton. </member> <member name="InputMap" type="InputMap" setter="" getter=""> The [InputMap] singleton. @@ -95,6 +92,9 @@ <member name="VisualScriptEditor" type="VisualScriptEditor" setter="" getter=""> The [VisualScriptEditor] singleton. </member> + <member name="XRServer" type="XRServer" setter="" getter=""> + The [XRServer] singleton. + </member> </members> <constants> <constant name="MARGIN_LEFT" value="0" enum="Margin"> @@ -155,7 +155,7 @@ Tab key. </constant> <constant name="KEY_BACKTAB" value="16777219" enum="KeyList"> - Shift+Tab key. + Shift + Tab key. </constant> <constant name="KEY_BACKSPACE" value="16777220" enum="KeyList"> Backspace key. @@ -1345,52 +1345,52 @@ <constant name="PROPERTY_HINT_LENGTH" value="5" enum="PropertyHint"> Deprecated hint, unused. </constant> - <constant name="PROPERTY_HINT_KEY_ACCEL" value="7" enum="PropertyHint"> + <constant name="PROPERTY_HINT_KEY_ACCEL" value="6" enum="PropertyHint"> Deprecated hint, unused. </constant> - <constant name="PROPERTY_HINT_FLAGS" value="8" enum="PropertyHint"> + <constant name="PROPERTY_HINT_FLAGS" value="7" enum="PropertyHint"> Hints that an integer property is a bitmask with named bit flags. For example, to allow toggling bits 0, 1, 2 and 4, the hint could be something like [code]"Bit0,Bit1,Bit2,,Bit4"[/code]. </constant> - <constant name="PROPERTY_HINT_LAYERS_2D_RENDER" value="9" enum="PropertyHint"> + <constant name="PROPERTY_HINT_LAYERS_2D_RENDER" value="8" enum="PropertyHint"> Hints that an integer property is a bitmask using the optionally named 2D render layers. </constant> - <constant name="PROPERTY_HINT_LAYERS_2D_PHYSICS" value="10" enum="PropertyHint"> + <constant name="PROPERTY_HINT_LAYERS_2D_PHYSICS" value="9" enum="PropertyHint"> Hints that an integer property is a bitmask using the optionally named 2D physics layers. </constant> - <constant name="PROPERTY_HINT_LAYERS_3D_RENDER" value="11" enum="PropertyHint"> + <constant name="PROPERTY_HINT_LAYERS_3D_RENDER" value="10" enum="PropertyHint"> Hints that an integer property is a bitmask using the optionally named 3D render layers. </constant> - <constant name="PROPERTY_HINT_LAYERS_3D_PHYSICS" value="12" enum="PropertyHint"> + <constant name="PROPERTY_HINT_LAYERS_3D_PHYSICS" value="11" enum="PropertyHint"> Hints that an integer property is a bitmask using the optionally named 3D physics layers. </constant> - <constant name="PROPERTY_HINT_FILE" value="13" enum="PropertyHint"> + <constant name="PROPERTY_HINT_FILE" value="12" enum="PropertyHint"> Hints that a string property is a path to a file. Editing it will show a file dialog for picking the path. The hint string can be a set of filters with wildcards like [code]"*.png,*.jpg"[/code]. </constant> - <constant name="PROPERTY_HINT_DIR" value="14" enum="PropertyHint"> + <constant name="PROPERTY_HINT_DIR" value="13" enum="PropertyHint"> Hints that a string property is a path to a directory. Editing it will show a file dialog for picking the path. </constant> - <constant name="PROPERTY_HINT_GLOBAL_FILE" value="15" enum="PropertyHint"> + <constant name="PROPERTY_HINT_GLOBAL_FILE" value="14" enum="PropertyHint"> Hints that a string property is an absolute path to a file outside the project folder. Editing it will show a file dialog for picking the path. The hint string can be a set of filters with wildcards like [code]"*.png,*.jpg"[/code]. </constant> - <constant name="PROPERTY_HINT_GLOBAL_DIR" value="16" enum="PropertyHint"> + <constant name="PROPERTY_HINT_GLOBAL_DIR" value="15" enum="PropertyHint"> Hints that a string property is an absolute path to a directory outside the project folder. Editing it will show a file dialog for picking the path. </constant> - <constant name="PROPERTY_HINT_RESOURCE_TYPE" value="17" enum="PropertyHint"> + <constant name="PROPERTY_HINT_RESOURCE_TYPE" value="16" enum="PropertyHint"> Hints that a property is an instance of a [Resource]-derived type, optionally specified via the hint string (e.g. [code]"Texture2D"[/code]). Editing it will show a popup menu of valid resource types to instantiate. </constant> - <constant name="PROPERTY_HINT_MULTILINE_TEXT" value="18" enum="PropertyHint"> + <constant name="PROPERTY_HINT_MULTILINE_TEXT" value="17" enum="PropertyHint"> Hints that a string property is text with line breaks. Editing it will show a text input field where line breaks can be typed. </constant> - <constant name="PROPERTY_HINT_PLACEHOLDER_TEXT" value="19" enum="PropertyHint"> + <constant name="PROPERTY_HINT_PLACEHOLDER_TEXT" value="18" enum="PropertyHint"> Hints that a string property should have a placeholder text visible on its input field, whenever the property is empty. The hint string is the placeholder text to use. </constant> - <constant name="PROPERTY_HINT_COLOR_NO_ALPHA" value="20" enum="PropertyHint"> + <constant name="PROPERTY_HINT_COLOR_NO_ALPHA" value="19" enum="PropertyHint"> Hints that a color property should be edited without changing its alpha component, i.e. only R, G and B channels are edited. </constant> - <constant name="PROPERTY_HINT_IMAGE_COMPRESS_LOSSY" value="21" enum="PropertyHint"> + <constant name="PROPERTY_HINT_IMAGE_COMPRESS_LOSSY" value="20" enum="PropertyHint"> Hints that an image is compressed using lossy compression. </constant> - <constant name="PROPERTY_HINT_IMAGE_COMPRESS_LOSSLESS" value="22" enum="PropertyHint"> + <constant name="PROPERTY_HINT_IMAGE_COMPRESS_LOSSLESS" value="21" enum="PropertyHint"> Hints that an image is compressed using lossless compression. </constant> <constant name="PROPERTY_USAGE_STORAGE" value="1" enum="PropertyUsageFlags"> @@ -1420,6 +1420,9 @@ <constant name="PROPERTY_USAGE_CATEGORY" value="256" enum="PropertyUsageFlags"> Used to categorize properties together in the editor. </constant> + <constant name="PROPERTY_USAGE_SUBGROUP" value="512" enum="PropertyUsageFlags"> + Used to group properties together in the editor in a subgroup (under a group). + </constant> <constant name="PROPERTY_USAGE_NO_INSTANCE_STATE" value="2048" enum="PropertyUsageFlags"> The property does not save its state in [PackedScene]. </constant> diff --git a/doc/classes/AnimatedTexture.xml b/doc/classes/AnimatedTexture.xml index 80b910aaa7..285e0d5f39 100644 --- a/doc/classes/AnimatedTexture.xml +++ b/doc/classes/AnimatedTexture.xml @@ -61,6 +61,9 @@ </method> </methods> <members> + <member name="current_frame" type="int" setter="set_current_frame" getter="get_current_frame"> + Sets the currently visible frame of the texture. + </member> <member name="fps" type="float" setter="set_fps" getter="get_fps" default="4.0"> Animation speed in frames per second. This value defines the default time interval between two frames of the animation, and thus the overall duration of the animation loop based on the [member frames] property. A value of 0 means no predefined number of frames per second, the animation will play according to each frame's frame delay (see [method set_frame_delay]). For example, an animation with 8 frames, no frame delay and a [code]fps[/code] value of 2 will run for 4 seconds, with each frame lasting 0.5 seconds. @@ -68,6 +71,12 @@ <member name="frames" type="int" setter="set_frames" getter="get_frames" default="1"> 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 for the animation to take new frames into account. The maximum number of frames is [constant MAX_FRAMES]. </member> + <member name="oneshot" type="bool" setter="set_oneshot" getter="get_oneshot" default="false"> + 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]. + </member> </members> <constants> <constant name="MAX_FRAMES" value="256"> diff --git a/doc/classes/Area2D.xml b/doc/classes/Area2D.xml index 0c1317f19d..4190cbe6b9 100644 --- a/doc/classes/Area2D.xml +++ b/doc/classes/Area2D.xml @@ -29,14 +29,14 @@ </description> </method> <method name="get_overlapping_areas" qualifiers="const"> - <return type="Array"> + <return type="Area2D[]"> </return> <description> Returns a list of intersecting [Area2D]s. For performance reasons (collisions are all processed at the same time) this list is modified once during the physics step, not immediately after objects are moved. Consider using signals instead. </description> </method> <method name="get_overlapping_bodies" qualifiers="const"> - <return type="Array"> + <return type="Node2D[]"> </return> <description> Returns a list of intersecting [PhysicsBody2D]s. For performance reasons (collisions are all processed at the same time) this list is modified once during the physics step, not immediately after objects are moved. Consider using signals instead. diff --git a/doc/classes/Area3D.xml b/doc/classes/Area3D.xml index 1adfc878e2..a94cecd879 100644 --- a/doc/classes/Area3D.xml +++ b/doc/classes/Area3D.xml @@ -28,14 +28,14 @@ </description> </method> <method name="get_overlapping_areas" qualifiers="const"> - <return type="Array"> + <return type="Area3D[]"> </return> <description> Returns a list of intersecting [Area3D]s. For performance reasons (collisions are all processed at the same time) this list is modified once during the physics step, not immediately after objects are moved. Consider using signals instead. </description> </method> <method name="get_overlapping_bodies" qualifiers="const"> - <return type="Array"> + <return type="Node3D[]"> </return> <description> Returns a list of intersecting [PhysicsBody3D]s. For performance reasons (collisions are all processed at the same time) this list is modified once during the physics step, not immediately after objects are moved. Consider using signals instead. diff --git a/doc/classes/ArrayMesh.xml b/doc/classes/ArrayMesh.xml index 9e742ea581..b45716544a 100644 --- a/doc/classes/ArrayMesh.xml +++ b/doc/classes/ArrayMesh.xml @@ -22,6 +22,8 @@ m.mesh = arr_mesh [/codeblock] The [MeshInstance3D] is ready to be added to the [SceneTree] to be shown. + See also [ImmediateGeometry3D], [MeshDataTool] and [SurfaceTool] for procedural geometry generation. + [b]Note:[/b] Godot uses clockwise [url=https://learnopengl.com/Advanced-OpenGL/Face-culling]winding order[/url] for front faces of triangle primitive modes. </description> <tutorials> <link>https://docs.godotengine.org/en/latest/tutorials/content/procedural_geometry/arraymesh.html</link> @@ -56,7 +58,6 @@ Surfaces are created to be rendered using a [code]primitive[/code], which may be any of the types defined in [enum Mesh.PrimitiveType]. (As a note, when using indices, it is recommended to only use points, lines or triangles.) [method Mesh.get_surface_count] will become the [code]surf_idx[/code] for this new surface. The [code]arrays[/code] argument is an array of arrays. See [enum ArrayType] for the values used in this array. For example, [code]arrays[0][/code] is the array of vertices. That first vertex sub-array is always required; the others are optional. 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 vertex order. All sub-arrays must have the same length as the vertex array or be empty, except for [constant ARRAY_INDEX] if it is used. 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. - Godot uses clockwise winding order for front faces of triangle primitive modes. </description> </method> <method name="clear_blend_shapes"> diff --git a/doc/classes/AudioStreamPlayer.xml b/doc/classes/AudioStreamPlayer.xml index eab6505734..dbc3d3e21b 100644 --- a/doc/classes/AudioStreamPlayer.xml +++ b/doc/classes/AudioStreamPlayer.xml @@ -61,7 +61,7 @@ If the audio configuration has more than two speakers, this sets the target channels. See [enum MixTarget] constants. </member> <member name="pitch_scale" type="float" setter="set_pitch_scale" getter="get_pitch_scale" default="1.0"> - Changes the pitch and the tempo of the audio. + The pitch and the tempo of the audio, as a multiplier of the audio sample's sample rate. </member> <member name="playing" type="bool" setter="_set_playing" getter="is_playing" default="false"> If [code]true[/code], audio is playing. diff --git a/doc/classes/AudioStreamPlayer2D.xml b/doc/classes/AudioStreamPlayer2D.xml index fdbef1b89e..844e2316ba 100644 --- a/doc/classes/AudioStreamPlayer2D.xml +++ b/doc/classes/AudioStreamPlayer2D.xml @@ -67,7 +67,7 @@ Maximum distance from which audio is still hearable. </member> <member name="pitch_scale" type="float" setter="set_pitch_scale" getter="get_pitch_scale" default="1.0"> - Changes the pitch and the tempo of the audio. + The pitch and the tempo of the audio, as a multiplier of the audio sample's sample rate. </member> <member name="playing" type="bool" setter="_set_playing" getter="is_playing" default="false"> If [code]true[/code], audio is playing. diff --git a/doc/classes/AudioStreamPlayer3D.xml b/doc/classes/AudioStreamPlayer3D.xml index 3eeb524e9c..bd90e3bd1a 100644 --- a/doc/classes/AudioStreamPlayer3D.xml +++ b/doc/classes/AudioStreamPlayer3D.xml @@ -91,7 +91,7 @@ Decides if audio should pause when source is outside of [member max_distance] range. </member> <member name="pitch_scale" type="float" setter="set_pitch_scale" getter="get_pitch_scale" default="1.0"> - Changes the pitch and the tempo of the audio. + The pitch and the tempo of the audio, as a multiplier of the audio sample's sample rate. </member> <member name="playing" type="bool" setter="_set_playing" getter="is_playing" default="false"> If [code]true[/code], audio is playing. diff --git a/doc/classes/AudioStreamSample.xml b/doc/classes/AudioStreamSample.xml index 6d99433c90..c12e1bd05c 100644 --- a/doc/classes/AudioStreamSample.xml +++ b/doc/classes/AudioStreamSample.xml @@ -30,13 +30,13 @@ Audio format. See [enum Format] constants for values. </member> <member name="loop_begin" type="int" setter="set_loop_begin" getter="get_loop_begin" default="0"> - Loop start in bytes. + 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. </member> <member name="loop_end" type="int" setter="set_loop_end" getter="get_loop_end" default="0"> - Loop end in bytes. + 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. </member> <member name="loop_mode" type="int" setter="set_loop_mode" getter="get_loop_mode" enum="AudioStreamSample.LoopMode" default="0"> - Loop mode. See [enum LoopMode] constants for values. + The loop mode. This information will be imported automatically from the WAV file if present. See [enum LoopMode] constants for values. </member> <member name="mix_rate" type="int" setter="set_mix_rate" getter="get_mix_rate" default="44100"> The sample rate for mixing this audio. @@ -59,13 +59,13 @@ Audio does not loop. </constant> <constant name="LOOP_FORWARD" value="1" enum="LoopMode"> - Audio loops the data between [member loop_begin] and [member loop_end] playing forward only. + Audio loops the data between [member loop_begin] and [member loop_end], playing forward only. </constant> <constant name="LOOP_PING_PONG" value="2" enum="LoopMode"> - Audio loops the data between [member loop_begin] and [member loop_end] playing back and forth. + Audio loops the data between [member loop_begin] and [member loop_end], playing back and forth. </constant> <constant name="LOOP_BACKWARD" value="3" enum="LoopMode"> - Audio loops the data between [member loop_begin] and [member loop_end] playing backward only. + Audio loops the data between [member loop_begin] and [member loop_end], playing backward only. </constant> </constants> </class> diff --git a/doc/classes/BackBufferCopy.xml b/doc/classes/BackBufferCopy.xml index 1f7554f978..7cc6a5613b 100644 --- a/doc/classes/BackBufferCopy.xml +++ b/doc/classes/BackBufferCopy.xml @@ -5,6 +5,7 @@ </brief_description> <description> Node for back-buffering the currently-displayed screen. The region defined 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. + [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. </description> <tutorials> </tutorials> diff --git a/doc/classes/BaseButton.xml b/doc/classes/BaseButton.xml index 2147b2b4b0..5e908b0e53 100644 --- a/doc/classes/BaseButton.xml +++ b/doc/classes/BaseButton.xml @@ -60,6 +60,7 @@ </member> <member name="keep_pressed_outside" type="bool" setter="set_keep_pressed_outside" getter="is_keep_pressed_outside" default="false"> If [code]true[/code], the button stays pressed when moving the cursor outside the button while pressing it. + [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. </member> <member name="pressed" type="bool" setter="set_pressed" getter="is_pressed" default="false"> If [code]true[/code], the button's state is pressed. Means the button is pressed down or toggled (if [member toggle_mode] is active). diff --git a/doc/classes/BaseMaterial3D.xml b/doc/classes/BaseMaterial3D.xml index bffaf91e1d..76abc31451 100644 --- a/doc/classes/BaseMaterial3D.xml +++ b/doc/classes/BaseMaterial3D.xml @@ -108,6 +108,15 @@ <member name="ao_texture_channel" type="int" setter="set_ao_texture_channel" getter="get_ao_texture_channel" enum="BaseMaterial3D.TextureChannel"> Specifies the channel of the [member ao_texture] in which the ambient occlusion information is stored. This is useful when you store the information for multiple effects in a single texture. For example if you stored metallic in the red channel, roughness in the blue, and ambient occlusion in the green you could reduce the number of textures you use. </member> + <member name="backlight" type="Color" setter="set_backlight" getter="get_backlight"> + The color used by the backlight effect. Represents the light passing through an object. + </member> + <member name="backlight_enabled" type="bool" setter="set_feature" getter="get_feature" default="false"> + If [code]true[/code], the backlight effect is enabled. + </member> + <member name="backlight_texture" type="Texture2D" setter="set_texture" getter="get_texture"> + Texture used to control the backlight effect per-pixel. Added to [member backlight]. + </member> <member name="billboard_keep_scale" type="bool" setter="set_flag" getter="get_flag" default="false"> 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]. </member> @@ -296,6 +305,7 @@ Specifies the channel of the [member ao_texture] in which the ambient occlusion information is stored. This is useful when you store the information for multiple effects in a single texture. For example if you stored metallic in the red channel, roughness in the blue, and ambient occlusion in the green you could reduce the number of textures you use. </member> <member name="shading_mode" type="int" setter="set_shading_mode" getter="get_shading_mode" enum="BaseMaterial3D.ShadingMode" default="1"> + Sets whether the shading takes place per-pixel or per-vertex. Per-vertex lighting is faster, making it the best choice for mobile applications, however it looks considerably worse than per-pixel. </member> <member name="shadow_to_opacity" type="bool" setter="set_flag" getter="get_flag" default="false"> If [code]true[/code], enables the "shadow to opacity" render mode where lighting modifies the alpha so shadowed areas are opaque and non-shadowed areas are transparent. Useful for overlaying shadows onto a camera feed in AR. @@ -306,27 +316,33 @@ <member name="subsurf_scatter_enabled" type="bool" setter="set_feature" getter="get_feature" default="false"> If [code]true[/code], subsurface scattering is enabled. Emulates light that penetrates an object's surface, is scattered, and then emerges. </member> + <member name="subsurf_scatter_skin_mode" type="bool" setter="set_flag" getter="get_flag"> + If [code]true[/code], subsurface scattering will use a special mode optimized for the color and density of human skin. + </member> <member name="subsurf_scatter_strength" type="float" setter="set_subsurface_scattering_strength" getter="get_subsurface_scattering_strength"> The strength of the subsurface scattering effect. </member> <member name="subsurf_scatter_texture" type="Texture2D" setter="set_texture" getter="get_texture"> Texture used to control the subsurface scattering strength. Stored in the red texture channel. Multiplied by [member subsurf_scatter_strength]. </member> + <member name="subsurf_scatter_transmittance_boost" type="float" setter="set_transmittance_boost" getter="get_transmittance_boost"> + </member> + <member name="subsurf_scatter_transmittance_color" type="Color" setter="set_transmittance_color" getter="get_transmittance_color"> + </member> + <member name="subsurf_scatter_transmittance_curve" type="float" setter="set_transmittance_curve" getter="get_transmittance_curve"> + </member> + <member name="subsurf_scatter_transmittance_depth" type="float" setter="set_transmittance_depth" getter="get_transmittance_depth"> + </member> + <member name="subsurf_scatter_transmittance_enabled" type="bool" setter="set_feature" getter="get_feature"> + </member> + <member name="subsurf_scatter_transmittance_texture" type="Texture2D" setter="set_texture" getter="get_texture"> + </member> <member name="texture_filter" type="int" setter="set_texture_filter" getter="get_texture_filter" enum="BaseMaterial3D.TextureFilter" default="3"> Filter flags for the texture. See [enum TextureFilter] for options. </member> <member name="texture_repeat" type="bool" setter="set_flag" getter="get_flag" default="true"> Repeat flags for the texture. See [enum TextureFilter] for options. </member> - <member name="transmission" type="Color" setter="set_transmission" getter="get_transmission"> - The color used by the transmission effect. Represents the light passing through an object. - </member> - <member name="transmission_enabled" type="bool" setter="set_feature" getter="get_feature" default="false"> - If [code]true[/code], the transmission effect is enabled. - </member> - <member name="transmission_texture" type="Texture2D" setter="set_texture" getter="get_texture"> - Texture used to control the transmission effect per-pixel. Added to [member transmission]. - </member> <member name="transparency" type="int" setter="set_transparency" getter="get_transparency" enum="BaseMaterial3D.Transparency" default="0"> If [code]true[/code], transparency is enabled on the body. See also [member blend_mode]. </member> @@ -405,39 +421,47 @@ <constant name="TEXTURE_SUBSURFACE_SCATTERING" value="10" enum="TextureParam"> Texture specifying per-pixel subsurface scattering. </constant> - <constant name="TEXTURE_TRANSMISSION" value="11" enum="TextureParam"> - Texture specifying per-pixel transmission color. + <constant name="TEXTURE_SUBSURFACE_TRANSMITTANCE" value="11" enum="TextureParam"> + Texture specifying per-pixel transmittance for subsurface scattering. + </constant> + <constant name="TEXTURE_BACKLIGHT" value="12" enum="TextureParam"> + Texture specifying per-pixel backlight color. </constant> - <constant name="TEXTURE_REFRACTION" value="12" enum="TextureParam"> + <constant name="TEXTURE_REFRACTION" value="13" enum="TextureParam"> Texture specifying per-pixel refraction strength. </constant> - <constant name="TEXTURE_DETAIL_MASK" value="13" enum="TextureParam"> + <constant name="TEXTURE_DETAIL_MASK" value="14" enum="TextureParam"> Texture specifying per-pixel detail mask blending value. </constant> - <constant name="TEXTURE_DETAIL_ALBEDO" value="14" enum="TextureParam"> + <constant name="TEXTURE_DETAIL_ALBEDO" value="15" enum="TextureParam"> Texture specifying per-pixel detail color. </constant> - <constant name="TEXTURE_DETAIL_NORMAL" value="15" enum="TextureParam"> + <constant name="TEXTURE_DETAIL_NORMAL" value="16" enum="TextureParam"> Texture specifying per-pixel detail normal. </constant> - <constant name="TEXTURE_ORM" value="16" enum="TextureParam"> + <constant name="TEXTURE_ORM" value="17" enum="TextureParam"> + Texture holding ambient occlusion, roughness, and metallic. </constant> - <constant name="TEXTURE_MAX" value="17" enum="TextureParam"> + <constant name="TEXTURE_MAX" value="18" enum="TextureParam"> Represents the size of the [enum TextureParam] enum. </constant> <constant name="TEXTURE_FILTER_NEAREST" value="0" enum="TextureFilter"> The texture filter reads from the nearest pixel only. The simplest and fastest method of filtering, but the texture will look pixelized. </constant> <constant name="TEXTURE_FILTER_LINEAR" value="1" enum="TextureFilter"> - 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. </constant> <constant name="TEXTURE_FILTER_NEAREST_WITH_MIPMAPS" value="2" enum="TextureFilter"> + The texture filter reads from the nearest pixel in the nearest mipmap. The fastest way to read from textures with mipmaps. </constant> <constant name="TEXTURE_FILTER_LINEAR_WITH_MIPMAPS" value="3" enum="TextureFilter"> + 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. </constant> <constant name="TEXTURE_FILTER_NEAREST_WITH_MIPMAPS_ANISOTROPIC" value="4" enum="TextureFilter"> + 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. </constant> <constant name="TEXTURE_FILTER_LINEAR_WITH_MIPMAPS_ANISOTROPIC" value="5" enum="TextureFilter"> + 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. </constant> <constant name="TEXTURE_FILTER_MAX" value="6" enum="TextureFilter"> Represents the size of the [enum TextureFilter] enum. @@ -455,8 +479,10 @@ The material will use the texture's alpha values for transparency. </constant> <constant name="TRANSPARENCY_ALPHA_SCISSOR" value="2" enum="Transparency"> + The material will cut off all values below a threshold, the rest will remain opaque. </constant> <constant name="TRANSPARENCY_ALPHA_DEPTH_PRE_PASS" value="3" enum="Transparency"> + The material will use the texture's alpha value for transparency, but will still be rendered in the pre-pass. </constant> <constant name="TRANSPARENCY_MAX" value="4" enum="Transparency"> Represents the size of the [enum Transparency] enum. @@ -492,20 +518,24 @@ Constant for setting [member ao_enabled]. </constant> <constant name="FEATURE_HEIGHT_MAPPING" value="6" enum="Feature"> + Constant for setting [member heightmap_enabled]. </constant> - <constant name="FEATURE_SUBSURACE_SCATTERING" value="7" enum="Feature"> + <constant name="FEATURE_SUBSURFACE_SCATTERING" value="7" enum="Feature"> Constant for setting [member subsurf_scatter_enabled]. </constant> - <constant name="FEATURE_TRANSMISSION" value="8" enum="Feature"> - Constant for setting [member transmission_enabled]. + <constant name="FEATURE_SUBSURFACE_TRANSMITTANCE" value="8" enum="Feature"> + Constant for setting [member subsurf_scatter_transmittance_enabled]. </constant> - <constant name="FEATURE_REFRACTION" value="9" enum="Feature"> + <constant name="FEATURE_BACKLIGHT" value="9" enum="Feature"> + Constant for setting [member backlight_enabled]. + </constant> + <constant name="FEATURE_REFRACTION" value="10" enum="Feature"> Constant for setting [member refraction_enabled]. </constant> - <constant name="FEATURE_DETAIL" value="10" enum="Feature"> + <constant name="FEATURE_DETAIL" value="11" enum="Feature"> Constant for setting [member detail_enabled]. </constant> - <constant name="FEATURE_MAX" value="11" enum="Feature"> + <constant name="FEATURE_MAX" value="12" enum="Feature"> Represents the size of the [enum Feature] enum. </constant> <constant name="BLEND_MODE_MIX" value="0" enum="BlendMode"> @@ -587,11 +617,15 @@ Enables the shadow to opacity feature. </constant> <constant name="FLAG_USE_TEXTURE_REPEAT" value="16" enum="Flags"> + 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. </constant> <constant name="FLAG_INVERT_HEIGHTMAP" value="17" enum="Flags"> Invert values read from a depth texture to convert them to height values (heightmap). </constant> - <constant name="FLAG_MAX" value="18" enum="Flags"> + <constant name="FLAG_SUBSURFACE_MODE_SKIN" value="18" enum="Flags"> + Enables the skin mode for subsurface scattering which is used to improve the look of subsurface scattering when used for human skin. + </constant> + <constant name="FLAG_MAX" value="19" enum="Flags"> Represents the size of the [enum Flags] enum. </constant> <constant name="DIFFUSE_BURLEY" value="0" enum="DiffuseMode"> diff --git a/doc/classes/Camera2D.xml b/doc/classes/Camera2D.xml index 73892481e6..ad49216b34 100644 --- a/doc/classes/Camera2D.xml +++ b/doc/classes/Camera2D.xml @@ -5,7 +5,8 @@ </brief_description> <description> Camera node for 2D scenes. It forces the screen (current layer) to scroll following this node. This makes it easier (and faster) to program scrollable scenes than manually changing the position of [CanvasItem]-based nodes. - 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]. + 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, 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]). + 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. </description> <tutorials> </tutorials> diff --git a/doc/classes/CameraEffects.xml b/doc/classes/CameraEffects.xml index 23f0a1c7af..ea9ab85b80 100644 --- a/doc/classes/CameraEffects.xml +++ b/doc/classes/CameraEffects.xml @@ -1,8 +1,11 @@ <?xml version="1.0" encoding="UTF-8" ?> <class name="CameraEffects" inherits="Resource" version="4.0"> <brief_description> + Contains camera-specific effects such as depth of field and exposure override. </brief_description> <description> + Contains camera-specific effects such as depth of field and exposure override. + See also [Environment] for general 3D environment settings. </description> <tutorials> </tutorials> @@ -10,22 +13,31 @@ </methods> <members> <member name="dof_blur_amount" type="float" setter="set_dof_blur_amount" getter="get_dof_blur_amount" default="0.1"> + 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. </member> <member name="dof_blur_far_distance" type="float" setter="set_dof_blur_far_distance" getter="get_dof_blur_far_distance" default="10.0"> + The distance from the camera where the far blur effect affects the rendering. </member> <member name="dof_blur_far_enabled" type="bool" setter="set_dof_blur_far_enabled" getter="is_dof_blur_far_enabled" default="false"> + 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. </member> <member name="dof_blur_far_transition" type="float" setter="set_dof_blur_far_transition" getter="get_dof_blur_far_transition" default="5.0"> + The length of the transition between the no-blur area and far blur. </member> <member name="dof_blur_near_distance" type="float" setter="set_dof_blur_near_distance" getter="get_dof_blur_near_distance" default="2.0"> + Distance from the camera where the near blur effect affects the rendering. </member> <member name="dof_blur_near_enabled" type="bool" setter="set_dof_blur_near_enabled" getter="is_dof_blur_near_enabled" default="false"> + 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. </member> <member name="dof_blur_near_transition" type="float" setter="set_dof_blur_near_transition" getter="get_dof_blur_near_transition" default="1.0"> + The length of the transition between the near blur and no-blur area. </member> <member name="override_exposure" type="float" setter="set_override_exposure" getter="get_override_exposure" default="1.0"> + 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]. </member> <member name="override_exposure_enable" type="bool" setter="set_override_exposure_enabled" getter="is_override_exposure_enabled" default="false"> + If [code]true[/code], overrides the manual or automatic exposure defined in the [Environment] with the value in [member override_exposure]. </member> </members> <constants> diff --git a/doc/classes/CameraFeed.xml b/doc/classes/CameraFeed.xml index 3232f5970c..4fc124592f 100644 --- a/doc/classes/CameraFeed.xml +++ b/doc/classes/CameraFeed.xml @@ -4,7 +4,7 @@ A camera feed gives you access to a single physical camera attached to your device. </brief_description> <description> - 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. + 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. See also [CameraServer]. [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 background. </description> <tutorials> diff --git a/doc/classes/CameraServer.xml b/doc/classes/CameraServer.xml index 82d1faf716..e00dc031dc 100644 --- a/doc/classes/CameraServer.xml +++ b/doc/classes/CameraServer.xml @@ -6,6 +6,7 @@ <description> The [CameraServer] keeps track of different cameras accessible in Godot. These are external cameras such as webcams or the cameras on your phone. It is notably used to provide AR modules with a video feed from the camera. + [b]Note:[/b] This class is currently only implemented on macOS and iOS. On other platforms, no [CameraFeed]s will be available. </description> <tutorials> </tutorials> @@ -16,7 +17,7 @@ <argument index="0" name="feed" type="CameraFeed"> </argument> <description> - Adds a camera feed to the camera server. + Adds the camera [code]feed[/code] to the camera server. </description> </method> <method name="feeds"> @@ -32,7 +33,7 @@ <argument index="0" name="index" type="int"> </argument> <description> - Returns the [CameraFeed] with this id. + Returns the [CameraFeed] corresponding to the camera with the given [code]index[/code]. </description> </method> <method name="get_feed_count"> @@ -48,7 +49,7 @@ <argument index="0" name="feed" type="CameraFeed"> </argument> <description> - Removes a [CameraFeed]. + Removes the specified camera [code]feed[/code]. </description> </method> </methods> @@ -57,14 +58,14 @@ <argument index="0" name="id" type="int"> </argument> <description> - Emitted when a [CameraFeed] is added (e.g. webcam is plugged in). + Emitted when a [CameraFeed] is added (e.g. a webcam is plugged in). </description> </signal> <signal name="camera_feed_removed"> <argument index="0" name="id" type="int"> </argument> <description> - Emitted when a [CameraFeed] is removed (e.g. webcam is unplugged). + Emitted when a [CameraFeed] is removed (e.g. a webcam is unplugged). </description> </signal> </signals> @@ -73,7 +74,7 @@ The RGBA camera image. </constant> <constant name="FEED_YCBCR_IMAGE" value="0" enum="FeedImage"> - The YCbCr camera image. + The [url=https://en.wikipedia.org/wiki/YCbCr]YCbCr[/url] camera image. </constant> <constant name="FEED_Y_IMAGE" value="0" enum="FeedImage"> The Y component camera image. diff --git a/doc/classes/CanvasItem.xml b/doc/classes/CanvasItem.xml index f2ce2a6fb9..38e4453cf2 100644 --- a/doc/classes/CanvasItem.xml +++ b/doc/classes/CanvasItem.xml @@ -9,6 +9,7 @@ Canvas items are drawn in tree order. By default, children are on top of their parents so a root [CanvasItem] will be drawn behind everything. This behavior can be changed on a per-item basis. A [CanvasItem] can also be hidden, which will also hide its children. It provides many ways to change parameters such as modulation (for itself and its children) and self modulation (only for itself), as well as its blend mode. Ultimately, a transform notification can be requested, which will notify the node that its global position changed in case the parent tree changed. + [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]. </description> <tutorials> <link>https://docs.godotengine.org/en/latest/tutorials/2d/2d_transforms.html</link> diff --git a/doc/classes/Color.xml b/doc/classes/Color.xml index 8587acade3..1af5c87532 100644 --- a/doc/classes/Color.xml +++ b/doc/classes/Color.xml @@ -5,7 +5,8 @@ </brief_description> <description> A color is represented by red, green, and blue [code](r, g, b)[/code] components. Additionally, [code]a[/code] represents the alpha component, often used for transparency. Values are in floating-point and usually range from 0 to 1. Some properties (such as [member CanvasItem.modulate]) may accept values greater than 1. - You can also create a color from standardized color names by using [method @GDScript.ColorN] or directly using the color constants defined here. The standardized color set is based on the [url=https://en.wikipedia.org/wiki/X11_color_names]X11 color names[/url]. + You can also create a color from standardized color names by using [method @GDScript.ColorN] or directly using the color constants defined here. The standardized color set is based on the [url=https://en.wikipedia.org/wiki/X11_color_names]X11 color names[/url]. + If you want to supply values in a range of 0 to 255, you should use [method @GDScript.Color8]. </description> <tutorials> </tutorials> @@ -148,32 +149,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/Control.xml b/doc/classes/Control.xml index 85a75fda37..9dbb843902 100644 --- a/doc/classes/Control.xml +++ b/doc/classes/Control.xml @@ -798,11 +798,11 @@ Tells Godot which node it should give keyboard focus to if the user presses the top arrow on the keyboard or top on a gamepad by default. You can change the key by editing the [code]ui_top[/code] input action. The node must be a [Control]. If this property is not set, Godot will give focus to the closest [Control] to the bottom of this one. </member> <member name="focus_next" type="NodePath" setter="set_focus_next" getter="get_focus_next" default="NodePath("")"> - 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. + Tells Godot which node it should give keyboard focus to if the user presses [kbd]Tab[/kbd] on a keyboard by default. You can change the key by editing the [code]ui_focus_next[/code] input action. If this property is not set, Godot will select a "best guess" based on surrounding nodes in the scene tree. </member> <member name="focus_previous" type="NodePath" setter="set_focus_previous" getter="get_focus_previous" default="NodePath("")"> - 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. + Tells Godot which node it should give keyboard focus to if the user presses [kbd]Shift + Tab[/kbd] on a keyboard by default. You can change the key by editing the [code]ui_focus_prev[/code] input action. If this property is not set, Godot will select a "best guess" based on surrounding nodes in the scene tree. </member> <member name="grow_horizontal" type="int" setter="set_h_grow_direction" getter="get_h_grow_direction" enum="Control.GrowDirection" default="1"> @@ -838,7 +838,7 @@ Controls whether the control will be able to receive mouse button input events through [method _gui_input] and how these events should be handled. Also controls whether the control can receive the [signal mouse_entered], and [signal mouse_exited] signals. See the constants to learn what each does. </member> <member name="rect_clip_content" type="bool" setter="set_clip_contents" getter="is_clipping_contents" default="false"> - 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. </member> <member name="rect_global_position" type="Vector2" setter="_set_global_position" getter="get_global_position"> The node's global position, relative to the world (usually to the top-left corner of the window). diff --git a/doc/classes/Decal.xml b/doc/classes/Decal.xml new file mode 100644 index 0000000000..f7329d1537 --- /dev/null +++ b/doc/classes/Decal.xml @@ -0,0 +1,111 @@ +<?xml version="1.0" encoding="UTF-8" ?> +<class name="Decal" inherits="VisualInstance3D" version="4.0"> + <brief_description> + Node that projects a texture onto a [MeshInstance3D]. + </brief_description> + <description> + [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. + They are made of an [AABB] and a group of [Texture2D]s specifying [Color], normal, ORM (ambient occlusion, roughness, metallic), and emission. Decals are projected within their [AABB] so altering the orientation of the Decal affects the direction in which they are projected. By default, Decals are projected down (i.e. from positive Y to negative Y). + The [Texture2D]s associated with the Decal are automatically stored in a texture atlas which is used for drawing the decals so all decals can be drawn at once. Godot uses clustered decals, meaning they are stored in cluster data and drawn when the mesh is drawn, they are not drawn as a postprocessing effect after. + </description> + <tutorials> + </tutorials> + <methods> + <method name="get_texture" qualifiers="const"> + <return type="Texture2D"> + </return> + <argument index="0" name="type" type="int" enum="Decal.DecalTexture"> + </argument> + <description> + Returns the [Texture2D] associated with the specified [enum DecalTexture]. This is a convenience method, in most cases you should access the texture directly. + For example, instead of [code]albedo_tex = $Decal.get_texture(Decal.TEXTURE_ALBEDO)[/code], use [code]albedo_tex = $Decal.texture_albedo[/code]. + 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: + [codeblock] + for i in Decal.TEXTURE_MAX: + $NewDecal.set_texture(i, $OldDecal.get_texture(i)) + [/codeblock] + </description> + </method> + <method name="set_texture"> + <return type="void"> + </return> + <argument index="0" name="type" type="int" enum="Decal.DecalTexture"> + </argument> + <argument index="1" name="texture" type="Texture2D"> + </argument> + <description> + Sets the [Texture2D] associated with the specified [enum DecalTexture]. This is a convenience method, in most cases you should access the texture directly. + For example, instead of [code]$Decal.set_texture(Decal.TEXTURE_ALBEDO, albedo_tex)[/code], use [code]$Decal.texture_albedo = albedo_tex[/code]. + 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: + [codeblock] + for i in Decal.TEXTURE_MAX: + $NewDecal.set_texture(i, $OldDecal.get_texture(i)) + [/codeblock] + </description> + </method> + </methods> + <members> + <member name="albedo_mix" type="float" setter="set_albedo_mix" getter="get_albedo_mix" default="1.0"> + Blends the albedo [Color] of the decal with albedo [Color] of the underlying mesh. + </member> + <member name="cull_mask" type="int" setter="set_cull_mask" getter="get_cull_mask" default="1048575"> + 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. + </member> + <member name="distance_fade_begin" type="float" setter="set_distance_fade_begin" getter="get_distance_fade_begin" default="10.0"> + Distance from the camera at which the Decal begins to fade away. + </member> + <member name="distance_fade_enabled" type="bool" setter="set_enable_distance_fade" getter="is_distance_fade_enabled" default="false"> + 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. + </member> + <member name="distance_fade_length" type="float" setter="set_distance_fade_length" getter="get_distance_fade_length" default="1.0"> + Distance over which the Decal fades. The Decal becomes slowly more transparent over this distance and is completely invisible at the end. + </member> + <member name="emission_energy" type="float" setter="set_emission_energy" getter="get_emission_energy" default="1.0"> + Energy multiplier for the emission texture. This will make the decal emit light at a higher intensity. + </member> + <member name="extents" type="Vector3" setter="set_extents" getter="get_extents" default="Vector3( 1, 1, 1 )"> + Sets the size of the [AABB] used by the decal. The AABB goes from [code]-extents[/code] to [code]extents[/code]. + </member> + <member name="lower_fade" type="float" setter="set_lower_fade" getter="get_lower_fade" default="0.3"> + Sets the curve over which the decal will fade as the surface gets further from the center of the [AABB]. + </member> + <member name="modulate" type="Color" setter="set_modulate" getter="get_modulate" default="Color( 1, 1, 1, 1 )"> + Changes the [Color] of the Decal by multiplying it with this value. + </member> + <member name="normal_fade" type="float" setter="set_normal_fade" getter="get_normal_fade" default="0.0"> + 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. + </member> + <member name="texture_albedo" type="Texture2D" setter="set_texture" getter="get_texture"> + [Texture2D] with the base [Color] of the Decal. Either this or the [member texture_emission] must be set for the Decal to be visible. Use the alpha channel like a mask to smoothly blend the edges of the decal with the underlying object. + </member> + <member name="texture_emission" type="Texture2D" setter="set_texture" getter="get_texture"> + [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. + </member> + <member name="texture_normal" type="Texture2D" setter="set_texture" getter="get_texture"> + [Texture2D] with the per-pixel normalmap for the decal. Use this to add extra detail to decals. + </member> + <member name="texture_orm" type="Texture2D" setter="set_texture" getter="get_texture"> + [Texture2D] storing ambient occlusion, roughness, and metallic for the decal. Use this to add extra detail to decals. + </member> + <member name="upper_fade" type="float" setter="set_upper_fade" getter="get_upper_fade" default="0.3"> + Sets the curve over which the decal will fade as the surface gets further from the center of the [AABB]. + </member> + </members> + <constants> + <constant name="TEXTURE_ALBEDO" value="0" enum="DecalTexture"> + [Texture2D] corresponding to [member texture_albedo]. + </constant> + <constant name="TEXTURE_NORMAL" value="1" enum="DecalTexture"> + [Texture2D] corresponding to [member texture_normal]. + </constant> + <constant name="TEXTURE_ORM" value="2" enum="DecalTexture"> + [Texture2D] corresponding to [member texture_orm]. + </constant> + <constant name="TEXTURE_EMISSION" value="3" enum="DecalTexture"> + [Texture2D] corresponding to [member texture_emission]. + </constant> + <constant name="TEXTURE_MAX" value="4" enum="DecalTexture"> + Max size of [enum DecalTexture] enum. + </constant> + </constants> +</class> diff --git a/doc/classes/Dictionary.xml b/doc/classes/Dictionary.xml index 540ebf3931..e982e00d6d 100644 --- a/doc/classes/Dictionary.xml +++ b/doc/classes/Dictionary.xml @@ -4,27 +4,29 @@ Dictionary type. </brief_description> <description> - 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]. - Erasing elements while iterating over them [b]is not supported[/b]. + Dictionary type. Associative container which contains values referenced by 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. + You can define a dictionary by placing a comma-separated list of [code]key: value[/code] pairs in curly braces [code]{}[/code]. + Erasing elements while iterating over them [b]is not supported[/b] and will result in undefined behavior. Creating a dictionary: [codeblock] var my_dir = {} # Creates an empty dictionary. var points_dir = {"White": 50, "Yellow": 75, "Orange": 100} - var my_dir = { + var another_dir = { key1: value1, key2: value2, key3: value3, } [/codeblock] - You can access values of a dictionary by referencing appropriate key in above example [code]points_dir["White"][/code] would return value of 50. + 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). [codeblock] export(String, "White", "Yellow", "Orange") var my_color var points_dir = {"White": 50, "Yellow": 75, "Orange": 100} func _ready(): + # We can't use dot syntax here as `my_color` is a variable. var points = points_dir[my_color] [/codeblock] - 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]. + 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]. Dictionaries can contain more complex data: [codeblock] my_dir = {"First Array": [1, 2, 3, 4]} # Assigns an Array to a String key. @@ -32,13 +34,21 @@ To add a key to an existing dictionary, access it like an existing key and assign to it: [codeblock] var points_dir = {"White": 50, "Yellow": 75, "Orange": 100} - var points_dir["Blue"] = 150 # Add "Blue" as a key and assign 150 as its value. + points_dir["Blue"] = 150 # Add "Blue" as a key and assign 150 as its value. [/codeblock] Finally, dictionaries can contain different types of keys and values in the same dictionary: [codeblock] - var my_dir = {"String Key": 5, 4: [1, 2, 3], 7: "Hello"} # This is a valid dictionary. + # This is a valid dictionary. + # To access the string "Nested value" below, use `my_dir.sub_dir.sub_key` or `my_dir["sub_dir"]["sub_key"]`. + # Indexing styles can be mixed and matched depending on your needs. + var my_dir = { + "String Key": 5, + 4: [1, 2, 3], + 7: "Hello", + "sub_dir": {"sub_key": "Nested value"}, + } [/codeblock] - [b]Note:[/b] Unlike [Array]s you can't compare dictionaries directly: + [b]Note:[/b] Unlike [Array]s, you can't compare dictionaries directly: [codeblock] array1 = [1, 2, 3] array2 = [1, 2, 3] @@ -78,7 +88,7 @@ <argument index="0" name="deep" type="bool" default="false"> </argument> <description> - Creates a copy of the dictionary, and returns it. + 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. </description> </method> <method name="empty"> diff --git a/doc/classes/DirectionalLight3D.xml b/doc/classes/DirectionalLight3D.xml index a5d476f5c8..6c88dcf42e 100644 --- a/doc/classes/DirectionalLight3D.xml +++ b/doc/classes/DirectionalLight3D.xml @@ -12,9 +12,6 @@ <methods> </methods> <members> - <member name="directional_shadow_bias_split_scale" type="float" setter="set_param" getter="get_param" default="0.25"> - 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. - </member> <member name="directional_shadow_blend_splits" type="bool" setter="set_blend_splits" getter="is_blend_splits_enabled" default="false"> If [code]true[/code], shadow detail is sacrificed in exchange for smoother transitions between splits. </member> @@ -22,6 +19,7 @@ Optimizes shadow rendering for detail versus movement. See [enum ShadowDepthRange]. </member> <member name="directional_shadow_fade_start" type="float" setter="set_param" getter="get_param" default="0.8"> + 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. </member> <member name="directional_shadow_max_distance" type="float" setter="set_param" getter="get_param" default="100.0"> The maximum distance for shadow splits. @@ -29,8 +27,8 @@ <member name="directional_shadow_mode" type="int" setter="set_shadow_mode" getter="get_shadow_mode" enum="DirectionalLight3D.ShadowMode" default="2"> The light's shadow rendering algorithm. See [enum ShadowMode]. </member> - <member name="directional_shadow_normal_bias" type="float" setter="set_param" getter="get_param" default="0.8"> - Can be used to fix special cases of self shadowing when objects are perpendicular to the light. + <member name="directional_shadow_pancake_size" type="float" setter="set_param" getter="get_param" default="20.0"> + 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. </member> <member name="directional_shadow_split_1" type="float" setter="set_param" getter="get_param" default="0.1"> The distance from camera to shadow split 1. Relative to [member directional_shadow_max_distance]. Only used when [member directional_shadow_mode] is [code]SHADOW_PARALLEL_2_SPLITS[/code] or [code]SHADOW_PARALLEL_4_SPLITS[/code]. @@ -41,7 +39,6 @@ <member name="directional_shadow_split_3" type="float" setter="set_param" getter="get_param" default="0.5"> 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]. </member> - <member name="shadow_bias" type="float" setter="set_param" getter="get_param" override="true" default="0.1" /> </members> <constants> <constant name="SHADOW_ORTHOGONAL" value="0" enum="ShadowMode"> diff --git a/doc/classes/DynamicFont.xml b/doc/classes/DynamicFont.xml index 29e430b14d..0864c3ba36 100644 --- a/doc/classes/DynamicFont.xml +++ b/doc/classes/DynamicFont.xml @@ -12,6 +12,7 @@ dynamic_font.size = 64 $"Label".set("custom_fonts/font", dynamic_font) [/codeblock] + [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. </description> <tutorials> </tutorials> diff --git a/doc/classes/EditorFeatureProfile.xml b/doc/classes/EditorFeatureProfile.xml index 53db8dd293..eb03d3010f 100644 --- a/doc/classes/EditorFeatureProfile.xml +++ b/doc/classes/EditorFeatureProfile.xml @@ -72,7 +72,7 @@ <argument index="0" name="path" type="String"> </argument> <description> - 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. + 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. </description> </method> <method name="set_disable_class"> diff --git a/doc/classes/EditorFileSystem.xml b/doc/classes/EditorFileSystem.xml index 30e1de1f5e..9bb51af2d0 100644 --- a/doc/classes/EditorFileSystem.xml +++ b/doc/classes/EditorFileSystem.xml @@ -5,6 +5,7 @@ </brief_description> <description> This object holds information of all resources in the filesystem, their types, etc. + [b]Note:[/b] This class shouldn't be instantiated directly. Instead, access the singleton using [method EditorInterface.get_resource_filesystem]. </description> <tutorials> </tutorials> diff --git a/doc/classes/EditorInspector.xml b/doc/classes/EditorInspector.xml index 61d240c1dc..2f62fe9e40 100644 --- a/doc/classes/EditorInspector.xml +++ b/doc/classes/EditorInspector.xml @@ -5,6 +5,7 @@ </brief_description> <description> The editor inspector is by default located on the right-hand side of the 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. + [b]Note:[/b] This class shouldn't be instantiated directly. Instead, access the singleton using [method EditorInterface.get_inspector]. </description> <tutorials> </tutorials> @@ -26,6 +27,12 @@ <description> </description> </signal> + <signal name="property_deleted"> + <argument index="0" name="property" type="String"> + </argument> + <description> + </description> + </signal> <signal name="property_edited"> <argument index="0" name="property" type="String"> </argument> diff --git a/doc/classes/EditorInterface.xml b/doc/classes/EditorInterface.xml index 5e76f90fc4..499c3b8271 100644 --- a/doc/classes/EditorInterface.xml +++ b/doc/classes/EditorInterface.xml @@ -5,6 +5,7 @@ </brief_description> <description> EditorInterface gives you control over Godot editor's window. It allows 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. + [b]Note:[/b] This class shouldn't be instantiated directly. Instead, access the singleton using [method EditorPlugin.get_editor_interface]. </description> <tutorials> </tutorials> diff --git a/doc/classes/EditorProperty.xml b/doc/classes/EditorProperty.xml index 3216541b20..4da3b58b94 100644 --- a/doc/classes/EditorProperty.xml +++ b/doc/classes/EditorProperty.xml @@ -78,6 +78,8 @@ <member name="checked" type="bool" setter="set_checked" getter="is_checked" default="false"> Used by the inspector, when the property is checked. </member> + <member name="deletable" type="bool" setter="set_deletable" getter="is_deletable" default="false"> + </member> <member name="draw_red" type="bool" setter="set_draw_red" getter="is_draw_red" default="false"> Used by the inspector, when the property must draw with error color. </member> @@ -128,6 +130,12 @@ Emitted when a property was checked. Used internally. </description> </signal> + <signal name="property_deleted"> + <argument index="0" name="property" type="StringName"> + </argument> + <description> + </description> + </signal> <signal name="property_keyed"> <argument index="0" name="property" type="StringName"> </argument> diff --git a/doc/classes/EditorResourcePreview.xml b/doc/classes/EditorResourcePreview.xml index aac75c5c8e..0c1d969518 100644 --- a/doc/classes/EditorResourcePreview.xml +++ b/doc/classes/EditorResourcePreview.xml @@ -5,6 +5,7 @@ </brief_description> <description> This object is used to generate previews for resources of files. + [b]Note:[/b] This class shouldn't be instantiated directly. Instead, access the singleton using [method EditorInterface.get_resource_previewer]. </description> <tutorials> </tutorials> diff --git a/doc/classes/EditorScript.xml b/doc/classes/EditorScript.xml index 410301351f..e96044bf48 100644 --- a/doc/classes/EditorScript.xml +++ b/doc/classes/EditorScript.xml @@ -4,7 +4,7 @@ Base script that can be used to add extension functions to the editor. </brief_description> <description> - 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 useful for adding custom in-editor functionality to Godot. For more complex additions, consider using [EditorPlugin]s instead. + 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 [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. [b]Note:[/b] Extending scripts need to have [code]tool[/code] mode enabled. [b]Example script:[/b] [codeblock] diff --git a/doc/classes/EditorSelection.xml b/doc/classes/EditorSelection.xml index caafd3c15f..1ff9744b70 100644 --- a/doc/classes/EditorSelection.xml +++ b/doc/classes/EditorSelection.xml @@ -5,6 +5,7 @@ </brief_description> <description> This object manages the SceneTree selection in the editor. + [b]Note:[/b] This class shouldn't be instantiated directly. Instead, access the singleton using [method EditorInterface.get_selection]. </description> <tutorials> </tutorials> @@ -26,7 +27,7 @@ </description> </method> <method name="get_selected_nodes"> - <return type="Array"> + <return type="Node[]"> </return> <description> Gets the list of selected nodes. diff --git a/doc/classes/EditorSettings.xml b/doc/classes/EditorSettings.xml index 73ef807c5f..19921ff5c8 100644 --- a/doc/classes/EditorSettings.xml +++ b/doc/classes/EditorSettings.xml @@ -11,6 +11,7 @@ settings.get(prop) list_of_settings = settings.get_property_list() [/codeblock] + [b]Note:[/b] This class shouldn't be instantiated directly. Instead, access the singleton using [method EditorInterface.get_editor_settings]. </description> <tutorials> </tutorials> diff --git a/doc/classes/Environment.xml b/doc/classes/Environment.xml index 6f55bfc229..3642d92771 100644 --- a/doc/classes/Environment.xml +++ b/doc/classes/Environment.xml @@ -265,18 +265,25 @@ Represents the size of the [enum BGMode] enum. </constant> <constant name="AMBIENT_SOURCE_BG" value="0" enum="AmbientSource"> + Gather ambient light from whichever source is specified as the background. </constant> <constant name="AMBIENT_SOURCE_DISABLED" value="1" enum="AmbientSource"> + Disable ambient light. </constant> <constant name="AMBIENT_SOURCE_COLOR" value="2" enum="AmbientSource"> + Specify a specific [Color] for ambient light. </constant> <constant name="AMBIENT_SOURCE_SKY" value="3" enum="AmbientSource"> + Gather ambient light from the [Sky] regardless of what the background is. </constant> <constant name="REFLECTION_SOURCE_BG" value="0" enum="ReflectionSource"> + Use the background for reflections. </constant> <constant name="REFLECTION_SOURCE_DISABLED" value="1" enum="ReflectionSource"> + Disable reflections. </constant> <constant name="REFLECTION_SOURCE_SKY" value="2" enum="ReflectionSource"> + Use the [Sky] for reflections regardless of what the background is. </constant> <constant name="GLOW_BLEND_MODE_ADDITIVE" value="0" enum="GlowBlendMode"> Additive glow blending mode. Mostly used for particles, glows (bloom), lens flare, bright sources. @@ -291,6 +298,7 @@ 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. </constant> <constant name="GLOW_BLEND_MODE_MIX" value="4" enum="GlowBlendMode"> + Mixes the glow with the underlying color to avoid increasing brightness as much while still maintaining a glow effect. </constant> <constant name="TONE_MAPPER_LINEAR" value="0" enum="ToneMapper"> Linear tonemapper operator. Reads the linear data and passes it on unmodified. @@ -314,7 +322,7 @@ 2×2 blur for the screen-space ambient occlusion effect. </constant> <constant name="SSAO_BLUR_3x3" value="3" enum="SSAOBlur"> - 3×3 blur for the screen-space ambient occlusion effect (slowest). + 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. </constant> </constants> </class> diff --git a/doc/classes/File.xml b/doc/classes/File.xml index e9477517cf..17c65731ff 100644 --- a/doc/classes/File.xml +++ b/doc/classes/File.xml @@ -297,6 +297,7 @@ </argument> <description> Stores an integer as 16 bits in the file. + [b]Note:[/b] The [code]value[/code] should lie in the interval [code][0, 2^16 - 1][/code]. </description> </method> <method name="store_32"> @@ -306,6 +307,7 @@ </argument> <description> Stores an integer as 32 bits in the file. + [b]Note:[/b] The [code]value[/code] should lie in the interval [code][0, 2^32 - 1][/code]. </description> </method> <method name="store_64"> @@ -315,6 +317,7 @@ </argument> <description> Stores an integer as 64 bits in the file. + [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). </description> </method> <method name="store_8"> @@ -324,6 +327,7 @@ </argument> <description> Stores an integer as 8 bits in the file. + [b]Note:[/b] The [code]value[/code] should lie in the interval [code][0, 255][/code]. </description> </method> <method name="store_buffer"> diff --git a/doc/classes/GeometryInstance3D.xml b/doc/classes/GeometryInstance3D.xml index 7df5f0ea50..518a172973 100644 --- a/doc/classes/GeometryInstance3D.xml +++ b/doc/classes/GeometryInstance3D.xml @@ -18,6 +18,14 @@ Returns the [enum GeometryInstance3D.Flags] that have been set for this object. </description> </method> + <method name="get_shader_instance_uniform" qualifiers="const"> + <return type="Variant"> + </return> + <argument index="0" name="uniform" type="StringName"> + </argument> + <description> + </description> + </method> <method name="set_custom_aabb"> <return type="void"> </return> @@ -38,6 +46,16 @@ Sets the [enum GeometryInstance3D.Flags] specified. See [enum GeometryInstance3D.Flags] for options. </description> </method> + <method name="set_shader_instance_uniform"> + <return type="void"> + </return> + <argument index="0" name="uniform" type="StringName"> + </argument> + <argument index="1" name="value" type="Variant"> + </argument> + <description> + </description> + </method> </methods> <members> <member name="cast_shadow" type="int" setter="set_cast_shadows_setting" getter="get_cast_shadows_setting" enum="GeometryInstance3D.ShadowCastingSetting" default="1"> diff --git a/doc/classes/GraphEdit.xml b/doc/classes/GraphEdit.xml index c41ffd4bff..9d00ffe233 100644 --- a/doc/classes/GraphEdit.xml +++ b/doc/classes/GraphEdit.xml @@ -240,7 +240,7 @@ </signal> <signal name="copy_nodes_request"> <description> - Emitted when the user presses [code]Ctrl + C[/code]. + Emitted when the user presses [kbd]Ctrl + C[/kbd]. </description> </signal> <signal name="delete_nodes_request"> @@ -273,9 +273,15 @@ Emitted when a GraphNode is selected. </description> </signal> + <signal name="node_unselected"> + <argument index="0" name="node" type="Node"> + </argument> + <description> + </description> + </signal> <signal name="paste_nodes_request"> <description> - Emitted when the user presses [code]Ctrl + V[/code]. + Emitted when the user presses [kbd]Ctrl + V[/kbd]. </description> </signal> <signal name="popup_request"> diff --git a/doc/classes/HSlider.xml b/doc/classes/HSlider.xml index 2738958058..afe9d10d2e 100644 --- a/doc/classes/HSlider.xml +++ b/doc/classes/HSlider.xml @@ -19,6 +19,8 @@ <theme_item name="grabber_area" type="StyleBox"> The background of the area to the left of the grabber. </theme_item> + <theme_item name="grabber_area_highlight" type="StyleBox"> + </theme_item> <theme_item name="grabber_disabled" type="Texture2D"> The texture for the grabber when it's disabled. </theme_item> diff --git a/doc/classes/IP_Unix.xml b/doc/classes/IP_Unix.xml deleted file mode 100644 index 79cdf2ce08..0000000000 --- a/doc/classes/IP_Unix.xml +++ /dev/null @@ -1,15 +0,0 @@ -<?xml version="1.0" encoding="UTF-8" ?> -<class name="IP_Unix" inherits="IP" version="4.0"> - <brief_description> - UNIX IP support. See [IP]. - </brief_description> - <description> - UNIX-specific implementation of IP support functions. See [IP]. - </description> - <tutorials> - </tutorials> - <methods> - </methods> - <constants> - </constants> -</class> diff --git a/doc/classes/Image.xml b/doc/classes/Image.xml index f541b0ae66..99253e8840 100644 --- a/doc/classes/Image.xml +++ b/doc/classes/Image.xml @@ -5,6 +5,7 @@ </brief_description> <description> 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]. + [b]Note:[/b] The maximum image size is 16384×16384 pixels due to graphics hardware limitations. Larger images will fail to import. </description> <tutorials> </tutorials> @@ -349,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/ImageTexture.xml b/doc/classes/ImageTexture.xml index 1578783b8b..d122d74e85 100644 --- a/doc/classes/ImageTexture.xml +++ b/doc/classes/ImageTexture.xml @@ -5,6 +5,7 @@ </brief_description> <description> A [Texture2D] based on an [Image]. Can be created from an [Image] with [method create_from_image]. + [b]Note:[/b] The maximum image size is 16384×16384 pixels due to graphics hardware limitations. Larger images will fail to import. </description> <tutorials> </tutorials> diff --git a/doc/classes/ImmediateGeometry3D.xml b/doc/classes/ImmediateGeometry3D.xml index 1c0831c922..d2d663847f 100644 --- a/doc/classes/ImmediateGeometry3D.xml +++ b/doc/classes/ImmediateGeometry3D.xml @@ -5,6 +5,9 @@ </brief_description> <description> Draws simple geometry from code. Uses a drawing mode similar to OpenGL 1.x. + See also [ArrayMesh], [MeshDataTool] and [SurfaceTool] for procedural geometry generation. + [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. + [b]Note:[/b] Godot uses clockwise [url=https://learnopengl.com/Advanced-OpenGL/Face-culling]winding order[/url] for front faces of triangle primitive modes. </description> <tutorials> </tutorials> diff --git a/doc/classes/InputFilter.xml b/doc/classes/Input.xml index 54184ae8a3..0f212e7498 100644 --- a/doc/classes/InputFilter.xml +++ b/doc/classes/Input.xml @@ -1,5 +1,5 @@ <?xml version="1.0" encoding="UTF-8" ?> -<class name="InputFilter" inherits="Object" version="4.0"> +<class name="Input" inherits="Object" version="4.0"> <brief_description> A singleton that deals with inputs. </brief_description> @@ -68,7 +68,7 @@ </description> </method> <method name="get_current_cursor_shape" qualifiers="const"> - <return type="int" enum="InputFilter.CursorShape"> + <return type="int" enum="Input.CursorShape"> </return> <description> Returns the currently assigned cursor shape (see [enum CursorShape]). @@ -193,7 +193,7 @@ </description> </method> <method name="get_mouse_mode" qualifiers="const"> - <return type="int" enum="InputFilter.MouseMode"> + <return type="int" enum="Input.MouseMode"> </return> <description> Returns the mouse mode. See the constants for more information. @@ -277,7 +277,7 @@ <argument index="3" name="guid" type="String"> </argument> <description> - Notifies the [InputFilter] singleton that a connection has changed, to update the state for the [code]device[/code] index. + Notifies the [Input] singleton that a connection has changed, to update the state for the [code]device[/code] index. 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. </description> </method> @@ -293,7 +293,7 @@ var a = InputEventAction.new() a.action = "ui_cancel" a.pressed = true - InputFilter.parse_input_event(a) + Input.parse_input_event(a) [/codeblock] </description> </method> @@ -311,7 +311,7 @@ </return> <argument index="0" name="image" type="Resource"> </argument> - <argument index="1" name="shape" type="int" enum="InputFilter.CursorShape" default="0"> + <argument index="1" name="shape" type="int" enum="Input.CursorShape" default="0"> </argument> <argument index="2" name="hotspot" type="Vector2" default="Vector2( 0, 0 )"> </argument> @@ -326,7 +326,7 @@ <method name="set_default_cursor_shape"> <return type="void"> </return> - <argument index="0" name="shape" type="int" enum="InputFilter.CursorShape" default="0"> + <argument index="0" name="shape" type="int" enum="Input.CursorShape" default="0"> </argument> <description> Sets the default cursor shape to be used in the viewport instead of [constant CURSOR_ARROW]. @@ -337,7 +337,7 @@ <method name="set_mouse_mode"> <return type="void"> </return> - <argument index="0" name="mode" type="int" enum="InputFilter.MouseMode"> + <argument index="0" name="mode" type="int" enum="Input.MouseMode"> </argument> <description> Sets the mouse mode. See the constants for more information. diff --git a/doc/classes/InputEventKey.xml b/doc/classes/InputEventKey.xml index 34afa90553..767e67c615 100644 --- a/doc/classes/InputEventKey.xml +++ b/doc/classes/InputEventKey.xml @@ -14,7 +14,7 @@ <return type="int"> </return> <description> - Returns the keycode combined with modifier keys such as [code]Shift[/code] or [code]Alt[/code]. See also [InputEventWithModifiers]. + Returns the keycode combined with modifier keys such as [kbd]Shift[/kbd] or [kbd]Alt[/kbd]. See also [InputEventWithModifiers]. 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 [InputEventKey]. </description> </method> @@ -22,7 +22,7 @@ <return type="int"> </return> <description> - Returns the physical keycode combined with modifier keys such as [code]Shift[/code] or [code]Alt[/code]. See also [InputEventWithModifiers]. + Returns the physical keycode combined with modifier keys such as [kbd]Shift[/kbd] or [kbd]Alt[/kbd]. See also [InputEventWithModifiers]. 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 the [InputEventKey]. </description> </method> diff --git a/doc/classes/InputEventWithModifiers.xml b/doc/classes/InputEventWithModifiers.xml index 34faf18e24..cc7de2ca32 100644 --- a/doc/classes/InputEventWithModifiers.xml +++ b/doc/classes/InputEventWithModifiers.xml @@ -4,7 +4,7 @@ Base class for keys events with modifiers. </brief_description> <description> - 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]. </description> <tutorials> <link>https://docs.godotengine.org/en/latest/tutorials/inputs/inputevent.html</link> @@ -13,19 +13,19 @@ </methods> <members> <member name="alt" type="bool" setter="set_alt" getter="get_alt" default="false"> - State of the [code]Alt[/code] modifier. + State of the [kbd]Alt[/kbd] modifier. </member> <member name="command" type="bool" setter="set_command" getter="get_command" default="false"> - State of the [code]Command[/code] modifier. + State of the [kbd]Cmd[/kbd] modifier. </member> <member name="control" type="bool" setter="set_control" getter="get_control" default="false"> - State of the [code]Ctrl[/code] modifier. + State of the [kbd]Ctrl[/kbd] modifier. </member> <member name="meta" type="bool" setter="set_metakey" getter="get_metakey" default="false"> - State of the [code]Meta[/code] modifier. + State of the [kbd]Meta[/kbd] modifier. </member> <member name="shift" type="bool" setter="set_shift" getter="get_shift" default="false"> - State of the [code]Shift[/code] modifier. + State of the [kbd]Shift[/kbd] modifier. </member> </members> <constants> diff --git a/doc/classes/ItemList.xml b/doc/classes/ItemList.xml index c6ed1e22ed..25420bd77b 100644 --- a/doc/classes/ItemList.xml +++ b/doc/classes/ItemList.xml @@ -5,7 +5,7 @@ </brief_description> <description> This control provides a selectable list of items that may be in a single (or multiple columns) with option of text, icons, or both text and icon. Tooltips are supported and may be different for every item in the list. - 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. + 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 [kbd]Enter[/kbd]. 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 fully fit its content by default. You need to set [member fixed_column_width] greater than zero to wrap the text. </description> <tutorials> @@ -278,7 +278,7 @@ </argument> <description> Disables (or enables) the item at the specified index. - Disabled items cannot be selected and do not trigger activation signals (when double-clicking or pressing Enter). + Disabled items cannot be selected and do not trigger activation signals (when double-clicking or pressing [kbd]Enter[/kbd]). </description> </method> <method name="set_item_icon"> @@ -452,7 +452,7 @@ <argument index="0" name="index" type="int"> </argument> <description> - Triggered when specified list item is activated via double-clicking or by pressing Enter. + Triggered when specified list item is activated via double-clicking or by pressing [kbd]Enter[/kbd]. </description> </signal> <signal name="item_rmb_selected"> @@ -508,7 +508,7 @@ Only allow selecting a single item. </constant> <constant name="SELECT_MULTI" value="1" enum="SelectMode"> - Allows selecting multiple items by holding Ctrl or Shift. + Allows selecting multiple items by holding [kbd]Ctrl[/kbd] or [kbd]Shift[/kbd]. </constant> </constants> <theme_items> diff --git a/doc/classes/MonoGCHandle.xml b/doc/classes/JNISingleton.xml index 1e33dd1359..84ab1a49c1 100644 --- a/doc/classes/MonoGCHandle.xml +++ b/doc/classes/JNISingleton.xml @@ -1,5 +1,5 @@ <?xml version="1.0" encoding="UTF-8" ?> -<class name="MonoGCHandle" inherits="Reference" version="4.0"> +<class name="JNISingleton" inherits="Object" version="4.0"> <brief_description> </brief_description> <description> diff --git a/doc/classes/Light3D.xml b/doc/classes/Light3D.xml index 4e48a24951..cb21db2d00 100644 --- a/doc/classes/Light3D.xml +++ b/doc/classes/Light3D.xml @@ -35,6 +35,9 @@ <member name="editor_only" type="bool" setter="set_editor_only" getter="is_editor_only" default="false"> If [code]true[/code], the light only appears in the editor and will not be visible at runtime. </member> + <member name="light_angular_distance" type="float" setter="set_param" getter="get_param" default="0.0"> + Angular size of the light in degrees. Only available for [DirectionalLight3D]s. For reference, the sun from earth is approximately [code]0.5[/code]. + </member> <member name="light_bake_mode" type="int" setter="set_bake_mode" getter="get_bake_mode" enum="Light3D.BakeMode" default="1"> The light's bake mode. See [enum BakeMode]. </member> @@ -53,24 +56,35 @@ <member name="light_negative" type="bool" setter="set_negative" getter="is_negative" default="false"> If [code]true[/code], the light's effect is reversed, darkening areas and casting bright shadows. </member> + <member name="light_projector" type="Texture2D" setter="set_projector" getter="get_projector"> + [Texture2D] projected by light. [member shadow_enabled] must be on for the projector to work. Light projectors make the light appear as if it is shining through a colored but transparent object, almost like light shining through stained glass. + </member> + <member name="light_size" type="float" setter="set_param" getter="get_param" default="0.0"> + The size of the light in Godot units. Only available for [OmniLight3D]s and [SpotLight3D]s. + </member> <member name="light_specular" type="float" setter="set_param" getter="get_param" default="0.5"> The intensity of the specular blob in objects affected by the light. At [code]0[/code] the light becomes a pure diffuse light. </member> - <member name="shadow_bias" type="float" setter="set_param" getter="get_param" default="0.15"> + <member name="shadow_bias" type="float" setter="set_param" getter="get_param" default="0.02"> 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. </member> + <member name="shadow_blur" type="float" setter="set_param" getter="get_param" default="1.0"> + 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. + </member> <member name="shadow_color" type="Color" setter="set_shadow_color" getter="get_shadow_color" default="Color( 0, 0, 0, 1 )"> The color of shadows cast by this light. </member> - <member name="shadow_contact" type="float" setter="set_param" getter="get_param" default="0.0"> - Attempts to reduce [member shadow_bias] gap. - </member> <member name="shadow_enabled" type="bool" setter="set_shadow" getter="has_shadow" default="false"> If [code]true[/code], the light will cast shadows. </member> + <member name="shadow_normal_bias" type="float" setter="set_param" getter="get_param" default="1.0"> + 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. + </member> <member name="shadow_reverse_cull_face" type="bool" setter="set_shadow_reverse_cull_face" getter="get_shadow_reverse_cull_face" default="false"> 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 cast a shadow on both sides of the mesh, set the mesh to use double-sided shadows with [constant GeometryInstance3D.SHADOW_CASTING_SETTING_DOUBLE_SIDED]. </member> + <member name="shadow_transmittance_bias" type="float" setter="set_param" getter="get_param" default="0.05"> + </member> </members> <constants> <constant name="PARAM_ENERGY" value="0" enum="Param"> @@ -85,18 +99,18 @@ <constant name="PARAM_RANGE" value="3" enum="Param"> Constant for accessing [member OmniLight3D.omni_range] or [member SpotLight3D.spot_range]. </constant> - <constant name="PARAM_ATTENUATION" value="4" enum="Param"> + <constant name="PARAM_SIZE" value="4" enum="Param"> + Constant for accessing [member light_size]. + </constant> + <constant name="PARAM_ATTENUATION" value="5" enum="Param"> Constant for accessing [member OmniLight3D.omni_attenuation] or [member SpotLight3D.spot_attenuation]. </constant> - <constant name="PARAM_SPOT_ANGLE" value="5" enum="Param"> + <constant name="PARAM_SPOT_ANGLE" value="6" enum="Param"> Constant for accessing [member SpotLight3D.spot_angle]. </constant> - <constant name="PARAM_SPOT_ATTENUATION" value="6" enum="Param"> + <constant name="PARAM_SPOT_ATTENUATION" value="7" enum="Param"> Constant for accessing [member SpotLight3D.spot_angle_attenuation]. </constant> - <constant name="PARAM_CONTACT_SHADOW_SIZE" value="7" enum="Param"> - Constant for accessing [member shadow_contact]. - </constant> <constant name="PARAM_SHADOW_MAX_DISTANCE" value="8" enum="Param"> Constant for accessing [member DirectionalLight3D.directional_shadow_max_distance]. </constant> @@ -110,17 +124,24 @@ Constant for accessing [member DirectionalLight3D.directional_shadow_split_3]. </constant> <constant name="PARAM_SHADOW_FADE_START" value="12" enum="Param"> + Constant for accessing [member DirectionalLight3D.directional_shadow_fade_start]. </constant> <constant name="PARAM_SHADOW_NORMAL_BIAS" value="13" enum="Param"> - Constant for accessing [member DirectionalLight3D.directional_shadow_normal_bias]. + Constant for accessing [member shadow_normal_bias]. </constant> <constant name="PARAM_SHADOW_BIAS" value="14" enum="Param"> Constant for accessing [member shadow_bias]. </constant> - <constant name="PARAM_SHADOW_BIAS_SPLIT_SCALE" value="15" enum="Param"> - Constant for accessing [member DirectionalLight3D.directional_shadow_bias_split_scale]. + <constant name="PARAM_SHADOW_PANCAKE_SIZE" value="15" enum="Param"> + Constant for accessing [member DirectionalLight3D.directional_shadow_pancake_size]. + </constant> + <constant name="PARAM_SHADOW_BLUR" value="16" enum="Param"> + Constant for accessing [member shadow_blur]. + </constant> + <constant name="PARAM_TRANSMITTANCE_BIAS" value="17" enum="Param"> + Constant for accessing [member shadow_transmittance_bias]. </constant> - <constant name="PARAM_MAX" value="16" enum="Param"> + <constant name="PARAM_MAX" value="18" enum="Param"> Represents the size of the [enum Param] enum. </constant> <constant name="BAKE_DISABLED" value="0" enum="BakeMode"> diff --git a/doc/classes/Line2D.xml b/doc/classes/Line2D.xml index 68cec3e624..cfd23b28bd 100644 --- a/doc/classes/Line2D.xml +++ b/doc/classes/Line2D.xml @@ -72,7 +72,7 @@ <member name="begin_cap_mode" type="int" setter="set_begin_cap_mode" getter="get_begin_cap_mode" enum="Line2D.LineCapMode" default="0"> Controls the style of the line's first point. Use [enum LineCapMode] constants. </member> - <member name="default_color" type="Color" setter="set_default_color" getter="get_default_color" default="Color( 0.4, 0.5, 1, 1 )"> + <member name="default_color" type="Color" setter="set_default_color" getter="get_default_color" default="Color( 1, 1, 1, 1 )"> The line's color. Will not be used if a gradient is set. </member> <member name="end_cap_mode" type="int" setter="set_end_cap_mode" getter="get_end_cap_mode" enum="Line2D.LineCapMode" default="0"> diff --git a/doc/classes/LineEdit.xml b/doc/classes/LineEdit.xml index 447446ba10..3eeb892719 100644 --- a/doc/classes/LineEdit.xml +++ b/doc/classes/LineEdit.xml @@ -5,27 +5,27 @@ </brief_description> <description> LineEdit provides a single-line string editor, used for text fields. - It features many built-in shortcuts which will always be available ([code]Ctrl[/code] here maps to [code]Command[/code] on macOS): - - Ctrl + C: Copy - - Ctrl + X: Cut - - Ctrl + V or Ctrl + Y: Paste/"yank" - - Ctrl + Z: Undo - - Ctrl + Shift + Z: Redo - - Ctrl + U: Delete text from the cursor position to the beginning of the line - - Ctrl + K: Delete text from the cursor position to the end of the line - - Ctrl + A: Select all text - - Up/Down arrow: Move the cursor to the beginning/end of the line + It features many built-in shortcuts which will always be available ([kbd]Ctrl[/kbd] here maps to [kbd]Cmd[/kbd] on macOS): + - [kbd]Ctrl + C[/kbd]: Copy + - [kbd]Ctrl + X[/kbd]: Cut + - [kbd]Ctrl + V[/kbd] or [kbd]Ctrl + Y[/kbd]: Paste/"yank" + - [kbd]Ctrl + Z[/kbd]: Undo + - [kbd]Ctrl + Shift + Z[/kbd]: Redo + - [kbd]Ctrl + U[/kbd]: Delete text from the cursor position to the beginning of the line + - [kbd]Ctrl + K[/kbd]: Delete text from the cursor position to the end of the line + - [kbd]Ctrl + A[/kbd]: Select all text + - [kbd]Up Arrow[/kbd]/[kbd]Down Arrow[/kbd]: Move the cursor to the beginning/end of the line On macOS, some extra keyboard shortcuts are available: - - Ctrl + F: Like the right arrow key, move the cursor one character right - - Ctrl + B: Like the left arrow key, move the cursor one character left - - Ctrl + P: Like the up arrow key, move the cursor to the previous line - - Ctrl + N: Like the down arrow key, move the cursor to the next line - - Ctrl + D: Like the Delete key, delete the character on the right side of cursor - - Ctrl + H: Like the Backspace key, delete the character on the left side of the cursor - - Ctrl + A: Like the Home key, move the cursor to the beginning of the line - - Ctrl + E: Like the End key, move the cursor to the end of the line - - Command + Left arrow: Like the Home key, move the cursor to the beginning of the line - - Command + Right arrow: Like the End key, move the cursor to the end of the line + - [kbd]Ctrl + F[/kbd]: Same as [kbd]Right Arrow[/kbd], move the cursor one character right + - [kbd]Ctrl + B[/kbd]: Same as [kbd]Left Arrow[/kbd], move the cursor one character left + - [kbd]Ctrl + P[/kbd]: Same as [kbd]Up Arrow[/kbd], move the cursor to the previous line + - [kbd]Ctrl + N[/kbd]: Same as [kbd]Down Arrow[/kbd], move the cursor to the next line + - [kbd]Ctrl + D[/kbd]: Same as [kbd]Delete[/kbd], delete the character on the right side of cursor + - [kbd]Ctrl + H[/kbd]: Same as [kbd]Backspace[/kbd], delete the character on the left side of the cursor + - [kbd]Ctrl + A[/kbd]: Same as [kbd]Home[/kbd], move the cursor to the beginning of the line + - [kbd]Ctrl + E[/kbd]: Same as [kbd]End[/kbd], move the cursor to the end of the line + - [kbd]Cmd + Left Arrow[/kbd]: Same as [kbd]Home[/kbd], move the cursor to the beginning of the line + - [kbd]Cmd + Right Arrow[/kbd]: Same as [kbd]End[/kbd], move the cursor to the end of the line </description> <tutorials> </tutorials> diff --git a/doc/classes/MeshDataTool.xml b/doc/classes/MeshDataTool.xml index 81ff5969e3..dcc3bbf2a6 100644 --- a/doc/classes/MeshDataTool.xml +++ b/doc/classes/MeshDataTool.xml @@ -17,6 +17,8 @@ mesh.surface_remove(0) mdt.commit_to_surface(mesh) [/codeblock] + See also [ArrayMesh], [ImmediateGeometry3D] and [SurfaceTool] for procedural geometry generation. + [b]Note:[/b] Godot uses clockwise [url=https://learnopengl.com/Advanced-OpenGL/Face-culling]winding order[/url] for front faces of triangle primitive modes. </description> <tutorials> </tutorials> diff --git a/doc/classes/Node.xml b/doc/classes/Node.xml index d7bff83575..5ba3c6c56a 100644 --- a/doc/classes/Node.xml +++ b/doc/classes/Node.xml @@ -221,7 +221,7 @@ </description> </method> <method name="get_children" qualifiers="const"> - <return type="Array"> + <return type="Node[]"> </return> <description> Returns an array of references to node's children. @@ -238,7 +238,7 @@ <return type="int"> </return> <description> - Returns the node's index, i.e. its position among the siblings of its parent. + Returns the node's order in the scene tree branch. For example, if called on the first child node the position is [code]0[/code]. </description> </method> <method name="get_network_master" qualifiers="const"> @@ -331,13 +331,6 @@ Returns the time elapsed since the last physics-bound frame (see [method _physics_process]). This is always a constant value in physics processing unless the frames per second is changed via [member Engine.iterations_per_second]. </description> </method> - <method name="get_position_in_parent" qualifiers="const"> - <return type="int"> - </return> - <description> - Returns the node's order in the scene tree branch. For example, if called on the first child node the position is [code]0[/code]. - </description> - </method> <method name="get_process_delta_time" qualifiers="const"> <return type="float"> </return> @@ -939,7 +932,7 @@ Implemented on all platforms. </constant> <constant name="NOTIFICATION_WM_CLOSE_REQUEST" value="1006"> - Notification received from the OS when a close request is sent (e.g. closing the window with a "Close" button or Alt+F4). + Notification received from the OS when a close request is sent (e.g. closing the window with a "Close" button or [kbd]Alt + F4[/kbd]). Implemented on desktop platforms. </constant> <constant name="NOTIFICATION_WM_GO_BACK_REQUEST" value="1007"> diff --git a/doc/classes/Node2D.xml b/doc/classes/Node2D.xml index 9f017e9aed..d4517f0588 100644 --- a/doc/classes/Node2D.xml +++ b/doc/classes/Node2D.xml @@ -92,7 +92,7 @@ <argument index="0" name="local_point" type="Vector2"> </argument> <description> - Converts a local point's coordinates to global coordinates. + 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. </description> </method> <method name="to_local" qualifiers="const"> @@ -101,7 +101,7 @@ <argument index="0" name="global_point" type="Vector2"> </argument> <description> - Converts a global point's coordinates to local coordinates. + 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. </description> </method> <method name="translate"> diff --git a/doc/classes/Node3D.xml b/doc/classes/Node3D.xml index ef24f638fb..3e7d4d4c05 100644 --- a/doc/classes/Node3D.xml +++ b/doc/classes/Node3D.xml @@ -6,6 +6,7 @@ <description> Most basic 3D game object, with a 3D [Transform] and visibility settings. All other 3D game objects inherit from Node3D. Use [Node3D] as a parent node to move, scale, rotate and show/hide children in a 3D project. Affine operations (rotate, scale, translate) happen in parent's local coordinate system, unless the [Node3D] object is set as top-level. Affine operations in this coordinate system correspond to direct affine operations on the [Node3D]'s transform. The word local below refers to this coordinate system. The coordinate system that is attached to the [Node3D] object itself is referred to as object-local coordinate system. + [b]Note:[/b] Unless otherwise specified, all methods that have angle parameters must have angles specified as [i]radians[/i]. To convert degrees to radians, use [method @GDScript.deg2rad]. </description> <tutorials> <link>https://docs.godotengine.org/en/latest/tutorials/3d/introduction_to_3d.html</link> 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/OptionButton.xml b/doc/classes/OptionButton.xml index 5cb2aaf314..39d974ec47 100644 --- a/doc/classes/OptionButton.xml +++ b/doc/classes/OptionButton.xml @@ -214,14 +214,14 @@ </members> <signals> <signal name="item_focused"> - <argument index="0" name="id" type="int"> + <argument index="0" name="index" type="int"> </argument> <description> Emitted the when user navigates to an item using the [code]ui_up[/code] or [code]ui_down[/code] actions. The index of the item selected is passed as argument. </description> </signal> <signal name="item_selected"> - <argument index="0" name="id" type="int"> + <argument index="0" name="index" type="int"> </argument> <description> Emitted when the current item has been changed by the user. The index of the item selected is passed as argument. diff --git a/doc/classes/PackedScene.xml b/doc/classes/PackedScene.xml index e422545b7b..2d70dea012 100644 --- a/doc/classes/PackedScene.xml +++ b/doc/classes/PackedScene.xml @@ -9,23 +9,25 @@ [b]Note:[/b] The node doesn't need to own itself. [b]Example of saving a node with different owners:[/b] The following example creates 3 objects: [code]Node2D[/code] ([code]node[/code]), [code]RigidBody2D[/code] ([code]rigid[/code]) and [code]CollisionObject2D[/code] ([code]collision[/code]). [code]collision[/code] is a child of [code]rigid[/code] which is a child of [code]node[/code]. Only [code]rigid[/code] is owned by [code]node[/code] and [code]pack[/code] will therefore only save those two nodes, but not [code]collision[/code]. [codeblock] - # Create the objects + # Create the objects. var node = Node2D.new() var rigid = RigidBody2D.new() var collision = CollisionShape2D.new() - # Create the object hierarchy + # Create the object hierarchy. rigid.add_child(collision) node.add_child(rigid) - # Change owner of rigid, but not of collision + # Change owner of `rigid`, but not of `collision`. rigid.owner = node var scene = PackedScene.new() - # Only node and rigid are now packed + # Only `node` and `rigid` are now packed. var result = scene.pack(node) if result == OK: - ResourceSaver.save("res://path/name.scn", scene) # Or "user://..." + var error = ResourceSaver.save("res://path/name.scn", scene) # Or "user://..." + if error != OK: + push_error("An error occurred while saving the scene to disk.") [/codeblock] </description> <tutorials> diff --git a/doc/classes/Path2D.xml b/doc/classes/Path2D.xml index ab266a2f73..57e2091268 100644 --- a/doc/classes/Path2D.xml +++ b/doc/classes/Path2D.xml @@ -15,7 +15,6 @@ <member name="curve" type="Curve2D" setter="set_curve" getter="get_curve"> A [Curve2D] describing the path. </member> - <member name="self_modulate" type="Color" setter="set_self_modulate" getter="get_self_modulate" override="true" default="Color( 0.5, 0.6, 1, 0.7 )" /> </members> <constants> </constants> diff --git a/doc/classes/PhysicalBone3D.xml b/doc/classes/PhysicalBone3D.xml index d45c72ee87..58930aae37 100644 --- a/doc/classes/PhysicalBone3D.xml +++ b/doc/classes/PhysicalBone3D.xml @@ -25,6 +25,14 @@ <description> </description> </method> + <method name="get_axis_lock" qualifiers="const"> + <return type="bool"> + </return> + <argument index="0" name="axis" type="int" enum="PhysicsServer3D.BodyAxis"> + </argument> + <description> + </description> + </method> <method name="get_bone_id" qualifiers="const"> <return type="int"> </return> @@ -43,23 +51,74 @@ <description> </description> </method> + <method name="set_axis_lock"> + <return type="void"> + </return> + <argument index="0" name="axis" type="int" enum="PhysicsServer3D.BodyAxis"> + </argument> + <argument index="1" name="lock" type="bool"> + </argument> + <description> + </description> + </method> </methods> <members> + <member name="angular_damp" type="float" setter="set_angular_damp" getter="get_angular_damp" default="-1.0"> + Damps the body's rotation if greater than [code]0[/code]. + </member> + <member name="axis_lock_angular_x" type="bool" setter="set_axis_lock" getter="get_axis_lock" default="false"> + Lock the body's rotation in the X axis. + </member> + <member name="axis_lock_angular_y" type="bool" setter="set_axis_lock" getter="get_axis_lock" default="false"> + Lock the body's rotation in the Y axis. + </member> + <member name="axis_lock_angular_z" type="bool" setter="set_axis_lock" getter="get_axis_lock" default="false"> + Lock the body's rotation in the Z axis. + </member> + <member name="axis_lock_linear_x" type="bool" setter="set_axis_lock" getter="get_axis_lock" default="false"> + Lock the body's movement in the X axis. + </member> + <member name="axis_lock_linear_y" type="bool" setter="set_axis_lock" getter="get_axis_lock" default="false"> + Lock the body's movement in the Y axis. + </member> + <member name="axis_lock_linear_z" type="bool" setter="set_axis_lock" getter="get_axis_lock" default="false"> + Lock the body's movement in the Z axis. + </member> <member name="body_offset" type="Transform" setter="set_body_offset" getter="get_body_offset" default="Transform( 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0 )"> + Sets the body's transform. </member> <member name="bounce" type="float" setter="set_bounce" getter="get_bounce" default="0.0"> + The body's bounciness. Values range from [code]0[/code] (no bounce) to [code]1[/code] (full bounciness). + </member> + <member name="can_sleep" type="bool" setter="set_can_sleep" getter="is_able_to_sleep" default="true"> + 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. </member> <member name="friction" type="float" setter="set_friction" getter="get_friction" default="1.0"> + The body's friction, from [code]0[/code] (frictionless) to [code]1[/code] (max friction). </member> <member name="gravity_scale" type="float" setter="set_gravity_scale" getter="get_gravity_scale" default="1.0"> + 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. </member> <member name="joint_offset" type="Transform" setter="set_joint_offset" getter="get_joint_offset" default="Transform( 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0 )"> + Sets the joint's transform. + </member> + <member name="joint_rotation" type="Vector3" setter="set_joint_rotation" getter="get_joint_rotation"> + Sets the joint's rotation in radians. + </member> + <member name="joint_rotation_degrees" type="Vector3" setter="set_joint_rotation_degrees" getter="get_joint_rotation_degrees" default="Vector3( 0, 0, 0 )"> + Sets the joint's rotation in degrees. </member> <member name="joint_type" type="int" setter="set_joint_type" getter="get_joint_type" enum="PhysicalBone3D.JointType" default="0"> + Sets the joint type. See [enum JointType] for possible values. + </member> + <member name="linear_damp" type="float" setter="set_linear_damp" getter="get_linear_damp" default="-1.0"> + Damps the body's movement if greater than [code]0[/code]. </member> <member name="mass" type="float" setter="set_mass" getter="get_mass" default="1.0"> + The body's mass. </member> <member name="weight" type="float" setter="set_weight" getter="get_weight" default="9.8"> + 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]. </member> </members> <constants> diff --git a/doc/classes/PhysicsBody2D.xml b/doc/classes/PhysicsBody2D.xml index 28d6ce7048..6afbd1ee8e 100644 --- a/doc/classes/PhysicsBody2D.xml +++ b/doc/classes/PhysicsBody2D.xml @@ -20,7 +20,7 @@ </description> </method> <method name="get_collision_exceptions"> - <return type="Array"> + <return type="PhysicsBody2D[]"> </return> <description> Returns an array of nodes that were added as collision exceptions for this body. diff --git a/doc/classes/PhysicsBody3D.xml b/doc/classes/PhysicsBody3D.xml index f0ba2a7f5f..2301a07a5c 100644 --- a/doc/classes/PhysicsBody3D.xml +++ b/doc/classes/PhysicsBody3D.xml @@ -20,7 +20,7 @@ </description> </method> <method name="get_collision_exceptions"> - <return type="Array"> + <return type="PhysicsBody3D[]"> </return> <description> Returns an array of nodes that were added as collision exceptions for this body. diff --git a/doc/classes/PhysicsDirectBodyState2DSW.xml b/doc/classes/PhysicsDirectBodyState2DSW.xml deleted file mode 100644 index 94fc4213b7..0000000000 --- a/doc/classes/PhysicsDirectBodyState2DSW.xml +++ /dev/null @@ -1,15 +0,0 @@ -<?xml version="1.0" encoding="UTF-8" ?> -<class name="PhysicsDirectBodyState2DSW" inherits="PhysicsDirectBodyState2D" version="4.0"> - <brief_description> - Software implementation of [PhysicsDirectBodyState2D]. - </brief_description> - <description> - Software implementation of [PhysicsDirectBodyState2D]. This object exposes no new methods or properties and should not be used, as [PhysicsDirectBodyState2D] selects the best implementation available. - </description> - <tutorials> - </tutorials> - <methods> - </methods> - <constants> - </constants> -</class> diff --git a/doc/classes/PhysicsDirectSpaceState3D.xml b/doc/classes/PhysicsDirectSpaceState3D.xml index 09ee93732d..ea094dcd90 100644 --- a/doc/classes/PhysicsDirectSpaceState3D.xml +++ b/doc/classes/PhysicsDirectSpaceState3D.xml @@ -19,7 +19,7 @@ </argument> <description> Checks whether the shape can travel to a point. The method will return an array with two floats between 0 and 1, both representing a fraction of [code]motion[/code]. The first is how far the shape can move without triggering a collision, and the second is the point at which a collision will occur. If no collision is detected, the returned array will be [code][1, 1][/code]. - If the shape can not move, the returned array will be [code][0, 0][/code] under Bullet, and empty under GodotPhysics. + If the shape can not move, the returned array will be [code][0, 0][/code] under Bullet, and empty under GodotPhysics3D. </description> </method> <method name="collide_shape"> diff --git a/doc/classes/PhysicsServer2DSW.xml b/doc/classes/PhysicsServer2DSW.xml deleted file mode 100644 index dac5e360f0..0000000000 --- a/doc/classes/PhysicsServer2DSW.xml +++ /dev/null @@ -1,15 +0,0 @@ -<?xml version="1.0" encoding="UTF-8" ?> -<class name="PhysicsServer2DSW" inherits="PhysicsServer2D" version="4.0"> - <brief_description> - Software implementation of [PhysicsServer2D]. - </brief_description> - <description> - This class exposes no new methods or properties and should not be used, as [PhysicsServer2D] automatically selects the best implementation available. - </description> - <tutorials> - </tutorials> - <methods> - </methods> - <constants> - </constants> -</class> diff --git a/doc/classes/ProceduralSkyMaterial.xml b/doc/classes/ProceduralSkyMaterial.xml index 70e82d248c..d3e1dbca27 100644 --- a/doc/classes/ProceduralSkyMaterial.xml +++ b/doc/classes/ProceduralSkyMaterial.xml @@ -40,11 +40,8 @@ <member name="sun_angle_max" type="float" setter="set_sun_angle_max" getter="get_sun_angle_max" default="100.0"> Distance from center of sun where it fades out completely. </member> - <member name="sun_angle_min" type="float" setter="set_sun_angle_min" getter="get_sun_angle_min" default="1.0"> - Distance from sun where it goes from solid to starting to fade. - </member> <member name="sun_curve" type="float" setter="set_sun_curve" getter="get_sun_curve" default="0.05"> - How quickly the sun fades away between [member sun_angle_min] and [member sun_angle_max]. + How quickly the sun fades away between the edge of the sun disk and [member sun_angle_max]. </member> </members> <constants> diff --git a/doc/classes/ProjectSettings.xml b/doc/classes/ProjectSettings.xml index 93402dcb20..a9ac307df4 100644 --- a/doc/classes/ProjectSettings.xml +++ b/doc/classes/ProjectSettings.xml @@ -260,19 +260,19 @@ Setting to hardcode audio delay when playing video. Best to leave this untouched unless you know what you are doing. </member> <member name="compression/formats/gzip/compression_level" type="int" setter="" getter="" default="-1"> - 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. </member> <member name="compression/formats/zlib/compression_level" type="int" setter="" getter="" default="-1"> - 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. </member> <member name="compression/formats/zstd/compression_level" type="int" setter="" getter="" default="3"> - 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. </member> <member name="compression/formats/zstd/long_distance_matching" type="bool" setter="" getter="" default="false"> - Enables long-distance matching in Zstandard. + Enables [url=https://github.com/facebook/zstd/releases/tag/v1.3.2]long-distance matching[/url] in Zstandard. </member> <member name="compression/formats/zstd/window_log_size" type="int" setter="" getter="" default="27"> - Largest size limit (in power of 2) allowed when compressing using long-distance matching with Zstandard. + Largest size limit (in power of 2) allowed when compressing using long-distance matching with Zstandard. Higher values can result in better compression, but will require more memory when compressing and decompressing. </member> <member name="debug/gdscript/completion/autocomplete_setters_and_getters" type="bool" setter="" getter="" default="false"> If [code]true[/code], displays getters and setters in autocompletion results in the script editor. This setting is meant to be used when porting old projects (Godot 2), as using member variables is the preferred style from Godot 3 onwards. @@ -426,9 +426,6 @@ <member name="display/window/ios/hide_home_indicator" type="bool" setter="" getter="" default="true"> If [code]true[/code], the home indicator is hidden automatically. This only affects iOS devices without a physical home button. </member> - <member name="display/window/subwindows/embed_subwindows" type="bool" setter="" getter="" default="false"> - If [code]true[/code], uses subwindows (windows rendered entirely by engine) instead of OS-specific windows. - </member> <member name="display/window/size/always_on_top" type="bool" setter="" getter="" default="false"> Force the window to be always on top. </member> @@ -472,6 +469,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> @@ -914,7 +913,7 @@ </member> <member name="physics/2d/physics_engine" type="String" setter="" getter="" default=""DEFAULT""> Sets which physics engine to use for 2D physics. - "DEFAULT" and "GodotPhysics" are the same, as there is currently no alternative 2D physics server implemented. + "DEFAULT" and "GodotPhysics2D" are the same, as there is currently no alternative 2D physics server implemented. </member> <member name="physics/2d/sleep_threshold_angular" type="float" setter="" getter="" default="0.139626"> Threshold angular velocity under which a 2D physics body will be considered inactive. See [constant PhysicsServer2D.SPACE_PARAM_BODY_ANGULAR_VELOCITY_SLEEP_THRESHOLD]. @@ -956,7 +955,7 @@ </member> <member name="physics/3d/physics_engine" type="String" setter="" getter="" default=""DEFAULT""> Sets which physics engine to use for 3D physics. - "DEFAULT" is currently the [url=https://bulletphysics.org]Bullet[/url] physics engine. The "GodotPhysics" engine is still supported as an alternative. + "DEFAULT" is currently the [url=https://bulletphysics.org]Bullet[/url] physics engine. The "GodotPhysics3D" engine is still supported as an alternative. </member> <member name="physics/common/enable_object_picking" type="bool" setter="" getter="" default="true"> Enables [member Viewport.physics_object_picking] on the root viewport. @@ -975,9 +974,13 @@ <member name="rendering/environment/default_environment" type="String" setter="" getter="" default=""""> [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 at scene load time regardless of whether you have set an environment or not. If you do not rely on the fallback environment, it is best to delete [code]default_env.tres[/code], or to specify a different default environment here. </member> + <member name="rendering/high_end/global_shader_variables_buffer_size" type="int" setter="" getter="" default="65536"> + </member> <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. @@ -985,6 +988,15 @@ <member name="rendering/quality/2d/use_pixel_snap" type="bool" setter="" getter="" default="false"> If [code]true[/code], forces snapping of polygons to pixels in 2D rendering. May help in some pixel art styles. </member> + <member name="rendering/quality/depth_of_field/depth_of_field_bokeh_quality" type="int" setter="" getter="" default="2"> + Sets the quality of the depth of field effect. Higher quality takes more samples, which is slower but looks smoother. + </member> + <member name="rendering/quality/depth_of_field/depth_of_field_bokeh_shape" type="int" setter="" getter="" default="1"> + 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. + </member> + <member name="rendering/quality/depth_of_field/depth_of_field_use_jitter" type="bool" setter="" getter="" default="false"> + 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. + </member> <member name="rendering/quality/depth_prepass/disable_for_vendors" type="String" setter="" getter="" default=""PowerVR,Mali,Adreno,Apple""> Disables depth pre-pass for some GPU vendors (usually mobile), as their architecture already does this. </member> @@ -997,38 +1009,29 @@ <member name="rendering/quality/directional_shadow/size.mobile" type="int" setter="" getter="" default="2048"> Lower-end override for [member rendering/quality/directional_shadow/size] on mobile devices, due to performance concerns or driver support. </member> + <member name="rendering/quality/directional_shadow/soft_shadow_quality" type="int" setter="" getter="" default="2"> + 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. + </member> + <member name="rendering/quality/directional_shadow/soft_shadow_quality.mobile" type="int" setter="" getter="" default="0"> + Lower-end override for [member rendering/quality/directional_shadow/soft_shadow_quality] on mobile devices, due to performance concerns or driver support. + </member> <member name="rendering/quality/driver/driver_name" type="String" setter="" getter="" default=""Vulkan""> The video driver to use ("GLES2" or "Vulkan"). [b]Note:[/b] The backend in use can be overridden at runtime via the [code]--rendering-driver[/code] command line argument. [b]FIXME:[/b] No longer valid after DisplayServer split: In such cases, this property is not updated, so use [code]OS.get_current_video_driver[/code] to query it at run-time. </member> - <member name="rendering/quality/filters/depth_of_field_bokeh_quality" type="int" setter="" getter="" default="2"> - </member> - <member name="rendering/quality/filters/depth_of_field_bokeh_shape" type="int" setter="" getter="" default="1"> - </member> - <member name="rendering/quality/filters/depth_of_field_use_jitter" type="bool" setter="" getter="" default="false"> - </member> - <member name="rendering/quality/filters/max_anisotropy" type="int" setter="" getter="" default="4"> - </member> - <member name="rendering/quality/filters/msaa" type="int" setter="" getter="" default="0"> - 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. - [b]Note:[/b] MSAA is not available on HTML5 export using the GLES2 backend. - </member> - <member name="rendering/quality/filters/screen_space_roughness_limiter" type="int" setter="" getter="" default="0"> - </member> - <member name="rendering/quality/filters/screen_space_roughness_limiter_curve" type="float" setter="" getter="" default="1.0"> - </member> - <member name="rendering/quality/filters/use_nearest_mipmap_filter" type="bool" setter="" getter="" default="false"> - 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. - </member> <member name="rendering/quality/gi_probes/anisotropic" type="bool" setter="" getter="" default="false"> + If [code]true[/code], take additional samples when rendering objects affected by a [GIProbe] to reduce artifacts from only sampling in one direction. </member> <member name="rendering/quality/gi_probes/quality" type="int" setter="" getter="" default="1"> + Sets the number of cone samples taken when rendering objects affected by [GIProbe]s. </member> <member name="rendering/quality/glow/upscale_mode" type="int" setter="" getter="" default="1"> + 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. </member> <member name="rendering/quality/glow/upscale_mode.mobile" type="int" setter="" getter="" default="0"> + Lower-end override for [member rendering/quality/glow/upscale_mode] on mobile devices, due to performance concerns or driver support. </member> <member name="rendering/quality/intended_usage/framebuffer_allocation" type="int" setter="" getter="" default="2"> 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 allocated. This means [code]SCREEN_TEXTURE[/code] and [code]DEPTH_TEXTURE[/code] will not be available in shaders and post-processing effects will not be available in the [Environment]. @@ -1063,7 +1066,22 @@ <member name="rendering/quality/reflections/texture_array_reflections.mobile" type="bool" setter="" getter="" default="false"> Lower-end override for [member rendering/quality/reflections/texture_array_reflections] on mobile devices, due to performance concerns or driver support. </member> + <member name="rendering/quality/screen_filters/msaa" type="int" setter="" getter="" default="0"> + 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. + [b]Note:[/b] MSAA is not available on HTML5 export using the GLES2 backend. + </member> + <member name="rendering/quality/screen_filters/screen_space_aa" type="int" setter="" getter="" default="0"> + Sets the screen-space antialiasing mode for the default screen [Viewport]. Screen-space antialiasing works by selectively blurring edges in a post-process shader. It differs from MSAA which takes multiple coverage samples while rendering objects. Screen-space AA methods are typically faster than MSAA and will smooth out specular aliasing, but tend to make scenes appear blurry. + Another way to combat specular aliasing is to enable [member rendering/quality/screen_filters/screen_space_roughness_limiter]. + </member> + <member name="rendering/quality/screen_filters/screen_space_roughness_limiter" type="int" setter="" getter="" default="0"> + 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. + </member> + <member name="rendering/quality/screen_filters/screen_space_roughness_limiter_curve" type="float" setter="" getter="" default="1.0"> + 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. + </member> <member name="rendering/quality/screen_space_reflection/roughness_quality" type="int" setter="" getter="" default="1"> + 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. </member> <member name="rendering/quality/shading/force_blinn_over_ggx" type="bool" setter="" getter="" default="false"> If [code]true[/code], uses faster but lower-quality Blinn model to generate blurred reflections instead of the GGX model. @@ -1101,15 +1119,33 @@ <member name="rendering/quality/shadow_atlas/size.mobile" type="int" setter="" getter="" default="2048"> Lower-end override for [member rendering/quality/shadow_atlas/size] on mobile devices, due to performance concerns or driver support. </member> - <member name="rendering/quality/shadows/filter_mode" type="int" setter="" getter="" default="1"> - 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. + <member name="rendering/quality/shadows/soft_shadow_quality" type="int" setter="" getter="" default="2"> + 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. </member> - <member name="rendering/quality/shadows/filter_mode.mobile" type="int" setter="" getter="" default="0"> - Lower-end override for [member rendering/quality/shadows/filter_mode] on mobile devices, due to performance concerns or driver support. + <member name="rendering/quality/shadows/soft_shadow_quality.mobile" type="int" setter="" getter="" default="0"> + Lower-end override for [member rendering/quality/shadows/soft_shadow_quality] on mobile devices, due to performance concerns or driver support. </member> <member name="rendering/quality/ssao/half_size" type="bool" setter="" getter="" default="false"> + 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. </member> <member name="rendering/quality/ssao/quality" type="int" setter="" getter="" default="1"> + 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. + </member> + <member name="rendering/quality/subsurface_scattering/subsurface_scattering_depth_scale" type="float" setter="" getter="" default="0.01"> + 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. + </member> + <member name="rendering/quality/subsurface_scattering/subsurface_scattering_quality" type="int" setter="" getter="" default="1"> + Sets the quality of the subsurface scattering effect. Higher values are slower but look nicer. + </member> + <member name="rendering/quality/subsurface_scattering/subsurface_scattering_scale" type="float" setter="" getter="" default="0.05"> + 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. + </member> + <member name="rendering/quality/texture_filters/max_anisotropy" type="int" setter="" getter="" default="4"> + 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. + 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. + </member> + <member name="rendering/quality/texture_filters/use_nearest_mipmap_filter" type="bool" setter="" getter="" default="false"> + 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. </member> <member name="rendering/threads/thread_model" type="int" setter="" getter="" default="1"> Thread model for rendering. Rendering on a thread can vastly improve performance, but synchronizing to the main thread can cause a bit more jitter. @@ -1137,6 +1173,9 @@ </member> <member name="rendering/vulkan/staging_buffer/texture_upload_region_size_px" type="int" setter="" getter="" default="64"> </member> + <member name="world/2d/cell_size" type="int" setter="" getter="" default="100"> + Cell size used for the 2D hash grid that [VisibilityNotifier2D] uses. + </member> </members> <constants> </constants> diff --git a/doc/classes/RDAttachmentFormat.xml b/doc/classes/RDAttachmentFormat.xml new file mode 100644 index 0000000000..4ee7b9b28e --- /dev/null +++ b/doc/classes/RDAttachmentFormat.xml @@ -0,0 +1,21 @@ +<?xml version="1.0" encoding="UTF-8" ?> +<class name="RDAttachmentFormat" inherits="Reference" version="4.0"> + <brief_description> + </brief_description> + <description> + </description> + <tutorials> + </tutorials> + <methods> + </methods> + <members> + <member name="format" type="int" setter="set_format" getter="get_format" enum="RenderingDevice.DataFormat" default="36"> + </member> + <member name="samples" type="int" setter="set_samples" getter="get_samples" enum="RenderingDevice.TextureSamples" default="0"> + </member> + <member name="usage_flags" type="int" setter="set_usage_flags" getter="get_usage_flags" default="0"> + </member> + </members> + <constants> + </constants> +</class> diff --git a/doc/classes/RDPipelineColorBlendState.xml b/doc/classes/RDPipelineColorBlendState.xml new file mode 100644 index 0000000000..adc6f1f6a3 --- /dev/null +++ b/doc/classes/RDPipelineColorBlendState.xml @@ -0,0 +1,23 @@ +<?xml version="1.0" encoding="UTF-8" ?> +<class name="RDPipelineColorBlendState" inherits="Reference" version="4.0"> + <brief_description> + </brief_description> + <description> + </description> + <tutorials> + </tutorials> + <methods> + </methods> + <members> + <member name="attachments" type="RDPipelineColorBlendStateAttachment[]" setter="set_attachments" getter="get_attachments" default="[ ]"> + </member> + <member name="blend_constant" type="Color" setter="set_blend_constant" getter="get_blend_constant" default="Color( 0, 0, 0, 1 )"> + </member> + <member name="enable_logic_op" type="bool" setter="set_enable_logic_op" getter="get_enable_logic_op" default="false"> + </member> + <member name="logic_op" type="int" setter="set_logic_op" getter="get_logic_op" enum="RenderingDevice.LogicOperation" default="0"> + </member> + </members> + <constants> + </constants> +</class> diff --git a/doc/classes/RDPipelineColorBlendStateAttachment.xml b/doc/classes/RDPipelineColorBlendStateAttachment.xml new file mode 100644 index 0000000000..7f118b5f0b --- /dev/null +++ b/doc/classes/RDPipelineColorBlendStateAttachment.xml @@ -0,0 +1,43 @@ +<?xml version="1.0" encoding="UTF-8" ?> +<class name="RDPipelineColorBlendStateAttachment" inherits="Reference" version="4.0"> + <brief_description> + </brief_description> + <description> + </description> + <tutorials> + </tutorials> + <methods> + <method name="set_as_mix"> + <return type="void"> + </return> + <description> + </description> + </method> + </methods> + <members> + <member name="alpha_blend_op" type="int" setter="set_alpha_blend_op" getter="get_alpha_blend_op" enum="RenderingDevice.BlendOperation" default="0"> + </member> + <member name="color_blend_op" type="int" setter="set_color_blend_op" getter="get_color_blend_op" enum="RenderingDevice.BlendOperation" default="0"> + </member> + <member name="dst_alpha_blend_factor" type="int" setter="set_dst_alpha_blend_factor" getter="get_dst_alpha_blend_factor" enum="RenderingDevice.BlendFactor" default="0"> + </member> + <member name="dst_color_blend_factor" type="int" setter="set_dst_color_blend_factor" getter="get_dst_color_blend_factor" enum="RenderingDevice.BlendFactor" default="0"> + </member> + <member name="enable_blend" type="bool" setter="set_enable_blend" getter="get_enable_blend" default="false"> + </member> + <member name="src_alpha_blend_factor" type="int" setter="set_src_alpha_blend_factor" getter="get_src_alpha_blend_factor" enum="RenderingDevice.BlendFactor" default="0"> + </member> + <member name="src_color_blend_factor" type="int" setter="set_src_color_blend_factor" getter="get_src_color_blend_factor" enum="RenderingDevice.BlendFactor" default="0"> + </member> + <member name="write_a" type="bool" setter="set_write_a" getter="get_write_a" default="true"> + </member> + <member name="write_b" type="bool" setter="set_write_b" getter="get_write_b" default="true"> + </member> + <member name="write_g" type="bool" setter="set_write_g" getter="get_write_g" default="true"> + </member> + <member name="write_r" type="bool" setter="set_write_r" getter="get_write_r" default="true"> + </member> + </members> + <constants> + </constants> +</class> diff --git a/doc/classes/RDPipelineDepthStencilState.xml b/doc/classes/RDPipelineDepthStencilState.xml new file mode 100644 index 0000000000..562ff52819 --- /dev/null +++ b/doc/classes/RDPipelineDepthStencilState.xml @@ -0,0 +1,57 @@ +<?xml version="1.0" encoding="UTF-8" ?> +<class name="RDPipelineDepthStencilState" inherits="Reference" version="4.0"> + <brief_description> + </brief_description> + <description> + </description> + <tutorials> + </tutorials> + <methods> + </methods> + <members> + <member name="back_op_compare" type="int" setter="set_back_op_compare" getter="get_back_op_compare" enum="RenderingDevice.CompareOperator" default="7"> + </member> + <member name="back_op_compare_mask" type="int" setter="set_back_op_compare_mask" getter="get_back_op_compare_mask" default="0"> + </member> + <member name="back_op_depth_fail" type="int" setter="set_back_op_depth_fail" getter="get_back_op_depth_fail" enum="RenderingDevice.StencilOperation" default="1"> + </member> + <member name="back_op_fail" type="int" setter="set_back_op_fail" getter="get_back_op_fail" enum="RenderingDevice.StencilOperation" default="1"> + </member> + <member name="back_op_pass" type="int" setter="set_back_op_pass" getter="get_back_op_pass" enum="RenderingDevice.StencilOperation" default="1"> + </member> + <member name="back_op_reference" type="int" setter="set_back_op_reference" getter="get_back_op_reference" default="0"> + </member> + <member name="back_op_write_mask" type="int" setter="set_back_op_write_mask" getter="get_back_op_write_mask" default="0"> + </member> + <member name="depth_compare_operator" type="int" setter="set_depth_compare_operator" getter="get_depth_compare_operator" enum="RenderingDevice.CompareOperator" default="7"> + </member> + <member name="depth_range_max" type="float" setter="set_depth_range_max" getter="get_depth_range_max" default="0.0"> + </member> + <member name="depth_range_min" type="float" setter="set_depth_range_min" getter="get_depth_range_min" default="0.0"> + </member> + <member name="enable_depth_range" type="bool" setter="set_enable_depth_range" getter="get_enable_depth_range" default="false"> + </member> + <member name="enable_depth_test" type="bool" setter="set_enable_depth_test" getter="get_enable_depth_test" default="false"> + </member> + <member name="enable_depth_write" type="bool" setter="set_enable_depth_write" getter="get_enable_depth_write" default="false"> + </member> + <member name="enable_stencil" type="bool" setter="set_enable_stencil" getter="get_enable_stencil" default="false"> + </member> + <member name="front_op_compare" type="int" setter="set_front_op_compare" getter="get_front_op_compare" enum="RenderingDevice.CompareOperator" default="7"> + </member> + <member name="front_op_compare_mask" type="int" setter="set_front_op_compare_mask" getter="get_front_op_compare_mask" default="0"> + </member> + <member name="front_op_depth_fail" type="int" setter="set_front_op_depth_fail" getter="get_front_op_depth_fail" enum="RenderingDevice.StencilOperation" default="1"> + </member> + <member name="front_op_fail" type="int" setter="set_front_op_fail" getter="get_front_op_fail" enum="RenderingDevice.StencilOperation" default="1"> + </member> + <member name="front_op_pass" type="int" setter="set_front_op_pass" getter="get_front_op_pass" enum="RenderingDevice.StencilOperation" default="1"> + </member> + <member name="front_op_reference" type="int" setter="set_front_op_reference" getter="get_front_op_reference" default="0"> + </member> + <member name="front_op_write_mask" type="int" setter="set_front_op_write_mask" getter="get_front_op_write_mask" default="0"> + </member> + </members> + <constants> + </constants> +</class> diff --git a/doc/classes/RDPipelineMultisampleState.xml b/doc/classes/RDPipelineMultisampleState.xml new file mode 100644 index 0000000000..4658c7d9ba --- /dev/null +++ b/doc/classes/RDPipelineMultisampleState.xml @@ -0,0 +1,27 @@ +<?xml version="1.0" encoding="UTF-8" ?> +<class name="RDPipelineMultisampleState" inherits="Reference" version="4.0"> + <brief_description> + </brief_description> + <description> + </description> + <tutorials> + </tutorials> + <methods> + </methods> + <members> + <member name="enable_alpha_to_coverage" type="bool" setter="set_enable_alpha_to_coverage" getter="get_enable_alpha_to_coverage" default="false"> + </member> + <member name="enable_alpha_to_one" type="bool" setter="set_enable_alpha_to_one" getter="get_enable_alpha_to_one" default="false"> + </member> + <member name="enable_sample_shading" type="bool" setter="set_enable_sample_shading" getter="get_enable_sample_shading" default="false"> + </member> + <member name="min_sample_shading" type="float" setter="set_min_sample_shading" getter="get_min_sample_shading" default="0.0"> + </member> + <member name="sample_count" type="int" setter="set_sample_count" getter="get_sample_count" enum="RenderingDevice.TextureSamples" default="0"> + </member> + <member name="sample_masks" type="int[]" setter="set_sample_masks" getter="get_sample_masks" default="[ ]"> + </member> + </members> + <constants> + </constants> +</class> diff --git a/doc/classes/RDPipelineRasterizationState.xml b/doc/classes/RDPipelineRasterizationState.xml new file mode 100644 index 0000000000..5064dd6deb --- /dev/null +++ b/doc/classes/RDPipelineRasterizationState.xml @@ -0,0 +1,37 @@ +<?xml version="1.0" encoding="UTF-8" ?> +<class name="RDPipelineRasterizationState" inherits="Reference" version="4.0"> + <brief_description> + </brief_description> + <description> + </description> + <tutorials> + </tutorials> + <methods> + </methods> + <members> + <member name="cull_mode" type="int" setter="set_cull_mode" getter="get_cull_mode" enum="RenderingDevice.PolygonCullMode" default="0"> + </member> + <member name="depth_bias_clamp" type="float" setter="set_depth_bias_clamp" getter="get_depth_bias_clamp" default="0.0"> + </member> + <member name="depth_bias_constant_factor" type="float" setter="set_depth_bias_constant_factor" getter="get_depth_bias_constant_factor" default="0.0"> + </member> + <member name="depth_bias_enable" type="bool" setter="set_depth_bias_enable" getter="get_depth_bias_enable" default="false"> + </member> + <member name="depth_bias_slope_factor" type="float" setter="set_depth_bias_slope_factor" getter="get_depth_bias_slope_factor" default="0.0"> + </member> + <member name="discard_primitives" type="bool" setter="set_discard_primitives" getter="get_discard_primitives" default="false"> + </member> + <member name="enable_depth_clamp" type="bool" setter="set_enable_depth_clamp" getter="get_enable_depth_clamp" default="false"> + </member> + <member name="front_face" type="int" setter="set_front_face" getter="get_front_face" enum="RenderingDevice.PolygonFrontFace" default="0"> + </member> + <member name="line_width" type="float" setter="set_line_width" getter="get_line_width" default="1.0"> + </member> + <member name="patch_control_points" type="int" setter="set_patch_control_points" getter="get_patch_control_points" default="1"> + </member> + <member name="wireframe" type="bool" setter="set_wireframe" getter="get_wireframe" default="false"> + </member> + </members> + <constants> + </constants> +</class> diff --git a/doc/classes/RDSamplerState.xml b/doc/classes/RDSamplerState.xml new file mode 100644 index 0000000000..ab31960b7c --- /dev/null +++ b/doc/classes/RDSamplerState.xml @@ -0,0 +1,45 @@ +<?xml version="1.0" encoding="UTF-8" ?> +<class name="RDSamplerState" inherits="Reference" version="4.0"> + <brief_description> + </brief_description> + <description> + </description> + <tutorials> + </tutorials> + <methods> + </methods> + <members> + <member name="anisotropy_max" type="float" setter="set_anisotropy_max" getter="get_anisotropy_max" default="1.0"> + </member> + <member name="border_color" type="int" setter="set_border_color" getter="get_border_color" enum="RenderingDevice.SamplerBorderColor" default="2"> + </member> + <member name="compare_op" type="int" setter="set_compare_op" getter="get_compare_op" enum="RenderingDevice.CompareOperator" default="7"> + </member> + <member name="enable_compare" type="bool" setter="set_enable_compare" getter="get_enable_compare" default="false"> + </member> + <member name="lod_bias" type="float" setter="set_lod_bias" getter="get_lod_bias" default="0.0"> + </member> + <member name="mag_filter" type="int" setter="set_mag_filter" getter="get_mag_filter" enum="RenderingDevice.SamplerFilter" default="0"> + </member> + <member name="max_lod" type="float" setter="set_max_lod" getter="get_max_lod" default="1e+20"> + </member> + <member name="min_filter" type="int" setter="set_min_filter" getter="get_min_filter" enum="RenderingDevice.SamplerFilter" default="0"> + </member> + <member name="min_lod" type="float" setter="set_min_lod" getter="get_min_lod" default="0.0"> + </member> + <member name="mip_filter" type="int" setter="set_mip_filter" getter="get_mip_filter" enum="RenderingDevice.SamplerFilter" default="0"> + </member> + <member name="repeat_u" type="int" setter="set_repeat_u" getter="get_repeat_u" enum="RenderingDevice.SamplerRepeatMode" default="2"> + </member> + <member name="repeat_v" type="int" setter="set_repeat_v" getter="get_repeat_v" enum="RenderingDevice.SamplerRepeatMode" default="2"> + </member> + <member name="repeat_w" type="int" setter="set_repeat_w" getter="get_repeat_w" enum="RenderingDevice.SamplerRepeatMode" default="2"> + </member> + <member name="unnormalized_uvw" type="bool" setter="set_unnormalized_uvw" getter="get_unnormalized_uvw" default="false"> + </member> + <member name="use_anisotropy" type="bool" setter="set_use_anisotropy" getter="get_use_anisotropy" default="false"> + </member> + </members> + <constants> + </constants> +</class> diff --git a/doc/classes/RDShaderBytecode.xml b/doc/classes/RDShaderBytecode.xml new file mode 100644 index 0000000000..7a3501004e --- /dev/null +++ b/doc/classes/RDShaderBytecode.xml @@ -0,0 +1,71 @@ +<?xml version="1.0" encoding="UTF-8" ?> +<class name="RDShaderBytecode" inherits="Resource" version="4.0"> + <brief_description> + </brief_description> + <description> + </description> + <tutorials> + </tutorials> + <methods> + <method name="get_stage_bytecode" qualifiers="const"> + <return type="PackedByteArray"> + </return> + <argument index="0" name="stage" type="int" enum="RenderingDevice.ShaderStage"> + </argument> + <description> + </description> + </method> + <method name="get_stage_compile_error" qualifiers="const"> + <return type="String"> + </return> + <argument index="0" name="stage" type="int" enum="RenderingDevice.ShaderStage"> + </argument> + <description> + </description> + </method> + <method name="set_stage_bytecode"> + <return type="void"> + </return> + <argument index="0" name="stage" type="int" enum="RenderingDevice.ShaderStage"> + </argument> + <argument index="1" name="bytecode" type="PackedByteArray"> + </argument> + <description> + </description> + </method> + <method name="set_stage_compile_error"> + <return type="void"> + </return> + <argument index="0" name="stage" type="int" enum="RenderingDevice.ShaderStage"> + </argument> + <argument index="1" name="compile_error" type="String"> + </argument> + <description> + </description> + </method> + </methods> + <members> + <member name="bytecode_compute" type="PackedByteArray" setter="set_stage_bytecode" getter="get_stage_bytecode" default="PackedByteArray( )"> + </member> + <member name="bytecode_fragment" type="PackedByteArray" setter="set_stage_bytecode" getter="get_stage_bytecode" default="PackedByteArray( )"> + </member> + <member name="bytecode_tesselation_control" type="PackedByteArray" setter="set_stage_bytecode" getter="get_stage_bytecode" default="PackedByteArray( )"> + </member> + <member name="bytecode_tesselation_evaluation" type="PackedByteArray" setter="set_stage_bytecode" getter="get_stage_bytecode" default="PackedByteArray( )"> + </member> + <member name="bytecode_vertex" type="PackedByteArray" setter="set_stage_bytecode" getter="get_stage_bytecode" default="PackedByteArray( )"> + </member> + <member name="compile_error_compute" type="String" setter="set_stage_compile_error" getter="get_stage_compile_error" default=""""> + </member> + <member name="compile_error_fragment" type="String" setter="set_stage_compile_error" getter="get_stage_compile_error" default=""""> + </member> + <member name="compile_error_tesselation_control" type="String" setter="set_stage_compile_error" getter="get_stage_compile_error" default=""""> + </member> + <member name="compile_error_tesselation_evaluation" type="String" setter="set_stage_compile_error" getter="get_stage_compile_error" default=""""> + </member> + <member name="compile_error_vertex" type="String" setter="set_stage_compile_error" getter="get_stage_compile_error" default=""""> + </member> + </members> + <constants> + </constants> +</class> diff --git a/doc/classes/RDShaderFile.xml b/doc/classes/RDShaderFile.xml new file mode 100644 index 0000000000..14e70d53ea --- /dev/null +++ b/doc/classes/RDShaderFile.xml @@ -0,0 +1,41 @@ +<?xml version="1.0" encoding="UTF-8" ?> +<class name="RDShaderFile" inherits="Resource" version="4.0"> + <brief_description> + </brief_description> + <description> + </description> + <tutorials> + </tutorials> + <methods> + <method name="get_bytecode" qualifiers="const"> + <return type="RDShaderBytecode"> + </return> + <argument index="0" name="version" type="StringName" default="@"""> + </argument> + <description> + </description> + </method> + <method name="get_version_list" qualifiers="const"> + <return type="PackedStringArray"> + </return> + <description> + </description> + </method> + <method name="set_bytecode"> + <return type="void"> + </return> + <argument index="0" name="bytecode" type="RDShaderBytecode"> + </argument> + <argument index="1" name="version" type="StringName" default="@"""> + </argument> + <description> + </description> + </method> + </methods> + <members> + <member name="base_error" type="String" setter="set_base_error" getter="get_base_error" default=""""> + </member> + </members> + <constants> + </constants> +</class> diff --git a/doc/classes/RDShaderSource.xml b/doc/classes/RDShaderSource.xml new file mode 100644 index 0000000000..c1cfd34bb7 --- /dev/null +++ b/doc/classes/RDShaderSource.xml @@ -0,0 +1,45 @@ +<?xml version="1.0" encoding="UTF-8" ?> +<class name="RDShaderSource" inherits="Reference" version="4.0"> + <brief_description> + </brief_description> + <description> + </description> + <tutorials> + </tutorials> + <methods> + <method name="get_stage_source" qualifiers="const"> + <return type="String"> + </return> + <argument index="0" name="stage" type="int" enum="RenderingDevice.ShaderStage"> + </argument> + <description> + </description> + </method> + <method name="set_stage_source"> + <return type="void"> + </return> + <argument index="0" name="stage" type="int" enum="RenderingDevice.ShaderStage"> + </argument> + <argument index="1" name="source" type="String"> + </argument> + <description> + </description> + </method> + </methods> + <members> + <member name="language" type="int" setter="set_language" getter="get_language" enum="RenderingDevice.ShaderLanguage" default="0"> + </member> + <member name="source_compute" type="String" setter="set_stage_source" getter="get_stage_source" default=""""> + </member> + <member name="source_fragment" type="String" setter="set_stage_source" getter="get_stage_source" default=""""> + </member> + <member name="source_tesselation_control" type="String" setter="set_stage_source" getter="get_stage_source" default=""""> + </member> + <member name="source_tesselation_evaluation" type="String" setter="set_stage_source" getter="get_stage_source" default=""""> + </member> + <member name="source_vertex" type="String" setter="set_stage_source" getter="get_stage_source" default=""""> + </member> + </members> + <constants> + </constants> +</class> diff --git a/doc/classes/RDTextureFormat.xml b/doc/classes/RDTextureFormat.xml new file mode 100644 index 0000000000..664d4cadff --- /dev/null +++ b/doc/classes/RDTextureFormat.xml @@ -0,0 +1,49 @@ +<?xml version="1.0" encoding="UTF-8" ?> +<class name="RDTextureFormat" inherits="Reference" version="4.0"> + <brief_description> + </brief_description> + <description> + </description> + <tutorials> + </tutorials> + <methods> + <method name="add_shareable_format"> + <return type="void"> + </return> + <argument index="0" name="format" type="int" enum="RenderingDevice.DataFormat"> + </argument> + <description> + </description> + </method> + <method name="remove_shareable_format"> + <return type="void"> + </return> + <argument index="0" name="format" type="int" enum="RenderingDevice.DataFormat"> + </argument> + <description> + </description> + </method> + </methods> + <members> + <member name="array_layers" type="int" setter="set_array_layers" getter="get_array_layers" default="1"> + </member> + <member name="depth" type="int" setter="set_depth" getter="get_depth" default="1"> + </member> + <member name="format" type="int" setter="set_format" getter="get_format" enum="RenderingDevice.DataFormat" default="8"> + </member> + <member name="height" type="int" setter="set_height" getter="get_height" default="1"> + </member> + <member name="mipmaps" type="int" setter="set_mipmaps" getter="get_mipmaps" default="1"> + </member> + <member name="samples" type="int" setter="set_samples" getter="get_samples" enum="RenderingDevice.TextureSamples" default="0"> + </member> + <member name="type" type="int" setter="set_type" getter="get_type" enum="RenderingDevice.TextureType" default="1"> + </member> + <member name="usage_bits" type="int" setter="set_usage_bits" getter="get_usage_bits" default="0"> + </member> + <member name="width" type="int" setter="set_width" getter="get_width" default="1"> + </member> + </members> + <constants> + </constants> +</class> diff --git a/doc/classes/RDTextureView.xml b/doc/classes/RDTextureView.xml new file mode 100644 index 0000000000..73b2a7ae4a --- /dev/null +++ b/doc/classes/RDTextureView.xml @@ -0,0 +1,25 @@ +<?xml version="1.0" encoding="UTF-8" ?> +<class name="RDTextureView" inherits="Reference" version="4.0"> + <brief_description> + </brief_description> + <description> + </description> + <tutorials> + </tutorials> + <methods> + </methods> + <members> + <member name="format_override" type="int" setter="set_format_override" getter="get_format_override" enum="RenderingDevice.DataFormat" default="226"> + </member> + <member name="swizzle_a" type="int" setter="set_swizzle_a" getter="get_swizzle_a" enum="RenderingDevice.TextureSwizzle" default="6"> + </member> + <member name="swizzle_b" type="int" setter="set_swizzle_b" getter="get_swizzle_b" enum="RenderingDevice.TextureSwizzle" default="5"> + </member> + <member name="swizzle_g" type="int" setter="set_swizzle_g" getter="get_swizzle_g" enum="RenderingDevice.TextureSwizzle" default="4"> + </member> + <member name="swizzle_r" type="int" setter="set_swizzle_r" getter="get_swizzle_r" enum="RenderingDevice.TextureSwizzle" default="3"> + </member> + </members> + <constants> + </constants> +</class> diff --git a/doc/classes/RDUniform.xml b/doc/classes/RDUniform.xml new file mode 100644 index 0000000000..e5bace32af --- /dev/null +++ b/doc/classes/RDUniform.xml @@ -0,0 +1,39 @@ +<?xml version="1.0" encoding="UTF-8" ?> +<class name="RDUniform" inherits="Reference" version="4.0"> + <brief_description> + </brief_description> + <description> + </description> + <tutorials> + </tutorials> + <methods> + <method name="add_id"> + <return type="void"> + </return> + <argument index="0" name="id" type="RID"> + </argument> + <description> + </description> + </method> + <method name="clear_ids"> + <return type="void"> + </return> + <description> + </description> + </method> + <method name="get_ids" qualifiers="const"> + <return type="Array"> + </return> + <description> + </description> + </method> + </methods> + <members> + <member name="binding" type="int" setter="set_binding" getter="get_binding" default="0"> + </member> + <member name="type" type="int" setter="set_type" getter="get_type" enum="RenderingDevice.UniformType" default="3"> + </member> + </members> + <constants> + </constants> +</class> diff --git a/doc/classes/RDVertexAttribute.xml b/doc/classes/RDVertexAttribute.xml new file mode 100644 index 0000000000..56fe40b51d --- /dev/null +++ b/doc/classes/RDVertexAttribute.xml @@ -0,0 +1,25 @@ +<?xml version="1.0" encoding="UTF-8" ?> +<class name="RDVertexAttribute" inherits="Reference" version="4.0"> + <brief_description> + </brief_description> + <description> + </description> + <tutorials> + </tutorials> + <methods> + </methods> + <members> + <member name="format" type="int" setter="set_format" getter="get_format" enum="RenderingDevice.DataFormat" default="226"> + </member> + <member name="frequency" type="int" setter="set_frequency" getter="get_frequency" enum="RenderingDevice.VertexFrequency" default="0"> + </member> + <member name="location" type="int" setter="set_location" getter="get_location" default="0"> + </member> + <member name="offset" type="int" setter="set_offset" getter="get_offset" default="0"> + </member> + <member name="stride" type="int" setter="set_stride" getter="get_stride" default="0"> + </member> + </members> + <constants> + </constants> +</class> diff --git a/doc/classes/RenderingDevice.xml b/doc/classes/RenderingDevice.xml index 2615f0a2e9..8a44d213e8 100644 --- a/doc/classes/RenderingDevice.xml +++ b/doc/classes/RenderingDevice.xml @@ -7,7 +7,1593 @@ <tutorials> </tutorials> <methods> + <method name="buffer_get_data"> + <return type="PackedByteArray"> + </return> + <argument index="0" name="buffer" type="RID"> + </argument> + <description> + </description> + </method> + <method name="buffer_update"> + <return type="int" enum="Error"> + </return> + <argument index="0" name="buffer" type="RID"> + </argument> + <argument index="1" name="offset" type="int"> + </argument> + <argument index="2" name="size_bytes" type="int"> + </argument> + <argument index="3" name="data" type="PackedByteArray"> + </argument> + <argument index="4" name="sync_with_draw" type="bool" default="true"> + </argument> + <description> + </description> + </method> + <method name="capture_timestamp"> + <return type="void"> + </return> + <argument index="0" name="name" type="String"> + </argument> + <argument index="1" name="sync_to_draw" type="bool"> + </argument> + <description> + </description> + </method> + <method name="compute_list_add_barrier"> + <return type="void"> + </return> + <argument index="0" name="compute_list" type="int"> + </argument> + <description> + </description> + </method> + <method name="compute_list_begin"> + <return type="int"> + </return> + <description> + </description> + </method> + <method name="compute_list_bind_compute_pipeline"> + <return type="void"> + </return> + <argument index="0" name="compute_list" type="int"> + </argument> + <argument index="1" name="compute_pipeline" type="RID"> + </argument> + <description> + </description> + </method> + <method name="compute_list_bind_uniform_set"> + <return type="void"> + </return> + <argument index="0" name="compute_list" type="int"> + </argument> + <argument index="1" name="uniform_set" type="RID"> + </argument> + <argument index="2" name="set_index" type="int"> + </argument> + <description> + </description> + </method> + <method name="compute_list_dispatch"> + <return type="void"> + </return> + <argument index="0" name="compute_list" type="int"> + </argument> + <argument index="1" name="x_groups" type="int"> + </argument> + <argument index="2" name="y_groups" type="int"> + </argument> + <argument index="3" name="z_groups" type="int"> + </argument> + <description> + </description> + </method> + <method name="compute_list_end"> + <return type="void"> + </return> + <description> + </description> + </method> + <method name="compute_list_set_push_constant"> + <return type="void"> + </return> + <argument index="0" name="compute_list" type="int"> + </argument> + <argument index="1" name="buffer" type="PackedByteArray"> + </argument> + <argument index="2" name="size_bytes" type="int"> + </argument> + <description> + </description> + </method> + <method name="compute_pipeline_create"> + <return type="RID"> + </return> + <argument index="0" name="shader" type="RID"> + </argument> + <description> + </description> + </method> + <method name="compute_pipeline_is_valid"> + <return type="bool"> + </return> + <argument index="0" name="compute_pieline" type="RID"> + </argument> + <description> + </description> + </method> + <method name="create_local_device"> + <return type="RenderingDevice"> + </return> + <description> + </description> + </method> + <method name="draw_list_begin"> + <return type="int"> + </return> + <argument index="0" name="framebuffer" type="RID"> + </argument> + <argument index="1" name="initial_color_action" type="int" enum="RenderingDevice.InitialAction"> + </argument> + <argument index="2" name="final_color_action" type="int" enum="RenderingDevice.FinalAction"> + </argument> + <argument index="3" name="initial_depth_action" type="int" enum="RenderingDevice.InitialAction"> + </argument> + <argument index="4" name="final_depth_action" type="int" enum="RenderingDevice.FinalAction"> + </argument> + <argument index="5" name="clear_color_values" type="PackedColorArray" default="PackedColorArray( )"> + </argument> + <argument index="6" name="clear_depth" type="float" default="1.0"> + </argument> + <argument index="7" name="clear_stencil" type="int" default="0"> + </argument> + <argument index="8" name="region" type="Rect2" default="Rect2i( 0, 0, 0, 0 )"> + </argument> + <description> + </description> + </method> + <method name="draw_list_begin_for_screen"> + <return type="int"> + </return> + <argument index="0" name="screen" type="int" default="0"> + </argument> + <argument index="1" name="clear_color" type="Color" default="Color( 0, 0, 0, 1 )"> + </argument> + <description> + </description> + </method> + <method name="draw_list_begin_split"> + <return type="PackedInt64Array"> + </return> + <argument index="0" name="framebuffer" type="RID"> + </argument> + <argument index="1" name="splits" type="int"> + </argument> + <argument index="2" name="initial_color_action" type="int" enum="RenderingDevice.InitialAction"> + </argument> + <argument index="3" name="final_color_action" type="int" enum="RenderingDevice.FinalAction"> + </argument> + <argument index="4" name="initial_depth_action" type="int" enum="RenderingDevice.InitialAction"> + </argument> + <argument index="5" name="final_depth_action" type="int" enum="RenderingDevice.FinalAction"> + </argument> + <argument index="6" name="clear_color_values" type="PackedColorArray" default="PackedColorArray( )"> + </argument> + <argument index="7" name="clear_depth" type="float" default="1.0"> + </argument> + <argument index="8" name="clear_stencil" type="int" default="0"> + </argument> + <argument index="9" name="region" type="Rect2" default="Rect2i( 0, 0, 0, 0 )"> + </argument> + <description> + </description> + </method> + <method name="draw_list_bind_index_array"> + <return type="void"> + </return> + <argument index="0" name="draw_list" type="int"> + </argument> + <argument index="1" name="index_array" type="RID"> + </argument> + <description> + </description> + </method> + <method name="draw_list_bind_render_pipeline"> + <return type="void"> + </return> + <argument index="0" name="draw_list" type="int"> + </argument> + <argument index="1" name="render_pipeline" type="RID"> + </argument> + <description> + </description> + </method> + <method name="draw_list_bind_uniform_set"> + <return type="void"> + </return> + <argument index="0" name="draw_list" type="int"> + </argument> + <argument index="1" name="uniform_set" type="RID"> + </argument> + <argument index="2" name="set_index" type="int"> + </argument> + <description> + </description> + </method> + <method name="draw_list_bind_vertex_array"> + <return type="void"> + </return> + <argument index="0" name="draw_list" type="int"> + </argument> + <argument index="1" name="vertex_array" type="RID"> + </argument> + <description> + </description> + </method> + <method name="draw_list_disable_scissor"> + <return type="void"> + </return> + <argument index="0" name="draw_list" type="int"> + </argument> + <description> + </description> + </method> + <method name="draw_list_draw"> + <return type="void"> + </return> + <argument index="0" name="draw_list" type="int"> + </argument> + <argument index="1" name="use_indices" type="bool"> + </argument> + <argument index="2" name="instances" type="int"> + </argument> + <argument index="3" name="procedural_vertex_count" type="int" default="0"> + </argument> + <description> + </description> + </method> + <method name="draw_list_enable_scissor"> + <return type="void"> + </return> + <argument index="0" name="draw_list" type="int"> + </argument> + <argument index="1" name="rect" type="Rect2" default="Rect2i( 0, 0, 0, 0 )"> + </argument> + <description> + </description> + </method> + <method name="draw_list_end"> + <return type="void"> + </return> + <description> + </description> + </method> + <method name="draw_list_set_push_constant"> + <return type="void"> + </return> + <argument index="0" name="draw_list" type="int"> + </argument> + <argument index="1" name="buffer" type="PackedByteArray"> + </argument> + <argument index="2" name="size_bytes" type="int"> + </argument> + <description> + </description> + </method> + <method name="framebuffer_create"> + <return type="RID"> + </return> + <argument index="0" name="textures" type="Array"> + </argument> + <argument index="1" name="validate_with_format" type="int" default="-1"> + </argument> + <description> + </description> + </method> + <method name="framebuffer_format_create"> + <return type="int"> + </return> + <argument index="0" name="attachments" type="RDAttachmentFormat[]"> + </argument> + <description> + </description> + </method> + <method name="framebuffer_format_get_texture_samples"> + <return type="int" enum="RenderingDevice.TextureSamples"> + </return> + <argument index="0" name="format" type="int"> + </argument> + <description> + </description> + </method> + <method name="framebuffer_get_format"> + <return type="int"> + </return> + <argument index="0" name="framebuffer" type="RID"> + </argument> + <description> + </description> + </method> + <method name="free"> + <return type="void"> + </return> + <argument index="0" name="rid" type="RID"> + </argument> + <description> + </description> + </method> + <method name="get_captured_timestamp_cpu_time" qualifiers="const"> + <return type="int"> + </return> + <argument index="0" name="index" type="int"> + </argument> + <description> + </description> + </method> + <method name="get_captured_timestamp_gpu_time" qualifiers="const"> + <return type="int"> + </return> + <argument index="0" name="index" type="int"> + </argument> + <description> + </description> + </method> + <method name="get_captured_timestamp_name" qualifiers="const"> + <return type="String"> + </return> + <argument index="0" name="index" type="int"> + </argument> + <description> + </description> + </method> + <method name="get_captured_timestamps_count" qualifiers="const"> + <return type="int"> + </return> + <description> + </description> + </method> + <method name="get_captured_timestamps_frame" qualifiers="const"> + <return type="int"> + </return> + <description> + </description> + </method> + <method name="get_frame_delay" qualifiers="const"> + <return type="int"> + </return> + <description> + </description> + </method> + <method name="index_array_create"> + <return type="RID"> + </return> + <argument index="0" name="index_buffer" type="RID"> + </argument> + <argument index="1" name="index_offset" type="int"> + </argument> + <argument index="2" name="index_count" type="int"> + </argument> + <description> + </description> + </method> + <method name="index_buffer_create"> + <return type="RID"> + </return> + <argument index="0" name="size_indices" type="int"> + </argument> + <argument index="1" name="format" type="int" enum="RenderingDevice.IndexBufferFormat"> + </argument> + <argument index="2" name="data" type="PackedByteArray" default="PackedByteArray( )"> + </argument> + <argument index="3" name="arg3" type="bool" default="false"> + </argument> + <description> + </description> + </method> + <method name="limit_get"> + <return type="int"> + </return> + <argument index="0" name="limit" type="int" enum="RenderingDevice.Limit"> + </argument> + <description> + </description> + </method> + <method name="render_pipeline_create"> + <return type="RID"> + </return> + <argument index="0" name="shader" type="RID"> + </argument> + <argument index="1" name="framebuffer_format" type="int"> + </argument> + <argument index="2" name="vertex_format" type="int"> + </argument> + <argument index="3" name="primitive" type="int" enum="RenderingDevice.RenderPrimitive"> + </argument> + <argument index="4" name="rasterization_state" type="RDPipelineRasterizationState"> + </argument> + <argument index="5" name="multisample_state" type="RDPipelineMultisampleState"> + </argument> + <argument index="6" name="stencil_state" type="RDPipelineDepthStencilState"> + </argument> + <argument index="7" name="color_blend_state" type="RDPipelineColorBlendState"> + </argument> + <argument index="8" name="dynamic_state_flags" type="int" default="0"> + </argument> + <description> + </description> + </method> + <method name="render_pipeline_is_valid"> + <return type="bool"> + </return> + <argument index="0" name="render_pipeline" type="RID"> + </argument> + <description> + </description> + </method> + <method name="sampler_create"> + <return type="RID"> + </return> + <argument index="0" name="state" type="RDSamplerState"> + </argument> + <description> + </description> + </method> + <method name="screen_get_framebuffer_format" qualifiers="const"> + <return type="int"> + </return> + <description> + </description> + </method> + <method name="screen_get_height" qualifiers="const"> + <return type="int"> + </return> + <argument index="0" name="screen" type="int" default="0"> + </argument> + <description> + </description> + </method> + <method name="screen_get_width" qualifiers="const"> + <return type="int"> + </return> + <argument index="0" name="screen" type="int" default="0"> + </argument> + <description> + </description> + </method> + <method name="shader_compile_from_source"> + <return type="RDShaderBytecode"> + </return> + <argument index="0" name="shader_source" type="RDShaderSource"> + </argument> + <argument index="1" name="allow_cache" type="bool" default="true"> + </argument> + <description> + </description> + </method> + <method name="shader_create"> + <return type="RID"> + </return> + <argument index="0" name="shader_data" type="RDShaderBytecode"> + </argument> + <description> + </description> + </method> + <method name="shader_get_vertex_input_attribute_mask"> + <return type="int"> + </return> + <argument index="0" name="shader" type="RID"> + </argument> + <description> + </description> + </method> + <method name="storage_buffer_create"> + <return type="RID"> + </return> + <argument index="0" name="size_bytes" type="int"> + </argument> + <argument index="1" name="data" type="PackedByteArray" default="PackedByteArray( )"> + </argument> + <description> + </description> + </method> + <method name="submit"> + <return type="void"> + </return> + <description> + </description> + </method> + <method name="sync"> + <return type="void"> + </return> + <description> + </description> + </method> + <method name="texture_buffer_create"> + <return type="RID"> + </return> + <argument index="0" name="size_bytes" type="int"> + </argument> + <argument index="1" name="format" type="int" enum="RenderingDevice.DataFormat"> + </argument> + <argument index="2" name="data" type="PackedByteArray" default="PackedByteArray( )"> + </argument> + <description> + </description> + </method> + <method name="texture_clear"> + <return type="int" enum="Error"> + </return> + <argument index="0" name="texture" type="RID"> + </argument> + <argument index="1" name="color" type="Color"> + </argument> + <argument index="2" name="base_mipmap" type="int"> + </argument> + <argument index="3" name="mipmap_count" type="int"> + </argument> + <argument index="4" name="base_layer" type="int"> + </argument> + <argument index="5" name="layer_count" type="int"> + </argument> + <argument index="6" name="sync_with_draw" type="bool" default="false"> + </argument> + <description> + </description> + </method> + <method name="texture_copy"> + <return type="int" enum="Error"> + </return> + <argument index="0" name="from_texture" type="RID"> + </argument> + <argument index="1" name="to_texture" type="RID"> + </argument> + <argument index="2" name="from_pos" type="Vector3"> + </argument> + <argument index="3" name="to_pos" type="Vector3"> + </argument> + <argument index="4" name="size" type="Vector3"> + </argument> + <argument index="5" name="src_mipmap" type="int"> + </argument> + <argument index="6" name="dst_mipmap" type="int"> + </argument> + <argument index="7" name="src_layer" type="int"> + </argument> + <argument index="8" name="dst_layer" type="int"> + </argument> + <argument index="9" name="sync_with_draw" type="bool" default="false"> + </argument> + <description> + </description> + </method> + <method name="texture_create"> + <return type="RID"> + </return> + <argument index="0" name="format" type="RDTextureFormat"> + </argument> + <argument index="1" name="view" type="RDTextureView"> + </argument> + <argument index="2" name="data" type="PackedByteArray[]" default="[ ]"> + </argument> + <description> + </description> + </method> + <method name="texture_create_shared"> + <return type="RID"> + </return> + <argument index="0" name="view" type="RDTextureView"> + </argument> + <argument index="1" name="with_texture" type="RID"> + </argument> + <description> + </description> + </method> + <method name="texture_create_shared_from_slice"> + <return type="RID"> + </return> + <argument index="0" name="view" type="RDTextureView"> + </argument> + <argument index="1" name="with_texture" type="RID"> + </argument> + <argument index="2" name="layer" type="int"> + </argument> + <argument index="3" name="mipmap" type="int"> + </argument> + <argument index="4" name="slice_type" type="int" enum="RenderingDevice.TextureSliceType" default="0"> + </argument> + <description> + </description> + </method> + <method name="texture_get_data"> + <return type="PackedByteArray"> + </return> + <argument index="0" name="texture" type="RID"> + </argument> + <argument index="1" name="layer" type="int"> + </argument> + <description> + </description> + </method> + <method name="texture_is_format_supported_for_usage" qualifiers="const"> + <return type="bool"> + </return> + <argument index="0" name="format" type="int" enum="RenderingDevice.DataFormat"> + </argument> + <argument index="1" name="usage_flags" type="int"> + </argument> + <description> + </description> + </method> + <method name="texture_is_shared"> + <return type="bool"> + </return> + <argument index="0" name="texture" type="RID"> + </argument> + <description> + </description> + </method> + <method name="texture_is_valid"> + <return type="bool"> + </return> + <argument index="0" name="texture" type="RID"> + </argument> + <description> + </description> + </method> + <method name="texture_resolve_multisample"> + <return type="int" enum="Error"> + </return> + <argument index="0" name="from_texture" type="RID"> + </argument> + <argument index="1" name="to_texture" type="RID"> + </argument> + <argument index="2" name="sync_with_draw" type="bool" default="false"> + </argument> + <description> + </description> + </method> + <method name="texture_update"> + <return type="int" enum="Error"> + </return> + <argument index="0" name="texture" type="RID"> + </argument> + <argument index="1" name="layer" type="int"> + </argument> + <argument index="2" name="data" type="PackedByteArray"> + </argument> + <argument index="3" name="sync_with_draw" type="bool" default="false"> + </argument> + <description> + </description> + </method> + <method name="uniform_buffer_create"> + <return type="RID"> + </return> + <argument index="0" name="size_bytes" type="int"> + </argument> + <argument index="1" name="data" type="PackedByteArray" default="PackedByteArray( )"> + </argument> + <description> + </description> + </method> + <method name="uniform_set_create"> + <return type="RID"> + </return> + <argument index="0" name="uniforms" type="Array"> + </argument> + <argument index="1" name="shader" type="RID"> + </argument> + <argument index="2" name="shader_set" type="int"> + </argument> + <description> + </description> + </method> + <method name="uniform_set_is_valid"> + <return type="bool"> + </return> + <argument index="0" name="uniform_set" type="RID"> + </argument> + <description> + </description> + </method> + <method name="vertex_buffer_create"> + <return type="RID"> + </return> + <argument index="0" name="size_bytes" type="int"> + </argument> + <argument index="1" name="data" type="PackedByteArray" default="PackedByteArray( )"> + </argument> + <description> + </description> + </method> + <method name="vertex_format_create"> + <return type="int"> + </return> + <argument index="0" name="vertex_descriptions" type="RDVertexAttribute[]"> + </argument> + <description> + </description> + </method> </methods> <constants> + <constant name="DATA_FORMAT_R4G4_UNORM_PACK8" value="0" enum="DataFormat"> + </constant> + <constant name="DATA_FORMAT_R4G4B4A4_UNORM_PACK16" value="1" enum="DataFormat"> + </constant> + <constant name="DATA_FORMAT_B4G4R4A4_UNORM_PACK16" value="2" enum="DataFormat"> + </constant> + <constant name="DATA_FORMAT_R5G6B5_UNORM_PACK16" value="3" enum="DataFormat"> + </constant> + <constant name="DATA_FORMAT_B5G6R5_UNORM_PACK16" value="4" enum="DataFormat"> + </constant> + <constant name="DATA_FORMAT_R5G5B5A1_UNORM_PACK16" value="5" enum="DataFormat"> + </constant> + <constant name="DATA_FORMAT_B5G5R5A1_UNORM_PACK16" value="6" enum="DataFormat"> + </constant> + <constant name="DATA_FORMAT_A1R5G5B5_UNORM_PACK16" value="7" enum="DataFormat"> + </constant> + <constant name="DATA_FORMAT_R8_UNORM" value="8" enum="DataFormat"> + </constant> + <constant name="DATA_FORMAT_R8_SNORM" value="9" enum="DataFormat"> + </constant> + <constant name="DATA_FORMAT_R8_USCALED" value="10" enum="DataFormat"> + </constant> + <constant name="DATA_FORMAT_R8_SSCALED" value="11" enum="DataFormat"> + </constant> + <constant name="DATA_FORMAT_R8_UINT" value="12" enum="DataFormat"> + </constant> + <constant name="DATA_FORMAT_R8_SINT" value="13" enum="DataFormat"> + </constant> + <constant name="DATA_FORMAT_R8_SRGB" value="14" enum="DataFormat"> + </constant> + <constant name="DATA_FORMAT_R8G8_UNORM" value="15" enum="DataFormat"> + </constant> + <constant name="DATA_FORMAT_R8G8_SNORM" value="16" enum="DataFormat"> + </constant> + <constant name="DATA_FORMAT_R8G8_USCALED" value="17" enum="DataFormat"> + </constant> + <constant name="DATA_FORMAT_R8G8_SSCALED" value="18" enum="DataFormat"> + </constant> + <constant name="DATA_FORMAT_R8G8_UINT" value="19" enum="DataFormat"> + </constant> + <constant name="DATA_FORMAT_R8G8_SINT" value="20" enum="DataFormat"> + </constant> + <constant name="DATA_FORMAT_R8G8_SRGB" value="21" enum="DataFormat"> + </constant> + <constant name="DATA_FORMAT_R8G8B8_UNORM" value="22" enum="DataFormat"> + </constant> + <constant name="DATA_FORMAT_R8G8B8_SNORM" value="23" enum="DataFormat"> + </constant> + <constant name="DATA_FORMAT_R8G8B8_USCALED" value="24" enum="DataFormat"> + </constant> + <constant name="DATA_FORMAT_R8G8B8_SSCALED" value="25" enum="DataFormat"> + </constant> + <constant name="DATA_FORMAT_R8G8B8_UINT" value="26" enum="DataFormat"> + </constant> + <constant name="DATA_FORMAT_R8G8B8_SINT" value="27" enum="DataFormat"> + </constant> + <constant name="DATA_FORMAT_R8G8B8_SRGB" value="28" enum="DataFormat"> + </constant> + <constant name="DATA_FORMAT_B8G8R8_UNORM" value="29" enum="DataFormat"> + </constant> + <constant name="DATA_FORMAT_B8G8R8_SNORM" value="30" enum="DataFormat"> + </constant> + <constant name="DATA_FORMAT_B8G8R8_USCALED" value="31" enum="DataFormat"> + </constant> + <constant name="DATA_FORMAT_B8G8R8_SSCALED" value="32" enum="DataFormat"> + </constant> + <constant name="DATA_FORMAT_B8G8R8_UINT" value="33" enum="DataFormat"> + </constant> + <constant name="DATA_FORMAT_B8G8R8_SINT" value="34" enum="DataFormat"> + </constant> + <constant name="DATA_FORMAT_B8G8R8_SRGB" value="35" enum="DataFormat"> + </constant> + <constant name="DATA_FORMAT_R8G8B8A8_UNORM" value="36" enum="DataFormat"> + </constant> + <constant name="DATA_FORMAT_R8G8B8A8_SNORM" value="37" enum="DataFormat"> + </constant> + <constant name="DATA_FORMAT_R8G8B8A8_USCALED" value="38" enum="DataFormat"> + </constant> + <constant name="DATA_FORMAT_R8G8B8A8_SSCALED" value="39" enum="DataFormat"> + </constant> + <constant name="DATA_FORMAT_R8G8B8A8_UINT" value="40" enum="DataFormat"> + </constant> + <constant name="DATA_FORMAT_R8G8B8A8_SINT" value="41" enum="DataFormat"> + </constant> + <constant name="DATA_FORMAT_R8G8B8A8_SRGB" value="42" enum="DataFormat"> + </constant> + <constant name="DATA_FORMAT_B8G8R8A8_UNORM" value="43" enum="DataFormat"> + </constant> + <constant name="DATA_FORMAT_B8G8R8A8_SNORM" value="44" enum="DataFormat"> + </constant> + <constant name="DATA_FORMAT_B8G8R8A8_USCALED" value="45" enum="DataFormat"> + </constant> + <constant name="DATA_FORMAT_B8G8R8A8_SSCALED" value="46" enum="DataFormat"> + </constant> + <constant name="DATA_FORMAT_B8G8R8A8_UINT" value="47" enum="DataFormat"> + </constant> + <constant name="DATA_FORMAT_B8G8R8A8_SINT" value="48" enum="DataFormat"> + </constant> + <constant name="DATA_FORMAT_B8G8R8A8_SRGB" value="49" enum="DataFormat"> + </constant> + <constant name="DATA_FORMAT_A8B8G8R8_UNORM_PACK32" value="50" enum="DataFormat"> + </constant> + <constant name="DATA_FORMAT_A8B8G8R8_SNORM_PACK32" value="51" enum="DataFormat"> + </constant> + <constant name="DATA_FORMAT_A8B8G8R8_USCALED_PACK32" value="52" enum="DataFormat"> + </constant> + <constant name="DATA_FORMAT_A8B8G8R8_SSCALED_PACK32" value="53" enum="DataFormat"> + </constant> + <constant name="DATA_FORMAT_A8B8G8R8_UINT_PACK32" value="54" enum="DataFormat"> + </constant> + <constant name="DATA_FORMAT_A8B8G8R8_SINT_PACK32" value="55" enum="DataFormat"> + </constant> + <constant name="DATA_FORMAT_A8B8G8R8_SRGB_PACK32" value="56" enum="DataFormat"> + </constant> + <constant name="DATA_FORMAT_A2R10G10B10_UNORM_PACK32" value="57" enum="DataFormat"> + </constant> + <constant name="DATA_FORMAT_A2R10G10B10_SNORM_PACK32" value="58" enum="DataFormat"> + </constant> + <constant name="DATA_FORMAT_A2R10G10B10_USCALED_PACK32" value="59" enum="DataFormat"> + </constant> + <constant name="DATA_FORMAT_A2R10G10B10_SSCALED_PACK32" value="60" enum="DataFormat"> + </constant> + <constant name="DATA_FORMAT_A2R10G10B10_UINT_PACK32" value="61" enum="DataFormat"> + </constant> + <constant name="DATA_FORMAT_A2R10G10B10_SINT_PACK32" value="62" enum="DataFormat"> + </constant> + <constant name="DATA_FORMAT_A2B10G10R10_UNORM_PACK32" value="63" enum="DataFormat"> + </constant> + <constant name="DATA_FORMAT_A2B10G10R10_SNORM_PACK32" value="64" enum="DataFormat"> + </constant> + <constant name="DATA_FORMAT_A2B10G10R10_USCALED_PACK32" value="65" enum="DataFormat"> + </constant> + <constant name="DATA_FORMAT_A2B10G10R10_SSCALED_PACK32" value="66" enum="DataFormat"> + </constant> + <constant name="DATA_FORMAT_A2B10G10R10_UINT_PACK32" value="67" enum="DataFormat"> + </constant> + <constant name="DATA_FORMAT_A2B10G10R10_SINT_PACK32" value="68" enum="DataFormat"> + </constant> + <constant name="DATA_FORMAT_R16_UNORM" value="69" enum="DataFormat"> + </constant> + <constant name="DATA_FORMAT_R16_SNORM" value="70" enum="DataFormat"> + </constant> + <constant name="DATA_FORMAT_R16_USCALED" value="71" enum="DataFormat"> + </constant> + <constant name="DATA_FORMAT_R16_SSCALED" value="72" enum="DataFormat"> + </constant> + <constant name="DATA_FORMAT_R16_UINT" value="73" enum="DataFormat"> + </constant> + <constant name="DATA_FORMAT_R16_SINT" value="74" enum="DataFormat"> + </constant> + <constant name="DATA_FORMAT_R16_SFLOAT" value="75" enum="DataFormat"> + </constant> + <constant name="DATA_FORMAT_R16G16_UNORM" value="76" enum="DataFormat"> + </constant> + <constant name="DATA_FORMAT_R16G16_SNORM" value="77" enum="DataFormat"> + </constant> + <constant name="DATA_FORMAT_R16G16_USCALED" value="78" enum="DataFormat"> + </constant> + <constant name="DATA_FORMAT_R16G16_SSCALED" value="79" enum="DataFormat"> + </constant> + <constant name="DATA_FORMAT_R16G16_UINT" value="80" enum="DataFormat"> + </constant> + <constant name="DATA_FORMAT_R16G16_SINT" value="81" enum="DataFormat"> + </constant> + <constant name="DATA_FORMAT_R16G16_SFLOAT" value="82" enum="DataFormat"> + </constant> + <constant name="DATA_FORMAT_R16G16B16_UNORM" value="83" enum="DataFormat"> + </constant> + <constant name="DATA_FORMAT_R16G16B16_SNORM" value="84" enum="DataFormat"> + </constant> + <constant name="DATA_FORMAT_R16G16B16_USCALED" value="85" enum="DataFormat"> + </constant> + <constant name="DATA_FORMAT_R16G16B16_SSCALED" value="86" enum="DataFormat"> + </constant> + <constant name="DATA_FORMAT_R16G16B16_UINT" value="87" enum="DataFormat"> + </constant> + <constant name="DATA_FORMAT_R16G16B16_SINT" value="88" enum="DataFormat"> + </constant> + <constant name="DATA_FORMAT_R16G16B16_SFLOAT" value="89" enum="DataFormat"> + </constant> + <constant name="DATA_FORMAT_R16G16B16A16_UNORM" value="90" enum="DataFormat"> + </constant> + <constant name="DATA_FORMAT_R16G16B16A16_SNORM" value="91" enum="DataFormat"> + </constant> + <constant name="DATA_FORMAT_R16G16B16A16_USCALED" value="92" enum="DataFormat"> + </constant> + <constant name="DATA_FORMAT_R16G16B16A16_SSCALED" value="93" enum="DataFormat"> + </constant> + <constant name="DATA_FORMAT_R16G16B16A16_UINT" value="94" enum="DataFormat"> + </constant> + <constant name="DATA_FORMAT_R16G16B16A16_SINT" value="95" enum="DataFormat"> + </constant> + <constant name="DATA_FORMAT_R16G16B16A16_SFLOAT" value="96" enum="DataFormat"> + </constant> + <constant name="DATA_FORMAT_R32_UINT" value="97" enum="DataFormat"> + </constant> + <constant name="DATA_FORMAT_R32_SINT" value="98" enum="DataFormat"> + </constant> + <constant name="DATA_FORMAT_R32_SFLOAT" value="99" enum="DataFormat"> + </constant> + <constant name="DATA_FORMAT_R32G32_UINT" value="100" enum="DataFormat"> + </constant> + <constant name="DATA_FORMAT_R32G32_SINT" value="101" enum="DataFormat"> + </constant> + <constant name="DATA_FORMAT_R32G32_SFLOAT" value="102" enum="DataFormat"> + </constant> + <constant name="DATA_FORMAT_R32G32B32_UINT" value="103" enum="DataFormat"> + </constant> + <constant name="DATA_FORMAT_R32G32B32_SINT" value="104" enum="DataFormat"> + </constant> + <constant name="DATA_FORMAT_R32G32B32_SFLOAT" value="105" enum="DataFormat"> + </constant> + <constant name="DATA_FORMAT_R32G32B32A32_UINT" value="106" enum="DataFormat"> + </constant> + <constant name="DATA_FORMAT_R32G32B32A32_SINT" value="107" enum="DataFormat"> + </constant> + <constant name="DATA_FORMAT_R32G32B32A32_SFLOAT" value="108" enum="DataFormat"> + </constant> + <constant name="DATA_FORMAT_R64_UINT" value="109" enum="DataFormat"> + </constant> + <constant name="DATA_FORMAT_R64_SINT" value="110" enum="DataFormat"> + </constant> + <constant name="DATA_FORMAT_R64_SFLOAT" value="111" enum="DataFormat"> + </constant> + <constant name="DATA_FORMAT_R64G64_UINT" value="112" enum="DataFormat"> + </constant> + <constant name="DATA_FORMAT_R64G64_SINT" value="113" enum="DataFormat"> + </constant> + <constant name="DATA_FORMAT_R64G64_SFLOAT" value="114" enum="DataFormat"> + </constant> + <constant name="DATA_FORMAT_R64G64B64_UINT" value="115" enum="DataFormat"> + </constant> + <constant name="DATA_FORMAT_R64G64B64_SINT" value="116" enum="DataFormat"> + </constant> + <constant name="DATA_FORMAT_R64G64B64_SFLOAT" value="117" enum="DataFormat"> + </constant> + <constant name="DATA_FORMAT_R64G64B64A64_UINT" value="118" enum="DataFormat"> + </constant> + <constant name="DATA_FORMAT_R64G64B64A64_SINT" value="119" enum="DataFormat"> + </constant> + <constant name="DATA_FORMAT_R64G64B64A64_SFLOAT" value="120" enum="DataFormat"> + </constant> + <constant name="DATA_FORMAT_B10G11R11_UFLOAT_PACK32" value="121" enum="DataFormat"> + </constant> + <constant name="DATA_FORMAT_E5B9G9R9_UFLOAT_PACK32" value="122" enum="DataFormat"> + </constant> + <constant name="DATA_FORMAT_D16_UNORM" value="123" enum="DataFormat"> + </constant> + <constant name="DATA_FORMAT_X8_D24_UNORM_PACK32" value="124" enum="DataFormat"> + </constant> + <constant name="DATA_FORMAT_D32_SFLOAT" value="125" enum="DataFormat"> + </constant> + <constant name="DATA_FORMAT_S8_UINT" value="126" enum="DataFormat"> + </constant> + <constant name="DATA_FORMAT_D16_UNORM_S8_UINT" value="127" enum="DataFormat"> + </constant> + <constant name="DATA_FORMAT_D24_UNORM_S8_UINT" value="128" enum="DataFormat"> + </constant> + <constant name="DATA_FORMAT_D32_SFLOAT_S8_UINT" value="129" enum="DataFormat"> + </constant> + <constant name="DATA_FORMAT_BC1_RGB_UNORM_BLOCK" value="130" enum="DataFormat"> + </constant> + <constant name="DATA_FORMAT_BC1_RGB_SRGB_BLOCK" value="131" enum="DataFormat"> + </constant> + <constant name="DATA_FORMAT_BC1_RGBA_UNORM_BLOCK" value="132" enum="DataFormat"> + </constant> + <constant name="DATA_FORMAT_BC1_RGBA_SRGB_BLOCK" value="133" enum="DataFormat"> + </constant> + <constant name="DATA_FORMAT_BC2_UNORM_BLOCK" value="134" enum="DataFormat"> + </constant> + <constant name="DATA_FORMAT_BC2_SRGB_BLOCK" value="135" enum="DataFormat"> + </constant> + <constant name="DATA_FORMAT_BC3_UNORM_BLOCK" value="136" enum="DataFormat"> + </constant> + <constant name="DATA_FORMAT_BC3_SRGB_BLOCK" value="137" enum="DataFormat"> + </constant> + <constant name="DATA_FORMAT_BC4_UNORM_BLOCK" value="138" enum="DataFormat"> + </constant> + <constant name="DATA_FORMAT_BC4_SNORM_BLOCK" value="139" enum="DataFormat"> + </constant> + <constant name="DATA_FORMAT_BC5_UNORM_BLOCK" value="140" enum="DataFormat"> + </constant> + <constant name="DATA_FORMAT_BC5_SNORM_BLOCK" value="141" enum="DataFormat"> + </constant> + <constant name="DATA_FORMAT_BC6H_UFLOAT_BLOCK" value="142" enum="DataFormat"> + </constant> + <constant name="DATA_FORMAT_BC6H_SFLOAT_BLOCK" value="143" enum="DataFormat"> + </constant> + <constant name="DATA_FORMAT_BC7_UNORM_BLOCK" value="144" enum="DataFormat"> + </constant> + <constant name="DATA_FORMAT_BC7_SRGB_BLOCK" value="145" enum="DataFormat"> + </constant> + <constant name="DATA_FORMAT_ETC2_R8G8B8_UNORM_BLOCK" value="146" enum="DataFormat"> + </constant> + <constant name="DATA_FORMAT_ETC2_R8G8B8_SRGB_BLOCK" value="147" enum="DataFormat"> + </constant> + <constant name="DATA_FORMAT_ETC2_R8G8B8A1_UNORM_BLOCK" value="148" enum="DataFormat"> + </constant> + <constant name="DATA_FORMAT_ETC2_R8G8B8A1_SRGB_BLOCK" value="149" enum="DataFormat"> + </constant> + <constant name="DATA_FORMAT_ETC2_R8G8B8A8_UNORM_BLOCK" value="150" enum="DataFormat"> + </constant> + <constant name="DATA_FORMAT_ETC2_R8G8B8A8_SRGB_BLOCK" value="151" enum="DataFormat"> + </constant> + <constant name="DATA_FORMAT_EAC_R11_UNORM_BLOCK" value="152" enum="DataFormat"> + </constant> + <constant name="DATA_FORMAT_EAC_R11_SNORM_BLOCK" value="153" enum="DataFormat"> + </constant> + <constant name="DATA_FORMAT_EAC_R11G11_UNORM_BLOCK" value="154" enum="DataFormat"> + </constant> + <constant name="DATA_FORMAT_EAC_R11G11_SNORM_BLOCK" value="155" enum="DataFormat"> + </constant> + <constant name="DATA_FORMAT_ASTC_4x4_UNORM_BLOCK" value="156" enum="DataFormat"> + </constant> + <constant name="DATA_FORMAT_ASTC_4x4_SRGB_BLOCK" value="157" enum="DataFormat"> + </constant> + <constant name="DATA_FORMAT_ASTC_5x4_UNORM_BLOCK" value="158" enum="DataFormat"> + </constant> + <constant name="DATA_FORMAT_ASTC_5x4_SRGB_BLOCK" value="159" enum="DataFormat"> + </constant> + <constant name="DATA_FORMAT_ASTC_5x5_UNORM_BLOCK" value="160" enum="DataFormat"> + </constant> + <constant name="DATA_FORMAT_ASTC_5x5_SRGB_BLOCK" value="161" enum="DataFormat"> + </constant> + <constant name="DATA_FORMAT_ASTC_6x5_UNORM_BLOCK" value="162" enum="DataFormat"> + </constant> + <constant name="DATA_FORMAT_ASTC_6x5_SRGB_BLOCK" value="163" enum="DataFormat"> + </constant> + <constant name="DATA_FORMAT_ASTC_6x6_UNORM_BLOCK" value="164" enum="DataFormat"> + </constant> + <constant name="DATA_FORMAT_ASTC_6x6_SRGB_BLOCK" value="165" enum="DataFormat"> + </constant> + <constant name="DATA_FORMAT_ASTC_8x5_UNORM_BLOCK" value="166" enum="DataFormat"> + </constant> + <constant name="DATA_FORMAT_ASTC_8x5_SRGB_BLOCK" value="167" enum="DataFormat"> + </constant> + <constant name="DATA_FORMAT_ASTC_8x6_UNORM_BLOCK" value="168" enum="DataFormat"> + </constant> + <constant name="DATA_FORMAT_ASTC_8x6_SRGB_BLOCK" value="169" enum="DataFormat"> + </constant> + <constant name="DATA_FORMAT_ASTC_8x8_UNORM_BLOCK" value="170" enum="DataFormat"> + </constant> + <constant name="DATA_FORMAT_ASTC_8x8_SRGB_BLOCK" value="171" enum="DataFormat"> + </constant> + <constant name="DATA_FORMAT_ASTC_10x5_UNORM_BLOCK" value="172" enum="DataFormat"> + </constant> + <constant name="DATA_FORMAT_ASTC_10x5_SRGB_BLOCK" value="173" enum="DataFormat"> + </constant> + <constant name="DATA_FORMAT_ASTC_10x6_UNORM_BLOCK" value="174" enum="DataFormat"> + </constant> + <constant name="DATA_FORMAT_ASTC_10x6_SRGB_BLOCK" value="175" enum="DataFormat"> + </constant> + <constant name="DATA_FORMAT_ASTC_10x8_UNORM_BLOCK" value="176" enum="DataFormat"> + </constant> + <constant name="DATA_FORMAT_ASTC_10x8_SRGB_BLOCK" value="177" enum="DataFormat"> + </constant> + <constant name="DATA_FORMAT_ASTC_10x10_UNORM_BLOCK" value="178" enum="DataFormat"> + </constant> + <constant name="DATA_FORMAT_ASTC_10x10_SRGB_BLOCK" value="179" enum="DataFormat"> + </constant> + <constant name="DATA_FORMAT_ASTC_12x10_UNORM_BLOCK" value="180" enum="DataFormat"> + </constant> + <constant name="DATA_FORMAT_ASTC_12x10_SRGB_BLOCK" value="181" enum="DataFormat"> + </constant> + <constant name="DATA_FORMAT_ASTC_12x12_UNORM_BLOCK" value="182" enum="DataFormat"> + </constant> + <constant name="DATA_FORMAT_ASTC_12x12_SRGB_BLOCK" value="183" enum="DataFormat"> + </constant> + <constant name="DATA_FORMAT_G8B8G8R8_422_UNORM" value="184" enum="DataFormat"> + </constant> + <constant name="DATA_FORMAT_B8G8R8G8_422_UNORM" value="185" enum="DataFormat"> + </constant> + <constant name="DATA_FORMAT_G8_B8_R8_3PLANE_420_UNORM" value="186" enum="DataFormat"> + </constant> + <constant name="DATA_FORMAT_G8_B8R8_2PLANE_420_UNORM" value="187" enum="DataFormat"> + </constant> + <constant name="DATA_FORMAT_G8_B8_R8_3PLANE_422_UNORM" value="188" enum="DataFormat"> + </constant> + <constant name="DATA_FORMAT_G8_B8R8_2PLANE_422_UNORM" value="189" enum="DataFormat"> + </constant> + <constant name="DATA_FORMAT_G8_B8_R8_3PLANE_444_UNORM" value="190" enum="DataFormat"> + </constant> + <constant name="DATA_FORMAT_R10X6_UNORM_PACK16" value="191" enum="DataFormat"> + </constant> + <constant name="DATA_FORMAT_R10X6G10X6_UNORM_2PACK16" value="192" enum="DataFormat"> + </constant> + <constant name="DATA_FORMAT_R10X6G10X6B10X6A10X6_UNORM_4PACK16" value="193" enum="DataFormat"> + </constant> + <constant name="DATA_FORMAT_G10X6B10X6G10X6R10X6_422_UNORM_4PACK16" value="194" enum="DataFormat"> + </constant> + <constant name="DATA_FORMAT_B10X6G10X6R10X6G10X6_422_UNORM_4PACK16" value="195" enum="DataFormat"> + </constant> + <constant name="DATA_FORMAT_G10X6_B10X6_R10X6_3PLANE_420_UNORM_3PACK16" value="196" enum="DataFormat"> + </constant> + <constant name="DATA_FORMAT_G10X6_B10X6R10X6_2PLANE_420_UNORM_3PACK16" value="197" enum="DataFormat"> + </constant> + <constant name="DATA_FORMAT_G10X6_B10X6_R10X6_3PLANE_422_UNORM_3PACK16" value="198" enum="DataFormat"> + </constant> + <constant name="DATA_FORMAT_G10X6_B10X6R10X6_2PLANE_422_UNORM_3PACK16" value="199" enum="DataFormat"> + </constant> + <constant name="DATA_FORMAT_G10X6_B10X6_R10X6_3PLANE_444_UNORM_3PACK16" value="200" enum="DataFormat"> + </constant> + <constant name="DATA_FORMAT_R12X4_UNORM_PACK16" value="201" enum="DataFormat"> + </constant> + <constant name="DATA_FORMAT_R12X4G12X4_UNORM_2PACK16" value="202" enum="DataFormat"> + </constant> + <constant name="DATA_FORMAT_R12X4G12X4B12X4A12X4_UNORM_4PACK16" value="203" enum="DataFormat"> + </constant> + <constant name="DATA_FORMAT_G12X4B12X4G12X4R12X4_422_UNORM_4PACK16" value="204" enum="DataFormat"> + </constant> + <constant name="DATA_FORMAT_B12X4G12X4R12X4G12X4_422_UNORM_4PACK16" value="205" enum="DataFormat"> + </constant> + <constant name="DATA_FORMAT_G12X4_B12X4_R12X4_3PLANE_420_UNORM_3PACK16" value="206" enum="DataFormat"> + </constant> + <constant name="DATA_FORMAT_G12X4_B12X4R12X4_2PLANE_420_UNORM_3PACK16" value="207" enum="DataFormat"> + </constant> + <constant name="DATA_FORMAT_G12X4_B12X4_R12X4_3PLANE_422_UNORM_3PACK16" value="208" enum="DataFormat"> + </constant> + <constant name="DATA_FORMAT_G12X4_B12X4R12X4_2PLANE_422_UNORM_3PACK16" value="209" enum="DataFormat"> + </constant> + <constant name="DATA_FORMAT_G12X4_B12X4_R12X4_3PLANE_444_UNORM_3PACK16" value="210" enum="DataFormat"> + </constant> + <constant name="DATA_FORMAT_G16B16G16R16_422_UNORM" value="211" enum="DataFormat"> + </constant> + <constant name="DATA_FORMAT_B16G16R16G16_422_UNORM" value="212" enum="DataFormat"> + </constant> + <constant name="DATA_FORMAT_G16_B16_R16_3PLANE_420_UNORM" value="213" enum="DataFormat"> + </constant> + <constant name="DATA_FORMAT_G16_B16R16_2PLANE_420_UNORM" value="214" enum="DataFormat"> + </constant> + <constant name="DATA_FORMAT_G16_B16_R16_3PLANE_422_UNORM" value="215" enum="DataFormat"> + </constant> + <constant name="DATA_FORMAT_G16_B16R16_2PLANE_422_UNORM" value="216" enum="DataFormat"> + </constant> + <constant name="DATA_FORMAT_G16_B16_R16_3PLANE_444_UNORM" value="217" enum="DataFormat"> + </constant> + <constant name="DATA_FORMAT_PVRTC1_2BPP_UNORM_BLOCK_IMG" value="218" enum="DataFormat"> + </constant> + <constant name="DATA_FORMAT_PVRTC1_4BPP_UNORM_BLOCK_IMG" value="219" enum="DataFormat"> + </constant> + <constant name="DATA_FORMAT_PVRTC2_2BPP_UNORM_BLOCK_IMG" value="220" enum="DataFormat"> + </constant> + <constant name="DATA_FORMAT_PVRTC2_4BPP_UNORM_BLOCK_IMG" value="221" enum="DataFormat"> + </constant> + <constant name="DATA_FORMAT_PVRTC1_2BPP_SRGB_BLOCK_IMG" value="222" enum="DataFormat"> + </constant> + <constant name="DATA_FORMAT_PVRTC1_4BPP_SRGB_BLOCK_IMG" value="223" enum="DataFormat"> + </constant> + <constant name="DATA_FORMAT_PVRTC2_2BPP_SRGB_BLOCK_IMG" value="224" enum="DataFormat"> + </constant> + <constant name="DATA_FORMAT_PVRTC2_4BPP_SRGB_BLOCK_IMG" value="225" enum="DataFormat"> + </constant> + <constant name="DATA_FORMAT_MAX" value="226" enum="DataFormat"> + </constant> + <constant name="TEXTURE_TYPE_1D" value="0" enum="TextureType"> + </constant> + <constant name="TEXTURE_TYPE_2D" value="1" enum="TextureType"> + </constant> + <constant name="TEXTURE_TYPE_3D" value="2" enum="TextureType"> + </constant> + <constant name="TEXTURE_TYPE_CUBE" value="3" enum="TextureType"> + </constant> + <constant name="TEXTURE_TYPE_1D_ARRAY" value="4" enum="TextureType"> + </constant> + <constant name="TEXTURE_TYPE_2D_ARRAY" value="5" enum="TextureType"> + </constant> + <constant name="TEXTURE_TYPE_CUBE_ARRAY" value="6" enum="TextureType"> + </constant> + <constant name="TEXTURE_TYPE_MAX" value="7" enum="TextureType"> + </constant> + <constant name="TEXTURE_SAMPLES_1" value="0" enum="TextureSamples"> + </constant> + <constant name="TEXTURE_SAMPLES_2" value="1" enum="TextureSamples"> + </constant> + <constant name="TEXTURE_SAMPLES_4" value="2" enum="TextureSamples"> + </constant> + <constant name="TEXTURE_SAMPLES_8" value="3" enum="TextureSamples"> + </constant> + <constant name="TEXTURE_SAMPLES_16" value="4" enum="TextureSamples"> + </constant> + <constant name="TEXTURE_SAMPLES_32" value="5" enum="TextureSamples"> + </constant> + <constant name="TEXTURE_SAMPLES_64" value="6" enum="TextureSamples"> + </constant> + <constant name="TEXTURE_SAMPLES_MAX" value="7" enum="TextureSamples"> + </constant> + <constant name="TEXTURE_USAGE_SAMPLING_BIT" value="1" enum="TextureUsageBits"> + </constant> + <constant name="TEXTURE_USAGE_COLOR_ATTACHMENT_BIT" value="2" enum="TextureUsageBits"> + </constant> + <constant name="TEXTURE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT" value="4" enum="TextureUsageBits"> + </constant> + <constant name="TEXTURE_USAGE_STORAGE_BIT" value="8" enum="TextureUsageBits"> + </constant> + <constant name="TEXTURE_USAGE_STORAGE_ATOMIC_BIT" value="16" enum="TextureUsageBits"> + </constant> + <constant name="TEXTURE_USAGE_CPU_READ_BIT" value="32" enum="TextureUsageBits"> + </constant> + <constant name="TEXTURE_USAGE_CAN_UPDATE_BIT" value="64" enum="TextureUsageBits"> + </constant> + <constant name="TEXTURE_USAGE_CAN_COPY_FROM_BIT" value="128" enum="TextureUsageBits"> + </constant> + <constant name="TEXTURE_USAGE_CAN_COPY_TO_BIT" value="256" enum="TextureUsageBits"> + </constant> + <constant name="TEXTURE_USAGE_RESOLVE_ATTACHMENT_BIT" value="512" enum="TextureUsageBits"> + </constant> + <constant name="TEXTURE_SWIZZLE_IDENTITY" value="0" enum="TextureSwizzle"> + </constant> + <constant name="TEXTURE_SWIZZLE_ZERO" value="1" enum="TextureSwizzle"> + </constant> + <constant name="TEXTURE_SWIZZLE_ONE" value="2" enum="TextureSwizzle"> + </constant> + <constant name="TEXTURE_SWIZZLE_R" value="3" enum="TextureSwizzle"> + </constant> + <constant name="TEXTURE_SWIZZLE_G" value="4" enum="TextureSwizzle"> + </constant> + <constant name="TEXTURE_SWIZZLE_B" value="5" enum="TextureSwizzle"> + </constant> + <constant name="TEXTURE_SWIZZLE_A" value="6" enum="TextureSwizzle"> + </constant> + <constant name="TEXTURE_SWIZZLE_MAX" value="7" enum="TextureSwizzle"> + </constant> + <constant name="TEXTURE_SLICE_2D" value="0" enum="TextureSliceType"> + </constant> + <constant name="TEXTURE_SLICE_CUBEMAP" value="1" enum="TextureSliceType"> + </constant> + <constant name="TEXTURE_SLICE_3D" value="2" enum="TextureSliceType"> + </constant> + <constant name="SAMPLER_FILTER_NEAREST" value="0" enum="SamplerFilter"> + </constant> + <constant name="SAMPLER_FILTER_LINEAR" value="1" enum="SamplerFilter"> + </constant> + <constant name="SAMPLER_REPEAT_MODE_REPEAT" value="0" enum="SamplerRepeatMode"> + </constant> + <constant name="SAMPLER_REPEAT_MODE_MIRRORED_REPEAT" value="1" enum="SamplerRepeatMode"> + </constant> + <constant name="SAMPLER_REPEAT_MODE_CLAMP_TO_EDGE" value="2" enum="SamplerRepeatMode"> + </constant> + <constant name="SAMPLER_REPEAT_MODE_CLAMP_TO_BORDER" value="3" enum="SamplerRepeatMode"> + </constant> + <constant name="SAMPLER_REPEAT_MODE_MIRROR_CLAMP_TO_EDGE" value="4" enum="SamplerRepeatMode"> + </constant> + <constant name="SAMPLER_REPEAT_MODE_MAX" value="5" enum="SamplerRepeatMode"> + </constant> + <constant name="SAMPLER_BORDER_COLOR_FLOAT_TRANSPARENT_BLACK" value="0" enum="SamplerBorderColor"> + </constant> + <constant name="SAMPLER_BORDER_COLOR_INT_TRANSPARENT_BLACK" value="1" enum="SamplerBorderColor"> + </constant> + <constant name="SAMPLER_BORDER_COLOR_FLOAT_OPAQUE_BLACK" value="2" enum="SamplerBorderColor"> + </constant> + <constant name="SAMPLER_BORDER_COLOR_INT_OPAQUE_BLACK" value="3" enum="SamplerBorderColor"> + </constant> + <constant name="SAMPLER_BORDER_COLOR_FLOAT_OPAQUE_WHITE" value="4" enum="SamplerBorderColor"> + </constant> + <constant name="SAMPLER_BORDER_COLOR_INT_OPAQUE_WHITE" value="5" enum="SamplerBorderColor"> + </constant> + <constant name="SAMPLER_BORDER_COLOR_MAX" value="6" enum="SamplerBorderColor"> + </constant> + <constant name="VERTEX_FREQUENCY_VERTEX" value="0" enum="VertexFrequency"> + </constant> + <constant name="VERTEX_FREQUENCY_INSTANCE" value="1" enum="VertexFrequency"> + </constant> + <constant name="INDEX_BUFFER_FORMAT_UINT16" value="0" enum="IndexBufferFormat"> + </constant> + <constant name="INDEX_BUFFER_FORMAT_UINT32" value="1" enum="IndexBufferFormat"> + </constant> + <constant name="UNIFORM_TYPE_SAMPLER" value="0" enum="UniformType"> + </constant> + <constant name="UNIFORM_TYPE_SAMPLER_WITH_TEXTURE" value="1" enum="UniformType"> + </constant> + <constant name="UNIFORM_TYPE_TEXTURE" value="2" enum="UniformType"> + </constant> + <constant name="UNIFORM_TYPE_IMAGE" value="3" enum="UniformType"> + </constant> + <constant name="UNIFORM_TYPE_TEXTURE_BUFFER" value="4" enum="UniformType"> + </constant> + <constant name="UNIFORM_TYPE_SAMPLER_WITH_TEXTURE_BUFFER" value="5" enum="UniformType"> + </constant> + <constant name="UNIFORM_TYPE_IMAGE_BUFFER" value="6" enum="UniformType"> + </constant> + <constant name="UNIFORM_TYPE_UNIFORM_BUFFER" value="7" enum="UniformType"> + </constant> + <constant name="UNIFORM_TYPE_STORAGE_BUFFER" value="8" enum="UniformType"> + </constant> + <constant name="UNIFORM_TYPE_INPUT_ATTACHMENT" value="9" enum="UniformType"> + </constant> + <constant name="UNIFORM_TYPE_MAX" value="10" enum="UniformType"> + </constant> + <constant name="RENDER_PRIMITIVE_POINTS" value="0" enum="RenderPrimitive"> + </constant> + <constant name="RENDER_PRIMITIVE_LINES" value="1" enum="RenderPrimitive"> + </constant> + <constant name="RENDER_PRIMITIVE_LINES_WITH_ADJACENCY" value="2" enum="RenderPrimitive"> + </constant> + <constant name="RENDER_PRIMITIVE_LINESTRIPS" value="3" enum="RenderPrimitive"> + </constant> + <constant name="RENDER_PRIMITIVE_LINESTRIPS_WITH_ADJACENCY" value="4" enum="RenderPrimitive"> + </constant> + <constant name="RENDER_PRIMITIVE_TRIANGLES" value="5" enum="RenderPrimitive"> + </constant> + <constant name="RENDER_PRIMITIVE_TRIANGLES_WITH_ADJACENCY" value="6" enum="RenderPrimitive"> + </constant> + <constant name="RENDER_PRIMITIVE_TRIANGLE_STRIPS" value="7" enum="RenderPrimitive"> + </constant> + <constant name="RENDER_PRIMITIVE_TRIANGLE_STRIPS_WITH_AJACENCY" value="8" enum="RenderPrimitive"> + </constant> + <constant name="RENDER_PRIMITIVE_TRIANGLE_STRIPS_WITH_RESTART_INDEX" value="9" enum="RenderPrimitive"> + </constant> + <constant name="RENDER_PRIMITIVE_TESSELATION_PATCH" value="10" enum="RenderPrimitive"> + </constant> + <constant name="RENDER_PRIMITIVE_MAX" value="11" enum="RenderPrimitive"> + </constant> + <constant name="POLYGON_CULL_DISABLED" value="0" enum="PolygonCullMode"> + </constant> + <constant name="POLYGON_CULL_FRONT" value="1" enum="PolygonCullMode"> + </constant> + <constant name="POLYGON_CULL_BACK" value="2" enum="PolygonCullMode"> + </constant> + <constant name="POLYGON_FRONT_FACE_CLOCKWISE" value="0" enum="PolygonFrontFace"> + </constant> + <constant name="POLYGON_FRONT_FACE_COUNTER_CLOCKWISE" value="1" enum="PolygonFrontFace"> + </constant> + <constant name="STENCIL_OP_KEEP" value="0" enum="StencilOperation"> + </constant> + <constant name="STENCIL_OP_ZERO" value="1" enum="StencilOperation"> + </constant> + <constant name="STENCIL_OP_REPLACE" value="2" enum="StencilOperation"> + </constant> + <constant name="STENCIL_OP_INCREMENT_AND_CLAMP" value="3" enum="StencilOperation"> + </constant> + <constant name="STENCIL_OP_DECREMENT_AND_CLAMP" value="4" enum="StencilOperation"> + </constant> + <constant name="STENCIL_OP_INVERT" value="5" enum="StencilOperation"> + </constant> + <constant name="STENCIL_OP_INCREMENT_AND_WRAP" value="6" enum="StencilOperation"> + </constant> + <constant name="STENCIL_OP_DECREMENT_AND_WRAP" value="7" enum="StencilOperation"> + </constant> + <constant name="STENCIL_OP_MAX" value="8" enum="StencilOperation"> + </constant> + <constant name="COMPARE_OP_NEVER" value="0" enum="CompareOperator"> + </constant> + <constant name="COMPARE_OP_LESS" value="1" enum="CompareOperator"> + </constant> + <constant name="COMPARE_OP_EQUAL" value="2" enum="CompareOperator"> + </constant> + <constant name="COMPARE_OP_LESS_OR_EQUAL" value="3" enum="CompareOperator"> + </constant> + <constant name="COMPARE_OP_GREATER" value="4" enum="CompareOperator"> + </constant> + <constant name="COMPARE_OP_NOT_EQUAL" value="5" enum="CompareOperator"> + </constant> + <constant name="COMPARE_OP_GREATER_OR_EQUAL" value="6" enum="CompareOperator"> + </constant> + <constant name="COMPARE_OP_ALWAYS" value="7" enum="CompareOperator"> + </constant> + <constant name="COMPARE_OP_MAX" value="8" enum="CompareOperator"> + </constant> + <constant name="LOGIC_OP_CLEAR" value="0" enum="LogicOperation"> + </constant> + <constant name="LOGIC_OP_AND" value="1" enum="LogicOperation"> + </constant> + <constant name="LOGIC_OP_AND_REVERSE" value="2" enum="LogicOperation"> + </constant> + <constant name="LOGIC_OP_COPY" value="3" enum="LogicOperation"> + </constant> + <constant name="LOGIC_OP_AND_INVERTED" value="4" enum="LogicOperation"> + </constant> + <constant name="LOGIC_OP_NO_OP" value="5" enum="LogicOperation"> + </constant> + <constant name="LOGIC_OP_XOR" value="6" enum="LogicOperation"> + </constant> + <constant name="LOGIC_OP_OR" value="7" enum="LogicOperation"> + </constant> + <constant name="LOGIC_OP_NOR" value="8" enum="LogicOperation"> + </constant> + <constant name="LOGIC_OP_EQUIVALENT" value="9" enum="LogicOperation"> + </constant> + <constant name="LOGIC_OP_INVERT" value="10" enum="LogicOperation"> + </constant> + <constant name="LOGIC_OP_OR_REVERSE" value="11" enum="LogicOperation"> + </constant> + <constant name="LOGIC_OP_COPY_INVERTED" value="12" enum="LogicOperation"> + </constant> + <constant name="LOGIC_OP_OR_INVERTED" value="13" enum="LogicOperation"> + </constant> + <constant name="LOGIC_OP_NAND" value="14" enum="LogicOperation"> + </constant> + <constant name="LOGIC_OP_SET" value="15" enum="LogicOperation"> + </constant> + <constant name="LOGIC_OP_MAX" value="16" enum="LogicOperation"> + </constant> + <constant name="BLEND_FACTOR_ZERO" value="0" enum="BlendFactor"> + </constant> + <constant name="BLEND_FACTOR_ONE" value="1" enum="BlendFactor"> + </constant> + <constant name="BLEND_FACTOR_SRC_COLOR" value="2" enum="BlendFactor"> + </constant> + <constant name="BLEND_FACTOR_ONE_MINUS_SRC_COLOR" value="3" enum="BlendFactor"> + </constant> + <constant name="BLEND_FACTOR_DST_COLOR" value="4" enum="BlendFactor"> + </constant> + <constant name="BLEND_FACTOR_ONE_MINUS_DST_COLOR" value="5" enum="BlendFactor"> + </constant> + <constant name="BLEND_FACTOR_SRC_ALPHA" value="6" enum="BlendFactor"> + </constant> + <constant name="BLEND_FACTOR_ONE_MINUS_SRC_ALPHA" value="7" enum="BlendFactor"> + </constant> + <constant name="BLEND_FACTOR_DST_ALPHA" value="8" enum="BlendFactor"> + </constant> + <constant name="BLEND_FACTOR_ONE_MINUS_DST_ALPHA" value="9" enum="BlendFactor"> + </constant> + <constant name="BLEND_FACTOR_CONSTANT_COLOR" value="10" enum="BlendFactor"> + </constant> + <constant name="BLEND_FACTOR_ONE_MINUS_CONSTANT_COLOR" value="11" enum="BlendFactor"> + </constant> + <constant name="BLEND_FACTOR_CONSTANT_ALPHA" value="12" enum="BlendFactor"> + </constant> + <constant name="BLEND_FACTOR_ONE_MINUS_CONSTANT_ALPHA" value="13" enum="BlendFactor"> + </constant> + <constant name="BLEND_FACTOR_SRC_ALPHA_SATURATE" value="14" enum="BlendFactor"> + </constant> + <constant name="BLEND_FACTOR_SRC1_COLOR" value="15" enum="BlendFactor"> + </constant> + <constant name="BLEND_FACTOR_ONE_MINUS_SRC1_COLOR" value="16" enum="BlendFactor"> + </constant> + <constant name="BLEND_FACTOR_SRC1_ALPHA" value="17" enum="BlendFactor"> + </constant> + <constant name="BLEND_FACTOR_ONE_MINUS_SRC1_ALPHA" value="18" enum="BlendFactor"> + </constant> + <constant name="BLEND_FACTOR_MAX" value="19" enum="BlendFactor"> + </constant> + <constant name="BLEND_OP_ADD" value="0" enum="BlendOperation"> + </constant> + <constant name="BLEND_OP_SUBTRACT" value="1" enum="BlendOperation"> + </constant> + <constant name="BLEND_OP_REVERSE_SUBTRACT" value="2" enum="BlendOperation"> + </constant> + <constant name="BLEND_OP_MINIMUM" value="3" enum="BlendOperation"> + </constant> + <constant name="BLEND_OP_MAXIMUM" value="4" enum="BlendOperation"> + </constant> + <constant name="BLEND_OP_MAX" value="5" enum="BlendOperation"> + </constant> + <constant name="DYNAMIC_STATE_LINE_WIDTH" value="1" enum="PipelineDynamicStateFlags"> + </constant> + <constant name="DYNAMIC_STATE_DEPTH_BIAS" value="2" enum="PipelineDynamicStateFlags"> + </constant> + <constant name="DYNAMIC_STATE_BLEND_CONSTANTS" value="4" enum="PipelineDynamicStateFlags"> + </constant> + <constant name="DYNAMIC_STATE_DEPTH_BOUNDS" value="8" enum="PipelineDynamicStateFlags"> + </constant> + <constant name="DYNAMIC_STATE_STENCIL_COMPARE_MASK" value="16" enum="PipelineDynamicStateFlags"> + </constant> + <constant name="DYNAMIC_STATE_STENCIL_WRITE_MASK" value="32" enum="PipelineDynamicStateFlags"> + </constant> + <constant name="DYNAMIC_STATE_STENCIL_REFERENCE" value="64" enum="PipelineDynamicStateFlags"> + </constant> + <constant name="INITIAL_ACTION_CLEAR" value="0" enum="InitialAction"> + </constant> + <constant name="INITIAL_ACTION_KEEP" value="1" enum="InitialAction"> + </constant> + <constant name="INITIAL_ACTION_DROP" value="2" enum="InitialAction"> + </constant> + <constant name="INITIAL_ACTION_CONTINUE" value="3" enum="InitialAction"> + </constant> + <constant name="INITIAL_ACTION_MAX" value="4" enum="InitialAction"> + </constant> + <constant name="FINAL_ACTION_READ" value="0" enum="FinalAction"> + </constant> + <constant name="FINAL_ACTION_DISCARD" value="1" enum="FinalAction"> + </constant> + <constant name="FINAL_ACTION_CONTINUE" value="2" enum="FinalAction"> + </constant> + <constant name="FINAL_ACTION_MAX" value="3" enum="FinalAction"> + </constant> + <constant name="SHADER_STAGE_VERTEX" value="0" enum="ShaderStage"> + </constant> + <constant name="SHADER_STAGE_FRAGMENT" value="1" enum="ShaderStage"> + </constant> + <constant name="SHADER_STAGE_TESSELATION_CONTROL" value="2" enum="ShaderStage"> + </constant> + <constant name="SHADER_STAGE_TESSELATION_EVALUATION" value="3" enum="ShaderStage"> + </constant> + <constant name="SHADER_STAGE_COMPUTE" value="4" enum="ShaderStage"> + </constant> + <constant name="SHADER_STAGE_MAX" value="5" enum="ShaderStage"> + </constant> + <constant name="SHADER_STAGE_VERTEX_BIT" value="1" enum="ShaderStage"> + </constant> + <constant name="SHADER_STAGE_FRAGMENT_BIT" value="2" enum="ShaderStage"> + </constant> + <constant name="SHADER_STAGE_TESSELATION_CONTROL_BIT" value="4" enum="ShaderStage"> + </constant> + <constant name="SHADER_STAGE_TESSELATION_EVALUATION_BIT" value="8" enum="ShaderStage"> + </constant> + <constant name="SHADER_STAGE_COMPUTE_BIT" value="16" enum="ShaderStage"> + </constant> + <constant name="SHADER_LANGUAGE_GLSL" value="0" enum="ShaderLanguage"> + </constant> + <constant name="SHADER_LANGUAGE_HLSL" value="1" enum="ShaderLanguage"> + </constant> + <constant name="LIMIT_MAX_BOUND_UNIFORM_SETS" value="0" enum="Limit"> + </constant> + <constant name="LIMIT_MAX_FRAMEBUFFER_COLOR_ATTACHMENTS" value="1" enum="Limit"> + </constant> + <constant name="LIMIT_MAX_TEXTURES_PER_UNIFORM_SET" value="2" enum="Limit"> + </constant> + <constant name="LIMIT_MAX_SAMPLERS_PER_UNIFORM_SET" value="3" enum="Limit"> + </constant> + <constant name="LIMIT_MAX_STORAGE_BUFFERS_PER_UNIFORM_SET" value="4" enum="Limit"> + </constant> + <constant name="LIMIT_MAX_STORAGE_IMAGES_PER_UNIFORM_SET" value="5" enum="Limit"> + </constant> + <constant name="LIMIT_MAX_UNIFORM_BUFFERS_PER_UNIFORM_SET" value="6" enum="Limit"> + </constant> + <constant name="LIMIT_MAX_DRAW_INDEXED_INDEX" value="7" enum="Limit"> + </constant> + <constant name="LIMIT_MAX_FRAMEBUFFER_HEIGHT" value="8" enum="Limit"> + </constant> + <constant name="LIMIT_MAX_FRAMEBUFFER_WIDTH" value="9" enum="Limit"> + </constant> + <constant name="LIMIT_MAX_TEXTURE_ARRAY_LAYERS" value="10" enum="Limit"> + </constant> + <constant name="LIMIT_MAX_TEXTURE_SIZE_1D" value="11" enum="Limit"> + </constant> + <constant name="LIMIT_MAX_TEXTURE_SIZE_2D" value="12" enum="Limit"> + </constant> + <constant name="LIMIT_MAX_TEXTURE_SIZE_3D" value="13" enum="Limit"> + </constant> + <constant name="LIMIT_MAX_TEXTURE_SIZE_CUBE" value="14" enum="Limit"> + </constant> + <constant name="LIMIT_MAX_TEXTURES_PER_SHADER_STAGE" value="15" enum="Limit"> + </constant> + <constant name="LIMIT_MAX_SAMPLERS_PER_SHADER_STAGE" value="16" enum="Limit"> + </constant> + <constant name="LIMIT_MAX_STORAGE_BUFFERS_PER_SHADER_STAGE" value="17" enum="Limit"> + </constant> + <constant name="LIMIT_MAX_STORAGE_IMAGES_PER_SHADER_STAGE" value="18" enum="Limit"> + </constant> + <constant name="LIMIT_MAX_UNIFORM_BUFFERS_PER_SHADER_STAGE" value="19" enum="Limit"> + </constant> + <constant name="LIMIT_MAX_PUSH_CONSTANT_SIZE" value="20" enum="Limit"> + </constant> + <constant name="LIMIT_MAX_UNIFORM_BUFFER_SIZE" value="21" enum="Limit"> + </constant> + <constant name="LIMIT_MAX_VERTEX_INPUT_ATTRIBUTE_OFFSET" value="22" enum="Limit"> + </constant> + <constant name="LIMIT_MAX_VERTEX_INPUT_ATTRIBUTES" value="23" enum="Limit"> + </constant> + <constant name="LIMIT_MAX_VERTEX_INPUT_BINDINGS" value="24" enum="Limit"> + </constant> + <constant name="LIMIT_MAX_VERTEX_INPUT_BINDING_STRIDE" value="25" enum="Limit"> + </constant> + <constant name="LIMIT_MIN_UNIFORM_BUFFER_OFFSET_ALIGNMENT" value="26" enum="Limit"> + </constant> + <constant name="LIMIT_MAX_COMPUTE_SHARED_MEMORY_SIZE" value="27" enum="Limit"> + </constant> + <constant name="LIMIT_MAX_COMPUTE_WORKGROUP_COUNT_X" value="28" enum="Limit"> + </constant> + <constant name="LIMIT_MAX_COMPUTE_WORKGROUP_COUNT_Y" value="29" enum="Limit"> + </constant> + <constant name="LIMIT_MAX_COMPUTE_WORKGROUP_COUNT_Z" value="30" enum="Limit"> + </constant> + <constant name="LIMIT_MAX_COMPUTE_WORKGROUP_INVOCATIONS" value="31" enum="Limit"> + </constant> + <constant name="LIMIT_MAX_COMPUTE_WORKGROUP_SIZE_X" value="32" enum="Limit"> + </constant> + <constant name="LIMIT_MAX_COMPUTE_WORKGROUP_SIZE_Y" value="33" enum="Limit"> + </constant> + <constant name="LIMIT_MAX_COMPUTE_WORKGROUP_SIZE_Z" value="34" enum="Limit"> + </constant> + <constant name="INVALID_ID" value="-1"> + </constant> + <constant name="INVALID_FORMAT_ID" value="-1"> + </constant> </constants> </class> diff --git a/doc/classes/RenderingServer.xml b/doc/classes/RenderingServer.xml index d2d13fe406..4e0762a68b 100644 --- a/doc/classes/RenderingServer.xml +++ b/doc/classes/RenderingServer.xml @@ -4,12 +4,12 @@ Server for anything visible. </brief_description> <description> - Server for anything visible. The visual server is the API backend for everything visible. The whole scene system mounts on it to display. - The visual server is completely opaque, the internals are entirely implementation specific and cannot be accessed. - The visual server can be used to bypass the scene system entirely. + Server for anything visible. The rendering server is the API backend for everything visible. The whole scene system mounts on it to display. + The rendering server is completely opaque, the internals are entirely implementation specific and cannot be accessed. + 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 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]. + 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]. 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. @@ -947,6 +947,58 @@ Returns the id of a white texture. Creates one if none exists. </description> </method> + <method name="global_variable_add"> + <return type="void"> + </return> + <argument index="0" name="name" type="StringName"> + </argument> + <argument index="1" name="type" type="int" enum="RenderingServer.GlobalVariableType"> + </argument> + <argument index="2" name="default_value" type="Variant"> + </argument> + <description> + </description> + </method> + <method name="global_variable_get" qualifiers="const"> + <return type="Variant"> + </return> + <argument index="0" name="name" type="StringName"> + </argument> + <description> + </description> + </method> + <method name="global_variable_get_list" qualifiers="const"> + <return type="PackedStringArray"> + </return> + <description> + </description> + </method> + <method name="global_variable_get_type" qualifiers="const"> + <return type="int" enum="RenderingServer.GlobalVariableType"> + </return> + <argument index="0" name="name" type="StringName"> + </argument> + <description> + </description> + </method> + <method name="global_variable_remove"> + <return type="void"> + </return> + <argument index="0" name="name" type="StringName"> + </argument> + <description> + </description> + </method> + <method name="global_variable_set"> + <return type="void"> + </return> + <argument index="0" name="name" type="StringName"> + </argument> + <argument index="1" name="value" type="Variant"> + </argument> + <description> + </description> + </method> <method name="has_changed" qualifiers="const"> <return type="bool"> </return> @@ -1113,7 +1165,7 @@ <return type="void"> </return> <description> - Initializes the visual server. This function is called internally by platform-dependent code during engine initialization. If called from a running game, it will not do anything. + 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. </description> </method> <method name="instance_attach_object_instance_id"> @@ -3067,15 +3119,15 @@ Sets when the viewport should be updated. See [enum ViewportUpdateMode] constants for options. </description> </method> - <method name="viewport_set_use_arvr"> + <method name="viewport_set_use_xr"> <return type="void"> </return> <argument index="0" name="viewport" type="RID"> </argument> - <argument index="1" name="use_arvr" type="bool"> + <argument index="1" name="use_xr" type="bool"> </argument> <description> - If [code]true[/code], the viewport uses augmented or virtual reality technologies. See [ARVRInterface]. + If [code]true[/code], the viewport uses augmented or virtual reality technologies. See [XRInterface]. </description> </method> </methods> @@ -3110,12 +3162,6 @@ <constant name="MAX_CURSORS" value="8"> Unused enum in Godot 3.x. </constant> - <constant name="MATERIAL_RENDER_PRIORITY_MIN" value="-128"> - The minimum renderpriority of all materials. - </constant> - <constant name="MATERIAL_RENDER_PRIORITY_MAX" value="127"> - The maximum renderpriority of all materials. - </constant> <constant name="TEXTURE_LAYERED_2D_ARRAY" value="0" enum="TextureLayeredType"> </constant> <constant name="TEXTURE_LAYERED_CUBEMAP" value="1" enum="TextureLayeredType"> @@ -3149,6 +3195,12 @@ <constant name="SHADER_MAX" value="4" enum="ShaderMode"> Represents the size of the [enum ShaderMode] enum. </constant> + <constant name="MATERIAL_RENDER_PRIORITY_MIN" value="-128"> + The minimum renderpriority of all materials. + </constant> + <constant name="MATERIAL_RENDER_PRIORITY_MAX" value="127"> + The maximum renderpriority of all materials. + </constant> <constant name="ARRAY_VERTEX" value="0" enum="ArrayType"> Array is a vertex array. </constant> @@ -3224,14 +3276,14 @@ <constant name="ARRAY_COMPRESS_INDEX" value="131072" enum="ArrayFormat"> Flag used to mark a compressed index array. </constant> + <constant name="ARRAY_COMPRESS_DEFAULT" value="31744" enum="ArrayFormat"> + Used to set flags [constant ARRAY_COMPRESS_NORMAL], [constant ARRAY_COMPRESS_TANGENT], [constant ARRAY_COMPRESS_COLOR], [constant ARRAY_COMPRESS_TEX_UV] and [constant ARRAY_COMPRESS_TEX_UV2] quickly. + </constant> <constant name="ARRAY_FLAG_USE_2D_VERTICES" value="262144" enum="ArrayFormat"> Flag used to mark that the array contains 2D vertices. </constant> <constant name="ARRAY_FLAG_USE_DYNAMIC_UPDATE" value="1048576" enum="ArrayFormat"> </constant> - <constant name="ARRAY_COMPRESS_DEFAULT" value="31744" enum="ArrayFormat"> - Used to set flags [constant ARRAY_COMPRESS_NORMAL], [constant ARRAY_COMPRESS_TANGENT], [constant ARRAY_COMPRESS_COLOR], [constant ARRAY_COMPRESS_TEX_UV] and [constant ARRAY_COMPRESS_TEX_UV2] quickly. - </constant> <constant name="PRIMITIVE_POINTS" value="0" enum="PrimitiveType"> Primitive to draw consists of points. </constant> @@ -3282,18 +3334,18 @@ <constant name="LIGHT_PARAM_RANGE" value="3" enum="LightParam"> The light's range. </constant> - <constant name="LIGHT_PARAM_ATTENUATION" value="4" enum="LightParam"> + <constant name="LIGHT_PARAM_SIZE" value="4" enum="LightParam"> + The size of the light when using spot light or omni light. The angular size of the light when using directional light. + </constant> + <constant name="LIGHT_PARAM_ATTENUATION" value="5" enum="LightParam"> The light's attenuation. </constant> - <constant name="LIGHT_PARAM_SPOT_ANGLE" value="5" enum="LightParam"> + <constant name="LIGHT_PARAM_SPOT_ANGLE" value="6" enum="LightParam"> The spotlight's angle. </constant> - <constant name="LIGHT_PARAM_SPOT_ATTENUATION" value="6" enum="LightParam"> + <constant name="LIGHT_PARAM_SPOT_ATTENUATION" value="7" enum="LightParam"> The spotlight's attenuation. </constant> - <constant name="LIGHT_PARAM_CONTACT_SHADOW_SIZE" value="7" enum="LightParam"> - Scales the shadow color. - </constant> <constant name="LIGHT_PARAM_SHADOW_MAX_DISTANCE" value="8" enum="LightParam"> Max distance that shadows will be rendered. </constant> @@ -3307,6 +3359,7 @@ Proportion of shadow atlas occupied by the third split. The fourth split occupies the rest. </constant> <constant name="LIGHT_PARAM_SHADOW_FADE_START" value="12" enum="LightParam"> + Proportion of shadow max distance where the shadow will start to fade out. </constant> <constant name="LIGHT_PARAM_SHADOW_NORMAL_BIAS" value="13" enum="LightParam"> Normal bias used to offset shadow lookup by object normal. Can be used to fix self-shadowing artifacts. @@ -3314,10 +3367,15 @@ <constant name="LIGHT_PARAM_SHADOW_BIAS" value="14" enum="LightParam"> Bias the shadow lookup to fix self-shadowing artifacts. </constant> - <constant name="LIGHT_PARAM_SHADOW_BIAS_SPLIT_SCALE" value="15" enum="LightParam"> - Increases bias on further splits to fix self-shadowing that only occurs far away from the camera. + <constant name="LIGHT_PARAM_SHADOW_PANCAKE_SIZE" value="15" enum="LightParam"> + 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. + </constant> + <constant name="LIGHT_PARAM_SHADOW_BLUR" value="16" enum="LightParam"> + 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. </constant> - <constant name="LIGHT_PARAM_MAX" value="16" enum="LightParam"> + <constant name="LIGHT_PARAM_TRANSMITTANCE_BIAS" value="17" enum="LightParam"> + </constant> + <constant name="LIGHT_PARAM_MAX" value="18" enum="LightParam"> Represents the size of the [enum LightParam] enum. </constant> <constant name="LIGHT_OMNI_SHADOW_DUAL_PARABOLOID" value="0" enum="LightOmniShadowMode"> @@ -3347,6 +3405,16 @@ <constant name="REFLECTION_PROBE_UPDATE_ALWAYS" value="1" enum="ReflectionProbeUpdateMode"> Reflection probe will update each frame. This mode is necessary to capture moving objects. </constant> + <constant name="DECAL_TEXTURE_ALBEDO" value="0" enum="DecalTexture"> + </constant> + <constant name="DECAL_TEXTURE_NORMAL" value="1" enum="DecalTexture"> + </constant> + <constant name="DECAL_TEXTURE_ORM" value="2" enum="DecalTexture"> + </constant> + <constant name="DECAL_TEXTURE_EMISSION" value="3" enum="DecalTexture"> + </constant> + <constant name="DECAL_TEXTURE_MAX" value="4" enum="DecalTexture"> + </constant> <constant name="PARTICLES_DRAW_ORDER_INDEX" value="0" enum="ParticlesDrawOrder"> Draw particles in the order that they appear in the particles array. </constant> @@ -3383,22 +3451,24 @@ Multisample antialiasing is disabled. </constant> <constant name="VIEWPORT_MSAA_2X" value="1" enum="ViewportMSAA"> - Multisample antialiasing is set to 2×. + Multisample antialiasing uses 2 samples per pixel. </constant> <constant name="VIEWPORT_MSAA_4X" value="2" enum="ViewportMSAA"> - Multisample antialiasing is set to 4×. + Multisample antialiasing uses 4 samples per pixel. </constant> <constant name="VIEWPORT_MSAA_8X" value="3" enum="ViewportMSAA"> - Multisample antialiasing is set to 8×. + Multisample antialiasing uses 8 samples per pixel. </constant> <constant name="VIEWPORT_MSAA_16X" value="4" enum="ViewportMSAA"> - Multisample antialiasing is set to 16×. + Multisample antialiasing uses 16 samples per pixel. + </constant> + <constant name="VIEWPORT_MSAA_MAX" value="5" enum="ViewportMSAA"> </constant> - <constant name="VIEWPORT_MSAA_EXT_2X" value="5" enum="ViewportMSAA"> - Multisample antialiasing is set to 2× on external texture. Special mode for GLES2 Android VR (Oculus Quest and Go). + <constant name="VIEWPORT_SCREEN_SPACE_AA_DISABLED" value="0" enum="ViewportScreenSpaceAA"> </constant> - <constant name="VIEWPORT_MSAA_EXT_4X" value="6" enum="ViewportMSAA"> - Multisample antialiasing is set to 4× on external texture. Special mode for GLES2 Android VR (Oculus Quest and Go). + <constant name="VIEWPORT_SCREEN_SPACE_AA_FXAA" value="1" enum="ViewportScreenSpaceAA"> + </constant> + <constant name="VIEWPORT_SCREEN_SPACE_AA_MAX" value="2" enum="ViewportScreenSpaceAA"> </constant> <constant name="VIEWPORT_RENDER_INFO_OBJECTS_IN_FRAME" value="0" enum="ViewportRenderInfo"> Number of objects drawn in a single frame. @@ -3425,37 +3495,54 @@ Debug draw is disabled. Default setting. </constant> <constant name="VIEWPORT_DEBUG_DRAW_UNSHADED" value="1" enum="ViewportDebugDraw"> - Debug draw sets objects to unshaded. + Objects are displayed without light information. </constant> <constant name="VIEWPORT_DEBUG_DRAW_LIGHTING" value="2" enum="ViewportDebugDraw"> + Objects are displayed with only light information. </constant> <constant name="VIEWPORT_DEBUG_DRAW_OVERDRAW" value="3" enum="ViewportDebugDraw"> - Overwrites clear color to [code](0,0,0,0)[/code]. + 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. </constant> <constant name="VIEWPORT_DEBUG_DRAW_WIREFRAME" value="4" enum="ViewportDebugDraw"> Debug draw draws objects in wireframe. </constant> <constant name="VIEWPORT_DEBUG_DRAW_NORMAL_BUFFER" value="5" enum="ViewportDebugDraw"> + Normal buffer is drawn instead of regular scene so you can see the per-pixel normals that will be used by post-processing effects. </constant> <constant name="VIEWPORT_DEBUG_DRAW_GI_PROBE_ALBEDO" value="6" enum="ViewportDebugDraw"> + Objects are displayed with only the albedo value from [GIProbe]s. </constant> <constant name="VIEWPORT_DEBUG_DRAW_GI_PROBE_LIGHTING" value="7" enum="ViewportDebugDraw"> + Objects are displayed with only the lighting value from [GIProbe]s. </constant> <constant name="VIEWPORT_DEBUG_DRAW_GI_PROBE_EMISSION" value="8" enum="ViewportDebugDraw"> + Objects are displayed with only the emission color from [GIProbe]s. </constant> <constant name="VIEWPORT_DEBUG_DRAW_SHADOW_ATLAS" value="9" enum="ViewportDebugDraw"> + Draws the shadow atlas that stores shadows from [OmniLight3D]s and [SpotLight3D]s in the upper left quadrant of the [Viewport]. </constant> <constant name="VIEWPORT_DEBUG_DRAW_DIRECTIONAL_SHADOW_ATLAS" value="10" enum="ViewportDebugDraw"> + Draws the shadow atlas that stores shadows from [DirectionalLight3D]s in the upper left quadrant of the [Viewport]. </constant> <constant name="VIEWPORT_DEBUG_DRAW_SCENE_LUMINANCE" value="11" enum="ViewportDebugDraw"> </constant> <constant name="VIEWPORT_DEBUG_DRAW_SSAO" value="12" enum="ViewportDebugDraw"> + 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]. </constant> <constant name="VIEWPORT_DEBUG_DRAW_ROUGHNESS_LIMITER" value="13" enum="ViewportDebugDraw"> + 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. + </constant> + <constant name="VIEWPORT_DEBUG_DRAW_PSSM_SPLITS" value="14" enum="ViewportDebugDraw"> + 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. + </constant> + <constant name="VIEWPORT_DEBUG_DRAW_DECAL_ATLAS" value="15" enum="ViewportDebugDraw"> </constant> <constant name="SKY_MODE_QUALITY" value="0" enum="SkyMode"> + 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]. </constant> <constant name="SKY_MODE_REALTIME" value="1" enum="SkyMode"> + Uses the fast filtering algorithm to process the radiance map. In general this results in lower quality, but substantially faster run times. + [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]. </constant> <constant name="ENV_BG_CLEAR_COLOR" value="0" enum="EnvironmentBG"> Use the clear color as background. @@ -3479,28 +3566,40 @@ Represents the size of the [enum EnvironmentBG] enum. </constant> <constant name="ENV_AMBIENT_SOURCE_BG" value="0" enum="EnvironmentAmbientSource"> + Gather ambient light from whichever source is specified as the background. </constant> <constant name="ENV_AMBIENT_SOURCE_DISABLED" value="1" enum="EnvironmentAmbientSource"> + Disable ambient light. </constant> <constant name="ENV_AMBIENT_SOURCE_COLOR" value="2" enum="EnvironmentAmbientSource"> + Specify a specific [Color] for ambient light. </constant> <constant name="ENV_AMBIENT_SOURCE_SKY" value="3" enum="EnvironmentAmbientSource"> + Gather ambient light from the [Sky] regardless of what the background is. </constant> <constant name="ENV_REFLECTION_SOURCE_BG" value="0" enum="EnvironmentReflectionSource"> + Use the background for reflections. </constant> <constant name="ENV_REFLECTION_SOURCE_DISABLED" value="1" enum="EnvironmentReflectionSource"> + Disable reflections. </constant> <constant name="ENV_REFLECTION_SOURCE_SKY" value="2" enum="EnvironmentReflectionSource"> + Use the [Sky] for reflections regardless of what the background is. </constant> <constant name="ENV_GLOW_BLEND_MODE_ADDITIVE" value="0" enum="EnvironmentGlowBlendMode"> + Additive glow blending mode. Mostly used for particles, glows (bloom), lens flare, bright sources. </constant> <constant name="ENV_GLOW_BLEND_MODE_SCREEN" value="1" enum="EnvironmentGlowBlendMode"> + Screen glow blending mode. Increases brightness, used frequently with bloom. </constant> <constant name="ENV_GLOW_BLEND_MODE_SOFTLIGHT" value="2" enum="EnvironmentGlowBlendMode"> + Soft light glow blending mode. Modifies contrast, exposes shadows and highlights (vivid bloom). </constant> <constant name="ENV_GLOW_BLEND_MODE_REPLACE" value="3" enum="EnvironmentGlowBlendMode"> + 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. </constant> <constant name="ENV_GLOW_BLEND_MODE_MIX" value="4" enum="EnvironmentGlowBlendMode"> + Mixes the glow with the underlying color to avoid increasing brightness as much while still maintaining a glow effect. </constant> <constant name="ENV_TONE_MAPPER_LINEAR" value="0" enum="EnvironmentToneMapper"> Output color as they came in. @@ -3514,6 +3613,14 @@ <constant name="ENV_TONE_MAPPER_ACES" value="3" enum="EnvironmentToneMapper"> Use the ACES tonemapper. </constant> + <constant name="ENV_SSR_ROUGNESS_QUALITY_DISABLED" value="0" enum="EnvironmentSSRRoughnessQuality"> + </constant> + <constant name="ENV_SSR_ROUGNESS_QUALITY_LOW" value="1" enum="EnvironmentSSRRoughnessQuality"> + </constant> + <constant name="ENV_SSR_ROUGNESS_QUALITY_MEDIUM" value="2" enum="EnvironmentSSRRoughnessQuality"> + </constant> + <constant name="ENV_SSR_ROUGNESS_QUALITY_HIGH" value="3" enum="EnvironmentSSRRoughnessQuality"> + </constant> <constant name="ENV_SSAO_BLUR_DISABLED" value="0" enum="EnvironmentSSAOBlur"> Disables the blur set for SSAO. Will make SSAO look noisier. </constant> @@ -3533,23 +3640,51 @@ Medium quality screen space ambient occlusion. </constant> <constant name="ENV_SSAO_QUALITY_HIGH" value="2" enum="EnvironmentSSAOQuality"> - Highest quality screen space ambient occlusion. + High quality screen space ambient occlusion. </constant> <constant name="ENV_SSAO_QUALITY_ULTRA" value="3" enum="EnvironmentSSAOQuality"> + Highest quality screen space ambient occlusion. + </constant> + <constant name="SUB_SURFACE_SCATTERING_QUALITY_DISABLED" value="0" enum="SubSurfaceScatteringQuality"> + </constant> + <constant name="SUB_SURFACE_SCATTERING_QUALITY_LOW" value="1" enum="SubSurfaceScatteringQuality"> + </constant> + <constant name="SUB_SURFACE_SCATTERING_QUALITY_MEDIUM" value="2" enum="SubSurfaceScatteringQuality"> + </constant> + <constant name="SUB_SURFACE_SCATTERING_QUALITY_HIGH" value="3" enum="SubSurfaceScatteringQuality"> </constant> <constant name="DOF_BLUR_QUALITY_VERY_LOW" value="0" enum="DOFBlurQuality"> + Lowest quality DOF blur. This is the fastest setting, but you may be able to see filtering artifacts. </constant> <constant name="DOF_BLUR_QUALITY_LOW" value="1" enum="DOFBlurQuality"> + Low quality DOF blur. </constant> <constant name="DOF_BLUR_QUALITY_MEDIUM" value="2" enum="DOFBlurQuality"> + Medium quality DOF blur. </constant> <constant name="DOF_BLUR_QUALITY_HIGH" value="3" enum="DOFBlurQuality"> + Highest quality DOF blur. Results in the smoothest looking blur by taking the most samples, but is also significantly slower. </constant> <constant name="DOF_BOKEH_BOX" value="0" enum="DOFBokehShape"> + Calculate the DOF blur using a box filter. The fastest option, but results in obvious lines in blur pattern. </constant> <constant name="DOF_BOKEH_HEXAGON" value="1" enum="DOFBokehShape"> + Calculates DOF blur using a hexagon shaped filter. </constant> <constant name="DOF_BOKEH_CIRCLE" value="2" enum="DOFBokehShape"> + 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). + </constant> + <constant name="SHADOW_QUALITY_HARD" value="0" enum="ShadowQuality"> + </constant> + <constant name="SHADOW_QUALITY_SOFT_LOW" value="1" enum="ShadowQuality"> + </constant> + <constant name="SHADOW_QUALITY_SOFT_MEDIUM" value="2" enum="ShadowQuality"> + </constant> + <constant name="SHADOW_QUALITY_SOFT_HIGH" value="3" enum="ShadowQuality"> + </constant> + <constant name="SHADOW_QUALITY_SOFT_ULTRA" value="4" enum="ShadowQuality"> + </constant> + <constant name="SHADOW_QUALITY_MAX" value="5" enum="ShadowQuality"> </constant> <constant name="SCENARIO_DEBUG_DISABLED" value="0" enum="ScenarioDebugMode"> Do not use a debug mode. @@ -3584,13 +3719,16 @@ <constant name="INSTANCE_REFLECTION_PROBE" value="6" enum="InstanceType"> The instance is a reflection probe. </constant> - <constant name="INSTANCE_GI_PROBE" value="7" enum="InstanceType"> + <constant name="INSTANCE_DECAL" value="7" enum="InstanceType"> + The instance is a decal. + </constant> + <constant name="INSTANCE_GI_PROBE" value="8" enum="InstanceType"> The instance is a GI probe. </constant> - <constant name="INSTANCE_LIGHTMAP_CAPTURE" value="8" enum="InstanceType"> + <constant name="INSTANCE_LIGHTMAP_CAPTURE" value="9" enum="InstanceType"> The instance is a lightmap capture. </constant> - <constant name="INSTANCE_MAX" value="9" enum="InstanceType"> + <constant name="INSTANCE_MAX" value="10" enum="InstanceType"> Represents the size of the [enum InstanceType] enum. </constant> <constant name="INSTANCE_GEOMETRY_MASK" value="30" enum="InstanceType"> @@ -3600,6 +3738,7 @@ Allows the instance to be used in baked lighting. </constant> <constant name="INSTANCE_FLAG_USE_DYNAMIC_GI" value="1" enum="InstanceFlags"> + Allows the instance to be used with dynamic global illumination. </constant> <constant name="INSTANCE_FLAG_DRAW_NEXT_FRAME_IF_VISIBLE" value="2" enum="InstanceFlags"> When set, manually requests to draw geometry on next frame. @@ -3629,30 +3768,43 @@ The nine patch gets filled with tiles where needed and stretches them a bit if needed. </constant> <constant name="CANVAS_ITEM_TEXTURE_FILTER_DEFAULT" value="0" enum="CanvasItemTextureFilter"> + Uses the default filter mode for this [Viewport]. </constant> <constant name="CANVAS_ITEM_TEXTURE_FILTER_NEAREST" value="1" enum="CanvasItemTextureFilter"> + The texture filter reads from the nearest pixel only. The simplest and fastest method of filtering, but the texture will look pixelized. </constant> <constant name="CANVAS_ITEM_TEXTURE_FILTER_LINEAR" value="2" enum="CanvasItemTextureFilter"> + The texture filter blends between the nearest 4 pixels. Use this when you want to avoid a pixelated style, but do not want mipmaps. </constant> <constant name="CANVAS_ITEM_TEXTURE_FILTER_NEAREST_WITH_MIPMAPS" value="3" enum="CanvasItemTextureFilter"> + The texture filter reads from the nearest pixel in the nearest mipmap. The fastest way to read from textures with mipmaps. </constant> <constant name="CANVAS_ITEM_TEXTURE_FILTER_LINEAR_WITH_MIPMAPS" value="4" enum="CanvasItemTextureFilter"> + The texture filter blends between the nearest 4 pixels and between the nearest 2 mipmaps. </constant> <constant name="CANVAS_ITEM_TEXTURE_FILTER_NEAREST_WITH_MIPMAPS_ANISOTROPIC" value="5" enum="CanvasItemTextureFilter"> + 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. </constant> <constant name="CANVAS_ITEM_TEXTURE_FILTER_LINEAR_WITH_MIPMAPS_ANISOTROPIC" value="6" enum="CanvasItemTextureFilter"> + 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. </constant> <constant name="CANVAS_ITEM_TEXTURE_FILTER_MAX" value="7" enum="CanvasItemTextureFilter"> + Max value for [enum CanvasItemTextureFilter] enum. </constant> <constant name="CANVAS_ITEM_TEXTURE_REPEAT_DEFAULT" value="0" enum="CanvasItemTextureRepeat"> + Uses the default repeat mode for this [Viewport]. </constant> <constant name="CANVAS_ITEM_TEXTURE_REPEAT_DISABLED" value="1" enum="CanvasItemTextureRepeat"> + 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. </constant> <constant name="CANVAS_ITEM_TEXTURE_REPEAT_ENABLED" value="2" enum="CanvasItemTextureRepeat"> + 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. </constant> <constant name="CANVAS_ITEM_TEXTURE_REPEAT_MIRROR" value="3" enum="CanvasItemTextureRepeat"> + Flip the texture when repeating so that the edge lines up instead of abruptly changing. </constant> <constant name="CANVAS_ITEM_TEXTURE_REPEAT_MAX" value="4" enum="CanvasItemTextureRepeat"> + Max value for [enum CanvasItemTextureRepeat] enum. </constant> <constant name="CANVAS_LIGHT_MODE_ADD" value="0" enum="CanvasLightMode"> Adds light color additive to the canvas. @@ -3676,6 +3828,7 @@ Use PCF13 filtering to filter canvas light shadows. </constant> <constant name="CANVAS_LIGHT_FILTER_MAX" value="3" enum="CanvasLightShadowFilter"> + Max value of the [enum CanvasLightShadowFilter] enum. </constant> <constant name="CANVAS_OCCLUDER_POLYGON_CULL_DISABLED" value="0" enum="CanvasOccluderPolygonCullMode"> Culling of the canvas occluder is disabled. @@ -3686,6 +3839,64 @@ <constant name="CANVAS_OCCLUDER_POLYGON_CULL_COUNTER_CLOCKWISE" value="2" enum="CanvasOccluderPolygonCullMode"> Culling of the canvas occluder is counterclockwise. </constant> + <constant name="GLOBAL_VAR_TYPE_BOOL" value="0" enum="GlobalVariableType"> + </constant> + <constant name="GLOBAL_VAR_TYPE_BVEC2" value="1" enum="GlobalVariableType"> + </constant> + <constant name="GLOBAL_VAR_TYPE_BVEC3" value="2" enum="GlobalVariableType"> + </constant> + <constant name="GLOBAL_VAR_TYPE_BVEC4" value="3" enum="GlobalVariableType"> + </constant> + <constant name="GLOBAL_VAR_TYPE_INT" value="4" enum="GlobalVariableType"> + </constant> + <constant name="GLOBAL_VAR_TYPE_IVEC2" value="5" enum="GlobalVariableType"> + </constant> + <constant name="GLOBAL_VAR_TYPE_IVEC3" value="6" enum="GlobalVariableType"> + </constant> + <constant name="GLOBAL_VAR_TYPE_IVEC4" value="7" enum="GlobalVariableType"> + </constant> + <constant name="GLOBAL_VAR_TYPE_RECT2I" value="8" enum="GlobalVariableType"> + </constant> + <constant name="GLOBAL_VAR_TYPE_UINT" value="9" enum="GlobalVariableType"> + </constant> + <constant name="GLOBAL_VAR_TYPE_UVEC2" value="10" enum="GlobalVariableType"> + </constant> + <constant name="GLOBAL_VAR_TYPE_UVEC3" value="11" enum="GlobalVariableType"> + </constant> + <constant name="GLOBAL_VAR_TYPE_UVEC4" value="12" enum="GlobalVariableType"> + </constant> + <constant name="GLOBAL_VAR_TYPE_FLOAT" value="13" enum="GlobalVariableType"> + </constant> + <constant name="GLOBAL_VAR_TYPE_VEC2" value="14" enum="GlobalVariableType"> + </constant> + <constant name="GLOBAL_VAR_TYPE_VEC3" value="15" enum="GlobalVariableType"> + </constant> + <constant name="GLOBAL_VAR_TYPE_VEC4" value="16" enum="GlobalVariableType"> + </constant> + <constant name="GLOBAL_VAR_TYPE_COLOR" value="17" enum="GlobalVariableType"> + </constant> + <constant name="GLOBAL_VAR_TYPE_RECT2" value="18" enum="GlobalVariableType"> + </constant> + <constant name="GLOBAL_VAR_TYPE_MAT2" value="19" enum="GlobalVariableType"> + </constant> + <constant name="GLOBAL_VAR_TYPE_MAT3" value="20" enum="GlobalVariableType"> + </constant> + <constant name="GLOBAL_VAR_TYPE_MAT4" value="21" enum="GlobalVariableType"> + </constant> + <constant name="GLOBAL_VAR_TYPE_TRANSFORM_2D" value="22" enum="GlobalVariableType"> + </constant> + <constant name="GLOBAL_VAR_TYPE_TRANSFORM" value="23" enum="GlobalVariableType"> + </constant> + <constant name="GLOBAL_VAR_TYPE_SAMPLER2D" value="24" enum="GlobalVariableType"> + </constant> + <constant name="GLOBAL_VAR_TYPE_SAMPLER2DARRAY" value="25" enum="GlobalVariableType"> + </constant> + <constant name="GLOBAL_VAR_TYPE_SAMPLER3D" value="26" enum="GlobalVariableType"> + </constant> + <constant name="GLOBAL_VAR_TYPE_SAMPLERCUBE" value="27" enum="GlobalVariableType"> + </constant> + <constant name="GLOBAL_VAR_TYPE_MAX" value="28" enum="GlobalVariableType"> + </constant> <constant name="INFO_OBJECTS_IN_FRAME" value="0" enum="RenderInfo"> The amount of objects in the frame. </constant> diff --git a/doc/classes/ResourceFormatLoaderCrypto.xml b/doc/classes/ResourceFormatLoaderCrypto.xml deleted file mode 100644 index fda529fdbd..0000000000 --- a/doc/classes/ResourceFormatLoaderCrypto.xml +++ /dev/null @@ -1,13 +0,0 @@ -<?xml version="1.0" encoding="UTF-8" ?> -<class name="ResourceFormatLoaderCrypto" inherits="ResourceFormatLoader" version="4.0"> - <brief_description> - </brief_description> - <description> - </description> - <tutorials> - </tutorials> - <methods> - </methods> - <constants> - </constants> -</class> diff --git a/doc/classes/ResourceFormatSaverCrypto.xml b/doc/classes/ResourceFormatSaverCrypto.xml deleted file mode 100644 index 31db8ff4f5..0000000000 --- a/doc/classes/ResourceFormatSaverCrypto.xml +++ /dev/null @@ -1,13 +0,0 @@ -<?xml version="1.0" encoding="UTF-8" ?> -<class name="ResourceFormatSaverCrypto" inherits="ResourceFormatSaver" version="4.0"> - <brief_description> - </brief_description> - <description> - </description> - <tutorials> - </tutorials> - <methods> - </methods> - <constants> - </constants> -</class> diff --git a/doc/classes/RigidBody2D.xml b/doc/classes/RigidBody2D.xml index e746d7fc96..8379fc5b58 100644 --- a/doc/classes/RigidBody2D.xml +++ b/doc/classes/RigidBody2D.xml @@ -81,7 +81,7 @@ </description> </method> <method name="get_colliding_bodies" qualifiers="const"> - <return type="Array"> + <return type="Node2D[]"> </return> <description> Returns a list of the bodies colliding with this one. Use [member contacts_reported] to set the maximum number reported. You must also set [member contact_monitor] to [code]true[/code]. diff --git a/doc/classes/RigidBody3D.xml b/doc/classes/RigidBody3D.xml index 829589f650..1db818d6af 100644 --- a/doc/classes/RigidBody3D.xml +++ b/doc/classes/RigidBody3D.xml @@ -28,7 +28,7 @@ <argument index="0" name="force" type="Vector3"> </argument> <description> - Adds a constant directional force without affecting rotation. + Adds a constant directional force (i.e. acceleration) without affecting rotation. This is equivalent to [code]add_force(force, Vector3(0,0,0))[/code]. </description> </method> @@ -40,7 +40,8 @@ <argument index="1" name="position" type="Vector3"> </argument> <description> - Adds a constant force (i.e. acceleration). + Adds a constant directional force (i.e. acceleration). + The position uses the rotation of the global coordinate system, but is centered at the object's origin. </description> </method> <method name="add_torque"> @@ -146,7 +147,7 @@ Lock the body's movement in the Z axis. </member> <member name="can_sleep" type="bool" setter="set_can_sleep" getter="is_able_to_sleep" default="true"> - 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. + 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. </member> <member name="contact_monitor" type="bool" setter="set_contact_monitor" getter="is_contact_monitor_enabled" default="false"> If [code]true[/code], the RigidBody3D will emit signals when it collides with another RigidBody3D. diff --git a/doc/classes/ScriptEditor.xml b/doc/classes/ScriptEditor.xml index 10d6e5f578..f0ad781f77 100644 --- a/doc/classes/ScriptEditor.xml +++ b/doc/classes/ScriptEditor.xml @@ -4,6 +4,7 @@ Godot editor's script editor. </brief_description> <description> + [b]Note:[/b] This class shouldn't be instantiated directly. Instead, access the singleton using [method EditorInterface.get_script_editor]. </description> <tutorials> </tutorials> diff --git a/modules/bullet/doc_classes/BulletPhysicsServer3D.xml b/doc/classes/ShaderGlobalsOverride.xml index b20595b4f6..2aa00aa5a9 100644 --- a/modules/bullet/doc_classes/BulletPhysicsServer3D.xml +++ b/doc/classes/ShaderGlobalsOverride.xml @@ -1,5 +1,5 @@ <?xml version="1.0" encoding="UTF-8" ?> -<class name="BulletPhysicsServer3D" inherits="PhysicsServer3D" version="4.0"> +<class name="ShaderGlobalsOverride" inherits="Node" version="4.0"> <brief_description> </brief_description> <description> diff --git a/doc/classes/Skeleton3D.xml b/doc/classes/Skeleton3D.xml index 08404fb467..4460b519fc 100644 --- a/doc/classes/Skeleton3D.xml +++ b/doc/classes/Skeleton3D.xml @@ -157,7 +157,7 @@ <method name="physical_bones_start_simulation"> <return type="void"> </return> - <argument index="0" name="bones" type="Array" default="[ ]"> + <argument index="0" name="bones" type="StringName[]" default="[ ]"> </argument> <description> </description> diff --git a/doc/classes/Sky.xml b/doc/classes/Sky.xml index f574f42431..78c75d9c2b 100644 --- a/doc/classes/Sky.xml +++ b/doc/classes/Sky.xml @@ -49,7 +49,7 @@ Represents the size of the [enum RadianceSize] enum. </constant> <constant name="PROCESS_MODE_QUALITY" value="0" enum="ProcessMode"> - 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. + 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. 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]. </constant> <constant name="PROCESS_MODE_REALTIME" value="1" enum="ProcessMode"> Uses the fast filtering algorithm to process the radiance map. In general this results in lower quality, but substantially faster run times. diff --git a/doc/classes/SubViewport.xml b/doc/classes/SubViewport.xml index dc3d748496..6014762e3d 100644 --- a/doc/classes/SubViewport.xml +++ b/doc/classes/SubViewport.xml @@ -9,9 +9,6 @@ <methods> </methods> <members> - <member name="arvr" type="bool" setter="set_use_arvr" getter="is_using_arvr" default="false"> - If [code]true[/code], the sub-viewport will be used in AR/VR process. - </member> <member name="render_target_clear_mode" type="int" setter="set_clear_mode" getter="get_clear_mode" enum="SubViewport.ClearMode" default="0"> The clear mode when the sub-viewport is used as a render target. </member> @@ -27,8 +24,20 @@ <member name="size_2d_override_stretch" type="bool" setter="set_size_2d_override_stretch" getter="is_size_2d_override_stretch_enabled" default="false"> If [code]true[/code], the 2D size override affects stretch as well. </member> + <member name="xr" type="bool" setter="set_use_xr" getter="is_using_xr" default="false"> + If [code]true[/code], the sub-viewport will be used in AR/VR process. + </member> </members> <constants> + <constant name="CLEAR_MODE_ALWAYS" value="0" enum="ClearMode"> + Always clear the render target before drawing. + </constant> + <constant name="CLEAR_MODE_NEVER" value="1" enum="ClearMode"> + Never clear the render target. + </constant> + <constant name="CLEAR_MODE_ONLY_NEXT_FRAME" value="2" enum="ClearMode"> + Clear the render target next frame, then switch to [constant CLEAR_MODE_NEVER]. + </constant> <constant name="UPDATE_DISABLED" value="0" enum="UpdateMode"> Do not update the render target. </constant> @@ -44,14 +53,5 @@ <constant name="UPDATE_ALWAYS" value="4" enum="UpdateMode"> Always update the render target. </constant> - <constant name="CLEAR_MODE_ALWAYS" value="0" enum="ClearMode"> - Always clear the render target before drawing. - </constant> - <constant name="CLEAR_MODE_NEVER" value="1" enum="ClearMode"> - Never clear the render target. - </constant> - <constant name="CLEAR_MODE_ONLY_NEXT_FRAME" value="2" enum="ClearMode"> - Clear the render target next frame, then switch to [constant CLEAR_MODE_NEVER]. - </constant> </constants> </class> diff --git a/doc/classes/SurfaceTool.xml b/doc/classes/SurfaceTool.xml index 4304a8df5e..eeb6b6cd9d 100644 --- a/doc/classes/SurfaceTool.xml +++ b/doc/classes/SurfaceTool.xml @@ -15,6 +15,8 @@ The above [SurfaceTool] now contains one vertex of a triangle which has a UV coordinate and a specified [Color]. If another vertex were added without calling [method add_uv] or [method add_color], then the last values would be used. Vertex attributes must be passed [b]before[/b] calling [method add_vertex]. Failure to do so will result in an error when committing the vertex information to a mesh. Additionally, the attributes used before the first vertex is added determine the format of the mesh. For example, if you only add UVs to the first vertex, you cannot add color to any of the subsequent vertices. + See also [ArrayMesh], [ImmediateGeometry3D] and [MeshDataTool] for procedural geometry generation. + [b]Note:[/b] Godot uses clockwise [url=https://learnopengl.com/Advanced-OpenGL/Face-culling]winding order[/url] for front faces of triangle primitive modes. </description> <tutorials> </tutorials> diff --git a/doc/classes/TabContainer.xml b/doc/classes/TabContainer.xml index f7e94ad236..22e92ae5d9 100644 --- a/doc/classes/TabContainer.xml +++ b/doc/classes/TabContainer.xml @@ -36,10 +36,10 @@ <method name="get_tab_control" qualifiers="const"> <return type="Control"> </return> - <argument index="0" name="idx" type="int"> + <argument index="0" name="tab_idx" type="int"> </argument> <description> - Returns the currently visible tab's [Control] node. + Returns the [Control] node from the tab at index [code]tab_idx[/code]. </description> </method> <method name="get_tab_count" qualifiers="const"> diff --git a/doc/classes/TextEdit.xml b/doc/classes/TextEdit.xml index b515b27b31..b7cf93d672 100644 --- a/doc/classes/TextEdit.xml +++ b/doc/classes/TextEdit.xml @@ -433,6 +433,7 @@ </member> <member name="mouse_default_cursor_shape" type="int" setter="set_default_cursor_shape" getter="get_default_cursor_shape" override="true" enum="Control.CursorShape" default="1" /> <member name="override_selected_font_color" type="bool" setter="set_override_selected_font_color" getter="is_overriding_selected_font_color" default="false"> + If [code]true[/code], custom [code]font_color_selected[/code] will be used for selected text. </member> <member name="readonly" type="bool" setter="set_readonly" getter="is_readonly" default="false"> If [code]true[/code], read-only mode is enabled. Existing text cannot be modified and new text cannot be added. @@ -611,6 +612,7 @@ <theme_item name="font_color_readonly" type="Color" default="Color( 0.88, 0.88, 0.88, 0.5 )"> </theme_item> <theme_item name="font_color_selected" type="Color" default="Color( 0, 0, 0, 1 )"> + Sets the [Color] of the selected text. [member override_selected_font_color] has to be enabled. </theme_item> <theme_item name="function_color" type="Color" default="Color( 0.4, 0.64, 0.81, 1 )"> </theme_item> diff --git a/doc/classes/TileMap.xml b/doc/classes/TileMap.xml index 1db1142aa0..bfe6983f06 100644 --- a/doc/classes/TileMap.xml +++ b/doc/classes/TileMap.xml @@ -43,7 +43,7 @@ <argument index="1" name="y" type="int"> </argument> <description> - 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. </description> </method> <method name="get_cellv" qualifiers="const"> @@ -74,14 +74,14 @@ </description> </method> <method name="get_used_cells" qualifiers="const"> - <return type="Array"> + <return type="Vector2i[]"> </return> <description> Returns a [Vector2] array with the positions of all cells containing a tile from the tileset (i.e. a tile index different from [code]-1[/code]). </description> </method> <method name="get_used_cells_by_id" qualifiers="const"> - <return type="Array"> + <return type="Vector2i[]"> </return> <argument index="0" name="id" type="int"> </argument> @@ -161,7 +161,7 @@ <description> Sets the tile index for the cell given by a Vector2. An index of [code]-1[/code] clears the cell. - Optionally, the tile can also be flipped, transposed, or given autotile coordinates. + Optionally, the tile can also be flipped, transposed, or given autotile coordinates. The autotile coordinate refers to the column and row of the subtile. [b]Note:[/b] Data such as navigation polygons and collision shapes are not immediately updated for performance reasons. If you need these to be immediately updated, you can call [method update_dirty_quadrants]. Overriding this method also overrides it internally, allowing custom logic to be implemented when tiles are placed/removed: diff --git a/doc/classes/Transform.xml b/doc/classes/Transform.xml index e4d367c344..4175f01eb4 100644 --- a/doc/classes/Transform.xml +++ b/doc/classes/Transform.xml @@ -135,7 +135,7 @@ <argument index="0" name="scale" type="Vector3"> </argument> <description> - 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. </description> </method> <method name="translated"> diff --git a/doc/classes/Tree.xml b/doc/classes/Tree.xml index b01ba3850f..0b2fb80480 100644 --- a/doc/classes/Tree.xml +++ b/doc/classes/Tree.xml @@ -16,7 +16,7 @@ var subchild1 = tree.create_item(child1) subchild1.set_text(0, "Subchild1") [/codeblock] - 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]. + To iterate over all the [TreeItem] objects in a [Tree] object, use [method TreeItem.get_next] and [method TreeItem.get_children] after getting the root through [method get_root]. You can use [method Object.free] on a [TreeItem] to remove it from the [Tree]. </description> <tutorials> </tutorials> diff --git a/doc/classes/TreeItem.xml b/doc/classes/TreeItem.xml index 84aa3a3686..a8a17370c2 100644 --- a/doc/classes/TreeItem.xml +++ b/doc/classes/TreeItem.xml @@ -5,6 +5,7 @@ </brief_description> <description> Control for a single item inside a [Tree]. May have child [TreeItem]s and be styled as well as contain buttons. + You can remove a [TreeItem] by using [method Object.free]. </description> <tutorials> </tutorials> @@ -350,7 +351,7 @@ <argument index="0" name="child" type="Object"> </argument> <description> - Removes the given child TreeItem. + 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]. </description> </method> <method name="select"> diff --git a/doc/classes/Tween.xml b/doc/classes/Tween.xml index 371b027534..f9320ac55e 100644 --- a/doc/classes/Tween.xml +++ b/doc/classes/Tween.xml @@ -6,7 +6,7 @@ <description> Tweens are useful for animations requiring a numerical property to be interpolated over a range of values. The name [i]tween[/i] comes from [i]in-betweening[/i], an animation technique where you specify [i]keyframes[/i] and the computer interpolates the frames that appear between them. [Tween] is more suited than [AnimationPlayer] for animations where you don't know the final values in advance. For example, interpolating a dynamically-chosen camera zoom value is best done with a [Tween] node; it would be difficult to do the same thing with an [AnimationPlayer] node. - Here is a brief usage example that causes a 2D node to move smoothly between two positions: + Here is a brief usage example that makes a 2D node move smoothly between two positions: [codeblock] var tween = get_node("Tween") tween.interpolate_property($Node2D, "position", @@ -15,7 +15,8 @@ tween.start() [/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 [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. + 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] </description> <tutorials> </tutorials> diff --git a/doc/classes/UndoRedo.xml b/doc/classes/UndoRedo.xml index 766ebf7e32..2cc3e974e2 100644 --- a/doc/classes/UndoRedo.xml +++ b/doc/classes/UndoRedo.xml @@ -155,7 +155,7 @@ Returns [code]true[/code] if an "undo" action is available. </description> </method> - <method name="is_commiting_action" qualifiers="const"> + <method name="is_committing_action" qualifiers="const"> <return type="bool"> </return> <description> diff --git a/doc/classes/VSlider.xml b/doc/classes/VSlider.xml index 3faafdfe80..9394d6b430 100644 --- a/doc/classes/VSlider.xml +++ b/doc/classes/VSlider.xml @@ -23,6 +23,8 @@ <theme_item name="grabber_area" type="StyleBox"> The background of the area below the grabber. </theme_item> + <theme_item name="grabber_area_highlight" type="StyleBox"> + </theme_item> <theme_item name="grabber_disabled" type="Texture2D"> The texture for the grabber when it's disabled. </theme_item> 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 5826822c6e..a2d53f8e0c 100644 --- a/doc/classes/Viewport.xml +++ b/doc/classes/Viewport.xml @@ -192,8 +192,10 @@ If [code]true[/code], the viewport will process 3D audio streams. </member> <member name="canvas_item_default_texture_filter" type="int" setter="set_default_canvas_item_texture_filter" getter="get_default_canvas_item_texture_filter" enum="Viewport.DefaultCanvasItemTextureFilter" default="1"> + Sets the default filter mode used by [CanvasItem]s in this Viewport. See [enum DefaultCanvasItemTextureFilter] for options. </member> <member name="canvas_item_default_texture_repeat" type="int" setter="set_default_canvas_item_texture_repeat" getter="get_default_canvas_item_texture_repeat" enum="Viewport.DefaultCanvasItemTextureRepeat" default="0"> + Sets the default repeat mode used by [CanvasItem]s in this Viewport. See [enum DefaultCanvasItemTextureRepeat] for options. </member> <member name="canvas_transform" type="Transform2D" setter="set_canvas_transform" getter="get_canvas_transform"> 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. @@ -223,6 +225,9 @@ <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. </member> + <member name="screen_space_aa" type="int" setter="set_screen_space_aa" getter="get_screen_space_aa" enum="Viewport.ScreenSpaceAA" default="0"> + 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. + </member> <member name="shadow_atlas_quad_0" type="int" setter="set_shadow_atlas_quadrant_subdiv" getter="get_shadow_atlas_quadrant_subdiv" enum="Viewport.ShadowAtlasQuadrantSubdiv" default="2"> The subdivision amount of the first quadrant on the shadow atlas. </member> @@ -288,6 +293,33 @@ <constant name="SHADOW_ATLAS_QUADRANT_SUBDIV_MAX" value="7" enum="ShadowAtlasQuadrantSubdiv"> Represents the size of the [enum ShadowAtlasQuadrantSubdiv] enum. </constant> + <constant name="MSAA_DISABLED" value="0" enum="MSAA"> + Multisample antialiasing mode disabled. This is the default value, and also the fastest setting. + </constant> + <constant name="MSAA_2X" value="1" enum="MSAA"> + Use 2x Multisample Antialiasing. + </constant> + <constant name="MSAA_4X" value="2" enum="MSAA"> + Use 4x Multisample Antialiasing. + </constant> + <constant name="MSAA_8X" value="3" enum="MSAA"> + Use 8x Multisample Antialiasing. Likely unsupported on low-end and older hardware. + </constant> + <constant name="MSAA_16X" value="4" enum="MSAA"> + Use 16x Multisample Antialiasing. Likely unsupported on medium and low-end hardware. + </constant> + <constant name="MSAA_MAX" value="5" enum="MSAA"> + Represents the size of the [enum MSAA] enum. + </constant> + <constant name="SCREEN_SPACE_AA_DISABLED" value="0" enum="ScreenSpaceAA"> + Do not perform any antialiasing in the full screen post-process. + </constant> + <constant name="SCREEN_SPACE_AA_FXAA" value="1" enum="ScreenSpaceAA"> + 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. + </constant> + <constant name="SCREEN_SPACE_AA_MAX" value="2" enum="ScreenSpaceAA"> + Represents the size of the [enum ScreenSpaceAA] enum. + </constant> <constant name="RENDER_INFO_OBJECTS_IN_FRAME" value="0" enum="RenderInfo"> Amount of objects in frame. </constant> @@ -315,58 +347,71 @@ <constant name="DEBUG_DRAW_UNSHADED" value="1" enum="DebugDraw"> Objects are displayed without light information. </constant> + <constant name="DEBUG_DRAW_LIGHTING" value="2" enum="DebugDraw"> + </constant> <constant name="DEBUG_DRAW_OVERDRAW" value="3" enum="DebugDraw"> - Objected are displayed semi-transparent with additive blending so you can see where they intersect. + 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. </constant> <constant name="DEBUG_DRAW_WIREFRAME" value="4" enum="DebugDraw"> Objects are displayed in wireframe style. </constant> + <constant name="DEBUG_DRAW_NORMAL_BUFFER" value="5" enum="DebugDraw"> + </constant> <constant name="DEBUG_DRAW_GI_PROBE_ALBEDO" value="6" enum="DebugDraw"> + Objects are displayed with only the albedo value from [GIProbe]s. </constant> <constant name="DEBUG_DRAW_GI_PROBE_LIGHTING" value="7" enum="DebugDraw"> + Objects are displayed with only the lighting value from [GIProbe]s. </constant> <constant name="DEBUG_DRAW_GI_PROBE_EMISSION" value="8" enum="DebugDraw"> + Objects are displayed with only the emission color from [GIProbe]s. </constant> <constant name="DEBUG_DRAW_SHADOW_ATLAS" value="9" enum="DebugDraw"> + Draws the shadow atlas that stores shadows from [OmniLight3D]s and [SpotLight3D]s in the upper left quadrant of the [Viewport]. </constant> <constant name="DEBUG_DRAW_DIRECTIONAL_SHADOW_ATLAS" value="10" enum="DebugDraw"> + Draws the shadow atlas that stores shadows from [DirectionalLight3D]s in the upper left quadrant of the [Viewport]. </constant> <constant name="DEBUG_DRAW_SCENE_LUMINANCE" value="11" enum="DebugDraw"> </constant> <constant name="DEBUG_DRAW_SSAO" value="12" enum="DebugDraw"> + 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]. </constant> - <constant name="MSAA_DISABLED" value="0" enum="MSAA"> - Multisample anti-aliasing mode disabled. This is the default value. - </constant> - <constant name="MSAA_2X" value="1" enum="MSAA"> - Use 2x Multisample Antialiasing. - </constant> - <constant name="MSAA_4X" value="2" enum="MSAA"> - Use 4x Multisample Antialiasing. + <constant name="DEBUG_DRAW_ROUGHNESS_LIMITER" value="13" enum="DebugDraw"> + 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. </constant> - <constant name="MSAA_8X" value="3" enum="MSAA"> - Use 8x Multisample Antialiasing. Likely unsupported on low-end and older hardware. + <constant name="DEBUG_DRAW_PSSM_SPLITS" value="14" enum="DebugDraw"> + 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. </constant> - <constant name="MSAA_16X" value="4" enum="MSAA"> - Use 16x Multisample Antialiasing. Likely unsupported on medium and low-end hardware. + <constant name="DEBUG_DRAW_DECAL_ATLAS" value="15" enum="DebugDraw"> + Draws the decal atlas used by [Decal]s and light projector textures in the upper left quadrant of the [Viewport]. </constant> <constant name="DEFAULT_CANVAS_ITEM_TEXTURE_FILTER_NEAREST" value="0" enum="DefaultCanvasItemTextureFilter"> + The texture filter reads from the nearest pixel only. The simplest and fastest method of filtering, but the texture will look pixelized. </constant> <constant name="DEFAULT_CANVAS_ITEM_TEXTURE_FILTER_LINEAR" value="1" enum="DefaultCanvasItemTextureFilter"> + The texture filter blends between the nearest 4 pixels. Use this when you want to avoid a pixelated style, but do not want mipmaps. </constant> <constant name="DEFAULT_CANVAS_ITEM_TEXTURE_FILTER_LINEAR_WITH_MIPMAPS" value="2" enum="DefaultCanvasItemTextureFilter"> + The texture filter reads from the nearest pixel in the nearest mipmap. The fastest way to read from textures with mipmaps. </constant> <constant name="DEFAULT_CANVAS_ITEM_TEXTURE_FILTER_NEAREST_WITH_MIPMAPS" value="3" enum="DefaultCanvasItemTextureFilter"> + The texture filter blends between the nearest 4 pixels and between the nearest 2 mipmaps. </constant> <constant name="DEFAULT_CANVAS_ITEM_TEXTURE_FILTER_MAX" value="4" enum="DefaultCanvasItemTextureFilter"> + Max value for [enum DefaultCanvasItemTextureFilter] enum. </constant> <constant name="DEFAULT_CANVAS_ITEM_TEXTURE_REPEAT_DISABLED" value="0" enum="DefaultCanvasItemTextureRepeat"> + 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. </constant> <constant name="DEFAULT_CANVAS_ITEM_TEXTURE_REPEAT_ENABLED" value="1" enum="DefaultCanvasItemTextureRepeat"> + 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. </constant> <constant name="DEFAULT_CANVAS_ITEM_TEXTURE_REPEAT_MIRROR" value="2" enum="DefaultCanvasItemTextureRepeat"> + Flip the texture when repeating so that the edge lines up instead of abruptly changing. </constant> <constant name="DEFAULT_CANVAS_ITEM_TEXTURE_REPEAT_MAX" value="3" enum="DefaultCanvasItemTextureRepeat"> + Max value for [enum DefaultCanvasItemTextureRepeat] enum. </constant> </constants> </class> diff --git a/doc/classes/VisibilityEnabler2D.xml b/doc/classes/VisibilityEnabler2D.xml index 0bdecafbfa..a5abf16a8d 100644 --- a/doc/classes/VisibilityEnabler2D.xml +++ b/doc/classes/VisibilityEnabler2D.xml @@ -1,11 +1,12 @@ <?xml version="1.0" encoding="UTF-8" ?> <class name="VisibilityEnabler2D" inherits="VisibilityNotifier2D" version="4.0"> <brief_description> - Enables certain nodes only when visible. + Enables certain nodes only when approximately visible. </brief_description> <description> 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. - Note that VisibilityEnabler2D will not affect nodes added after scene initialization. + [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. + [b]Note:[/b] VisibilityEnabler2D will not affect nodes added after scene initialization. </description> <tutorials> </tutorials> diff --git a/doc/classes/VisibilityEnabler3D.xml b/doc/classes/VisibilityEnabler3D.xml index 9c25c6c7c8..342a37e7a4 100644 --- a/doc/classes/VisibilityEnabler3D.xml +++ b/doc/classes/VisibilityEnabler3D.xml @@ -1,11 +1,12 @@ <?xml version="1.0" encoding="UTF-8" ?> <class name="VisibilityEnabler3D" inherits="VisibilityNotifier3D" version="4.0"> <brief_description> - Enables certain nodes only when visible. + Enables certain nodes only when approximately visible. </brief_description> <description> 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. - Note that VisibilityEnabler3D will not affect nodes added after scene initialization. + [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. + [b]Note:[/b] VisibilityEnabler3D will not affect nodes added after scene initialization. </description> <tutorials> </tutorials> diff --git a/doc/classes/VisibilityNotifier2D.xml b/doc/classes/VisibilityNotifier2D.xml index f2a4a59d77..391163ef94 100644 --- a/doc/classes/VisibilityNotifier2D.xml +++ b/doc/classes/VisibilityNotifier2D.xml @@ -1,10 +1,11 @@ <?xml version="1.0" encoding="UTF-8" ?> <class name="VisibilityNotifier2D" inherits="Node2D" version="4.0"> <brief_description> - Detects when the node is visible on screen. + Detects approximately when the node is visible on screen. </brief_description> <description> 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. + [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. </description> <tutorials> </tutorials> diff --git a/doc/classes/VisibilityNotifier3D.xml b/doc/classes/VisibilityNotifier3D.xml index d8a605c69c..eb7bb91f26 100644 --- a/doc/classes/VisibilityNotifier3D.xml +++ b/doc/classes/VisibilityNotifier3D.xml @@ -1,10 +1,11 @@ <?xml version="1.0" encoding="UTF-8" ?> <class name="VisibilityNotifier3D" inherits="Node3D" version="4.0"> <brief_description> - Detects when the node is visible on screen. + Detects approximately when the node is visible on screen. </brief_description> <description> 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. + [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. </description> <tutorials> </tutorials> diff --git a/doc/classes/ARVRAnchor.xml b/doc/classes/XRAnchor3D.xml index 82575ce7cb..a409c79230 100644 --- a/doc/classes/ARVRAnchor.xml +++ b/doc/classes/XRAnchor3D.xml @@ -1,10 +1,10 @@ <?xml version="1.0" encoding="UTF-8" ?> -<class name="ARVRAnchor" inherits="Node3D" version="4.0"> +<class name="XRAnchor3D" inherits="Node3D" version="4.0"> <brief_description> An anchor point in AR space. </brief_description> <description> - 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. + 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. 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. 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. </description> @@ -29,7 +29,7 @@ <return type="Mesh"> </return> <description> - 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. + 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. </description> </method> <method name="get_plane" qualifiers="const"> diff --git a/doc/classes/ARVRCamera.xml b/doc/classes/XRCamera3D.xml index c97d5cf1d8..4d86e24daa 100644 --- a/doc/classes/ARVRCamera.xml +++ b/doc/classes/XRCamera3D.xml @@ -1,11 +1,11 @@ <?xml version="1.0" encoding="UTF-8" ?> -<class name="ARVRCamera" inherits="Camera3D" version="4.0"> +<class name="XRCamera3D" inherits="Camera3D" version="4.0"> <brief_description> A camera node with a few overrules for AR/VR applied, such as location tracking. </brief_description> <description> 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. - 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. + 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. </description> <tutorials> <link>https://docs.godotengine.org/en/latest/tutorials/vr/index.html</link> diff --git a/doc/classes/ARVRController.xml b/doc/classes/XRController3D.xml index 572b47ce6d..e4a06a80db 100644 --- a/doc/classes/ARVRController.xml +++ b/doc/classes/XRController3D.xml @@ -1,12 +1,12 @@ <?xml version="1.0" encoding="UTF-8" ?> -<class name="ARVRController" inherits="Node3D" version="4.0"> +<class name="XRController3D" inherits="Node3D" version="4.0"> <brief_description> A spatial node representing a spatially-tracked controller. </brief_description> <description> 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. - 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. - 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. + 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. + 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. </description> <tutorials> <link>https://docs.godotengine.org/en/latest/tutorials/vr/index.html</link> @@ -20,17 +20,17 @@ </description> </method> <method name="get_hand" qualifiers="const"> - <return type="int" enum="ARVRPositionalTracker.TrackerHand"> + <return type="int" enum="XRPositionalTracker.TrackerHand"> </return> <description> - Returns the hand holding this controller, if known. See [enum ARVRPositionalTracker.TrackerHand]. + Returns the hand holding this controller, if known. See [enum XRPositionalTracker.TrackerHand]. </description> </method> <method name="get_is_active" qualifiers="const"> <return type="bool"> </return> <description> - Returns [code]true[/code] if the bound controller is active. ARVR systems attempt to track active controllers. + Returns [code]true[/code] if the bound controller is active. XR systems attempt to track active controllers. </description> </method> <method name="get_joystick_axis" qualifiers="const"> @@ -46,14 +46,14 @@ <return type="int"> </return> <description> - 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. + 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. </description> </method> <method name="get_mesh" qualifiers="const"> <return type="Mesh"> </return> <description> - If provided by the [ARVRInterface], this returns a mesh associated with the controller. This can be used to visualize the controller. + If provided by the [XRInterface], this returns a mesh associated with the controller. This can be used to visualize the controller. </description> </method> <method name="is_button_pressed" qualifiers="const"> @@ -70,11 +70,11 @@ <member name="controller_id" type="int" setter="set_controller_id" getter="get_controller_id" default="1"> The controller's ID. 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. - For any other controller that the [ARVRServer] detects, we continue with controller ID 3. + For any other controller that the [XRServer] detects, we continue with controller ID 3. 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. </member> <member name="rumble" type="float" setter="set_rumble" getter="get_rumble" default="0.0"> - 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. + 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. This is a useful property to animate if you want the controller to vibrate for a limited duration. </member> </members> diff --git a/doc/classes/ARVRInterface.xml b/doc/classes/XRInterface.xml index 0727bda668..1985010223 100644 --- a/doc/classes/ARVRInterface.xml +++ b/doc/classes/XRInterface.xml @@ -1,11 +1,11 @@ <?xml version="1.0" encoding="UTF-8" ?> -<class name="ARVRInterface" inherits="Reference" version="4.0"> +<class name="XRInterface" inherits="Reference" version="4.0"> <brief_description> Base class for an AR/VR interface implementation. </brief_description> <description> - 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. - 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]. + 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. + 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]. </description> <tutorials> <link>https://docs.godotengine.org/en/latest/tutorials/vr/index.html</link> @@ -40,7 +40,7 @@ </description> </method> <method name="get_tracking_status" qualifiers="const"> - <return type="int" enum="ARVRInterface.Tracking_status"> + <return type="int" enum="XRInterface.Tracking_status"> </return> <description> 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. @@ -84,19 +84,19 @@ </member> </members> <constants> - <constant name="ARVR_NONE" value="0" enum="Capabilities"> - No ARVR capabilities. + <constant name="XR_NONE" value="0" enum="Capabilities"> + No XR capabilities. </constant> - <constant name="ARVR_MONO" value="1" enum="Capabilities"> + <constant name="XR_MONO" value="1" enum="Capabilities"> This interface can work with normal rendering output (non-HMD based AR). </constant> - <constant name="ARVR_STEREO" value="2" enum="Capabilities"> + <constant name="XR_STEREO" value="2" enum="Capabilities"> This interface supports stereoscopic rendering. </constant> - <constant name="ARVR_AR" value="4" enum="Capabilities"> + <constant name="XR_AR" value="4" enum="Capabilities"> This interface supports AR (video background and real world tracking). </constant> - <constant name="ARVR_EXTERNAL" value="8" enum="Capabilities"> + <constant name="XR_EXTERNAL" value="8" enum="Capabilities"> 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. </constant> <constant name="EYE_MONO" value="0" enum="Eyes"> @@ -108,19 +108,19 @@ <constant name="EYE_RIGHT" value="2" enum="Eyes"> Right eye output, this is mostly used internally when rendering the image for the right eye and obtaining positioning and projection information. </constant> - <constant name="ARVR_NORMAL_TRACKING" value="0" enum="Tracking_status"> + <constant name="XR_NORMAL_TRACKING" value="0" enum="Tracking_status"> Tracking is behaving as expected. </constant> - <constant name="ARVR_EXCESSIVE_MOTION" value="1" enum="Tracking_status"> + <constant name="XR_EXCESSIVE_MOTION" value="1" enum="Tracking_status"> Tracking is hindered by excessive motion (the player is moving faster than tracking can keep up). </constant> - <constant name="ARVR_INSUFFICIENT_FEATURES" value="2" enum="Tracking_status"> + <constant name="XR_INSUFFICIENT_FEATURES" value="2" enum="Tracking_status"> Tracking is hindered by insufficient features, it's too dark (for camera-based tracking), player is blocked, etc. </constant> - <constant name="ARVR_UNKNOWN_TRACKING" value="3" enum="Tracking_status"> + <constant name="XR_UNKNOWN_TRACKING" value="3" enum="Tracking_status"> We don't know the status of the tracking or this interface does not provide feedback. </constant> - <constant name="ARVR_NOT_TRACKING" value="4" enum="Tracking_status"> + <constant name="XR_NOT_TRACKING" value="4" enum="Tracking_status"> Tracking is not functional (camera not plugged in or obscured, lighthouses turned off, etc.). </constant> </constants> diff --git a/doc/classes/ARVROrigin.xml b/doc/classes/XROrigin3D.xml index a88a89c927..57cf673d30 100644 --- a/doc/classes/ARVROrigin.xml +++ b/doc/classes/XROrigin3D.xml @@ -1,13 +1,13 @@ <?xml version="1.0" encoding="UTF-8" ?> -<class name="ARVROrigin" inherits="Node3D" version="4.0"> +<class name="XROrigin3D" inherits="Node3D" version="4.0"> <brief_description> The origin point in AR/VR. </brief_description> <description> 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. - 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. + 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. 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. - 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. + 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. </description> <tutorials> <link>https://docs.godotengine.org/en/latest/tutorials/vr/index.html</link> @@ -17,7 +17,7 @@ <members> <member name="world_scale" type="float" setter="set_world_scale" getter="get_world_scale" default="1.0"> Allows you to adjust the scale to your game's units. Most AR/VR platforms assume a scale of 1 game world unit = 1 real world meter. - [b]Note:[/b] This method is a passthrough to the [ARVRServer] itself. + [b]Note:[/b] This method is a passthrough to the [XRServer] itself. </member> </members> <constants> diff --git a/doc/classes/ARVRPositionalTracker.xml b/doc/classes/XRPositionalTracker.xml index 640b721d37..2f7cc21703 100644 --- a/doc/classes/ARVRPositionalTracker.xml +++ b/doc/classes/XRPositionalTracker.xml @@ -1,19 +1,19 @@ <?xml version="1.0" encoding="UTF-8" ?> -<class name="ARVRPositionalTracker" inherits="Object" version="4.0"> +<class name="XRPositionalTracker" inherits="Object" version="4.0"> <brief_description> A tracked object. </brief_description> <description> 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. - 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]. - 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. + 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]. + 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. </description> <tutorials> <link>https://docs.godotengine.org/en/latest/tutorials/vr/index.html</link> </tutorials> <methods> <method name="get_hand" qualifiers="const"> - <return type="int" enum="ARVRPositionalTracker.TrackerHand"> + <return type="int" enum="XRPositionalTracker.TrackerHand"> </return> <description> Returns the hand holding this tracker, if known. See [enum TrackerHand] constants. @@ -58,7 +58,7 @@ <return type="int"> </return> <description> - 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. + 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. </description> </method> <method name="get_tracks_orientation" qualifiers="const"> @@ -85,7 +85,7 @@ </description> </method> <method name="get_type" qualifiers="const"> - <return type="int" enum="ARVRServer.TrackerType"> + <return type="int" enum="XRServer.TrackerType"> </return> <description> Returns the tracker's type. diff --git a/doc/classes/ARVRServer.xml b/doc/classes/XRServer.xml index d8d069c048..5e6002aee3 100644 --- a/doc/classes/ARVRServer.xml +++ b/doc/classes/XRServer.xml @@ -1,5 +1,5 @@ <?xml version="1.0" encoding="UTF-8" ?> -<class name="ARVRServer" inherits="Object" version="4.0"> +<class name="XRServer" inherits="Object" version="4.0"> <brief_description> Server for AR and VR features. </brief_description> @@ -13,7 +13,7 @@ <method name="center_on_hmd"> <return type="void"> </return> - <argument index="0" name="rotation_mode" type="int" enum="ARVRServer.RotationMode"> + <argument index="0" name="rotation_mode" type="int" enum="XRServer.RotationMode"> </argument> <argument index="1" name="keep_height" type="bool"> </argument> @@ -27,7 +27,7 @@ </description> </method> <method name="find_interface" qualifiers="const"> - <return type="ARVRInterface"> + <return type="XRInterface"> </return> <argument index="0" name="name" type="String"> </argument> @@ -43,7 +43,7 @@ </description> </method> <method name="get_interface" qualifiers="const"> - <return type="ARVRInterface"> + <return type="XRInterface"> </return> <argument index="0" name="idx" type="int"> </argument> @@ -69,7 +69,7 @@ <return type="int"> </return> <description> - 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]. + 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]. </description> </method> <method name="get_last_frame_usec"> @@ -83,7 +83,7 @@ <return type="int"> </return> <description> - 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]. + 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]. </description> </method> <method name="get_reference_frame" qualifiers="const"> @@ -94,7 +94,7 @@ </description> </method> <method name="get_tracker" qualifiers="const"> - <return type="ARVRPositionalTracker"> + <return type="XRPositionalTracker"> </return> <argument index="0" name="idx" type="int"> </argument> @@ -111,8 +111,8 @@ </method> </methods> <members> - <member name="primary_interface" type="ARVRInterface" setter="set_primary_interface" getter="get_primary_interface"> - The primary [ARVRInterface] currently bound to the [ARVRServer]. + <member name="primary_interface" type="XRInterface" setter="set_primary_interface" getter="get_primary_interface"> + The primary [XRInterface] currently bound to the [XRServer]. </member> <member name="world_scale" type="float" setter="set_world_scale" getter="get_world_scale" default="1.0"> Allows you to adjust the scale to your game's units. Most AR/VR platforms assume a scale of 1 game world unit = 1 real world meter. @@ -141,7 +141,7 @@ <argument index="2" name="id" type="int"> </argument> <description> - 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. + 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. </description> </signal> <signal name="tracker_removed"> @@ -152,7 +152,7 @@ <argument index="2" name="id" type="int"> </argument> <description> - 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). + 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). </description> </signal> </signals> diff --git a/doc/tools/makerst.py b/doc/tools/makerst.py index 9de5eac31d..a14ef7c665 100755 --- a/doc/tools/makerst.py +++ b/doc/tools/makerst.py @@ -424,7 +424,7 @@ def make_rst_class(class_def, state, dry_run, output_dir): # type: (ClassDef, S type_rst = property_def.type_name.to_rst(state) default = property_def.default_value if property_def.overridden: - ml.append((type_rst, property_def.name, "**O:** " + default)) + ml.append((type_rst, property_def.name, default + " *(parent override)*")) else: ref = ":ref:`{0}<class_{1}_property_{0}>`".format(property_def.name, class_name) ml.append((type_rst, ref, default)) @@ -901,6 +901,12 @@ def rstize_text(text, state): # type: (str, State) -> str tag_text = "``" tag_depth += 1 inside_code = True + elif cmd == "kbd": + tag_text = ":kbd:`" + tag_depth += 1 + elif cmd == "/kbd": + tag_text = "`" + tag_depth -= 1 elif cmd.startswith("enum "): tag_text = make_enum(cmd[5:], state) escape_post = True @@ -973,11 +979,14 @@ def format_table(f, data, remove_empty_columns=False): # type: (TextIO, Iterabl f.write("\n") -def make_type(t, state): # type: (str, State) -> str - if t in state.classes: - return ":ref:`{0}<class_{0}>`".format(t) - print_error("Unresolved type '{}', file: {}".format(t, state.current_class), state) - return t +def make_type(klass, state): # type: (str, State) -> str + link_type = klass + if link_type.endswith("[]"): # Typed array, strip [] to link to contained type. + link_type = link_type[:-2] + if link_type in state.classes: + return ":ref:`{}<class_{}>`".format(klass, link_type) + print_error("Unresolved type '{}', file: {}".format(klass, state.current_class), state) + return klass def make_enum(t, state): # type: (str, State) -> str diff --git a/doc/translations/classes.pot b/doc/translations/classes.pot index 7cafa44ac1..d58b9d9472 100644 --- a/doc/translations/classes.pot +++ b/doc/translations/classes.pot @@ -119,13 +119,16 @@ msgid "" "[/codeblock]" msgstr "" -#: modules/gdscript/doc_classes/@GDScript.xml:94 +#: modules/gdscript/doc_classes/@GDScript.xml:96 msgid "" -"Asserts that the [code]condition[/code] is [code]true[/code] . If the " +"Asserts that the [code]condition[/code] is [code]true[/code]. If the " "[code]condition[/code] is [code]false[/code], an error is generated and the " "program is halted until you resume it. Only executes in debug builds, or " "when running the game from the editor. Use it for debugging purposes, to " "make sure a statement is [code]true[/code] during development.\n" +"The optional [code]message[/code] argument, if given, is shown in addition " +"to the generic \"Assertion failed\" message. You can use this to provide " +"additional details about why the assertion failed.\n" "[codeblock]\n" "# Imagine we always want speed to be between 0 and 20\n" "speed = -10\n" @@ -133,10 +136,12 @@ msgid "" "assert(speed >= 0) # False, the program will stop\n" "assert(speed >= 0 && speed < 20) # You can also combine the two conditional " "statements in one check\n" +"assert(speed < 20, \"speed = %f, but the speed limit is 20\" % speed) # Show " +"a message with clarifying details\n" "[/codeblock]" msgstr "" -#: modules/gdscript/doc_classes/@GDScript.xml:110 +#: modules/gdscript/doc_classes/@GDScript.xml:114 msgid "" "Returns the arc tangent of [code]s[/code] in radians. Use it to get the " "angle from an angle's tangent in trigonometry: [code]atan(tan(angle)) == " @@ -148,7 +153,7 @@ msgid "" "[/codeblock]" msgstr "" -#: modules/gdscript/doc_classes/@GDScript.xml:125 +#: modules/gdscript/doc_classes/@GDScript.xml:129 msgid "" "Returns the arc tangent of [code]y/x[/code] in radians. Use to get the angle " "of tangent [code]y/x[/code]. To compute the value, the method takes into " @@ -158,7 +163,7 @@ msgid "" "[/codeblock]" msgstr "" -#: modules/gdscript/doc_classes/@GDScript.xml:139 +#: modules/gdscript/doc_classes/@GDScript.xml:143 msgid "" "Decodes a byte array back to a value. When [code]allow_objects[/code] is " "[code]true[/code] decoding objects is allowed.\n" @@ -167,7 +172,7 @@ msgid "" "avoid potential security threats (remote code execution)." msgstr "" -#: modules/gdscript/doc_classes/@GDScript.xml:151 +#: modules/gdscript/doc_classes/@GDScript.xml:155 #: modules/visual_script/doc_classes/VisualScriptBuiltinFunc.xml:145 msgid "" "Converts a 2D point expressed in the cartesian coordinate system (X and Y " @@ -175,7 +180,7 @@ msgid "" "angle)." msgstr "" -#: modules/gdscript/doc_classes/@GDScript.xml:160 +#: modules/gdscript/doc_classes/@GDScript.xml:164 msgid "" "Rounds [code]s[/code] upward, returning the smallest integral value that is " "not less than [code]s[/code].\n" @@ -185,7 +190,7 @@ msgid "" "[/codeblock]" msgstr "" -#: modules/gdscript/doc_classes/@GDScript.xml:173 +#: modules/gdscript/doc_classes/@GDScript.xml:177 msgid "" "Returns a character as a String of the given Unicode code point (which is " "compatible with ASCII code).\n" @@ -197,7 +202,7 @@ msgid "" "This is the inverse of [method ord]." msgstr "" -#: modules/gdscript/doc_classes/@GDScript.xml:192 +#: modules/gdscript/doc_classes/@GDScript.xml:196 msgid "" "Clamps [code]value[/code] and returns a value not less than [code]min[/code] " "and not more than [code]max[/code].\n" @@ -212,7 +217,7 @@ msgid "" "[/codeblock]" msgstr "" -#: modules/gdscript/doc_classes/@GDScript.xml:212 +#: modules/gdscript/doc_classes/@GDScript.xml:216 msgid "" "Converts from a type to another in the best way possible. The [code]type[/" "code] parameter uses the [enum Variant.Type] values.\n" @@ -226,7 +231,7 @@ msgid "" "[/codeblock]" msgstr "" -#: modules/gdscript/doc_classes/@GDScript.xml:229 +#: modules/gdscript/doc_classes/@GDScript.xml:233 msgid "" "Returns the cosine of angle [code]s[/code] in radians.\n" "[codeblock]\n" @@ -236,7 +241,7 @@ msgid "" "[/codeblock]" msgstr "" -#: modules/gdscript/doc_classes/@GDScript.xml:243 +#: modules/gdscript/doc_classes/@GDScript.xml:247 msgid "" "Returns the hyperbolic cosine of [code]s[/code] in radians.\n" "[codeblock]\n" @@ -245,11 +250,11 @@ msgid "" "[/codeblock]" msgstr "" -#: modules/gdscript/doc_classes/@GDScript.xml:256 +#: modules/gdscript/doc_classes/@GDScript.xml:260 msgid "Converts from decibels to linear energy (audio)." msgstr "" -#: modules/gdscript/doc_classes/@GDScript.xml:269 +#: modules/gdscript/doc_classes/@GDScript.xml:273 msgid "" "Returns the result of [code]value[/code] decreased by [code]step[/code] * " "[code]amount[/code].\n" @@ -259,7 +264,7 @@ msgid "" "[/codeblock]" msgstr "" -#: modules/gdscript/doc_classes/@GDScript.xml:282 +#: modules/gdscript/doc_classes/@GDScript.xml:286 msgid "" "Returns degrees converted to radians.\n" "[codeblock]\n" @@ -268,20 +273,20 @@ msgid "" "[/codeblock]" msgstr "" -#: modules/gdscript/doc_classes/@GDScript.xml:295 +#: modules/gdscript/doc_classes/@GDScript.xml:299 msgid "" "Converts a previously converted instance to a dictionary, back into an " "instance. Useful for deserializing." msgstr "" -#: modules/gdscript/doc_classes/@GDScript.xml:306 +#: modules/gdscript/doc_classes/@GDScript.xml:310 #: modules/visual_script/doc_classes/VisualScriptBuiltinFunc.xml:90 msgid "" "Easing function, based on exponent. 0 is constant, 1 is linear, 0 to 1 is " "ease-in, 1+ is ease out. Negative values are in-out/out in." msgstr "" -#: modules/gdscript/doc_classes/@GDScript.xml:315 +#: modules/gdscript/doc_classes/@GDScript.xml:319 msgid "" "The natural exponential function. It raises the mathematical constant [b]e[/" "b] to the power of [code]s[/code] and returns it.\n" @@ -292,7 +297,7 @@ msgid "" "[/codeblock]" msgstr "" -#: modules/gdscript/doc_classes/@GDScript.xml:329 +#: modules/gdscript/doc_classes/@GDScript.xml:333 msgid "" "Rounds [code]s[/code] to the closest smaller integer and returns it.\n" "[codeblock]\n" @@ -305,7 +310,7 @@ msgid "" "use [code]int(s)[/code] directly." msgstr "" -#: modules/gdscript/doc_classes/@GDScript.xml:347 +#: modules/gdscript/doc_classes/@GDScript.xml:351 msgid "" "Returns the floating-point remainder of [code]a/b[/code], keeping the sign " "of [code]a[/code].\n" @@ -316,7 +321,7 @@ msgid "" "For the integer remainder operation, use the % operator." msgstr "" -#: modules/gdscript/doc_classes/@GDScript.xml:363 +#: modules/gdscript/doc_classes/@GDScript.xml:367 msgid "" "Returns the floating-point modulus of [code]a/b[/code] that wraps equally in " "positive and negative.\n" @@ -342,7 +347,7 @@ msgid "" "[/codeblock]" msgstr "" -#: modules/gdscript/doc_classes/@GDScript.xml:394 +#: modules/gdscript/doc_classes/@GDScript.xml:398 msgid "" "Returns a reference to the specified function [code]funcname[/code] in the " "[code]instance[/code] node. As functions aren't first-class objects in " @@ -357,7 +362,7 @@ msgid "" "[/codeblock]" msgstr "" -#: modules/gdscript/doc_classes/@GDScript.xml:408 +#: modules/gdscript/doc_classes/@GDScript.xml:412 msgid "" "Returns an array of dictionaries representing the current call stack.\n" "[codeblock]\n" @@ -377,7 +382,7 @@ msgid "" "[/codeblock]" msgstr "" -#: modules/gdscript/doc_classes/@GDScript.xml:431 +#: modules/gdscript/doc_classes/@GDScript.xml:435 msgid "" "Returns the integer hash of the variable passed.\n" "[codeblock]\n" @@ -385,7 +390,7 @@ msgid "" "[/codeblock]" msgstr "" -#: modules/gdscript/doc_classes/@GDScript.xml:443 +#: modules/gdscript/doc_classes/@GDScript.xml:447 msgid "" "Returns the passed instance converted to a dictionary (useful for " "serializing).\n" @@ -403,7 +408,7 @@ msgid "" "[/codeblock]" msgstr "" -#: modules/gdscript/doc_classes/@GDScript.xml:464 +#: modules/gdscript/doc_classes/@GDScript.xml:468 msgid "" "Returns the Object that corresponds to [code]instance_id[/code]. All Objects " "have a unique instance ID.\n" @@ -416,7 +421,7 @@ msgid "" "[/codeblock]" msgstr "" -#: modules/gdscript/doc_classes/@GDScript.xml:484 +#: modules/gdscript/doc_classes/@GDScript.xml:488 msgid "" "Returns a normalized value considering the given range. This is the opposite " "of [method lerp].\n" @@ -430,33 +435,33 @@ msgid "" "[/codeblock]" msgstr "" -#: modules/gdscript/doc_classes/@GDScript.xml:502 +#: modules/gdscript/doc_classes/@GDScript.xml:506 msgid "" "Returns [code]true[/code] if [code]a[/code] and [code]b[/code] are " "approximately equal to each other." msgstr "" -#: modules/gdscript/doc_classes/@GDScript.xml:511 +#: modules/gdscript/doc_classes/@GDScript.xml:515 msgid "" "Returns whether [code]s[/code] is an infinity value (either positive " "infinity or negative infinity)." msgstr "" -#: modules/gdscript/doc_classes/@GDScript.xml:520 +#: modules/gdscript/doc_classes/@GDScript.xml:524 msgid "" "Returns whether [code]instance[/code] is a valid object (e.g. has not been " "deleted from memory)." msgstr "" -#: modules/gdscript/doc_classes/@GDScript.xml:529 +#: modules/gdscript/doc_classes/@GDScript.xml:533 msgid "Returns whether [code]s[/code] is a NaN (Not-A-Number) value." msgstr "" -#: modules/gdscript/doc_classes/@GDScript.xml:538 +#: modules/gdscript/doc_classes/@GDScript.xml:542 msgid "Returns [code]true[/code] if [code]s[/code] is zero or almost zero." msgstr "" -#: modules/gdscript/doc_classes/@GDScript.xml:547 +#: modules/gdscript/doc_classes/@GDScript.xml:551 msgid "" "Returns length of Variant [code]var[/code]. Length is the character count of " "String, element count of Array, size of Dictionary, etc.\n" @@ -467,7 +472,7 @@ msgid "" "[/codeblock]" msgstr "" -#: modules/gdscript/doc_classes/@GDScript.xml:565 +#: modules/gdscript/doc_classes/@GDScript.xml:569 msgid "" "Linearly interpolates between two values by a normalized value. This is the " "opposite of [method inverse_lerp].\n" @@ -475,14 +480,14 @@ 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" "[/codeblock]" msgstr "" -#: modules/gdscript/doc_classes/@GDScript.xml:584 +#: modules/gdscript/doc_classes/@GDScript.xml:588 msgid "" "Linearly interpolates between two angles (in radians) by a normalized " "value.\n" @@ -499,7 +504,7 @@ msgid "" "[/codeblock]" msgstr "" -#: modules/gdscript/doc_classes/@GDScript.xml:603 +#: modules/gdscript/doc_classes/@GDScript.xml:607 msgid "" "Converts from linear energy to decibels (audio). This can be used to " "implement volume sliders that behave as expected (since volume isn't " @@ -515,7 +520,7 @@ msgid "" "[/codeblock]" msgstr "" -#: modules/gdscript/doc_classes/@GDScript.xml:618 +#: modules/gdscript/doc_classes/@GDScript.xml:622 msgid "" "Loads a resource from the filesystem located at [code]path[/code].\n" "[b]Note:[/b] Resource paths can be obtained by right-clicking on a resource " @@ -528,7 +533,7 @@ msgid "" "[code]null[/code]." msgstr "" -#: modules/gdscript/doc_classes/@GDScript.xml:633 +#: modules/gdscript/doc_classes/@GDScript.xml:637 msgid "" "Natural logarithm. The amount of time needed to reach a certain level of " "continuous growth.\n" @@ -539,7 +544,7 @@ msgid "" "[/codeblock]" msgstr "" -#: modules/gdscript/doc_classes/@GDScript.xml:648 +#: modules/gdscript/doc_classes/@GDScript.xml:652 msgid "" "Returns the maximum of two values.\n" "[codeblock]\n" @@ -548,7 +553,7 @@ msgid "" "[/codeblock]" msgstr "" -#: modules/gdscript/doc_classes/@GDScript.xml:663 +#: modules/gdscript/doc_classes/@GDScript.xml:667 msgid "" "Returns the minimum of two values.\n" "[codeblock]\n" @@ -557,7 +562,7 @@ msgid "" "[/codeblock]" msgstr "" -#: modules/gdscript/doc_classes/@GDScript.xml:680 +#: modules/gdscript/doc_classes/@GDScript.xml:684 msgid "" "Moves [code]from[/code] toward [code]to[/code] by the [code]delta[/code] " "value.\n" @@ -567,7 +572,7 @@ msgid "" "[/codeblock]" msgstr "" -#: modules/gdscript/doc_classes/@GDScript.xml:693 +#: modules/gdscript/doc_classes/@GDScript.xml:697 msgid "" "Returns the nearest larger power of 2 for integer [code]value[/code].\n" "[codeblock]\n" @@ -577,7 +582,7 @@ msgid "" "[/codeblock]" msgstr "" -#: modules/gdscript/doc_classes/@GDScript.xml:707 +#: modules/gdscript/doc_classes/@GDScript.xml:711 msgid "" "Returns an integer representing the Unicode code point of the given Unicode " "character [code]char[/code].\n" @@ -589,7 +594,7 @@ msgid "" "This is the inverse of [method char]." msgstr "" -#: modules/gdscript/doc_classes/@GDScript.xml:722 +#: modules/gdscript/doc_classes/@GDScript.xml:726 msgid "" "Parse JSON text to a Variant (use [method typeof] to check if it is what you " "expect).\n" @@ -609,7 +614,7 @@ msgid "" "[/codeblock]" msgstr "" -#: modules/gdscript/doc_classes/@GDScript.xml:742 +#: modules/gdscript/doc_classes/@GDScript.xml:746 #: modules/visual_script/doc_classes/VisualScriptBuiltinFunc.xml:142 msgid "" "Converts a 2D point expressed in the polar coordinate system (a distance " @@ -617,7 +622,7 @@ msgid "" "cartesian coordinate system (X and Y axis)." msgstr "" -#: modules/gdscript/doc_classes/@GDScript.xml:753 +#: modules/gdscript/doc_classes/@GDScript.xml:757 msgid "" "Returns the integer modulus of [code]a/b[/code] that wraps equally in " "positive and negative.\n" @@ -643,7 +648,7 @@ msgid "" "[/codeblock]" msgstr "" -#: modules/gdscript/doc_classes/@GDScript.xml:784 +#: modules/gdscript/doc_classes/@GDScript.xml:788 msgid "" "Returns the result of [code]x[/code] raised to the power of [code]y[/code].\n" "[codeblock]\n" @@ -651,7 +656,7 @@ msgid "" "[/codeblock]" msgstr "" -#: modules/gdscript/doc_classes/@GDScript.xml:796 +#: modules/gdscript/doc_classes/@GDScript.xml:800 msgid "" "Returns a resource from the filesystem that is loaded during script " "parsing.\n" @@ -663,7 +668,7 @@ msgid "" "[/codeblock]" msgstr "" -#: modules/gdscript/doc_classes/@GDScript.xml:808 +#: modules/gdscript/doc_classes/@GDScript.xml:812 msgid "" "Converts one or more arguments to strings in the best way possible and " "prints them to the console.\n" @@ -673,11 +678,11 @@ msgid "" "[/codeblock]" msgstr "" -#: modules/gdscript/doc_classes/@GDScript.xml:819 +#: modules/gdscript/doc_classes/@GDScript.xml:823 msgid "Like [method print], but prints only when used in debug mode." msgstr "" -#: modules/gdscript/doc_classes/@GDScript.xml:826 +#: modules/gdscript/doc_classes/@GDScript.xml:830 msgid "" "Prints a stack track at code location, only works when running with debugger " "turned on.\n" @@ -687,7 +692,7 @@ msgid "" "[/codeblock]" msgstr "" -#: modules/gdscript/doc_classes/@GDScript.xml:837 +#: modules/gdscript/doc_classes/@GDScript.xml:841 msgid "" "Prints one or more arguments to strings in the best way possible to standard " "error line.\n" @@ -696,7 +701,7 @@ msgid "" "[/codeblock]" msgstr "" -#: modules/gdscript/doc_classes/@GDScript.xml:847 +#: modules/gdscript/doc_classes/@GDScript.xml:851 msgid "" "Prints one or more arguments to strings in the best way possible to console. " "No newline is added at the end.\n" @@ -710,7 +715,7 @@ msgid "" "method, such as [method print]." msgstr "" -#: modules/gdscript/doc_classes/@GDScript.xml:860 +#: modules/gdscript/doc_classes/@GDScript.xml:864 msgid "" "Prints one or more arguments to the console with a space between each " "argument.\n" @@ -719,7 +724,7 @@ msgid "" "[/codeblock]" msgstr "" -#: modules/gdscript/doc_classes/@GDScript.xml:870 +#: modules/gdscript/doc_classes/@GDScript.xml:874 msgid "" "Prints one or more arguments to the console with a tab between each " "argument.\n" @@ -728,7 +733,7 @@ msgid "" "[/codeblock]" msgstr "" -#: modules/gdscript/doc_classes/@GDScript.xml:882 +#: modules/gdscript/doc_classes/@GDScript.xml:886 msgid "" "Pushes an error message to Godot's built-in debugger and to the OS " "terminal.\n" @@ -738,7 +743,7 @@ msgid "" "[/codeblock]" msgstr "" -#: modules/gdscript/doc_classes/@GDScript.xml:894 +#: modules/gdscript/doc_classes/@GDScript.xml:898 msgid "" "Pushes a warning message to Godot's built-in debugger and to the OS " "terminal.\n" @@ -748,7 +753,7 @@ msgid "" "[/codeblock]" msgstr "" -#: modules/gdscript/doc_classes/@GDScript.xml:906 +#: modules/gdscript/doc_classes/@GDScript.xml:910 msgid "" "Converts from radians to degrees.\n" "[codeblock]\n" @@ -756,7 +761,7 @@ msgid "" "[/codeblock]" msgstr "" -#: modules/gdscript/doc_classes/@GDScript.xml:920 +#: modules/gdscript/doc_classes/@GDScript.xml:924 msgid "" "Random range, any floating point value between [code]from[/code] and " "[code]to[/code].\n" @@ -765,7 +770,7 @@ msgid "" "[/codeblock]" msgstr "" -#: modules/gdscript/doc_classes/@GDScript.xml:932 +#: modules/gdscript/doc_classes/@GDScript.xml:936 msgid "" "Random from seed: pass a [code]seed[/code], and an array with both number " "and new seed is returned. \"Seed\" here refers to the internal state of the " @@ -773,7 +778,7 @@ msgid "" "implementation is 64 bits." msgstr "" -#: modules/gdscript/doc_classes/@GDScript.xml:939 +#: modules/gdscript/doc_classes/@GDScript.xml:943 msgid "" "Returns a random floating point value on the interval [code][0, 1][/code].\n" "[codeblock]\n" @@ -781,7 +786,7 @@ msgid "" "[/codeblock]" msgstr "" -#: modules/gdscript/doc_classes/@GDScript.xml:949 +#: modules/gdscript/doc_classes/@GDScript.xml:953 msgid "" "Returns a random unsigned 32 bit integer. Use remainder to obtain a random " "value in the interval [code][0, N - 1][/code] (where N is smaller than " @@ -794,7 +799,7 @@ msgid "" "[/codeblock]" msgstr "" -#: modules/gdscript/doc_classes/@GDScript.xml:962 +#: modules/gdscript/doc_classes/@GDScript.xml:966 msgid "" "Randomizes the seed (or the internal state) of the random number generator. " "Current implementation reseeds using a number based on time.\n" @@ -804,7 +809,7 @@ msgid "" "[/codeblock]" msgstr "" -#: modules/gdscript/doc_classes/@GDScript.xml:973 +#: modules/gdscript/doc_classes/@GDScript.xml:977 msgid "" "Returns an array with the given range. Range can be 1 argument N (0 to N-1), " "two arguments (initial, final-1) or three arguments (initial, final-1, " @@ -834,7 +839,7 @@ msgid "" "[/codeblock]" msgstr "" -#: modules/gdscript/doc_classes/@GDScript.xml:1013 +#: modules/gdscript/doc_classes/@GDScript.xml:1017 msgid "" "Maps a [code]value[/code] from range [code][istart, istop][/code] to [code]" "[ostart, ostop][/code].\n" @@ -843,7 +848,7 @@ msgid "" "[/codeblock]" msgstr "" -#: modules/gdscript/doc_classes/@GDScript.xml:1025 +#: modules/gdscript/doc_classes/@GDScript.xml:1029 msgid "" "Returns the integral value that is nearest to [code]s[/code], with halfway " "cases rounded away from zero.\n" @@ -852,7 +857,7 @@ msgid "" "[/codeblock]" msgstr "" -#: modules/gdscript/doc_classes/@GDScript.xml:1037 +#: modules/gdscript/doc_classes/@GDScript.xml:1041 msgid "" "Sets seed for the random number generator.\n" "[codeblock]\n" @@ -861,7 +866,7 @@ msgid "" "[/codeblock]" msgstr "" -#: modules/gdscript/doc_classes/@GDScript.xml:1050 +#: modules/gdscript/doc_classes/@GDScript.xml:1054 msgid "" "Returns the sign of [code]s[/code]: -1 or 1. Returns 0 if [code]s[/code] is " "0.\n" @@ -872,7 +877,7 @@ msgid "" "[/codeblock]" msgstr "" -#: modules/gdscript/doc_classes/@GDScript.xml:1064 +#: modules/gdscript/doc_classes/@GDScript.xml:1068 msgid "" "Returns the sine of angle [code]s[/code] in radians.\n" "[codeblock]\n" @@ -880,7 +885,7 @@ msgid "" "[/codeblock]" msgstr "" -#: modules/gdscript/doc_classes/@GDScript.xml:1076 +#: modules/gdscript/doc_classes/@GDScript.xml:1080 msgid "" "Returns the hyperbolic sine of [code]s[/code].\n" "[codeblock]\n" @@ -889,7 +894,7 @@ msgid "" "[/codeblock]" msgstr "" -#: modules/gdscript/doc_classes/@GDScript.xml:1093 +#: modules/gdscript/doc_classes/@GDScript.xml:1097 msgid "" "Returns a number smoothly interpolated between the [code]from[/code] and " "[code]to[/code], based on the [code]weight[/code]. Similar to [method lerp], " @@ -901,7 +906,7 @@ msgid "" "[/codeblock]" msgstr "" -#: modules/gdscript/doc_classes/@GDScript.xml:1107 +#: modules/gdscript/doc_classes/@GDScript.xml:1111 msgid "" "Returns the square root of [code]s[/code].\n" "[codeblock]\n" @@ -909,7 +914,7 @@ msgid "" "[/codeblock]" msgstr "" -#: modules/gdscript/doc_classes/@GDScript.xml:1119 +#: modules/gdscript/doc_classes/@GDScript.xml:1123 msgid "" "Returns the position of the first non-zero digit, after the decimal point. " "Note that the maximum return value is 10, which is a design decision in the " @@ -924,7 +929,7 @@ msgid "" "[/codeblock]" msgstr "" -#: modules/gdscript/doc_classes/@GDScript.xml:1138 +#: modules/gdscript/doc_classes/@GDScript.xml:1142 msgid "" "Snaps float value [code]s[/code] to a given [code]step[/code]. This can also " "be used to round a floating point number to an arbitrary number of " @@ -935,7 +940,7 @@ msgid "" "[/codeblock]" msgstr "" -#: modules/gdscript/doc_classes/@GDScript.xml:1149 +#: modules/gdscript/doc_classes/@GDScript.xml:1153 msgid "" "Converts one or more arguments to string in the best way possible.\n" "[codeblock]\n" @@ -946,7 +951,7 @@ msgid "" "[/codeblock]" msgstr "" -#: modules/gdscript/doc_classes/@GDScript.xml:1164 +#: modules/gdscript/doc_classes/@GDScript.xml:1168 msgid "" "Converts a formatted string that was returned by [method var2str] to the " "original value.\n" @@ -957,7 +962,7 @@ msgid "" "[/codeblock]" msgstr "" -#: modules/gdscript/doc_classes/@GDScript.xml:1178 +#: modules/gdscript/doc_classes/@GDScript.xml:1182 msgid "" "Returns the tangent of angle [code]s[/code] in radians.\n" "[codeblock]\n" @@ -965,7 +970,7 @@ msgid "" "[/codeblock]" msgstr "" -#: modules/gdscript/doc_classes/@GDScript.xml:1190 +#: modules/gdscript/doc_classes/@GDScript.xml:1194 msgid "" "Returns the hyperbolic tangent of [code]s[/code].\n" "[codeblock]\n" @@ -974,7 +979,7 @@ msgid "" "[/codeblock]" msgstr "" -#: modules/gdscript/doc_classes/@GDScript.xml:1203 +#: modules/gdscript/doc_classes/@GDScript.xml:1207 msgid "" "Converts a Variant [code]var[/code] to JSON text and return the result. " "Useful for serializing data to store or send over the network.\n" @@ -985,16 +990,16 @@ msgid "" "[/codeblock]" msgstr "" -#: modules/gdscript/doc_classes/@GDScript.xml:1217 +#: modules/gdscript/doc_classes/@GDScript.xml:1221 msgid "" "Returns whether the given class exists in [ClassDB].\n" "[codeblock]\n" -"type_exists(\"Sprite\") # Returns true\n" +"type_exists(\"Sprite2D\") # Returns true\n" "type_exists(\"Variant\") # Returns false\n" "[/codeblock]" msgstr "" -#: modules/gdscript/doc_classes/@GDScript.xml:1230 +#: modules/gdscript/doc_classes/@GDScript.xml:1234 msgid "" "Returns the internal type of the given Variant object, using the [enum " "Variant.Type] values.\n" @@ -1007,7 +1012,7 @@ msgid "" "[/codeblock]" msgstr "" -#: modules/gdscript/doc_classes/@GDScript.xml:1246 +#: modules/gdscript/doc_classes/@GDScript.xml:1250 msgid "" "Checks that [code]json[/code] is valid JSON data. Returns an empty string if " "valid, or an error message otherwise.\n" @@ -1021,14 +1026,14 @@ msgid "" "[/codeblock]" msgstr "" -#: modules/gdscript/doc_classes/@GDScript.xml:1265 +#: modules/gdscript/doc_classes/@GDScript.xml:1269 msgid "" "Encodes a variable value to a byte array. When [code]full_objects[/code] is " "[code]true[/code] encoding objects is allowed (and can potentially include " "code)." msgstr "" -#: modules/gdscript/doc_classes/@GDScript.xml:1274 +#: modules/gdscript/doc_classes/@GDScript.xml:1278 msgid "" "Converts a Variant [code]var[/code] to a formatted string that can later be " "parsed using [method str2var].\n" @@ -1045,7 +1050,7 @@ msgid "" "[/codeblock]" msgstr "" -#: modules/gdscript/doc_classes/@GDScript.xml:1294 +#: modules/gdscript/doc_classes/@GDScript.xml:1298 msgid "" "Returns a weak reference to an object.\n" "A weak reference to an object is not enough to keep the object alive: when " @@ -1055,7 +1060,7 @@ msgid "" "reference may return the object even if there are no strong references to it." msgstr "" -#: modules/gdscript/doc_classes/@GDScript.xml:1308 +#: modules/gdscript/doc_classes/@GDScript.xml:1312 msgid "" "Wraps float [code]value[/code] between [code]min[/code] and [code]max[/" "code].\n" @@ -1089,7 +1094,7 @@ msgid "" "[/codeblock]" msgstr "" -#: modules/gdscript/doc_classes/@GDScript.xml:1344 +#: modules/gdscript/doc_classes/@GDScript.xml:1348 msgid "" "Wraps integer [code]value[/code] between [code]min[/code] and [code]max[/" "code].\n" @@ -1118,7 +1123,7 @@ msgid "" "[/codeblock]" msgstr "" -#: modules/gdscript/doc_classes/@GDScript.xml:1374 +#: modules/gdscript/doc_classes/@GDScript.xml:1378 msgid "" "Stops the function execution and returns the current suspended state to the " "calling function.\n" @@ -1163,21 +1168,21 @@ msgid "" "\"idle_frame\")[/code] from the above example." msgstr "" -#: modules/gdscript/doc_classes/@GDScript.xml:1405 +#: modules/gdscript/doc_classes/@GDScript.xml:1409 msgid "" "Constant that represents how many times the diameter of a circle fits around " "its perimeter." msgstr "" -#: modules/gdscript/doc_classes/@GDScript.xml:1408 +#: modules/gdscript/doc_classes/@GDScript.xml:1412 msgid "The circle constant, the circumference of the unit circle." msgstr "" -#: modules/gdscript/doc_classes/@GDScript.xml:1411 +#: modules/gdscript/doc_classes/@GDScript.xml:1415 msgid "A positive infinity. (For negative infinity, use -INF)." msgstr "" -#: modules/gdscript/doc_classes/@GDScript.xml:1414 +#: modules/gdscript/doc_classes/@GDScript.xml:1418 msgid "" "Macro constant that expands to an expression of type float that represents a " "NaN.\n" @@ -1199,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 @@ -1223,72 +1228,67 @@ msgid "The [Geometry] singleton." msgstr "" #: doc/classes/@GlobalScope.xml:34 -msgid "" -"The [GodotSharp] singleton. Only available when using Godot's Mono build." -msgstr "" - -#: doc/classes/@GlobalScope.xml:37 msgid "The [IP] singleton." msgstr "" -#: doc/classes/@GlobalScope.xml:40 +#: doc/classes/@GlobalScope.xml:37 msgid "The [Input] singleton." msgstr "" -#: doc/classes/@GlobalScope.xml:43 +#: doc/classes/@GlobalScope.xml:40 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 -msgid "The [Navigation2DServer] singleton." +#: doc/classes/@GlobalScope.xml:57 +msgid "The [NavigationMeshGenerator] singleton." msgstr "" -#: doc/classes/@GlobalScope.xml:63 -msgid "The [NavigationMeshGenerator] singleton." +#: doc/classes/@GlobalScope.xml:60 doc/classes/@GlobalScope.xml:63 +msgid "The [NavigationServer2D] singleton." msgstr "" #: doc/classes/@GlobalScope.xml:66 -msgid "The [NavigationServer] singleton." +msgid "The [OS] singleton." msgstr "" #: doc/classes/@GlobalScope.xml:69 -msgid "The [OS] singleton." +msgid "The [Performance] singleton." msgstr "" #: doc/classes/@GlobalScope.xml:72 -msgid "The [Performance] singleton." +msgid "The [PhysicsServer2D] singleton." msgstr "" #: doc/classes/@GlobalScope.xml:75 -msgid "The [Physics2DServer] singleton." +msgid "The [PhysicsServer3D] singleton." msgstr "" #: doc/classes/@GlobalScope.xml:78 -msgid "The [PhysicsServer] singleton." +msgid "The [ProjectSettings] singleton." msgstr "" #: doc/classes/@GlobalScope.xml:81 -msgid "The [ProjectSettings] singleton." +msgid "The [RenderingServer] singleton." msgstr "" #: doc/classes/@GlobalScope.xml:84 @@ -1308,7 +1308,7 @@ msgid "The [VisualScriptEditor] singleton." msgstr "" #: doc/classes/@GlobalScope.xml:96 -msgid "The [VisualServer] singleton." +msgid "The [XRServer] singleton." msgstr "" #: doc/classes/@GlobalScope.xml:101 @@ -1393,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 @@ -3123,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 "" @@ -3632,96 +3638,96 @@ msgstr "" msgid "The text displayed by the dialog." msgstr "" -#: doc/classes/AcceptDialog.xml:75 +#: doc/classes/AcceptDialog.xml:82 msgid "Emitted when the dialog is accepted, i.e. the OK button is pressed." msgstr "" -#: doc/classes/AcceptDialog.xml:82 +#: doc/classes/AcceptDialog.xml:89 msgid "Emitted when a custom button is pressed. See [method add_button]." msgstr "" -#: doc/classes/AnimatedSprite.xml:4 +#: doc/classes/AnimatedSprite2D.xml:4 msgid "Sprite node that can use multiple textures for animation." msgstr "" -#: doc/classes/AnimatedSprite.xml:7 doc/classes/AnimatedSprite3D.xml:7 +#: doc/classes/AnimatedSprite2D.xml:7 doc/classes/AnimatedSprite3D.xml:7 msgid "" "Animations are created using a [SpriteFrames] resource, which can be " "configured in the editor via the SpriteFrames panel." msgstr "" -#: doc/classes/AnimatedSprite.xml:16 doc/classes/AnimatedSprite3D.xml:16 +#: doc/classes/AnimatedSprite2D.xml:16 doc/classes/AnimatedSprite3D.xml:16 msgid "Returns [code]true[/code] if an animation is currently being played." msgstr "" -#: doc/classes/AnimatedSprite.xml:27 +#: doc/classes/AnimatedSprite2D.xml:27 msgid "" "Plays the animation named [code]anim[/code]. If no [code]anim[/code] is " "provided, the current animation is played. If [code]backwards[/code] is " "[code]true[/code], the animation will be played in reverse." msgstr "" -#: doc/classes/AnimatedSprite.xml:34 doc/classes/AnimatedSprite3D.xml:32 +#: doc/classes/AnimatedSprite2D.xml:34 doc/classes/AnimatedSprite3D.xml:32 msgid "Stops the current animation (does not reset the frame counter)." msgstr "" -#: doc/classes/AnimatedSprite.xml:40 doc/classes/AnimatedSprite3D.xml:38 +#: doc/classes/AnimatedSprite2D.xml:40 doc/classes/AnimatedSprite3D.xml:38 msgid "" "The current animation from the [code]frames[/code] resource. If this value " "changes, the [code]frame[/code] counter is reset." msgstr "" -#: doc/classes/AnimatedSprite.xml:43 doc/classes/SpriteBase3D.xml:55 +#: doc/classes/AnimatedSprite2D.xml:43 doc/classes/SpriteBase3D.xml:55 msgid "If [code]true[/code], texture will be centered." msgstr "" -#: doc/classes/AnimatedSprite.xml:46 doc/classes/Sprite.xml:41 +#: doc/classes/AnimatedSprite2D.xml:46 doc/classes/Sprite2D.xml:41 #: doc/classes/SpriteBase3D.xml:61 doc/classes/TextureRect.xml:18 msgid "If [code]true[/code], texture is flipped horizontally." msgstr "" -#: doc/classes/AnimatedSprite.xml:49 doc/classes/Sprite.xml:44 +#: doc/classes/AnimatedSprite2D.xml:49 doc/classes/Sprite2D.xml:44 #: doc/classes/SpriteBase3D.xml:64 doc/classes/TextureRect.xml:21 msgid "If [code]true[/code], texture is flipped vertically." msgstr "" -#: doc/classes/AnimatedSprite.xml:52 doc/classes/AnimatedSprite3D.xml:41 +#: doc/classes/AnimatedSprite2D.xml:52 doc/classes/AnimatedSprite3D.xml:41 msgid "The displayed animation frame's index." msgstr "" -#: doc/classes/AnimatedSprite.xml:55 doc/classes/AnimatedSprite3D.xml:44 +#: doc/classes/AnimatedSprite2D.xml:55 doc/classes/AnimatedSprite3D.xml:44 msgid "The [SpriteFrames] resource containing the animation(s)." msgstr "" -#: doc/classes/AnimatedSprite.xml:58 doc/classes/Sprite.xml:59 +#: doc/classes/AnimatedSprite2D.xml:58 doc/classes/Sprite2D.xml:59 #: doc/classes/SpriteBase3D.xml:70 msgid "The texture's drawing offset." msgstr "" -#: doc/classes/AnimatedSprite.xml:61 doc/classes/AnimatedSprite3D.xml:47 +#: doc/classes/AnimatedSprite2D.xml:61 doc/classes/AnimatedSprite3D.xml:47 msgid "If [code]true[/code], the [member animation] is currently playing." msgstr "" -#: doc/classes/AnimatedSprite.xml:64 -msgid "Strength of the specular light effect of this [AnimatedSprite]." +#: doc/classes/AnimatedSprite2D.xml:64 +msgid "Strength of the specular light effect of this [AnimatedSprite2D]." msgstr "" -#: doc/classes/AnimatedSprite.xml:67 doc/classes/Sprite.xml:74 +#: doc/classes/AnimatedSprite2D.xml:67 doc/classes/Sprite2D.xml:74 msgid "The color of the specular light effect." msgstr "" -#: doc/classes/AnimatedSprite.xml:70 +#: doc/classes/AnimatedSprite2D.xml:70 msgid "The animation speed is multiplied by this value." msgstr "" -#: doc/classes/AnimatedSprite.xml:76 +#: doc/classes/AnimatedSprite2D.xml:76 msgid "" "Emitted when the animation is finished (when it plays the last frame). If " "the animation is looping, this signal is emitted every time the last frame " "is drawn." msgstr "" -#: doc/classes/AnimatedSprite.xml:81 doc/classes/AnimatedSprite3D.xml:53 +#: doc/classes/AnimatedSprite2D.xml:81 doc/classes/AnimatedSprite3D.xml:53 msgid "Emitted when [member frame] changed." msgstr "" @@ -3744,9 +3750,9 @@ msgstr "" msgid "" "[AnimatedTexture] is a resource format for frame-based animations, where " "multiple textures can be chained automatically with a predefined delay for " -"each frame. Unlike [AnimationPlayer] or [AnimatedSprite], it isn't a [Node], " -"but has the advantage of being usable anywhere a [Texture2D] resource can be " -"used, e.g. in a [TileSet].\n" +"each frame. Unlike [AnimationPlayer] or [AnimatedSprite2D], it isn't a " +"[Node], but has the advantage of being usable anywhere a [Texture2D] " +"resource can be used, e.g. in a [TileSet].\n" "The playback of the animation is controlled by the [member fps] property as " "well as each frame's optional delay (see [method set_frame_delay]). The " "animation loops, i.e. it will restart at frame 0 automatically after playing " @@ -3793,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 " @@ -3803,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 " @@ -3811,10 +3821,24 @@ 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 [AnimatedSprite]." +"more frames in your animation, use [AnimationPlayer] or [AnimatedSprite2D]." msgstr "" #: doc/classes/Animation.xml:4 @@ -5403,91 +5427,98 @@ msgstr "" msgid "The animations will only progress manually (see [method advance])." msgstr "" -#: doc/classes/Area.xml:4 -msgid "General-purpose area node for detection and 3D physics influence." +#: doc/classes/Area2D.xml:4 +msgid "2D area for detection and 2D physics influence." msgstr "" -#: doc/classes/Area.xml:7 +#: doc/classes/Area2D.xml:7 msgid "" -"3D area that detects [CollisionObject] nodes overlapping, entering, or " +"2D area that detects [CollisionObject2D] nodes overlapping, entering, or " "exiting. Can also alter or override local physics parameters (gravity, " "damping)." msgstr "" -#: doc/classes/Area.xml:18 -msgid "Returns an individual bit on the layer mask." +#: doc/classes/Area2D.xml:10 +msgid "" +"https://docs.godotengine.org/en/latest/tutorials/physics/using_area_2d.html" msgstr "" -#: doc/classes/Area.xml:27 modules/csg/doc_classes/CSGShape.xml:18 -#: modules/csg/doc_classes/CSGShape.xml:27 doc/classes/RayCast2D.xml:70 -#: doc/classes/SoftBody.xml:35 doc/classes/SoftBody.xml:44 -msgid "Returns an individual bit on the collision mask." +#: doc/classes/Area2D.xml:19 +msgid "" +"Returns an individual bit on the layer mask. Describes whether other areas " +"will collide with this one on the given layer." msgstr "" -#: doc/classes/Area.xml:34 +#: doc/classes/Area2D.xml:28 msgid "" -"Returns a list of intersecting [Area]s. For performance reasons (collisions " -"are all processed at the same time) this list is modified once during the " -"physics step, not immediately after objects are moved. Consider using " -"signals instead." +"Returns an individual bit on the collision mask. Describes whether this area " +"will collide with others on the given layer." msgstr "" -#: doc/classes/Area.xml:41 +#: doc/classes/Area2D.xml:35 msgid "" -"Returns a list of intersecting [PhysicsBody]s. For performance reasons " +"Returns a list of intersecting [Area2D]s. For performance reasons " "(collisions are all processed at the same time) this list is modified once " "during the physics step, not immediately after objects are moved. Consider " "using signals instead." msgstr "" -#: doc/classes/Area.xml:50 +#: doc/classes/Area2D.xml:42 msgid "" -"If [code]true[/code], the given area overlaps the Area.\n" +"Returns a list of intersecting [PhysicsBody2D]s. For performance reasons " +"(collisions are all processed at the same time) this list is modified once " +"during the physics step, not immediately after objects are moved. Consider " +"using signals instead." +msgstr "" + +#: doc/classes/Area2D.xml:51 +msgid "" +"If [code]true[/code], the given area overlaps the Area2D.\n" "[b]Note:[/b] The result of this test is not immediate after moving objects. " "For performance, list of overlaps is updated once per frame and before the " "physics step. Consider using signals instead." msgstr "" -#: doc/classes/Area.xml:60 +#: doc/classes/Area2D.xml:61 msgid "" -"If [code]true[/code], the given physics body overlaps the Area.\n" +"If [code]true[/code], the given physics body overlaps the Area2D.\n" "[b]Note:[/b] The result of this test is not immediate after moving objects. " "For performance, list of overlaps is updated once per frame and before the " "physics step. Consider using signals instead.\n" -"The [code]body[/code] argument can either be a [PhysicsBody] or a [GridMap] " -"instance (while GridMaps are not physics body themselves, they register " -"their tiles with collision shapes as a virtual physics body)." +"The [code]body[/code] argument can either be a [PhysicsBody2D] or a " +"[TileMap] instance (while TileMaps are not physics body themselves, they " +"register their tiles with collision shapes as a virtual physics body)." msgstr "" -#: doc/classes/Area.xml:73 +#: doc/classes/Area2D.xml:74 msgid "" -"Set/clear individual bits on the layer mask. This simplifies editing this " -"[Area]'s layers." +"Set/clear individual bits on the layer mask. This makes getting an area in/" +"out of only one layer easier." msgstr "" -#: doc/classes/Area.xml:84 +#: doc/classes/Area2D.xml:85 msgid "" -"Set/clear individual bits on the collision mask. This simplifies editing " -"which [Area] layers this [Area] scans." +"Set/clear individual bits on the collision mask. This makes selecting the " +"areas scanned easier." msgstr "" -#: doc/classes/Area.xml:90 doc/classes/Area2D.xml:91 +#: doc/classes/Area2D.xml:91 doc/classes/Area3D.xml:90 msgid "" "The rate at which objects stop spinning in this area. Represents the angular " "velocity lost per second. Values range from [code]0[/code] (no damping) to " "[code]1[/code] (full damping)." msgstr "" -#: doc/classes/Area.xml:93 doc/classes/Area2D.xml:94 +#: doc/classes/Area2D.xml:94 doc/classes/Area3D.xml:93 msgid "The name of the area's audio bus." msgstr "" -#: doc/classes/Area.xml:96 doc/classes/Area2D.xml:97 +#: doc/classes/Area2D.xml:97 doc/classes/Area3D.xml:96 msgid "" "If [code]true[/code], the area's audio bus overrides the default audio bus." msgstr "" -#: doc/classes/Area.xml:99 doc/classes/Area2D.xml:100 +#: doc/classes/Area2D.xml:100 doc/classes/Area3D.xml:99 msgid "" "The area's physics layer(s). Collidable objects can exist in any of 32 " "different layers. A contact is detected if object A is in any of the layers " @@ -5495,278 +5526,271 @@ msgid "" "also [member collision_mask]." msgstr "" -#: doc/classes/Area.xml:102 doc/classes/Area2D.xml:103 +#: doc/classes/Area2D.xml:103 doc/classes/Area3D.xml:102 msgid "The physics layers this area scans to determine collision detection." msgstr "" -#: doc/classes/Area.xml:105 doc/classes/Area2D.xml:106 +#: doc/classes/Area2D.xml:106 doc/classes/Area3D.xml:105 msgid "" "The area's gravity intensity (ranges from -1024 to 1024). This value " "multiplies the gravity vector. This is useful to alter the force of gravity " "without altering its direction." msgstr "" -#: doc/classes/Area.xml:108 doc/classes/Area2D.xml:109 +#: doc/classes/Area2D.xml:109 doc/classes/Area3D.xml:108 msgid "" "The falloff factor for point gravity. The greater the value, the faster " "gravity decreases with distance." msgstr "" -#: doc/classes/Area.xml:111 doc/classes/Area2D.xml:112 +#: doc/classes/Area2D.xml:112 doc/classes/Area3D.xml:111 msgid "" "If [code]true[/code], gravity is calculated from a point (set via [member " "gravity_vec]). See also [member space_override]." msgstr "" -#: doc/classes/Area.xml:114 doc/classes/Area2D.xml:115 +#: doc/classes/Area2D.xml:115 doc/classes/Area3D.xml:114 msgid "" "The area's gravity vector (not normalized). If gravity is a point (see " "[member gravity_point]), this will be the point of attraction." msgstr "" -#: doc/classes/Area.xml:117 doc/classes/Area2D.xml:118 +#: doc/classes/Area2D.xml:118 doc/classes/Area3D.xml:117 msgid "" "The rate at which objects stop moving in this area. Represents the linear " "velocity lost per second. Values range from [code]0[/code] (no damping) to " "[code]1[/code] (full damping)." msgstr "" -#: doc/classes/Area.xml:120 doc/classes/Area2D.xml:121 +#: doc/classes/Area2D.xml:121 doc/classes/Area3D.xml:120 msgid "If [code]true[/code], other monitoring areas can detect this area." msgstr "" -#: doc/classes/Area.xml:123 doc/classes/Area2D.xml:124 +#: doc/classes/Area2D.xml:124 doc/classes/Area3D.xml:123 msgid "" "If [code]true[/code], the area detects bodies or areas entering and exiting " "it." msgstr "" -#: doc/classes/Area.xml:126 doc/classes/Area2D.xml:127 +#: doc/classes/Area2D.xml:127 doc/classes/Area3D.xml:126 msgid "The area's priority. Higher priority areas are processed first." msgstr "" -#: doc/classes/Area.xml:129 -msgid "" -"The degree to which this area applies reverb to its associated audio. Ranges " -"from [code]0[/code] to [code]1[/code] with [code]0.1[/code] precision." -msgstr "" - -#: doc/classes/Area.xml:132 -msgid "If [code]true[/code], the area applies reverb to its associated audio." -msgstr "" - -#: doc/classes/Area.xml:135 -msgid "The reverb bus name to use for this area's associated audio." -msgstr "" - -#: doc/classes/Area.xml:138 -msgid "" -"The degree to which this area's reverb is a uniform effect. Ranges from " -"[code]0[/code] to [code]1[/code] with [code]0.1[/code] precision." -msgstr "" - -#: doc/classes/Area.xml:141 doc/classes/Area2D.xml:130 +#: doc/classes/Area2D.xml:130 doc/classes/Area3D.xml:141 msgid "" "Override mode for gravity and damping calculations within this area. See " "[enum SpaceOverride] for possible values." msgstr "" -#: doc/classes/Area.xml:149 doc/classes/Area2D.xml:138 +#: doc/classes/Area2D.xml:138 doc/classes/Area3D.xml:149 msgid "Emitted when another area enters." msgstr "" -#: doc/classes/Area.xml:156 doc/classes/Area2D.xml:145 +#: doc/classes/Area2D.xml:145 doc/classes/Area3D.xml:156 msgid "Emitted when another area exits." msgstr "" -#: doc/classes/Area.xml:169 +#: doc/classes/Area2D.xml:158 msgid "" -"Emitted when another area enters, reporting which areas overlapped. " +"Emitted when another area enters, reporting which shapes overlapped. " "[code]shape_owner_get_owner(shape_find_owner(shape))[/code] returns the " "parent object of the owner of the [code]shape[/code]." msgstr "" -#: doc/classes/Area.xml:182 +#: doc/classes/Area2D.xml:171 msgid "" -"Emitted when another area exits, reporting which areas were overlapping." +"Emitted when another area exits, reporting which shapes were overlapping." msgstr "" -#: doc/classes/Area.xml:189 +#: doc/classes/Area2D.xml:178 msgid "" "Emitted when a physics body enters.\n" -"The [code]body[/code] argument can either be a [PhysicsBody] or a [GridMap] " -"instance (while GridMaps are not physics body themselves, they register " -"their tiles with collision shapes as a virtual physics body)." +"The [code]body[/code] argument can either be a [PhysicsBody2D] or a " +"[TileMap] instance (while TileMaps are not physics body themselves, they " +"register their tiles with collision shapes as a virtual physics body)." msgstr "" -#: doc/classes/Area.xml:197 +#: doc/classes/Area2D.xml:186 msgid "" "Emitted when a physics body exits.\n" -"The [code]body[/code] argument can either be a [PhysicsBody] or a [GridMap] " -"instance (while GridMaps are not physics body themselves, they register " -"their tiles with collision shapes as a virtual physics body)." +"The [code]body[/code] argument can either be a [PhysicsBody2D] or a " +"[TileMap] instance (while TileMaps are not physics body themselves, they " +"register their tiles with collision shapes as a virtual physics body)." msgstr "" -#: doc/classes/Area.xml:211 +#: doc/classes/Area2D.xml:200 msgid "" "Emitted when a physics body enters, reporting which shapes overlapped.\n" -"The [code]body[/code] argument can either be a [PhysicsBody] or a [GridMap] " -"instance (while GridMaps are not physics body themselves, they register " -"their tiles with collision shapes as a virtual physics body)." +"The [code]body[/code] argument can either be a [PhysicsBody2D] or a " +"[TileMap] instance (while TileMaps are not physics body themselves, they " +"register their tiles with collision shapes as a virtual physics body)." msgstr "" -#: doc/classes/Area.xml:225 +#: doc/classes/Area2D.xml:214 msgid "" "Emitted when a physics body exits, reporting which shapes were overlapping.\n" -"The [code]body[/code] argument can either be a [PhysicsBody] or a [GridMap] " -"instance (while GridMaps are not physics body themselves, they register " -"their tiles with collision shapes as a virtual physics body)." +"The [code]body[/code] argument can either be a [PhysicsBody2D] or a " +"[TileMap] instance (while TileMaps are not physics body themselves, they " +"register their tiles with collision shapes as a virtual physics body)." msgstr "" -#: doc/classes/Area.xml:232 doc/classes/Area2D.xml:221 +#: doc/classes/Area2D.xml:221 doc/classes/Area3D.xml:232 msgid "This area does not affect gravity/damping." msgstr "" -#: doc/classes/Area.xml:235 doc/classes/Area2D.xml:224 +#: doc/classes/Area2D.xml:224 doc/classes/Area3D.xml:235 msgid "" "This area adds its gravity/damping values to whatever has been calculated so " "far (in [member priority] order)." msgstr "" -#: doc/classes/Area.xml:238 doc/classes/Area2D.xml:227 +#: doc/classes/Area2D.xml:227 doc/classes/Area3D.xml:238 msgid "" "This area adds its gravity/damping values to whatever has been calculated so " "far (in [member priority] order), ignoring any lower priority areas." msgstr "" -#: doc/classes/Area.xml:241 doc/classes/Area2D.xml:230 +#: doc/classes/Area2D.xml:230 doc/classes/Area3D.xml:241 msgid "" "This area replaces any gravity/damping, even the defaults, ignoring any " "lower priority areas." msgstr "" -#: doc/classes/Area.xml:244 doc/classes/Area2D.xml:233 +#: doc/classes/Area2D.xml:233 doc/classes/Area3D.xml:244 msgid "" "This area replaces any gravity/damping calculated so far (in [member " "priority] order), but keeps calculating the rest of the areas." msgstr "" -#: doc/classes/Area2D.xml:4 -msgid "2D area for detection and 2D physics influence." +#: doc/classes/Area3D.xml:4 +msgid "General-purpose area node for detection and 3D physics influence." msgstr "" -#: doc/classes/Area2D.xml:7 +#: doc/classes/Area3D.xml:7 msgid "" -"2D area that detects [CollisionObject2D] nodes overlapping, entering, or " +"3D area that detects [CollisionObject3D] nodes overlapping, entering, or " "exiting. Can also alter or override local physics parameters (gravity, " "damping)." msgstr "" -#: doc/classes/Area2D.xml:10 -msgid "" -"https://docs.godotengine.org/en/latest/tutorials/physics/using_area_2d.html" -msgstr "" - -#: doc/classes/Area2D.xml:19 -msgid "" -"Returns an individual bit on the layer mask. Describes whether other areas " -"will collide with this one on the given layer." +#: doc/classes/Area3D.xml:18 +msgid "Returns an individual bit on the layer mask." msgstr "" -#: doc/classes/Area2D.xml:28 -msgid "" -"Returns an individual bit on the collision mask. Describes whether this area " -"will collide with others on the given layer." +#: doc/classes/Area3D.xml:27 modules/csg/doc_classes/CSGShape3D.xml:18 +#: modules/csg/doc_classes/CSGShape3D.xml:27 doc/classes/RayCast2D.xml:70 +#: doc/classes/SoftBody3D.xml:35 doc/classes/SoftBody3D.xml:44 +msgid "Returns an individual bit on the collision mask." msgstr "" -#: doc/classes/Area2D.xml:35 +#: doc/classes/Area3D.xml:34 msgid "" -"Returns a list of intersecting [Area2D]s. For performance reasons " +"Returns a list of intersecting [Area3D]s. For performance reasons " "(collisions are all processed at the same time) this list is modified once " "during the physics step, not immediately after objects are moved. Consider " "using signals instead." msgstr "" -#: doc/classes/Area2D.xml:42 +#: doc/classes/Area3D.xml:41 msgid "" -"Returns a list of intersecting [PhysicsBody2D]s. For performance reasons " +"Returns a list of intersecting [PhysicsBody3D]s. For performance reasons " "(collisions are all processed at the same time) this list is modified once " "during the physics step, not immediately after objects are moved. Consider " "using signals instead." msgstr "" -#: doc/classes/Area2D.xml:51 +#: doc/classes/Area3D.xml:50 msgid "" -"If [code]true[/code], the given area overlaps the Area2D.\n" +"If [code]true[/code], the given area overlaps the Area3D.\n" "[b]Note:[/b] The result of this test is not immediate after moving objects. " "For performance, list of overlaps is updated once per frame and before the " "physics step. Consider using signals instead." msgstr "" -#: doc/classes/Area2D.xml:61 +#: doc/classes/Area3D.xml:60 msgid "" -"If [code]true[/code], the given physics body overlaps the Area2D.\n" +"If [code]true[/code], the given physics body overlaps the Area3D.\n" "[b]Note:[/b] The result of this test is not immediate after moving objects. " "For performance, list of overlaps is updated once per frame and before the " "physics step. Consider using signals instead.\n" -"The [code]body[/code] argument can either be a [PhysicsBody2D] or a " -"[TileMap] instance (while TileMaps are not physics body themselves, they " +"The [code]body[/code] argument can either be a [PhysicsBody3D] or a " +"[GridMap] instance (while GridMaps are not physics body themselves, they " "register their tiles with collision shapes as a virtual physics body)." msgstr "" -#: doc/classes/Area2D.xml:74 +#: doc/classes/Area3D.xml:73 msgid "" -"Set/clear individual bits on the layer mask. This makes getting an area in/" -"out of only one layer easier." +"Set/clear individual bits on the layer mask. This simplifies editing this " +"[Area3D]'s layers." msgstr "" -#: doc/classes/Area2D.xml:85 +#: doc/classes/Area3D.xml:84 msgid "" -"Set/clear individual bits on the collision mask. This makes selecting the " -"areas scanned easier." +"Set/clear individual bits on the collision mask. This simplifies editing " +"which [Area3D] layers this [Area3D] scans." msgstr "" -#: doc/classes/Area2D.xml:158 +#: doc/classes/Area3D.xml:129 msgid "" -"Emitted when another area enters, reporting which shapes overlapped. " +"The degree to which this area applies reverb to its associated audio. Ranges " +"from [code]0[/code] to [code]1[/code] with [code]0.1[/code] precision." +msgstr "" + +#: doc/classes/Area3D.xml:132 +msgid "If [code]true[/code], the area applies reverb to its associated audio." +msgstr "" + +#: doc/classes/Area3D.xml:135 +msgid "The reverb bus name to use for this area's associated audio." +msgstr "" + +#: doc/classes/Area3D.xml:138 +msgid "" +"The degree to which this area's reverb is a uniform effect. Ranges from " +"[code]0[/code] to [code]1[/code] with [code]0.1[/code] precision." +msgstr "" + +#: doc/classes/Area3D.xml:169 +msgid "" +"Emitted when another area enters, reporting which areas overlapped. " "[code]shape_owner_get_owner(shape_find_owner(shape))[/code] returns the " "parent object of the owner of the [code]shape[/code]." msgstr "" -#: doc/classes/Area2D.xml:171 +#: doc/classes/Area3D.xml:182 msgid "" -"Emitted when another area exits, reporting which shapes were overlapping." +"Emitted when another area exits, reporting which areas were overlapping." msgstr "" -#: doc/classes/Area2D.xml:178 +#: doc/classes/Area3D.xml:189 msgid "" "Emitted when a physics body enters.\n" -"The [code]body[/code] argument can either be a [PhysicsBody2D] or a " -"[TileMap] instance (while TileMaps are not physics body themselves, they " +"The [code]body[/code] argument can either be a [PhysicsBody3D] or a " +"[GridMap] instance (while GridMaps are not physics body themselves, they " "register their tiles with collision shapes as a virtual physics body)." msgstr "" -#: doc/classes/Area2D.xml:186 +#: doc/classes/Area3D.xml:197 msgid "" "Emitted when a physics body exits.\n" -"The [code]body[/code] argument can either be a [PhysicsBody2D] or a " -"[TileMap] instance (while TileMaps are not physics body themselves, they " +"The [code]body[/code] argument can either be a [PhysicsBody3D] or a " +"[GridMap] instance (while GridMaps are not physics body themselves, they " "register their tiles with collision shapes as a virtual physics body)." msgstr "" -#: doc/classes/Area2D.xml:200 +#: doc/classes/Area3D.xml:211 msgid "" "Emitted when a physics body enters, reporting which shapes overlapped.\n" -"The [code]body[/code] argument can either be a [PhysicsBody2D] or a " -"[TileMap] instance (while TileMaps are not physics body themselves, they " +"The [code]body[/code] argument can either be a [PhysicsBody3D] or a " +"[GridMap] instance (while GridMaps are not physics body themselves, they " "register their tiles with collision shapes as a virtual physics body)." msgstr "" -#: doc/classes/Area2D.xml:214 +#: doc/classes/Area3D.xml:225 msgid "" "Emitted when a physics body exits, reporting which shapes were overlapping.\n" -"The [code]body[/code] argument can either be a [PhysicsBody2D] or a " -"[TileMap] instance (while TileMaps are not physics body themselves, they " +"The [code]body[/code] argument can either be a [PhysicsBody3D] or a " +"[GridMap] instance (while GridMaps are not physics body themselves, they " "register their tiles with collision shapes as a virtual physics body)." msgstr "" @@ -6088,25 +6112,30 @@ msgid "" "arrays[ArrayMesh.ARRAY_VERTEX] = vertices\n" "# Create the Mesh.\n" "arr_mesh.add_surface_from_arrays(Mesh.PRIMITIVE_TRIANGLES, arrays)\n" -"var m = MeshInstance.new()\n" +"var m = MeshInstance3D.new()\n" "m.mesh = arr_mesh\n" "[/codeblock]\n" -"The [MeshInstance] 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 " @@ -6124,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 " @@ -6272,709 +6299,47 @@ msgid "" "the start and end of each line." msgstr "" -#: doc/classes/ArrayMesh.xml:234 doc/classes/Mesh.xml:210 -#: doc/classes/VisualServer.xml:3189 +#: 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 [VisualServer]. 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 " @@ -8376,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 @@ -8621,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 @@ -8658,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 "" @@ -8687,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 "" @@ -8780,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." @@ -8977,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 " @@ -8989,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 " @@ -9019,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 " @@ -9062,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 " @@ -9167,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" @@ -9176,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 " @@ -9191,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 " @@ -9213,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 " @@ -9307,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:310 +#: 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:313 +#: 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:316 +#: doc/classes/BaseMaterial3D.xml:341 msgid "Filter flags for the texture. See [enum TextureFilter] for options." msgstr "" -#: doc/classes/BaseMaterial3D.xml:319 +#: doc/classes/BaseMaterial3D.xml:344 msgid "Repeat flags for the texture. See [enum TextureFilter] for options." msgstr "" -#: doc/classes/BaseMaterial3D.xml:322 -msgid "" -"The color used by the transmission effect. Represents the light passing " -"through an object." -msgstr "" - -#: doc/classes/BaseMaterial3D.xml:325 -msgid "If [code]true[/code], the transmission effect is enabled." -msgstr "" - -#: doc/classes/BaseMaterial3D.xml:328 -msgid "" -"Texture used to control the transmission effect per-pixel. Added to [member " -"transmission]." -msgstr "" - -#: doc/classes/BaseMaterial3D.xml:331 +#: 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:334 +#: 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:338 +#: 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:341 +#: 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:344 +#: 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 " @@ -9391,32 +8787,32 @@ msgid "" "when you are trying to achieve crisp texturing." msgstr "" -#: doc/classes/BaseMaterial3D.xml:347 doc/classes/BaseMaterial3D.xml:362 +#: 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:350 +#: 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:353 +#: 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:356 +#: 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:359 +#: 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 " @@ -9430,414 +8826,489 @@ msgid "" "when you are trying to achieve crisp texturing." msgstr "" -#: doc/classes/BaseMaterial3D.xml:365 +#: 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:368 +#: 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:371 +#: doc/classes/BaseMaterial3D.xml:387 msgid "If [code]true[/code], the vertex color is used as albedo color." msgstr "" -#: doc/classes/BaseMaterial3D.xml:376 +#: doc/classes/BaseMaterial3D.xml:392 msgid "Texture specifying per-pixel color." msgstr "" -#: doc/classes/BaseMaterial3D.xml:379 +#: doc/classes/BaseMaterial3D.xml:395 msgid "Texture specifying per-pixel metallic value." msgstr "" -#: doc/classes/BaseMaterial3D.xml:382 +#: doc/classes/BaseMaterial3D.xml:398 msgid "Texture specifying per-pixel roughness value." msgstr "" -#: doc/classes/BaseMaterial3D.xml:385 +#: doc/classes/BaseMaterial3D.xml:401 msgid "Texture specifying per-pixel emission color." msgstr "" -#: doc/classes/BaseMaterial3D.xml:388 +#: doc/classes/BaseMaterial3D.xml:404 msgid "Texture specifying per-pixel normal vector." msgstr "" -#: doc/classes/BaseMaterial3D.xml:391 +#: doc/classes/BaseMaterial3D.xml:407 msgid "Texture specifying per-pixel rim value." msgstr "" -#: doc/classes/BaseMaterial3D.xml:394 +#: doc/classes/BaseMaterial3D.xml:410 msgid "Texture specifying per-pixel clearcoat value." msgstr "" -#: doc/classes/BaseMaterial3D.xml:397 +#: doc/classes/BaseMaterial3D.xml:413 msgid "" "Texture specifying per-pixel flowmap direction for use with [member " "anisotropy]." msgstr "" -#: doc/classes/BaseMaterial3D.xml:400 +#: doc/classes/BaseMaterial3D.xml:416 msgid "Texture specifying per-pixel ambient occlusion value." msgstr "" -#: doc/classes/BaseMaterial3D.xml:403 +#: doc/classes/BaseMaterial3D.xml:419 msgid "Texture specifying per-pixel height." msgstr "" -#: doc/classes/BaseMaterial3D.xml:406 +#: doc/classes/BaseMaterial3D.xml:422 msgid "Texture specifying per-pixel subsurface scattering." msgstr "" -#: doc/classes/BaseMaterial3D.xml:409 -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:412 +#: doc/classes/BaseMaterial3D.xml:431 msgid "Texture specifying per-pixel refraction strength." msgstr "" -#: doc/classes/BaseMaterial3D.xml:415 +#: doc/classes/BaseMaterial3D.xml:434 msgid "Texture specifying per-pixel detail mask blending value." msgstr "" -#: doc/classes/BaseMaterial3D.xml:418 +#: doc/classes/BaseMaterial3D.xml:437 msgid "Texture specifying per-pixel detail color." msgstr "" -#: doc/classes/BaseMaterial3D.xml:421 +#: doc/classes/BaseMaterial3D.xml:440 msgid "Texture specifying per-pixel detail normal." msgstr "" -#: doc/classes/BaseMaterial3D.xml:426 +#: 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:429 +#: 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:432 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:443 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:446 +#: doc/classes/BaseMaterial3D.xml:470 msgid "Use [code]UV[/code] with the detail texture." msgstr "" -#: doc/classes/BaseMaterial3D.xml:449 +#: doc/classes/BaseMaterial3D.xml:473 msgid "Use [code]UV2[/code] with the detail texture." msgstr "" -#: doc/classes/BaseMaterial3D.xml:452 +#: doc/classes/BaseMaterial3D.xml:476 msgid "The material will not use transparency." msgstr "" -#: doc/classes/BaseMaterial3D.xml:455 +#: doc/classes/BaseMaterial3D.xml:479 msgid "The material will use the texture's alpha values for transparency." msgstr "" -#: doc/classes/BaseMaterial3D.xml:462 +#: 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:465 +#: doc/classes/BaseMaterial3D.xml:491 msgid "The object will not receive shadows." msgstr "" -#: doc/classes/BaseMaterial3D.xml:468 +#: doc/classes/BaseMaterial3D.xml:494 msgid "" "The object will be shaded per pixel. Useful for realistic shading effect." msgstr "" -#: doc/classes/BaseMaterial3D.xml:471 +#: 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:474 +#: doc/classes/BaseMaterial3D.xml:500 msgid "Represents the size of the [enum ShadingMode] enum." msgstr "" -#: doc/classes/BaseMaterial3D.xml:477 +#: doc/classes/BaseMaterial3D.xml:503 msgid "Constant for setting [member emission_enabled]." msgstr "" -#: doc/classes/BaseMaterial3D.xml:480 +#: doc/classes/BaseMaterial3D.xml:506 msgid "Constant for setting [member normal_enabled]." msgstr "" -#: doc/classes/BaseMaterial3D.xml:483 +#: doc/classes/BaseMaterial3D.xml:509 msgid "Constant for setting [member rim_enabled]." msgstr "" -#: doc/classes/BaseMaterial3D.xml:486 +#: doc/classes/BaseMaterial3D.xml:512 msgid "Constant for setting [member clearcoat_enabled]." msgstr "" -#: doc/classes/BaseMaterial3D.xml:489 +#: doc/classes/BaseMaterial3D.xml:515 msgid "Constant for setting [member anisotropy_enabled]." msgstr "" -#: doc/classes/BaseMaterial3D.xml:492 +#: doc/classes/BaseMaterial3D.xml:518 msgid "Constant for setting [member ao_enabled]." msgstr "" -#: doc/classes/BaseMaterial3D.xml:497 +#: 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:500 -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:503 +#: 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:506 +#: doc/classes/BaseMaterial3D.xml:536 msgid "Constant for setting [member detail_enabled]." msgstr "" -#: doc/classes/BaseMaterial3D.xml:509 doc/classes/EditorFeatureProfile.xml:127 +#: doc/classes/BaseMaterial3D.xml:539 doc/classes/EditorFeatureProfile.xml:148 msgid "Represents the size of the [enum Feature] enum." msgstr "" -#: doc/classes/BaseMaterial3D.xml:512 +#: 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:515 +#: doc/classes/BaseMaterial3D.xml:545 msgid "The color of the object is added to the background." msgstr "" -#: doc/classes/BaseMaterial3D.xml:518 +#: doc/classes/BaseMaterial3D.xml:548 msgid "The color of the object is subtracted from the background." msgstr "" -#: doc/classes/BaseMaterial3D.xml:521 +#: doc/classes/BaseMaterial3D.xml:551 msgid "The color of the object is multiplied by the background." msgstr "" -#: doc/classes/BaseMaterial3D.xml:524 +#: doc/classes/BaseMaterial3D.xml:554 msgid "Default depth draw mode. Depth is drawn only for opaque objects." msgstr "" -#: doc/classes/BaseMaterial3D.xml:527 +#: doc/classes/BaseMaterial3D.xml:557 msgid "Depth draw is calculated for both opaque and transparent objects." msgstr "" -#: doc/classes/BaseMaterial3D.xml:530 +#: doc/classes/BaseMaterial3D.xml:560 msgid "No depth draw." msgstr "" -#: doc/classes/BaseMaterial3D.xml:533 +#: doc/classes/BaseMaterial3D.xml:563 msgid "Default cull mode. The back of the object is culled when not visible." msgstr "" -#: doc/classes/BaseMaterial3D.xml:536 +#: doc/classes/BaseMaterial3D.xml:566 msgid "The front of the object is culled when not visible." msgstr "" -#: doc/classes/BaseMaterial3D.xml:539 +#: doc/classes/BaseMaterial3D.xml:569 msgid "No culling is performed." msgstr "" -#: doc/classes/BaseMaterial3D.xml:542 +#: 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:545 +#: doc/classes/BaseMaterial3D.xml:575 msgid "Set [code]ALBEDO[/code] to the per-vertex color specified in the mesh." msgstr "" -#: doc/classes/BaseMaterial3D.xml:548 +#: 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:551 +#: 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:554 +#: 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:557 +#: 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:560 doc/classes/BaseMaterial3D.xml:566 +#: 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:563 doc/classes/BaseMaterial3D.xml:569 +#: 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:572 +#: doc/classes/BaseMaterial3D.xml:602 msgid "" "Use [code]UV2[/code] coordinates to look up from the [member ao_texture]." msgstr "" -#: doc/classes/BaseMaterial3D.xml:575 +#: doc/classes/BaseMaterial3D.xml:605 msgid "" "Use [code]UV2[/code] coordinates to look up from the [member " "emission_texture]." msgstr "" -#: doc/classes/BaseMaterial3D.xml:578 +#: doc/classes/BaseMaterial3D.xml:608 msgid "Forces the shader to convert albedo from sRGB space to linear space." msgstr "" -#: doc/classes/BaseMaterial3D.xml:581 +#: doc/classes/BaseMaterial3D.xml:611 msgid "Disables receiving shadows from other objects." msgstr "" -#: doc/classes/BaseMaterial3D.xml:584 +#: doc/classes/BaseMaterial3D.xml:614 msgid "Disables receiving ambient light." msgstr "" -#: doc/classes/BaseMaterial3D.xml:587 +#: doc/classes/BaseMaterial3D.xml:617 msgid "Enables the shadow to opacity feature." msgstr "" -#: doc/classes/BaseMaterial3D.xml:592 +#: 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:595 doc/classes/CPUParticles.xml:364 -#: doc/classes/CPUParticles2D.xml:355 doc/classes/GeometryInstance.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:598 +#: doc/classes/BaseMaterial3D.xml:632 msgid "Default diffuse scattering algorithm." msgstr "" -#: doc/classes/BaseMaterial3D.xml:601 +#: doc/classes/BaseMaterial3D.xml:635 msgid "Diffuse scattering ignores roughness." msgstr "" -#: doc/classes/BaseMaterial3D.xml:604 +#: doc/classes/BaseMaterial3D.xml:638 msgid "Extends Lambert to cover more than 90 degrees when roughness increases." msgstr "" -#: doc/classes/BaseMaterial3D.xml:607 +#: doc/classes/BaseMaterial3D.xml:641 msgid "Attempts to use roughness to emulate microsurfacing." msgstr "" -#: doc/classes/BaseMaterial3D.xml:610 +#: doc/classes/BaseMaterial3D.xml:644 msgid "Uses a hard cut for lighting, with smoothing affected by roughness." msgstr "" -#: doc/classes/BaseMaterial3D.xml:613 +#: doc/classes/BaseMaterial3D.xml:647 msgid "Default specular blob." msgstr "" -#: doc/classes/BaseMaterial3D.xml:616 doc/classes/BaseMaterial3D.xml:619 +#: doc/classes/BaseMaterial3D.xml:650 doc/classes/BaseMaterial3D.xml:653 msgid "Older specular algorithm, included for compatibility." msgstr "" -#: doc/classes/BaseMaterial3D.xml:622 +#: doc/classes/BaseMaterial3D.xml:656 msgid "Toon blob which changes size based on roughness." msgstr "" -#: doc/classes/BaseMaterial3D.xml:625 +#: doc/classes/BaseMaterial3D.xml:659 msgid "No specular blob." msgstr "" -#: doc/classes/BaseMaterial3D.xml:628 +#: doc/classes/BaseMaterial3D.xml:662 msgid "Billboard mode is disabled." msgstr "" -#: doc/classes/BaseMaterial3D.xml:631 +#: doc/classes/BaseMaterial3D.xml:665 msgid "The object's Z axis will always face the camera." msgstr "" -#: doc/classes/BaseMaterial3D.xml:634 +#: doc/classes/BaseMaterial3D.xml:668 msgid "The object's X axis will always face the camera." msgstr "" -#: doc/classes/BaseMaterial3D.xml:637 +#: doc/classes/BaseMaterial3D.xml:671 msgid "" -"Used for particle systems when assigned to [Particles] and [CPUParticles] " -"nodes. Enables [code]particles_anim_*[/code] properties.\n" -"The [member ParticlesMaterial.anim_speed] or [member CPUParticles." +"Used for particle systems when assigned to [GPUParticles3D] and " +"[CPUParticles3D] nodes. Enables [code]particles_anim_*[/code] properties.\n" +"The [member ParticlesMaterial.anim_speed] or [member CPUParticles3D." "anim_speed] should also be set to a positive value for the animation to play." msgstr "" -#: doc/classes/BaseMaterial3D.xml:641 +#: doc/classes/BaseMaterial3D.xml:675 msgid "Used to read from the red channel of a texture." msgstr "" -#: doc/classes/BaseMaterial3D.xml:644 +#: doc/classes/BaseMaterial3D.xml:678 msgid "Used to read from the green channel of a texture." msgstr "" -#: doc/classes/BaseMaterial3D.xml:647 +#: doc/classes/BaseMaterial3D.xml:681 msgid "Used to read from the blue channel of a texture." msgstr "" -#: doc/classes/BaseMaterial3D.xml:650 +#: doc/classes/BaseMaterial3D.xml:684 msgid "Used to read from the alpha channel of a texture." msgstr "" -#: doc/classes/BaseMaterial3D.xml:653 +#: doc/classes/BaseMaterial3D.xml:687 msgid "Currently unused." msgstr "" -#: doc/classes/BaseMaterial3D.xml:656 +#: doc/classes/BaseMaterial3D.xml:690 msgid "Adds the emission color to the color from the emission texture." msgstr "" -#: doc/classes/BaseMaterial3D.xml:659 +#: doc/classes/BaseMaterial3D.xml:693 msgid "Multiplies the emission color by the color from the emission texture." msgstr "" -#: doc/classes/BaseMaterial3D.xml:662 +#: doc/classes/BaseMaterial3D.xml:696 msgid "Do not use distance fade." msgstr "" -#: doc/classes/BaseMaterial3D.xml:665 +#: 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:668 +#: 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 " @@ -9845,7 +9316,7 @@ msgid "" "faster than [constant DISTANCE_FADE_PIXEL_ALPHA]." msgstr "" -#: doc/classes/BaseMaterial3D.xml:671 +#: 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 " @@ -10190,18 +9661,18 @@ msgid "" "value using [method apply_rest]." msgstr "" -#: doc/classes/BoneAttachment.xml:4 +#: doc/classes/BoneAttachment3D.xml:4 msgid "A node that will attach to a bone." msgstr "" -#: doc/classes/BoneAttachment.xml:7 +#: doc/classes/BoneAttachment3D.xml:7 msgid "" -"This node must be the child of a [Skeleton] node. You can then select a bone " -"for this node to attach to. The BoneAttachment node will copy the transform " -"of the selected bone." +"This node must be the child of a [Skeleton3D] node. You can then select a " +"bone for this node to attach to. The BoneAttachment3D node will copy the " +"transform of the selected bone." msgstr "" -#: doc/classes/BoneAttachment.xml:15 +#: doc/classes/BoneAttachment3D.xml:15 msgid "The name of the attached bone." msgstr "" @@ -10316,15 +9787,15 @@ msgstr "" msgid "Aligns children with the end of the container." msgstr "" -#: doc/classes/BoxShape.xml:4 +#: doc/classes/BoxShape3D.xml:4 msgid "Box shape resource." msgstr "" -#: doc/classes/BoxShape.xml:7 -msgid "3D box shape that can be a child of a [PhysicsBody] or [Area]." +#: doc/classes/BoxShape3D.xml:7 +msgid "3D box shape that can be a child of a [PhysicsBody3D] or [Area3D]." msgstr "" -#: doc/classes/BoxShape.xml:15 +#: doc/classes/BoxShape3D.xml:15 msgid "" "The box's half extents. The width, height and depth of this shape is twice " "the half extents." @@ -10508,13 +9979,260 @@ msgid "" "get_instance_id])." msgstr "" -#: doc/classes/Camera.xml:4 +#: doc/classes/Camera2D.xml:4 +msgid "Camera node for 2D scenes." +msgstr "" + +#: doc/classes/Camera2D.xml:7 +msgid "" +"Camera node for 2D scenes. It forces the screen (current layer) to scroll " +"following this node. This makes it easier (and faster) to program scrollable " +"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, 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:18 +msgid "Aligns the camera to the tracked node." +msgstr "" + +#: doc/classes/Camera2D.xml:25 +msgid "" +"Removes any [Camera2D] from the ancestor [Viewport]'s internal currently-" +"assigned camera." +msgstr "" + +#: doc/classes/Camera2D.xml:32 +msgid "Forces the camera to update scroll immediately." +msgstr "" + +#: doc/classes/Camera2D.xml:39 +msgid "Returns the camera position." +msgstr "" + +#: doc/classes/Camera2D.xml:46 +msgid "" +"Returns the location of the [Camera2D]'s screen-center, relative to the " +"origin." +msgstr "" + +#: 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: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: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: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: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: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:107 +msgid "The Camera2D's anchor point. See [enum AnchorMode] constants." +msgstr "" + +#: 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: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: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: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: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: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: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: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:134 +msgid "" +"If [code]true[/code], draws the camera's drag margin rectangle in the editor." +msgstr "" + +#: doc/classes/Camera2D.xml:137 +msgid "" +"If [code]true[/code], draws the camera's limits rectangle in the editor." +msgstr "" + +#: doc/classes/Camera2D.xml:140 +msgid "" +"If [code]true[/code], draws the camera's screen rectangle in the editor." +msgstr "" + +#: doc/classes/Camera2D.xml:143 +msgid "" +"Bottom scroll limit in pixels. The camera stops moving when reaching this " +"value." +msgstr "" + +#: doc/classes/Camera2D.xml:146 +msgid "" +"Left scroll limit in pixels. The camera stops moving when reaching this " +"value." +msgstr "" + +#: doc/classes/Camera2D.xml:149 +msgid "" +"Right scroll limit in pixels. The camera stops moving when reaching this " +"value." +msgstr "" + +#: doc/classes/Camera2D.xml:152 +msgid "" +"If [code]true[/code], the camera smoothly stops when reaches its limits." +msgstr "" + +#: doc/classes/Camera2D.xml:155 +msgid "" +"Top scroll limit in pixels. The camera stops moving when reaching this value." +msgstr "" + +#: doc/classes/Camera2D.xml:158 +msgid "" +"The camera's offset, useful for looking around or camera shake animations." +msgstr "" + +#: 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 " +"not updated in any way if drag margins are enabled and can be used to set " +"initial offset." +msgstr "" + +#: 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:169 +msgid "The camera's process callback. See [enum Camera2DProcessMode]." +msgstr "" + +#: doc/classes/Camera2D.xml:172 +msgid "If [code]true[/code], the camera rotates with the target." +msgstr "" + +#: 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: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: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 " +"example, use [code]Vector2(0.5, 0.5)[/code] for a 2× zoom-in, and " +"[code]Vector2(4, 4)[/code] for a 4× zoom-out." +msgstr "" + +#: 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:189 +msgid "" +"The camera's position takes into account vertical/horizontal offsets and the " +"screen size." +msgstr "" + +#: 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:195 doc/classes/ClippedCamera3D.xml:107 +msgid "The camera updates with the [code]_process[/code] callback." +msgstr "" + +#: doc/classes/Camera3D.xml:4 msgid "Camera node, displays from a point of view." msgstr "" -#: doc/classes/Camera.xml:7 +#: doc/classes/Camera3D.xml:7 msgid "" -"Camera is a special node that displays what is visible from its current " +"[Camera3D] is a special node that displays what is visible from its current " "location. Cameras register themselves in the nearest [Viewport] node (when " "ascending the tree). Only one camera can be active per viewport. If no " "viewport is available ascending the tree, the camera will register in the " @@ -10523,65 +10241,65 @@ msgid "" "[Viewport] (or higher viewports) can't be displayed." msgstr "" -#: doc/classes/Camera.xml:18 +#: doc/classes/Camera3D.xml:18 msgid "" "If this is the current camera, remove it from being current. If " "[code]enable_next[/code] is [code]true[/code], request to make the next " "camera current, if any." msgstr "" -#: doc/classes/Camera.xml:25 -msgid "Returns the camera's RID from the [VisualServer]." +#: doc/classes/Camera3D.xml:25 +msgid "Returns the camera's RID from the [RenderingServer]." msgstr "" -#: doc/classes/Camera.xml:32 +#: doc/classes/Camera3D.xml:32 msgid "" -"Gets the camera transform. Subclassed cameras such as [InterpolatedCamera] " -"may provide different transforms than the [Node] transform." +"Gets the camera transform. Subclassed cameras such as [ClippedCamera3D] may " +"provide different transforms than the [Node] transform." msgstr "" -#: doc/classes/Camera.xml:41 +#: doc/classes/Camera3D.xml:41 msgid "" "Returns [code]true[/code] if the given [code]layer[/code] in the [member " "cull_mask] is enabled, [code]false[/code] otherwise." msgstr "" -#: doc/classes/Camera.xml:48 +#: doc/classes/Camera3D.xml:48 msgid "" "Returns the camera's frustum planes in world-space units as an array of " "[Plane]s in the following order: near, far, left, top, right, bottom. Not to " "be confused with [member frustum_offset]." msgstr "" -#: doc/classes/Camera.xml:57 +#: doc/classes/Camera3D.xml:57 msgid "" "Returns [code]true[/code] if the given position is behind the camera.\n" "[b]Note:[/b] A position which returns [code]false[/code] may still be " "outside the camera's field of view." msgstr "" -#: doc/classes/Camera.xml:65 +#: doc/classes/Camera3D.xml:65 msgid "" "Makes this camera the current camera for the [Viewport] (see class " "description). If the camera node is outside the scene tree, it will attempt " "to become current once it's added." msgstr "" -#: doc/classes/Camera.xml:74 +#: doc/classes/Camera3D.xml:74 msgid "" "Returns a normal vector from the screen point location directed along the " "camera. Orthogonal cameras are normalized. Perspective cameras account for " "perspective, screen width/height, etc." msgstr "" -#: doc/classes/Camera.xml:85 +#: doc/classes/Camera3D.xml:85 msgid "" "Returns the 3D point in worldspace that maps to the given 2D coordinate in " "the [Viewport] rectangle on a plane that is the given [code]z_depth[/code] " "distance into the scene away from the camera." msgstr "" -#: doc/classes/Camera.xml:94 +#: doc/classes/Camera3D.xml:94 msgid "" "Returns a normal vector in worldspace, that is the result of projecting a " "point on the [Viewport] rectangle by the camera projection. This is useful " @@ -10589,7 +10307,7 @@ msgid "" "picking." msgstr "" -#: doc/classes/Camera.xml:103 +#: doc/classes/Camera3D.xml:103 msgid "" "Returns a 3D position in worldspace, that is the result of projecting a " "point on the [Viewport] rectangle by the camera projection. This is useful " @@ -10597,12 +10315,12 @@ msgid "" "picking." msgstr "" -#: doc/classes/Camera.xml:114 +#: doc/classes/Camera3D.xml:114 msgid "" "Enables or disables the given [code]layer[/code] in the [member cull_mask]." msgstr "" -#: doc/classes/Camera.xml:129 +#: doc/classes/Camera3D.xml:129 msgid "" "Sets the camera projection to frustum mode (see [constant " "PROJECTION_FRUSTUM]), by specifying a [code]size[/code], an [code]offset[/" @@ -10610,7 +10328,7 @@ msgid "" "world-space units." msgstr "" -#: doc/classes/Camera.xml:142 +#: doc/classes/Camera3D.xml:142 msgid "" "Sets the camera projection to orthogonal mode (see [constant " "PROJECTION_ORTHOGONAL]), by specifying a [code]size[/code], and the " @@ -10619,7 +10337,7 @@ msgid "" "pixels.)" msgstr "" -#: doc/classes/Camera.xml:155 +#: doc/classes/Camera3D.xml:155 msgid "" "Sets the camera projection to perspective mode (see [constant " "PROJECTION_PERSPECTIVE]), by specifying a [code]fov[/code] (field of view) " @@ -10627,24 +10345,24 @@ msgid "" "planes in world-space units." msgstr "" -#: doc/classes/Camera.xml:164 +#: doc/classes/Camera3D.xml:164 msgid "" "Returns the 2D coordinate in the [Viewport] rectangle that maps to the given " "3D point in worldspace." msgstr "" -#: doc/classes/Camera.xml:170 +#: doc/classes/Camera3D.xml:170 msgid "" "The culling mask that describes which 3D render layers are rendered by this " "camera." msgstr "" -#: doc/classes/Camera.xml:173 +#: doc/classes/Camera3D.xml:173 msgid "" "If [code]true[/code], the ancestor [Viewport] is currently using this camera." msgstr "" -#: doc/classes/Camera.xml:176 +#: doc/classes/Camera3D.xml:176 msgid "" "If not [constant DOPPLER_TRACKING_DISABLED], this camera will simulate the " "[url=https://en.wikipedia.org/wiki/Doppler_effect]Doppler effect[/url] for " @@ -10652,103 +10370,103 @@ msgid "" "DopplerTracking] for possible values." msgstr "" -#: doc/classes/Camera.xml:181 +#: doc/classes/Camera3D.xml:181 msgid "The [Environment] to use for this camera." msgstr "" -#: doc/classes/Camera.xml:184 +#: doc/classes/Camera3D.xml:184 msgid "" "The distance to the far culling boundary for this camera relative to its " "local Z axis." msgstr "" -#: doc/classes/Camera.xml:187 +#: doc/classes/Camera3D.xml:187 msgid "" "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." msgstr "" -#: doc/classes/Camera.xml:190 +#: doc/classes/Camera3D.xml:190 msgid "" "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]." msgstr "" -#: doc/classes/Camera.xml:193 +#: doc/classes/Camera3D.xml:193 msgid "The horizontal (X) offset of the camera viewport." msgstr "" -#: doc/classes/Camera.xml:196 +#: doc/classes/Camera3D.xml:196 msgid "" "The axis to lock during [member fov]/[member size] adjustments. Can be " "either [constant KEEP_WIDTH] or [constant KEEP_HEIGHT]." msgstr "" -#: doc/classes/Camera.xml:199 +#: doc/classes/Camera3D.xml:199 msgid "" "The distance to the near culling boundary for this camera relative to its " "local Z axis." msgstr "" -#: doc/classes/Camera.xml:202 +#: doc/classes/Camera3D.xml:202 msgid "" "The camera's projection mode. In [constant PROJECTION_PERSPECTIVE] mode, " "objects' Z distance from the camera's local space scales their perceived " "size." msgstr "" -#: doc/classes/Camera.xml:205 +#: doc/classes/Camera3D.xml:205 msgid "" "The camera's size measured as 1/2 the width or height. Only applicable in " "orthogonal mode. Since [member keep_aspect] locks on axis, [code]size[/code] " "sets the other axis' size length." msgstr "" -#: doc/classes/Camera.xml:208 +#: doc/classes/Camera3D.xml:208 msgid "The vertical (Y) offset of the camera viewport." msgstr "" -#: doc/classes/Camera.xml:213 +#: doc/classes/Camera3D.xml:213 msgid "" "Perspective projection. Objects on the screen becomes smaller when they are " "far away." msgstr "" -#: doc/classes/Camera.xml:216 +#: doc/classes/Camera3D.xml:216 msgid "" "Orthogonal projection, also known as orthographic projection. Objects remain " "the same size on the screen no matter how far away they are." msgstr "" -#: doc/classes/Camera.xml:219 +#: doc/classes/Camera3D.xml:219 msgid "" "Frustum projection. This mode allows adjusting [member frustum_offset] to " "create \"tilted frustum\" effects." msgstr "" -#: doc/classes/Camera.xml:222 +#: doc/classes/Camera3D.xml:222 msgid "" "Preserves the horizontal aspect ratio; also known as Vert- scaling. This is " "usually the best option for projects running in portrait mode, as taller " "aspect ratios will benefit from a wider vertical FOV." msgstr "" -#: doc/classes/Camera.xml:225 +#: doc/classes/Camera3D.xml:225 msgid "" "Preserves the vertical aspect ratio; also known as Hor+ scaling. This is " "usually the best option for projects running in landscape mode, as wider " "aspect ratios will automatically benefit from a wider horizontal FOV." msgstr "" -#: doc/classes/Camera.xml:228 +#: doc/classes/Camera3D.xml:228 msgid "" "Disables [url=https://en.wikipedia.org/wiki/Doppler_effect]Doppler effect[/" "url] simulation (default)." msgstr "" -#: doc/classes/Camera.xml:231 +#: doc/classes/Camera3D.xml:231 msgid "" "Simulate [url=https://en.wikipedia.org/wiki/Doppler_effect]Doppler effect[/" "url] by tracking positions of objects that are changed in [code]_process[/" @@ -10757,7 +10475,7 @@ msgid "" "shift[/code])." msgstr "" -#: doc/classes/Camera.xml:234 +#: doc/classes/Camera3D.xml:234 msgid "" "Simulate [url=https://en.wikipedia.org/wiki/Doppler_effect]Doppler effect[/" "url] by tracking positions of objects that are changed in " @@ -10766,246 +10484,70 @@ msgid "" "Audio's [code]pitch shift[/code])." msgstr "" -#: doc/classes/Camera2D.xml:4 -msgid "Camera node for 2D scenes." -msgstr "" - -#: doc/classes/Camera2D.xml:7 -msgid "" -"Camera node for 2D scenes. It forces the screen (current layer) to scroll " -"following this node. This makes it easier (and faster) to program scrollable " -"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]." -msgstr "" - -#: doc/classes/Camera2D.xml:17 -msgid "Aligns the camera to the tracked node." -msgstr "" - -#: doc/classes/Camera2D.xml:24 -msgid "" -"Removes any [Camera2D] from the ancestor [Viewport]'s internal currently-" -"assigned camera." -msgstr "" - -#: doc/classes/Camera2D.xml:31 -msgid "Forces the camera to update scroll immediately." -msgstr "" - -#: doc/classes/Camera2D.xml:38 -msgid "Returns the camera position." -msgstr "" - -#: doc/classes/Camera2D.xml:45 -msgid "" -"Returns the location of the [Camera2D]'s screen-center, relative to the " -"origin." -msgstr "" - -#: doc/classes/Camera2D.xml:54 -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 -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 -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 -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 -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 -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 -msgid "The Camera2D's anchor point. See [enum AnchorMode] constants." -msgstr "" - -#: doc/classes/Camera2D.xml:109 -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 -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 -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 -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 -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 -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 -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 -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/CameraEffects.xml:4 msgid "" -"If [code]true[/code], draws the camera's drag margin rectangle in the editor." +"Contains camera-specific effects such as depth of field and exposure " +"override." msgstr "" -#: doc/classes/Camera2D.xml:136 +#: doc/classes/CameraEffects.xml:7 msgid "" -"If [code]true[/code], draws the camera's limits rectangle in the editor." +"Contains camera-specific effects such as depth of field and exposure " +"override.\n" +"See also [Environment] for general 3D environment settings." msgstr "" -#: doc/classes/Camera2D.xml:139 +#: doc/classes/CameraEffects.xml:16 msgid "" -"If [code]true[/code], draws the camera's screen rectangle in the editor." +"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/Camera2D.xml:142 +#: doc/classes/CameraEffects.xml:19 msgid "" -"Bottom scroll limit in pixels. The camera stops moving when reaching this " -"value." +"The distance from the camera where the far blur effect affects the rendering." msgstr "" -#: doc/classes/Camera2D.xml:145 +#: doc/classes/CameraEffects.xml:22 msgid "" -"Left scroll limit in pixels. The camera stops moving when reaching this " -"value." +"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/Camera2D.xml:148 -msgid "" -"Right scroll limit in pixels. The camera stops moving when reaching this " -"value." +#: doc/classes/CameraEffects.xml:25 +msgid "The length of the transition between the no-blur area and far blur." msgstr "" -#: doc/classes/Camera2D.xml:151 +#: doc/classes/CameraEffects.xml:28 msgid "" -"If [code]true[/code], the camera smoothly stops when reaches its limits." +"Distance from the camera where the near blur effect affects the rendering." msgstr "" -#: doc/classes/Camera2D.xml:154 +#: doc/classes/CameraEffects.xml:31 msgid "" -"Top scroll limit in pixels. The camera stops moving when reaching this value." -msgstr "" - -#: doc/classes/Camera2D.xml:157 -msgid "" -"The camera's offset, useful for looking around or camera shake animations." +"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/Camera2D.xml:160 -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 " -"not updated in any way if drag margins are enabled and can be used to set " -"initial offset." +#: doc/classes/CameraEffects.xml:34 +msgid "The length of the transition between the near blur and no-blur area." msgstr "" -#: doc/classes/Camera2D.xml:164 +#: doc/classes/CameraEffects.xml:37 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 -msgid "The camera's process callback. See [enum Camera2DProcessMode]." -msgstr "" - -#: doc/classes/Camera2D.xml:171 -msgid "If [code]true[/code], the camera rotates with the target." -msgstr "" - -#: doc/classes/Camera2D.xml:174 -msgid "" -"If [code]true[/code], the camera smoothly moves towards the target at " -"[member smoothing_speed]." -msgstr "" - -#: doc/classes/Camera2D.xml:177 -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 -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 " -"example, use [code]Vector2(0.5, 0.5)[/code] for a 2× zoom-in, and " -"[code]Vector2(4, 4)[/code] for a 4× zoom-out." -msgstr "" - -#: doc/classes/Camera2D.xml:185 -msgid "" -"The camera's position is fixed so that the top-left corner is always at the " -"origin." +"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/Camera2D.xml:188 +#: doc/classes/CameraEffects.xml:40 msgid "" -"The camera's position takes into account vertical/horizontal offsets and the " -"screen size." -msgstr "" - -#: doc/classes/Camera2D.xml:191 doc/classes/ClippedCamera.xml:104 -msgid "The camera updates with the [code]_physics_process[/code] callback." -msgstr "" - -#: doc/classes/Camera2D.xml:194 doc/classes/ClippedCamera.xml:107 -msgid "The camera updates with the [code]_process[/code] callback." +"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 @@ -11018,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 " @@ -11033,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 "" @@ -11132,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:17 +#: 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 " @@ -11232,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/Spatial.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 -msgid "Returns the canvas item RID used by [VisualServer] for this item." +#: 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 "" @@ -11525,7 +11080,7 @@ msgstr "" #: doc/classes/CanvasItemMaterial.xml:21 msgid "" "The number of columns in the spritesheet assigned as [Texture2D] for a " -"[Particles2D] or [CPUParticles2D].\n" +"[GPUParticles2D] or [CPUParticles2D].\n" "[b]Note:[/b] This property is only used and visible in the editor if [member " "particles_animation] is [code]true[/code]." msgstr "" @@ -11540,7 +11095,7 @@ msgstr "" #: doc/classes/CanvasItemMaterial.xml:29 msgid "" "The number of rows in the spritesheet assigned as [Texture2D] for a " -"[Particles2D] or [CPUParticles2D].\n" +"[GPUParticles2D] or [CPUParticles2D].\n" "[b]Note:[/b] This property is only used and visible in the editor if [member " "particles_animation] is [code]true[/code]." msgstr "" @@ -11548,7 +11103,7 @@ msgstr "" #: doc/classes/CanvasItemMaterial.xml:33 msgid "" "If [code]true[/code], enable spritesheet-based animation features when " -"assigned to [Particles2D] and [CPUParticles2D] nodes. The [member " +"assigned to [GPUParticles2D] and [CPUParticles2D] nodes. The [member " "ParticlesMaterial.anim_speed] or [member CPUParticles2D.anim_speed] should " "also be set to a positive value for the animation to play.\n" "This property (and other [code]particles_anim_*[/code] properties that " @@ -11691,20 +11246,20 @@ msgstr "" msgid "Number of rings along the height of the capsule." msgstr "" -#: doc/classes/CapsuleShape.xml:4 doc/classes/CapsuleShape.xml:7 -msgid "Capsule shape for collisions." +#: doc/classes/CapsuleShape2D.xml:4 doc/classes/CapsuleShape2D.xml:7 +msgid "Capsule shape for 2D collisions." msgstr "" -#: doc/classes/CapsuleShape.xml:15 doc/classes/CapsuleShape2D.xml:15 +#: doc/classes/CapsuleShape2D.xml:15 doc/classes/CapsuleShape3D.xml:15 msgid "The capsule's height." msgstr "" -#: doc/classes/CapsuleShape.xml:18 doc/classes/CapsuleShape2D.xml:18 +#: doc/classes/CapsuleShape2D.xml:18 doc/classes/CapsuleShape3D.xml:18 msgid "The capsule's radius." msgstr "" -#: doc/classes/CapsuleShape2D.xml:4 doc/classes/CapsuleShape2D.xml:7 -msgid "Capsule shape for 2D collisions." +#: doc/classes/CapsuleShape3D.xml:4 doc/classes/CapsuleShape3D.xml:7 +msgid "Capsule shape for collisions." msgstr "" #: doc/classes/CenterContainer.xml:4 @@ -12129,250 +11684,181 @@ msgid "" "or not." msgstr "" -#: doc/classes/ClippedCamera.xml:4 -msgid "A [Camera] that includes collision." +#: doc/classes/ClippedCamera3D.xml:4 +msgid "A [Camera3D] that includes collision." msgstr "" -#: doc/classes/ClippedCamera.xml:7 +#: doc/classes/ClippedCamera3D.xml:7 msgid "" -"This node extends [Camera] to add collisions with [Area] and/or " -"[PhysicsBody] nodes. The camera cannot move through colliding objects." +"This node extends [Camera3D] to add collisions with [Area3D] and/or " +"[PhysicsBody3D] nodes. The camera cannot move through colliding objects." msgstr "" -#: doc/classes/ClippedCamera.xml:18 +#: doc/classes/ClippedCamera3D.xml:18 msgid "" "Adds a collision exception so the camera does not collide with the specified " "node." msgstr "" -#: doc/classes/ClippedCamera.xml:27 +#: doc/classes/ClippedCamera3D.xml:27 msgid "" "Adds a collision exception so the camera does not collide with the specified " "[RID]." msgstr "" -#: doc/classes/ClippedCamera.xml:34 +#: doc/classes/ClippedCamera3D.xml:34 msgid "Removes all collision exceptions." msgstr "" -#: doc/classes/ClippedCamera.xml:41 +#: doc/classes/ClippedCamera3D.xml:41 msgid "Returns the distance the camera has been offset due to a collision." msgstr "" -#: doc/classes/ClippedCamera.xml:50 +#: doc/classes/ClippedCamera3D.xml:50 msgid "" "Returns [code]true[/code] if the specified bit index is on.\n" "[b]Note:[/b] Bit indices range from 0-19." msgstr "" -#: doc/classes/ClippedCamera.xml:60 +#: doc/classes/ClippedCamera3D.xml:60 msgid "Removes a collision exception with the specified node." msgstr "" -#: doc/classes/ClippedCamera.xml:69 +#: doc/classes/ClippedCamera3D.xml:69 msgid "Removes a collision exception with the specified [RID]." msgstr "" -#: doc/classes/ClippedCamera.xml:80 +#: doc/classes/ClippedCamera3D.xml:80 msgid "" "Sets the specified bit index to the [code]value[/code].\n" "[b]Note:[/b] Bit indices range from 0-19." msgstr "" -#: doc/classes/ClippedCamera.xml:87 -msgid "If [code]true[/code], the camera stops on contact with [Area]s." +#: doc/classes/ClippedCamera3D.xml:87 +msgid "If [code]true[/code], the camera stops on contact with [Area3D]s." msgstr "" -#: doc/classes/ClippedCamera.xml:90 -msgid "If [code]true[/code], the camera stops on contact with [PhysicsBody]s." +#: doc/classes/ClippedCamera3D.xml:90 +msgid "" +"If [code]true[/code], the camera stops on contact with [PhysicsBody3D]s." msgstr "" -#: doc/classes/ClippedCamera.xml:93 +#: doc/classes/ClippedCamera3D.xml:93 msgid "" "The camera's collision mask. Only objects in at least one collision layer " "matching the mask will be detected." msgstr "" -#: doc/classes/ClippedCamera.xml:96 +#: doc/classes/ClippedCamera3D.xml:96 msgid "" "The camera's collision margin. The camera can't get closer than this " "distance to a colliding object." msgstr "" -#: doc/classes/ClippedCamera.xml:99 +#: doc/classes/ClippedCamera3D.xml:99 msgid "The camera's process callback. See [enum ProcessMode]." msgstr "" -#: doc/classes/CollisionObject.xml:4 -msgid "Base node for collision objects." +#: doc/classes/CollisionObject2D.xml:4 +msgid "Base node for 2D collision objects." msgstr "" -#: doc/classes/CollisionObject.xml:7 +#: doc/classes/CollisionObject2D.xml:7 msgid "" -"CollisionObject is the base class for physics objects. It can hold any " -"number of collision [Shape]s. Each shape must be assigned to a [i]shape " -"owner[/i]. The CollisionObject can have any number of shape owners. Shape " +"CollisionObject2D is the base class for 2D physics objects. It can hold any " +"number of 2D collision [Shape2D]s. Each shape must be assigned to a [i]shape " +"owner[/i]. The CollisionObject2D can have any number of shape owners. Shape " "owners are not nodes and do not appear in the editor, but are accessible " "through code using the [code]shape_owner_*[/code] methods." msgstr "" -#: doc/classes/CollisionObject.xml:26 +#: doc/classes/CollisionObject2D.xml:22 msgid "" -"Accepts unhandled [InputEvent]s. [code]click_position[/code] is the clicked " -"location in world space and [code]click_normal[/code] is the normal vector " -"extending from the clicked surface of the [Shape] at [code]shape_idx[/code]. " -"Connect to the [code]input_event[/code] signal to easily pick up these " -"events." +"Accepts unhandled [InputEvent]s. Requires [member input_pickable] to be " +"[code]true[/code]. [code]shape_idx[/code] is the child index of the clicked " +"[Shape2D]. Connect to the [code]input_event[/code] signal to easily pick up " +"these events." msgstr "" -#: doc/classes/CollisionObject.xml:35 doc/classes/CollisionObject2D.xml:31 +#: doc/classes/CollisionObject2D.xml:31 doc/classes/CollisionObject3D.xml:35 msgid "" "Creates a new shape owner for the given object. Returns [code]owner_id[/" "code] of the new owner for future reference." msgstr "" -#: doc/classes/CollisionObject.xml:42 doc/classes/CollisionObject2D.xml:38 +#: doc/classes/CollisionObject2D.xml:38 doc/classes/CollisionObject3D.xml:42 msgid "Returns the object's [RID]." msgstr "" -#: doc/classes/CollisionObject.xml:49 doc/classes/CollisionObject2D.xml:54 +#: doc/classes/CollisionObject2D.xml:47 +msgid "" +"Returns the [code]one_way_collision_margin[/code] of the shape owner " +"identified by given [code]owner_id[/code]." +msgstr "" + +#: doc/classes/CollisionObject2D.xml:54 doc/classes/CollisionObject3D.xml:49 msgid "" "Returns an [Array] of [code]owner_id[/code] identifiers. You can use these " "ids in other methods that take [code]owner_id[/code] as an argument." msgstr "" -#: doc/classes/CollisionObject.xml:58 doc/classes/CollisionObject2D.xml:63 +#: doc/classes/CollisionObject2D.xml:63 doc/classes/CollisionObject3D.xml:58 msgid "If [code]true[/code], the shape owner and its shapes are disabled." msgstr "" -#: doc/classes/CollisionObject.xml:67 doc/classes/CollisionObject2D.xml:81 +#: doc/classes/CollisionObject2D.xml:72 +msgid "" +"Returns [code]true[/code] if collisions for the shape owner originating from " +"this [CollisionObject2D] will not be reported to collided with " +"[CollisionObject2D]s." +msgstr "" + +#: doc/classes/CollisionObject2D.xml:81 doc/classes/CollisionObject3D.xml:67 msgid "Removes the given shape owner." msgstr "" -#: doc/classes/CollisionObject.xml:76 doc/classes/CollisionObject2D.xml:90 +#: doc/classes/CollisionObject2D.xml:90 doc/classes/CollisionObject3D.xml:76 msgid "Returns the [code]owner_id[/code] of the given shape." msgstr "" -#: doc/classes/CollisionObject.xml:87 -msgid "Adds a [Shape] to the shape owner." +#: doc/classes/CollisionObject2D.xml:101 +msgid "Adds a [Shape2D] to the shape owner." msgstr "" -#: doc/classes/CollisionObject.xml:96 doc/classes/CollisionObject2D.xml:110 +#: doc/classes/CollisionObject2D.xml:110 doc/classes/CollisionObject3D.xml:96 msgid "Removes all shapes from the shape owner." msgstr "" -#: doc/classes/CollisionObject.xml:105 doc/classes/CollisionObject2D.xml:119 +#: doc/classes/CollisionObject2D.xml:119 doc/classes/CollisionObject3D.xml:105 msgid "Returns the parent object of the given shape owner." msgstr "" -#: doc/classes/CollisionObject.xml:116 -msgid "Returns the [Shape] with the given id from the given shape owner." +#: doc/classes/CollisionObject2D.xml:130 +msgid "Returns the [Shape2D] with the given id from the given shape owner." msgstr "" -#: doc/classes/CollisionObject.xml:125 doc/classes/CollisionObject2D.xml:139 +#: doc/classes/CollisionObject2D.xml:139 doc/classes/CollisionObject3D.xml:125 msgid "Returns the number of shapes the given shape owner contains." msgstr "" -#: doc/classes/CollisionObject.xml:136 +#: doc/classes/CollisionObject2D.xml:150 msgid "" -"Returns the child index of the [Shape] with the given id from the given " +"Returns the child index of the [Shape2D] with the given id from the given " "shape owner." msgstr "" -#: doc/classes/CollisionObject.xml:145 -msgid "Returns the shape owner's [Transform]." +#: doc/classes/CollisionObject2D.xml:159 +msgid "Returns the shape owner's [Transform2D]." msgstr "" -#: doc/classes/CollisionObject.xml:156 doc/classes/CollisionObject2D.xml:170 +#: doc/classes/CollisionObject2D.xml:170 doc/classes/CollisionObject3D.xml:156 msgid "Removes a shape from the given shape owner." msgstr "" -#: doc/classes/CollisionObject.xml:167 doc/classes/CollisionObject2D.xml:181 +#: doc/classes/CollisionObject2D.xml:181 doc/classes/CollisionObject3D.xml:167 msgid "If [code]true[/code], disables the given shape owner." msgstr "" -#: doc/classes/CollisionObject.xml:178 -msgid "Sets the [Transform] of the given shape owner." -msgstr "" - -#: doc/classes/CollisionObject.xml:184 -msgid "" -"If [code]true[/code], the [CollisionObject] will continue to receive input " -"events as the mouse is dragged across its shapes." -msgstr "" - -#: doc/classes/CollisionObject.xml:187 -msgid "" -"If [code]true[/code], the [CollisionObject]'s shapes will respond to " -"[RayCast]s." -msgstr "" - -#: doc/classes/CollisionObject.xml:203 -msgid "" -"Emitted when [method _input_event] receives an event. See its description " -"for details." -msgstr "" - -#: doc/classes/CollisionObject.xml:208 -msgid "Emitted when the mouse pointer enters any of this object's shapes." -msgstr "" - -#: doc/classes/CollisionObject.xml:213 -msgid "Emitted when the mouse pointer exits all this object's shapes." -msgstr "" - -#: doc/classes/CollisionObject2D.xml:4 -msgid "Base node for 2D collision objects." -msgstr "" - -#: doc/classes/CollisionObject2D.xml:7 -msgid "" -"CollisionObject2D is the base class for 2D physics objects. It can hold any " -"number of 2D collision [Shape2D]s. Each shape must be assigned to a [i]shape " -"owner[/i]. The CollisionObject2D can have any number of shape owners. Shape " -"owners are not nodes and do not appear in the editor, but are accessible " -"through code using the [code]shape_owner_*[/code] methods." -msgstr "" - -#: doc/classes/CollisionObject2D.xml:22 -msgid "" -"Accepts unhandled [InputEvent]s. Requires [member input_pickable] to be " -"[code]true[/code]. [code]shape_idx[/code] is the child index of the clicked " -"[Shape2D]. Connect to the [code]input_event[/code] signal to easily pick up " -"these events." -msgstr "" - -#: doc/classes/CollisionObject2D.xml:47 -msgid "" -"Returns the [code]one_way_collision_margin[/code] of the shape owner " -"identified by given [code]owner_id[/code]." -msgstr "" - -#: doc/classes/CollisionObject2D.xml:72 -msgid "" -"Returns [code]true[/code] if collisions for the shape owner originating from " -"this [CollisionObject2D] will not be reported to collided with " -"[CollisionObject2D]s." -msgstr "" - -#: doc/classes/CollisionObject2D.xml:101 -msgid "Adds a [Shape2D] to the shape owner." -msgstr "" - -#: doc/classes/CollisionObject2D.xml:130 -msgid "Returns the [Shape2D] with the given id from the given shape owner." -msgstr "" - -#: doc/classes/CollisionObject2D.xml:150 -msgid "" -"Returns the child index of the [Shape2D] with the given id from the given " -"shape owner." -msgstr "" - -#: doc/classes/CollisionObject2D.xml:159 -msgid "Returns the shape owner's [Transform2D]." -msgstr "" - #: doc/classes/CollisionObject2D.xml:192 msgid "" "If [code]enable[/code] is [code]true[/code], collisions for the shape owner " @@ -12419,36 +11905,74 @@ msgid "" "[code]collision_layer[/code] bit to be set." msgstr "" -#: doc/classes/CollisionPolygon.xml:4 -msgid "Editor-only class for defining a collision polygon in 3D space." +#: doc/classes/CollisionObject3D.xml:4 +msgid "Base node for collision objects." msgstr "" -#: doc/classes/CollisionPolygon.xml:7 +#: doc/classes/CollisionObject3D.xml:7 msgid "" -"Allows editing a collision polygon's vertices on a selected plane. Can also " -"set a depth perpendicular to that plane. This class is only available in the " -"editor. It will not appear in the scene tree at run-time. Creates a [Shape] " -"for gameplay. Properties modified during gameplay will have no effect." +"CollisionObject3D is the base class for physics objects. It can hold any " +"number of collision [Shape3D]s. Each shape must be assigned to a [i]shape " +"owner[/i]. The CollisionObject3D can have any number of shape owners. Shape " +"owners are not nodes and do not appear in the editor, but are accessible " +"through code using the [code]shape_owner_*[/code] methods." msgstr "" -#: doc/classes/CollisionPolygon.xml:15 +#: doc/classes/CollisionObject3D.xml:26 msgid "" -"Length that the resulting collision extends in either direction " -"perpendicular to its polygon." +"Accepts unhandled [InputEvent]s. [code]click_position[/code] is the clicked " +"location in world space and [code]click_normal[/code] is the normal vector " +"extending from the clicked surface of the [Shape3D] at [code]shape_idx[/" +"code]. Connect to the [code]input_event[/code] signal to easily pick up " +"these events." msgstr "" -#: doc/classes/CollisionPolygon.xml:18 -msgid "If [code]true[/code], no collision will be produced." +#: doc/classes/CollisionObject3D.xml:87 +msgid "Adds a [Shape3D] to the shape owner." msgstr "" -#: doc/classes/CollisionPolygon.xml:21 +#: doc/classes/CollisionObject3D.xml:116 +msgid "Returns the [Shape3D] with the given id from the given shape owner." +msgstr "" + +#: doc/classes/CollisionObject3D.xml:136 msgid "" -"Array of vertices which define the polygon.\n" -"[b]Note:[/b] The returned value is a copy of the original. Methods which " -"mutate the size or properties of the return value will not impact the " -"original polygon. To change properties of the polygon, assign it to a " -"temporary variable and make changes before reassigning the [code]polygon[/" -"code] member." +"Returns the child index of the [Shape3D] with the given id from the given " +"shape owner." +msgstr "" + +#: doc/classes/CollisionObject3D.xml:145 +msgid "Returns the shape owner's [Transform]." +msgstr "" + +#: doc/classes/CollisionObject3D.xml:178 +msgid "Sets the [Transform] of the given shape owner." +msgstr "" + +#: doc/classes/CollisionObject3D.xml:184 +msgid "" +"If [code]true[/code], the [CollisionObject3D] will continue to receive input " +"events as the mouse is dragged across its shapes." +msgstr "" + +#: doc/classes/CollisionObject3D.xml:187 +msgid "" +"If [code]true[/code], the [CollisionObject3D]'s shapes will respond to " +"[RayCast3D]s." +msgstr "" + +#: doc/classes/CollisionObject3D.xml:203 +msgid "" +"Emitted when [method _input_event] receives an event. See its description " +"for details." +msgstr "" + +#: doc/classes/CollisionObject3D.xml:208 +msgid "Emitted when the mouse pointer enters any of this object's shapes." +msgstr "" + +#: doc/classes/CollisionObject3D.xml:213 +msgid "Emitted when the mouse pointer exits all this object's shapes." msgstr "" #: doc/classes/CollisionPolygon2D.xml:4 @@ -12497,47 +12021,37 @@ msgstr "" msgid "Collisions will only include the polygon edges." msgstr "" -#: doc/classes/CollisionShape.xml:4 -msgid "Node that represents collision shape data in 3D space." +#: doc/classes/CollisionPolygon3D.xml:4 +msgid "Editor-only class for defining a collision polygon in 3D space." msgstr "" -#: doc/classes/CollisionShape.xml:7 +#: doc/classes/CollisionPolygon3D.xml:7 msgid "" -"Editor facility for creating and editing collision shapes in 3D space. You " -"can use this node to represent all sorts of collision shapes, for example, " -"add this to an [Area] to give it a detection shape, or add it to a " -"[PhysicsBody] to create a solid object. [b]IMPORTANT[/b]: this is an Editor-" -"only helper to create shapes, use [method CollisionObject." -"shape_owner_get_shape] to get the actual shape." +"Allows editing a collision polygon's vertices on a selected plane. Can also " +"set a depth perpendicular to that plane. This class is only available in the " +"editor. It will not appear in the scene tree at run-time. Creates a " +"[Shape3D] for gameplay. Properties modified during gameplay will have no " +"effect." msgstr "" -#: doc/classes/CollisionShape.xml:10 doc/classes/CollisionShape2D.xml:10 -#: doc/classes/PhysicsBody.xml:10 doc/classes/PhysicsBody2D.xml:10 -#: doc/classes/RigidBody.xml:13 doc/classes/Shape.xml:10 -#: doc/classes/Shape2D.xml:10 +#: doc/classes/CollisionPolygon3D.xml:15 msgid "" -"https://docs.godotengine.org/en/latest/tutorials/physics/" -"physics_introduction.html" +"Length that the resulting collision extends in either direction " +"perpendicular to its polygon." msgstr "" -#: doc/classes/CollisionShape.xml:17 -msgid "" -"Sets the collision shape's shape to the addition of all its convexed " -"[MeshInstance] siblings geometry." +#: doc/classes/CollisionPolygon3D.xml:18 +msgid "If [code]true[/code], no collision will be produced." msgstr "" -#: doc/classes/CollisionShape.xml:26 +#: doc/classes/CollisionPolygon3D.xml:21 msgid "" -"If this method exists within a script it will be called whenever the shape " -"resource has been modified." -msgstr "" - -#: doc/classes/CollisionShape.xml:32 doc/classes/CollisionShape2D.xml:16 -msgid "A disabled collision shape has no effect in the world." -msgstr "" - -#: doc/classes/CollisionShape.xml:35 doc/classes/CollisionShape2D.xml:25 -msgid "The actual shape owned by this collision shape." +"Array of vertices which define the polygon.\n" +"[b]Note:[/b] The returned value is a copy of the original. Methods which " +"mutate the size or properties of the return value will not impact the " +"original polygon. To change properties of the polygon, assign it to a " +"temporary variable and make changes before reassigning the [code]polygon[/" +"code] member." msgstr "" #: doc/classes/CollisionShape2D.xml:4 @@ -12554,6 +12068,19 @@ msgid "" "shape_owner_get_shape] to get the actual shape." msgstr "" +#: doc/classes/CollisionShape2D.xml:10 doc/classes/CollisionShape3D.xml:10 +#: doc/classes/PhysicsBody2D.xml:10 doc/classes/PhysicsBody3D.xml:10 +#: doc/classes/RigidBody3D.xml:13 doc/classes/Shape2D.xml:10 +#: doc/classes/Shape3D.xml:10 +msgid "" +"https://docs.godotengine.org/en/latest/tutorials/physics/" +"physics_introduction.html" +msgstr "" + +#: doc/classes/CollisionShape2D.xml:16 doc/classes/CollisionShape3D.xml:32 +msgid "A disabled collision shape has no effect in the world." +msgstr "" + #: doc/classes/CollisionShape2D.xml:19 msgid "" "Sets whether this collision shape should only detect collision on one side " @@ -12567,6 +12094,36 @@ msgid "" "high velocity." msgstr "" +#: doc/classes/CollisionShape2D.xml:25 doc/classes/CollisionShape3D.xml:35 +msgid "The actual shape owned by this collision shape." +msgstr "" + +#: doc/classes/CollisionShape3D.xml:4 +msgid "Node that represents collision shape data in 3D space." +msgstr "" + +#: doc/classes/CollisionShape3D.xml:7 +msgid "" +"Editor facility for creating and editing collision shapes in 3D space. You " +"can use this node to represent all sorts of collision shapes, for example, " +"add this to an [Area3D] to give it a detection shape, or add it to a " +"[PhysicsBody3D] to create a solid object. [b]IMPORTANT[/b]: this is an " +"Editor-only helper to create shapes, use [method CollisionObject3D." +"shape_owner_get_shape] to get the actual shape." +msgstr "" + +#: doc/classes/CollisionShape3D.xml:17 +msgid "" +"Sets the collision shape's shape to the addition of all its convexed " +"[MeshInstance3D] siblings geometry." +msgstr "" + +#: doc/classes/CollisionShape3D.xml:26 +msgid "" +"If this method exists within a script it will be called whenever the shape " +"resource has been modified." +msgstr "" + #: doc/classes/Color.xml:4 msgid "Color in RGBA format with some support for ARGB format." msgstr "" @@ -12581,10 +12138,12 @@ msgid "" "You can also create a color from standardized color names by using [method " "@GDScript.ColorN] or directly using the color constants defined here. The " "standardized color set is based on the [url=https://en.wikipedia.org/wiki/" -"X11_color_names]X11 color names[/url]." +"X11_color_names]X11 color names[/url]. \n" +"If you want to supply values in a range of 0 to 255, you should use [method " +"@GDScript.Color8]." msgstr "" -#: doc/classes/Color.xml:19 +#: doc/classes/Color.xml:20 msgid "" "Constructs a color from an HTML hexadecimal color string in ARGB or RGB " "format. See also [method @GDScript.ColorN].\n" @@ -12597,7 +12156,7 @@ msgid "" "[/codeblock]" msgstr "" -#: doc/classes/Color.xml:35 +#: doc/classes/Color.xml:36 msgid "" "Constructs a color from a 32-bit integer (each byte represents a component " "of the RGBA profile).\n" @@ -12606,7 +12165,7 @@ msgid "" "[/codeblock]" msgstr "" -#: doc/classes/Color.xml:51 +#: doc/classes/Color.xml:52 msgid "" "Constructs a color from an RGB profile using values between 0 and 1. Alpha " "will always be 1.\n" @@ -12615,7 +12174,7 @@ msgid "" "[/codeblock]" msgstr "" -#: doc/classes/Color.xml:69 +#: doc/classes/Color.xml:70 msgid "" "Constructs a color from an RGBA profile using values between 0 and 1.\n" "[codeblock]\n" @@ -12623,7 +12182,7 @@ msgid "" "[/codeblock]" msgstr "" -#: doc/classes/Color.xml:81 +#: doc/classes/Color.xml:82 msgid "" "Returns a new color resulting from blending this color over another. If the " "color is opaque, the result is also opaque. The second color may have a " @@ -12635,7 +12194,7 @@ msgid "" "[/codeblock]" msgstr "" -#: doc/classes/Color.xml:93 +#: doc/classes/Color.xml:94 msgid "" "Returns the most contrasting color.\n" "[codeblock]\n" @@ -12645,7 +12204,7 @@ msgid "" "[/codeblock]" msgstr "" -#: doc/classes/Color.xml:106 +#: doc/classes/Color.xml:107 msgid "" "Returns a new color resulting from making this color darker by the specified " "percentage (ratio from 0 to 1).\n" @@ -12655,7 +12214,7 @@ msgid "" "[/codeblock]" msgstr "" -#: doc/classes/Color.xml:125 +#: doc/classes/Color.xml:126 msgid "" "Constructs a color from an HSV profile. [code]h[/code], [code]s[/code], and " "[code]v[/code] are values between 0 and 1.\n" @@ -12665,7 +12224,7 @@ msgid "" "[/codeblock]" msgstr "" -#: doc/classes/Color.xml:135 +#: doc/classes/Color.xml:136 msgid "" "Returns the inverted color [code](1 - r, 1 - g, 1 - b, a)[/code].\n" "[codeblock]\n" @@ -12674,36 +12233,35 @@ msgid "" "[/codeblock]" msgstr "" -#: doc/classes/Color.xml:148 +#: doc/classes/Color.xml:149 msgid "" "Returns [code]true[/code] if this color and [code]color[/code] are " "approximately equal, by running [method @GDScript.is_equal_approx] on each " "component." msgstr "" -#: doc/classes/Color.xml:157 +#: 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:172 +#: 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 "" -#: doc/classes/Color.xml:184 +#: doc/classes/Color.xml:185 msgid "" "Returns the color's 32-bit integer in ABGR format (each byte represents a " "component of the ABGR profile). ABGR is the reversed version of the default " @@ -12714,7 +12272,7 @@ msgid "" "[/codeblock]" msgstr "" -#: doc/classes/Color.xml:195 +#: doc/classes/Color.xml:196 msgid "" "Returns the color's 64-bit integer in ABGR format (each word represents a " "component of the ABGR profile). ABGR is the reversed version of the default " @@ -12725,7 +12283,7 @@ msgid "" "[/codeblock]" msgstr "" -#: doc/classes/Color.xml:206 +#: doc/classes/Color.xml:207 msgid "" "Returns the color's 32-bit integer in ARGB format (each byte represents a " "component of the ARGB profile). ARGB is more compatible with DirectX.\n" @@ -12735,7 +12293,7 @@ msgid "" "[/codeblock]" msgstr "" -#: doc/classes/Color.xml:217 +#: doc/classes/Color.xml:218 msgid "" "Returns the color's 64-bit integer in ARGB format (each word represents a " "component of the ARGB profile). ARGB is more compatible with DirectX.\n" @@ -12745,7 +12303,7 @@ msgid "" "[/codeblock]" msgstr "" -#: doc/classes/Color.xml:230 +#: doc/classes/Color.xml:231 msgid "" "Returns the color's HTML hexadecimal color string in ARGB format (ex: " "[code]ff34f822[/code]).\n" @@ -12758,7 +12316,7 @@ msgid "" "[/codeblock]" msgstr "" -#: doc/classes/Color.xml:243 +#: doc/classes/Color.xml:244 msgid "" "Returns the color's 32-bit integer in RGBA format (each byte represents a " "component of the RGBA profile). RGBA is Godot's default format.\n" @@ -12768,7 +12326,7 @@ msgid "" "[/codeblock]" msgstr "" -#: doc/classes/Color.xml:254 +#: doc/classes/Color.xml:255 msgid "" "Returns the color's 64-bit integer in RGBA format (each word represents a " "component of the RGBA profile). RGBA is Godot's default format.\n" @@ -12778,631 +12336,631 @@ msgid "" "[/codeblock]" msgstr "" -#: doc/classes/Color.xml:264 +#: doc/classes/Color.xml:265 msgid "Alpha value (range 0 to 1)." msgstr "" -#: doc/classes/Color.xml:267 +#: doc/classes/Color.xml:268 msgid "Alpha value (range 0 to 255)." msgstr "" -#: doc/classes/Color.xml:270 +#: doc/classes/Color.xml:271 msgid "Blue value (range 0 to 1)." msgstr "" -#: doc/classes/Color.xml:273 +#: doc/classes/Color.xml:274 msgid "Blue value (range 0 to 255)." msgstr "" -#: doc/classes/Color.xml:276 +#: doc/classes/Color.xml:277 msgid "Green value (range 0 to 1)." msgstr "" -#: doc/classes/Color.xml:279 +#: doc/classes/Color.xml:280 msgid "Green value (range 0 to 255)." msgstr "" -#: doc/classes/Color.xml:282 +#: doc/classes/Color.xml:283 msgid "HSV hue value (range 0 to 1)." msgstr "" -#: doc/classes/Color.xml:285 +#: doc/classes/Color.xml:286 msgid "Red value (range 0 to 1)." msgstr "" -#: doc/classes/Color.xml:288 +#: doc/classes/Color.xml:289 msgid "Red value (range 0 to 255)." msgstr "" -#: doc/classes/Color.xml:291 +#: doc/classes/Color.xml:292 msgid "HSV saturation value (range 0 to 1)." msgstr "" -#: doc/classes/Color.xml:294 +#: doc/classes/Color.xml:295 msgid "HSV value (range 0 to 1)." msgstr "" -#: doc/classes/Color.xml:299 +#: doc/classes/Color.xml:300 msgid "Alice blue color." msgstr "" -#: doc/classes/Color.xml:302 +#: doc/classes/Color.xml:303 msgid "Antique white color." msgstr "" -#: doc/classes/Color.xml:305 +#: doc/classes/Color.xml:306 msgid "Aqua color." msgstr "" -#: doc/classes/Color.xml:308 +#: doc/classes/Color.xml:309 msgid "Aquamarine color." msgstr "" -#: doc/classes/Color.xml:311 +#: doc/classes/Color.xml:312 msgid "Azure color." msgstr "" -#: doc/classes/Color.xml:314 +#: doc/classes/Color.xml:315 msgid "Beige color." msgstr "" -#: doc/classes/Color.xml:317 +#: doc/classes/Color.xml:318 msgid "Bisque color." msgstr "" -#: doc/classes/Color.xml:320 +#: doc/classes/Color.xml:321 msgid "Black color." msgstr "" -#: doc/classes/Color.xml:323 +#: doc/classes/Color.xml:324 msgid "Blanche almond color." msgstr "" -#: doc/classes/Color.xml:326 +#: doc/classes/Color.xml:327 msgid "Blue color." msgstr "" -#: doc/classes/Color.xml:329 +#: doc/classes/Color.xml:330 msgid "Blue violet color." msgstr "" -#: doc/classes/Color.xml:332 +#: doc/classes/Color.xml:333 msgid "Brown color." msgstr "" -#: doc/classes/Color.xml:335 +#: doc/classes/Color.xml:336 msgid "Burly wood color." msgstr "" -#: doc/classes/Color.xml:338 +#: doc/classes/Color.xml:339 msgid "Cadet blue color." msgstr "" -#: doc/classes/Color.xml:341 +#: doc/classes/Color.xml:342 msgid "Chartreuse color." msgstr "" -#: doc/classes/Color.xml:344 +#: doc/classes/Color.xml:345 msgid "Chocolate color." msgstr "" -#: doc/classes/Color.xml:347 +#: doc/classes/Color.xml:348 msgid "Coral color." msgstr "" -#: doc/classes/Color.xml:350 +#: doc/classes/Color.xml:351 msgid "Cornflower color." msgstr "" -#: doc/classes/Color.xml:353 +#: doc/classes/Color.xml:354 msgid "Corn silk color." msgstr "" -#: doc/classes/Color.xml:356 +#: doc/classes/Color.xml:357 msgid "Crimson color." msgstr "" -#: doc/classes/Color.xml:359 +#: doc/classes/Color.xml:360 msgid "Cyan color." msgstr "" -#: doc/classes/Color.xml:362 +#: doc/classes/Color.xml:363 msgid "Dark blue color." msgstr "" -#: doc/classes/Color.xml:365 +#: doc/classes/Color.xml:366 msgid "Dark cyan color." msgstr "" -#: doc/classes/Color.xml:368 +#: doc/classes/Color.xml:369 msgid "Dark goldenrod color." msgstr "" -#: doc/classes/Color.xml:371 +#: doc/classes/Color.xml:372 msgid "Dark gray color." msgstr "" -#: doc/classes/Color.xml:374 +#: doc/classes/Color.xml:375 msgid "Dark green color." msgstr "" -#: doc/classes/Color.xml:377 +#: doc/classes/Color.xml:378 msgid "Dark khaki color." msgstr "" -#: doc/classes/Color.xml:380 +#: doc/classes/Color.xml:381 msgid "Dark magenta color." msgstr "" -#: doc/classes/Color.xml:383 +#: doc/classes/Color.xml:384 msgid "Dark olive green color." msgstr "" -#: doc/classes/Color.xml:386 +#: doc/classes/Color.xml:387 msgid "Dark orange color." msgstr "" -#: doc/classes/Color.xml:389 +#: doc/classes/Color.xml:390 msgid "Dark orchid color." msgstr "" -#: doc/classes/Color.xml:392 +#: doc/classes/Color.xml:393 msgid "Dark red color." msgstr "" -#: doc/classes/Color.xml:395 +#: doc/classes/Color.xml:396 msgid "Dark salmon color." msgstr "" -#: doc/classes/Color.xml:398 +#: doc/classes/Color.xml:399 msgid "Dark sea green color." msgstr "" -#: doc/classes/Color.xml:401 +#: doc/classes/Color.xml:402 msgid "Dark slate blue color." msgstr "" -#: doc/classes/Color.xml:404 +#: doc/classes/Color.xml:405 msgid "Dark slate gray color." msgstr "" -#: doc/classes/Color.xml:407 +#: doc/classes/Color.xml:408 msgid "Dark turquoise color." msgstr "" -#: doc/classes/Color.xml:410 +#: doc/classes/Color.xml:411 msgid "Dark violet color." msgstr "" -#: doc/classes/Color.xml:413 +#: doc/classes/Color.xml:414 msgid "Deep pink color." msgstr "" -#: doc/classes/Color.xml:416 +#: doc/classes/Color.xml:417 msgid "Deep sky blue color." msgstr "" -#: doc/classes/Color.xml:419 +#: doc/classes/Color.xml:420 msgid "Dim gray color." msgstr "" -#: doc/classes/Color.xml:422 +#: doc/classes/Color.xml:423 msgid "Dodger blue color." msgstr "" -#: doc/classes/Color.xml:425 +#: doc/classes/Color.xml:426 msgid "Firebrick color." msgstr "" -#: doc/classes/Color.xml:428 +#: doc/classes/Color.xml:429 msgid "Floral white color." msgstr "" -#: doc/classes/Color.xml:431 +#: doc/classes/Color.xml:432 msgid "Forest green color." msgstr "" -#: doc/classes/Color.xml:434 +#: doc/classes/Color.xml:435 msgid "Fuchsia color." msgstr "" -#: doc/classes/Color.xml:437 +#: doc/classes/Color.xml:438 msgid "Gainsboro color." msgstr "" -#: doc/classes/Color.xml:440 +#: doc/classes/Color.xml:441 msgid "Ghost white color." msgstr "" -#: doc/classes/Color.xml:443 +#: doc/classes/Color.xml:444 msgid "Gold color." msgstr "" -#: doc/classes/Color.xml:446 +#: doc/classes/Color.xml:447 msgid "Goldenrod color." msgstr "" -#: doc/classes/Color.xml:449 +#: doc/classes/Color.xml:450 msgid "Gray color." msgstr "" -#: doc/classes/Color.xml:452 +#: doc/classes/Color.xml:453 msgid "Green color." msgstr "" -#: doc/classes/Color.xml:455 +#: doc/classes/Color.xml:456 msgid "Green yellow color." msgstr "" -#: doc/classes/Color.xml:458 +#: doc/classes/Color.xml:459 msgid "Honeydew color." msgstr "" -#: doc/classes/Color.xml:461 +#: doc/classes/Color.xml:462 msgid "Hot pink color." msgstr "" -#: doc/classes/Color.xml:464 +#: doc/classes/Color.xml:465 msgid "Indian red color." msgstr "" -#: doc/classes/Color.xml:467 +#: doc/classes/Color.xml:468 msgid "Indigo color." msgstr "" -#: doc/classes/Color.xml:470 +#: doc/classes/Color.xml:471 msgid "Ivory color." msgstr "" -#: doc/classes/Color.xml:473 +#: doc/classes/Color.xml:474 msgid "Khaki color." msgstr "" -#: doc/classes/Color.xml:476 +#: doc/classes/Color.xml:477 msgid "Lavender color." msgstr "" -#: doc/classes/Color.xml:479 +#: doc/classes/Color.xml:480 msgid "Lavender blush color." msgstr "" -#: doc/classes/Color.xml:482 +#: doc/classes/Color.xml:483 msgid "Lawn green color." msgstr "" -#: doc/classes/Color.xml:485 +#: doc/classes/Color.xml:486 msgid "Lemon chiffon color." msgstr "" -#: doc/classes/Color.xml:488 +#: doc/classes/Color.xml:489 msgid "Light blue color." msgstr "" -#: doc/classes/Color.xml:491 +#: doc/classes/Color.xml:492 msgid "Light coral color." msgstr "" -#: doc/classes/Color.xml:494 +#: doc/classes/Color.xml:495 msgid "Light cyan color." msgstr "" -#: doc/classes/Color.xml:497 +#: doc/classes/Color.xml:498 msgid "Light goldenrod color." msgstr "" -#: doc/classes/Color.xml:500 +#: doc/classes/Color.xml:501 msgid "Light gray color." msgstr "" -#: doc/classes/Color.xml:503 +#: doc/classes/Color.xml:504 msgid "Light green color." msgstr "" -#: doc/classes/Color.xml:506 +#: doc/classes/Color.xml:507 msgid "Light pink color." msgstr "" -#: doc/classes/Color.xml:509 +#: doc/classes/Color.xml:510 msgid "Light salmon color." msgstr "" -#: doc/classes/Color.xml:512 +#: doc/classes/Color.xml:513 msgid "Light sea green color." msgstr "" -#: doc/classes/Color.xml:515 +#: doc/classes/Color.xml:516 msgid "Light sky blue color." msgstr "" -#: doc/classes/Color.xml:518 +#: doc/classes/Color.xml:519 msgid "Light slate gray color." msgstr "" -#: doc/classes/Color.xml:521 +#: doc/classes/Color.xml:522 msgid "Light steel blue color." msgstr "" -#: doc/classes/Color.xml:524 +#: doc/classes/Color.xml:525 msgid "Light yellow color." msgstr "" -#: doc/classes/Color.xml:527 +#: doc/classes/Color.xml:528 msgid "Lime color." msgstr "" -#: doc/classes/Color.xml:530 +#: doc/classes/Color.xml:531 msgid "Lime green color." msgstr "" -#: doc/classes/Color.xml:533 +#: doc/classes/Color.xml:534 msgid "Linen color." msgstr "" -#: doc/classes/Color.xml:536 +#: doc/classes/Color.xml:537 msgid "Magenta color." msgstr "" -#: doc/classes/Color.xml:539 +#: doc/classes/Color.xml:540 msgid "Maroon color." msgstr "" -#: doc/classes/Color.xml:542 +#: doc/classes/Color.xml:543 msgid "Medium aquamarine color." msgstr "" -#: doc/classes/Color.xml:545 +#: doc/classes/Color.xml:546 msgid "Medium blue color." msgstr "" -#: doc/classes/Color.xml:548 +#: doc/classes/Color.xml:549 msgid "Medium orchid color." msgstr "" -#: doc/classes/Color.xml:551 +#: doc/classes/Color.xml:552 msgid "Medium purple color." msgstr "" -#: doc/classes/Color.xml:554 +#: doc/classes/Color.xml:555 msgid "Medium sea green color." msgstr "" -#: doc/classes/Color.xml:557 +#: doc/classes/Color.xml:558 msgid "Medium slate blue color." msgstr "" -#: doc/classes/Color.xml:560 +#: doc/classes/Color.xml:561 msgid "Medium spring green color." msgstr "" -#: doc/classes/Color.xml:563 +#: doc/classes/Color.xml:564 msgid "Medium turquoise color." msgstr "" -#: doc/classes/Color.xml:566 +#: doc/classes/Color.xml:567 msgid "Medium violet red color." msgstr "" -#: doc/classes/Color.xml:569 +#: doc/classes/Color.xml:570 msgid "Midnight blue color." msgstr "" -#: doc/classes/Color.xml:572 +#: doc/classes/Color.xml:573 msgid "Mint cream color." msgstr "" -#: doc/classes/Color.xml:575 +#: doc/classes/Color.xml:576 msgid "Misty rose color." msgstr "" -#: doc/classes/Color.xml:578 +#: doc/classes/Color.xml:579 msgid "Moccasin color." msgstr "" -#: doc/classes/Color.xml:581 +#: doc/classes/Color.xml:582 msgid "Navajo white color." msgstr "" -#: doc/classes/Color.xml:584 +#: doc/classes/Color.xml:585 msgid "Navy blue color." msgstr "" -#: doc/classes/Color.xml:587 +#: doc/classes/Color.xml:588 msgid "Old lace color." msgstr "" -#: doc/classes/Color.xml:590 +#: doc/classes/Color.xml:591 msgid "Olive color." msgstr "" -#: doc/classes/Color.xml:593 +#: doc/classes/Color.xml:594 msgid "Olive drab color." msgstr "" -#: doc/classes/Color.xml:596 +#: doc/classes/Color.xml:597 msgid "Orange color." msgstr "" -#: doc/classes/Color.xml:599 +#: doc/classes/Color.xml:600 msgid "Orange red color." msgstr "" -#: doc/classes/Color.xml:602 +#: doc/classes/Color.xml:603 msgid "Orchid color." msgstr "" -#: doc/classes/Color.xml:605 +#: doc/classes/Color.xml:606 msgid "Pale goldenrod color." msgstr "" -#: doc/classes/Color.xml:608 +#: doc/classes/Color.xml:609 msgid "Pale green color." msgstr "" -#: doc/classes/Color.xml:611 +#: doc/classes/Color.xml:612 msgid "Pale turquoise color." msgstr "" -#: doc/classes/Color.xml:614 +#: doc/classes/Color.xml:615 msgid "Pale violet red color." msgstr "" -#: doc/classes/Color.xml:617 +#: doc/classes/Color.xml:618 msgid "Papaya whip color." msgstr "" -#: doc/classes/Color.xml:620 +#: doc/classes/Color.xml:621 msgid "Peach puff color." msgstr "" -#: doc/classes/Color.xml:623 +#: doc/classes/Color.xml:624 msgid "Peru color." msgstr "" -#: doc/classes/Color.xml:626 +#: doc/classes/Color.xml:627 msgid "Pink color." msgstr "" -#: doc/classes/Color.xml:629 +#: doc/classes/Color.xml:630 msgid "Plum color." msgstr "" -#: doc/classes/Color.xml:632 +#: doc/classes/Color.xml:633 msgid "Powder blue color." msgstr "" -#: doc/classes/Color.xml:635 +#: doc/classes/Color.xml:636 msgid "Purple color." msgstr "" -#: doc/classes/Color.xml:638 +#: doc/classes/Color.xml:639 msgid "Rebecca purple color." msgstr "" -#: doc/classes/Color.xml:641 +#: doc/classes/Color.xml:642 msgid "Red color." msgstr "" -#: doc/classes/Color.xml:644 +#: doc/classes/Color.xml:645 msgid "Rosy brown color." msgstr "" -#: doc/classes/Color.xml:647 +#: doc/classes/Color.xml:648 msgid "Royal blue color." msgstr "" -#: doc/classes/Color.xml:650 +#: doc/classes/Color.xml:651 msgid "Saddle brown color." msgstr "" -#: doc/classes/Color.xml:653 +#: doc/classes/Color.xml:654 msgid "Salmon color." msgstr "" -#: doc/classes/Color.xml:656 +#: doc/classes/Color.xml:657 msgid "Sandy brown color." msgstr "" -#: doc/classes/Color.xml:659 +#: doc/classes/Color.xml:660 msgid "Sea green color." msgstr "" -#: doc/classes/Color.xml:662 +#: doc/classes/Color.xml:663 msgid "Seashell color." msgstr "" -#: doc/classes/Color.xml:665 +#: doc/classes/Color.xml:666 msgid "Sienna color." msgstr "" -#: doc/classes/Color.xml:668 +#: doc/classes/Color.xml:669 msgid "Silver color." msgstr "" -#: doc/classes/Color.xml:671 +#: doc/classes/Color.xml:672 msgid "Sky blue color." msgstr "" -#: doc/classes/Color.xml:674 +#: doc/classes/Color.xml:675 msgid "Slate blue color." msgstr "" -#: doc/classes/Color.xml:677 +#: doc/classes/Color.xml:678 msgid "Slate gray color." msgstr "" -#: doc/classes/Color.xml:680 +#: doc/classes/Color.xml:681 msgid "Snow color." msgstr "" -#: doc/classes/Color.xml:683 +#: doc/classes/Color.xml:684 msgid "Spring green color." msgstr "" -#: doc/classes/Color.xml:686 +#: doc/classes/Color.xml:687 msgid "Steel blue color." msgstr "" -#: doc/classes/Color.xml:689 +#: doc/classes/Color.xml:690 msgid "Tan color." msgstr "" -#: doc/classes/Color.xml:692 +#: doc/classes/Color.xml:693 msgid "Teal color." msgstr "" -#: doc/classes/Color.xml:695 +#: doc/classes/Color.xml:696 msgid "Thistle color." msgstr "" -#: doc/classes/Color.xml:698 +#: doc/classes/Color.xml:699 msgid "Tomato color." msgstr "" -#: doc/classes/Color.xml:701 +#: doc/classes/Color.xml:702 msgid "Transparent color (white with no alpha)." msgstr "" -#: doc/classes/Color.xml:704 +#: doc/classes/Color.xml:705 msgid "Turquoise color." msgstr "" -#: doc/classes/Color.xml:707 +#: doc/classes/Color.xml:708 msgid "Violet color." msgstr "" -#: doc/classes/Color.xml:710 +#: doc/classes/Color.xml:711 msgid "Web gray color." msgstr "" -#: doc/classes/Color.xml:713 +#: doc/classes/Color.xml:714 msgid "Web green color." msgstr "" -#: doc/classes/Color.xml:716 +#: doc/classes/Color.xml:717 msgid "Web maroon color." msgstr "" -#: doc/classes/Color.xml:719 +#: doc/classes/Color.xml:720 msgid "Web purple color." msgstr "" -#: doc/classes/Color.xml:722 +#: doc/classes/Color.xml:723 msgid "Wheat color." msgstr "" -#: doc/classes/Color.xml:725 +#: doc/classes/Color.xml:726 msgid "White color." msgstr "" -#: doc/classes/Color.xml:728 +#: doc/classes/Color.xml:729 msgid "White smoke color." msgstr "" -#: doc/classes/Color.xml:731 +#: doc/classes/Color.xml:732 msgid "Yellow color." msgstr "" -#: doc/classes/Color.xml:734 +#: doc/classes/Color.xml:735 msgid "Yellow green color." msgstr "" @@ -13624,27 +13182,6 @@ msgid "" "[/codeblock]" msgstr "" -#: doc/classes/ConcavePolygonShape.xml:4 -msgid "Concave polygon shape." -msgstr "" - -#: doc/classes/ConcavePolygonShape.xml:7 -msgid "" -"Concave polygon shape resource, which can be set into a [PhysicsBody] or " -"area. This shape is created by feeding a list of triangles.\n" -"Note: when used for collision, [ConcavePolygonShape] is intended to work " -"with static [PhysicsBody] nodes like [StaticBody] and will not work with " -"[KinematicBody] or [RigidBody] with a mode other than Static." -msgstr "" - -#: doc/classes/ConcavePolygonShape.xml:17 -msgid "Returns the faces (an array of triangles)." -msgstr "" - -#: doc/classes/ConcavePolygonShape.xml:26 -msgid "Sets the faces (an array of triangles)." -msgstr "" - #: doc/classes/ConcavePolygonShape2D.xml:4 msgid "Concave polygon 2D shape resource for physics." msgstr "" @@ -13668,61 +13205,82 @@ msgid "" "The array of points that make up the [ConcavePolygonShape2D]'s line segments." msgstr "" -#: doc/classes/ConeTwistJoint.xml:4 +#: doc/classes/ConcavePolygonShape3D.xml:4 +msgid "Concave polygon shape." +msgstr "" + +#: doc/classes/ConcavePolygonShape3D.xml:7 +msgid "" +"Concave polygon shape resource, which can be set into a [PhysicsBody3D] or " +"area. This shape is created by feeding a list of triangles.\n" +"Note: when used for collision, [ConcavePolygonShape3D] is intended to work " +"with static [PhysicsBody3D] nodes like [StaticBody3D] and will not work with " +"[KinematicBody3D] or [RigidBody3D] with a mode other than Static." +msgstr "" + +#: doc/classes/ConcavePolygonShape3D.xml:17 +msgid "Returns the faces (an array of triangles)." +msgstr "" + +#: doc/classes/ConcavePolygonShape3D.xml:26 +msgid "Sets the faces (an array of triangles)." +msgstr "" + +#: doc/classes/ConeTwistJoint3D.xml:4 msgid "A twist joint between two 3D bodies." msgstr "" -#: doc/classes/ConeTwistJoint.xml:7 +#: doc/classes/ConeTwistJoint3D.xml:7 msgid "" "The joint can rotate the bodies across an axis defined by the local x-axes " -"of the [Joint].\n" -"The twist axis is initiated as the X axis of the [Joint].\n" +"of the [Joint3D].\n" +"The twist axis is initiated as the X axis of the [Joint3D].\n" "Once the Bodies swing, the twist axis is calculated as the middle of the x-" -"axes of the Joint in the local space of the two Bodies." +"axes of the Joint3D in the local space of the two Bodies." msgstr "" -#: doc/classes/ConeTwistJoint.xml:35 doc/classes/ConeTwistJoint.xml:67 -#: doc/classes/PhysicsServer.xml:1400 +#: doc/classes/ConeTwistJoint3D.xml:35 doc/classes/ConeTwistJoint3D.xml:67 +#: doc/classes/PhysicsServer3D.xml:1400 msgid "" "The speed with which the swing or twist will take place.\n" "The higher, the faster." msgstr "" -#: doc/classes/ConeTwistJoint.xml:39 doc/classes/ConeTwistJoint.xml:74 -#: doc/classes/PhysicsServer.xml:1407 +#: doc/classes/ConeTwistJoint3D.xml:39 doc/classes/ConeTwistJoint3D.xml:74 +#: doc/classes/PhysicsServer3D.xml:1407 msgid "" "Defines, how fast the swing- and twist-speed-difference on both sides gets " "synced." msgstr "" -#: doc/classes/ConeTwistJoint.xml:42 doc/classes/ConeTwistJoint.xml:71 +#: doc/classes/ConeTwistJoint3D.xml:42 doc/classes/ConeTwistJoint3D.xml:71 msgid "" "The ease with which the joint starts to twist. If it's too low, it takes " "more force to start twisting the joint." msgstr "" -#: doc/classes/ConeTwistJoint.xml:45 doc/classes/ConeTwistJoint.xml:57 -#: doc/classes/PhysicsServer.xml:1390 +#: doc/classes/ConeTwistJoint3D.xml:45 doc/classes/ConeTwistJoint3D.xml:57 +#: doc/classes/PhysicsServer3D.xml:1390 msgid "" "Swing is rotation from side to side, around the axis perpendicular to the " "twist axis.\n" "The swing span defines, how much rotation will not get corrected along the " "swing axis.\n" -"Could be defined as looseness in the [ConeTwistJoint].\n" +"Could be defined as looseness in the [ConeTwistJoint3D].\n" "If below 0.05, this behavior is locked." msgstr "" -#: doc/classes/ConeTwistJoint.xml:51 doc/classes/ConeTwistJoint.xml:63 -#: doc/classes/PhysicsServer.xml:1396 +#: doc/classes/ConeTwistJoint3D.xml:51 doc/classes/ConeTwistJoint3D.xml:63 +#: doc/classes/PhysicsServer3D.xml:1396 msgid "" "Twist is the rotation around the twist axis, this value defined how far the " "joint can twist.\n" "Twist is locked if below 0.05." msgstr "" -#: doc/classes/ConeTwistJoint.xml:77 doc/classes/Generic6DOFJoint.xml:404 -#: doc/classes/HingeJoint.xml:109 doc/classes/Light.xml:124 -#: doc/classes/SliderJoint.xml:170 +#: doc/classes/ConeTwistJoint3D.xml:77 doc/classes/Generic6DOFJoint3D.xml:404 +#: 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 "" @@ -13738,7 +13296,7 @@ msgid "" "[codeblock]\n" "[section]\n" "some_key=42\n" -"string_example=\"Hello World!\"\n" +"string_example=\"Hello World3D!\"\n" "a_vector=Vector3( 1, 0, 2 )\n" "[/codeblock]\n" "The stored data can be saved to or parsed from a file, though ConfigFile " @@ -13937,9 +13495,12 @@ msgid "" "Godot sends input events to the scene's root node first, by calling [method " "Node._input]. [method Node._input] forwards the event down the node tree to " "the nodes under the mouse cursor, or on keyboard focus. To do so, it calls " -"[method MainLoop._input_event]. Call [method accept_event] so no other node " -"receives the event. Once you accepted an input, it becomes handled so " -"[method Node._unhandled_input] will not process it.\n" +"[code]MainLoop._input_event[/code].\n" +"[b]FIXME:[/b] No longer valid after DisplayServer split and Input " +"refactoring.\n" +"Call [method accept_event] so no other node receives the event. Once you " +"accepted an input, it becomes handled so [method Node._unhandled_input] will " +"not process it.\n" "Only one [Control] node can be in keyboard focus. Only the node in focus " "will receive keyboard events. To get the focus, call [method grab_focus]. " "[Control] nodes lose focus when another node grabs it, or if you hide the " @@ -13949,16 +13510,16 @@ msgid "" "an icon on top of a button.\n" "[Theme] resources change the Control's appearance. If you change the [Theme] " "on a [Control] node, it affects all of its children. To override some of the " -"theme's parameters, call one of the [code]add_*_override[/code] methods, " -"like [method add_font_override]. You can override the theme with the " -"inspector." +"theme's parameters, call one of the [code]add_theme_*_override[/code] " +"methods, like [method add_theme_font_override]. You can override the theme " +"with the inspector." msgstr "" -#: doc/classes/Control.xml:16 +#: doc/classes/Control.xml:18 msgid "https://docs.godotengine.org/en/latest/tutorials/gui/index.html" msgstr "" -#: doc/classes/Control.xml:24 +#: doc/classes/Control.xml:26 msgid "" "Virtual method to be implemented by the user. Returns whether [method " "_gui_input] should not be called for children controls outside this " @@ -13967,7 +13528,7 @@ msgid "" "If not overridden, defaults to [code]false[/code]." msgstr "" -#: doc/classes/Control.xml:32 +#: doc/classes/Control.xml:34 msgid "" "Virtual method to be implemented by the user. Returns the minimum size for " "this control. Alternative to [member rect_min_size] for controlling minimum " @@ -13976,7 +13537,7 @@ msgid "" "If not overridden, defaults to [constant Vector2.ZERO]." msgstr "" -#: doc/classes/Control.xml:42 +#: doc/classes/Control.xml:44 msgid "" "Virtual method to be implemented by the user. Use this method to process and " "accept inputs on UI elements. See [method accept_event].\n" @@ -13998,7 +13559,7 @@ msgid "" "rect_clip_content] or [method _clips_input] enabled." msgstr "" -#: doc/classes/Control.xml:64 +#: doc/classes/Control.xml:66 msgid "" "Virtual method to be implemented by the user. Returns a [Control] node that " "should be used as a tooltip instead of the default one. Use [code]for_text[/" @@ -14028,21 +13589,21 @@ msgid "" "[/codeblock]" msgstr "" -#: doc/classes/Control.xml:87 +#: doc/classes/Control.xml:89 msgid "" "Marks an input event as handled. Once you accept an input event, it stops " "propagating, even to nodes listening to [method Node._unhandled_input] or " "[method Node._unhandled_key_input]." msgstr "" -#: doc/classes/Control.xml:98 +#: doc/classes/Control.xml:100 msgid "" "Overrides the [Color] with given [code]name[/code] in the [member theme] " "resource the control uses. If the [code]color[/code] is empty or invalid, " "the override is cleared and the color from assigned [Theme] is used." msgstr "" -#: doc/classes/Control.xml:109 +#: doc/classes/Control.xml:111 msgid "" "Overrides an integer constant with given [code]name[/code] in the [member " "theme] resource the control uses. If the [code]constant[/code] is empty or " @@ -14050,35 +13611,35 @@ msgid "" "used." msgstr "" -#: doc/classes/Control.xml:120 +#: doc/classes/Control.xml:122 msgid "" "Overrides the font with given [code]name[/code] in the [member theme] " "resource the control uses. If [code]font[/code] is empty or invalid, the " "override is cleared and the font from assigned [Theme] is used." msgstr "" -#: doc/classes/Control.xml:131 +#: doc/classes/Control.xml:133 msgid "" "Overrides the icon with given [code]name[/code] in the [member theme] " "resource the control uses. If [code]icon[/code] is empty or invalid, the " "override is cleared and the icon from assigned [Theme] is used." msgstr "" -#: doc/classes/Control.xml:142 +#: doc/classes/Control.xml:144 msgid "" "Overrides the [Shader] with given [code]name[/code] in the [member theme] " "resource the control uses. If [code]shader[/code] is empty or invalid, the " "override is cleared and the shader from assigned [Theme] is used." msgstr "" -#: doc/classes/Control.xml:153 +#: doc/classes/Control.xml:155 msgid "" "Overrides the [StyleBox] with given [code]name[/code] in the [member theme] " "resource the control uses. If [code]stylebox[/code] is empty or invalid, the " "override is cleared and the [StyleBox] from assigned [Theme] is used." msgstr "" -#: doc/classes/Control.xml:164 +#: doc/classes/Control.xml:166 msgid "" "Godot calls this method to test if [code]data[/code] from a control's " "[method get_drag_data] can be dropped at [code]position[/code]. " @@ -14093,7 +13654,7 @@ msgid "" "[/codeblock]" msgstr "" -#: doc/classes/Control.xml:182 +#: doc/classes/Control.xml:184 msgid "" "Godot calls this method to pass you the [code]data[/code] from a control's " "[method get_drag_data] result. Godot first calls [method can_drop_data] to " @@ -14108,7 +13669,7 @@ msgid "" "[/codeblock]" msgstr "" -#: doc/classes/Control.xml:200 +#: doc/classes/Control.xml:202 msgid "" "Forces drag and bypasses [method get_drag_data] and [method " "set_drag_preview] by passing [code]data[/code] and [code]preview[/code]. " @@ -14118,49 +13679,32 @@ msgid "" "implemented on controls that want to receive drop data." msgstr "" -#: doc/classes/Control.xml:210 +#: doc/classes/Control.xml:212 msgid "" "Returns the anchor identified by [code]margin[/code] constant from [enum " "Margin] enum. A getter method for [member anchor_bottom], [member " "anchor_left], [member anchor_right] and [member anchor_top]." msgstr "" -#: doc/classes/Control.xml:217 +#: doc/classes/Control.xml:219 msgid "" "Returns [member margin_left] and [member margin_top]. See also [member " "rect_position]." msgstr "" -#: doc/classes/Control.xml:228 -msgid "" -"Returns a color from assigned [Theme] with given [code]name[/code] and " -"associated with [Control] of given [code]type[/code].\n" -"[codeblock]\n" -"func _ready():\n" -" modulate = get_color(\"font_color\", \"Button\") #get the color defined " -"for button fonts\n" -"[/codeblock]" -msgstr "" - -#: doc/classes/Control.xml:239 +#: doc/classes/Control.xml:226 msgid "" "Returns combined minimum size from [member rect_min_size] and [method " "get_minimum_size]." msgstr "" -#: doc/classes/Control.xml:250 -msgid "" -"Returns a constant from assigned [Theme] with given [code]name[/code] and " -"associated with [Control] of given [code]type[/code]." -msgstr "" - -#: doc/classes/Control.xml:259 +#: doc/classes/Control.xml:235 msgid "" "Returns the mouse cursor shape the control displays on mouse hover. See " "[enum CursorShape]." msgstr "" -#: doc/classes/Control.xml:268 +#: doc/classes/Control.xml:244 msgid "" "Godot calls this method to get data that can be dragged and dropped onto " "controls that expect drop data. Returns [code]null[/code] if there is no " @@ -14178,11 +13722,11 @@ msgid "" "[/codeblock]" msgstr "" -#: doc/classes/Control.xml:282 +#: doc/classes/Control.xml:258 msgid "Returns [member margin_right] and [member margin_bottom]." msgstr "" -#: doc/classes/Control.xml:291 +#: doc/classes/Control.xml:267 msgid "" "Returns the focus neighbour identified by [code]margin[/code] constant from " "[enum Margin] enum. A getter method for [member focus_neighbour_bottom], " @@ -14190,71 +13734,88 @@ msgid "" "focus_neighbour_top]." msgstr "" -#: doc/classes/Control.xml:298 +#: doc/classes/Control.xml:274 msgid "" "Returns the control that has the keyboard focus or [code]null[/code] if none." msgstr "" -#: doc/classes/Control.xml:309 -msgid "" -"Returns a font from assigned [Theme] with given [code]name[/code] and " -"associated with [Control] of given [code]type[/code]." -msgstr "" - -#: doc/classes/Control.xml:316 +#: doc/classes/Control.xml:281 msgid "" "Returns the position and size of the control relative to the top-left corner " "of the screen. See [member rect_position] and [member rect_size]." msgstr "" -#: doc/classes/Control.xml:327 -msgid "" -"Returns an icon from assigned [Theme] with given [code]name[/code] and " -"associated with [Control] of given [code]type[/code]." -msgstr "" - -#: doc/classes/Control.xml:336 +#: doc/classes/Control.xml:290 msgid "" "Returns the anchor identified by [code]margin[/code] constant from [enum " "Margin] enum. A getter method for [member margin_bottom], [member " "margin_left], [member margin_right] and [member margin_top]." msgstr "" -#: doc/classes/Control.xml:343 +#: doc/classes/Control.xml:297 msgid "Returns the minimum size for this control. See [member rect_min_size]." msgstr "" -#: doc/classes/Control.xml:350 +#: doc/classes/Control.xml:304 msgid "Returns the width/height occupied in the parent control." msgstr "" -#: doc/classes/Control.xml:357 +#: doc/classes/Control.xml:311 msgid "Returns the parent control node." msgstr "" -#: doc/classes/Control.xml:364 +#: doc/classes/Control.xml:318 msgid "" "Returns the position and size of the control relative to the top-left corner " "of the parent Control. See [member rect_position] and [member rect_size]." msgstr "" -#: doc/classes/Control.xml:371 +#: doc/classes/Control.xml:325 msgid "Returns the rotation (in radians)." msgstr "" -#: doc/classes/Control.xml:382 +#: doc/classes/Control.xml:336 +msgid "" +"Returns a color from assigned [Theme] with given [code]name[/code] and " +"associated with [Control] of given [code]type[/code].\n" +"[codeblock]\n" +"func _ready():\n" +" modulate = get_theme_color(\"font_color\", \"Button\") #get the color " +"defined for button fonts\n" +"[/codeblock]" +msgstr "" + +#: doc/classes/Control.xml:351 +msgid "" +"Returns a constant from assigned [Theme] with given [code]name[/code] and " +"associated with [Control] of given [code]type[/code]." +msgstr "" + +#: doc/classes/Control.xml:362 +msgid "" +"Returns a font from assigned [Theme] with given [code]name[/code] and " +"associated with [Control] of given [code]type[/code]." +msgstr "" + +#: doc/classes/Control.xml:373 +msgid "" +"Returns an icon from assigned [Theme] with given [code]name[/code] and " +"associated with [Control] of given [code]type[/code]." +msgstr "" + +#: doc/classes/Control.xml:384 msgid "" "Returns a [StyleBox] from assigned [Theme] with given [code]name[/code] and " "associated with [Control] of given [code]type[/code]." msgstr "" -#: doc/classes/Control.xml:391 +#: doc/classes/Control.xml:393 msgid "" "Returns the tooltip, which will appear when the cursor is resting over this " "control. See [member hint_tooltip]." msgstr "" -#: doc/classes/Control.xml:398 +#: doc/classes/Control.xml:400 msgid "" "Creates an [InputEventMouseButton] that attempts to click the control. If " "the event is received, the control acquires focus.\n" @@ -14265,100 +13826,100 @@ msgid "" "[/codeblock]" msgstr "" -#: doc/classes/Control.xml:409 +#: doc/classes/Control.xml:411 msgid "" "Steal the focus from another control and become the focused control (see " "[member focus_mode])." msgstr "" -#: doc/classes/Control.xml:420 +#: doc/classes/Control.xml:418 +msgid "" +"Returns [code]true[/code] if this is the current focused control. See " +"[member focus_mode]." +msgstr "" + +#: doc/classes/Control.xml:427 +msgid "" +"Virtual method to be implemented by the user. Returns whether the given " +"[code]point[/code] is inside this control.\n" +"If not overridden, default behavior is checking if the point is within " +"control's Rect.\n" +"[b]Note:[/b] If you want to check if a point is inside the control, you can " +"use [code]get_rect().has_point(point)[/code]." +msgstr "" + +#: doc/classes/Control.xml:440 msgid "" "Returns [code]true[/code] if [Color] with given [code]name[/code] and " "associated with [Control] of given [code]type[/code] exists in assigned " "[Theme]." msgstr "" -#: doc/classes/Control.xml:429 +#: doc/classes/Control.xml:449 msgid "" "Returns [code]true[/code] if [Color] with given [code]name[/code] has a " "valid override in this [Control] node." msgstr "" -#: doc/classes/Control.xml:440 +#: doc/classes/Control.xml:460 msgid "" "Returns [code]true[/code] if constant with given [code]name[/code] and " "associated with [Control] of given [code]type[/code] exists in assigned " "[Theme]." msgstr "" -#: doc/classes/Control.xml:449 +#: doc/classes/Control.xml:469 msgid "" "Returns [code]true[/code] if constant with given [code]name[/code] has a " "valid override in this [Control] node." msgstr "" -#: doc/classes/Control.xml:456 -msgid "" -"Returns [code]true[/code] if this is the current focused control. See " -"[member focus_mode]." -msgstr "" - -#: doc/classes/Control.xml:467 +#: doc/classes/Control.xml:480 msgid "" "Returns [code]true[/code] if font with given [code]name[/code] and " "associated with [Control] of given [code]type[/code] exists in assigned " "[Theme]." msgstr "" -#: doc/classes/Control.xml:476 +#: doc/classes/Control.xml:489 msgid "" "Returns [code]true[/code] if font with given [code]name[/code] has a valid " "override in this [Control] node." msgstr "" -#: doc/classes/Control.xml:487 +#: doc/classes/Control.xml:500 msgid "" "Returns [code]true[/code] if icon with given [code]name[/code] and " "associated with [Control] of given [code]type[/code] exists in assigned " "[Theme]." msgstr "" -#: doc/classes/Control.xml:496 +#: doc/classes/Control.xml:509 msgid "" "Returns [code]true[/code] if icon with given [code]name[/code] has a valid " "override in this [Control] node." msgstr "" -#: doc/classes/Control.xml:505 -msgid "" -"Virtual method to be implemented by the user. Returns whether the given " -"[code]point[/code] is inside this control.\n" -"If not overridden, default behavior is checking if the point is within " -"control's Rect.\n" -"[b]Note:[/b] If you want to check if a point is inside the control, you can " -"use [code]get_rect().has_point(point)[/code]." -msgstr "" - -#: doc/classes/Control.xml:516 +#: doc/classes/Control.xml:518 msgid "" "Returns [code]true[/code] if [Shader] with given [code]name[/code] has a " "valid override in this [Control] node." msgstr "" -#: doc/classes/Control.xml:527 +#: doc/classes/Control.xml:529 msgid "" "Returns [code]true[/code] if [StyleBox] with given [code]name[/code] and " "associated with [Control] of given [code]type[/code] exists in assigned " "[Theme]." msgstr "" -#: doc/classes/Control.xml:536 +#: doc/classes/Control.xml:538 msgid "" "Returns [code]true[/code] if [StyleBox] with given [code]name[/code] has a " "valid override in this [Control] node." msgstr "" -#: doc/classes/Control.xml:543 +#: doc/classes/Control.xml:545 msgid "" "Invalidates the size cache in this node and in parent nodes up to toplevel. " "Intended to be used with [method get_minimum_size] when the return value is " @@ -14366,12 +13927,12 @@ msgid "" "automatically." msgstr "" -#: doc/classes/Control.xml:550 +#: doc/classes/Control.xml:552 msgid "" "Give up the focus. No other control will be able to receive keyboard input." msgstr "" -#: doc/classes/Control.xml:565 +#: doc/classes/Control.xml:567 msgid "" "Sets the anchor identified by [code]margin[/code] constant from [enum " "Margin] enum to value [code]anchor[/code]. A setter method for [member " @@ -14387,20 +13948,20 @@ msgid "" "would get value 0.5." msgstr "" -#: doc/classes/Control.xml:582 +#: doc/classes/Control.xml:584 msgid "" "Works the same as [method set_anchor], but instead of [code]keep_margin[/" "code] argument and automatic update of margin, it allows to set the margin " "offset yourself (see [method set_margin])." msgstr "" -#: doc/classes/Control.xml:595 +#: doc/classes/Control.xml:597 msgid "" "Sets both anchor preset and margin preset. See [method set_anchors_preset] " "and [method set_margins_preset]." msgstr "" -#: doc/classes/Control.xml:606 +#: doc/classes/Control.xml:608 msgid "" "Sets the anchors to a [code]preset[/code] from [enum Control.LayoutPreset] " "enum. This is code equivalent of using the Layout menu in 2D editor.\n" @@ -14408,13 +13969,13 @@ msgid "" "also be updated." msgstr "" -#: doc/classes/Control.xml:616 +#: doc/classes/Control.xml:618 msgid "" "Sets [member margin_left] and [member margin_top] at the same time. " "Equivalent of changing [member rect_position]." msgstr "" -#: doc/classes/Control.xml:625 +#: doc/classes/Control.xml:627 msgid "" "Forwards the handling of this control's drag and drop to [code]target[/code] " "control.\n" @@ -14444,7 +14005,7 @@ msgid "" "[/codeblock]" msgstr "" -#: doc/classes/Control.xml:655 +#: doc/classes/Control.xml:657 msgid "" "Shows the given control at the mouse pointer. A good time to call this " "method is in [method get_drag_data]. The control must not be in the scene " @@ -14462,11 +14023,11 @@ msgid "" "[/codeblock]" msgstr "" -#: doc/classes/Control.xml:675 +#: doc/classes/Control.xml:677 msgid "Sets [member margin_right] and [member margin_bottom] at the same time." msgstr "" -#: doc/classes/Control.xml:686 +#: doc/classes/Control.xml:688 msgid "" "Sets the anchor identified by [code]margin[/code] constant from [enum " "Margin] enum to [Control] at [code]neighbor[/code] node path. A setter " @@ -14474,14 +14035,14 @@ msgid "" "[member focus_neighbour_right] and [member focus_neighbour_top]." msgstr "" -#: doc/classes/Control.xml:697 +#: doc/classes/Control.xml:699 msgid "" "Sets the [member rect_global_position] to given [code]position[/code].\n" "If [code]keep_margins[/code] is [code]true[/code], control's anchors will be " "updated instead of margins." msgstr "" -#: doc/classes/Control.xml:709 +#: doc/classes/Control.xml:711 msgid "" "Sets the margin identified by [code]margin[/code] constant from [enum " "Margin] enum to given [code]offset[/code]. A setter method for [member " @@ -14489,7 +14050,7 @@ msgid "" "margin_top]." msgstr "" -#: doc/classes/Control.xml:722 +#: doc/classes/Control.xml:724 msgid "" "Sets the margins to a [code]preset[/code] from [enum Control.LayoutPreset] " "enum. This is code equivalent of using the Layout menu in 2D editor.\n" @@ -14501,42 +14062,31 @@ msgid "" "and the edges." msgstr "" -#: doc/classes/Control.xml:735 +#: doc/classes/Control.xml:737 msgid "" "Sets the [member rect_position] to given [code]position[/code].\n" "If [code]keep_margins[/code] is [code]true[/code], control's anchors will be " "updated instead of margins." msgstr "" -#: doc/classes/Control.xml:745 +#: doc/classes/Control.xml:747 msgid "Sets the rotation (in radians)." msgstr "" -#: doc/classes/Control.xml:756 +#: doc/classes/Control.xml:758 msgid "" "Sets the size (see [member rect_size]).\n" "If [code]keep_margins[/code] is [code]true[/code], control's anchors will be " "updated instead of margins." msgstr "" -#: doc/classes/Control.xml:766 -msgid "" -"Displays a control as modal. Control must be a subwindow. Modal controls " -"capture the input signals until closed or the area outside them is accessed. " -"When a modal control loses focus, or the ESC key is pressed, they " -"automatically hide. Modal controls are used extensively for popup dialogs " -"and menus.\n" -"If [code]exclusive[/code] is [code]true[/code], other controls will not " -"receive input and clicking outside this control will not close it." -msgstr "" - -#: doc/classes/Control.xml:776 +#: doc/classes/Control.xml:768 msgid "" "Moves the mouse cursor to [code]to_position[/code], relative to [member " "rect_position] of this [Control]." msgstr "" -#: doc/classes/Control.xml:782 +#: doc/classes/Control.xml:774 msgid "" "Anchors the bottom edge of the node to the origin, the center, or the end of " "its parent control. It changes how the bottom margin updates when the node " @@ -14544,7 +14094,7 @@ msgid "" "convenience." msgstr "" -#: doc/classes/Control.xml:785 +#: doc/classes/Control.xml:777 msgid "" "Anchors the left edge of the node to the origin, the center or the end of " "its parent control. It changes how the left margin updates when the node " @@ -14552,7 +14102,7 @@ msgid "" "convenience." msgstr "" -#: doc/classes/Control.xml:788 +#: doc/classes/Control.xml:780 msgid "" "Anchors the right edge of the node to the origin, the center or the end of " "its parent control. It changes how the right margin updates when the node " @@ -14560,7 +14110,7 @@ msgid "" "convenience." msgstr "" -#: doc/classes/Control.xml:791 +#: doc/classes/Control.xml:783 msgid "" "Anchors the top edge of the node to the origin, the center or the end of its " "parent control. It changes how the top margin updates when the node moves or " @@ -14568,13 +14118,13 @@ msgid "" "convenience." msgstr "" -#: doc/classes/Control.xml:794 +#: doc/classes/Control.xml:786 msgid "" "The focus access mode for the control (None, Click or All). Only one Control " "can be focused at the same time, and it will receive keyboard signals." msgstr "" -#: doc/classes/Control.xml:797 +#: doc/classes/Control.xml:789 msgid "" "Tells Godot which node it should give keyboard focus to if the user presses " "the down arrow on the keyboard or down on a gamepad by default. You can " @@ -14583,7 +14133,7 @@ msgid "" "the closest [Control] to the bottom of this one." msgstr "" -#: doc/classes/Control.xml:800 +#: doc/classes/Control.xml:792 msgid "" "Tells Godot which node it should give keyboard focus to if the user presses " "the left arrow on the keyboard or left on a gamepad by default. You can " @@ -14592,7 +14142,7 @@ msgid "" "the closest [Control] to the left of this one." msgstr "" -#: doc/classes/Control.xml:803 +#: doc/classes/Control.xml:795 msgid "" "Tells Godot which node it should give keyboard focus to if the user presses " "the right arrow on the keyboard or right on a gamepad by default. You can " @@ -14601,7 +14151,7 @@ msgid "" "the closest [Control] to the bottom of this one." msgstr "" -#: doc/classes/Control.xml:806 +#: doc/classes/Control.xml:798 msgid "" "Tells Godot which node it should give keyboard focus to if the user presses " "the top arrow on the keyboard or top on a gamepad by default. You can change " @@ -14610,39 +14160,39 @@ msgid "" "[Control] to the bottom of this one." msgstr "" -#: doc/classes/Control.xml:809 +#: 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 "" -#: doc/classes/Control.xml:813 +#: 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 "" -#: doc/classes/Control.xml:817 +#: doc/classes/Control.xml:809 msgid "" "Controls the direction on the horizontal axis in which the control should " "grow if its horizontal minimum size is changed to be greater than its " "current size, as the control always has to be at least the minimum size." msgstr "" -#: doc/classes/Control.xml:820 +#: doc/classes/Control.xml:812 msgid "" "Controls the direction on the vertical axis in which the control should grow " "if its vertical minimum size is changed to be greater than its current size, " "as the control always has to be at least the minimum size." msgstr "" -#: doc/classes/Control.xml:823 +#: doc/classes/Control.xml:815 msgid "" "Changes the tooltip text. The tooltip appears when the user's mouse cursor " "stays idle over this control for a few moments, provided that the [member " @@ -14651,7 +14201,7 @@ msgid "" "tooltip_delay_sec[/code] option in Project Settings." msgstr "" -#: doc/classes/Control.xml:826 +#: doc/classes/Control.xml:818 msgid "" "Distance between the node's bottom edge and its parent control, based on " "[member anchor_bottom].\n" @@ -14660,7 +14210,7 @@ msgid "" "[Container]. Margins update automatically when you move or resize the node." msgstr "" -#: doc/classes/Control.xml:830 +#: doc/classes/Control.xml:822 msgid "" "Distance between the node's left edge and its parent control, based on " "[member anchor_left].\n" @@ -14669,7 +14219,7 @@ msgid "" "[Container]. Margins update automatically when you move or resize the node." msgstr "" -#: doc/classes/Control.xml:834 +#: doc/classes/Control.xml:826 msgid "" "Distance between the node's right edge and its parent control, based on " "[member anchor_right].\n" @@ -14678,7 +14228,7 @@ msgid "" "[Container]. Margins update automatically when you move or resize the node." msgstr "" -#: doc/classes/Control.xml:838 +#: doc/classes/Control.xml:830 msgid "" "Distance between the node's top edge and its parent control, based on " "[member anchor_top].\n" @@ -14687,7 +14237,7 @@ msgid "" "[Container]. Margins update automatically when you move or resize the node." msgstr "" -#: doc/classes/Control.xml:842 +#: doc/classes/Control.xml:834 msgid "" "The default cursor shape for this control. Useful for Godot plugins and " "applications or games that use the system's mouse cursors.\n" @@ -14695,7 +14245,7 @@ msgid "" "system." msgstr "" -#: doc/classes/Control.xml:846 +#: doc/classes/Control.xml:838 msgid "" "Controls whether the control will be able to receive mouse button input " "events through [method _gui_input] and how these events should be handled. " @@ -14703,20 +14253,20 @@ msgid "" "and [signal mouse_exited] signals. See the constants to learn what each does." msgstr "" -#: doc/classes/Control.xml:849 +#: 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:852 +#: doc/classes/Control.xml:844 msgid "" "The node's global position, relative to the world (usually to the top-left " "corner of the window)." msgstr "" -#: doc/classes/Control.xml:855 +#: doc/classes/Control.xml:847 msgid "" "The minimum size of the node's bounding rectangle. If you set it to a value " "greater than (0, 0), the node's bounding rectangle will always have at least " @@ -14724,46 +14274,46 @@ msgid "" "sizes automatically to fit its content, be it a texture or child nodes." msgstr "" -#: doc/classes/Control.xml:858 +#: doc/classes/Control.xml:850 msgid "" "By default, the node's pivot is its top-left corner. When you change its " "[member rect_scale], it will scale around this pivot. Set this property to " "[member rect_size] / 2 to center the pivot in the node's rectangle." msgstr "" -#: doc/classes/Control.xml:861 +#: doc/classes/Control.xml:853 msgid "" "The node's position, relative to its parent. It corresponds to the " "rectangle's top-left corner. The property is not affected by [member " "rect_pivot_offset]." msgstr "" -#: doc/classes/Control.xml:864 +#: doc/classes/Control.xml:856 msgid "" "The node's rotation around its pivot, in degrees. See [member " "rect_pivot_offset] to change the pivot's position." msgstr "" -#: doc/classes/Control.xml:867 +#: doc/classes/Control.xml:859 msgid "" "The node's scale, relative to its [member rect_size]. Change this property " "to scale the node around its [member rect_pivot_offset]." msgstr "" -#: doc/classes/Control.xml:870 +#: doc/classes/Control.xml:862 msgid "" "The size of the node's bounding rectangle, in pixels. [Container] nodes " "update this property automatically." msgstr "" -#: doc/classes/Control.xml:873 +#: doc/classes/Control.xml:865 msgid "" "Tells the parent [Container] nodes how they should resize and place the node " "on the X axis. Use one of the [enum SizeFlags] constants to change the " "flags. See the constants to learn what each does." msgstr "" -#: doc/classes/Control.xml:876 +#: doc/classes/Control.xml:868 msgid "" "If the node and at least one of its neighbours uses the [constant " "SIZE_EXPAND] size flag, the parent [Container] will let it take more or less " @@ -14772,189 +14322,181 @@ msgid "" "space." msgstr "" -#: doc/classes/Control.xml:879 +#: doc/classes/Control.xml:871 msgid "" "Tells the parent [Container] nodes how they should resize and place the node " "on the Y axis. Use one of the [enum SizeFlags] constants to change the " "flags. See the constants to learn what each does." msgstr "" -#: doc/classes/Control.xml:882 +#: doc/classes/Control.xml:874 msgid "" "Changing this property replaces the current [Theme] resource this node and " "all its [Control] children use." msgstr "" -#: doc/classes/Control.xml:888 +#: doc/classes/Control.xml:880 msgid "Emitted when the node gains keyboard focus." msgstr "" -#: doc/classes/Control.xml:893 +#: doc/classes/Control.xml:885 msgid "Emitted when the node loses keyboard focus." msgstr "" -#: doc/classes/Control.xml:900 +#: doc/classes/Control.xml:892 msgid "Emitted when the node receives an [InputEvent]." msgstr "" -#: doc/classes/Control.xml:905 +#: doc/classes/Control.xml:897 msgid "Emitted when the node's minimum size changes." msgstr "" -#: doc/classes/Control.xml:910 -msgid "Emitted when a modal [Control] is closed. See [method show_modal]." -msgstr "" - -#: doc/classes/Control.xml:915 +#: doc/classes/Control.xml:902 msgid "" "Emitted when the mouse enters the control's [code]Rect[/code] area, provided " "its [member mouse_filter] lets the event reach it." msgstr "" -#: doc/classes/Control.xml:920 +#: doc/classes/Control.xml:907 msgid "" "Emitted when the mouse leaves the control's [code]Rect[/code] area, provided " "its [member mouse_filter] lets the event reach it." msgstr "" -#: doc/classes/Control.xml:925 +#: doc/classes/Control.xml:912 msgid "Emitted when the control changes size." msgstr "" -#: doc/classes/Control.xml:930 +#: doc/classes/Control.xml:917 msgid "" "Emitted when one of the size flags changes. See [member " "size_flags_horizontal] and [member size_flags_vertical]." msgstr "" -#: doc/classes/Control.xml:936 +#: doc/classes/Control.xml:927 msgid "The node cannot grab focus. Use with [member focus_mode]." msgstr "" -#: doc/classes/Control.xml:939 +#: doc/classes/Control.xml:930 msgid "" "The node can only grab focus on mouse clicks. Use with [member focus_mode]." msgstr "" -#: doc/classes/Control.xml:942 +#: doc/classes/Control.xml:933 msgid "" "The node can grab focus on mouse click or using the arrows and the Tab keys " "on the keyboard. Use with [member focus_mode]." msgstr "" -#: doc/classes/Control.xml:945 +#: doc/classes/Control.xml:936 msgid "" "Sent when the node changes size. Use [member rect_size] to get the new size." msgstr "" -#: doc/classes/Control.xml:948 +#: doc/classes/Control.xml:939 msgid "Sent when the mouse pointer enters the node." msgstr "" -#: doc/classes/Control.xml:951 +#: doc/classes/Control.xml:942 msgid "Sent when the mouse pointer exits the node." msgstr "" -#: doc/classes/Control.xml:954 +#: doc/classes/Control.xml:945 msgid "Sent when the node grabs focus." msgstr "" -#: doc/classes/Control.xml:957 +#: doc/classes/Control.xml:948 msgid "Sent when the node loses focus." msgstr "" -#: doc/classes/Control.xml:960 +#: doc/classes/Control.xml:951 msgid "" "Sent when the node's [member theme] changes, right before Godot redraws the " -"control. Happens when you call one of the [code]add_*_override[/code] " +"control. Happens when you call one of the [code]add_theme_*_override[/code] " "methods." msgstr "" -#: doc/classes/Control.xml:963 -msgid "Sent when an open modal dialog closes. See [method show_modal]." -msgstr "" - -#: doc/classes/Control.xml:966 +#: doc/classes/Control.xml:954 msgid "" "Sent when this node is inside a [ScrollContainer] which has begun being " "scrolled." msgstr "" -#: doc/classes/Control.xml:969 +#: doc/classes/Control.xml:957 msgid "" "Sent when this node is inside a [ScrollContainer] which has stopped being " "scrolled." msgstr "" -#: doc/classes/Control.xml:972 +#: doc/classes/Control.xml:960 msgid "" "Show the system's arrow mouse cursor when the user hovers the node. Use with " "[member mouse_default_cursor_shape]." msgstr "" -#: doc/classes/Control.xml:975 +#: doc/classes/Control.xml:963 msgid "" "Show the system's I-beam mouse cursor when the user hovers the node. The I-" "beam pointer has a shape similar to \"I\". It tells the user they can " "highlight or insert text." msgstr "" -#: doc/classes/Control.xml:978 +#: doc/classes/Control.xml:966 msgid "" "Show the system's pointing hand mouse cursor when the user hovers the node." msgstr "" -#: doc/classes/Control.xml:981 +#: doc/classes/Control.xml:969 msgid "Show the system's cross mouse cursor when the user hovers the node." msgstr "" -#: doc/classes/Control.xml:984 +#: doc/classes/Control.xml:972 msgid "" "Show the system's wait mouse cursor, often an hourglass, when the user " "hovers the node." msgstr "" -#: doc/classes/Control.xml:987 +#: doc/classes/Control.xml:975 msgid "" "Show the system's busy mouse cursor when the user hovers the node. Often an " "hourglass." msgstr "" -#: doc/classes/Control.xml:990 +#: doc/classes/Control.xml:978 msgid "" "Show the system's drag mouse cursor, often a closed fist or a cross symbol, " "when the user hovers the node. It tells the user they're currently dragging " "an item, like a node in the Scene dock." msgstr "" -#: doc/classes/Control.xml:993 +#: doc/classes/Control.xml:981 msgid "" "Show the system's drop mouse cursor when the user hovers the node. It can be " "an open hand. It tells the user they can drop an item they're currently " "grabbing, like a node in the Scene dock." msgstr "" -#: doc/classes/Control.xml:996 +#: doc/classes/Control.xml:984 msgid "" "Show the system's forbidden mouse cursor when the user hovers the node. " "Often a crossed circle." msgstr "" -#: doc/classes/Control.xml:999 +#: doc/classes/Control.xml:987 msgid "" "Show the system's vertical resize mouse cursor when the user hovers the " "node. A double-headed vertical arrow. It tells the user they can resize the " "window or the panel vertically." msgstr "" -#: doc/classes/Control.xml:1002 +#: doc/classes/Control.xml:990 msgid "" "Show the system's horizontal resize mouse cursor when the user hovers the " "node. A double-headed horizontal arrow. It tells the user they can resize " "the window or the panel horizontally." msgstr "" -#: doc/classes/Control.xml:1005 +#: doc/classes/Control.xml:993 msgid "" "Show the system's window resize mouse cursor when the user hovers the node. " "The cursor is a double-headed arrow that goes from the bottom left to the " @@ -14962,7 +14504,7 @@ msgid "" "horizontally and vertically." msgstr "" -#: doc/classes/Control.xml:1008 +#: doc/classes/Control.xml:996 msgid "" "Show the system's window resize mouse cursor when the user hovers the node. " "The cursor is a double-headed arrow that goes from the top left to the " @@ -14970,93 +14512,93 @@ msgid "" "they can resize the window or the panel both horizontally and vertically." msgstr "" -#: doc/classes/Control.xml:1011 +#: doc/classes/Control.xml:999 msgid "" "Show the system's move mouse cursor when the user hovers the node. It shows " "2 double-headed arrows at a 90 degree angle. It tells the user they can move " "a UI element freely." msgstr "" -#: doc/classes/Control.xml:1014 +#: doc/classes/Control.xml:1002 msgid "" "Show the system's vertical split mouse cursor when the user hovers the node. " "On Windows, it's the same as [constant CURSOR_VSIZE]." msgstr "" -#: doc/classes/Control.xml:1017 +#: doc/classes/Control.xml:1005 msgid "" "Show the system's horizontal split mouse cursor when the user hovers the " "node. On Windows, it's the same as [constant CURSOR_HSIZE]." msgstr "" -#: doc/classes/Control.xml:1020 +#: doc/classes/Control.xml:1008 msgid "" "Show the system's help mouse cursor when the user hovers the node, a " "question mark." msgstr "" -#: doc/classes/Control.xml:1023 +#: doc/classes/Control.xml:1011 msgid "" "Snap all 4 anchors to the top-left of the parent control's bounds. Use with " "[method set_anchors_preset]." msgstr "" -#: doc/classes/Control.xml:1026 +#: doc/classes/Control.xml:1014 msgid "" "Snap all 4 anchors to the top-right of the parent control's bounds. Use with " "[method set_anchors_preset]." msgstr "" -#: doc/classes/Control.xml:1029 +#: doc/classes/Control.xml:1017 msgid "" "Snap all 4 anchors to the bottom-left of the parent control's bounds. Use " "with [method set_anchors_preset]." msgstr "" -#: doc/classes/Control.xml:1032 +#: doc/classes/Control.xml:1020 msgid "" "Snap all 4 anchors to the bottom-right of the parent control's bounds. Use " "with [method set_anchors_preset]." msgstr "" -#: doc/classes/Control.xml:1035 +#: doc/classes/Control.xml:1023 msgid "" "Snap all 4 anchors to the center of the left edge of the parent control's " "bounds. Use with [method set_anchors_preset]." msgstr "" -#: doc/classes/Control.xml:1038 +#: doc/classes/Control.xml:1026 msgid "" "Snap all 4 anchors to the center of the top edge of the parent control's " "bounds. Use with [method set_anchors_preset]." msgstr "" -#: doc/classes/Control.xml:1041 +#: doc/classes/Control.xml:1029 msgid "" "Snap all 4 anchors to the center of the right edge of the parent control's " "bounds. Use with [method set_anchors_preset]." msgstr "" -#: doc/classes/Control.xml:1044 +#: doc/classes/Control.xml:1032 msgid "" "Snap all 4 anchors to the center of the bottom edge of the parent control's " "bounds. Use with [method set_anchors_preset]." msgstr "" -#: doc/classes/Control.xml:1047 +#: doc/classes/Control.xml:1035 msgid "" "Snap all 4 anchors to the center of the parent control's bounds. Use with " "[method set_anchors_preset]." msgstr "" -#: doc/classes/Control.xml:1050 +#: doc/classes/Control.xml:1038 msgid "" "Snap all 4 anchors to the left edge of the parent control. The left margin " "becomes relative to the left edge and the top margin relative to the top " "left corner of the node's parent. Use with [method set_anchors_preset]." msgstr "" -#: doc/classes/Control.xml:1053 +#: doc/classes/Control.xml:1041 msgid "" "Snap all 4 anchors to the top edge of the parent control. The left margin " "becomes relative to the top left corner, the top margin relative to the top " @@ -15064,14 +14606,14 @@ msgid "" "parent. Use with [method set_anchors_preset]." msgstr "" -#: doc/classes/Control.xml:1056 +#: doc/classes/Control.xml:1044 msgid "" "Snap all 4 anchors to the right edge of the parent control. The right margin " "becomes relative to the right edge and the top margin relative to the top " "right corner of the node's parent. Use with [method set_anchors_preset]." msgstr "" -#: doc/classes/Control.xml:1059 +#: doc/classes/Control.xml:1047 msgid "" "Snap all 4 anchors to the bottom edge of the parent control. The left margin " "becomes relative to the bottom left corner, the bottom margin relative to " @@ -15079,19 +14621,19 @@ msgid "" "the node's parent. Use with [method set_anchors_preset]." msgstr "" -#: doc/classes/Control.xml:1062 +#: doc/classes/Control.xml:1050 msgid "" "Snap all 4 anchors to a vertical line that cuts the parent control in half. " "Use with [method set_anchors_preset]." msgstr "" -#: doc/classes/Control.xml:1065 +#: doc/classes/Control.xml:1053 msgid "" "Snap all 4 anchors to a horizontal line that cuts the parent control in " "half. Use with [method set_anchors_preset]." msgstr "" -#: doc/classes/Control.xml:1068 +#: doc/classes/Control.xml:1056 msgid "" "Snap all 4 anchors to the respective corners of the parent control. Set all " "4 margins to 0 after you applied this preset and the [Control] will fit its " @@ -15099,30 +14641,30 @@ msgid "" "editor. Use with [method set_anchors_preset]." msgstr "" -#: doc/classes/Control.xml:1071 +#: doc/classes/Control.xml:1059 msgid "The control will be resized to its minimum size." msgstr "" -#: doc/classes/Control.xml:1074 +#: doc/classes/Control.xml:1062 msgid "The control's width will not change." msgstr "" -#: doc/classes/Control.xml:1077 +#: doc/classes/Control.xml:1065 msgid "The control's height will not change." msgstr "" -#: doc/classes/Control.xml:1080 +#: doc/classes/Control.xml:1068 msgid "The control's size will not change." msgstr "" -#: doc/classes/Control.xml:1083 +#: doc/classes/Control.xml:1071 msgid "" "Tells the parent [Container] to expand the bounds of this node to fill all " "the available space without pushing any other node. Use with [member " "size_flags_horizontal] and [member size_flags_vertical]." msgstr "" -#: doc/classes/Control.xml:1086 +#: doc/classes/Control.xml:1074 msgid "" "Tells the parent [Container] to let this node take all the available space " "on the axis you flag. If multiple neighboring nodes are set to expand, " @@ -15131,13 +14673,13 @@ msgid "" "[member size_flags_vertical]." msgstr "" -#: doc/classes/Control.xml:1089 +#: doc/classes/Control.xml:1077 msgid "" "Sets the node's size flags to both fill and expand. See the 2 constants " "above for more information." msgstr "" -#: doc/classes/Control.xml:1092 +#: doc/classes/Control.xml:1080 msgid "" "Tells the parent [Container] to center the node in itself. It centers the " "control based on its bounding box, so it doesn't work with the fill or " @@ -15145,7 +14687,7 @@ msgid "" "size_flags_vertical]." msgstr "" -#: doc/classes/Control.xml:1095 +#: doc/classes/Control.xml:1083 msgid "" "Tells the parent [Container] to align the node with its end, either the " "bottom or the right edge. It doesn't work with the fill or expand size " @@ -15153,7 +14695,7 @@ msgid "" "size_flags_vertical]." msgstr "" -#: doc/classes/Control.xml:1098 +#: doc/classes/Control.xml:1086 msgid "" "The control will receive mouse button input events through [method " "_gui_input] if clicked on. And the control will receive the [signal " @@ -15162,7 +14704,7 @@ msgid "" "other controls. This also results in blocking signals in other controls." msgstr "" -#: doc/classes/Control.xml:1101 +#: doc/classes/Control.xml:1089 msgid "" "The control will receive mouse button input events through [method " "_gui_input] if clicked on. And the control will receive the [signal " @@ -15174,7 +14716,7 @@ msgid "" "not be fired." msgstr "" -#: doc/classes/Control.xml:1104 +#: doc/classes/Control.xml:1092 msgid "" "The control will not receive mouse button input events through [method " "_gui_input]. The control will also not receive the [signal mouse_entered] " @@ -15183,25 +14725,25 @@ msgid "" "handled automatically." msgstr "" -#: doc/classes/Control.xml:1107 +#: doc/classes/Control.xml:1095 msgid "" "The control will grow to the left or top to make up if its minimum size is " "changed to be greater than its current size on the respective axis." msgstr "" -#: doc/classes/Control.xml:1110 +#: doc/classes/Control.xml:1098 msgid "" "The control will grow to the right or bottom to make up if its minimum size " "is changed to be greater than its current size on the respective axis." msgstr "" -#: doc/classes/Control.xml:1113 +#: doc/classes/Control.xml:1101 msgid "" "The control will grow in both directions equally to make up if its minimum " "size is changed to be greater than its current size." msgstr "" -#: doc/classes/Control.xml:1116 +#: doc/classes/Control.xml:1104 msgid "" "Snaps one of the 4 anchor's sides to the origin of the node's [code]Rect[/" "code], in the top left. Use it with one of the [code]anchor_*[/code] member " @@ -15209,7 +14751,7 @@ msgid "" "[method set_anchors_preset]." msgstr "" -#: doc/classes/Control.xml:1119 +#: doc/classes/Control.xml:1107 msgid "" "Snaps one of the 4 anchor's sides to the end of the node's [code]Rect[/" "code], in the bottom right. Use it with one of the [code]anchor_*[/code] " @@ -15217,19 +14759,6 @@ msgid "" "once, use [method set_anchors_preset]." msgstr "" -#: doc/classes/ConvexPolygonShape.xml:4 -msgid "Convex polygon shape for 3D physics." -msgstr "" - -#: doc/classes/ConvexPolygonShape.xml:7 -msgid "" -"Convex polygon shape resource, which can be added to a [PhysicsBody] or area." -msgstr "" - -#: doc/classes/ConvexPolygonShape.xml:15 -msgid "The list of 3D points forming the convex polygon shape." -msgstr "" - #: doc/classes/ConvexPolygonShape2D.xml:4 msgid "Convex polygon shape for 2D physics." msgstr "" @@ -15259,382 +14788,389 @@ msgid "" "counterclockwise order." msgstr "" -#: doc/classes/CPUParticles.xml:4 -msgid "CPU-based 3D particle emitter." +#: doc/classes/ConvexPolygonShape3D.xml:4 +msgid "Convex polygon shape for 3D physics." msgstr "" -#: doc/classes/CPUParticles.xml:7 +#: doc/classes/ConvexPolygonShape3D.xml:7 msgid "" -"CPU-based 3D particle node used to create a variety of particle systems and " +"Convex polygon shape resource, which can be added to a [PhysicsBody3D] or " +"area." +msgstr "" + +#: doc/classes/ConvexPolygonShape3D.xml:15 +msgid "The list of 3D points forming the convex polygon shape." +msgstr "" + +#: doc/classes/CPUParticles2D.xml:4 +msgid "CPU-based 2D particle emitter." +msgstr "" + +#: doc/classes/CPUParticles2D.xml:7 +msgid "" +"CPU-based 2D particle node used to create a variety of particle systems and " "effects.\n" -"See also [Particles], which provides the same functionality with hardware " -"acceleration, but may not run on older devices." +"See also [GPUParticles2D], which provides the same functionality with " +"hardware acceleration, but may not run on older devices." msgstr "" -#: doc/classes/CPUParticles.xml:19 +#: doc/classes/CPUParticles2D.xml:11 doc/classes/GPUParticles2D.xml:11 msgid "" -"Sets this node's properties to match a given [Particles] node with an " +"https://docs.godotengine.org/en/latest/tutorials/2d/particle_systems_2d.html" +msgstr "" + +#: doc/classes/CPUParticles2D.xml:20 +msgid "" +"Sets this node's properties to match a given [GPUParticles2D] node with an " "assigned [ParticlesMaterial]." msgstr "" -#: doc/classes/CPUParticles.xml:28 doc/classes/CPUParticles2D.xml:29 +#: doc/classes/CPUParticles2D.xml:29 doc/classes/CPUParticles3D.xml:28 msgid "Returns the base value of the parameter specified by [enum Parameter]." msgstr "" -#: doc/classes/CPUParticles.xml:37 doc/classes/CPUParticles2D.xml:38 +#: doc/classes/CPUParticles2D.xml:38 doc/classes/CPUParticles3D.xml:37 msgid "Returns the [Curve] of the parameter specified by [enum Parameter]." msgstr "" -#: doc/classes/CPUParticles.xml:46 doc/classes/CPUParticles2D.xml:47 +#: doc/classes/CPUParticles2D.xml:47 doc/classes/CPUParticles3D.xml:46 msgid "" "Returns the randomness factor of the parameter specified by [enum Parameter]." msgstr "" -#: doc/classes/CPUParticles.xml:55 doc/classes/CPUParticles2D.xml:56 +#: doc/classes/CPUParticles2D.xml:56 doc/classes/CPUParticles3D.xml:55 msgid "" "Returns the enabled state of the given flag (see [enum Flags] for options)." msgstr "" -#: doc/classes/CPUParticles.xml:62 doc/classes/CPUParticles2D.xml:63 +#: doc/classes/CPUParticles2D.xml:63 doc/classes/CPUParticles3D.xml:62 msgid "Restarts the particle emitter." msgstr "" -#: doc/classes/CPUParticles.xml:73 doc/classes/CPUParticles2D.xml:74 +#: doc/classes/CPUParticles2D.xml:74 doc/classes/CPUParticles3D.xml:73 msgid "Sets the base value of the parameter specified by [enum Parameter]." msgstr "" -#: doc/classes/CPUParticles.xml:84 doc/classes/CPUParticles2D.xml:85 +#: doc/classes/CPUParticles2D.xml:85 doc/classes/CPUParticles3D.xml:84 msgid "Sets the [Curve] of the parameter specified by [enum Parameter]." msgstr "" -#: doc/classes/CPUParticles.xml:95 doc/classes/CPUParticles2D.xml:96 +#: doc/classes/CPUParticles2D.xml:96 doc/classes/CPUParticles3D.xml:95 msgid "" "Sets the randomness factor of the parameter specified by [enum Parameter]." msgstr "" -#: doc/classes/CPUParticles.xml:106 doc/classes/CPUParticles2D.xml:107 +#: doc/classes/CPUParticles2D.xml:107 doc/classes/CPUParticles3D.xml:106 msgid "Enables or disables the given flag (see [enum Flags] for options)." msgstr "" -#: doc/classes/CPUParticles.xml:112 doc/classes/CPUParticles2D.xml:113 -#: doc/classes/Particles2D.xml:31 +#: doc/classes/CPUParticles2D.xml:113 doc/classes/CPUParticles3D.xml:112 +#: doc/classes/GPUParticles2D.xml:31 msgid "Number of particles emitted in one emission cycle." msgstr "" -#: doc/classes/CPUParticles.xml:115 doc/classes/CPUParticles2D.xml:116 +#: doc/classes/CPUParticles2D.xml:116 doc/classes/CPUParticles3D.xml:115 msgid "Initial rotation applied to each particle, in degrees." msgstr "" -#: doc/classes/CPUParticles.xml:118 doc/classes/CPUParticles2D.xml:119 +#: doc/classes/CPUParticles2D.xml:119 doc/classes/CPUParticles3D.xml:118 msgid "Each particle's rotation will be animated along this [Curve]." msgstr "" -#: doc/classes/CPUParticles.xml:121 doc/classes/CPUParticles2D.xml:122 +#: doc/classes/CPUParticles2D.xml:122 doc/classes/CPUParticles3D.xml:121 #: doc/classes/ParticlesMaterial.xml:104 msgid "Rotation randomness ratio." msgstr "" -#: doc/classes/CPUParticles.xml:124 doc/classes/CPUParticles2D.xml:125 +#: doc/classes/CPUParticles2D.xml:125 doc/classes/CPUParticles3D.xml:124 msgid "" "Initial angular velocity applied to each particle. Sets the speed of " "rotation of the particle." msgstr "" -#: doc/classes/CPUParticles.xml:127 doc/classes/CPUParticles2D.xml:128 +#: doc/classes/CPUParticles2D.xml:128 doc/classes/CPUParticles3D.xml:127 msgid "Each particle's angular velocity will vary along this [Curve]." msgstr "" -#: doc/classes/CPUParticles.xml:130 doc/classes/CPUParticles2D.xml:131 +#: doc/classes/CPUParticles2D.xml:131 doc/classes/CPUParticles3D.xml:130 #: doc/classes/ParticlesMaterial.xml:114 msgid "Angular velocity randomness ratio." msgstr "" -#: doc/classes/CPUParticles.xml:133 doc/classes/CPUParticles2D.xml:134 +#: doc/classes/CPUParticles2D.xml:134 doc/classes/CPUParticles3D.xml:133 #: doc/classes/ParticlesMaterial.xml:117 msgid "Particle animation offset." msgstr "" -#: doc/classes/CPUParticles.xml:136 doc/classes/CPUParticles2D.xml:137 +#: doc/classes/CPUParticles2D.xml:137 doc/classes/CPUParticles3D.xml:136 msgid "Each particle's animation offset will vary along this [Curve]." msgstr "" -#: doc/classes/CPUParticles.xml:139 doc/classes/CPUParticles2D.xml:140 +#: doc/classes/CPUParticles2D.xml:140 doc/classes/CPUParticles3D.xml:139 #: doc/classes/ParticlesMaterial.xml:123 msgid "Animation offset randomness ratio." msgstr "" -#: doc/classes/CPUParticles.xml:142 doc/classes/CPUParticles2D.xml:143 +#: doc/classes/CPUParticles2D.xml:143 doc/classes/CPUParticles3D.xml:142 #: doc/classes/ParticlesMaterial.xml:126 msgid "Particle animation speed." msgstr "" -#: doc/classes/CPUParticles.xml:145 doc/classes/CPUParticles2D.xml:146 +#: doc/classes/CPUParticles2D.xml:146 doc/classes/CPUParticles3D.xml:145 msgid "Each particle's animation speed will vary along this [Curve]." msgstr "" -#: doc/classes/CPUParticles.xml:148 doc/classes/CPUParticles2D.xml:149 +#: doc/classes/CPUParticles2D.xml:149 doc/classes/CPUParticles3D.xml:148 #: doc/classes/ParticlesMaterial.xml:132 msgid "Animation speed randomness ratio." msgstr "" -#: doc/classes/CPUParticles.xml:151 doc/classes/CPUParticles.xml:154 -msgid "Unused for 3D particles." +#: doc/classes/CPUParticles2D.xml:152 +msgid "" +"Each particle's initial color. If [member texture] is defined, it will be " +"multiplied by this color." +msgstr "" + +#: doc/classes/CPUParticles2D.xml:155 +msgid "Each particle's color will vary along this [Gradient]." msgstr "" -#: doc/classes/CPUParticles.xml:157 doc/classes/CPUParticles2D.xml:158 +#: doc/classes/CPUParticles2D.xml:158 doc/classes/CPUParticles3D.xml:157 #: doc/classes/ParticlesMaterial.xml:141 msgid "The rate at which particles lose velocity." msgstr "" -#: doc/classes/CPUParticles.xml:160 doc/classes/CPUParticles2D.xml:161 +#: doc/classes/CPUParticles2D.xml:161 doc/classes/CPUParticles3D.xml:160 msgid "Damping will vary along this [Curve]." msgstr "" -#: doc/classes/CPUParticles.xml:163 doc/classes/CPUParticles2D.xml:164 +#: doc/classes/CPUParticles2D.xml:164 doc/classes/CPUParticles3D.xml:163 #: doc/classes/ParticlesMaterial.xml:147 msgid "Damping randomness ratio." msgstr "" -#: doc/classes/CPUParticles.xml:166 doc/classes/CPUParticles2D.xml:167 +#: doc/classes/CPUParticles2D.xml:167 doc/classes/CPUParticles3D.xml:166 #: doc/classes/ParticlesMaterial.xml:150 msgid "Unit vector specifying the particles' emission direction." msgstr "" -#: doc/classes/CPUParticles.xml:169 doc/classes/CPUParticles2D.xml:170 -#: doc/classes/Particles.xml:54 doc/classes/Particles2D.xml:34 +#: doc/classes/CPUParticles2D.xml:170 doc/classes/CPUParticles3D.xml:169 +#: doc/classes/GPUParticles2D.xml:34 doc/classes/GPUParticles3D.xml:54 msgid "Particle draw order. Uses [enum DrawOrder] values." msgstr "" -#: doc/classes/CPUParticles.xml:172 -msgid "" -"The rectangle's extents if [member emission_shape] is set to [constant " -"EMISSION_SHAPE_BOX]." -msgstr "" - -#: doc/classes/CPUParticles.xml:175 doc/classes/CPUParticles2D.xml:173 +#: doc/classes/CPUParticles2D.xml:173 doc/classes/CPUParticles3D.xml:175 msgid "" "Sets the [Color]s to modulate particles by when using [constant " "EMISSION_SHAPE_POINTS] or [constant EMISSION_SHAPE_DIRECTED_POINTS]." msgstr "" -#: doc/classes/CPUParticles.xml:178 doc/classes/CPUParticles2D.xml:176 +#: doc/classes/CPUParticles2D.xml:176 doc/classes/CPUParticles3D.xml:178 msgid "" "Sets the direction the particles will be emitted in when using [constant " "EMISSION_SHAPE_DIRECTED_POINTS]." msgstr "" -#: doc/classes/CPUParticles.xml:181 doc/classes/CPUParticles2D.xml:179 +#: doc/classes/CPUParticles2D.xml:179 doc/classes/CPUParticles3D.xml:181 msgid "" "Sets the initial positions to spawn particles when using [constant " "EMISSION_SHAPE_POINTS] or [constant EMISSION_SHAPE_DIRECTED_POINTS]." msgstr "" -#: doc/classes/CPUParticles.xml:184 doc/classes/CPUParticles2D.xml:185 +#: doc/classes/CPUParticles2D.xml:182 +msgid "" +"The rectangle's extents if [member emission_shape] is set to [constant " +"EMISSION_SHAPE_RECTANGLE]." +msgstr "" + +#: doc/classes/CPUParticles2D.xml:185 doc/classes/CPUParticles3D.xml:184 msgid "" "Particles will be emitted inside this region. See [enum EmissionShape] for " "possible values." msgstr "" -#: doc/classes/CPUParticles.xml:187 +#: doc/classes/CPUParticles2D.xml:188 msgid "" -"The sphere's radius if [enum EmissionShape] is set to [constant " +"The sphere's radius if [member emission_shape] is set to [constant " "EMISSION_SHAPE_SPHERE]." msgstr "" -#: doc/classes/CPUParticles.xml:190 doc/classes/CPUParticles2D.xml:191 -#: doc/classes/Particles.xml:72 doc/classes/Particles2D.xml:37 +#: doc/classes/CPUParticles2D.xml:191 doc/classes/CPUParticles3D.xml:190 +#: doc/classes/GPUParticles2D.xml:37 doc/classes/GPUParticles3D.xml:72 msgid "If [code]true[/code], particles are being emitted." msgstr "" -#: doc/classes/CPUParticles.xml:193 doc/classes/CPUParticles2D.xml:194 -#: doc/classes/Particles2D.xml:40 +#: doc/classes/CPUParticles2D.xml:194 doc/classes/CPUParticles3D.xml:193 +#: doc/classes/GPUParticles2D.xml:40 msgid "" "How rapidly particles in an emission cycle are emitted. If greater than " "[code]0[/code], there will be a gap in emissions before the next cycle " "begins." msgstr "" -#: doc/classes/CPUParticles.xml:196 +#: doc/classes/CPUParticles2D.xml:197 doc/classes/GPUParticles2D.xml:43 +#: doc/classes/GPUParticles3D.xml:78 msgid "" "The particle system's frame rate is fixed to a value. For instance, changing " "the value to 2 will make the particles render at 2 frames per second. Note " -"this does not slow down the particle system itself." +"this does not slow down the simulation of the particle system itself." msgstr "" -#: doc/classes/CPUParticles.xml:199 doc/classes/CPUParticles2D.xml:200 +#: doc/classes/CPUParticles2D.xml:200 doc/classes/CPUParticles3D.xml:199 #: doc/classes/ParticlesMaterial.xml:174 msgid "Align Y axis of particle with the direction of its velocity." msgstr "" -#: doc/classes/CPUParticles.xml:202 doc/classes/ParticlesMaterial.xml:177 -msgid "If [code]true[/code], particles will not move on the z axis." -msgstr "" - -#: doc/classes/CPUParticles.xml:205 doc/classes/ParticlesMaterial.xml:180 -msgid "If [code]true[/code], particles rotate around Y axis by [member angle]." -msgstr "" - -#: doc/classes/CPUParticles.xml:208 doc/classes/ParticlesMaterial.xml:183 -msgid "" -"Amount of [member spread] in Y/Z plane. A value of [code]1[/code] restricts " -"particles to X/Z plane." -msgstr "" - -#: doc/classes/CPUParticles.xml:211 doc/classes/CPUParticles2D.xml:203 -#: doc/classes/Particles.xml:81 doc/classes/Particles2D.xml:46 +#: doc/classes/CPUParticles2D.xml:203 doc/classes/CPUParticles3D.xml:211 +#: doc/classes/GPUParticles2D.xml:46 doc/classes/GPUParticles3D.xml:81 msgid "" "If [code]true[/code], results in fractional delta calculation which has a " "smoother particles display effect." msgstr "" -#: doc/classes/CPUParticles.xml:214 doc/classes/CPUParticles2D.xml:206 +#: doc/classes/CPUParticles2D.xml:206 doc/classes/CPUParticles3D.xml:214 #: doc/classes/ParticlesMaterial.xml:186 msgid "Gravity applied to every particle." msgstr "" -#: doc/classes/CPUParticles.xml:217 doc/classes/CPUParticles2D.xml:209 +#: doc/classes/CPUParticles2D.xml:209 doc/classes/CPUParticles3D.xml:217 #: doc/classes/ParticlesMaterial.xml:189 msgid "Initial hue variation applied to each particle." msgstr "" -#: doc/classes/CPUParticles.xml:220 doc/classes/CPUParticles2D.xml:212 +#: doc/classes/CPUParticles2D.xml:212 doc/classes/CPUParticles3D.xml:220 msgid "Each particle's hue will vary along this [Curve]." msgstr "" -#: doc/classes/CPUParticles.xml:223 doc/classes/CPUParticles2D.xml:215 +#: doc/classes/CPUParticles2D.xml:215 doc/classes/CPUParticles3D.xml:223 #: doc/classes/ParticlesMaterial.xml:195 msgid "Hue variation randomness ratio." msgstr "" -#: doc/classes/CPUParticles.xml:226 doc/classes/CPUParticles2D.xml:218 +#: doc/classes/CPUParticles2D.xml:218 doc/classes/CPUParticles3D.xml:226 #: doc/classes/ParticlesMaterial.xml:198 msgid "" "Initial velocity magnitude for each particle. Direction comes from [member " "spread] and the node's orientation." msgstr "" -#: doc/classes/CPUParticles.xml:229 doc/classes/CPUParticles2D.xml:221 +#: doc/classes/CPUParticles2D.xml:221 doc/classes/CPUParticles3D.xml:229 #: doc/classes/ParticlesMaterial.xml:201 msgid "Initial velocity randomness ratio." msgstr "" -#: doc/classes/CPUParticles.xml:232 doc/classes/CPUParticles2D.xml:224 -#: doc/classes/Particles.xml:84 doc/classes/Particles2D.xml:49 +#: doc/classes/CPUParticles2D.xml:224 doc/classes/CPUParticles3D.xml:232 +#: doc/classes/GPUParticles2D.xml:49 doc/classes/GPUParticles3D.xml:84 msgid "Amount of time each particle will exist." msgstr "" -#: doc/classes/CPUParticles.xml:235 doc/classes/CPUParticles2D.xml:227 +#: doc/classes/CPUParticles2D.xml:227 doc/classes/CPUParticles3D.xml:235 #: doc/classes/ParticlesMaterial.xml:204 msgid "Particle lifetime randomness ratio." msgstr "" -#: doc/classes/CPUParticles.xml:238 doc/classes/CPUParticles2D.xml:230 +#: doc/classes/CPUParticles2D.xml:230 doc/classes/CPUParticles3D.xml:238 #: doc/classes/ParticlesMaterial.xml:207 msgid "" "Linear acceleration applied to each particle in the direction of motion." msgstr "" -#: doc/classes/CPUParticles.xml:241 doc/classes/CPUParticles2D.xml:233 +#: doc/classes/CPUParticles2D.xml:233 doc/classes/CPUParticles3D.xml:241 msgid "Each particle's linear acceleration will vary along this [Curve]." msgstr "" -#: doc/classes/CPUParticles.xml:244 doc/classes/CPUParticles2D.xml:236 +#: doc/classes/CPUParticles2D.xml:236 doc/classes/CPUParticles3D.xml:244 #: doc/classes/ParticlesMaterial.xml:213 msgid "Linear acceleration randomness ratio." msgstr "" -#: doc/classes/CPUParticles.xml:247 doc/classes/CPUParticles2D.xml:239 -#: doc/classes/Particles.xml:87 doc/classes/Particles2D.xml:52 +#: doc/classes/CPUParticles2D.xml:239 doc/classes/CPUParticles3D.xml:247 +#: doc/classes/GPUParticles2D.xml:52 doc/classes/GPUParticles3D.xml:87 msgid "" "If [code]true[/code], particles use the parent node's coordinate space. If " "[code]false[/code], they use global coordinates." msgstr "" -#: doc/classes/CPUParticles.xml:250 -msgid "" -"The [Mesh] used for each particle. If [code]null[/code], particles will be " -"spheres." +#: doc/classes/CPUParticles2D.xml:242 doc/classes/GPUParticles2D.xml:55 +msgid "Normal map to be used for the [member texture] property." msgstr "" -#: doc/classes/CPUParticles.xml:253 doc/classes/CPUParticles2D.xml:245 -#: doc/classes/Particles2D.xml:58 +#: doc/classes/CPUParticles2D.xml:245 doc/classes/CPUParticles3D.xml:253 +#: doc/classes/GPUParticles2D.xml:58 msgid "" "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." msgstr "" -#: doc/classes/CPUParticles.xml:256 +#: doc/classes/CPUParticles2D.xml:248 msgid "" "Orbital velocity applied to each particle. Makes the particles circle around " -"origin in the local XY plane. Specified in number of full rotations around " -"origin per second.\n" -"This property is only available when [member flag_disable_z] is [code]true[/" -"code]." +"origin. Specified in number of full rotations around origin per second." msgstr "" -#: doc/classes/CPUParticles.xml:260 doc/classes/CPUParticles2D.xml:251 +#: doc/classes/CPUParticles2D.xml:251 doc/classes/CPUParticles3D.xml:260 msgid "Each particle's orbital velocity will vary along this [Curve]." msgstr "" -#: doc/classes/CPUParticles.xml:263 doc/classes/CPUParticles2D.xml:254 +#: doc/classes/CPUParticles2D.xml:254 doc/classes/CPUParticles3D.xml:263 #: doc/classes/ParticlesMaterial.xml:223 msgid "Orbital velocity randomness ratio." msgstr "" -#: doc/classes/CPUParticles.xml:266 doc/classes/CPUParticles2D.xml:257 -#: doc/classes/Particles2D.xml:61 +#: doc/classes/CPUParticles2D.xml:257 doc/classes/CPUParticles3D.xml:266 +#: doc/classes/GPUParticles2D.xml:61 msgid "Particle system starts as if it had already run for this many seconds." msgstr "" -#: doc/classes/CPUParticles.xml:269 doc/classes/CPUParticles2D.xml:260 +#: doc/classes/CPUParticles2D.xml:260 doc/classes/CPUParticles3D.xml:269 #: doc/classes/ParticlesMaterial.xml:226 msgid "" "Radial acceleration applied to each particle. Makes particle accelerate away " "from origin." msgstr "" -#: doc/classes/CPUParticles.xml:272 doc/classes/CPUParticles2D.xml:263 +#: doc/classes/CPUParticles2D.xml:263 doc/classes/CPUParticles3D.xml:272 msgid "Each particle's radial acceleration will vary along this [Curve]." msgstr "" -#: doc/classes/CPUParticles.xml:275 doc/classes/CPUParticles2D.xml:266 +#: doc/classes/CPUParticles2D.xml:266 doc/classes/CPUParticles3D.xml:275 #: doc/classes/ParticlesMaterial.xml:232 msgid "Radial acceleration randomness ratio." msgstr "" -#: doc/classes/CPUParticles.xml:278 doc/classes/CPUParticles2D.xml:269 -#: doc/classes/Particles2D.xml:67 +#: doc/classes/CPUParticles2D.xml:269 doc/classes/CPUParticles3D.xml:278 +#: doc/classes/GPUParticles2D.xml:67 msgid "Emission lifetime randomness ratio." msgstr "" -#: doc/classes/CPUParticles.xml:281 doc/classes/CPUParticles2D.xml:272 +#: doc/classes/CPUParticles2D.xml:272 doc/classes/CPUParticles3D.xml:281 #: doc/classes/ParticlesMaterial.xml:235 msgid "Initial scale applied to each particle." msgstr "" -#: doc/classes/CPUParticles.xml:284 doc/classes/CPUParticles2D.xml:275 +#: doc/classes/CPUParticles2D.xml:275 doc/classes/CPUParticles3D.xml:284 msgid "Each particle's scale will vary along this [Curve]." msgstr "" -#: doc/classes/CPUParticles.xml:287 doc/classes/CPUParticles2D.xml:278 +#: doc/classes/CPUParticles2D.xml:278 doc/classes/CPUParticles3D.xml:287 #: doc/classes/ParticlesMaterial.xml:241 msgid "Scale randomness ratio." msgstr "" -#: doc/classes/CPUParticles.xml:290 doc/classes/CPUParticles2D.xml:281 -#: doc/classes/Particles2D.xml:70 +#: doc/classes/CPUParticles2D.xml:281 doc/classes/CPUParticles3D.xml:290 +#: doc/classes/GPUParticles2D.xml:70 msgid "" "Particle system's running speed scaling ratio. A value of [code]0[/code] can " "be used to pause the particles." msgstr "" -#: doc/classes/CPUParticles.xml:293 doc/classes/ParticlesMaterial.xml:244 +#: doc/classes/CPUParticles2D.xml:284 msgid "" "Each particle's initial direction range from [code]+spread[/code] to [code]-" -"spread[/code] degrees. Applied to X/Z plane and Y/Z planes." +"spread[/code] degrees." msgstr "" -#: doc/classes/CPUParticles.xml:296 doc/classes/CPUParticles2D.xml:287 +#: doc/classes/CPUParticles2D.xml:287 doc/classes/CPUParticles3D.xml:296 #: doc/classes/ParticlesMaterial.xml:247 msgid "" "Tangential acceleration applied to each particle. Tangential acceleration is " @@ -15642,139 +15178,137 @@ msgid "" "motion." msgstr "" -#: doc/classes/CPUParticles.xml:299 doc/classes/CPUParticles2D.xml:290 +#: doc/classes/CPUParticles2D.xml:290 doc/classes/CPUParticles3D.xml:299 msgid "Each particle's tangential acceleration will vary along this [Curve]." msgstr "" -#: doc/classes/CPUParticles.xml:302 doc/classes/CPUParticles2D.xml:293 +#: doc/classes/CPUParticles2D.xml:293 doc/classes/CPUParticles3D.xml:302 #: doc/classes/ParticlesMaterial.xml:253 msgid "Tangential acceleration randomness ratio." msgstr "" -#: doc/classes/CPUParticles.xml:307 doc/classes/CPUParticles2D.xml:301 -#: doc/classes/Particles.xml:110 doc/classes/Particles2D.xml:81 -msgid "Particles are drawn in the order emitted." +#: doc/classes/CPUParticles2D.xml:296 doc/classes/GPUParticles2D.xml:73 +msgid "Particle texture. If [code]null[/code], particles will be squares." msgstr "" -#: doc/classes/CPUParticles.xml:310 doc/classes/CPUParticles2D.xml:304 -#: doc/classes/Particles.xml:113 doc/classes/Particles2D.xml:84 -msgid "Particles are drawn in order of remaining lifetime." +#: doc/classes/CPUParticles2D.xml:301 doc/classes/CPUParticles3D.xml:307 +#: doc/classes/GPUParticles2D.xml:81 doc/classes/GPUParticles3D.xml:110 +msgid "Particles are drawn in the order emitted." msgstr "" -#: doc/classes/CPUParticles.xml:313 doc/classes/Particles.xml:116 -msgid "Particles are drawn in order of depth." +#: doc/classes/CPUParticles2D.xml:304 doc/classes/CPUParticles3D.xml:310 +#: doc/classes/GPUParticles2D.xml:84 doc/classes/GPUParticles3D.xml:113 +msgid "Particles are drawn in order of remaining lifetime." msgstr "" -#: doc/classes/CPUParticles.xml:316 doc/classes/CPUParticles2D.xml:307 +#: doc/classes/CPUParticles2D.xml:307 doc/classes/CPUParticles3D.xml:316 msgid "" "Use with [method set_param], [method set_param_randomness], and [method " "set_param_curve] to set initial velocity properties." msgstr "" -#: doc/classes/CPUParticles.xml:319 doc/classes/CPUParticles2D.xml:310 +#: doc/classes/CPUParticles2D.xml:310 doc/classes/CPUParticles3D.xml:319 msgid "" "Use with [method set_param], [method set_param_randomness], and [method " "set_param_curve] to set angular velocity properties." msgstr "" -#: doc/classes/CPUParticles.xml:322 doc/classes/CPUParticles2D.xml:313 +#: doc/classes/CPUParticles2D.xml:313 doc/classes/CPUParticles3D.xml:322 msgid "" "Use with [method set_param], [method set_param_randomness], and [method " "set_param_curve] to set orbital velocity properties." msgstr "" -#: doc/classes/CPUParticles.xml:325 doc/classes/CPUParticles2D.xml:316 +#: doc/classes/CPUParticles2D.xml:316 doc/classes/CPUParticles3D.xml:325 msgid "" "Use with [method set_param], [method set_param_randomness], and [method " "set_param_curve] to set linear acceleration properties." msgstr "" -#: doc/classes/CPUParticles.xml:328 doc/classes/CPUParticles2D.xml:319 +#: doc/classes/CPUParticles2D.xml:319 doc/classes/CPUParticles3D.xml:328 msgid "" "Use with [method set_param], [method set_param_randomness], and [method " "set_param_curve] to set radial acceleration properties." msgstr "" -#: doc/classes/CPUParticles.xml:331 doc/classes/CPUParticles2D.xml:322 +#: doc/classes/CPUParticles2D.xml:322 doc/classes/CPUParticles3D.xml:331 msgid "" "Use with [method set_param], [method set_param_randomness], and [method " "set_param_curve] to set tangential acceleration properties." msgstr "" -#: doc/classes/CPUParticles.xml:334 doc/classes/CPUParticles2D.xml:325 +#: doc/classes/CPUParticles2D.xml:325 doc/classes/CPUParticles3D.xml:334 msgid "" "Use with [method set_param], [method set_param_randomness], and [method " "set_param_curve] to set damping properties." msgstr "" -#: doc/classes/CPUParticles.xml:337 doc/classes/CPUParticles2D.xml:328 +#: doc/classes/CPUParticles2D.xml:328 doc/classes/CPUParticles3D.xml:337 msgid "" "Use with [method set_param], [method set_param_randomness], and [method " "set_param_curve] to set angle properties." msgstr "" -#: doc/classes/CPUParticles.xml:340 doc/classes/CPUParticles2D.xml:331 +#: doc/classes/CPUParticles2D.xml:331 doc/classes/CPUParticles3D.xml:340 msgid "" "Use with [method set_param], [method set_param_randomness], and [method " "set_param_curve] to set scale properties." msgstr "" -#: doc/classes/CPUParticles.xml:343 doc/classes/CPUParticles2D.xml:334 +#: doc/classes/CPUParticles2D.xml:334 doc/classes/CPUParticles3D.xml:343 msgid "" "Use with [method set_param], [method set_param_randomness], and [method " "set_param_curve] to set hue variation properties." msgstr "" -#: doc/classes/CPUParticles.xml:346 doc/classes/CPUParticles2D.xml:337 +#: doc/classes/CPUParticles2D.xml:337 doc/classes/CPUParticles3D.xml:346 msgid "" "Use with [method set_param], [method set_param_randomness], and [method " "set_param_curve] to set animation speed properties." msgstr "" -#: doc/classes/CPUParticles.xml:349 doc/classes/CPUParticles2D.xml:340 +#: doc/classes/CPUParticles2D.xml:340 doc/classes/CPUParticles3D.xml:349 msgid "" "Use with [method set_param], [method set_param_randomness], and [method " "set_param_curve] to set animation offset properties." msgstr "" -#: doc/classes/CPUParticles.xml:352 doc/classes/CPUParticles2D.xml:343 +#: doc/classes/CPUParticles2D.xml:343 doc/classes/CPUParticles3D.xml:352 #: doc/classes/ParticlesMaterial.xml:303 msgid "Represents the size of the [enum Parameter] enum." msgstr "" -#: doc/classes/CPUParticles.xml:355 doc/classes/CPUParticles2D.xml:346 +#: doc/classes/CPUParticles2D.xml:346 doc/classes/CPUParticles3D.xml:355 msgid "Use with [method set_particle_flag] to set [member flag_align_y]." msgstr "" -#: doc/classes/CPUParticles.xml:358 -msgid "Use with [method set_particle_flag] to set [member flag_rotate_y]." -msgstr "" - -#: doc/classes/CPUParticles.xml:361 -msgid "Use with [method set_particle_flag] to set [member flag_disable_z]." +#: doc/classes/CPUParticles2D.xml:349 doc/classes/CPUParticles2D.xml:352 +msgid "Present for consistency with 3D particle nodes, not used in 2D." msgstr "" -#: doc/classes/CPUParticles.xml:367 doc/classes/CPUParticles2D.xml:358 +#: doc/classes/CPUParticles2D.xml:358 doc/classes/CPUParticles3D.xml:367 #: doc/classes/ParticlesMaterial.xml:318 msgid "All particles will be emitted from a single point." msgstr "" -#: doc/classes/CPUParticles.xml:370 doc/classes/ParticlesMaterial.xml:321 -msgid "Particles will be emitted in the volume of a sphere." +#: doc/classes/CPUParticles2D.xml:361 +msgid "" +"Particles will be emitted on the surface of a sphere flattened to two " +"dimensions." msgstr "" -#: doc/classes/CPUParticles.xml:373 doc/classes/ParticlesMaterial.xml:324 -msgid "Particles will be emitted in the volume of a box." +#: doc/classes/CPUParticles2D.xml:364 +msgid "Particles will be emitted in the area of a rectangle." msgstr "" -#: doc/classes/CPUParticles.xml:376 doc/classes/CPUParticles2D.xml:367 +#: doc/classes/CPUParticles2D.xml:367 doc/classes/CPUParticles3D.xml:376 msgid "" "Particles will be emitted at a position chosen randomly among [member " "emission_points]. Particle color will be modulated by [member " "emission_colors]." msgstr "" -#: doc/classes/CPUParticles.xml:379 doc/classes/CPUParticles2D.xml:370 +#: doc/classes/CPUParticles2D.xml:370 doc/classes/CPUParticles3D.xml:379 msgid "" "Particles will be emitted at a position chosen randomly among [member " "emission_points]. Particle velocity and rotation will be set based on " @@ -15782,96 +15316,105 @@ msgid "" "emission_colors]." msgstr "" -#: doc/classes/CPUParticles.xml:382 doc/classes/CPUParticles2D.xml:373 +#: doc/classes/CPUParticles2D.xml:373 doc/classes/CPUParticles3D.xml:382 #: doc/classes/ParticlesMaterial.xml:333 msgid "Represents the size of the [enum EmissionShape] enum." msgstr "" -#: doc/classes/CPUParticles2D.xml:4 -msgid "CPU-based 2D particle emitter." +#: doc/classes/CPUParticles3D.xml:4 +msgid "CPU-based 3D particle emitter." msgstr "" -#: doc/classes/CPUParticles2D.xml:7 +#: doc/classes/CPUParticles3D.xml:7 msgid "" -"CPU-based 2D particle node used to create a variety of particle systems and " +"CPU-based 3D particle node used to create a variety of particle systems and " "effects.\n" -"See also [Particles2D], which provides the same functionality with hardware " -"acceleration, but may not run on older devices." -msgstr "" - -#: doc/classes/CPUParticles2D.xml:11 doc/classes/Particles2D.xml:11 -msgid "" -"https://docs.godotengine.org/en/latest/tutorials/2d/particle_systems_2d.html" +"See also [GPUParticles3D], which provides the same functionality with " +"hardware acceleration, but may not run on older devices." msgstr "" -#: doc/classes/CPUParticles2D.xml:20 +#: doc/classes/CPUParticles3D.xml:19 msgid "" -"Sets this node's properties to match a given [Particles2D] node with an " +"Sets this node's properties to match a given [GPUParticles3D] node with an " "assigned [ParticlesMaterial]." msgstr "" -#: doc/classes/CPUParticles2D.xml:152 -msgid "" -"Each particle's initial color. If [member texture] is defined, it will be " -"multiplied by this color." -msgstr "" - -#: doc/classes/CPUParticles2D.xml:155 -msgid "Each particle's color will vary along this [Gradient]." +#: doc/classes/CPUParticles3D.xml:151 doc/classes/CPUParticles3D.xml:154 +msgid "Unused for 3D particles." msgstr "" -#: doc/classes/CPUParticles2D.xml:182 +#: doc/classes/CPUParticles3D.xml:172 msgid "" "The rectangle's extents if [member emission_shape] is set to [constant " -"EMISSION_SHAPE_RECTANGLE]." +"EMISSION_SHAPE_BOX]." msgstr "" -#: doc/classes/CPUParticles2D.xml:188 +#: doc/classes/CPUParticles3D.xml:187 msgid "" -"The sphere's radius if [member emission_shape] is set to [constant " +"The sphere's radius if [enum EmissionShape] is set to [constant " "EMISSION_SHAPE_SPHERE]." msgstr "" -#: doc/classes/CPUParticles2D.xml:197 doc/classes/Particles.xml:78 -#: doc/classes/Particles2D.xml:43 +#: doc/classes/CPUParticles3D.xml:196 msgid "" "The particle system's frame rate is fixed to a value. For instance, changing " "the value to 2 will make the particles render at 2 frames per second. Note " -"this does not slow down the simulation of the particle system itself." +"this does not slow down the particle system itself." msgstr "" -#: doc/classes/CPUParticles2D.xml:242 doc/classes/Particles2D.xml:55 -msgid "Normal map to be used for the [member texture] property." +#: doc/classes/CPUParticles3D.xml:202 doc/classes/ParticlesMaterial.xml:177 +msgid "If [code]true[/code], particles will not move on the z axis." msgstr "" -#: doc/classes/CPUParticles2D.xml:248 +#: doc/classes/CPUParticles3D.xml:205 doc/classes/ParticlesMaterial.xml:180 +msgid "If [code]true[/code], particles rotate around Y axis by [member angle]." +msgstr "" + +#: doc/classes/CPUParticles3D.xml:208 doc/classes/ParticlesMaterial.xml:183 +msgid "" +"Amount of [member spread] in Y/Z plane. A value of [code]1[/code] restricts " +"particles to X/Z plane." +msgstr "" + +#: doc/classes/CPUParticles3D.xml:250 +msgid "" +"The [Mesh] used for each particle. If [code]null[/code], particles will be " +"spheres." +msgstr "" + +#: doc/classes/CPUParticles3D.xml:256 msgid "" "Orbital velocity applied to each particle. Makes the particles circle around " -"origin. Specified in number of full rotations around origin per second." +"origin in the local XY plane. Specified in number of full rotations around " +"origin per second.\n" +"This property is only available when [member flag_disable_z] is [code]true[/" +"code]." msgstr "" -#: doc/classes/CPUParticles2D.xml:284 +#: doc/classes/CPUParticles3D.xml:293 doc/classes/ParticlesMaterial.xml:244 msgid "" "Each particle's initial direction range from [code]+spread[/code] to [code]-" -"spread[/code] degrees." +"spread[/code] degrees. Applied to X/Z plane and Y/Z planes." msgstr "" -#: doc/classes/CPUParticles2D.xml:296 doc/classes/Particles2D.xml:73 -msgid "Particle texture. If [code]null[/code], particles will be squares." +#: doc/classes/CPUParticles3D.xml:313 doc/classes/GPUParticles3D.xml:116 +msgid "Particles are drawn in order of depth." msgstr "" -#: doc/classes/CPUParticles2D.xml:349 doc/classes/CPUParticles2D.xml:352 -msgid "Present for consistency with 3D particle nodes, not used in 2D." +#: doc/classes/CPUParticles3D.xml:358 +msgid "Use with [method set_particle_flag] to set [member flag_rotate_y]." msgstr "" -#: doc/classes/CPUParticles2D.xml:361 -msgid "" -"Particles will be emitted on the surface of a sphere flattened to two " -"dimensions." +#: doc/classes/CPUParticles3D.xml:361 +msgid "Use with [method set_particle_flag] to set [member flag_disable_z]." msgstr "" -#: doc/classes/CPUParticles2D.xml:364 -msgid "Particles will be emitted in the area of a rectangle." +#: doc/classes/CPUParticles3D.xml:370 doc/classes/ParticlesMaterial.xml:321 +msgid "Particles will be emitted in the volume of a sphere." +msgstr "" + +#: doc/classes/CPUParticles3D.xml:373 doc/classes/ParticlesMaterial.xml:324 +msgid "Particles will be emitted in the volume of a box." msgstr "" #: doc/classes/Crypto.xml:4 @@ -15960,264 +15503,265 @@ msgid "" "Saves a key to the given [code]path[/code] (should be a \"*.key\" file)." msgstr "" -#: modules/csg/doc_classes/CSGBox.xml:4 +#: modules/csg/doc_classes/CSGBox3D.xml:4 msgid "A CSG Box shape." msgstr "" -#: modules/csg/doc_classes/CSGBox.xml:7 +#: modules/csg/doc_classes/CSGBox3D.xml:7 msgid "This node allows you to create a box for use with the CSG system." msgstr "" -#: modules/csg/doc_classes/CSGBox.xml:15 +#: modules/csg/doc_classes/CSGBox3D.xml:15 msgid "Depth of the box measured from the center of the box." msgstr "" -#: modules/csg/doc_classes/CSGBox.xml:18 +#: modules/csg/doc_classes/CSGBox3D.xml:18 msgid "Height of the box measured from the center of the box." msgstr "" -#: modules/csg/doc_classes/CSGBox.xml:21 +#: modules/csg/doc_classes/CSGBox3D.xml:21 msgid "The material used to render the box." msgstr "" -#: modules/csg/doc_classes/CSGBox.xml:24 +#: modules/csg/doc_classes/CSGBox3D.xml:24 msgid "Width of the box measured from the center of the box." msgstr "" -#: modules/csg/doc_classes/CSGCombiner.xml:4 +#: modules/csg/doc_classes/CSGCombiner3D.xml:4 msgid "A CSG node that allows you to combine other CSG modifiers." msgstr "" -#: modules/csg/doc_classes/CSGCombiner.xml:7 +#: modules/csg/doc_classes/CSGCombiner3D.xml:7 msgid "" "For complex arrangements of shapes, it is sometimes needed to add structure " -"to your CSG nodes. The CSGCombiner node allows you to create this structure. " -"The node encapsulates the result of the CSG operations of its children. In " -"this way, it is possible to do operations on one set of shapes that are " -"children of one CSGCombiner node, and a set of separate operations on a " -"second set of shapes that are children of a second CSGCombiner node, and " -"then do an operation that takes the two end results as its input to create " -"the final shape." +"to your CSG nodes. The CSGCombiner3D node allows you to create this " +"structure. The node encapsulates the result of the CSG operations of its " +"children. In this way, it is possible to do operations on one set of shapes " +"that are children of one CSGCombiner3D node, and a set of separate " +"operations on a second set of shapes that are children of a second " +"CSGCombiner3D node, and then do an operation that takes the two end results " +"as its input to create the final shape." msgstr "" -#: modules/csg/doc_classes/CSGCylinder.xml:4 +#: modules/csg/doc_classes/CSGCylinder3D.xml:4 msgid "A CSG Cylinder shape." msgstr "" -#: modules/csg/doc_classes/CSGCylinder.xml:7 +#: modules/csg/doc_classes/CSGCylinder3D.xml:7 msgid "" "This node allows you to create a cylinder (or cone) for use with the CSG " "system." msgstr "" -#: modules/csg/doc_classes/CSGCylinder.xml:15 +#: modules/csg/doc_classes/CSGCylinder3D.xml:15 msgid "" "If [code]true[/code] a cone is created, the [member radius] will only apply " "to one side." msgstr "" -#: modules/csg/doc_classes/CSGCylinder.xml:18 +#: modules/csg/doc_classes/CSGCylinder3D.xml:18 msgid "The height of the cylinder." msgstr "" -#: modules/csg/doc_classes/CSGCylinder.xml:21 +#: modules/csg/doc_classes/CSGCylinder3D.xml:21 msgid "The material used to render the cylinder." msgstr "" -#: modules/csg/doc_classes/CSGCylinder.xml:24 +#: modules/csg/doc_classes/CSGCylinder3D.xml:24 msgid "The radius of the cylinder." msgstr "" -#: modules/csg/doc_classes/CSGCylinder.xml:27 +#: modules/csg/doc_classes/CSGCylinder3D.xml:27 msgid "" "The number of sides of the cylinder, the higher this number the more detail " "there will be in the cylinder." msgstr "" -#: modules/csg/doc_classes/CSGCylinder.xml:30 +#: modules/csg/doc_classes/CSGCylinder3D.xml:30 msgid "" "If [code]true[/code] the normals of the cylinder are set to give a smooth " "effect making the cylinder seem rounded. If [code]false[/code] the cylinder " "will have a flat shaded look." msgstr "" -#: modules/csg/doc_classes/CSGMesh.xml:4 +#: modules/csg/doc_classes/CSGMesh3D.xml:4 msgid "A CSG Mesh shape that uses a mesh resource." msgstr "" -#: modules/csg/doc_classes/CSGMesh.xml:7 +#: modules/csg/doc_classes/CSGMesh3D.xml:7 msgid "" "This CSG node allows you to use any mesh resource as a CSG shape, provided " "it is closed, does not self-intersect, does not contain internal faces and " "has no edges that connect to more then two faces." msgstr "" -#: modules/csg/doc_classes/CSGMesh.xml:15 +#: modules/csg/doc_classes/CSGMesh3D.xml:15 msgid "The [Material] used in drawing the CSG shape." msgstr "" -#: modules/csg/doc_classes/CSGMesh.xml:18 +#: modules/csg/doc_classes/CSGMesh3D.xml:18 msgid "The [Mesh] resource to use as a CSG shape." msgstr "" -#: modules/csg/doc_classes/CSGPolygon.xml:4 +#: modules/csg/doc_classes/CSGPolygon3D.xml:4 msgid "Extrudes a 2D polygon shape to create a 3D mesh." msgstr "" -#: modules/csg/doc_classes/CSGPolygon.xml:7 +#: modules/csg/doc_classes/CSGPolygon3D.xml:7 msgid "This node takes a 2D polygon shape and extrudes it to create a 3D mesh." msgstr "" -#: modules/csg/doc_classes/CSGPolygon.xml:15 +#: modules/csg/doc_classes/CSGPolygon3D.xml:15 msgid "Extrusion depth when [member mode] is [constant MODE_DEPTH]." msgstr "" -#: modules/csg/doc_classes/CSGPolygon.xml:18 +#: modules/csg/doc_classes/CSGPolygon3D.xml:18 msgid "Material to use for the resulting mesh." msgstr "" -#: modules/csg/doc_classes/CSGPolygon.xml:21 +#: modules/csg/doc_classes/CSGPolygon3D.xml:21 msgid "Extrusion mode." msgstr "" -#: modules/csg/doc_classes/CSGPolygon.xml:24 +#: modules/csg/doc_classes/CSGPolygon3D.xml:24 msgid "" "If [code]true[/code] the u component of our uv will continuously increase in " "unison with the distance traveled along our path when [member mode] is " "[constant MODE_PATH]." msgstr "" -#: modules/csg/doc_classes/CSGPolygon.xml:27 +#: modules/csg/doc_classes/CSGPolygon3D.xml:27 msgid "" "Interval at which a new extrusion slice is added along the path when [member " "mode] is [constant MODE_PATH]." msgstr "" -#: modules/csg/doc_classes/CSGPolygon.xml:30 +#: modules/csg/doc_classes/CSGPolygon3D.xml:30 msgid "" "If [code]true[/code] the start and end of our path are joined together " "ensuring there is no seam when [member mode] is [constant MODE_PATH]." msgstr "" -#: modules/csg/doc_classes/CSGPolygon.xml:33 +#: modules/csg/doc_classes/CSGPolygon3D.xml:33 msgid "" "If [code]false[/code] we extrude centered on our path, if [code]true[/code] " -"we extrude in relation to the position of our CSGPolygon when [member mode] " -"is [constant MODE_PATH]." +"we extrude in relation to the position of our CSGPolygon3D when [member " +"mode] is [constant MODE_PATH]." msgstr "" -#: modules/csg/doc_classes/CSGPolygon.xml:36 +#: modules/csg/doc_classes/CSGPolygon3D.xml:36 msgid "" -"The [Shape] object containing the path along which we extrude when [member " +"The [Shape3D] object containing the path along which we extrude when [member " "mode] is [constant MODE_PATH]." msgstr "" -#: modules/csg/doc_classes/CSGPolygon.xml:39 +#: modules/csg/doc_classes/CSGPolygon3D.xml:39 msgid "" "The method by which each slice is rotated along the path when [member mode] " "is [constant MODE_PATH]." msgstr "" -#: modules/csg/doc_classes/CSGPolygon.xml:42 +#: modules/csg/doc_classes/CSGPolygon3D.xml:42 msgid "Point array that defines the shape that we'll extrude." msgstr "" -#: modules/csg/doc_classes/CSGPolygon.xml:45 +#: modules/csg/doc_classes/CSGPolygon3D.xml:45 msgid "Generates smooth normals so smooth shading is applied to our mesh." msgstr "" -#: modules/csg/doc_classes/CSGPolygon.xml:48 +#: modules/csg/doc_classes/CSGPolygon3D.xml:48 msgid "" "Degrees to rotate our extrusion for each slice when [member mode] is " "[constant MODE_SPIN]." msgstr "" -#: modules/csg/doc_classes/CSGPolygon.xml:51 +#: modules/csg/doc_classes/CSGPolygon3D.xml:51 msgid "Number of extrusion when [member mode] is [constant MODE_SPIN]." msgstr "" -#: modules/csg/doc_classes/CSGPolygon.xml:56 -msgid "Shape is extruded to [member depth]." +#: modules/csg/doc_classes/CSGPolygon3D.xml:56 +msgid "Shape3D is extruded to [member depth]." msgstr "" -#: modules/csg/doc_classes/CSGPolygon.xml:59 -msgid "Shape is extruded by rotating it around an axis." +#: modules/csg/doc_classes/CSGPolygon3D.xml:59 +msgid "Shape3D is extruded by rotating it around an axis." msgstr "" -#: modules/csg/doc_classes/CSGPolygon.xml:62 +#: modules/csg/doc_classes/CSGPolygon3D.xml:62 msgid "" -"Shape is extruded along a path set by a [Shape] set in [member path_node]." +"Shape3D is extruded along a path set by a [Shape3D] set in [member " +"path_node]." msgstr "" -#: modules/csg/doc_classes/CSGPolygon.xml:65 +#: modules/csg/doc_classes/CSGPolygon3D.xml:65 msgid "Slice is not rotated." msgstr "" -#: modules/csg/doc_classes/CSGPolygon.xml:68 +#: modules/csg/doc_classes/CSGPolygon3D.xml:68 msgid "Slice is rotated around the up vector of the path." msgstr "" -#: modules/csg/doc_classes/CSGPolygon.xml:71 +#: modules/csg/doc_classes/CSGPolygon3D.xml:71 msgid "Slice is rotate to match the path exactly." msgstr "" -#: modules/csg/doc_classes/CSGPrimitive.xml:4 +#: modules/csg/doc_classes/CSGPrimitive3D.xml:4 msgid "Base class for CSG primitives." msgstr "" -#: modules/csg/doc_classes/CSGPrimitive.xml:7 +#: modules/csg/doc_classes/CSGPrimitive3D.xml:7 msgid "" "Parent class for various CSG primitives. It contains code and functionality " "that is common between them. It cannot be used directly. Instead use one of " "the various classes that inherit from it." msgstr "" -#: modules/csg/doc_classes/CSGPrimitive.xml:15 +#: modules/csg/doc_classes/CSGPrimitive3D.xml:15 msgid "Invert the faces of the mesh." msgstr "" -#: modules/csg/doc_classes/CSGShape.xml:4 +#: modules/csg/doc_classes/CSGShape3D.xml:4 msgid "The CSG base class." msgstr "" -#: modules/csg/doc_classes/CSGShape.xml:7 +#: modules/csg/doc_classes/CSGShape3D.xml:7 msgid "" "This is the CSG base class that provides CSG operation support to the " "various CSG nodes in Godot." msgstr "" -#: modules/csg/doc_classes/CSGShape.xml:34 +#: modules/csg/doc_classes/CSGShape3D.xml:34 msgid "" "Returns an [Array] with two elements, the first is the [Transform] of this " "node and the second is the root [Mesh] of this node. Only works when this " "node is the root shape." msgstr "" -#: modules/csg/doc_classes/CSGShape.xml:41 +#: modules/csg/doc_classes/CSGShape3D.xml:41 msgid "" "Returns [code]true[/code] if this is a root shape and is thus the object " "that is rendered." msgstr "" -#: modules/csg/doc_classes/CSGShape.xml:52 doc/classes/SoftBody.xml:64 +#: modules/csg/doc_classes/CSGShape3D.xml:52 doc/classes/SoftBody3D.xml:64 msgid "" "Sets individual bits on the layer mask. Use this if you only need to change " "one layer's value." msgstr "" -#: modules/csg/doc_classes/CSGShape.xml:63 doc/classes/SoftBody.xml:75 +#: modules/csg/doc_classes/CSGShape3D.xml:63 doc/classes/SoftBody3D.xml:75 msgid "" "Sets individual bits on the collision mask. Use this if you only need to " "change one layer's value." msgstr "" -#: modules/csg/doc_classes/CSGShape.xml:69 +#: modules/csg/doc_classes/CSGShape3D.xml:69 msgid "" "Calculate tangents for the CSG shape which allows the use of normal maps. " "This is only applied on the root shape, this setting is ignored on any child." msgstr "" -#: modules/csg/doc_classes/CSGShape.xml:72 +#: modules/csg/doc_classes/CSGShape3D.xml:72 msgid "" "The physics layers this area is in.\n" "Collidable objects can exist in any of 32 different layers. These layers " @@ -16228,105 +15772,105 @@ msgid "" "scans, or object B is in any layer scanned by object A." msgstr "" -#: modules/csg/doc_classes/CSGShape.xml:77 +#: modules/csg/doc_classes/CSGShape3D.xml:77 msgid "The physics layers this CSG shape scans for collisions." msgstr "" -#: modules/csg/doc_classes/CSGShape.xml:80 +#: modules/csg/doc_classes/CSGShape3D.xml:80 msgid "" "The operation that is performed on this shape. This is ignored for the first " "CSG child node as the operation is between this node and the previous child " "of this nodes parent." msgstr "" -#: modules/csg/doc_classes/CSGShape.xml:83 +#: modules/csg/doc_classes/CSGShape3D.xml:83 msgid "" "Snap makes the mesh snap to a given distance so that the faces of two meshes " "can be perfectly aligned. A lower value results in greater precision but may " "be harder to adjust." msgstr "" -#: modules/csg/doc_classes/CSGShape.xml:86 +#: modules/csg/doc_classes/CSGShape3D.xml:86 msgid "" "Adds a collision shape to the physics engine for our CSG shape. This will " "always act like a static body. Note that the collision shape is still active " "even if the CSG shape itself is hidden." msgstr "" -#: modules/csg/doc_classes/CSGShape.xml:91 +#: modules/csg/doc_classes/CSGShape3D.xml:91 msgid "" "Geometry of both primitives is merged, intersecting geometry is removed." msgstr "" -#: modules/csg/doc_classes/CSGShape.xml:94 +#: modules/csg/doc_classes/CSGShape3D.xml:94 msgid "Only intersecting geometry remains, the rest is removed." msgstr "" -#: modules/csg/doc_classes/CSGShape.xml:97 +#: modules/csg/doc_classes/CSGShape3D.xml:97 msgid "" "The second shape is subtracted from the first, leaving a dent with its shape." msgstr "" -#: modules/csg/doc_classes/CSGSphere.xml:4 +#: modules/csg/doc_classes/CSGSphere3D.xml:4 msgid "A CSG Sphere shape." msgstr "" -#: modules/csg/doc_classes/CSGSphere.xml:7 +#: modules/csg/doc_classes/CSGSphere3D.xml:7 msgid "This node allows you to create a sphere for use with the CSG system." msgstr "" -#: modules/csg/doc_classes/CSGSphere.xml:15 +#: modules/csg/doc_classes/CSGSphere3D.xml:15 msgid "The material used to render the sphere." msgstr "" -#: modules/csg/doc_classes/CSGSphere.xml:18 +#: modules/csg/doc_classes/CSGSphere3D.xml:18 msgid "Number of vertical slices for the sphere." msgstr "" -#: modules/csg/doc_classes/CSGSphere.xml:21 +#: modules/csg/doc_classes/CSGSphere3D.xml:21 msgid "Radius of the sphere." msgstr "" -#: modules/csg/doc_classes/CSGSphere.xml:24 +#: modules/csg/doc_classes/CSGSphere3D.xml:24 msgid "Number of horizontal slices for the sphere." msgstr "" -#: modules/csg/doc_classes/CSGSphere.xml:27 +#: modules/csg/doc_classes/CSGSphere3D.xml:27 msgid "" "If [code]true[/code] the normals of the sphere are set to give a smooth " "effect making the sphere seem rounded. If [code]false[/code] the sphere will " "have a flat shaded look." msgstr "" -#: modules/csg/doc_classes/CSGTorus.xml:4 +#: modules/csg/doc_classes/CSGTorus3D.xml:4 msgid "A CSG Torus shape." msgstr "" -#: modules/csg/doc_classes/CSGTorus.xml:7 +#: modules/csg/doc_classes/CSGTorus3D.xml:7 msgid "This node allows you to create a torus for use with the CSG system." msgstr "" -#: modules/csg/doc_classes/CSGTorus.xml:15 +#: modules/csg/doc_classes/CSGTorus3D.xml:15 msgid "The inner radius of the torus." msgstr "" -#: modules/csg/doc_classes/CSGTorus.xml:18 +#: modules/csg/doc_classes/CSGTorus3D.xml:18 msgid "The material used to render the torus." msgstr "" -#: modules/csg/doc_classes/CSGTorus.xml:21 +#: modules/csg/doc_classes/CSGTorus3D.xml:21 msgid "The outer radius of the torus." msgstr "" -#: modules/csg/doc_classes/CSGTorus.xml:24 +#: modules/csg/doc_classes/CSGTorus3D.xml:24 msgid "The number of edges each ring of the torus is constructed of." msgstr "" -#: modules/csg/doc_classes/CSGTorus.xml:27 +#: modules/csg/doc_classes/CSGTorus3D.xml:27 msgid "The number of slices the torus is constructed of." msgstr "" -#: modules/csg/doc_classes/CSGTorus.xml:30 +#: modules/csg/doc_classes/CSGTorus3D.xml:30 msgid "" "If [code]true[/code] the normals of the torus are set to give a smooth " "effect making the torus seem rounded. If [code]false[/code] the torus will " @@ -16666,7 +16210,7 @@ msgstr "" #: doc/classes/Curve3D.xml:7 msgid "" "This class describes a Bézier curve in 3D space. It is mainly used to give a " -"shape to a [Path], but can be manually sampled for other purposes.\n" +"shape to a [Path3D], but can be manually sampled for other purposes.\n" "It keeps a cache of precalculated points along the curve, to speed up " "further calculations." msgstr "" @@ -16750,8 +16294,8 @@ msgid "" "Sets the tilt angle in radians for the point [code]idx[/code]. If the index " "is out of bounds, the function sends an error to the console.\n" "The tilt controls the rotation along the look-at axis an object traveling " -"the path would have. In the case of a curve controlling a [PathFollow], this " -"tilt is an offset over the natural tilt the [PathFollow] calculates." +"the path would have. In the case of a curve controlling a [PathFollow3D], " +"this tilt is an offset over the natural tilt the [PathFollow3D] calculates." msgstr "" #: doc/classes/Curve3D.xml:246 @@ -16766,8 +16310,9 @@ msgstr "" #: doc/classes/Curve3D.xml:249 msgid "" "If [code]true[/code], the curve will bake up vectors used for orientation. " -"This is used when [member PathFollow.rotation_mode] is set to [constant " -"PathFollow.ROTATION_ORIENTED]. Changing it forces the cache to be recomputed." +"This is used when [member PathFollow3D.rotation_mode] is set to [constant " +"PathFollow3D.ROTATION_ORIENTED]. Changing it forces the cache to be " +"recomputed." msgstr "" #: doc/classes/CurveTexture.xml:4 @@ -16819,15 +16364,15 @@ msgstr "" msgid "Top radius of the cylinder." msgstr "" -#: doc/classes/CylinderShape.xml:4 doc/classes/CylinderShape.xml:7 +#: doc/classes/CylinderShape3D.xml:4 doc/classes/CylinderShape3D.xml:7 msgid "Cylinder shape for collisions." msgstr "" -#: doc/classes/CylinderShape.xml:15 +#: doc/classes/CylinderShape3D.xml:15 msgid "The cylinder's height." msgstr "" -#: doc/classes/CylinderShape.xml:18 +#: doc/classes/CylinderShape3D.xml:18 msgid "The cylinder's radius." msgstr "" @@ -16868,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 "" @@ -16875,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" @@ -16909,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" @@ -16943,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" @@ -16998,70 +16730,76 @@ 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 "" -#: doc/classes/DirectionalLight.xml:4 +#: doc/classes/DirectionalLight3D.xml:4 msgid "Directional light from a distance, as from the Sun." msgstr "" -#: doc/classes/DirectionalLight.xml:7 +#: doc/classes/DirectionalLight3D.xml:7 msgid "" -"A directional light is a type of [Light] node that models an infinite number " -"of parallel rays covering the entire scene. It is used for lights with " -"strong intensity that are located far away from the scene to model sunlight " -"or moonlight. The worldspace location of the DirectionalLight transform " -"(origin) is ignored. Only the basis is used to determine light direction." +"A directional light is a type of [Light3D] node that models an infinite " +"number of parallel rays covering the entire scene. It is used for lights " +"with strong intensity that are located far away from the scene to model " +"sunlight or moonlight. The worldspace location of the DirectionalLight3D " +"transform (origin) is ignored. Only the basis is used to determine light " +"direction." msgstr "" -#: doc/classes/DirectionalLight.xml:10 doc/classes/Light.xml:10 -#: doc/classes/OmniLight.xml:10 doc/classes/SpotLight.xml:10 +#: doc/classes/DirectionalLight3D.xml:10 doc/classes/Light3D.xml:10 +#: doc/classes/OmniLight3D.xml:10 doc/classes/SpotLight3D.xml:10 msgid "" "https://docs.godotengine.org/en/latest/tutorials/3d/lights_and_shadows.html" msgstr "" -#: doc/classes/DirectionalLight.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." -msgstr "" - -#: doc/classes/DirectionalLight.xml:19 +#: doc/classes/DirectionalLight3D.xml:16 msgid "" "If [code]true[/code], shadow detail is sacrificed in exchange for smoother " "transitions between splits." msgstr "" -#: doc/classes/DirectionalLight.xml:22 +#: doc/classes/DirectionalLight3D.xml:19 msgid "" "Optimizes shadow rendering for detail versus movement. See [enum " "ShadowDepthRange]." msgstr "" -#: doc/classes/DirectionalLight.xml:27 +#: doc/classes/DirectionalLight3D.xml:22 +msgid "" +"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:25 msgid "The maximum distance for shadow splits." msgstr "" -#: doc/classes/DirectionalLight.xml:30 +#: doc/classes/DirectionalLight3D.xml:28 msgid "The light's shadow rendering algorithm. See [enum ShadowMode]." msgstr "" -#: doc/classes/DirectionalLight.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/DirectionalLight.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 " @@ -17069,7 +16807,7 @@ msgid "" "[code]SHADOW_PARALLEL_4_SPLITS[/code]." msgstr "" -#: doc/classes/DirectionalLight.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 " @@ -17077,34 +16815,34 @@ msgid "" "[code]SHADOW_PARALLEL_4_SPLITS[/code]." msgstr "" -#: doc/classes/DirectionalLight.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/DirectionalLight.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/DirectionalLight.xml:51 +#: doc/classes/DirectionalLight3D.xml:48 msgid "Splits the view frustum in 2 areas, each with its own shadow map." msgstr "" -#: doc/classes/DirectionalLight.xml:54 +#: doc/classes/DirectionalLight3D.xml:51 msgid "Splits the view frustum in 4 areas, each with its own shadow map." msgstr "" -#: doc/classes/DirectionalLight.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/DirectionalLight.xml:60 +#: doc/classes/DirectionalLight3D.xml:57 msgid "" "Tries to achieve maximum shadow resolution. May result in saw effect on " "shadow edges." @@ -17394,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 " @@ -17457,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 "" @@ -17531,6 +17275,142 @@ msgid "" "finished." msgstr "" +#: doc/classes/EditorFeatureProfile.xml:4 +msgid "" +"An editor feature profile which can be used to disable specific features." +msgstr "" + +#: doc/classes/EditorFeatureProfile.xml:7 +msgid "" +"An editor feature profile can be used to disable specific features of the " +"Godot editor. When disabled, the features won't appear in the editor, which " +"makes the editor less cluttered. This is useful in education settings to " +"reduce confusion or when working in a team. For example, artists and level " +"designers could use a feature profile that disables the script editor to " +"avoid accidentally making changes to files they aren't supposed to edit.\n" +"To manage editor feature profiles visually, use [b]Editor > Manage Feature " +"Profiles...[/b] at the top of the editor window." +msgstr "" + +#: doc/classes/EditorFeatureProfile.xml:19 +msgid "Returns the specified [code]feature[/code]'s human-readable name." +msgstr "" + +#: doc/classes/EditorFeatureProfile.xml:28 +msgid "" +"Returns [code]true[/code] if the class specified by [code]class_name[/code] " +"is disabled. When disabled, the class won't appear in the Create New Node " +"dialog." +msgstr "" + +#: doc/classes/EditorFeatureProfile.xml:37 +msgid "" +"Returns [code]true[/code] if editing for the class specified by " +"[code]class_name[/code] is disabled. When disabled, the class will still " +"appear in the Create New Node dialog but the inspector will be read-only " +"when selecting a node that extends the class." +msgstr "" + +#: doc/classes/EditorFeatureProfile.xml:48 +msgid "" +"Returns [code]true[/code] if [code]property[/code] is disabled in the class " +"specified by [code]class_name[/code]. When a property is disabled, it won't " +"appear in the inspector when selecting a node that extends the class " +"specified by [code]class_name[/code]." +msgstr "" + +#: doc/classes/EditorFeatureProfile.xml:57 +msgid "" +"Returns [code]true[/code] if the [code]feature[/code] is disabled. When a " +"feature is disabled, it will disappear from the editor entirely." +msgstr "" + +#: doc/classes/EditorFeatureProfile.xml:66 +msgid "" +"Loads an editor feature profile from a file. The file must follow the JSON " +"format obtained by using the feature profile manager's [b]Export[/b] button " +"or the [method save_to_file] method." +msgstr "" + +#: doc/classes/EditorFeatureProfile.xml:75 +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." +msgstr "" + +#: doc/classes/EditorFeatureProfile.xml:86 +msgid "" +"If [code]disable[/code] is [code]true[/code], disables the class specified " +"by [code]class_name[/code]. When disabled, the class won't appear in the " +"Create New Node dialog." +msgstr "" + +#: doc/classes/EditorFeatureProfile.xml:97 +msgid "" +"If [code]disable[/code] is [code]true[/code], disables editing for the class " +"specified by [code]class_name[/code]. When disabled, the class will still " +"appear in the Create New Node dialog but the inspector will be read-only " +"when selecting a node that extends the class." +msgstr "" + +#: doc/classes/EditorFeatureProfile.xml:110 +msgid "" +"If [code]disable[/code] is [code]true[/code], disables editing for " +"[code]property[/code] in the class specified by [code]class_name[/code]. " +"When a property is disabled, it won't appear in the inspector when selecting " +"a node that extends the class specified by [code]class_name[/code]." +msgstr "" + +#: doc/classes/EditorFeatureProfile.xml:121 +msgid "" +"If [code]disable[/code] is [code]true[/code], disables the editor feature " +"specified in [code]feature[/code]. When a feature is disabled, it will " +"disappear from the editor entirely." +msgstr "" + +#: doc/classes/EditorFeatureProfile.xml:127 +msgid "" +"The 3D editor. If this feature is disabled, the 3D editor won't display but " +"3D nodes will still display in the Create New Node dialog." +msgstr "" + +#: doc/classes/EditorFeatureProfile.xml:130 +msgid "" +"The Script tab, which contains the script editor and class reference " +"browser. If this feature is disabled, the Script tab won't display." +msgstr "" + +#: doc/classes/EditorFeatureProfile.xml:133 +msgid "" +"The AssetLib tab. If this feature is disabled, the AssetLib tab won't " +"display." +msgstr "" + +#: doc/classes/EditorFeatureProfile.xml:136 +msgid "" +"Scene tree editing. If this feature is disabled, the Scene tree dock will " +"still be visible but will be read-only." +msgstr "" + +#: doc/classes/EditorFeatureProfile.xml:139 +msgid "" +"The Import dock. If this feature is disabled, the Import dock won't be " +"visible." +msgstr "" + +#: doc/classes/EditorFeatureProfile.xml:142 +msgid "" +"The Node dock. If this feature is disabled, signals and groups won't be " +"visible and modifiable from the editor." +msgstr "" + +#: doc/classes/EditorFeatureProfile.xml:145 +msgid "" +"The FileSystem dock. If this feature is disabled, the FileSystem dock won't " +"be visible." +msgstr "" + #: doc/classes/EditorFileDialog.xml:4 msgid "A modified version of [FileDialog] used by the editor." msgstr "" @@ -17589,76 +17469,77 @@ msgstr "" #: doc/classes/EditorFileDialog.xml:64 msgid "" -"The purpose of the [EditorFileDialog], which defines the allowed behaviors." +"The dialog's open or save mode, which affects the selection behavior. See " +"[enum FileMode]" msgstr "" -#: doc/classes/EditorFileDialog.xml:68 +#: doc/classes/EditorFileDialog.xml:67 msgid "" "If [code]true[/code], hidden files and directories will be visible in the " "[EditorFileDialog]." msgstr "" -#: doc/classes/EditorFileDialog.xml:77 +#: doc/classes/EditorFileDialog.xml:76 msgid "Emitted when a directory is selected." msgstr "" -#: doc/classes/EditorFileDialog.xml:84 +#: doc/classes/EditorFileDialog.xml:83 msgid "Emitted when a file is selected." msgstr "" -#: doc/classes/EditorFileDialog.xml:91 +#: doc/classes/EditorFileDialog.xml:90 msgid "Emitted when multiple files are selected." msgstr "" -#: doc/classes/EditorFileDialog.xml:97 +#: doc/classes/EditorFileDialog.xml:96 msgid "" "The [EditorFileDialog] can select only one file. Accepting the window will " "open the file." msgstr "" -#: doc/classes/EditorFileDialog.xml:100 +#: doc/classes/EditorFileDialog.xml:99 msgid "" "The [EditorFileDialog] can select multiple files. Accepting the window will " "open all files." msgstr "" -#: doc/classes/EditorFileDialog.xml:103 +#: doc/classes/EditorFileDialog.xml:102 msgid "" "The [EditorFileDialog] can select only one directory. Accepting the window " "will open the directory." msgstr "" -#: doc/classes/EditorFileDialog.xml:106 +#: doc/classes/EditorFileDialog.xml:105 msgid "" "The [EditorFileDialog] can select a file or directory. Accepting the window " "will open it." msgstr "" -#: doc/classes/EditorFileDialog.xml:109 +#: doc/classes/EditorFileDialog.xml:108 msgid "" "The [EditorFileDialog] can select only one file. Accepting the window will " "save the file." msgstr "" -#: doc/classes/EditorFileDialog.xml:112 +#: doc/classes/EditorFileDialog.xml:111 msgid "" "The [EditorFileDialog] can only view [code]res://[/code] directory contents." msgstr "" -#: doc/classes/EditorFileDialog.xml:115 +#: doc/classes/EditorFileDialog.xml:114 msgid "" "The [EditorFileDialog] can only view [code]user://[/code] directory contents." msgstr "" -#: doc/classes/EditorFileDialog.xml:118 +#: doc/classes/EditorFileDialog.xml:117 msgid "The [EditorFileDialog] can view the entire local file system." msgstr "" -#: doc/classes/EditorFileDialog.xml:121 +#: doc/classes/EditorFileDialog.xml:120 msgid "The [EditorFileDialog] displays resources as thumbnails." msgstr "" -#: doc/classes/EditorFileDialog.xml:124 +#: doc/classes/EditorFileDialog.xml:123 msgid "The [EditorFileDialog] displays resources as a list of filenames." msgstr "" @@ -17669,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 "" @@ -17922,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 @@ -17992,100 +17877,314 @@ 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." msgstr "" +#: doc/classes/EditorNode3DGizmo.xml:4 +msgid "Custom gizmo for editing Node3D objects." +msgstr "" + +#: doc/classes/EditorNode3DGizmo.xml:7 +msgid "" +"Custom gizmo that is used for providing custom visualization and editing " +"(handles) for Node3D objects. See [EditorNode3DGizmoPlugin] for more " +"information." +msgstr "" + +#: doc/classes/EditorNode3DGizmo.xml:26 +msgid "" +"Adds collision triangles to the gizmo for picking. A [TriangleMesh] can be " +"generated from a regular [Mesh] too. Call this function during [method " +"redraw]." +msgstr "" + +#: doc/classes/EditorNode3DGizmo.xml:41 +msgid "" +"Adds a list of handles (points) which can be used to deform the object being " +"edited.\n" +"There are virtual functions which will be called upon editing of these " +"handles. Call this function during [method redraw]." +msgstr "" + +#: doc/classes/EditorNode3DGizmo.xml:57 +msgid "" +"Adds lines to the gizmo (as sets of 2 points), with a given material. The " +"lines are used for visualizing the gizmo. Call this function during [method " +"redraw]." +msgstr "" + +#: doc/classes/EditorNode3DGizmo.xml:84 +msgid "" +"Adds an unscaled billboard for visualization. Call this function during " +"[method redraw]." +msgstr "" + +#: doc/classes/EditorNode3DGizmo.xml:103 +msgid "" +"Commit a handle being edited (handles must have been previously added by " +"[method add_handles]).\n" +"If the [code]cancel[/code] parameter is [code]true[/code], an option to " +"restore the edited value to the original is provided." +msgstr "" + +#: doc/classes/EditorNode3DGizmo.xml:113 +msgid "" +"Gets the name of an edited handle (handles must have been previously added " +"by [method add_handles]).\n" +"Handles can be named for reference to the user when editing." +msgstr "" + +#: doc/classes/EditorNode3DGizmo.xml:123 +msgid "" +"Gets actual value of a handle. This value can be anything and used for " +"eventually undoing the motion when calling [method commit_handle]." +msgstr "" + +#: doc/classes/EditorNode3DGizmo.xml:130 +msgid "" +"Returns the [EditorNode3DGizmoPlugin] that owns this gizmo. It's useful to " +"retrieve materials using [method EditorNode3DGizmoPlugin.get_material]." +msgstr "" + +#: doc/classes/EditorNode3DGizmo.xml:137 +msgid "Returns the Node3D node associated with this gizmo." +msgstr "" + +#: doc/classes/EditorNode3DGizmo.xml:146 +msgid "Gets whether a handle is highlighted or not." +msgstr "" + +#: doc/classes/EditorNode3DGizmo.xml:153 +msgid "" +"This function is called when the Node3D this gizmo refers to changes (the " +"[method Node3D.update_gizmo] is called)." +msgstr "" + +#: doc/classes/EditorNode3DGizmo.xml:166 +msgid "" +"This function is used when the user drags a gizmo handle (previously added " +"with [method add_handles]) in screen coordinates.\n" +"The [Camera3D] is also provided so screen coordinates can be converted to " +"raycasts." +msgstr "" + +#: doc/classes/EditorNode3DGizmoPlugin.xml:4 +msgid "Used by the editor to define Node3D gizmo types." +msgstr "" + +#: doc/classes/EditorNode3DGizmoPlugin.xml:7 +msgid "" +"EditorNode3DGizmoPlugin allows you to define a new type of Gizmo. There are " +"two main ways to do so: extending [EditorNode3DGizmoPlugin] for the simpler " +"gizmos, or creating a new [EditorNode3DGizmo] type. See the tutorial in the " +"documentation for more info." +msgstr "" + +#: doc/classes/EditorNode3DGizmoPlugin.xml:10 +msgid "" +"https://docs.godotengine.org/en/latest/tutorials/plugins/editor/" +"spatial_gizmos.html" +msgstr "" + +#: doc/classes/EditorNode3DGizmoPlugin.xml:21 +msgid "" +"Adds a new material to the internal material list for the plugin. It can " +"then be accessed with [method get_material]. Should not be overridden." +msgstr "" + +#: doc/classes/EditorNode3DGizmoPlugin.xml:28 +msgid "" +"Override this method to define whether the gizmo can be hidden or not. " +"Returns [code]true[/code] if not overridden." +msgstr "" + +#: doc/classes/EditorNode3DGizmoPlugin.xml:43 +msgid "" +"Override this method to commit gizmo handles. Called for this plugin's " +"active gizmos." +msgstr "" + +#: doc/classes/EditorNode3DGizmoPlugin.xml:52 +msgid "" +"Override this method to return a custom [EditorNode3DGizmo] for the spatial " +"nodes of your choice, return [code]null[/code] for the rest of nodes. See " +"also [method has_gizmo]." +msgstr "" + +#: doc/classes/EditorNode3DGizmoPlugin.xml:63 +msgid "" +"Creates a handle material with its variants (selected and/or editable) and " +"adds them to the internal material list. They can then be accessed with " +"[method get_material] and used in [method EditorNode3DGizmo.add_handles]. " +"Should not be overridden." +msgstr "" + +#: doc/classes/EditorNode3DGizmoPlugin.xml:78 +msgid "" +"Creates an icon material with its variants (selected and/or editable) and " +"adds them to the internal material list. They can then be accessed with " +"[method get_material] and used in [method EditorNode3DGizmo." +"add_unscaled_billboard]. Should not be overridden." +msgstr "" + +#: doc/classes/EditorNode3DGizmoPlugin.xml:95 +msgid "" +"Creates an unshaded material with its variants (selected and/or editable) " +"and adds them to the internal material list. They can then be accessed with " +"[method get_material] and used in [method EditorNode3DGizmo.add_mesh] and " +"[method EditorNode3DGizmo.add_lines]. Should not be overridden." +msgstr "" + +#: doc/classes/EditorNode3DGizmoPlugin.xml:106 +msgid "" +"Override this method to provide gizmo's handle names. Called for this " +"plugin's active gizmos." +msgstr "" + +#: doc/classes/EditorNode3DGizmoPlugin.xml:117 +msgid "" +"Gets actual value of a handle from gizmo. Called for this plugin's active " +"gizmos." +msgstr "" + +#: doc/classes/EditorNode3DGizmoPlugin.xml:128 +msgid "" +"Gets material from the internal list of materials. If an [EditorNode3DGizmo] " +"is provided, it will try to get the corresponding variant (selected and/or " +"editable)." +msgstr "" + +#: doc/classes/EditorNode3DGizmoPlugin.xml:135 +msgid "" +"Override this method to provide the name that will appear in the gizmo " +"visibility menu." +msgstr "" + +#: doc/classes/EditorNode3DGizmoPlugin.xml:150 +msgid "" +"Override this method to define which Node3D nodes have a gizmo from this " +"plugin. Whenever a [Node3D] node is added to a scene this method is called, " +"if it returns [code]true[/code] the node gets a generic [EditorNode3DGizmo] " +"assigned and is added to this plugin's list of active gizmos." +msgstr "" + +#: doc/classes/EditorNode3DGizmoPlugin.xml:161 +msgid "" +"Gets whether a handle is highlighted or not. Called for this plugin's active " +"gizmos." +msgstr "" + +#: doc/classes/EditorNode3DGizmoPlugin.xml:168 +msgid "" +"Override this method to define whether Node3D with this gizmo should be " +"selecteble even when the gizmo is hidden." +msgstr "" + +#: doc/classes/EditorNode3DGizmoPlugin.xml:177 +msgid "" +"Callback to redraw the provided gizmo. Called for this plugin's active " +"gizmos." +msgstr "" + +#: doc/classes/EditorNode3DGizmoPlugin.xml:192 +msgid "" +"Update the value of a handle after it has been updated. Called for this " +"plugin's active gizmos." +msgstr "" + #: doc/classes/EditorPlugin.xml:4 msgid "Used by the editor to extend its functionality." msgstr "" @@ -18144,7 +18243,7 @@ msgid "" "Adds a custom type, which will appear in the list of nodes or resources. An " "icon can be optionally passed.\n" "When given node or resource is selected, the base type will be instanced (e." -"g. \"Spatial\", \"Control\", \"Resource\"), then the script will be loaded " +"g. \"Node3D\", \"Control\", \"Resource\"), then the script will be loaded " "and set to this object.\n" "You can use the virtual method [method handles] to check if your custom " "object is being edited by checking the script or using the [code]is[/code] " @@ -18481,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 "" @@ -18540,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 " @@ -18562,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 " @@ -18570,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." @@ -18732,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" @@ -18772,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 "" @@ -18815,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" @@ -18840,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" @@ -18868,238 +18975,26 @@ 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." msgstr "" -#: doc/classes/EditorSpatialGizmo.xml:4 -msgid "Custom gizmo for editing Spatial objects." -msgstr "" - -#: doc/classes/EditorSpatialGizmo.xml:7 -msgid "" -"Custom gizmo that is used for providing custom visualization and editing " -"(handles) for 3D Spatial objects. See [EditorSpatialGizmoPlugin] for more " -"information." -msgstr "" - -#: doc/classes/EditorSpatialGizmo.xml:26 -msgid "" -"Adds collision triangles to the gizmo for picking. A [TriangleMesh] can be " -"generated from a regular [Mesh] too. Call this function during [method " -"redraw]." -msgstr "" - -#: doc/classes/EditorSpatialGizmo.xml:41 -msgid "" -"Adds a list of handles (points) which can be used to deform the object being " -"edited.\n" -"There are virtual functions which will be called upon editing of these " -"handles. Call this function during [method redraw]." -msgstr "" - -#: doc/classes/EditorSpatialGizmo.xml:57 -msgid "" -"Adds lines to the gizmo (as sets of 2 points), with a given material. The " -"lines are used for visualizing the gizmo. Call this function during [method " -"redraw]." -msgstr "" - -#: doc/classes/EditorSpatialGizmo.xml:84 -msgid "" -"Adds an unscaled billboard for visualization. Call this function during " -"[method redraw]." -msgstr "" - -#: doc/classes/EditorSpatialGizmo.xml:103 -msgid "" -"Commit a handle being edited (handles must have been previously added by " -"[method add_handles]).\n" -"If the [code]cancel[/code] parameter is [code]true[/code], an option to " -"restore the edited value to the original is provided." -msgstr "" - -#: doc/classes/EditorSpatialGizmo.xml:113 -msgid "" -"Gets the name of an edited handle (handles must have been previously added " -"by [method add_handles]).\n" -"Handles can be named for reference to the user when editing." -msgstr "" - -#: doc/classes/EditorSpatialGizmo.xml:123 -msgid "" -"Gets actual value of a handle. This value can be anything and used for " -"eventually undoing the motion when calling [method commit_handle]." -msgstr "" - -#: doc/classes/EditorSpatialGizmo.xml:130 -msgid "" -"Returns the [EditorSpatialGizmoPlugin] that owns this gizmo. It's useful to " -"retrieve materials using [method EditorSpatialGizmoPlugin.get_material]." -msgstr "" - -#: doc/classes/EditorSpatialGizmo.xml:137 -msgid "Returns the Spatial node associated with this gizmo." -msgstr "" - -#: doc/classes/EditorSpatialGizmo.xml:146 -msgid "Gets whether a handle is highlighted or not." -msgstr "" - -#: doc/classes/EditorSpatialGizmo.xml:153 -msgid "" -"This function is called when the Spatial this gizmo refers to changes (the " -"[method Spatial.update_gizmo] is called)." -msgstr "" - -#: doc/classes/EditorSpatialGizmo.xml:166 -msgid "" -"This function is used when the user drags a gizmo handle (previously added " -"with [method add_handles]) in screen coordinates.\n" -"The [Camera] is also provided so screen coordinates can be converted to " -"raycasts." -msgstr "" - -#: doc/classes/EditorSpatialGizmoPlugin.xml:4 -msgid "Used by the editor to define Spatial gizmo types." -msgstr "" - -#: doc/classes/EditorSpatialGizmoPlugin.xml:7 -msgid "" -"EditorSpatialGizmoPlugin allows you to define a new type of Gizmo. There are " -"two main ways to do so: extending [EditorSpatialGizmoPlugin] for the simpler " -"gizmos, or creating a new [EditorSpatialGizmo] type. See the tutorial in the " -"documentation for more info." -msgstr "" - -#: doc/classes/EditorSpatialGizmoPlugin.xml:10 -msgid "" -"https://docs.godotengine.org/en/latest/tutorials/plugins/editor/" -"spatial_gizmos.html" -msgstr "" - -#: doc/classes/EditorSpatialGizmoPlugin.xml:21 -msgid "" -"Adds a new material to the internal material list for the plugin. It can " -"then be accessed with [method get_material]. Should not be overridden." -msgstr "" - -#: doc/classes/EditorSpatialGizmoPlugin.xml:28 -msgid "" -"Override this method to define whether the gizmo can be hidden or not. " -"Returns [code]true[/code] if not overridden." -msgstr "" - -#: doc/classes/EditorSpatialGizmoPlugin.xml:43 -msgid "" -"Override this method to commit gizmo handles. Called for this plugin's " -"active gizmos." -msgstr "" - -#: doc/classes/EditorSpatialGizmoPlugin.xml:52 -msgid "" -"Override this method to return a custom [EditorSpatialGizmo] for the spatial " -"nodes of your choice, return [code]null[/code] for the rest of nodes. See " -"also [method has_gizmo]." -msgstr "" - -#: doc/classes/EditorSpatialGizmoPlugin.xml:63 -msgid "" -"Creates a handle material with its variants (selected and/or editable) and " -"adds them to the internal material list. They can then be accessed with " -"[method get_material] and used in [method EditorSpatialGizmo.add_handles]. " -"Should not be overridden." -msgstr "" - -#: doc/classes/EditorSpatialGizmoPlugin.xml:78 -msgid "" -"Creates an icon material with its variants (selected and/or editable) and " -"adds them to the internal material list. They can then be accessed with " -"[method get_material] and used in [method EditorSpatialGizmo." -"add_unscaled_billboard]. Should not be overridden." -msgstr "" - -#: doc/classes/EditorSpatialGizmoPlugin.xml:95 -msgid "" -"Creates an unshaded material with its variants (selected and/or editable) " -"and adds them to the internal material list. They can then be accessed with " -"[method get_material] and used in [method EditorSpatialGizmo.add_mesh] and " -"[method EditorSpatialGizmo.add_lines]. Should not be overridden." -msgstr "" - -#: doc/classes/EditorSpatialGizmoPlugin.xml:106 -msgid "" -"Override this method to provide gizmo's handle names. Called for this " -"plugin's active gizmos." -msgstr "" - -#: doc/classes/EditorSpatialGizmoPlugin.xml:117 -msgid "" -"Gets actual value of a handle from gizmo. Called for this plugin's active " -"gizmos." -msgstr "" - -#: doc/classes/EditorSpatialGizmoPlugin.xml:128 -msgid "" -"Gets material from the internal list of materials. If an " -"[EditorSpatialGizmo] is provided, it will try to get the corresponding " -"variant (selected and/or editable)." -msgstr "" - -#: doc/classes/EditorSpatialGizmoPlugin.xml:135 -msgid "" -"Override this method to provide the name that will appear in the gizmo " -"visibility menu." -msgstr "" - -#: doc/classes/EditorSpatialGizmoPlugin.xml:150 -msgid "" -"Override this method to define which Spatial nodes have a gizmo from this " -"plugin. Whenever a [Spatial] node is added to a scene this method is called, " -"if it returns [code]true[/code] the node gets a generic [EditorSpatialGizmo] " -"assigned and is added to this plugin's list of active gizmos." -msgstr "" - -#: doc/classes/EditorSpatialGizmoPlugin.xml:161 -msgid "" -"Gets whether a handle is highlighted or not. Called for this plugin's active " -"gizmos." -msgstr "" - -#: doc/classes/EditorSpatialGizmoPlugin.xml:168 -msgid "" -"Override this method to define whether Spatial with this gizmo should be " -"selecteble even when the gizmo is hidden." -msgstr "" - -#: doc/classes/EditorSpatialGizmoPlugin.xml:177 -msgid "" -"Callback to redraw the provided gizmo. Called for this plugin's active " -"gizmos." -msgstr "" - -#: doc/classes/EditorSpatialGizmoPlugin.xml:192 -msgid "" -"Update the value of a handle after it has been updated. Called for this " -"plugin's active gizmos." -msgstr "" - #: doc/classes/EditorVCSInterface.xml:4 msgid "" "Version Control System (VCS) interface which reads and writes to the local " @@ -19572,7 +19467,7 @@ msgstr "" #: doc/classes/Environment.xml:111 msgid "" "The fog's depth end distance from the camera. If this value is set to 0, it " -"will be equal to the current camera's [member Camera.far] value." +"will be equal to the current camera's [member Camera3D.far] value." msgstr "" #: doc/classes/Environment.xml:114 @@ -19614,7 +19509,7 @@ msgstr "" msgid "" "The intensity of the depth fog color transition when looking towards the " "sun. The sun's direction is determined automatically using the " -"DirectionalLight node in the scene." +"DirectionalLight3D node in the scene." msgstr "" #: doc/classes/Environment.xml:132 @@ -19634,97 +19529,89 @@ msgid "" msgstr "" #: doc/classes/Environment.xml:141 -msgid "" -"Smooths out the blockiness created by sampling higher levels, at the cost of " -"performance.\n" -"[b]Note:[/b] When using the GLES2 renderer, this is only available if the " -"GPU supports the [code]GL_EXT_gpu_shader4[/code] extension." -msgstr "" - -#: doc/classes/Environment.xml:145 msgid "The glow blending mode." msgstr "" -#: doc/classes/Environment.xml:148 +#: doc/classes/Environment.xml:144 msgid "" "The bloom's intensity. If set to a value higher than [code]0[/code], this " "will make glow visible in areas darker than the [member glow_hdr_threshold]." msgstr "" -#: doc/classes/Environment.xml:151 +#: doc/classes/Environment.xml:147 msgid "If [code]true[/code], the glow effect is enabled." msgstr "" -#: doc/classes/Environment.xml:154 +#: doc/classes/Environment.xml:150 msgid "" "The higher threshold of the HDR glow. Areas brighter than this threshold " "will be clamped for the purposes of the glow effect." msgstr "" -#: doc/classes/Environment.xml:157 +#: doc/classes/Environment.xml:153 msgid "The bleed scale of the HDR glow." msgstr "" -#: doc/classes/Environment.xml:160 +#: doc/classes/Environment.xml:156 msgid "" "The lower threshold of the HDR glow. When using the GLES2 renderer (which " "doesn't support HDR), this needs to be below [code]1.0[/code] for glow to be " "visible. A value of [code]0.9[/code] works well in this case." msgstr "" -#: doc/classes/Environment.xml:163 +#: doc/classes/Environment.xml:159 msgid "" "The glow intensity. When using the GLES2 renderer, this should be increased " "to 1.5 to compensate for the lack of HDR rendering." msgstr "" -#: doc/classes/Environment.xml:166 +#: doc/classes/Environment.xml:162 msgid "" "If [code]true[/code], the 1st level of glow is enabled. This is the most " "\"local\" level (least blurry)." msgstr "" -#: doc/classes/Environment.xml:169 +#: doc/classes/Environment.xml:165 msgid "If [code]true[/code], the 2th level of glow is enabled." msgstr "" -#: doc/classes/Environment.xml:172 +#: doc/classes/Environment.xml:168 msgid "If [code]true[/code], the 3th level of glow is enabled." msgstr "" -#: doc/classes/Environment.xml:175 +#: doc/classes/Environment.xml:171 msgid "If [code]true[/code], the 4th level of glow is enabled." msgstr "" -#: doc/classes/Environment.xml:178 +#: doc/classes/Environment.xml:174 msgid "If [code]true[/code], the 5th level of glow is enabled." msgstr "" -#: doc/classes/Environment.xml:181 +#: doc/classes/Environment.xml:177 msgid "If [code]true[/code], the 6th level of glow is enabled." msgstr "" -#: doc/classes/Environment.xml:184 +#: doc/classes/Environment.xml:180 msgid "" "If [code]true[/code], the 7th level of glow is enabled. This is the most " "\"global\" level (blurriest)." msgstr "" -#: doc/classes/Environment.xml:189 +#: doc/classes/Environment.xml:185 msgid "" "The glow strength. When using the GLES2 renderer, this should be increased " "to 1.3 to compensate for the lack of HDR rendering." msgstr "" -#: doc/classes/Environment.xml:194 +#: doc/classes/Environment.xml:190 msgid "The [Sky] resource used for this [Environment]." msgstr "" -#: doc/classes/Environment.xml:201 +#: doc/classes/Environment.xml:197 msgid "The depth tolerance for screen-space reflections." msgstr "" -#: doc/classes/Environment.xml:204 +#: doc/classes/Environment.xml:200 msgid "" "If [code]true[/code], screen-space reflections are enabled. Screen-space " "reflections are more accurate than reflections from [GIProbe]s or " @@ -19732,54 +19619,48 @@ msgid "" "others." msgstr "" -#: doc/classes/Environment.xml:207 +#: doc/classes/Environment.xml:203 msgid "" "The fade-in distance for screen-space reflections. Affects the area from the " "reflected material to the screen-space reflection)." msgstr "" -#: doc/classes/Environment.xml:210 +#: doc/classes/Environment.xml:206 msgid "" "The fade-out distance for screen-space reflections. Affects the area from " "the screen-space reflection to the \"global\" reflection." msgstr "" -#: doc/classes/Environment.xml:213 +#: doc/classes/Environment.xml:209 msgid "" "The maximum number of steps for screen-space reflections. Higher values are " "slower." msgstr "" -#: doc/classes/Environment.xml:216 -msgid "" -"If [code]true[/code], screen-space reflections will take the material " -"roughness into account." -msgstr "" - -#: doc/classes/Environment.xml:219 +#: doc/classes/Environment.xml:212 msgid "" "The screen-space ambient occlusion intensity on materials that have an AO " "texture defined. Values higher than [code]0[/code] will make the SSAO effect " "visible in areas darkened by AO textures." msgstr "" -#: doc/classes/Environment.xml:222 +#: doc/classes/Environment.xml:215 msgid "" "The screen-space ambient occlusion bias. This should be kept high enough to " "prevent \"smooth\" curves from being affected by ambient occlusion." msgstr "" -#: doc/classes/Environment.xml:225 +#: doc/classes/Environment.xml:218 msgid "" "The screen-space ambient occlusion blur quality. See [enum SSAOBlur] for " "possible values." msgstr "" -#: doc/classes/Environment.xml:228 +#: doc/classes/Environment.xml:221 msgid "The screen-space ambient occlusion edge sharpness." msgstr "" -#: doc/classes/Environment.xml:231 +#: doc/classes/Environment.xml:224 msgid "" "If [code]true[/code], the screen-space ambient occlusion effect is enabled. " "This darkens objects' corners and cavities to simulate ambient light not " @@ -19790,13 +19671,13 @@ msgid "" "issues." msgstr "" -#: doc/classes/Environment.xml:234 +#: doc/classes/Environment.xml:227 msgid "" "The primary screen-space ambient occlusion intensity. See also [member " "ssao_radius]." msgstr "" -#: doc/classes/Environment.xml:237 +#: doc/classes/Environment.xml:230 msgid "" "The screen-space ambient occlusion intensity in direct light. In real life, " "ambient occlusion only applies to indirect light, which means its effects " @@ -19804,46 +19685,46 @@ msgid "" "the SSAO effect visible in direct light." msgstr "" -#: doc/classes/Environment.xml:240 +#: doc/classes/Environment.xml:233 msgid "The primary screen-space ambient occlusion radius." msgstr "" -#: doc/classes/Environment.xml:243 +#: doc/classes/Environment.xml:236 msgid "The default exposure used for tonemapping." msgstr "" -#: doc/classes/Environment.xml:246 +#: doc/classes/Environment.xml:239 msgid "" "The tonemapping mode to use. Tonemapping is the process that \"converts\" " "HDR values to be suitable for rendering on a LDR display. (Godot doesn't " "support rendering on HDR displays yet.)" msgstr "" -#: doc/classes/Environment.xml:249 +#: doc/classes/Environment.xml:242 msgid "" "The white reference value for tonemapping. Only effective if the [member " "tonemap_mode] isn't set to [constant TONE_MAPPER_LINEAR]." msgstr "" -#: doc/classes/Environment.xml:254 +#: doc/classes/Environment.xml:247 msgid "" "Clears the background using the clear color defined in [member " "ProjectSettings.rendering/environment/default_clear_color]." msgstr "" -#: doc/classes/Environment.xml:257 +#: doc/classes/Environment.xml:250 msgid "Clears the background using a custom clear color." msgstr "" -#: doc/classes/Environment.xml:260 +#: doc/classes/Environment.xml:253 msgid "Displays a user-defined sky in the background." msgstr "" -#: doc/classes/Environment.xml:263 +#: doc/classes/Environment.xml:256 msgid "Displays a [CanvasLayer] in the background." msgstr "" -#: doc/classes/Environment.xml:266 +#: doc/classes/Environment.xml:259 msgid "" "Keeps on screen every pixel drawn in the background. This is the fastest " "background mode, but it can only be safely used in fully-interior scenes (no " @@ -19851,72 +19732,111 @@ msgid "" "is visible, \"ghost trail\" artifacts will be visible when moving the camera." msgstr "" -#: doc/classes/Environment.xml:269 doc/classes/VisualServer.xml:3483 +#: doc/classes/Environment.xml:262 doc/classes/RenderingServer.xml:3563 msgid "Displays a camera feed in the background." msgstr "" -#: doc/classes/Environment.xml:272 +#: doc/classes/Environment.xml:265 msgid "Represents the size of the [enum BGMode] enum." msgstr "" -#: doc/classes/Environment.xml:289 +#: 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:292 +#: 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:295 +#: 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:298 +#: 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:303 +#: 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:306 +#: 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:309 +#: doc/classes/Environment.xml:310 msgid "Filmic tonemapper operator." msgstr "" -#: doc/classes/Environment.xml:312 +#: doc/classes/Environment.xml:313 msgid "Academy Color Encoding System tonemapper operator." msgstr "" -#: doc/classes/Environment.xml:315 +#: doc/classes/Environment.xml:316 msgid "No blur for the screen-space ambient occlusion effect (fastest)." msgstr "" -#: doc/classes/Environment.xml:318 +#: doc/classes/Environment.xml:319 msgid "1×1 blur for the screen-space ambient occlusion effect." msgstr "" -#: doc/classes/Environment.xml:321 +#: doc/classes/Environment.xml:322 msgid "2×2 blur for the screen-space ambient occlusion effect." msgstr "" -#: doc/classes/Environment.xml:324 -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 @@ -20177,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 " @@ -20205,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" @@ -20251,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 "" @@ -20349,22 +20281,22 @@ msgstr "" #: doc/classes/FileDialog.xml:72 msgid "" -"The available file type filters. For example, this shows only [code].png[/" -"code] and [code].gd[/code] files: [code]set_filters(PackedStringArray([\"*." -"png ; PNG Images\",\"*.gd ; GDScript Files\"]))[/code]." +"The dialog's open or save mode, which affects the selection behavior. See " +"[enum FileMode]." msgstr "" #: doc/classes/FileDialog.xml:75 msgid "" -"The dialog's open or save mode, which affects the selection behavior. See " -"enum [code]Mode[/code] constants." +"The available file type filters. For example, this shows only [code].png[/" +"code] and [code].gd[/code] files: [code]set_filters(PackedStringArray([\"*." +"png ; PNG Images\",\"*.gd ; GDScript Files\"]))[/code]." msgstr "" #: doc/classes/FileDialog.xml:78 msgid "" "If [code]true[/code], changing the [code]Mode[/code] property will set the " -"window title accordingly (e.g. setting mode to [constant MODE_OPEN_FILE] " -"will change the window title to \"Open a File\")." +"window title accordingly (e.g. setting mode to [constant " +"FILE_MODE_OPEN_FILE] will change the window title to \"Open a File\")." msgstr "" #: doc/classes/FileDialog.xml:81 @@ -20592,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 "" @@ -20731,416 +20663,416 @@ msgid "" "another function state if yielded again." msgstr "" -#: doc/classes/Generic6DOFJoint.xml:4 +#: doc/classes/Generic6DOFJoint3D.xml:4 msgid "" "The generic 6-degrees-of-freedom joint can implement a variety of joint " "types by locking certain axes' rotation or translation." msgstr "" -#: doc/classes/Generic6DOFJoint.xml:7 +#: doc/classes/Generic6DOFJoint3D.xml:7 msgid "" "The first 3 DOF axes are linear axes, which represent translation of Bodies, " "and the latter 3 DOF axes represent the angular motion. Each axis can be " "either locked, or limited." msgstr "" -#: doc/classes/Generic6DOFJoint.xml:123 +#: doc/classes/Generic6DOFJoint3D.xml:123 msgid "" "The amount of rotational damping across the X axis.\n" "The lower, the longer an impulse from one side takes to travel to the other " "side." msgstr "" -#: doc/classes/Generic6DOFJoint.xml:127 +#: doc/classes/Generic6DOFJoint3D.xml:127 msgid "If [code]true[/code], rotation across the X axis is limited." msgstr "" -#: doc/classes/Generic6DOFJoint.xml:130 +#: doc/classes/Generic6DOFJoint3D.xml:130 msgid "" "When rotating across the X axis, this error tolerance factor defines how " "much the correction gets slowed down. The lower, the slower." msgstr "" -#: doc/classes/Generic6DOFJoint.xml:133 +#: doc/classes/Generic6DOFJoint3D.xml:133 msgid "" "The maximum amount of force that can occur, when rotating around the X axis." msgstr "" -#: doc/classes/Generic6DOFJoint.xml:136 +#: doc/classes/Generic6DOFJoint3D.xml:136 msgid "" "The minimum rotation in negative direction to break loose and rotate around " "the X axis." msgstr "" -#: doc/classes/Generic6DOFJoint.xml:139 +#: doc/classes/Generic6DOFJoint3D.xml:139 msgid "" "The amount of rotational restitution across the X axis. The lower, the more " "restitution occurs." msgstr "" -#: doc/classes/Generic6DOFJoint.xml:142 +#: doc/classes/Generic6DOFJoint3D.xml:142 msgid "The speed of all rotations across the X axis." msgstr "" -#: doc/classes/Generic6DOFJoint.xml:145 +#: doc/classes/Generic6DOFJoint3D.xml:145 msgid "" "The minimum rotation in positive direction to break loose and rotate around " "the X axis." msgstr "" -#: doc/classes/Generic6DOFJoint.xml:148 +#: doc/classes/Generic6DOFJoint3D.xml:148 msgid "" "The amount of rotational damping across the Y axis. The lower, the more " "dampening occurs." msgstr "" -#: doc/classes/Generic6DOFJoint.xml:151 +#: doc/classes/Generic6DOFJoint3D.xml:151 msgid "If [code]true[/code], rotation across the Y axis is limited." msgstr "" -#: doc/classes/Generic6DOFJoint.xml:154 +#: doc/classes/Generic6DOFJoint3D.xml:154 msgid "" "When rotating across the Y axis, this error tolerance factor defines how " "much the correction gets slowed down. The lower, the slower." msgstr "" -#: doc/classes/Generic6DOFJoint.xml:157 +#: doc/classes/Generic6DOFJoint3D.xml:157 msgid "" "The maximum amount of force that can occur, when rotating around the Y axis." msgstr "" -#: doc/classes/Generic6DOFJoint.xml:160 +#: doc/classes/Generic6DOFJoint3D.xml:160 msgid "" "The minimum rotation in negative direction to break loose and rotate around " "the Y axis." msgstr "" -#: doc/classes/Generic6DOFJoint.xml:163 +#: doc/classes/Generic6DOFJoint3D.xml:163 msgid "" "The amount of rotational restitution across the Y axis. The lower, the more " "restitution occurs." msgstr "" -#: doc/classes/Generic6DOFJoint.xml:166 +#: doc/classes/Generic6DOFJoint3D.xml:166 msgid "The speed of all rotations across the Y axis." msgstr "" -#: doc/classes/Generic6DOFJoint.xml:169 +#: doc/classes/Generic6DOFJoint3D.xml:169 msgid "" "The minimum rotation in positive direction to break loose and rotate around " "the Y axis." msgstr "" -#: doc/classes/Generic6DOFJoint.xml:172 +#: doc/classes/Generic6DOFJoint3D.xml:172 msgid "" "The amount of rotational damping across the Z axis. The lower, the more " "dampening occurs." msgstr "" -#: doc/classes/Generic6DOFJoint.xml:175 +#: doc/classes/Generic6DOFJoint3D.xml:175 msgid "If [code]true[/code], rotation across the Z axis is limited." msgstr "" -#: doc/classes/Generic6DOFJoint.xml:178 +#: doc/classes/Generic6DOFJoint3D.xml:178 msgid "" "When rotating across the Z axis, this error tolerance factor defines how " "much the correction gets slowed down. The lower, the slower." msgstr "" -#: doc/classes/Generic6DOFJoint.xml:181 +#: doc/classes/Generic6DOFJoint3D.xml:181 msgid "" "The maximum amount of force that can occur, when rotating around the Z axis." msgstr "" -#: doc/classes/Generic6DOFJoint.xml:184 +#: doc/classes/Generic6DOFJoint3D.xml:184 msgid "" "The minimum rotation in negative direction to break loose and rotate around " "the Z axis." msgstr "" -#: doc/classes/Generic6DOFJoint.xml:187 +#: doc/classes/Generic6DOFJoint3D.xml:187 msgid "" "The amount of rotational restitution across the Z axis. The lower, the more " "restitution occurs." msgstr "" -#: doc/classes/Generic6DOFJoint.xml:190 +#: doc/classes/Generic6DOFJoint3D.xml:190 msgid "The speed of all rotations across the Z axis." msgstr "" -#: doc/classes/Generic6DOFJoint.xml:193 +#: doc/classes/Generic6DOFJoint3D.xml:193 msgid "" "The minimum rotation in positive direction to break loose and rotate around " "the Z axis." msgstr "" -#: doc/classes/Generic6DOFJoint.xml:196 +#: doc/classes/Generic6DOFJoint3D.xml:196 msgid "If [code]true[/code], a rotating motor at the X axis is enabled." msgstr "" -#: doc/classes/Generic6DOFJoint.xml:199 +#: doc/classes/Generic6DOFJoint3D.xml:199 msgid "Maximum acceleration for the motor at the X axis." msgstr "" -#: doc/classes/Generic6DOFJoint.xml:202 +#: doc/classes/Generic6DOFJoint3D.xml:202 msgid "Target speed for the motor at the X axis." msgstr "" -#: doc/classes/Generic6DOFJoint.xml:205 +#: doc/classes/Generic6DOFJoint3D.xml:205 msgid "If [code]true[/code], a rotating motor at the Y axis is enabled." msgstr "" -#: doc/classes/Generic6DOFJoint.xml:208 +#: doc/classes/Generic6DOFJoint3D.xml:208 msgid "Maximum acceleration for the motor at the Y axis." msgstr "" -#: doc/classes/Generic6DOFJoint.xml:211 +#: doc/classes/Generic6DOFJoint3D.xml:211 msgid "Target speed for the motor at the Y axis." msgstr "" -#: doc/classes/Generic6DOFJoint.xml:214 +#: doc/classes/Generic6DOFJoint3D.xml:214 msgid "If [code]true[/code], a rotating motor at the Z axis is enabled." msgstr "" -#: doc/classes/Generic6DOFJoint.xml:217 +#: doc/classes/Generic6DOFJoint3D.xml:217 msgid "Maximum acceleration for the motor at the Z axis." msgstr "" -#: doc/classes/Generic6DOFJoint.xml:220 +#: doc/classes/Generic6DOFJoint3D.xml:220 msgid "Target speed for the motor at the Z axis." msgstr "" -#: doc/classes/Generic6DOFJoint.xml:247 +#: doc/classes/Generic6DOFJoint3D.xml:247 msgid "The amount of damping that happens at the X motion." msgstr "" -#: doc/classes/Generic6DOFJoint.xml:250 +#: doc/classes/Generic6DOFJoint3D.xml:250 msgid "If [code]true[/code], the linear motion across the X axis is limited." msgstr "" -#: doc/classes/Generic6DOFJoint.xml:253 +#: doc/classes/Generic6DOFJoint3D.xml:253 msgid "The minimum difference between the pivot points' X axis." msgstr "" -#: doc/classes/Generic6DOFJoint.xml:256 +#: doc/classes/Generic6DOFJoint3D.xml:256 msgid "" "The amount of restitution on the X axis movement. The lower, the more " "momentum gets lost." msgstr "" -#: doc/classes/Generic6DOFJoint.xml:259 +#: doc/classes/Generic6DOFJoint3D.xml:259 msgid "" "A factor applied to the movement across the X axis. The lower, the slower " "the movement." msgstr "" -#: doc/classes/Generic6DOFJoint.xml:262 +#: doc/classes/Generic6DOFJoint3D.xml:262 msgid "The maximum difference between the pivot points' X axis." msgstr "" -#: doc/classes/Generic6DOFJoint.xml:265 +#: doc/classes/Generic6DOFJoint3D.xml:265 msgid "The amount of damping that happens at the Y motion." msgstr "" -#: doc/classes/Generic6DOFJoint.xml:268 +#: doc/classes/Generic6DOFJoint3D.xml:268 msgid "If [code]true[/code], the linear motion across the Y axis is limited." msgstr "" -#: doc/classes/Generic6DOFJoint.xml:271 +#: doc/classes/Generic6DOFJoint3D.xml:271 msgid "The minimum difference between the pivot points' Y axis." msgstr "" -#: doc/classes/Generic6DOFJoint.xml:274 +#: doc/classes/Generic6DOFJoint3D.xml:274 msgid "" "The amount of restitution on the Y axis movement. The lower, the more " "momentum gets lost." msgstr "" -#: doc/classes/Generic6DOFJoint.xml:277 +#: doc/classes/Generic6DOFJoint3D.xml:277 msgid "" "A factor applied to the movement across the Y axis. The lower, the slower " "the movement." msgstr "" -#: doc/classes/Generic6DOFJoint.xml:280 +#: doc/classes/Generic6DOFJoint3D.xml:280 msgid "The maximum difference between the pivot points' Y axis." msgstr "" -#: doc/classes/Generic6DOFJoint.xml:283 +#: doc/classes/Generic6DOFJoint3D.xml:283 msgid "The amount of damping that happens at the Z motion." msgstr "" -#: doc/classes/Generic6DOFJoint.xml:286 +#: doc/classes/Generic6DOFJoint3D.xml:286 msgid "If [code]true[/code], the linear motion across the Z axis is limited." msgstr "" -#: doc/classes/Generic6DOFJoint.xml:289 +#: doc/classes/Generic6DOFJoint3D.xml:289 msgid "The minimum difference between the pivot points' Z axis." msgstr "" -#: doc/classes/Generic6DOFJoint.xml:292 +#: doc/classes/Generic6DOFJoint3D.xml:292 msgid "" "The amount of restitution on the Z axis movement. The lower, the more " "momentum gets lost." msgstr "" -#: doc/classes/Generic6DOFJoint.xml:295 +#: doc/classes/Generic6DOFJoint3D.xml:295 msgid "" "A factor applied to the movement across the Z axis. The lower, the slower " "the movement." msgstr "" -#: doc/classes/Generic6DOFJoint.xml:298 +#: doc/classes/Generic6DOFJoint3D.xml:298 msgid "The maximum difference between the pivot points' Z axis." msgstr "" -#: doc/classes/Generic6DOFJoint.xml:301 +#: doc/classes/Generic6DOFJoint3D.xml:301 msgid "" "If [code]true[/code], then there is a linear motor on the X axis. It will " "attempt to reach the target velocity while staying within the force limits." msgstr "" -#: doc/classes/Generic6DOFJoint.xml:304 +#: doc/classes/Generic6DOFJoint3D.xml:304 msgid "" "The maximum force the linear motor can apply on the X axis while trying to " "reach the target velocity." msgstr "" -#: doc/classes/Generic6DOFJoint.xml:307 +#: doc/classes/Generic6DOFJoint3D.xml:307 msgid "The speed that the linear motor will attempt to reach on the X axis." msgstr "" -#: doc/classes/Generic6DOFJoint.xml:310 +#: doc/classes/Generic6DOFJoint3D.xml:310 msgid "" "If [code]true[/code], then there is a linear motor on the Y axis. It will " "attempt to reach the target velocity while staying within the force limits." msgstr "" -#: doc/classes/Generic6DOFJoint.xml:313 +#: doc/classes/Generic6DOFJoint3D.xml:313 msgid "" "The maximum force the linear motor can apply on the Y axis while trying to " "reach the target velocity." msgstr "" -#: doc/classes/Generic6DOFJoint.xml:316 +#: doc/classes/Generic6DOFJoint3D.xml:316 msgid "The speed that the linear motor will attempt to reach on the Y axis." msgstr "" -#: doc/classes/Generic6DOFJoint.xml:319 +#: doc/classes/Generic6DOFJoint3D.xml:319 msgid "" "If [code]true[/code], then there is a linear motor on the Z axis. It will " "attempt to reach the target velocity while staying within the force limits." msgstr "" -#: doc/classes/Generic6DOFJoint.xml:322 +#: doc/classes/Generic6DOFJoint3D.xml:322 msgid "" "The maximum force the linear motor can apply on the Z axis while trying to " "reach the target velocity." msgstr "" -#: doc/classes/Generic6DOFJoint.xml:325 +#: doc/classes/Generic6DOFJoint3D.xml:325 msgid "The speed that the linear motor will attempt to reach on the Z axis." msgstr "" -#: doc/classes/Generic6DOFJoint.xml:356 doc/classes/PhysicsServer.xml:1410 +#: doc/classes/Generic6DOFJoint3D.xml:356 doc/classes/PhysicsServer3D.xml:1410 msgid "The minimum difference between the pivot points' axes." msgstr "" -#: doc/classes/Generic6DOFJoint.xml:359 doc/classes/PhysicsServer.xml:1413 +#: doc/classes/Generic6DOFJoint3D.xml:359 doc/classes/PhysicsServer3D.xml:1413 msgid "The maximum difference between the pivot points' axes." msgstr "" -#: doc/classes/Generic6DOFJoint.xml:362 +#: doc/classes/Generic6DOFJoint3D.xml:362 msgid "" "A factor applied to the movement across the axes. The lower, the slower the " "movement." msgstr "" -#: doc/classes/Generic6DOFJoint.xml:365 +#: doc/classes/Generic6DOFJoint3D.xml:365 msgid "" "The amount of restitution on the axes' movement. The lower, the more " "momentum gets lost." msgstr "" -#: doc/classes/Generic6DOFJoint.xml:368 doc/classes/PhysicsServer.xml:1422 +#: doc/classes/Generic6DOFJoint3D.xml:368 doc/classes/PhysicsServer3D.xml:1422 msgid "" "The amount of damping that happens at the linear motion across the axes." msgstr "" -#: doc/classes/Generic6DOFJoint.xml:371 +#: doc/classes/Generic6DOFJoint3D.xml:371 msgid "The velocity the linear motor will try to reach." msgstr "" -#: doc/classes/Generic6DOFJoint.xml:374 +#: doc/classes/Generic6DOFJoint3D.xml:374 msgid "" "The maximum force the linear motor will apply while trying to reach the " "velocity target." msgstr "" -#: doc/classes/Generic6DOFJoint.xml:377 doc/classes/PhysicsServer.xml:1431 +#: doc/classes/Generic6DOFJoint3D.xml:377 doc/classes/PhysicsServer3D.xml:1431 msgid "" "The minimum rotation in negative direction to break loose and rotate around " "the axes." msgstr "" -#: doc/classes/Generic6DOFJoint.xml:380 doc/classes/PhysicsServer.xml:1434 +#: doc/classes/Generic6DOFJoint3D.xml:380 doc/classes/PhysicsServer3D.xml:1434 msgid "" "The minimum rotation in positive direction to break loose and rotate around " "the axes." msgstr "" -#: doc/classes/Generic6DOFJoint.xml:383 +#: doc/classes/Generic6DOFJoint3D.xml:383 msgid "The speed of all rotations across the axes." msgstr "" -#: doc/classes/Generic6DOFJoint.xml:386 doc/classes/PhysicsServer.xml:1440 +#: doc/classes/Generic6DOFJoint3D.xml:386 doc/classes/PhysicsServer3D.xml:1440 msgid "" "The amount of rotational damping across the axes. The lower, the more " "dampening occurs." msgstr "" -#: doc/classes/Generic6DOFJoint.xml:389 doc/classes/PhysicsServer.xml:1443 +#: doc/classes/Generic6DOFJoint3D.xml:389 doc/classes/PhysicsServer3D.xml:1443 msgid "" "The amount of rotational restitution across the axes. The lower, the more " "restitution occurs." msgstr "" -#: doc/classes/Generic6DOFJoint.xml:392 doc/classes/PhysicsServer.xml:1446 +#: doc/classes/Generic6DOFJoint3D.xml:392 doc/classes/PhysicsServer3D.xml:1446 msgid "" "The maximum amount of force that can occur, when rotating around the axes." msgstr "" -#: doc/classes/Generic6DOFJoint.xml:395 +#: doc/classes/Generic6DOFJoint3D.xml:395 msgid "" "When rotating across the axes, this error tolerance factor defines how much " "the correction gets slowed down. The lower, the slower." msgstr "" -#: doc/classes/Generic6DOFJoint.xml:398 doc/classes/PhysicsServer.xml:1452 +#: doc/classes/Generic6DOFJoint3D.xml:398 doc/classes/PhysicsServer3D.xml:1452 msgid "Target speed for the motor at the axes." msgstr "" -#: doc/classes/Generic6DOFJoint.xml:401 doc/classes/PhysicsServer.xml:1455 +#: doc/classes/Generic6DOFJoint3D.xml:401 doc/classes/PhysicsServer3D.xml:1455 msgid "Maximum acceleration for the motor at the axes." msgstr "" -#: doc/classes/Generic6DOFJoint.xml:407 +#: doc/classes/Generic6DOFJoint3D.xml:407 msgid "If enabled, linear motion is possible within the given limits." msgstr "" -#: doc/classes/Generic6DOFJoint.xml:410 +#: doc/classes/Generic6DOFJoint3D.xml:410 msgid "If enabled, rotational motion is possible within the given limits." msgstr "" -#: doc/classes/Generic6DOFJoint.xml:417 +#: doc/classes/Generic6DOFJoint3D.xml:417 msgid "If enabled, there is a rotational motor across these axes." msgstr "" -#: doc/classes/Generic6DOFJoint.xml:420 +#: doc/classes/Generic6DOFJoint3D.xml:420 msgid "If enabled, there is a linear motor across these axes." msgstr "" -#: doc/classes/Generic6DOFJoint.xml:423 doc/classes/HingeJoint.xml:118 +#: doc/classes/Generic6DOFJoint3D.xml:423 doc/classes/HingeJoint3D.xml:118 msgid "Represents the size of the [enum Flag] enum." msgstr "" @@ -21531,116 +21463,117 @@ msgstr "" msgid "Endpoints are rounded off and extended by [code]delta[/code] units." msgstr "" -#: doc/classes/GeometryInstance.xml:4 +#: doc/classes/GeometryInstance3D.xml:4 msgid "Base node for geometry-based visual instances." msgstr "" -#: doc/classes/GeometryInstance.xml:7 +#: doc/classes/GeometryInstance3D.xml:7 msgid "" "Base node for geometry-based visual instances. Shares some common " "functionality like visibility and custom materials." msgstr "" -#: doc/classes/GeometryInstance.xml:18 +#: doc/classes/GeometryInstance3D.xml:18 msgid "" -"Returns the [enum GeometryInstance.Flags] that have been set for this object." +"Returns the [enum GeometryInstance3D.Flags] that have been set for this " +"object." msgstr "" -#: doc/classes/GeometryInstance.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/GeometryInstance.xml:38 +#: doc/classes/GeometryInstance3D.xml:46 msgid "" -"Sets the [enum GeometryInstance.Flags] specified. See [enum GeometryInstance." -"Flags] for options." +"Sets the [enum GeometryInstance3D.Flags] specified. See [enum " +"GeometryInstance3D.Flags] for options." msgstr "" -#: doc/classes/GeometryInstance.xml:44 +#: doc/classes/GeometryInstance3D.xml:62 msgid "" "The selected shadow casting flag. See [enum ShadowCastingSetting] for " "possible values." msgstr "" -#: doc/classes/GeometryInstance.xml:47 +#: doc/classes/GeometryInstance3D.xml:65 msgid "" -"The extra distance added to the GeometryInstance's bounding box ([AABB]) to " -"increase its cull box." +"The extra distance added to the GeometryInstance3D's bounding box ([AABB]) " +"to increase its cull box." msgstr "" -#: doc/classes/GeometryInstance.xml:50 +#: doc/classes/GeometryInstance3D.xml:68 msgid "" -"The GeometryInstance's max LOD distance.\n" +"The GeometryInstance3D's max LOD distance.\n" "[b]Note:[/b] This property currently has no effect." msgstr "" -#: doc/classes/GeometryInstance.xml:54 +#: doc/classes/GeometryInstance3D.xml:72 msgid "" -"The GeometryInstance's max LOD margin.\n" +"The GeometryInstance3D's max LOD margin.\n" "[b]Note:[/b] This property currently has no effect." msgstr "" -#: doc/classes/GeometryInstance.xml:58 +#: doc/classes/GeometryInstance3D.xml:76 msgid "" -"The GeometryInstance's min LOD distance.\n" +"The GeometryInstance3D's min LOD distance.\n" "[b]Note:[/b] This property currently has no effect." msgstr "" -#: doc/classes/GeometryInstance.xml:62 +#: doc/classes/GeometryInstance3D.xml:80 msgid "" -"The GeometryInstance's min LOD margin.\n" +"The GeometryInstance3D's min LOD margin.\n" "[b]Note:[/b] This property currently has no effect." msgstr "" -#: doc/classes/GeometryInstance.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/GeometryInstance.xml:72 +#: doc/classes/GeometryInstance3D.xml:90 msgid "" -"If [code]true[/code], this GeometryInstance will be used when baking lights " -"using a [GIProbe]." +"If [code]true[/code], this GeometryInstance3D will be used when baking " +"lights using a [GIProbe]." msgstr "" -#: doc/classes/GeometryInstance.xml:77 +#: doc/classes/GeometryInstance3D.xml:95 msgid "Will not cast any shadows." msgstr "" -#: doc/classes/GeometryInstance.xml:80 +#: doc/classes/GeometryInstance3D.xml:98 msgid "" -"Will cast shadows from all visible faces in the GeometryInstance.\n" +"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/GeometryInstance.xml:84 +#: doc/classes/GeometryInstance3D.xml:102 msgid "" -"Will cast shadows from all visible faces in the GeometryInstance.\n" +"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/GeometryInstance.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/GeometryInstance.xml:92 +#: doc/classes/GeometryInstance3D.xml:110 msgid "" -"Will allow the GeometryInstance to be used when baking lights using a " +"Will allow the GeometryInstance3D to be used when baking lights using a " "[GIProbe]." msgstr "" -#: doc/classes/GeometryInstance.xml:97 +#: doc/classes/GeometryInstance3D.xml:115 msgid "" -"Unused in this class, exposed for consistency with [enum VisualServer." +"Unused in this class, exposed for consistency with [enum RenderingServer." "InstanceFlags]." msgstr "" @@ -21667,9 +21600,9 @@ msgstr "" #: doc/classes/GIProbe.xml:22 msgid "" -"Bakes the effect from all [GeometryInstance]s marked with [member " -"GeometryInstance.use_in_baked_light] and [Light]s marked with either " -"[constant Light.BAKE_INDIRECT] or [constant Light.BAKE_ALL]. If " +"Bakes the effect from all [GeometryInstance3D]s marked with [member " +"GeometryInstance3D.use_in_baked_light] and [Light3D]s marked with either " +"[constant Light3D.BAKE_INDIRECT] or [constant Light3D.BAKE_ALL]. If " "[code]create_visual_debug[/code] is [code]true[/code], after baking the " "light, this will generate a [MultiMesh] that has a cube representing each " "solid cell with each cube colored to the cell's albedo color. This can be " @@ -21739,6 +21672,137 @@ msgstr "" msgid "Returns whether the scripts domain is loaded." msgstr "" +#: doc/classes/GPUParticles2D.xml:4 +msgid "2D particle emitter." +msgstr "" + +#: doc/classes/GPUParticles2D.xml:7 +msgid "" +"2D particle node used to create a variety of particle systems and effects. " +"[GPUParticles2D] features an emitter that generates some number of particles " +"at a given rate.\n" +"Use the [code]process_material[/code] property to add a [ParticlesMaterial] " +"to configure particle appearance and behavior. Alternatively, you can add a " +"[ShaderMaterial] which will be applied to all particles." +msgstr "" + +#: doc/classes/GPUParticles2D.xml:18 +msgid "Returns a rectangle containing the positions of all existing particles." +msgstr "" + +#: doc/classes/GPUParticles2D.xml:25 +msgid "Restarts all the existing particles." +msgstr "" + +#: doc/classes/GPUParticles2D.xml:64 doc/classes/GPUParticles3D.xml:96 +msgid "" +"[Material] for processing particles. Can be a [ParticlesMaterial] or a " +"[ShaderMaterial]." +msgstr "" + +#: doc/classes/GPUParticles2D.xml:76 +msgid "Editor visibility helper." +msgstr "" + +#: doc/classes/GPUParticles3D.xml:4 +msgid "3D particle emitter." +msgstr "" + +#: doc/classes/GPUParticles3D.xml:7 +msgid "" +"3D particle node used to create a variety of particle systems and effects. " +"[GPUParticles3D] features an emitter that generates some number of particles " +"at a given rate.\n" +"Use the [code]process_material[/code] property to add a [ParticlesMaterial] " +"to configure particle appearance and behavior. Alternatively, you can add a " +"[ShaderMaterial] which will be applied to all particles." +msgstr "" + +#: doc/classes/GPUParticles3D.xml:11 +msgid "" +"https://docs.godotengine.org/en/latest/tutorials/3d/vertex_animation/" +"controlling_thousands_of_fish.html" +msgstr "" + +#: doc/classes/GPUParticles3D.xml:18 +msgid "" +"Returns the axis-aligned bounding box that contains all the particles that " +"are active in the current frame." +msgstr "" + +#: doc/classes/GPUParticles3D.xml:27 +msgid "Returns the [Mesh] that is drawn at index [code]pass[/code]." +msgstr "" + +#: doc/classes/GPUParticles3D.xml:34 +msgid "Restarts the particle emission, clearing existing particles." +msgstr "" + +#: doc/classes/GPUParticles3D.xml:45 +msgid "Sets the [Mesh] that is drawn at index [code]pass[/code]." +msgstr "" + +#: doc/classes/GPUParticles3D.xml:51 +msgid "Number of particles to emit." +msgstr "" + +#: doc/classes/GPUParticles3D.xml:57 +msgid "[Mesh] that is drawn for the first draw pass." +msgstr "" + +#: doc/classes/GPUParticles3D.xml:60 +msgid "[Mesh] that is drawn for the second draw pass." +msgstr "" + +#: doc/classes/GPUParticles3D.xml:63 +msgid "[Mesh] that is drawn for the third draw pass." +msgstr "" + +#: doc/classes/GPUParticles3D.xml:66 +msgid "[Mesh] that is drawn for the fourth draw pass." +msgstr "" + +#: doc/classes/GPUParticles3D.xml:69 +msgid "The number of draw passes when rendering particles." +msgstr "" + +#: doc/classes/GPUParticles3D.xml:75 +msgid "" +"Time ratio between each emission. If [code]0[/code], particles are emitted " +"continuously. If [code]1[/code], all particles are emitted simultaneously." +msgstr "" + +#: doc/classes/GPUParticles3D.xml:90 +msgid "" +"If [code]true[/code], only [code]amount[/code] particles will be emitted." +msgstr "" + +#: doc/classes/GPUParticles3D.xml:93 +msgid "" +"Amount of time to preprocess the particles before animation starts. Lets you " +"start the animation some time after particles have started emitting." +msgstr "" + +#: doc/classes/GPUParticles3D.xml:99 +msgid "Emission randomness ratio." +msgstr "" + +#: doc/classes/GPUParticles3D.xml:102 +msgid "" +"Speed scaling ratio. A value of [code]0[/code] can be used to pause the " +"particles." +msgstr "" + +#: doc/classes/GPUParticles3D.xml:105 +msgid "" +"The [AABB] that determines the area of the world part of which needs to be " +"visible on screen for the particle system to be active." +msgstr "" + +#: doc/classes/GPUParticles3D.xml:119 +msgid "Maximum number of draw passes supported." +msgstr "" + #: doc/classes/Gradient.xml:4 msgid "" "A color interpolator resource which can be used to generate colors between " @@ -21977,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 @@ -22000,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 "" @@ -22265,7 +22329,7 @@ msgstr "" msgid "The color modulation applied to the close button icon." msgstr "" -#: doc/classes/GraphNode.xml:265 doc/classes/WindowDialog.xml:41 +#: doc/classes/GraphNode.xml:265 msgid "The vertical offset of the close button." msgstr "" @@ -22393,13 +22457,13 @@ msgid "" "returned if the cell is empty." msgstr "" -#: modules/gridmap/doc_classes/GridMap.xml:75 doc/classes/PhysicsBody.xml:35 -#: doc/classes/PhysicsBody2D.xml:35 +#: modules/gridmap/doc_classes/GridMap.xml:75 doc/classes/PhysicsBody2D.xml:35 +#: doc/classes/PhysicsBody3D.xml:35 msgid "Returns an individual bit on the [member collision_layer]." msgstr "" -#: modules/gridmap/doc_classes/GridMap.xml:84 doc/classes/PhysicsBody.xml:44 -#: doc/classes/PhysicsBody2D.xml:44 +#: modules/gridmap/doc_classes/GridMap.xml:84 doc/classes/PhysicsBody2D.xml:44 +#: doc/classes/PhysicsBody3D.xml:44 msgid "Returns an individual bit on the [member collision_mask]." msgstr "" @@ -22596,106 +22660,107 @@ msgstr "" msgid "The horizontal space between the [HBoxContainer]'s elements." msgstr "" -#: doc/classes/HeightMapShape.xml:4 +#: doc/classes/HeightMapShape3D.xml:4 msgid "Height map shape for 3D physics (Bullet only)." msgstr "" -#: doc/classes/HeightMapShape.xml:7 +#: doc/classes/HeightMapShape3D.xml:7 msgid "" -"Height map shape resource, which can be added to a [PhysicsBody] or [Area]." +"Height map shape resource, which can be added to a [PhysicsBody3D] or " +"[Area3D]." msgstr "" -#: doc/classes/HeightMapShape.xml:15 +#: doc/classes/HeightMapShape3D.xml:15 msgid "" "Height map data, pool array must be of [member map_width] * [member " "map_depth] size." msgstr "" -#: doc/classes/HeightMapShape.xml:18 +#: doc/classes/HeightMapShape3D.xml:18 msgid "" "Depth of the height map data. Changing this will resize the [member " "map_data]." msgstr "" -#: doc/classes/HeightMapShape.xml:21 +#: doc/classes/HeightMapShape3D.xml:21 msgid "" "Width of the height map data. Changing this will resize the [member " "map_data]." msgstr "" -#: doc/classes/HingeJoint.xml:4 +#: doc/classes/HingeJoint3D.xml:4 msgid "A hinge between two 3D bodies." msgstr "" -#: doc/classes/HingeJoint.xml:7 +#: doc/classes/HingeJoint3D.xml:7 msgid "" -"A HingeJoint normally uses the Z axis of body A as the hinge axis, another " +"A HingeJoint3D normally uses the Z axis of body A as the hinge axis, another " "axis can be specified when adding it manually though." msgstr "" -#: doc/classes/HingeJoint.xml:18 doc/classes/SpriteBase3D.xml:24 +#: doc/classes/HingeJoint3D.xml:18 doc/classes/SpriteBase3D.xml:24 msgid "Returns the value of the specified flag." msgstr "" -#: doc/classes/HingeJoint.xml:27 doc/classes/ParticlesMaterial.xml:29 -#: doc/classes/PinJoint.xml:18 +#: doc/classes/HingeJoint3D.xml:27 doc/classes/ParticlesMaterial.xml:29 +#: doc/classes/PinJoint3D.xml:18 msgid "Returns the value of the specified parameter." msgstr "" -#: doc/classes/HingeJoint.xml:38 +#: doc/classes/HingeJoint3D.xml:38 msgid "If [code]true[/code], enables the specified flag." msgstr "" -#: doc/classes/HingeJoint.xml:49 doc/classes/PinJoint.xml:29 +#: doc/classes/HingeJoint3D.xml:49 doc/classes/PinJoint3D.xml:29 msgid "Sets the value of the specified parameter." msgstr "" -#: doc/classes/HingeJoint.xml:55 doc/classes/HingeJoint.xml:95 -#: doc/classes/PhysicsServer.xml:1301 +#: doc/classes/HingeJoint3D.xml:55 doc/classes/HingeJoint3D.xml:95 +#: doc/classes/PhysicsServer3D.xml:1301 msgid "" "The speed with which the rotation across the axis perpendicular to the hinge " "gets corrected." msgstr "" -#: doc/classes/HingeJoint.xml:58 doc/classes/HingeJoint.xml:112 +#: doc/classes/HingeJoint3D.xml:58 doc/classes/HingeJoint3D.xml:112 msgid "" "If [code]true[/code], the hinges maximum and minimum rotation, defined by " "[member angular_limit/lower] and [member angular_limit/upper] has effects." msgstr "" -#: doc/classes/HingeJoint.xml:61 doc/classes/HingeJoint.xml:92 +#: doc/classes/HingeJoint3D.xml:61 doc/classes/HingeJoint3D.xml:92 msgid "" "The minimum rotation. Only active if [member angular_limit/enable] is " "[code]true[/code]." msgstr "" -#: doc/classes/HingeJoint.xml:64 doc/classes/HingeJoint.xml:100 -#: doc/classes/PhysicsServer.xml:1306 +#: doc/classes/HingeJoint3D.xml:64 doc/classes/HingeJoint3D.xml:100 +#: doc/classes/PhysicsServer3D.xml:1306 msgid "The lower this value, the more the rotation gets slowed down." msgstr "" -#: doc/classes/HingeJoint.xml:69 doc/classes/HingeJoint.xml:89 +#: doc/classes/HingeJoint3D.xml:69 doc/classes/HingeJoint3D.xml:89 msgid "" "The maximum rotation. Only active if [member angular_limit/enable] is " "[code]true[/code]." msgstr "" -#: doc/classes/HingeJoint.xml:72 doc/classes/HingeJoint.xml:115 +#: doc/classes/HingeJoint3D.xml:72 doc/classes/HingeJoint3D.xml:115 msgid "When activated, a motor turns the hinge." msgstr "" -#: doc/classes/HingeJoint.xml:75 doc/classes/HingeJoint.xml:106 -#: doc/classes/PhysicsServer.xml:1312 +#: doc/classes/HingeJoint3D.xml:75 doc/classes/HingeJoint3D.xml:106 +#: doc/classes/PhysicsServer3D.xml:1312 msgid "Maximum acceleration for the motor." msgstr "" -#: doc/classes/HingeJoint.xml:78 doc/classes/HingeJoint.xml:103 -#: doc/classes/PhysicsServer.xml:1309 +#: doc/classes/HingeJoint3D.xml:78 doc/classes/HingeJoint3D.xml:103 +#: doc/classes/PhysicsServer3D.xml:1309 msgid "Target speed for the motor." msgstr "" -#: doc/classes/HingeJoint.xml:81 doc/classes/HingeJoint.xml:86 -#: doc/classes/PhysicsServer.xml:1292 +#: doc/classes/HingeJoint3D.xml:81 doc/classes/HingeJoint3D.xml:86 +#: doc/classes/PhysicsServer3D.xml:1292 msgid "" "The speed with which the two bodies get pulled together when they move in " "different directions." @@ -22790,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." @@ -23747,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 " @@ -23767,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 " @@ -23783,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 " @@ -23801,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 " @@ -23824,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 " @@ -23875,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 " @@ -24002,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" @@ -24016,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" @@ -24027,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" @@ -24079,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" @@ -24087,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 " @@ -24157,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 " @@ -24167,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 " @@ -24178,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], " @@ -24186,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], " @@ -24194,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 " @@ -24203,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." @@ -24226,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[/" @@ -24252,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 " @@ -24260,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 " @@ -24268,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 " @@ -24276,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 " @@ -24284,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 " @@ -24294,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 " @@ -24304,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 " @@ -24315,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" @@ -24354,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)." @@ -24415,48 +24487,59 @@ 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 " "after the call." msgstr "" -#: doc/classes/ImmediateGeometry.xml:4 +#: doc/classes/ImmediateGeometry3D.xml:4 msgid "Draws simple geometry from code." msgstr "" -#: doc/classes/ImmediateGeometry.xml:7 +#: 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/ImmediateGeometry.xml:24 +#: doc/classes/ImmediateGeometry3D.xml:27 msgid "" "Simple helper to draw an UV sphere with given latitude, longitude and radius." msgstr "" -#: doc/classes/ImmediateGeometry.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/ImmediateGeometry.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 " @@ -24464,31 +24547,31 @@ msgid "" "For the type of primitive, see the [enum Mesh.PrimitiveType] enum." msgstr "" -#: doc/classes/ImmediateGeometry.xml:52 +#: doc/classes/ImmediateGeometry3D.xml:55 msgid "Clears everything that was drawn using begin/end." msgstr "" -#: doc/classes/ImmediateGeometry.xml:59 +#: doc/classes/ImmediateGeometry3D.xml:62 msgid "Ends a drawing context and displays the results." msgstr "" -#: doc/classes/ImmediateGeometry.xml:68 +#: doc/classes/ImmediateGeometry3D.xml:71 msgid "The current drawing color." msgstr "" -#: doc/classes/ImmediateGeometry.xml:77 +#: doc/classes/ImmediateGeometry3D.xml:80 msgid "The next vertex's normal." msgstr "" -#: doc/classes/ImmediateGeometry.xml:86 +#: doc/classes/ImmediateGeometry3D.xml:89 msgid "The next vertex's tangent (and binormal facing)." msgstr "" -#: doc/classes/ImmediateGeometry.xml:95 +#: doc/classes/ImmediateGeometry3D.xml:98 msgid "The next vertex's UV." msgstr "" -#: doc/classes/ImmediateGeometry.xml:104 +#: doc/classes/ImmediateGeometry3D.xml:107 msgid "The next vertex's second layer UV." msgstr "" @@ -24912,16 +24995,6 @@ msgstr "" msgid "Help cursor. Usually a question mark." msgstr "" -#: doc/classes/InputDefault.xml:4 -msgid "Default implementation of the [Input] class." -msgstr "" - -#: doc/classes/InputDefault.xml:7 -msgid "" -"Default implementation of the [Input] class, used internally by the editor " -"and games for default input management." -msgstr "" - #: doc/classes/InputEvent.xml:4 msgid "Generic input event." msgstr "" @@ -25127,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 " @@ -25137,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 " @@ -25180,7 +25253,8 @@ msgstr "" msgid "" "The key Unicode identifier (when relevant). Unicode identifiers for the " "composite characters and complex scripts may not be available unless IME " -"input mode is active. See [method OS.set_ime_active] for more information." +"input mode is active. See [method Window.set_ime_active] for more " +"information." msgstr "" #: doc/classes/InputEventMouse.xml:4 @@ -25344,28 +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." +msgid "State of the [kbd]Shift[/kbd] modifier." msgstr "" #: doc/classes/InputMap.xml:4 @@ -25524,38 +25598,6 @@ msgid "" "code] will return 13." msgstr "" -#: doc/classes/InterpolatedCamera.xml:4 -msgid "Camera which moves toward another node." -msgstr "" - -#: doc/classes/InterpolatedCamera.xml:7 -msgid "" -"InterpolatedCamera is a [Camera] which smoothly moves to match a target " -"node's position and rotation.\n" -"If it is not [member enabled] or does not have a valid target set, " -"InterpolatedCamera acts like a normal Camera." -msgstr "" - -#: doc/classes/InterpolatedCamera.xml:19 -msgid "Sets the node to move toward and orient with." -msgstr "" - -#: doc/classes/InterpolatedCamera.xml:25 -msgid "" -"If [code]true[/code], and a target is set, the camera will move " -"automatically." -msgstr "" - -#: doc/classes/InterpolatedCamera.xml:28 -msgid "" -"How quickly the camera moves toward its target. Higher values will result in " -"tighter camera motion." -msgstr "" - -#: doc/classes/InterpolatedCamera.xml:31 -msgid "The target's [NodePath]." -msgstr "" - #: doc/classes/IP.xml:4 msgid "Internet protocol (IP) support functions such as DNS resolution." msgstr "" @@ -25668,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 " @@ -25690,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 " @@ -25849,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 @@ -25984,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 @@ -26034,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 @@ -26131,37 +26167,6 @@ msgid "" "environment." msgstr "" -#: doc/classes/Joint.xml:4 -msgid "Base class for all 3D joints." -msgstr "" - -#: doc/classes/Joint.xml:7 -msgid "" -"Joints are used to bind together two physics bodies. They have a solver " -"priority and can define if the bodies of the two attached nodes should be " -"able to collide with each other." -msgstr "" - -#: doc/classes/Joint.xml:15 -msgid "" -"If [code]true[/code], the two bodies of the nodes are not able to collide " -"with each other." -msgstr "" - -#: doc/classes/Joint.xml:18 -msgid "The node attached to the first side (A) of the joint." -msgstr "" - -#: doc/classes/Joint.xml:21 -msgid "The node attached to the second side (B) of the joint." -msgstr "" - -#: doc/classes/Joint.xml:24 -msgid "" -"The priority used to define which solver is executed first for multiple " -"joints. The lower the value, the higher the priority." -msgstr "" - #: doc/classes/Joint2D.xml:4 msgid "Base node for all joint constraints in 2D physics." msgstr "" @@ -26193,6 +26198,37 @@ msgid "" "The second body attached to the joint. Must derive from [PhysicsBody2D]." msgstr "" +#: doc/classes/Joint3D.xml:4 +msgid "Base class for all 3D joints." +msgstr "" + +#: doc/classes/Joint3D.xml:7 +msgid "" +"Joints are used to bind together two physics bodies. They have a solver " +"priority and can define if the bodies of the two attached nodes should be " +"able to collide with each other." +msgstr "" + +#: doc/classes/Joint3D.xml:15 +msgid "" +"If [code]true[/code], the two bodies of the nodes are not able to collide " +"with each other." +msgstr "" + +#: doc/classes/Joint3D.xml:18 +msgid "The node attached to the first side (A) of the joint." +msgstr "" + +#: doc/classes/Joint3D.xml:21 +msgid "The node attached to the second side (B) of the joint." +msgstr "" + +#: doc/classes/Joint3D.xml:24 +msgid "" +"The priority used to define which solver is executed first for multiple " +"joints. The lower the value, the higher the priority." +msgstr "" + #: doc/classes/JSON.xml:4 msgid "Helper class for parsing JSON data." msgstr "" @@ -26268,11 +26304,11 @@ msgid "" "[/codeblock]" msgstr "" -#: doc/classes/KinematicBody.xml:4 -msgid "Kinematic body 3D node." +#: doc/classes/KinematicBody2D.xml:4 +msgid "Kinematic body 2D node." msgstr "" -#: doc/classes/KinematicBody.xml:7 +#: doc/classes/KinematicBody2D.xml:7 msgid "" "Kinematic bodies are special types of bodies that are meant to be user-" "controlled. They are not affected by physics at all; to other types of " @@ -26284,26 +26320,26 @@ msgid "" "compute an estimate of their linear and angular velocity. This makes them " "very useful for moving platforms or other AnimationPlayer-controlled objects " "(like a door, a bridge that opens, etc).\n" -"[b]Kinematic characters:[/b] KinematicBody also has an API for moving " +"[b]Kinematic characters:[/b] KinematicBody2D also has an API for moving " "objects (the [method move_and_collide] and [method move_and_slide] methods) " "while performing collision tests. This makes them really useful to implement " "characters that collide against a world, but that don't require advanced " "physics." msgstr "" -#: doc/classes/KinematicBody.xml:12 doc/classes/KinematicBody2D.xml:12 +#: doc/classes/KinematicBody2D.xml:12 doc/classes/KinematicBody3D.xml:12 msgid "" "https://docs.godotengine.org/en/latest/tutorials/physics/" "kinematic_character_2d.html" msgstr "" -#: doc/classes/KinematicBody.xml:21 +#: doc/classes/KinematicBody2D.xml:13 msgid "" -"Returns [code]true[/code] if the specified [code]axis[/code] is locked. See " -"also [member move_lock_x], [member move_lock_y] and [member move_lock_z]." +"https://docs.godotengine.org/en/latest/tutorials/physics/" +"using_kinematic_body_2d.html" msgstr "" -#: doc/classes/KinematicBody.xml:28 doc/classes/KinematicBody2D.xml:20 +#: doc/classes/KinematicBody2D.xml:20 doc/classes/KinematicBody3D.xml:28 msgid "" "Returns the surface normal of the floor at the last collision point. Only " "valid after calling [method move_and_slide] or [method " @@ -26311,7 +26347,7 @@ msgid "" "code]." msgstr "" -#: doc/classes/KinematicBody.xml:35 doc/classes/KinematicBody2D.xml:27 +#: doc/classes/KinematicBody2D.xml:27 doc/classes/KinematicBody3D.xml:35 msgid "" "Returns the linear velocity of the floor at the last collision point. Only " "valid after calling [method move_and_slide] or [method " @@ -26319,130 +26355,126 @@ msgid "" "code]." msgstr "" -#: doc/classes/KinematicBody.xml:44 +#: doc/classes/KinematicBody2D.xml:36 msgid "" -"Returns a [KinematicCollision], which contains information about a collision " -"that occurred during the last [method move_and_slide] call. Since the body " -"can collide several times in a single call to [method move_and_slide], you " -"must specify the index of the collision in the range 0 to ([method " -"get_slide_count] - 1)." +"Returns a [KinematicCollision2D], which contains information about a " +"collision that occurred during the last [method move_and_slide] call. Since " +"the body can collide several times in a single call to [method " +"move_and_slide], you must specify the index of the collision in the range 0 " +"to ([method get_slide_count] - 1).\n" +"[b]Example usage:[/b]\n" +"[codeblock]\n" +"for i in get_slide_count():\n" +" var collision = get_slide_collision(i)\n" +" print(\"Collided with: \", collision.collider.name)\n" +"[/codeblock]" msgstr "" -#: doc/classes/KinematicBody.xml:51 doc/classes/KinematicBody2D.xml:49 +#: doc/classes/KinematicBody2D.xml:49 doc/classes/KinematicBody3D.xml:51 msgid "" "Returns the number of times the body collided and changed direction during " "the last call to [method move_and_slide]." msgstr "" -#: doc/classes/KinematicBody.xml:58 doc/classes/KinematicBody2D.xml:56 +#: doc/classes/KinematicBody2D.xml:56 doc/classes/KinematicBody3D.xml:58 msgid "" "Returns [code]true[/code] if the body is on the ceiling. Only updates when " "calling [method move_and_slide]." msgstr "" -#: doc/classes/KinematicBody.xml:65 doc/classes/KinematicBody2D.xml:63 +#: doc/classes/KinematicBody2D.xml:63 doc/classes/KinematicBody3D.xml:65 msgid "" "Returns [code]true[/code] if the body is on the floor. Only updates when " "calling [method move_and_slide]." msgstr "" -#: doc/classes/KinematicBody.xml:72 doc/classes/KinematicBody2D.xml:70 +#: doc/classes/KinematicBody2D.xml:70 doc/classes/KinematicBody3D.xml:72 msgid "" "Returns [code]true[/code] if the body is on a wall. Only updates when " "calling [method move_and_slide]." msgstr "" -#: doc/classes/KinematicBody.xml:87 +#: doc/classes/KinematicBody2D.xml:85 msgid "" "Moves the body along the vector [code]rel_vec[/code]. The body will stop if " -"it collides. Returns a [KinematicCollision], which contains information " +"it collides. Returns a [KinematicCollision2D], which contains information " "about the collision.\n" "If [code]test_only[/code] is [code]true[/code], the body does not move but " "the would-be collision information is given." msgstr "" -#: doc/classes/KinematicBody.xml:107 +#: doc/classes/KinematicBody2D.xml:105 msgid "" "Moves the body along a vector. If the body collides with another, it will " "slide along the other body rather than stop immediately. If the other body " -"is a [KinematicBody] or [RigidBody], it will also be affected by the motion " -"of the other body. You can use this to make moving or rotating platforms, or " -"to make nodes push other nodes.\n" +"is a [KinematicBody2D] or [RigidBody2D], it will also be affected by the " +"motion of the other body. You can use this to make moving or rotating " +"platforms, or to make nodes push other nodes.\n" "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.\n" -"[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. \n" +"[code]linear_velocity[/code] is the velocity vector in pixels 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. \n" "[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.\n" +"[code]Vector2(0, 0)[/code], everything is considered a wall. This is useful " +"for topdown games.\n" "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].\n" +"slopes when you include gravity in [code]linear_velocity[/code] and the body " +"is standing still.\n" "If the body collides, it will change direction a maximum of " "[code]max_slides[/code] times before it stops.\n" "[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.\n" "If [code]infinite_inertia[/code] is [code]true[/code], body will be able to " -"push [RigidBody] nodes, but it won't also detect any collisions with them. " -"If [code]false[/code], it will interact with [RigidBody] nodes like with " -"[StaticBody].\n" +"push [RigidBody2D] nodes, but it won't also detect any collisions with them. " +"If [code]false[/code], it will interact with [RigidBody2D] nodes like with " +"[StaticBody2D].\n" "Returns the [code]linear_velocity[/code] vector, rotated and/or scaled if a " "slide collision occurred. To get detailed information about collisions that " "occurred, use [method get_slide_collision]." msgstr "" -#: doc/classes/KinematicBody.xml:136 +#: doc/classes/KinematicBody2D.xml:134 msgid "" "Moves the body while keeping it attached to slopes. Similar to [method " "move_and_slide].\n" "As long as the [code]snap[/code] vector is in contact with the ground, the " "body will remain attached to the surface. This means you must disable snap " "in order to jump, for example. You can do this by setting [code]snap[/code] " -"to [code](0, 0, 0)[/code] or by using [method move_and_slide] instead." -msgstr "" - -#: doc/classes/KinematicBody.xml:148 -msgid "" -"Locks or unlocks the specified [code]axis[/code] depending on the value of " -"[code]lock[/code]. See also [member move_lock_x], [member move_lock_y] and " -"[member move_lock_z]." +"to [code](0, 0)[/code] or by using [method move_and_slide] instead." msgstr "" -#: doc/classes/KinematicBody.xml:161 +#: doc/classes/KinematicBody2D.xml:148 msgid "" "Checks for collisions without moving the body. Virtually sets the node's " -"position, scale and rotation to that of the given [Transform], then tries to " -"move the body along the vector [code]rel_vec[/code]. Returns [code]true[/" +"position, scale and rotation to that of the given [Transform2D], then tries " +"to move the body along the vector [code]rel_vec[/code]. Returns [code]true[/" "code] if a collision would occur." msgstr "" -#: doc/classes/KinematicBody.xml:167 doc/classes/KinematicBody2D.xml:154 +#: doc/classes/KinematicBody2D.xml:154 doc/classes/KinematicBody3D.xml:167 msgid "" "If the body is at least this close to another body, this body will consider " "them to be colliding." msgstr "" -#: doc/classes/KinematicBody.xml:170 -msgid "Lock the body's X axis movement." -msgstr "" - -#: doc/classes/KinematicBody.xml:173 -msgid "Lock the body's Y axis movement." -msgstr "" - -#: doc/classes/KinematicBody.xml:176 -msgid "Lock the body's Z axis movement." +#: doc/classes/KinematicBody2D.xml:157 +msgid "" +"If [code]true[/code], the body's movement will be synchronized to the " +"physics frame. This is useful when animating movement via [AnimationPlayer], " +"for example on moving platforms. Do [b]not[/b] use together with [method " +"move_and_slide] or [method move_and_collide] functions." msgstr "" -#: doc/classes/KinematicBody2D.xml:4 -msgid "Kinematic body 2D node." +#: doc/classes/KinematicBody3D.xml:4 +msgid "Kinematic body 3D node." msgstr "" -#: doc/classes/KinematicBody2D.xml:7 +#: doc/classes/KinematicBody3D.xml:7 msgid "" "Kinematic bodies are special types of bodies that are meant to be user-" "controlled. They are not affected by physics at all; to other types of " @@ -26454,191 +26486,195 @@ msgid "" "compute an estimate of their linear and angular velocity. This makes them " "very useful for moving platforms or other AnimationPlayer-controlled objects " "(like a door, a bridge that opens, etc).\n" -"[b]Kinematic characters:[/b] KinematicBody2D also has an API for moving " +"[b]Kinematic characters:[/b] KinematicBody3D also has an API for moving " "objects (the [method move_and_collide] and [method move_and_slide] methods) " "while performing collision tests. This makes them really useful to implement " "characters that collide against a world, but that don't require advanced " "physics." msgstr "" -#: doc/classes/KinematicBody2D.xml:13 +#: doc/classes/KinematicBody3D.xml:21 msgid "" -"https://docs.godotengine.org/en/latest/tutorials/physics/" -"using_kinematic_body_2d.html" +"Returns [code]true[/code] if the specified [code]axis[/code] is locked. See " +"also [member move_lock_x], [member move_lock_y] and [member move_lock_z]." msgstr "" -#: doc/classes/KinematicBody2D.xml:36 +#: doc/classes/KinematicBody3D.xml:44 msgid "" -"Returns a [KinematicCollision2D], which contains information about a " +"Returns a [KinematicCollision3D], which contains information about a " "collision that occurred during the last [method move_and_slide] call. Since " "the body can collide several times in a single call to [method " "move_and_slide], you must specify the index of the collision in the range 0 " -"to ([method get_slide_count] - 1).\n" -"[b]Example usage:[/b]\n" -"[codeblock]\n" -"for i in get_slide_count():\n" -" var collision = get_slide_collision(i)\n" -" print(\"Collided with: \", collision.collider.name)\n" -"[/codeblock]" +"to ([method get_slide_count] - 1)." msgstr "" -#: doc/classes/KinematicBody2D.xml:85 +#: doc/classes/KinematicBody3D.xml:87 msgid "" "Moves the body along the vector [code]rel_vec[/code]. The body will stop if " -"it collides. Returns a [KinematicCollision2D], which contains information " +"it collides. Returns a [KinematicCollision3D], which contains information " "about the collision.\n" "If [code]test_only[/code] is [code]true[/code], the body does not move but " "the would-be collision information is given." msgstr "" -#: doc/classes/KinematicBody2D.xml:105 +#: doc/classes/KinematicBody3D.xml:107 msgid "" "Moves the body along a vector. If the body collides with another, it will " "slide along the other body rather than stop immediately. If the other body " -"is a [KinematicBody2D] or [RigidBody2D], it will also be affected by the " +"is a [KinematicBody3D] or [RigidBody3D], it will also be affected by the " "motion of the other body. You can use this to make moving or rotating " "platforms, or to make nodes push other nodes.\n" "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.\n" -"[code]linear_velocity[/code] is the velocity vector in pixels 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. \n" +"[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. \n" "[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]Vector2(0, 0)[/code], everything is considered a wall. This is useful " -"for topdown games.\n" +"[code]Vector3(0, 0, 0)[/code], everything is considered a wall.\n" "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.\n" +"slopes if you include gravity in [code]linear_velocity[/code].\n" "If the body collides, it will change direction a maximum of " "[code]max_slides[/code] times before it stops.\n" "[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.\n" "If [code]infinite_inertia[/code] is [code]true[/code], body will be able to " -"push [RigidBody2D] nodes, but it won't also detect any collisions with them. " -"If [code]false[/code], it will interact with [RigidBody2D] nodes like with " -"[StaticBody2D].\n" +"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].\n" "Returns the [code]linear_velocity[/code] vector, rotated and/or scaled if a " "slide collision occurred. To get detailed information about collisions that " "occurred, use [method get_slide_collision]." msgstr "" -#: doc/classes/KinematicBody2D.xml:134 +#: doc/classes/KinematicBody3D.xml:136 msgid "" "Moves the body while keeping it attached to slopes. Similar to [method " "move_and_slide].\n" "As long as the [code]snap[/code] vector is in contact with the ground, the " "body will remain attached to the surface. This means you must disable snap " "in order to jump, for example. You can do this by setting [code]snap[/code] " -"to [code](0, 0)[/code] or by using [method move_and_slide] instead." +"to [code](0, 0, 0)[/code] or by using [method move_and_slide] instead." msgstr "" -#: doc/classes/KinematicBody2D.xml:148 +#: doc/classes/KinematicBody3D.xml:148 +msgid "" +"Locks or unlocks the specified [code]axis[/code] depending on the value of " +"[code]lock[/code]. See also [member move_lock_x], [member move_lock_y] and " +"[member move_lock_z]." +msgstr "" + +#: doc/classes/KinematicBody3D.xml:161 msgid "" "Checks for collisions without moving the body. Virtually sets the node's " -"position, scale and rotation to that of the given [Transform2D], then tries " -"to move the body along the vector [code]rel_vec[/code]. Returns [code]true[/" +"position, scale and rotation to that of the given [Transform], then tries to " +"move the body along the vector [code]rel_vec[/code]. Returns [code]true[/" "code] if a collision would occur." msgstr "" -#: doc/classes/KinematicBody2D.xml:157 -msgid "" -"If [code]true[/code], the body's movement will be synchronized to the " -"physics frame. This is useful when animating movement via [AnimationPlayer], " -"for example on moving platforms. Do [b]not[/b] use together with [method " -"move_and_slide] or [method move_and_collide] functions." +#: doc/classes/KinematicBody3D.xml:170 +msgid "Lock the body's X axis movement." +msgstr "" + +#: doc/classes/KinematicBody3D.xml:173 +msgid "Lock the body's Y axis movement." msgstr "" -#: doc/classes/KinematicCollision.xml:4 -msgid "Collision data for [KinematicBody] collisions." +#: doc/classes/KinematicBody3D.xml:176 +msgid "Lock the body's Z axis movement." msgstr "" -#: doc/classes/KinematicCollision.xml:7 +#: doc/classes/KinematicCollision2D.xml:4 +msgid "Collision data for [KinematicBody2D] collisions." +msgstr "" + +#: doc/classes/KinematicCollision2D.xml:7 msgid "" -"Contains collision data for [KinematicBody] collisions. When a " -"[KinematicBody] is moved using [method KinematicBody.move_and_collide], it " -"stops if it detects a collision with another body. If a collision is " -"detected, a KinematicCollision object is returned.\n" +"Contains collision data for [KinematicBody2D] collisions. When a " +"[KinematicBody2D] is moved using [method KinematicBody2D.move_and_collide], " +"it stops if it detects a collision with another body. If a collision is " +"detected, a KinematicCollision2D object is returned.\n" "This object contains information about the collision, including the " "colliding object, the remaining motion, and the collision position. This " "information can be used to calculate a collision response." msgstr "" -#: doc/classes/KinematicCollision.xml:16 #: doc/classes/KinematicCollision2D.xml:16 +#: doc/classes/KinematicCollision3D.xml:16 msgid "The colliding body." msgstr "" -#: doc/classes/KinematicCollision.xml:19 #: doc/classes/KinematicCollision2D.xml:19 +#: doc/classes/KinematicCollision3D.xml:19 msgid "" "The colliding body's unique instance ID. See [method Object.get_instance_id]." msgstr "" -#: doc/classes/KinematicCollision.xml:22 #: doc/classes/KinematicCollision2D.xml:22 +#: doc/classes/KinematicCollision3D.xml:22 msgid "The colliding body's metadata. See [Object]." msgstr "" -#: doc/classes/KinematicCollision.xml:25 #: doc/classes/KinematicCollision2D.xml:25 +#: doc/classes/KinematicCollision3D.xml:25 msgid "The colliding body's shape." msgstr "" -#: doc/classes/KinematicCollision.xml:28 -msgid "The colliding shape's index. See [CollisionObject]." +#: doc/classes/KinematicCollision2D.xml:28 +msgid "The colliding shape's index. See [CollisionObject2D]." msgstr "" -#: doc/classes/KinematicCollision.xml:31 #: doc/classes/KinematicCollision2D.xml:31 +#: doc/classes/KinematicCollision3D.xml:31 msgid "The colliding object's velocity." msgstr "" -#: doc/classes/KinematicCollision.xml:34 #: doc/classes/KinematicCollision2D.xml:34 +#: doc/classes/KinematicCollision3D.xml:34 msgid "The moving object's colliding shape." msgstr "" -#: doc/classes/KinematicCollision.xml:37 #: doc/classes/KinematicCollision2D.xml:37 +#: doc/classes/KinematicCollision3D.xml:37 msgid "The colliding body's shape's normal at the point of collision." msgstr "" -#: doc/classes/KinematicCollision.xml:40 #: doc/classes/KinematicCollision2D.xml:40 +#: doc/classes/KinematicCollision3D.xml:40 msgid "The point of collision, in global coordinates." msgstr "" -#: doc/classes/KinematicCollision.xml:43 #: doc/classes/KinematicCollision2D.xml:43 +#: doc/classes/KinematicCollision3D.xml:43 msgid "The moving object's remaining movement vector." msgstr "" -#: doc/classes/KinematicCollision.xml:46 #: doc/classes/KinematicCollision2D.xml:46 +#: doc/classes/KinematicCollision3D.xml:46 msgid "The distance the moving object traveled before collision." msgstr "" -#: doc/classes/KinematicCollision2D.xml:4 -msgid "Collision data for [KinematicBody2D] collisions." +#: doc/classes/KinematicCollision3D.xml:4 +msgid "Collision data for [KinematicBody3D] collisions." msgstr "" -#: doc/classes/KinematicCollision2D.xml:7 +#: doc/classes/KinematicCollision3D.xml:7 msgid "" -"Contains collision data for [KinematicBody2D] collisions. When a " -"[KinematicBody2D] is moved using [method KinematicBody2D.move_and_collide], " +"Contains collision data for [KinematicBody3D] collisions. When a " +"[KinematicBody3D] is moved using [method KinematicBody3D.move_and_collide], " "it stops if it detects a collision with another body. If a collision is " -"detected, a KinematicCollision2D object is returned.\n" +"detected, a KinematicCollision3D object is returned.\n" "This object contains information about the collision, including the " "colliding object, the remaining motion, and the collision position. This " "information can be used to calculate a collision response." msgstr "" -#: doc/classes/KinematicCollision2D.xml:28 -msgid "The colliding shape's index. See [CollisionObject2D]." +#: doc/classes/KinematicCollision3D.xml:28 +msgid "The colliding shape's index. See [CollisionObject3D]." msgstr "" #: doc/classes/Label.xml:4 @@ -26853,326 +26889,374 @@ msgstr "" msgid "Sets the size of this [LargeTexture]." msgstr "" -#: doc/classes/Light.xml:4 -msgid "Provides a base class for different kinds of light nodes." +#: doc/classes/Light2D.xml:4 +msgid "Casts light in a 2D environment." msgstr "" -#: doc/classes/Light.xml:7 +#: doc/classes/Light2D.xml:7 msgid "" -"Light is the abstract base class for light nodes, so it shouldn't be used " -"directly (it can't be instanced). Other types of light nodes inherit from " -"it. Light contains the common variables and parameters used for lighting." +"Casts light in a 2D environment. Light is defined by a (usually grayscale) " +"texture, a color, an energy value, a mode (see constants), and various other " +"parameters (range and shadows-related).\n" +"[b]Note:[/b] Light2D can also be used as a mask." msgstr "" -#: doc/classes/Light.xml:19 -msgid "Returns the value of the specified [enum Light.Param] parameter." +#: doc/classes/Light2D.xml:11 doc/classes/LightOccluder2D.xml:10 +msgid "" +"https://docs.godotengine.org/en/latest/tutorials/2d/2d_lights_and_shadows." +"html" msgstr "" -#: doc/classes/Light.xml:30 -msgid "Sets the value of the specified [enum Light.Param] parameter." +#: doc/classes/Light2D.xml:17 +msgid "The Light2D's [Color]." msgstr "" -#: doc/classes/Light.xml:36 -msgid "" -"If [code]true[/code], the light only appears in the editor and will not be " -"visible at runtime." +#: doc/classes/Light2D.xml:20 +msgid "If [code]true[/code], Light2D will only appear when editing the scene." msgstr "" -#: doc/classes/Light.xml:39 -msgid "The light's bake mode. See [enum BakeMode]." +#: doc/classes/Light2D.xml:23 +msgid "If [code]true[/code], Light2D will emit light." msgstr "" -#: doc/classes/Light.xml:42 -msgid "The light's color." +#: doc/classes/Light2D.xml:26 +msgid "" +"The Light2D's energy value. The larger the value, the stronger the light." msgstr "" -#: doc/classes/Light.xml:45 -msgid "The light will affect objects in the selected layers." +#: doc/classes/Light2D.xml:29 +msgid "The Light2D's mode. See [enum Mode] constants for values." msgstr "" -#: doc/classes/Light.xml:48 -msgid "The light's strength multiplier." +#: doc/classes/Light2D.xml:32 +msgid "The offset of the Light2D's [code]texture[/code]." msgstr "" -#: doc/classes/Light.xml:51 -msgid "" -"Secondary multiplier used with indirect light (light bounces). Used with " -"[GIProbe]." +#: doc/classes/Light2D.xml:35 +msgid "The height of the Light2D. Used with 2D normal mapping." msgstr "" -#: doc/classes/Light.xml:54 +#: doc/classes/Light2D.xml:38 msgid "" -"If [code]true[/code], the light's effect is reversed, darkening areas and " -"casting bright shadows." +"The layer mask. Only objects with a matching mask will be affected by the " +"Light2D." +msgstr "" + +#: doc/classes/Light2D.xml:41 +msgid "Maximum layer value of objects that are affected by the Light2D." +msgstr "" + +#: doc/classes/Light2D.xml:44 +msgid "Minimum layer value of objects that are affected by the Light2D." msgstr "" -#: doc/classes/Light.xml:57 +#: doc/classes/Light2D.xml:47 msgid "" -"The intensity of the specular blob in objects affected by the light. At " -"[code]0[/code] the light becomes a pure diffuse light." +"Maximum [code]z[/code] value of objects that are affected by the Light2D." msgstr "" -#: doc/classes/Light.xml:60 +#: doc/classes/Light2D.xml:50 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." +"Minimum [code]z[/code] value of objects that are affected by the Light2D." msgstr "" -#: doc/classes/Light.xml:63 -msgid "The color of shadows cast by this light." +#: doc/classes/Light2D.xml:53 +msgid "Shadow buffer size." msgstr "" -#: doc/classes/Light.xml:66 -msgid "Attempts to reduce [member shadow_bias] gap." +#: doc/classes/Light2D.xml:56 +msgid "[Color] of shadows cast by the Light2D." msgstr "" -#: doc/classes/Light.xml:69 -msgid "If [code]true[/code], the light will cast shadows." +#: doc/classes/Light2D.xml:59 +msgid "If [code]true[/code], the Light2D will cast shadows." msgstr "" -#: doc/classes/Light.xml:72 -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 " -"cast a shadow on both sides of the mesh, set the mesh to use double-sided " -"shadows with [constant GeometryInstance.SHADOW_CASTING_SETTING_DOUBLE_SIDED]." +#: doc/classes/Light2D.xml:62 +msgid "Shadow filter type. See [enum ShadowFilter] for possible values." msgstr "" -#: doc/classes/Light.xml:77 -msgid "Constant for accessing [member light_energy]." +#: doc/classes/Light2D.xml:65 +msgid "Smoothing value for shadows." msgstr "" -#: doc/classes/Light.xml:80 -msgid "Constant for accessing [member light_indirect_energy]." +#: doc/classes/Light2D.xml:68 +msgid "" +"The shadow mask. Used with [LightOccluder2D] to cast shadows. Only occluders " +"with a matching light mask will cast shadows." msgstr "" -#: doc/classes/Light.xml:83 -msgid "Constant for accessing [member light_specular]." +#: doc/classes/Light2D.xml:71 +msgid "[Texture2D] used for the Light2D's appearance." msgstr "" -#: doc/classes/Light.xml:86 +#: doc/classes/Light2D.xml:74 +msgid "The [code]texture[/code]'s scale factor." +msgstr "" + +#: doc/classes/Light2D.xml:79 msgid "" -"Constant for accessing [member OmniLight.omni_range] or [member SpotLight." -"spot_range]." +"Adds the value of pixels corresponding to the Light2D to the values of " +"pixels under it. This is the common behavior of a light." msgstr "" -#: doc/classes/Light.xml:89 +#: doc/classes/Light2D.xml:82 msgid "" -"Constant for accessing [member OmniLight.omni_attenuation] or [member " -"SpotLight.spot_attenuation]." +"Subtracts the value of pixels corresponding to the Light2D to the values of " +"pixels under it, resulting in inversed light effect." msgstr "" -#: doc/classes/Light.xml:92 -msgid "Constant for accessing [member SpotLight.spot_angle]." +#: doc/classes/Light2D.xml:85 +msgid "" +"Mix the value of pixels corresponding to the Light2D to the values of pixels " +"under it by linear interpolation." msgstr "" -#: doc/classes/Light.xml:95 -msgid "Constant for accessing [member SpotLight.spot_angle_attenuation]." +#: doc/classes/Light2D.xml:88 +msgid "" +"The light texture of the Light2D is used as a mask, hiding or revealing " +"parts of the screen underneath depending on the value of each pixel of the " +"light (mask) texture." msgstr "" -#: doc/classes/Light.xml:98 -msgid "Constant for accessing [member shadow_contact]." +#: doc/classes/Light2D.xml:91 +msgid "No filter applies to the shadow map. See [member shadow_filter]." msgstr "" -#: doc/classes/Light.xml:101 +#: doc/classes/Light2D.xml:94 msgid "" -"Constant for accessing [member DirectionalLight." -"directional_shadow_max_distance]." +"Percentage closer filtering (5 samples) applies to the shadow map. See " +"[member shadow_filter]." msgstr "" -#: doc/classes/Light.xml:104 +#: doc/classes/Light2D.xml:97 msgid "" -"Constant for accessing [member DirectionalLight.directional_shadow_split_1]." +"Percentage closer filtering (13 samples) applies to the shadow map. See " +"[member shadow_filter]." msgstr "" -#: doc/classes/Light.xml:107 -msgid "" -"Constant for accessing [member DirectionalLight.directional_shadow_split_2]." +#: doc/classes/Light3D.xml:4 +msgid "Provides a base class for different kinds of light nodes." msgstr "" -#: doc/classes/Light.xml:110 +#: doc/classes/Light3D.xml:7 msgid "" -"Constant for accessing [member DirectionalLight.directional_shadow_split_3]." +"Light3D is the abstract base class for light nodes, so it shouldn't be used " +"directly (it can't be instanced). Other types of light nodes inherit from " +"it. Light3D contains the common variables and parameters used for lighting." msgstr "" -#: doc/classes/Light.xml:115 -msgid "" -"Constant for accessing [member DirectionalLight." -"directional_shadow_normal_bias]." +#: doc/classes/Light3D.xml:19 +msgid "Returns the value of the specified [enum Light3D.Param] parameter." msgstr "" -#: doc/classes/Light.xml:118 -msgid "Constant for accessing [member shadow_bias]." +#: doc/classes/Light3D.xml:30 +msgid "Sets the value of the specified [enum Light3D.Param] parameter." msgstr "" -#: doc/classes/Light.xml:121 +#: doc/classes/Light3D.xml:36 msgid "" -"Constant for accessing [member DirectionalLight." -"directional_shadow_bias_split_scale]." +"If [code]true[/code], the light only appears in the editor and will not be " +"visible at runtime." msgstr "" -#: doc/classes/Light.xml:127 +#: doc/classes/Light3D.xml:39 msgid "" -"Light is ignored when baking.\n" -"[b]Note:[/b] Hiding a light does [i]not[/i] affect baking." +"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/Light.xml:131 -msgid "Only indirect lighting will be baked (default)." +#: doc/classes/Light3D.xml:42 +msgid "The light's bake mode. See [enum BakeMode]." msgstr "" -#: doc/classes/Light.xml:134 -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 " -"(dynamic and baked)." +#: doc/classes/Light3D.xml:45 +msgid "The light's color." msgstr "" -#: doc/classes/Light2D.xml:4 -msgid "Casts light in a 2D environment." +#: doc/classes/Light3D.xml:48 +msgid "The light will affect objects in the selected layers." msgstr "" -#: doc/classes/Light2D.xml:7 +#: doc/classes/Light3D.xml:51 +msgid "The light's strength multiplier." +msgstr "" + +#: doc/classes/Light3D.xml:54 msgid "" -"Casts light in a 2D environment. Light is defined by a (usually grayscale) " -"texture, a color, an energy value, a mode (see constants), and various other " -"parameters (range and shadows-related).\n" -"[b]Note:[/b] Light2D can also be used as a mask." +"Secondary multiplier used with indirect light (light bounces). Used with " +"[GIProbe]." msgstr "" -#: doc/classes/Light2D.xml:11 doc/classes/LightOccluder2D.xml:10 +#: doc/classes/Light3D.xml:57 msgid "" -"https://docs.godotengine.org/en/latest/tutorials/2d/2d_lights_and_shadows." -"html" +"If [code]true[/code], the light's effect is reversed, darkening areas and " +"casting bright shadows." msgstr "" -#: doc/classes/Light2D.xml:17 -msgid "The Light2D's [Color]." +#: 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/Light2D.xml:20 -msgid "If [code]true[/code], Light2D will only appear when editing the scene." +#: 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/Light2D.xml:23 -msgid "If [code]true[/code], Light2D will emit light." +#: 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/Light2D.xml:26 +#: doc/classes/Light3D.xml:69 msgid "" -"The Light2D's energy value. The larger the value, the stronger the light." +"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/Light2D.xml:29 -msgid "The Light2D's mode. See [enum Mode] constants for values." +#: 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/Light2D.xml:32 -msgid "The offset of the Light2D's [code]texture[/code]." +#: doc/classes/Light3D.xml:75 +msgid "The color of shadows cast by this light." msgstr "" -#: doc/classes/Light2D.xml:35 -msgid "The height of the Light2D. Used with 2D normal mapping." +#: doc/classes/Light3D.xml:78 +msgid "If [code]true[/code], the light will cast shadows." msgstr "" -#: doc/classes/Light2D.xml:38 +#: doc/classes/Light3D.xml:81 msgid "" -"The layer mask. Only objects with a matching mask will be affected by the " -"Light2D." +"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/Light2D.xml:41 -msgid "Maximum layer value of objects that are affected by the Light2D." +#: 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 " +"cast a shadow on both sides of the mesh, set the mesh to use double-sided " +"shadows with [constant GeometryInstance3D." +"SHADOW_CASTING_SETTING_DOUBLE_SIDED]." msgstr "" -#: doc/classes/Light2D.xml:44 -msgid "Minimum layer value of objects that are affected by the Light2D." +#: doc/classes/Light3D.xml:91 +msgid "Constant for accessing [member light_energy]." msgstr "" -#: doc/classes/Light2D.xml:47 -msgid "" -"Maximum [code]z[/code] value of objects that are affected by the Light2D." +#: doc/classes/Light3D.xml:94 +msgid "Constant for accessing [member light_indirect_energy]." msgstr "" -#: doc/classes/Light2D.xml:50 -msgid "" -"Minimum [code]z[/code] value of objects that are affected by the Light2D." +#: doc/classes/Light3D.xml:97 +msgid "Constant for accessing [member light_specular]." msgstr "" -#: doc/classes/Light2D.xml:53 -msgid "Shadow buffer size." +#: doc/classes/Light3D.xml:100 +msgid "" +"Constant for accessing [member OmniLight3D.omni_range] or [member " +"SpotLight3D.spot_range]." msgstr "" -#: doc/classes/Light2D.xml:56 -msgid "[Color] of shadows cast by the Light2D." +#: doc/classes/Light3D.xml:103 +msgid "Constant for accessing [member light_size]." msgstr "" -#: doc/classes/Light2D.xml:59 -msgid "If [code]true[/code], the Light2D will cast shadows." +#: doc/classes/Light3D.xml:106 +msgid "" +"Constant for accessing [member OmniLight3D.omni_attenuation] or [member " +"SpotLight3D.spot_attenuation]." msgstr "" -#: doc/classes/Light2D.xml:62 -msgid "Shadow filter type. See [enum ShadowFilter] for possible values." +#: doc/classes/Light3D.xml:109 +msgid "Constant for accessing [member SpotLight3D.spot_angle]." msgstr "" -#: doc/classes/Light2D.xml:65 -msgid "Smoothing value for shadows." +#: doc/classes/Light3D.xml:112 +msgid "Constant for accessing [member SpotLight3D.spot_angle_attenuation]." msgstr "" -#: doc/classes/Light2D.xml:68 +#: doc/classes/Light3D.xml:115 msgid "" -"The shadow mask. Used with [LightOccluder2D] to cast shadows. Only occluders " -"with a matching light mask will cast shadows." +"Constant for accessing [member DirectionalLight3D." +"directional_shadow_max_distance]." msgstr "" -#: doc/classes/Light2D.xml:71 -msgid "[Texture2D] used for the Light2D's appearance." +#: doc/classes/Light3D.xml:118 +msgid "" +"Constant for accessing [member DirectionalLight3D." +"directional_shadow_split_1]." msgstr "" -#: doc/classes/Light2D.xml:74 -msgid "The [code]texture[/code]'s scale factor." +#: doc/classes/Light3D.xml:121 +msgid "" +"Constant for accessing [member DirectionalLight3D." +"directional_shadow_split_2]." msgstr "" -#: doc/classes/Light2D.xml:79 +#: doc/classes/Light3D.xml:124 msgid "" -"Adds the value of pixels corresponding to the Light2D to the values of " -"pixels under it. This is the common behavior of a light." +"Constant for accessing [member DirectionalLight3D." +"directional_shadow_split_3]." msgstr "" -#: doc/classes/Light2D.xml:82 +#: doc/classes/Light3D.xml:127 msgid "" -"Subtracts the value of pixels corresponding to the Light2D to the values of " -"pixels under it, resulting in inversed light effect." +"Constant for accessing [member DirectionalLight3D." +"directional_shadow_fade_start]." msgstr "" -#: doc/classes/Light2D.xml:85 -msgid "" -"Mix the value of pixels corresponding to the Light2D to the values of pixels " -"under it by linear interpolation." +#: doc/classes/Light3D.xml:130 +msgid "Constant for accessing [member shadow_normal_bias]." msgstr "" -#: doc/classes/Light2D.xml:88 +#: doc/classes/Light3D.xml:133 +msgid "Constant for accessing [member shadow_bias]." +msgstr "" + +#: doc/classes/Light3D.xml:136 msgid "" -"The light texture of the Light2D is used as a mask, hiding or revealing " -"parts of the screen underneath depending on the value of each pixel of the " -"light (mask) texture." +"Constant for accessing [member DirectionalLight3D." +"directional_shadow_pancake_size]." msgstr "" -#: doc/classes/Light2D.xml:91 -msgid "No filter applies to the shadow map. See [member shadow_filter]." +#: doc/classes/Light3D.xml:139 +msgid "Constant for accessing [member shadow_blur]." msgstr "" -#: doc/classes/Light2D.xml:94 +#: doc/classes/Light3D.xml:142 +msgid "Constant for accessing [member shadow_transmittance_bias]." +msgstr "" + +#: doc/classes/Light3D.xml:148 msgid "" -"Percentage closer filtering (5 samples) applies to the shadow map. See " -"[member shadow_filter]." +"Light is ignored when baking.\n" +"[b]Note:[/b] Hiding a light does [i]not[/i] affect baking." msgstr "" -#: doc/classes/Light2D.xml:97 +#: doc/classes/Light3D.xml:152 +msgid "Only indirect lighting will be baked (default)." +msgstr "" + +#: doc/classes/Light3D.xml:155 msgid "" -"Percentage closer filtering (13 samples) applies to the shadow map. See " -"[member shadow_filter]." +"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 " +"(dynamic and baked)." msgstr "" #: doc/classes/LightOccluder2D.xml:4 @@ -27359,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 @@ -27529,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 "" @@ -27553,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 "" @@ -27577,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 "" @@ -27585,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 "" @@ -27722,35 +27814,35 @@ msgstr "" msgid "The vertical space between the baseline of text and the underline." msgstr "" -#: doc/classes/Listener.xml:4 +#: doc/classes/Listener3D.xml:4 msgid "Overrides the location sounds are heard from." msgstr "" -#: doc/classes/Listener.xml:7 +#: doc/classes/Listener3D.xml:7 msgid "" "Once added to the scene tree and enabled using [method make_current], this " "node will override the location sounds are heard from. This can be used to " -"listen from a location different from the [Camera].\n" +"listen from a location different from the [Camera3D].\n" "[b]Note:[/b] There is no 2D equivalent for this node yet." msgstr "" -#: doc/classes/Listener.xml:17 +#: doc/classes/Listener3D.xml:17 msgid "Disables the listener to use the current camera's listener instead." msgstr "" -#: doc/classes/Listener.xml:24 +#: doc/classes/Listener3D.xml:24 msgid "Returns the listener's global orthonormalized [Transform]." msgstr "" -#: doc/classes/Listener.xml:31 +#: doc/classes/Listener3D.xml:31 msgid "" "Returns [code]true[/code] if the listener was made current using [method " "make_current], [code]false[/code] otherwise.\n" -"[b]Note:[/b] There may be more than one Listener marked as \"current\" in " +"[b]Note:[/b] There may be more than one Listener3D marked as \"current\" in " "the scene tree, but only the one that was made current last will be used." msgstr "" -#: doc/classes/Listener.xml:39 +#: doc/classes/Listener3D.xml:39 msgid "Enables the listener. This will override the current camera's listener." msgstr "" @@ -27770,6 +27862,8 @@ msgid "" "command line (with e.g. [code]godot -s my_loop.gd[/code], which should then " "be a [MainLoop] implementation.\n" "Here is an example script implementing a simple [MainLoop]:\n" +"[b]FIXME:[/b] No longer valid after DisplayServer split and Input " +"refactoring.\n" "[codeblock]\n" "extends MainLoop\n" "\n" @@ -27804,24 +27898,11 @@ msgid "" "[/codeblock]" msgstr "" -#: doc/classes/MainLoop.xml:54 -msgid "" -"Called when files are dragged from the OS file manager and dropped in the " -"game window. The arguments are a list of file paths and the identifier of " -"the screen where the drag originated." -msgstr "" - -#: doc/classes/MainLoop.xml:61 +#: doc/classes/MainLoop.xml:51 msgid "Called before the program exits." msgstr "" -#: doc/classes/MainLoop.xml:72 -msgid "" -"Called when the user performs an action in the system global menu (e.g. the " -"Mac OS menu bar)." -msgstr "" - -#: doc/classes/MainLoop.xml:81 +#: doc/classes/MainLoop.xml:60 msgid "" "Called each idle frame with the time since the last idle frame as argument " "(in seconds). Equivalent to [method Node._process].\n" @@ -27830,21 +27911,11 @@ msgid "" "frame." msgstr "" -#: doc/classes/MainLoop.xml:89 +#: doc/classes/MainLoop.xml:68 msgid "Called once during initialization." msgstr "" -#: doc/classes/MainLoop.xml:98 -msgid "Called whenever an [InputEvent] is received by the main loop." -msgstr "" - -#: doc/classes/MainLoop.xml:107 -msgid "" -"Deprecated callback, does not do anything. Use [method _input_event] to " -"parse text input. Will be removed in Godot 4.0." -msgstr "" - -#: doc/classes/MainLoop.xml:116 +#: doc/classes/MainLoop.xml:77 msgid "" "Called each physics frame with the time since the last physics frame as " "argument (in seconds). Equivalent to [method Node._physics_process].\n" @@ -27853,99 +27924,42 @@ msgid "" "frame." msgstr "" -#: doc/classes/MainLoop.xml:124 +#: doc/classes/MainLoop.xml:85 msgid "" "Should not be called manually, override [method _finalize] instead. Will be " "removed in Godot 4.0." msgstr "" -#: doc/classes/MainLoop.xml:133 +#: doc/classes/MainLoop.xml:94 msgid "" "Should not be called manually, override [method _idle] instead. Will be " "removed in Godot 4.0." msgstr "" -#: doc/classes/MainLoop.xml:140 +#: doc/classes/MainLoop.xml:101 msgid "" "Should not be called manually, override [method _initialize] instead. Will " "be removed in Godot 4.0." msgstr "" -#: doc/classes/MainLoop.xml:149 -msgid "" -"Should not be called manually, override [method _input_event] instead. Will " -"be removed in Godot 4.0." -msgstr "" - -#: doc/classes/MainLoop.xml:158 -msgid "" -"Should not be called manually, override [method _input_text] instead. Will " -"be removed in Godot 4.0." -msgstr "" - -#: doc/classes/MainLoop.xml:167 +#: doc/classes/MainLoop.xml:110 msgid "" "Should not be called manually, override [method _iteration] instead. Will be " "removed in Godot 4.0." msgstr "" -#: doc/classes/MainLoop.xml:178 +#: doc/classes/MainLoop.xml:121 msgid "Emitted when a user responds to a permission request." msgstr "" -#: doc/classes/MainLoop.xml:184 doc/classes/Node.xml:926 -msgid "" -"Notification received from the OS when the mouse enters the game window.\n" -"Implemented on desktop and web platforms." -msgstr "" - -#: doc/classes/MainLoop.xml:188 doc/classes/Node.xml:930 -msgid "" -"Notification received from the OS when the mouse leaves the game window.\n" -"Implemented on desktop and web platforms." -msgstr "" - -#: doc/classes/MainLoop.xml:192 doc/classes/Node.xml:934 -msgid "" -"Notification received from the OS when the game window is focused.\n" -"Implemented on all platforms." -msgstr "" - -#: doc/classes/MainLoop.xml:196 doc/classes/Node.xml:938 -msgid "" -"Notification received from the OS when the game window is unfocused.\n" -"Implemented on all platforms." -msgstr "" - -#: doc/classes/MainLoop.xml:200 doc/classes/Node.xml:942 -msgid "" -"Notification received from the OS when a quit request is sent (e.g. closing " -"the window with a \"Close\" button or Alt+F4).\n" -"Implemented on desktop platforms." -msgstr "" - -#: doc/classes/MainLoop.xml:204 doc/classes/Node.xml:946 -msgid "" -"Notification received from the OS when a go back request is sent (e.g. " -"pressing the \"Back\" button on Android).\n" -"Specific to the Android platform." -msgstr "" - -#: doc/classes/MainLoop.xml:208 doc/classes/Node.xml:950 -msgid "" -"Notification received from the OS when an unfocus request is sent (e.g. " -"another OS window wants to take the focus).\n" -"No supported platforms currently send this notification." -msgstr "" - -#: doc/classes/MainLoop.xml:212 doc/classes/Node.xml:954 +#: doc/classes/MainLoop.xml:127 doc/classes/Node.xml:945 msgid "" "Notification received from the OS when the application is exceeding its " "allocated memory.\n" "Specific to the iOS platform." msgstr "" -#: doc/classes/MainLoop.xml:216 doc/classes/Node.xml:958 +#: doc/classes/MainLoop.xml:131 doc/classes/Node.xml:949 msgid "" "Notification received when translations may have changed. Can be triggered " "by the user changing the locale. Can be used to respond to language changes, " @@ -27953,34 +27967,34 @@ msgid "" "the built-in translation support, like [method Object.tr]." msgstr "" -#: doc/classes/MainLoop.xml:219 doc/classes/Node.xml:961 +#: doc/classes/MainLoop.xml:134 doc/classes/Node.xml:952 msgid "" "Notification received from the OS when a request for \"About\" information " "is sent.\n" "Specific to the macOS platform." msgstr "" -#: doc/classes/MainLoop.xml:223 doc/classes/Node.xml:965 +#: doc/classes/MainLoop.xml:138 doc/classes/Node.xml:956 msgid "" "Notification received from Godot's crash handler when the engine is about to " "crash.\n" "Implemented on desktop platforms if the crash handler is enabled." msgstr "" -#: doc/classes/MainLoop.xml:227 doc/classes/Node.xml:969 +#: doc/classes/MainLoop.xml:142 doc/classes/Node.xml:960 msgid "" "Notification received from the OS when an update of the Input Method Engine " "occurs (e.g. change of IME cursor position or composition string).\n" "Specific to the macOS platform." msgstr "" -#: doc/classes/MainLoop.xml:231 doc/classes/Node.xml:973 +#: doc/classes/MainLoop.xml:146 doc/classes/Node.xml:964 msgid "" "Notification received from the OS when the app is resumed.\n" "Specific to the Android platform." msgstr "" -#: doc/classes/MainLoop.xml:235 doc/classes/Node.xml:977 +#: doc/classes/MainLoop.xml:150 doc/classes/Node.xml:968 msgid "" "Notification received from the OS when the app is paused.\n" "Specific to the Android platform." @@ -28084,7 +28098,7 @@ msgstr "" #: doc/classes/Material.xml:7 msgid "" "Material is a base [Resource] used for coloring and shading geometry. All " -"materials inherit from it and almost all [VisualInstance] derived nodes " +"materials inherit from it and almost all [VisualInstance3D] derived nodes " "carry a Material. A few flags and parameters are shared between all material " "types and are configured here." msgstr "" @@ -28147,7 +28161,7 @@ msgid "" msgstr "" #: doc/classes/MenuButton.xml:43 -msgid "Emitted when [PopupMenu] of this MenuButton is about to show." +msgid "Emitted when the [PopupMenu] of this MenuButton is about to show." msgstr "" #: doc/classes/MenuButton.xml:51 @@ -28211,7 +28225,7 @@ msgid "" msgstr "" #: doc/classes/Mesh.xml:16 -msgid "Calculate a [ConvexPolygonShape] from the mesh." +msgid "Calculate a [ConvexPolygonShape3D] from the mesh." msgstr "" #: doc/classes/Mesh.xml:25 @@ -28223,7 +28237,7 @@ msgid "" msgstr "" #: doc/classes/Mesh.xml:33 -msgid "Calculate a [ConcavePolygonShape] from the mesh." +msgid "Calculate a [ConcavePolygonShape3D] from the mesh." msgstr "" #: doc/classes/Mesh.xml:40 @@ -28293,11 +28307,11 @@ msgstr "" msgid "Render array as triangle strips." msgstr "" -#: doc/classes/Mesh.xml:126 doc/classes/VisualServer.xml:3263 +#: doc/classes/Mesh.xml:126 doc/classes/RenderingServer.xml:3306 msgid "Blend shapes are normalized." msgstr "" -#: doc/classes/Mesh.xml:129 doc/classes/VisualServer.xml:3266 +#: doc/classes/Mesh.xml:129 doc/classes/RenderingServer.xml:3309 msgid "Blend shapes are relative to base weight." msgstr "" @@ -28339,37 +28353,37 @@ msgstr "" msgid "Mesh array uses indices." msgstr "" -#: doc/classes/Mesh.xml:159 doc/classes/VisualServer.xml:3219 +#: 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/VisualServer.xml:3222 +#: 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/VisualServer.xml:3225 +#: 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/VisualServer.xml:3228 +#: 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/VisualServer.xml:3231 +#: 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/VisualServer.xml:3234 +#: 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/VisualServer.xml:3237 +#: 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/VisualServer.xml:3242 +#: 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 " @@ -28434,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 " @@ -28504,196 +28523,210 @@ 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 "" -#: doc/classes/MeshInstance.xml:4 -msgid "Node that instances meshes into a scenario." +#: doc/classes/MeshInstance2D.xml:4 +msgid "Node used for displaying a [Mesh] in 2D." msgstr "" -#: doc/classes/MeshInstance.xml:7 +#: doc/classes/MeshInstance2D.xml:7 msgid "" -"MeshInstance is a node that takes a [Mesh] resource and adds it to the " -"current scenario by creating an instance of it. This is the class most often " -"used to get 3D geometry rendered and can be used to instance a single [Mesh] " -"in many places. This allows to reuse geometry and save on resources. When a " -"[Mesh] has to be instanced more than thousands of times at close proximity, " -"consider using a [MultiMesh] in a [MultiMeshInstance] instead." +"Node used for displaying a [Mesh] in 2D. Can be constructed from an existing " +"[Sprite2D] via a tool in the editor toolbar. Select \"Sprite2D\" then " +"\"Convert to Mesh2D\", select settings in popup and press \"Create Mesh2D\"." msgstr "" -#: doc/classes/MeshInstance.xml:16 -msgid "" -"This helper creates a [StaticBody] child node with a [ConvexPolygonShape] " -"collision shape calculated from the mesh geometry. It's mainly used for " -"testing." +#: doc/classes/MeshInstance2D.xml:10 +msgid "https://docs.godotengine.org/en/latest/tutorials/2d/2d_meshes.html" msgstr "" -#: doc/classes/MeshInstance.xml:23 -msgid "" -"This helper creates a [MeshInstance] child node with gizmos at every vertex " -"calculated from the mesh geometry. It's mainly used for testing." +#: doc/classes/MeshInstance2D.xml:16 +msgid "The [Mesh] that will be drawn by the [MeshInstance2D]." msgstr "" -#: doc/classes/MeshInstance.xml:30 +#: doc/classes/MeshInstance2D.xml:19 doc/classes/MultiMeshInstance2D.xml:19 msgid "" -"This helper creates a [StaticBody] child node with a [ConcavePolygonShape] " -"collision shape calculated from the mesh geometry. It's mainly used for " -"testing." +"The normal map that will be used if using the default [CanvasItemMaterial]." msgstr "" -#: doc/classes/MeshInstance.xml:39 -msgid "Returns the [Material] for a surface of the [Mesh] resource." +#: doc/classes/MeshInstance2D.xml:22 doc/classes/MultiMeshInstance2D.xml:22 +msgid "" +"The [Texture2D] that will be used if using the default [CanvasItemMaterial]. " +"Can be accessed as [code]TEXTURE[/code] in CanvasItem shader." msgstr "" -#: doc/classes/MeshInstance.xml:46 -msgid "Returns the number of surface materials." +#: doc/classes/MeshInstance2D.xml:28 doc/classes/MultiMeshInstance2D.xml:28 +msgid "Emitted when the [member texture] is changed." msgstr "" -#: doc/classes/MeshInstance.xml:57 -msgid "Sets the [Material] for a surface of the [Mesh] resource." +#: doc/classes/MeshInstance3D.xml:4 +msgid "Node that instances meshes into a scenario." msgstr "" -#: doc/classes/MeshInstance.xml:63 -msgid "The [Mesh] resource for the instance." +#: doc/classes/MeshInstance3D.xml:7 +msgid "" +"MeshInstance3D is a node that takes a [Mesh] resource and adds it to the " +"current scenario by creating an instance of it. This is the class most often " +"used render 3D geometry and can be used to instance a single [Mesh] in many " +"places. This allows reuse of geometry which can save on resources. When a " +"[Mesh] has to be instanced more than thousands of times at close proximity, " +"consider using a [MultiMesh] in a [MultiMeshInstance3D] instead." msgstr "" -#: doc/classes/MeshInstance.xml:66 -msgid "[NodePath] to the [Skeleton] associated with the instance." +#: doc/classes/MeshInstance3D.xml:16 +msgid "" +"This helper creates a [StaticBody3D] child node with a " +"[ConvexPolygonShape3D] collision shape calculated from the mesh geometry. " +"It's mainly used for testing." msgstr "" -#: doc/classes/MeshInstance.xml:69 -msgid "Sets the skin to be used by this instance." +#: doc/classes/MeshInstance3D.xml:23 +msgid "" +"This helper creates a [MeshInstance3D] child node with gizmos at every " +"vertex calculated from the mesh geometry. It's mainly used for testing." msgstr "" -#: doc/classes/MeshInstance2D.xml:4 -msgid "Node used for displaying a [Mesh] in 2D." +#: doc/classes/MeshInstance3D.xml:30 +msgid "" +"This helper creates a [StaticBody3D] child node with a " +"[ConcavePolygonShape3D] collision shape calculated from the mesh geometry. " +"It's mainly used for testing." msgstr "" -#: doc/classes/MeshInstance2D.xml:7 +#: doc/classes/MeshInstance3D.xml:39 msgid "" -"Node used for displaying a [Mesh] in 2D. Can be constructed from an existing " -"[Sprite] via a tool in the editor toolbar. Select \"Sprite\" then \"Convert " -"to Mesh2D\", select settings in popup and press \"Create Mesh2D\"." +"Returns the [Material] that will be used by the [Mesh] when drawing. This " +"can return the [member GeometryInstance3D.material_override], the surface " +"override [Material] defined in this [MeshInstance3D], or the surface " +"[Material] defined in the [Mesh]. For example, if [member GeometryInstance3D." +"material_override] is used, all surfaces will return the override material." msgstr "" -#: doc/classes/MeshInstance2D.xml:10 -msgid "https://docs.godotengine.org/en/latest/tutorials/2d/2d_meshes.html" +#: doc/classes/MeshInstance3D.xml:48 +msgid "" +"Returns the override [Material] for the specified surface of the [Mesh] " +"resource." msgstr "" -#: doc/classes/MeshInstance2D.xml:16 -msgid "The [Mesh] that will be drawn by the [MeshInstance2D]." +#: doc/classes/MeshInstance3D.xml:55 +msgid "Returns the number of surface materials." msgstr "" -#: doc/classes/MeshInstance2D.xml:19 doc/classes/MultiMeshInstance2D.xml:19 +#: doc/classes/MeshInstance3D.xml:66 msgid "" -"The normal map that will be used if using the default [CanvasItemMaterial]." +"Sets the override [Material] for the specified surface of the [Mesh] " +"resource. This material is associated with this [MeshInstance3D] rather than " +"with the [Mesh] resource." msgstr "" -#: doc/classes/MeshInstance2D.xml:22 doc/classes/MultiMeshInstance2D.xml:22 -msgid "" -"The [Texture2D] that will be used if using the default [CanvasItemMaterial]. " -"Can be accessed as [code]TEXTURE[/code] in CanvasItem shader." +#: doc/classes/MeshInstance3D.xml:72 +msgid "The [Mesh] resource for the instance." msgstr "" -#: doc/classes/MeshInstance2D.xml:28 doc/classes/MultiMeshInstance2D.xml:28 -msgid "Emitted when the [member texture] is changed." +#: doc/classes/MeshInstance3D.xml:75 +msgid "[NodePath] to the [Skeleton3D] associated with the instance." +msgstr "" + +#: doc/classes/MeshInstance3D.xml:78 +msgid "Sets the skin to be used by this instance." msgstr "" #: doc/classes/MeshLibrary.xml:4 @@ -28753,7 +28786,7 @@ msgstr "" #: doc/classes/MeshLibrary.xml:96 msgid "" "Returns an item's collision shapes.\n" -"The array consists of each [Shape] followed by its [Transform]." +"The array consists of each [Shape3D] followed by its [Transform]." msgstr "" #: doc/classes/MeshLibrary.xml:104 @@ -28790,9 +28823,9 @@ msgstr "" #: doc/classes/MeshLibrary.xml:180 msgid "" "Sets an item's collision shapes.\n" -"The array should consist of [Shape] objects, each followed by a [Transform] " -"that will be applied to it. For shapes that should not have a transform, use " -"[constant Transform.IDENTITY]." +"The array should consist of [Shape3D] objects, each followed by a " +"[Transform] that will be applied to it. For shapes that should not have a " +"transform, use [constant Transform.IDENTITY]." msgstr "" #: doc/classes/MeshTexture.xml:4 @@ -28832,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 "" @@ -28851,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 @@ -28885,8 +28918,8 @@ msgstr "" #: doc/classes/MultiMesh.xml:7 msgid "" "MultiMesh provides low-level mesh instancing. Drawing thousands of " -"[MeshInstance] nodes can be slow, since each object is submitted to the GPU " -"then drawn individually.\n" +"[MeshInstance3D] nodes can be slow, since each object is submitted to the " +"GPU then drawn individually.\n" "MultiMesh is much faster as it can draw thousands of instances with a single " "draw call, resulting in less API overhead.\n" "As a drawback, if the instances are too far away of each other, performance " @@ -28896,13 +28929,13 @@ msgid "" "provided by the user." msgstr "" -#: doc/classes/MultiMesh.xml:13 doc/classes/MultiMeshInstance.xml:11 +#: doc/classes/MultiMesh.xml:13 doc/classes/MultiMeshInstance3D.xml:11 msgid "" "https://docs.godotengine.org/en/latest/tutorials/3d/vertex_animation/" "animating_thousands_of_fish.html" msgstr "" -#: doc/classes/MultiMesh.xml:14 doc/classes/MultiMeshInstance.xml:13 +#: doc/classes/MultiMesh.xml:14 doc/classes/MultiMeshInstance3D.xml:13 msgid "" "https://docs.godotengine.org/en/latest/tutorials/optimization/" "using_multimesh.html" @@ -28993,43 +29026,43 @@ msgstr "" msgid "Use this when using 3D transforms." msgstr "" -#: doc/classes/MultiMeshInstance.xml:4 +#: doc/classes/MultiMeshInstance2D.xml:4 +msgid "Node that instances a [MultiMesh] in 2D." +msgstr "" + +#: doc/classes/MultiMeshInstance2D.xml:7 +msgid "" +"[MultiMeshInstance2D] is a specialized node to instance a [MultiMesh] " +"resource in 2D.\n" +"Usage is the same as [MultiMeshInstance3D]." +msgstr "" + +#: doc/classes/MultiMeshInstance2D.xml:16 +msgid "The [MultiMesh] that will be drawn by the [MultiMeshInstance2D]." +msgstr "" + +#: doc/classes/MultiMeshInstance3D.xml:4 msgid "Node that instances a [MultiMesh]." msgstr "" -#: doc/classes/MultiMeshInstance.xml:7 +#: doc/classes/MultiMeshInstance3D.xml:7 msgid "" -"[MultiMeshInstance] is a specialized node to instance [GeometryInstance]s " -"based on a [MultiMesh] resource.\n" +"[MultiMeshInstance3D] is a specialized node to instance " +"[GeometryInstance3D]s based on a [MultiMesh] resource.\n" "This is useful to optimize the rendering of a high amount of instances of a " "given mesh (for example trees in a forest or grass strands)." msgstr "" -#: doc/classes/MultiMeshInstance.xml:12 +#: doc/classes/MultiMeshInstance3D.xml:12 msgid "" "https://docs.godotengine.org/en/latest/tutorials/3d/" "using_multi_mesh_instance.html" msgstr "" -#: doc/classes/MultiMeshInstance.xml:19 +#: doc/classes/MultiMeshInstance3D.xml:19 msgid "" "The [MultiMesh] resource that will be used and shared among all instances of " -"the [MultiMeshInstance]." -msgstr "" - -#: doc/classes/MultiMeshInstance2D.xml:4 -msgid "Node that instances a [MultiMesh] in 2D." -msgstr "" - -#: doc/classes/MultiMeshInstance2D.xml:7 -msgid "" -"[MultiMeshInstance2D] is a specialized node to instance a [MultiMesh] " -"resource in 2D.\n" -"Usage is the same as [MultiMeshInstance]." -msgstr "" - -#: doc/classes/MultiMeshInstance2D.xml:16 -msgid "The [MultiMesh] that will be drawn by the [MultiMeshInstance2D]." +"the [MultiMeshInstance3D]." msgstr "" #: doc/classes/MultiplayerAPI.xml:4 @@ -29292,67 +29325,30 @@ msgid "" "API extension." msgstr "" -#: doc/classes/Navigation.xml:4 -msgid "Mesh-based navigation and pathfinding node." +#: doc/classes/Navigation2D.xml:4 +msgid "2D navigation and pathfinding node." msgstr "" -#: doc/classes/Navigation.xml:7 +#: doc/classes/Navigation2D.xml:7 msgid "" -"Provides navigation and pathfinding within a collection of " -"[NavigationMesh]es. These will be automatically collected from child " -"[NavigationRegion] nodes. In addition to basic pathfinding, this class also " -"assists with aligning navigation agents with the meshes they are navigating " -"on." +"Navigation2D provides navigation and pathfinding within a 2D area, specified " +"as a collection of [NavigationPolygon] resources. These are automatically " +"collected from child [NavigationRegion2D] nodes." msgstr "" -#: doc/classes/Navigation.xml:18 doc/classes/Navigation2D.xml:18 -#: doc/classes/Navigation2DServer.xml:175 +#: doc/classes/Navigation2D.xml:18 doc/classes/Navigation3D.xml:18 +#: doc/classes/NavigationServer2D.xml:175 msgid "" "Returns the point closest to the provided [code]to_point[/code] on the " "navigation mesh surface." msgstr "" -#: doc/classes/Navigation.xml:27 -msgid "" -"Returns the normal for the point returned by [method get_closest_point]." -msgstr "" - -#: doc/classes/Navigation.xml:36 doc/classes/Navigation2D.xml:27 +#: doc/classes/Navigation2D.xml:27 doc/classes/Navigation3D.xml:36 msgid "" "Returns the owner region RID for the point returned by [method " "get_closest_point]." msgstr "" -#: doc/classes/Navigation.xml:49 doc/classes/NavigationServer.xml:212 -msgid "" -"Returns the closest point between the navigation surface and the segment." -msgstr "" - -#: doc/classes/Navigation.xml:68 -msgid "" -"Returns the path between two given points. Points are in local coordinate " -"space. If [code]optimize[/code] is [code]true[/code] (the default), the " -"agent properties associated with each [NavigationMesh] (radius, height, " -"etc.) are considered in the path calculation, otherwise they are ignored." -msgstr "" - -#: doc/classes/Navigation.xml:78 -msgid "" -"Defines which direction is up. By default, this is [code](0, 1, 0)[/code], " -"which is the world's \"up\" direction." -msgstr "" - -#: doc/classes/Navigation2D.xml:4 -msgid "2D navigation and pathfinding node." -msgstr "" - -#: doc/classes/Navigation2D.xml:7 -msgid "" -"Navigation2D provides navigation and pathfinding within a 2D area, specified " -"as a collection of [NavigationPolygon] resources. These are automatically " -"collected from child [NavigationRegion2D] nodes." -msgstr "" - #: doc/classes/Navigation2D.xml:46 msgid "" "Returns the path between two given points. Points are in local coordinate " @@ -29360,206 +29356,107 @@ msgid "" "is smoothed by merging path segments where possible." msgstr "" -#: doc/classes/Navigation2DServer.xml:4 -msgid "Server interface for low-level 2D navigation access" -msgstr "" - -#: doc/classes/Navigation2DServer.xml:7 -msgid "" -"Navigation2DServer is the server responsible for all 2D navigation. It " -"creates the agents, maps, and regions for navigation to work as expected. " -"This keeps tracks of any call and executes them during the sync phase. This " -"means that you can request any change to the map, using any thread, without " -"worrying." -msgstr "" - -#: doc/classes/Navigation2DServer.xml:16 doc/classes/NavigationServer.xml:16 -msgid "Creates the agent." -msgstr "" - -#: doc/classes/Navigation2DServer.xml:25 doc/classes/NavigationServer.xml:25 -msgid "Returns true if the map got changed the previous frame." -msgstr "" - -#: doc/classes/Navigation2DServer.xml:40 doc/classes/NavigationServer.xml:40 -msgid "Callback called at the end of the RVO process." -msgstr "" - -#: doc/classes/Navigation2DServer.xml:51 doc/classes/NavigationServer.xml:51 -msgid "Puts the agent in the map." -msgstr "" - -#: doc/classes/Navigation2DServer.xml:62 doc/classes/NavigationServer.xml:62 -msgid "" -"Sets the maximum number of other agents the agent takes into account in the " -"navigation. The larger this number, the longer the running time of the " -"simulation. If the number is too low, the simulation will not be safe." -msgstr "" - -#: doc/classes/Navigation2DServer.xml:73 doc/classes/NavigationServer.xml:73 -msgid "Sets the maximum speed of the agent. Must be positive." -msgstr "" - -#: doc/classes/Navigation2DServer.xml:84 doc/classes/NavigationServer.xml:84 -msgid "" -"Sets the maximum distance to other agents this agent takes into account in " -"the navigation. The larger this number, the longer the running time of the " -"simulation. If the number is too low, the simulation will not be safe." -msgstr "" - -#: doc/classes/Navigation2DServer.xml:95 doc/classes/NavigationServer.xml:95 -msgid "Sets the position of the agent in world space." -msgstr "" - -#: doc/classes/Navigation2DServer.xml:106 doc/classes/NavigationServer.xml:106 -msgid "Sets the radius of the agent." -msgstr "" - -#: doc/classes/Navigation2DServer.xml:117 doc/classes/NavigationServer.xml:117 -msgid "Sets the new target velocity." +#: doc/classes/Navigation3D.xml:4 +msgid "Mesh-based navigation and pathfinding node." msgstr "" -#: doc/classes/Navigation2DServer.xml:128 doc/classes/NavigationServer.xml:128 +#: doc/classes/Navigation3D.xml:7 msgid "" -"The minimal amount of time for which the agent's velocities that are " -"computed by the simulation are safe with respect to other agents. The larger " -"this number, the sooner this agent will respond to the presence of other " -"agents, but the less freedom this agent has in choosing its velocities. Must " -"be positive." -msgstr "" - -#: doc/classes/Navigation2DServer.xml:139 doc/classes/NavigationServer.xml:139 -msgid "Sets the current velocity of the agent." -msgstr "" - -#: doc/classes/Navigation2DServer.xml:148 doc/classes/NavigationServer.xml:148 -msgid "Destroy the RID" -msgstr "" - -#: doc/classes/Navigation2DServer.xml:155 doc/classes/NavigationServer.xml:155 -msgid "Create a new map." -msgstr "" - -#: doc/classes/Navigation2DServer.xml:164 doc/classes/NavigationServer.xml:164 -msgid "Returns the map cell size." +"Provides navigation and pathfinding within a collection of " +"[NavigationMesh]es. These will be automatically collected from child " +"[NavigationRegion3D] nodes. In addition to basic pathfinding, this class " +"also assists with aligning navigation agents with the meshes they are " +"navigating on." msgstr "" -#: doc/classes/Navigation2DServer.xml:186 doc/classes/NavigationServer.xml:197 +#: doc/classes/Navigation3D.xml:27 msgid "" -"Returns the owner region RID for the point returned by [method " -"map_get_closest_point]." +"Returns the normal for the point returned by [method get_closest_point]." msgstr "" -#: doc/classes/Navigation2DServer.xml:195 +#: doc/classes/Navigation3D.xml:49 doc/classes/NavigationServer3D.xml:212 msgid "" -"Returns the edge connection margin of the map. The edge connection margin is " -"a distance used to connect two regions." +"Returns the closest point between the navigation surface and the segment." msgstr "" -#: doc/classes/Navigation2DServer.xml:210 +#: doc/classes/Navigation3D.xml:68 msgid "" -"Returns the navigation path to reach the destination from the origin, while " -"avoiding static obstacles." -msgstr "" - -#: doc/classes/Navigation2DServer.xml:219 doc/classes/NavigationServer.xml:254 -msgid "Returns true if the map is active." -msgstr "" - -#: doc/classes/Navigation2DServer.xml:230 doc/classes/NavigationServer.xml:265 -msgid "Sets the map active." -msgstr "" - -#: doc/classes/Navigation2DServer.xml:241 doc/classes/NavigationServer.xml:276 -msgid "Set the map cell size used to weld the navigation mesh polygons." +"Returns the path between two given points. Points are in local coordinate " +"space. If [code]optimize[/code] is [code]true[/code] (the default), the " +"agent properties associated with each [NavigationMesh] (radius, height, " +"etc.) are considered in the path calculation, otherwise they are ignored." msgstr "" -#: doc/classes/Navigation2DServer.xml:252 +#: doc/classes/Navigation3D.xml:78 msgid "" -"Set the map edge connection margin used to weld the compatible region edges." -msgstr "" - -#: doc/classes/Navigation2DServer.xml:259 doc/classes/NavigationServer.xml:327 -msgid "Creates a new region." -msgstr "" - -#: doc/classes/Navigation2DServer.xml:270 doc/classes/NavigationServer.xml:338 -msgid "Sets the map for the region." -msgstr "" - -#: doc/classes/Navigation2DServer.xml:281 doc/classes/NavigationServer.xml:349 -msgid "Sets the navigation mesh for the region." -msgstr "" - -#: doc/classes/Navigation2DServer.xml:292 doc/classes/NavigationServer.xml:360 -msgid "Sets the global transformation for the region." +"Defines which direction is up. By default, this is [code](0, 1, 0)[/code], " +"which is the world's \"up\" direction." msgstr "" -#: doc/classes/NavigationAgent.xml:4 -msgid "3D Agent used in navigation for collision avoidance." +#: doc/classes/NavigationAgent2D.xml:4 +msgid "2D Agent used in navigation for collision avoidance." msgstr "" -#: doc/classes/NavigationAgent.xml:7 +#: doc/classes/NavigationAgent2D.xml:7 msgid "" -"3D Agent that is used in navigation to reach a location while avoiding " +"2D Agent that is used in navigation to reach a location while avoiding " "static and dynamic obstacles. The dynamic obstacles are avoided using RVO " "collision avoidance. The agent needs navigation data to work correctly. This " -"can be done by having the agent as a child of a [Navigation] node, or using " -"[method set_navigation]. [NavigationAgent] is physics safe." +"can be done by having the agent as a child of a [Navigation2D] node, or " +"using [method set_navigation]. [NavigationAgent2D] is physics safe." msgstr "" -#: doc/classes/NavigationAgent.xml:16 doc/classes/NavigationAgent2D.xml:16 +#: doc/classes/NavigationAgent2D.xml:16 doc/classes/NavigationAgent3D.xml:16 msgid "" "Returns the distance to the target location, using the agent's global " "position. The user must set the target location with [method " "set_target_location] in order for this to be accurate." msgstr "" -#: doc/classes/NavigationAgent.xml:23 +#: doc/classes/NavigationAgent2D.xml:23 msgid "" "Returns the reachable final location in global coordinates. This can change " -"if the navigation path is altered in any way. Because of this, it would be " -"best to check this each frame." +"if the navigation path is altered in any way." msgstr "" -#: doc/classes/NavigationAgent.xml:30 doc/classes/NavigationAgent2D.xml:30 +#: doc/classes/NavigationAgent2D.xml:30 doc/classes/NavigationAgent3D.xml:30 msgid "Returns the path from start to finish in global coordinates." msgstr "" -#: doc/classes/NavigationAgent.xml:37 +#: doc/classes/NavigationAgent2D.xml:37 msgid "" "Returns which index the agent is currently on in the navigation path's " -"[PackedVector3Array]." +"[PackedVector2Array]." msgstr "" -#: doc/classes/NavigationAgent.xml:44 +#: doc/classes/NavigationAgent2D.xml:44 msgid "" -"Returns the [Navigation] node that the agent is using for its navigation " +"Returns the [Navigation2D] node that the agent is using for its navigation " "system." msgstr "" -#: doc/classes/NavigationAgent.xml:51 +#: doc/classes/NavigationAgent2D.xml:51 msgid "" -"Returns a [Vector3] in global coordinates, that can be moved to, making sure " +"Returns a [Vector2] in global coordinates, that can be moved to, making sure " "that there are no static objects in the way. If the agent does not have a " -"navigation path, it will return the origin of the agent's parent." +"navigation path, it will return the position of the agent's parent." msgstr "" -#: doc/classes/NavigationAgent.xml:58 -msgid "Returns the user defined [Vector3] after setting the target location." +#: doc/classes/NavigationAgent2D.xml:58 +msgid "Returns the user defined [Vector2] after setting the target location." msgstr "" -#: doc/classes/NavigationAgent.xml:65 doc/classes/NavigationAgent2D.xml:65 +#: doc/classes/NavigationAgent2D.xml:65 doc/classes/NavigationAgent3D.xml:65 msgid "Returns true if the navigation path's final location has been reached." msgstr "" -#: doc/classes/NavigationAgent.xml:72 doc/classes/NavigationAgent2D.xml:72 +#: doc/classes/NavigationAgent2D.xml:72 doc/classes/NavigationAgent3D.xml:72 msgid "" "Returns true if the target location is reachable. The target location is set " "using [method set_target_location]." msgstr "" -#: doc/classes/NavigationAgent.xml:79 doc/classes/NavigationAgent2D.xml:79 +#: doc/classes/NavigationAgent2D.xml:79 doc/classes/NavigationAgent3D.xml:79 msgid "" "Returns true if the target location is reached. The target location is set " "using [method set_target_location]. It may not always be possible to reach " @@ -29567,65 +29464,56 @@ msgid "" "location though. See [method get_final_location]." msgstr "" -#: doc/classes/NavigationAgent.xml:88 +#: doc/classes/NavigationAgent2D.xml:88 msgid "" -"Sets the [Navigation] node used by the agent. Useful when you don't want to " -"make the agent a child of a [Navigation] node." +"Sets the [Navigation2D] node used by the agent. Useful when you don't want " +"to make the agent a child of a [Navigation2D] node." msgstr "" -#: doc/classes/NavigationAgent.xml:97 doc/classes/NavigationAgent2D.xml:97 +#: doc/classes/NavigationAgent2D.xml:97 doc/classes/NavigationAgent3D.xml:97 msgid "" "Sets the user desired final location. This will clear the current navigation " "path." msgstr "" -#: doc/classes/NavigationAgent.xml:106 doc/classes/NavigationAgent2D.xml:106 +#: doc/classes/NavigationAgent2D.xml:106 doc/classes/NavigationAgent3D.xml:106 msgid "" "Sends the passed in velocity to the collision avoidance algorithm. It will " "adjust the velocity to avoid collisions. Once the adjustment to the velocity " "is complete, it will emit the [signal velocity_computed] signal." msgstr "" -#: doc/classes/NavigationAgent.xml:112 -msgid "The agent height offset to match the navigation mesh height." -msgstr "" - -#: doc/classes/NavigationAgent.xml:115 -msgid "" -"Ignores collisions on the Y axis. Must be true to move on a horizontal plane." -msgstr "" - -#: doc/classes/NavigationAgent.xml:118 doc/classes/NavigationAgent2D.xml:112 +#: doc/classes/NavigationAgent2D.xml:112 doc/classes/NavigationAgent3D.xml:118 msgid "The maximum number of neighbors for the agent to consider." msgstr "" -#: doc/classes/NavigationAgent.xml:121 doc/classes/NavigationAgent2D.xml:115 +#: doc/classes/NavigationAgent2D.xml:115 doc/classes/NavigationAgent3D.xml:121 msgid "The maximum speed that an agent can move." msgstr "" -#: doc/classes/NavigationAgent.xml:124 doc/classes/NavigationAgent2D.xml:118 +#: doc/classes/NavigationAgent2D.xml:118 doc/classes/NavigationAgent3D.xml:124 msgid "The distance to search for other agents." msgstr "" -#: doc/classes/NavigationAgent.xml:127 doc/classes/NavigationAgent2D.xml:121 +#: doc/classes/NavigationAgent2D.xml:121 doc/classes/NavigationAgent3D.xml:127 msgid "" "The maximum distance the agent is allowed away from the ideal path to the " "final location. This can happen due to trying to avoid collisions. When the " "maximum distance is exceeded, it recalculates the ideal path." msgstr "" -#: doc/classes/NavigationAgent.xml:130 doc/classes/NavigationAgent2D.xml:124 +#: doc/classes/NavigationAgent2D.xml:124 doc/classes/NavigationAgent3D.xml:130 msgid "The radius of the agent." msgstr "" -#: doc/classes/NavigationAgent.xml:133 doc/classes/NavigationAgent2D.xml:127 +#: doc/classes/NavigationAgent2D.xml:127 doc/classes/NavigationAgent3D.xml:133 msgid "" "The distance threshold before a target is considered to be reached. This " "will allow an agent to not have to hit a point on the path exactly, but in " "the area." msgstr "" -#: doc/classes/NavigationAgent.xml:136 doc/classes/NavigationAgent2D.xml:130 +#: doc/classes/NavigationAgent2D.xml:130 doc/classes/NavigationAgent3D.xml:136 msgid "" "The minimal amount of time for which this agent's velocities, that are " "computed with the collision avoidance algorithim, are safe with respect to " @@ -29633,96 +29521,82 @@ msgid "" "other agents, but less freedom in choosing its velocities. Must be positive." msgstr "" -#: doc/classes/NavigationAgent.xml:142 doc/classes/NavigationAgent2D.xml:136 +#: doc/classes/NavigationAgent2D.xml:136 doc/classes/NavigationAgent3D.xml:142 msgid "Notifies when the final location is reached." msgstr "" -#: doc/classes/NavigationAgent.xml:147 doc/classes/NavigationAgent2D.xml:141 +#: doc/classes/NavigationAgent2D.xml:141 doc/classes/NavigationAgent3D.xml:147 msgid "Notifies when the navigation path changes." msgstr "" -#: doc/classes/NavigationAgent.xml:152 doc/classes/NavigationAgent2D.xml:146 +#: doc/classes/NavigationAgent2D.xml:146 doc/classes/NavigationAgent3D.xml:152 msgid "" "Notifies when the player defined target, set with [method " "set_target_location], is reached." msgstr "" -#: doc/classes/NavigationAgent.xml:159 doc/classes/NavigationAgent2D.xml:153 +#: doc/classes/NavigationAgent2D.xml:153 doc/classes/NavigationAgent3D.xml:159 msgid "" "Notifies when the collision avoidance velocity is calculated. Emitted by " "[method set_velocity]." msgstr "" -#: doc/classes/NavigationAgent2D.xml:4 -msgid "2D Agent used in navigation for collision avoidance." +#: doc/classes/NavigationAgent3D.xml:4 +msgid "3D Agent used in navigation for collision avoidance." msgstr "" -#: doc/classes/NavigationAgent2D.xml:7 +#: doc/classes/NavigationAgent3D.xml:7 msgid "" -"2D Agent that is used in navigation to reach a location while avoiding " +"3D Agent that is used in navigation to reach a location while avoiding " "static and dynamic obstacles. The dynamic obstacles are avoided using RVO " "collision avoidance. The agent needs navigation data to work correctly. This " -"can be done by having the agent as a child of a [Navigation2D] node, or " -"using [method set_navigation]. [NavigationAgent2D] is physics safe." +"can be done by having the agent as a child of a [Navigation3D] node, or " +"using [method set_navigation]. [NavigationAgent3D] is physics safe." msgstr "" -#: doc/classes/NavigationAgent2D.xml:23 +#: doc/classes/NavigationAgent3D.xml:23 msgid "" "Returns the reachable final location in global coordinates. This can change " -"if the navigation path is altered in any way." +"if the navigation path is altered in any way. Because of this, it would be " +"best to check this each frame." msgstr "" -#: doc/classes/NavigationAgent2D.xml:37 +#: doc/classes/NavigationAgent3D.xml:37 msgid "" "Returns which index the agent is currently on in the navigation path's " -"[PackedVector2Array]." +"[PackedVector3Array]." msgstr "" -#: doc/classes/NavigationAgent2D.xml:44 +#: doc/classes/NavigationAgent3D.xml:44 msgid "" -"Returns the [Navigation2D] node that the agent is using for its navigation " +"Returns the [Navigation3D] node that the agent is using for its navigation " "system." msgstr "" -#: doc/classes/NavigationAgent2D.xml:51 +#: doc/classes/NavigationAgent3D.xml:51 msgid "" -"Returns a [Vector2] in global coordinates, that can be moved to, making sure " +"Returns a [Vector3] in global coordinates, that can be moved to, making sure " "that there are no static objects in the way. If the agent does not have a " -"navigation path, it will return the position of the agent's parent." -msgstr "" - -#: doc/classes/NavigationAgent2D.xml:58 -msgid "Returns the user defined [Vector2] after setting the target location." -msgstr "" - -#: doc/classes/NavigationAgent2D.xml:88 -msgid "" -"Sets the [Navigation2D] node used by the agent. Useful when you don't want " -"to make the agent a child of a [Navigation2D] node." +"navigation path, it will return the origin of the agent's parent." msgstr "" -#: doc/classes/NavigationObstacle.xml:4 -msgid "3D Obstacle used in navigation for collision avoidance." +#: doc/classes/NavigationAgent3D.xml:58 +msgid "Returns the user defined [Vector3] after setting the target location." msgstr "" -#: doc/classes/NavigationObstacle.xml:7 +#: doc/classes/NavigationAgent3D.xml:88 msgid "" -"3D Obstacle used in navigation for collision avoidance. The obstacle needs " -"navigation data to work correctly. This can be done by having the obstacle " -"as a child of a [Navigation] node, or using [method set_navigation]. " -"[NavigationObstacle] is physics safe." +"Sets the [Navigation3D] node used by the agent. Useful when you don't want " +"to make the agent a child of a [Navigation3D] node." msgstr "" -#: doc/classes/NavigationObstacle.xml:16 -msgid "" -"Returns the [Navigation] node that the obstacle is using for its navigation " -"system." +#: doc/classes/NavigationAgent3D.xml:112 +msgid "The agent height offset to match the navigation mesh height." msgstr "" -#: doc/classes/NavigationObstacle.xml:25 +#: doc/classes/NavigationAgent3D.xml:115 msgid "" -"Sets the [Navigation] node used by the obstacle. Useful when you don't want " -"to make the obstacle a child of a [Navigation] node." +"Ignores collisions on the Y axis. Must be true to move on a horizontal plane." msgstr "" #: doc/classes/NavigationObstacle2D.xml:4 @@ -29734,7 +29608,7 @@ msgid "" "2D Obstacle used in navigation for collision avoidance. The obstacle needs " "navigation data to work correctly. This can be done by having the obstacle " "as a child of a [Navigation2D] node, or using [method set_navigation]. " -"[NavigationObstacle] is physics safe." +"[NavigationObstacle2D] is physics safe." msgstr "" #: doc/classes/NavigationObstacle2D.xml:16 @@ -29749,6 +29623,30 @@ msgid "" "want to make the obstacle a child of a [Navigation2D] node." msgstr "" +#: doc/classes/NavigationObstacle3D.xml:4 +msgid "3D Obstacle used in navigation for collision avoidance." +msgstr "" + +#: doc/classes/NavigationObstacle3D.xml:7 +msgid "" +"3D Obstacle used in navigation for collision avoidance. The obstacle needs " +"navigation data to work correctly. This can be done by having the obstacle " +"as a child of a [Navigation3D] node, or using [method set_navigation]. " +"[NavigationObstacle3D] is physics safe." +msgstr "" + +#: doc/classes/NavigationObstacle3D.xml:16 +msgid "" +"Returns the [Navigation3D] node that the obstacle is using for its " +"navigation system." +msgstr "" + +#: doc/classes/NavigationObstacle3D.xml:25 +msgid "" +"Sets the [Navigation3D] node used by the obstacle. Useful when you don't " +"want to make the obstacle a child of a [Navigation3D] node." +msgstr "" + #: doc/classes/NavigationPolygon.xml:4 msgid "" "A node that has methods to draw outlines or use indices of vertices to " @@ -29863,85 +29761,236 @@ msgid "" "[method add_polygon] method." msgstr "" -#: doc/classes/NavigationRegion.xml:4 +#: doc/classes/NavigationRegion3D.xml:4 msgid "A region of the navigation map." msgstr "" -#: doc/classes/NavigationRegion.xml:7 +#: doc/classes/NavigationRegion3D.xml:7 msgid "" -"A region of the navigation map. It tells the [Navigation] node what can be " +"A region of the navigation map. It tells the [Navigation3D] node what can be " "navigated and what cannot, based on the [NavigationMesh] resource. This " -"should be a child of a [Navigation] node (even not a direct child)." +"should be a child of a [Navigation3D] node (even not a direct child)." msgstr "" -#: doc/classes/NavigationRegion.xml:16 +#: doc/classes/NavigationRegion3D.xml:16 msgid "" "Bakes the [NavigationMesh]. The baking is done in a separate thread because " "navigation baking is not a cheap operation. This can be done at runtime. " "When it is completed, it automatically sets the new [NavigationMesh]." msgstr "" -#: doc/classes/NavigationRegion.xml:22 -msgid "Determines if the [NavigationRegion] is enabled or disabled." +#: doc/classes/NavigationRegion3D.xml:22 +msgid "Determines if the [NavigationRegion3D] is enabled or disabled." msgstr "" -#: doc/classes/NavigationRegion.xml:25 +#: doc/classes/NavigationRegion3D.xml:25 msgid "The [NavigationMesh] resource to use." msgstr "" -#: doc/classes/NavigationRegion.xml:31 +#: doc/classes/NavigationRegion3D.xml:31 msgid "Notifies when the navigation mesh bake operation is completed." msgstr "" -#: doc/classes/NavigationRegion.xml:36 +#: doc/classes/NavigationRegion3D.xml:36 msgid "Notifies when the [NavigationMesh] has changed." msgstr "" -#: doc/classes/NavigationServer.xml:4 +#: doc/classes/NavigationServer2D.xml:4 +msgid "Server interface for low-level 2D navigation access" +msgstr "" + +#: doc/classes/NavigationServer2D.xml:7 +msgid "" +"NavigationServer2D is the server responsible for all 2D navigation. It " +"creates the agents, maps, and regions for navigation to work as expected. " +"This keeps tracks of any call and executes them during the sync phase. This " +"means that you can request any change to the map, using any thread, without " +"worrying." +msgstr "" + +#: doc/classes/NavigationServer2D.xml:16 doc/classes/NavigationServer3D.xml:16 +msgid "Creates the agent." +msgstr "" + +#: doc/classes/NavigationServer2D.xml:25 doc/classes/NavigationServer3D.xml:25 +msgid "Returns true if the map got changed the previous frame." +msgstr "" + +#: doc/classes/NavigationServer2D.xml:40 doc/classes/NavigationServer3D.xml:40 +msgid "Callback called at the end of the RVO process." +msgstr "" + +#: doc/classes/NavigationServer2D.xml:51 doc/classes/NavigationServer3D.xml:51 +msgid "Puts the agent in the map." +msgstr "" + +#: doc/classes/NavigationServer2D.xml:62 doc/classes/NavigationServer3D.xml:62 +msgid "" +"Sets the maximum number of other agents the agent takes into account in the " +"navigation. The larger this number, the longer the running time of the " +"simulation. If the number is too low, the simulation will not be safe." +msgstr "" + +#: doc/classes/NavigationServer2D.xml:73 doc/classes/NavigationServer3D.xml:73 +msgid "Sets the maximum speed of the agent. Must be positive." +msgstr "" + +#: doc/classes/NavigationServer2D.xml:84 doc/classes/NavigationServer3D.xml:84 +msgid "" +"Sets the maximum distance to other agents this agent takes into account in " +"the navigation. The larger this number, the longer the running time of the " +"simulation. If the number is too low, the simulation will not be safe." +msgstr "" + +#: doc/classes/NavigationServer2D.xml:95 doc/classes/NavigationServer3D.xml:95 +msgid "Sets the position of the agent in world space." +msgstr "" + +#: doc/classes/NavigationServer2D.xml:106 +#: doc/classes/NavigationServer3D.xml:106 +msgid "Sets the radius of the agent." +msgstr "" + +#: doc/classes/NavigationServer2D.xml:117 +#: doc/classes/NavigationServer3D.xml:117 +msgid "Sets the new target velocity." +msgstr "" + +#: doc/classes/NavigationServer2D.xml:128 +#: doc/classes/NavigationServer3D.xml:128 +msgid "" +"The minimal amount of time for which the agent's velocities that are " +"computed by the simulation are safe with respect to other agents. The larger " +"this number, the sooner this agent will respond to the presence of other " +"agents, but the less freedom this agent has in choosing its velocities. Must " +"be positive." +msgstr "" + +#: doc/classes/NavigationServer2D.xml:139 +#: doc/classes/NavigationServer3D.xml:139 +msgid "Sets the current velocity of the agent." +msgstr "" + +#: doc/classes/NavigationServer2D.xml:148 +#: doc/classes/NavigationServer3D.xml:148 +msgid "Destroy the RID" +msgstr "" + +#: doc/classes/NavigationServer2D.xml:155 +#: doc/classes/NavigationServer3D.xml:155 +msgid "Create a new map." +msgstr "" + +#: doc/classes/NavigationServer2D.xml:164 +#: doc/classes/NavigationServer3D.xml:164 +msgid "Returns the map cell size." +msgstr "" + +#: doc/classes/NavigationServer2D.xml:186 +#: doc/classes/NavigationServer3D.xml:197 +msgid "" +"Returns the owner region RID for the point returned by [method " +"map_get_closest_point]." +msgstr "" + +#: doc/classes/NavigationServer2D.xml:195 +msgid "" +"Returns the edge connection margin of the map. The edge connection margin is " +"a distance used to connect two regions." +msgstr "" + +#: doc/classes/NavigationServer2D.xml:210 +msgid "" +"Returns the navigation path to reach the destination from the origin, while " +"avoiding static obstacles." +msgstr "" + +#: doc/classes/NavigationServer2D.xml:219 +#: doc/classes/NavigationServer3D.xml:254 +msgid "Returns true if the map is active." +msgstr "" + +#: doc/classes/NavigationServer2D.xml:230 +#: doc/classes/NavigationServer3D.xml:265 +msgid "Sets the map active." +msgstr "" + +#: doc/classes/NavigationServer2D.xml:241 +#: doc/classes/NavigationServer3D.xml:276 +msgid "Set the map cell size used to weld the navigation mesh polygons." +msgstr "" + +#: doc/classes/NavigationServer2D.xml:252 +msgid "" +"Set the map edge connection margin used to weld the compatible region edges." +msgstr "" + +#: doc/classes/NavigationServer2D.xml:259 +#: doc/classes/NavigationServer3D.xml:327 +msgid "Creates a new region." +msgstr "" + +#: doc/classes/NavigationServer2D.xml:270 +#: doc/classes/NavigationServer3D.xml:338 +msgid "Sets the map for the region." +msgstr "" + +#: doc/classes/NavigationServer2D.xml:281 +#: doc/classes/NavigationServer3D.xml:349 +msgid "Sets the navigation mesh for the region." +msgstr "" + +#: doc/classes/NavigationServer2D.xml:292 +#: doc/classes/NavigationServer3D.xml:360 +msgid "Sets the global transformation for the region." +msgstr "" + +#: doc/classes/NavigationServer3D.xml:4 msgid "Server interface for low-level 3D navigation access" msgstr "" -#: doc/classes/NavigationServer.xml:7 +#: doc/classes/NavigationServer3D.xml:7 msgid "" -"NavigationServer is the server responsible for all 3D navigation. It creates " -"the agents, maps, and regions for navigation to work as expected. This keeps " -"tracks of any call and executes them during the sync phase. This means that " -"you can request any change to the map, using any thread, without worrying." +"NavigationServer3D is the server responsible for all 3D navigation. It " +"creates the agents, maps, and regions for navigation to work as expected. " +"This keeps tracks of any call and executes them during the sync phase. This " +"means that you can request any change to the map, using any thread, without " +"worrying." msgstr "" -#: doc/classes/NavigationServer.xml:175 +#: doc/classes/NavigationServer3D.xml:175 msgid "" "Returns the point closest to the provided [code]point[/code] on the " "navigation mesh surface." msgstr "" -#: doc/classes/NavigationServer.xml:186 +#: doc/classes/NavigationServer3D.xml:186 msgid "" "Returns the normal for the point returned by [method map_get_closest_point]." msgstr "" -#: doc/classes/NavigationServer.xml:221 +#: doc/classes/NavigationServer3D.xml:221 msgid "Returns the edge connection margin of the map." msgstr "" -#: doc/classes/NavigationServer.xml:236 +#: doc/classes/NavigationServer3D.xml:236 msgid "Returns the navigation path to reach the destination from the origin." msgstr "" -#: doc/classes/NavigationServer.xml:245 +#: doc/classes/NavigationServer3D.xml:245 msgid "Returns the map's up direction." msgstr "" -#: doc/classes/NavigationServer.xml:287 +#: doc/classes/NavigationServer3D.xml:287 msgid "" "Set the map edge connection margein used to weld the compatible region edges." msgstr "" -#: doc/classes/NavigationServer.xml:298 +#: doc/classes/NavigationServer3D.xml:298 msgid "Sets the map up direction." msgstr "" -#: doc/classes/NavigationServer.xml:307 +#: doc/classes/NavigationServer3D.xml:307 msgid "" "Process the collision avoidance agents.\n" "The result of this process is needed by the physics server, so this must be " @@ -29949,11 +29998,11 @@ msgid "" "Note: This function is not thread safe." msgstr "" -#: doc/classes/NavigationServer.xml:320 +#: doc/classes/NavigationServer3D.xml:320 msgid "Bakes the navigation mesh." msgstr "" -#: doc/classes/NavigationServer.xml:369 +#: doc/classes/NavigationServer3D.xml:369 msgid "Control activation of this server." msgstr "" @@ -30465,7 +30514,7 @@ msgid "" "automatically if this method is overridden, and can be toggled with [method " "set_process_input].\n" "To consume the input event and stop it propagating further to other nodes, " -"[method SceneTree.set_input_as_handled] can be called.\n" +"[method Viewport.set_input_as_handled] can be called.\n" "For gameplay input, [method _unhandled_input] and [method " "_unhandled_key_input] are usually a better fit as they allow the GUI to " "intercept the events first." @@ -30521,7 +30570,7 @@ msgid "" "automatically if this method is overridden, and can be toggled with [method " "set_process_unhandled_input].\n" "To consume the input event and stop it propagating further to other nodes, " -"[method SceneTree.set_input_as_handled] can be called.\n" +"[method Viewport.set_input_as_handled] can be called.\n" "For gameplay input, this and [method _unhandled_key_input] are usually a " "better fit than [method _input] as they allow the GUI to intercept the " "events first." @@ -30536,7 +30585,7 @@ msgid "" "done automatically if this method is overridden, and can be toggled with " "[method set_process_unhandled_key_input].\n" "To consume the input event and stop it propagating further to other nodes, " -"[method SceneTree.set_input_as_handled] can be called.\n" +"[method Viewport.set_input_as_handled] can be called.\n" "For gameplay input, this and [method _unhandled_input] are usually a better " "fit than [method _input] as they allow the GUI to intercept the events first." msgstr "" @@ -30653,7 +30702,8 @@ msgstr "" #: doc/classes/Node.xml:241 msgid "" -"Returns the node's index, i.e. its position among the siblings of its parent." +"Returns the node's order in the scene tree branch. For example, if called on " +"the first child node the position is [code]0[/code]." msgstr "" #: doc/classes/Node.xml:248 @@ -30748,36 +30798,30 @@ msgstr "" #: doc/classes/Node.xml:338 msgid "" -"Returns the node's order in the scene tree branch. For example, if called on " -"the first child node the position is [code]0[/code]." -msgstr "" - -#: doc/classes/Node.xml:345 -msgid "" "Returns the time elapsed (in seconds) since the last process callback. This " "value may vary from frame to frame." msgstr "" -#: doc/classes/Node.xml:352 +#: doc/classes/Node.xml:345 msgid "" "Returns [code]true[/code] if this is an instance load placeholder. See " "[InstancePlaceholder]." msgstr "" -#: doc/classes/Node.xml:359 +#: doc/classes/Node.xml:352 msgid "Returns the [SceneTree] that contains this node." msgstr "" -#: doc/classes/Node.xml:366 +#: doc/classes/Node.xml:359 msgid "Returns the node's [Viewport]." msgstr "" -#: doc/classes/Node.xml:375 +#: doc/classes/Node.xml:368 msgid "" "Returns [code]true[/code] if the node that the [NodePath] points to exists." msgstr "" -#: doc/classes/Node.xml:384 +#: doc/classes/Node.xml:377 msgid "" "Returns [code]true[/code] if the [NodePath] points to a valid node and its " "subname points to a valid resource, e.g. [code]Area2D/CollisionShape2D:" @@ -30785,96 +30829,96 @@ msgid "" "math types) are not considered resources." msgstr "" -#: doc/classes/Node.xml:393 +#: doc/classes/Node.xml:386 msgid "" "Returns [code]true[/code] if the given node is a direct or indirect child of " "the current node." msgstr "" -#: doc/classes/Node.xml:400 +#: doc/classes/Node.xml:393 msgid "" "Returns [code]true[/code] if the node is folded (collapsed) in the Scene " "dock." msgstr "" -#: doc/classes/Node.xml:409 +#: doc/classes/Node.xml:402 msgid "" "Returns [code]true[/code] if the given node occurs later in the scene " "hierarchy than the current node." msgstr "" -#: doc/classes/Node.xml:418 +#: doc/classes/Node.xml:411 msgid "" "Returns [code]true[/code] if this node is in the specified group. See notes " "in the description, and the group methods in [SceneTree]." msgstr "" -#: doc/classes/Node.xml:425 +#: doc/classes/Node.xml:418 msgid "" "Returns [code]true[/code] if this node is currently inside a [SceneTree]." msgstr "" -#: doc/classes/Node.xml:432 +#: doc/classes/Node.xml:425 msgid "" "Returns [code]true[/code] if the local system is the master of this node." msgstr "" -#: doc/classes/Node.xml:439 +#: doc/classes/Node.xml:432 msgid "" "Returns [code]true[/code] if physics processing is enabled (see [method " "set_physics_process])." msgstr "" -#: doc/classes/Node.xml:446 +#: doc/classes/Node.xml:439 msgid "" "Returns [code]true[/code] if internal physics processing is enabled (see " "[method set_physics_process_internal])." msgstr "" -#: doc/classes/Node.xml:453 +#: doc/classes/Node.xml:446 msgid "" "Returns [code]true[/code] if processing is enabled (see [method " "set_process])." msgstr "" -#: doc/classes/Node.xml:460 +#: doc/classes/Node.xml:453 msgid "" "Returns [code]true[/code] if the node is processing input (see [method " "set_process_input])." msgstr "" -#: doc/classes/Node.xml:467 +#: doc/classes/Node.xml:460 msgid "" "Returns [code]true[/code] if internal processing is enabled (see [method " "set_process_internal])." msgstr "" -#: doc/classes/Node.xml:474 +#: doc/classes/Node.xml:467 msgid "" "Returns [code]true[/code] if the node is processing unhandled input (see " "[method set_process_unhandled_input])." msgstr "" -#: doc/classes/Node.xml:481 +#: doc/classes/Node.xml:474 msgid "" "Returns [code]true[/code] if the node is processing unhandled key input (see " "[method set_process_unhandled_key_input])." msgstr "" -#: doc/classes/Node.xml:492 +#: doc/classes/Node.xml:485 msgid "" "Moves a child node to a different position (order) among the other children. " "Since calls, signals, etc are performed by tree order, changing the order of " "children nodes may be useful." msgstr "" -#: doc/classes/Node.xml:499 +#: doc/classes/Node.xml:492 msgid "" "Prints all stray nodes (nodes outside the [SceneTree]). Used for debugging. " "Works only in debug builds." msgstr "" -#: doc/classes/Node.xml:506 +#: doc/classes/Node.xml:499 msgid "" "Prints the tree to stdout. Used mainly for debugging purposes. This version " "displays the path relative to the current node, and is good for copy/pasting " @@ -30890,7 +30934,7 @@ msgid "" "[/codeblock]" msgstr "" -#: doc/classes/Node.xml:522 +#: doc/classes/Node.xml:515 msgid "" "Similar to [method print_tree], this prints the tree to stdout. This version " "displays a more graphical representation similar to what is displayed in the " @@ -30906,7 +30950,7 @@ msgid "" "[/codeblock]" msgstr "" -#: doc/classes/Node.xml:544 +#: doc/classes/Node.xml:537 msgid "" "Calls the given method (if present) with the arguments given in [code]args[/" "code] on this node and recursively on all its children. If the " @@ -30916,13 +30960,13 @@ msgid "" "first." msgstr "" -#: doc/classes/Node.xml:553 +#: doc/classes/Node.xml:546 msgid "" "Notifies the current node and all its children recursively by calling " "[method Object.notification] on all of them." msgstr "" -#: doc/classes/Node.xml:560 +#: doc/classes/Node.xml:553 msgid "" "Queues a node for deletion at the end of the current frame. When deleted, " "all of its child nodes will be deleted as well. This method ensures it's " @@ -30931,7 +30975,7 @@ msgid "" "the end of the frame." msgstr "" -#: doc/classes/Node.xml:567 +#: doc/classes/Node.xml:560 msgid "" "Moves this node to the bottom of parent node's children hierarchy. This is " "often useful in GUIs ([Control] nodes), because their order of drawing " @@ -30940,31 +30984,31 @@ msgid "" "will be drawn on top of their siblings." msgstr "" -#: doc/classes/Node.xml:574 +#: doc/classes/Node.xml:567 msgid "" "Removes a node and sets all its children as children of the parent node (if " "it exists). All event subscriptions that pass by the removed node will be " "unsubscribed." msgstr "" -#: doc/classes/Node.xml:583 +#: doc/classes/Node.xml:576 msgid "" "Removes a child node. The node is NOT deleted and must be deleted manually." msgstr "" -#: doc/classes/Node.xml:592 +#: doc/classes/Node.xml:585 msgid "" "Removes a node from a group. See notes in the description, and the group " "methods in [SceneTree]." msgstr "" -#: doc/classes/Node.xml:603 +#: doc/classes/Node.xml:596 msgid "" "Replaces a node in a scene by the given one. Subscriptions that pass through " "this node will be lost." msgstr "" -#: doc/classes/Node.xml:610 +#: doc/classes/Node.xml:603 msgid "" "Requests that [code]_ready[/code] be called again. Note that the method " "won't be called immediately, but is scheduled for when the node is added to " @@ -30975,7 +31019,7 @@ msgid "" "normally)." msgstr "" -#: doc/classes/Node.xml:619 +#: doc/classes/Node.xml:612 msgid "" "Sends a remote procedure call request for the given [code]method[/code] to " "peers on the network (and locally), optionally sending all additional " @@ -30992,7 +31036,7 @@ msgid "" "network_peer.get_connection_status() == CONNECTION_CONNECTED[/code]." msgstr "" -#: doc/classes/Node.xml:631 +#: doc/classes/Node.xml:624 msgid "" "Changes the RPC mode for the given [code]method[/code] to the given " "[code]mode[/code]. See [enum MultiplayerAPI.RPCMode]. An alternative is " @@ -31003,27 +31047,27 @@ msgid "" "[method rset] and [method rset_config] for properties." msgstr "" -#: doc/classes/Node.xml:642 +#: doc/classes/Node.xml:635 msgid "" "Sends a [method rpc] to a specific peer identified by [code]peer_id[/code] " "(see [method NetworkedMultiplayerPeer.set_target_peer]). Returns an empty " "[Variant]." msgstr "" -#: doc/classes/Node.xml:651 +#: doc/classes/Node.xml:644 msgid "" "Sends a [method rpc] using an unreliable protocol. Returns an empty " "[Variant]." msgstr "" -#: doc/classes/Node.xml:662 +#: doc/classes/Node.xml:655 msgid "" "Sends a [method rpc] to a specific peer identified by [code]peer_id[/code] " "using an unreliable protocol (see [method NetworkedMultiplayerPeer." "set_target_peer]). Returns an empty [Variant]." msgstr "" -#: doc/classes/Node.xml:673 +#: doc/classes/Node.xml:666 msgid "" "Remotely changes a property's value on other peers (and locally). Behaviour " "depends on the RPC configuration for the given property, see [method " @@ -31031,7 +31075,7 @@ msgid "" "applies to this method as well." msgstr "" -#: doc/classes/Node.xml:684 +#: doc/classes/Node.xml:677 msgid "" "Changes the RPC mode for the given [code]property[/code] to the given " "[code]mode[/code]. See [enum MultiplayerAPI.RPCMode]. An alternative is " @@ -31042,30 +31086,30 @@ msgid "" "[method rpc] and [method rpc_config] for methods." msgstr "" -#: doc/classes/Node.xml:697 +#: doc/classes/Node.xml:690 msgid "" "Remotely changes the property's value on a specific peer identified by " "[code]peer_id[/code] (see [method NetworkedMultiplayerPeer.set_target_peer])." msgstr "" -#: doc/classes/Node.xml:708 +#: doc/classes/Node.xml:701 msgid "" "Remotely changes the property's value on other peers (and locally) using an " "unreliable protocol." msgstr "" -#: doc/classes/Node.xml:721 +#: doc/classes/Node.xml:714 msgid "" "Remotely changes property's value on a specific peer identified by " "[code]peer_id[/code] using an unreliable protocol (see [method " "NetworkedMultiplayerPeer.set_target_peer])." msgstr "" -#: doc/classes/Node.xml:730 +#: doc/classes/Node.xml:723 msgid "Sets the folded state of the node in the Scene dock." msgstr "" -#: doc/classes/Node.xml:741 +#: doc/classes/Node.xml:734 msgid "" "Sets the node's network master to the peer with the given peer ID. The " "network master is the peer that has authority over the node on the network. " @@ -31075,7 +31119,7 @@ msgid "" "peer is recursively set as the master for all children of this node." msgstr "" -#: doc/classes/Node.xml:750 +#: doc/classes/Node.xml:743 msgid "" "Enables or disables physics (i.e. fixed framerate) processing. When a node " "is being processed, it will receive a [constant " @@ -31086,7 +31130,7 @@ msgid "" "_ready] will be ignored." msgstr "" -#: doc/classes/Node.xml:759 +#: doc/classes/Node.xml:752 msgid "" "Enables or disables internal physics for this node. Internal physics " "processing happens in isolation from the normal [method _physics_process] " @@ -31096,7 +31140,7 @@ msgid "" "built-in nodes' behaviour." msgstr "" -#: doc/classes/Node.xml:768 +#: doc/classes/Node.xml:761 msgid "" "Enables or disables processing. When a node is being processed, it will " "receive a [constant NOTIFICATION_PROCESS] on every drawn frame (and the " @@ -31105,14 +31149,14 @@ msgid "" "will be ignored." msgstr "" -#: doc/classes/Node.xml:777 +#: doc/classes/Node.xml:770 msgid "" "Enables or disables input processing. This is not required for GUI controls! " "Enabled automatically if [method _input] is overridden. Any calls to this " "before [method _ready] will be ignored." msgstr "" -#: doc/classes/Node.xml:786 +#: doc/classes/Node.xml:779 msgid "" "Enables or disabled internal processing for this node. Internal processing " "happens in isolation from the normal [method _process] calls and is used by " @@ -31121,7 +31165,7 @@ msgid "" "useful for advanced uses to manipulate built-in nodes' behaviour." msgstr "" -#: doc/classes/Node.xml:795 +#: doc/classes/Node.xml:788 msgid "" "Enables unhandled input processing. This is not required for GUI controls! " "It enables the node to receive all input that was not previously handled " @@ -31129,51 +31173,51 @@ msgid "" "is overridden. Any calls to this before [method _ready] will be ignored." msgstr "" -#: doc/classes/Node.xml:804 +#: doc/classes/Node.xml:797 msgid "" "Enables unhandled key input processing. Enabled automatically if [method " "_unhandled_key_input] is overridden. Any calls to this before [method " "_ready] will be ignored." msgstr "" -#: doc/classes/Node.xml:813 +#: doc/classes/Node.xml:806 msgid "" "Sets whether this is an instance load placeholder. See [InstancePlaceholder]." msgstr "" -#: doc/classes/Node.xml:820 +#: doc/classes/Node.xml:813 msgid "" "Updates the warning displayed for this node in the Scene Dock.\n" "Use [method _get_configuration_warning] to setup the warning message to " "display." msgstr "" -#: doc/classes/Node.xml:827 +#: doc/classes/Node.xml:820 msgid "" "The override to the default [MultiplayerAPI]. Set to [code]null[/code] to " "use the default [SceneTree] one." msgstr "" -#: doc/classes/Node.xml:830 +#: doc/classes/Node.xml:823 msgid "" "When a scene is instanced from a file, its topmost node contains the " "filename from which it was loaded." msgstr "" -#: doc/classes/Node.xml:833 +#: doc/classes/Node.xml:826 msgid "" "The [MultiplayerAPI] instance associated with this node. Either the [member " "custom_multiplayer], or the default SceneTree one (if inside tree)." msgstr "" -#: doc/classes/Node.xml:836 +#: doc/classes/Node.xml:829 msgid "" "The name of the node. This name is unique among the siblings (other child " "nodes from the same parent). When set to an existing name, the node will be " "automatically renamed." msgstr "" -#: doc/classes/Node.xml:839 +#: doc/classes/Node.xml:832 msgid "" "The node owner. A node can have any other node as owner (as long as it is a " "valid parent, grandparent, etc. ascending in the tree). When saving a node " @@ -31182,11 +31226,11 @@ msgid "" "subinstancing." msgstr "" -#: doc/classes/Node.xml:842 +#: doc/classes/Node.xml:835 msgid "Pause mode. How the node will behave if the [SceneTree] is paused." msgstr "" -#: doc/classes/Node.xml:845 +#: doc/classes/Node.xml:838 msgid "" "The node's priority in the execution order of the enabled processing " "callbacks (i.e. [constant NOTIFICATION_PROCESS], [constant " @@ -31195,131 +31239,169 @@ msgid "" "executed first." msgstr "" -#: doc/classes/Node.xml:851 +#: doc/classes/Node.xml:844 msgid "Emitted when the node is ready." msgstr "" -#: doc/classes/Node.xml:856 +#: doc/classes/Node.xml:849 msgid "Emitted when the node is renamed." msgstr "" -#: doc/classes/Node.xml:861 +#: doc/classes/Node.xml:854 msgid "Emitted when the node enters the tree." msgstr "" -#: doc/classes/Node.xml:866 +#: doc/classes/Node.xml:859 msgid "Emitted after the node exits the tree and is no longer active." msgstr "" -#: doc/classes/Node.xml:871 +#: doc/classes/Node.xml:864 msgid "" "Emitted when the node is still active but about to exit the tree. This is " "the right place for de-initialization (or a \"destructor\", if you will)." msgstr "" -#: doc/classes/Node.xml:877 +#: doc/classes/Node.xml:870 msgid "Notification received when the node enters a [SceneTree]." msgstr "" -#: doc/classes/Node.xml:880 +#: doc/classes/Node.xml:873 msgid "Notification received when the node is about to exit a [SceneTree]." msgstr "" -#: doc/classes/Node.xml:883 +#: doc/classes/Node.xml:876 msgid "Notification received when the node is moved in the parent." msgstr "" -#: doc/classes/Node.xml:886 +#: doc/classes/Node.xml:879 msgid "Notification received when the node is ready. See [method _ready]." msgstr "" -#: doc/classes/Node.xml:889 +#: doc/classes/Node.xml:882 msgid "Notification received when the node is paused." msgstr "" -#: doc/classes/Node.xml:892 +#: doc/classes/Node.xml:885 msgid "Notification received when the node is unpaused." msgstr "" -#: doc/classes/Node.xml:895 +#: doc/classes/Node.xml:888 msgid "" "Notification received every frame when the physics process flag is set (see " "[method set_physics_process])." msgstr "" -#: doc/classes/Node.xml:898 +#: doc/classes/Node.xml:891 msgid "" "Notification received every frame when the process flag is set (see [method " "set_process])." msgstr "" -#: doc/classes/Node.xml:901 +#: doc/classes/Node.xml:894 msgid "" "Notification received when a node is set as a child of another node.\n" "[b]Note:[/b] This doesn't mean that a node entered the [SceneTree]." msgstr "" -#: doc/classes/Node.xml:905 +#: doc/classes/Node.xml:898 msgid "" "Notification received when a node is unparented (parent removed it from the " "list of children)." msgstr "" -#: doc/classes/Node.xml:908 +#: doc/classes/Node.xml:901 msgid "Notification received when the node is instanced." msgstr "" -#: doc/classes/Node.xml:911 +#: doc/classes/Node.xml:904 msgid "Notification received when a drag begins." msgstr "" -#: doc/classes/Node.xml:914 +#: doc/classes/Node.xml:907 msgid "Notification received when a drag ends." msgstr "" -#: doc/classes/Node.xml:917 +#: doc/classes/Node.xml:910 msgid "Notification received when the node's [NodePath] changed." msgstr "" -#: doc/classes/Node.xml:920 +#: doc/classes/Node.xml:913 msgid "" "Notification received every frame when the internal process flag is set (see " "[method set_process_internal])." msgstr "" -#: doc/classes/Node.xml:923 +#: doc/classes/Node.xml:916 msgid "" "Notification received every frame when the internal physics process flag is " "set (see [method set_physics_process_internal])." msgstr "" -#: doc/classes/Node.xml:981 +#: doc/classes/Node.xml:919 +msgid "" +"Notification received from the OS when the mouse enters the game window.\n" +"Implemented on desktop and web platforms." +msgstr "" + +#: doc/classes/Node.xml:923 +msgid "" +"Notification received from the OS when the mouse leaves the game window.\n" +"Implemented on desktop and web platforms." +msgstr "" + +#: doc/classes/Node.xml:927 +msgid "" +"Notification received from the OS when the game window is focused.\n" +"Implemented on all platforms." +msgstr "" + +#: doc/classes/Node.xml:931 +msgid "" +"Notification received from the OS when the game window is unfocused.\n" +"Implemented on all platforms." +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 [kbd]Alt + F4[/kbd]).\n" +"Implemented on desktop platforms." +msgstr "" + +#: doc/classes/Node.xml:939 +msgid "" +"Notification received from the OS when a go back request is sent (e.g. " +"pressing the \"Back\" button on Android).\n" +"Specific to the Android platform." +msgstr "" + +#: doc/classes/Node.xml:972 msgid "" "Inherits pause mode from the node's parent. For the root node, it is " "equivalent to [constant PAUSE_MODE_STOP]. Default." msgstr "" -#: doc/classes/Node.xml:984 +#: doc/classes/Node.xml:975 msgid "Stops processing when the [SceneTree] is paused." msgstr "" -#: doc/classes/Node.xml:987 +#: doc/classes/Node.xml:978 msgid "Continue to process regardless of the [SceneTree] pause state." msgstr "" -#: doc/classes/Node.xml:990 +#: doc/classes/Node.xml:981 msgid "Duplicate the node's signals." msgstr "" -#: doc/classes/Node.xml:993 +#: doc/classes/Node.xml:984 msgid "Duplicate the node's groups." msgstr "" -#: doc/classes/Node.xml:996 +#: doc/classes/Node.xml:987 msgid "Duplicate the node's scripts." msgstr "" -#: doc/classes/Node.xml:999 +#: doc/classes/Node.xml:990 msgid "" "Duplicate using instancing.\n" "An instance stays linked to the original so when the original changes, the " @@ -31384,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 @@ -31449,6 +31541,296 @@ msgid "" "Z index will display in front of others." msgstr "" +#: doc/classes/Node3D.xml:4 +msgid "Most basic 3D game object, parent of all 3D-related nodes." +msgstr "" + +#: doc/classes/Node3D.xml:7 +msgid "" +"Most basic 3D game object, with a 3D [Transform] and visibility settings. " +"All other 3D game objects inherit from Node3D. Use [Node3D] as a parent node " +"to move, scale, rotate and show/hide children in a 3D project.\n" +"Affine operations (rotate, scale, translate) happen in parent's local " +"coordinate system, unless the [Node3D] object is set as top-level. Affine " +"operations in this coordinate system correspond to direct affine operations " +"on the [Node3D]'s transform. The word local below refers to this coordinate " +"system. The coordinate system that is attached to the [Node3D] object itself " +"is referred to as object-local coordinate system.\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:12 +msgid "" +"https://docs.godotengine.org/en/latest/tutorials/3d/introduction_to_3d.html" +msgstr "" + +#: 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:33 +msgid "" +"Returns the current [World3D] resource this [Node3D] node is registered to." +msgstr "" + +#: 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:53 +msgid "" +"Scales the global (world) transformation by the given [Vector3] scale " +"factors." +msgstr "" + +#: 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:69 +msgid "" +"Disables rendering of this node. Changes [member visible] to [code]false[/" +"code]." +msgstr "" + +#: 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: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:90 +msgid "" +"Returns whether this node is set as Toplevel, that is whether it ignores its " +"parent nodes transformations." +msgstr "" + +#: 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:104 +msgid "" +"Returns whether the node is visible, taking into consideration that its " +"parents visibility." +msgstr "" + +#: doc/classes/Node3D.xml:115 +msgid "" +"Rotates itself so that the local -Z axis points towards the [code]target[/" +"code] position.\n" +"The transform will first be rotated around the given [code]up[/code] vector, " +"and then fully aligned to the target by a further rotation around an axis " +"perpendicular to both the [code]target[/code] and [code]up[/code] vectors.\n" +"Operations take place in global space." +msgstr "" + +#: 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: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:148 +msgid "" +"Rotates the local transformation around axis, a unit [Vector3], by specified " +"angle in radians." +msgstr "" + +#: 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:168 +msgid "Rotates the local transformation around the X axis by angle in radians." +msgstr "" + +#: doc/classes/Node3D.xml:177 +msgid "Rotates the local transformation around the Y axis by angle in radians." +msgstr "" + +#: doc/classes/Node3D.xml:186 +msgid "Rotates the local transformation around the Z axis by angle in radians." +msgstr "" + +#: 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:204 +msgid "" +"Makes the node ignore its parents transformations. Node transformations are " +"only in global space." +msgstr "" + +#: 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:220 +msgid "" +"Reset all transformations for this node (sets its [Transform] to the " +"identity matrix)." +msgstr "" + +#: doc/classes/Node3D.xml:229 +msgid "" +"Sets whether the node ignores notification that its transformation (global " +"or local) changed." +msgstr "" + +#: 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: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:254 +msgid "" +"Enables rendering of this node. Changes [member visible] to [code]true[/" +"code]." +msgstr "" + +#: 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:272 +msgid "" +"Transforms [code]global_point[/code] from world space to this node's local " +"space." +msgstr "" + +#: 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 " +"scale, so if scaled by e.g. [code](10, 1, 1)[/code], a translation by an " +"offset of [code](2, 0, 0)[/code] would actually add 20 ([code]2 * 10[/code]) " +"to the X coordinate." +msgstr "" + +#: doc/classes/Node3D.xml:291 +msgid "" +"Changes the node's position by the given offset [Vector3] in local space." +msgstr "" + +#: doc/classes/Node3D.xml:298 +msgid "Updates the [Node3DGizmo] of this node." +msgstr "" + +#: 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:307 +msgid "World3D space (global) [Transform] of this node." +msgstr "" + +#: 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" +"[b]Note:[/b] In the mathematical sense, rotation is a matrix and not a " +"vector. The three Euler angles, which are the three independent parameters " +"of the Euler-angle parametrization of the rotation matrix, are stored in a " +"[Vector3] data structure not because the rotation is a vector, but only " +"because [Vector3] exists as a convenient data-structure to store 3 floating-" +"point numbers. Therefore, applying affine operations on the rotation \"vector" +"\" is not meaningful." +msgstr "" + +#: 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:317 +msgid "Scale part of the local transformation." +msgstr "" + +#: doc/classes/Node3D.xml:320 +msgid "Local space [Transform] of this node, with respect to the parent node." +msgstr "" + +#: doc/classes/Node3D.xml:323 +msgid "Local translation of this node." +msgstr "" + +#: doc/classes/Node3D.xml:326 +msgid "If [code]true[/code], this node is drawn." +msgstr "" + +#: doc/classes/Node3D.xml:332 +msgid "Emitted when node visibility changes." +msgstr "" + +#: 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" +"In order for [constant NOTIFICATION_TRANSFORM_CHANGED] to work, users first " +"need to ask for it, with [method set_notify_transform]." +msgstr "" + +#: doc/classes/Node3D.xml:342 +msgid "" +"Node3D nodes receives this notification when they are registered to new " +"[World3D] resource." +msgstr "" + +#: doc/classes/Node3D.xml:345 +msgid "" +"Node3D nodes receives this notification when they are unregistered from " +"current [World3D] resource." +msgstr "" + +#: doc/classes/Node3D.xml:348 +msgid "Node3D nodes receives this notification when their visibility changes." +msgstr "" + #: doc/classes/NodePath.xml:4 msgid "Pre-parsed scene tree path." msgstr "" @@ -31458,10 +31840,10 @@ msgid "" "A pre-parsed relative or absolute path in a scene tree, for use with [method " "Node.get_node] and similar functions. It can reference a node, a resource " "within a node, or a property of a node or resource. For instance, " -"[code]\"Path2D/PathFollow2D/Sprite:texture:size\"[/code] would refer to the " -"[code]size[/code] property of the [code]texture[/code] resource on the node " -"named [code]\"Sprite\"[/code] which is a child of the other named nodes in " -"the path.\n" +"[code]\"Path2D/PathFollow2D/Sprite2D:texture:size\"[/code] would refer to " +"the [code]size[/code] property of the [code]texture[/code] resource on the " +"node named [code]\"Sprite2D\"[/code] which is a child of the other named " +"nodes in the path.\n" "You will usually just pass a string to [method Node.get_node] and it will be " "automatically converted, but you may occasionally want to parse a path ahead " "of time with [NodePath] or the literal syntax [code]@\"path\"[/code]. " @@ -31487,7 +31869,7 @@ msgstr "" #: doc/classes/NodePath.xml:33 msgid "" -"Creates a NodePath from a string, e.g. [code]\"Path2D/PathFollow2D/Sprite:" +"Creates a NodePath from a string, e.g. [code]\"Path2D/PathFollow2D/Sprite2D:" "texture:size\"[/code]. A path is absolute if it starts with a slash. " "Absolute paths are only valid in the global scene tree, not within " "individual scenes. In a relative path, [code]\".\"[/code] and [code]\"..\"[/" @@ -31497,17 +31879,17 @@ msgid "" "Examples of valid NodePaths (assuming that those nodes exist and have the " "referenced resources or properties):\n" "[codeblock]\n" -"# Points to the Sprite node\n" -"\"Path2D/PathFollow2D/Sprite\"\n" -"# Points to the Sprite node and its \"texture\" resource.\n" -"# get_node() would retrieve \"Sprite\", while get_node_and_resource()\n" -"# would retrieve both the Sprite node and the \"texture\" resource.\n" -"\"Path2D/PathFollow2D/Sprite:texture\"\n" -"# Points to the Sprite node and its \"position\" property.\n" -"\"Path2D/PathFollow2D/Sprite:position\"\n" -"# Points to the Sprite node and the \"x\" component of its \"position\" " +"# Points to the Sprite2D node\n" +"\"Path2D/PathFollow2D/Sprite2D\"\n" +"# Points to the Sprite2D node and its \"texture\" resource.\n" +"# get_node() would retrieve \"Sprite2D\", while get_node_and_resource()\n" +"# would retrieve both the Sprite2D node and the \"texture\" resource.\n" +"\"Path2D/PathFollow2D/Sprite2D:texture\"\n" +"# Points to the Sprite2D node and its \"position\" property.\n" +"\"Path2D/PathFollow2D/Sprite2D:position\"\n" +"# Points to the Sprite2D node and the \"x\" component of its \"position\" " "property.\n" -"\"Path2D/PathFollow2D/Sprite:position:x\"\n" +"\"Path2D/PathFollow2D/Sprite2D:position:x\"\n" "# Absolute path (from \"root\")\n" "\"/root/Level/Path2D\"\n" "[/codeblock]" @@ -31534,7 +31916,7 @@ msgid "" "Returns all subnames concatenated with a colon character ([code]:[/code]) as " "separator, i.e. the right side of the first colon in a node path.\n" "[codeblock]\n" -"var nodepath = NodePath(\"Path2D/PathFollow2D/Sprite:texture:load_path\")\n" +"var nodepath = NodePath(\"Path2D/PathFollow2D/Sprite2D:texture:load_path\")\n" "print(nodepath.get_concatenated_subnames()) # texture:load_path\n" "[/codeblock]" msgstr "" @@ -31544,7 +31926,7 @@ msgid "" "Gets the node name indicated by [code]idx[/code] (0 to [method " "get_name_count]).\n" "[codeblock]\n" -"var node_path = NodePath(\"Path2D/PathFollow2D/Sprite\")\n" +"var node_path = NodePath(\"Path2D/PathFollow2D/Sprite2D\")\n" "print(node_path.get_name(0)) # Path2D\n" "print(node_path.get_name(1)) # PathFollow2D\n" "print(node_path.get_name(2)) # Sprite\n" @@ -31555,7 +31937,7 @@ msgstr "" msgid "" "Gets the number of node names which make up the path. Subnames (see [method " "get_subname_count]) are not included.\n" -"For example, [code]\"Path2D/PathFollow2D/Sprite\"[/code] has 3 names." +"For example, [code]\"Path2D/PathFollow2D/Sprite2D\"[/code] has 3 names." msgstr "" #: doc/classes/NodePath.xml:106 @@ -31563,7 +31945,8 @@ msgid "" "Gets the resource or property name indicated by [code]idx[/code] (0 to " "[method get_subname_count]).\n" "[codeblock]\n" -"var node_path = NodePath(\"Path2D/PathFollow2D/Sprite:texture:load_path\")\n" +"var node_path = NodePath(\"Path2D/PathFollow2D/Sprite2D:texture:load_path" +"\")\n" "print(node_path.get_subname(0)) # texture\n" "print(node_path.get_subname(1)) # load_path\n" "[/codeblock]" @@ -31574,7 +31957,7 @@ msgid "" "Gets the number of resource or property names (\"subnames\") in the path. " "Each subname is listed after a colon character ([code]:[/code]) in the node " "path.\n" -"For example, [code]\"Path2D/PathFollow2D/Sprite:texture:load_path\"[/code] " +"For example, [code]\"Path2D/PathFollow2D/Sprite2D:texture:load_path\"[/code] " "has 2 subnames." msgstr "" @@ -31918,22 +32301,27 @@ msgid "" msgstr "" #: doc/classes/Object.xml:320 +msgid "Returns [code]true[/code] if the given [code]signal[/code] exists." +msgstr "" + +#: doc/classes/Object.xml:329 msgid "" "Returns [code]true[/code] if the given user-defined [code]signal[/code] " -"exists." +"exists. Only signals added using [method add_user_signal] are taken into " +"account." msgstr "" -#: doc/classes/Object.xml:327 +#: doc/classes/Object.xml:336 msgid "Returns [code]true[/code] if signal emission blocking is enabled." msgstr "" -#: doc/classes/Object.xml:336 +#: doc/classes/Object.xml:345 msgid "" "Returns [code]true[/code] if the object inherits from the given [code]class[/" "code]." msgstr "" -#: doc/classes/Object.xml:347 +#: doc/classes/Object.xml:356 msgid "" "[b]FIXME:[/b] The syntax changed with the addition of [Callable], this " "should be updated.\n" @@ -31941,13 +32329,13 @@ msgid "" "code], [code]target[/code], and [code]method[/code]." msgstr "" -#: doc/classes/Object.xml:355 +#: doc/classes/Object.xml:364 msgid "" "Returns [code]true[/code] if the [method Node.queue_free] method was called " "for the object." msgstr "" -#: doc/classes/Object.xml:366 +#: doc/classes/Object.xml:375 msgid "" "Send a given notification to the object, which will also trigger a call to " "the [method _notification] method of all classes that the object inherits " @@ -31959,34 +32347,34 @@ msgid "" "and then down to its successive inheriting classes." msgstr "" -#: doc/classes/Object.xml:374 +#: doc/classes/Object.xml:383 msgid "" "Notify the editor that the property list has changed, so that editor plugins " "can take the new values into account. Does nothing on export builds." msgstr "" -#: doc/classes/Object.xml:383 +#: doc/classes/Object.xml:392 msgid "Removes a given entry from the object's metadata." msgstr "" -#: doc/classes/Object.xml:394 +#: doc/classes/Object.xml:403 msgid "" "Assigns a new value to the given property. If the [code]property[/code] does " "not exist, nothing will happen." msgstr "" -#: doc/classes/Object.xml:403 +#: doc/classes/Object.xml:412 msgid "If set to [code]true[/code], signal emission is blocked." msgstr "" -#: doc/classes/Object.xml:414 +#: doc/classes/Object.xml:423 msgid "" "Assigns a new value to the given property, after the current frame's physics " "step. This is equivalent to calling [method set] via [method call_deferred], " "i.e. [code]call_deferred(\"set\", property, value)[/code]." msgstr "" -#: doc/classes/Object.xml:425 +#: doc/classes/Object.xml:434 msgid "" "Assigns a new value to the property identified by the [NodePath]. The node " "path should be relative to the current object and can use the colon " @@ -31998,19 +32386,19 @@ msgid "" "[/codeblock]" msgstr "" -#: doc/classes/Object.xml:439 +#: doc/classes/Object.xml:448 msgid "" "Defines whether the object can translate strings (with calls to [method " "tr]). Enabled by default." msgstr "" -#: doc/classes/Object.xml:450 +#: doc/classes/Object.xml:459 msgid "" "Adds or changes a given entry in the object's metadata. Metadata are " "serialized, and can take any [Variant] value." msgstr "" -#: doc/classes/Object.xml:459 +#: doc/classes/Object.xml:468 msgid "" "Assigns a script to the object. Each object can have a single script " "assigned to it, which are used to extend its functionality.\n" @@ -32019,7 +32407,7 @@ msgid "" "_init] method will be called." msgstr "" -#: doc/classes/Object.xml:467 +#: doc/classes/Object.xml:476 msgid "" "Returns a [String] representing the object. If not overridden, defaults to " "[code]\"[ClassName:RID]\"[/code].\n" @@ -32027,7 +32415,7 @@ msgid "" "representation." msgstr "" -#: doc/classes/Object.xml:477 +#: doc/classes/Object.xml:486 msgid "" "Translates a message using translation catalogs configured in the Project " "Settings.\n" @@ -32036,33 +32424,33 @@ msgid "" "set_message_translation]." msgstr "" -#: doc/classes/Object.xml:485 +#: doc/classes/Object.xml:494 msgid "Emitted whenever the object's script is changed." msgstr "" -#: doc/classes/Object.xml:491 +#: doc/classes/Object.xml:500 msgid "Called right when the object is initialized. Not available in script." msgstr "" -#: doc/classes/Object.xml:494 +#: doc/classes/Object.xml:503 msgid "Called before the object is about to be deleted." msgstr "" -#: doc/classes/Object.xml:497 +#: doc/classes/Object.xml:506 msgid "" "Connects a signal in deferred mode. This way, signal emissions are stored in " "a queue, then set on idle time." msgstr "" -#: doc/classes/Object.xml:500 +#: doc/classes/Object.xml:509 msgid "Persisting connections are saved when the object is serialized to file." msgstr "" -#: doc/classes/Object.xml:503 +#: doc/classes/Object.xml:512 msgid "One-shot connections disconnect themselves after emission." msgstr "" -#: doc/classes/Object.xml:506 +#: doc/classes/Object.xml:515 msgid "" "Connect a signal as reference counted. This means that a given signal can be " "connected several times to the same target, and will only be fully " @@ -32112,38 +32500,38 @@ msgid "" "cull_mode]." msgstr "" -#: doc/classes/OmniLight.xml:4 +#: doc/classes/OmniLight3D.xml:4 msgid "Omnidirectional light, such as a light bulb or a candle." msgstr "" -#: doc/classes/OmniLight.xml:7 +#: doc/classes/OmniLight3D.xml:7 msgid "" -"An Omnidirectional light is a type of [Light] that emits light in all " +"An Omnidirectional light is a type of [Light3D] that emits light in all " "directions. The light is attenuated by distance and this attenuation can be " "configured by changing its energy, radius, and attenuation parameters." msgstr "" -#: doc/classes/OmniLight.xml:16 +#: doc/classes/OmniLight3D.xml:16 msgid "" "The light's attenuation (drop-off) curve. A number of presets are available " "in the [b]Inspector[/b] by right-clicking the curve." msgstr "" -#: doc/classes/OmniLight.xml:19 +#: doc/classes/OmniLight3D.xml:19 msgid "The light's radius." msgstr "" -#: doc/classes/OmniLight.xml:22 +#: doc/classes/OmniLight3D.xml:22 msgid "See [enum ShadowMode]." msgstr "" -#: doc/classes/OmniLight.xml:27 +#: doc/classes/OmniLight3D.xml:27 msgid "" "Shadows are rendered to a dual-paraboloid texture. Faster than [constant " "SHADOW_CUBE], but lower-quality." msgstr "" -#: doc/classes/OmniLight.xml:30 +#: doc/classes/OmniLight3D.xml:30 msgid "" "Shadows are rendered to a cubemap. Slower than [constant " "SHADOW_DUAL_PARABOLOID], but higher-quality." @@ -32350,7 +32738,7 @@ msgid "" "store extra information about an item, such as an external string ID." msgstr "" -#: doc/classes/OptionButton.xml:203 doc/classes/PopupMenu.xml:570 +#: doc/classes/OptionButton.xml:203 doc/classes/PopupMenu.xml:554 msgid "Sets the text of the item at index [code]idx[/code]." msgstr "" @@ -32441,56 +32829,42 @@ msgid "" "command line, etc." msgstr "" -#: doc/classes/OS.xml:20 -msgid "" -"Displays a modal dialog box using the host OS' facilities. Execution is " -"blocked until the dialog is closed." -msgstr "" - -#: doc/classes/OS.xml:27 -msgid "Returns [code]true[/code] if the host OS allows drawing." -msgstr "" - -#: doc/classes/OS.xml:34 +#: doc/classes/OS.xml:16 msgid "" "Returns [code]true[/code] if the current host platform is using multiple " "threads." msgstr "" -#: doc/classes/OS.xml:41 -msgid "Centers the window on the screen if in windowed mode." -msgstr "" - -#: doc/classes/OS.xml:48 +#: doc/classes/OS.xml:23 msgid "" "Shuts down system MIDI driver.\n" "[b]Note:[/b] This method is implemented on Linux, macOS and Windows." msgstr "" -#: doc/classes/OS.xml:58 +#: doc/classes/OS.xml:33 msgid "" "Delay execution of the current thread by [code]msec[/code] milliseconds." msgstr "" -#: doc/classes/OS.xml:67 +#: doc/classes/OS.xml:42 msgid "" "Delay execution of the current thread by [code]usec[/code] microseconds." msgstr "" -#: doc/classes/OS.xml:76 +#: doc/classes/OS.xml:51 msgid "" "Dumps the memory allocation ringlist to a file (only works in debug).\n" "Entry format per line: \"Address - Size - Description\"." msgstr "" -#: doc/classes/OS.xml:86 +#: doc/classes/OS.xml:61 msgid "" "Dumps all used resources to file (only works in debug).\n" "Entry format per line: \"Resource Type : Resource Location\".\n" "At the end of the file is a statistic of all used Resource Types." msgstr "" -#: doc/classes/OS.xml:105 +#: doc/classes/OS.xml:80 msgid "" "Execute the file at the given path with the arguments passed as an array of " "strings. Platform path resolution will take place. The resolved file must " @@ -32534,23 +32908,15 @@ msgid "" "Windows." msgstr "" -#: doc/classes/OS.xml:133 +#: doc/classes/OS.xml:108 msgid "Returns the keycode of the given string (e.g. \"Escape\")." msgstr "" -#: doc/classes/OS.xml:140 -msgid "Returns the total number of available audio drivers." -msgstr "" - -#: doc/classes/OS.xml:149 -msgid "Returns the audio driver name for the given index." -msgstr "" - -#: doc/classes/OS.xml:156 +#: doc/classes/OS.xml:115 msgid "Returns the command line arguments passed to the engine." msgstr "" -#: doc/classes/OS.xml:163 +#: doc/classes/OS.xml:122 msgid "" "Returns an array of MIDI device names.\n" "The returned array will be empty if the system MIDI driver has not " @@ -32558,20 +32924,14 @@ msgid "" "[b]Note:[/b] This method is implemented on Linux, macOS and Windows." msgstr "" -#: doc/classes/OS.xml:172 -msgid "" -"Returns the currently used video driver, using one of the values from [enum " -"VideoDriver]." -msgstr "" - -#: doc/classes/OS.xml:181 +#: doc/classes/OS.xml:133 msgid "" "Returns current date as a dictionary of keys: [code]year[/code], " "[code]month[/code], [code]day[/code], [code]weekday[/code], [code]dst[/code] " "(Daylight Savings Time)." msgstr "" -#: doc/classes/OS.xml:190 +#: doc/classes/OS.xml:142 msgid "" "Returns current datetime as a dictionary of keys: [code]year[/code], " "[code]month[/code], [code]day[/code], [code]weekday[/code], [code]dst[/code] " @@ -32579,7 +32939,7 @@ msgid "" "[code]second[/code]." msgstr "" -#: doc/classes/OS.xml:199 +#: doc/classes/OS.xml:151 msgid "" "Gets a dictionary of time values corresponding to the given UNIX epoch time " "(in seconds).\n" @@ -32588,39 +32948,22 @@ msgid "" "the epoch." msgstr "" -#: doc/classes/OS.xml:209 +#: doc/classes/OS.xml:161 msgid "Returns an environment variable." msgstr "" -#: doc/classes/OS.xml:216 +#: doc/classes/OS.xml:168 msgid "Returns the path to the current engine executable." msgstr "" -#: doc/classes/OS.xml:223 +#: doc/classes/OS.xml:175 msgid "" "With this function you can get the list of dangerous permissions that have " "been granted to the Android application.\n" "[b]Note:[/b] This method is implemented on Android." msgstr "" -#: doc/classes/OS.xml:231 -msgid "" -"Returns the IME cursor position (the currently-edited portion of the string) " -"relative to the characters in the composition string.\n" -"[constant MainLoop.NOTIFICATION_OS_IME_UPDATE] is sent to the application to " -"notify it of changes to the IME cursor position.\n" -"[b]Note:[/b] This method is implemented on macOS." -msgstr "" - -#: doc/classes/OS.xml:240 -msgid "" -"Returns the IME intermediate composition string.\n" -"[constant MainLoop.NOTIFICATION_OS_IME_UPDATE] is sent to the application to " -"notify it of changes to the IME composition string.\n" -"[b]Note:[/b] This method is implemented on macOS." -msgstr "" - -#: doc/classes/OS.xml:251 +#: doc/classes/OS.xml:185 msgid "" "Returns the given keycode as a string (e.g. Return values: [code]\"Escape\"[/" "code], [code]\"Shift+Escape\"[/code]).\n" @@ -32628,28 +32971,18 @@ msgid "" "get_keycode_with_modifiers]." msgstr "" -#: doc/classes/OS.xml:259 -msgid "" -"Returns the current latin keyboard variant as a String.\n" -"Possible return values are: [code]\"QWERTY\"[/code], [code]\"AZERTY\"[/" -"code], [code]\"QZERTY\"[/code], [code]\"DVORAK\"[/code], [code]\"NEO\"[/" -"code], [code]\"COLEMAK\"[/code] or [code]\"ERROR\"[/code].\n" -"[b]Note:[/b] This method is implemented on Linux, macOS and Windows. Returns " -"[code]\"QWERTY\"[/code] on unsupported platforms." -msgstr "" - -#: doc/classes/OS.xml:268 +#: doc/classes/OS.xml:193 msgid "Returns the host OS locale." msgstr "" -#: doc/classes/OS.xml:275 +#: doc/classes/OS.xml:200 msgid "" "Returns the model name of the current device.\n" "[b]Note:[/b] This method is implemented on Android and iOS. Returns " "[code]\"GenericDevice\"[/code] on unsupported platforms." msgstr "" -#: doc/classes/OS.xml:283 +#: doc/classes/OS.xml:208 msgid "" "Returns the name of the host OS. Possible values are: [code]\"Android\"[/" "code], [code]\"Haiku\"[/code], [code]\"iOS\"[/code], [code]\"HTML5\"[/code], " @@ -32657,118 +32990,77 @@ msgid "" "[code]\"UWP\"[/code], [code]\"X11\"[/code]." msgstr "" -#: doc/classes/OS.xml:290 +#: doc/classes/OS.xml:215 msgid "" "Returns the project's process ID.\n" "[b]Note:[/b] This method is implemented on Android, iOS, Linux, macOS and " "Windows." msgstr "" -#: doc/classes/OS.xml:298 +#: doc/classes/OS.xml:223 msgid "Returns the number of threads available on the host machine." msgstr "" -#: doc/classes/OS.xml:305 -msgid "Returns the window size including decorations like window borders." -msgstr "" - -#: doc/classes/OS.xml:312 -msgid "Returns the number of displays attached to the host machine." -msgstr "" - -#: doc/classes/OS.xml:321 -msgid "" -"Returns the dots per inch density of the specified screen. If [code]screen[/" -"code] is [/code]-1[/code] (the default value), the current screen will be " -"used.\n" -"On Android devices, the actual screen densities are grouped into six " -"generalized densities:\n" -"[codeblock]\n" -" ldpi - 120 dpi\n" -" mdpi - 160 dpi\n" -" hdpi - 240 dpi\n" -" xhdpi - 320 dpi\n" -" xxhdpi - 480 dpi\n" -"xxxhdpi - 640 dpi\n" -"[/codeblock]\n" -"[b]Note:[/b] This method is implemented on Android, Linux, macOS and " -"Windows. Returns [code]72[/code] on unsupported platforms." -msgstr "" - -#: doc/classes/OS.xml:340 -msgid "" -"Returns the position of the specified screen by index. If [code]screen[/" -"code] is [/code]-1[/code] (the default value), the current screen will be " -"used." -msgstr "" - -#: doc/classes/OS.xml:349 -msgid "" -"Returns the dimensions in pixels of the specified screen. If [code]screen[/" -"code] is [/code]-1[/code] (the default value), the current screen will be " -"used." -msgstr "" - -#: doc/classes/OS.xml:356 +#: doc/classes/OS.xml:230 msgid "" "Returns the amount of time in milliseconds it took for the boot logo to " "appear." msgstr "" -#: doc/classes/OS.xml:363 +#: doc/classes/OS.xml:237 msgid "Returns the maximum amount of static memory used (only works in debug)." msgstr "" -#: doc/classes/OS.xml:370 +#: doc/classes/OS.xml:244 msgid "Returns the amount of static memory being used by the program in bytes." msgstr "" -#: doc/classes/OS.xml:379 +#: doc/classes/OS.xml:253 msgid "" "Returns the actual path to commonly used folders across different platforms. " "Available locations are specified in [enum SystemDir].\n" "[b]Note:[/b] This method is implemented on Android, Linux, macOS and Windows." msgstr "" -#: doc/classes/OS.xml:387 +#: doc/classes/OS.xml:261 msgid "Returns the epoch time of the operating system in milliseconds." msgstr "" -#: doc/classes/OS.xml:394 +#: doc/classes/OS.xml:268 msgid "Returns the epoch time of the operating system in seconds." msgstr "" -#: doc/classes/OS.xml:401 +#: doc/classes/OS.xml:275 msgid "" "Returns the amount of time passed in milliseconds since the engine started." msgstr "" -#: doc/classes/OS.xml:408 +#: doc/classes/OS.xml:282 msgid "" "Returns the amount of time passed in microseconds since the engine started." msgstr "" -#: doc/classes/OS.xml:417 +#: doc/classes/OS.xml:291 msgid "Returns current time as a dictionary of keys: hour, minute, second." msgstr "" -#: doc/classes/OS.xml:424 +#: doc/classes/OS.xml:298 msgid "" "Returns the current time zone as a dictionary with the keys: bias and name." msgstr "" -#: doc/classes/OS.xml:431 +#: doc/classes/OS.xml:305 msgid "" "Returns a string that is unique to the device.\n" "[b]Note:[/b] Returns an empty string on HTML5 and UWP, as this method isn't " "implemented on those platforms yet." msgstr "" -#: doc/classes/OS.xml:439 +#: doc/classes/OS.xml:313 msgid "Returns the current UNIX epoch timestamp." msgstr "" -#: doc/classes/OS.xml:448 +#: doc/classes/OS.xml:322 msgid "" "Gets an epoch time value from a dictionary of time values.\n" "[code]datetime[/code] must be populated with the following keys: [code]year[/" @@ -32779,7 +33071,7 @@ msgid "" "ignored." msgstr "" -#: doc/classes/OS.xml:457 +#: doc/classes/OS.xml:331 msgid "" "Returns the absolute directory path where user data is written ([code]user://" "[/code]).\n" @@ -32797,60 +33089,11 @@ msgid "" "[/code]." msgstr "" -#: doc/classes/OS.xml:468 -msgid "Returns the number of video drivers supported on the current platform." -msgstr "" - -#: doc/classes/OS.xml:477 -msgid "" -"Returns the name of the video driver matching the given [code]driver[/code] " -"index. This index is a value from [enum VideoDriver], and you can use " -"[method get_current_video_driver] to get the current backend's index." -msgstr "" - -#: doc/classes/OS.xml:484 -msgid "" -"Returns the on-screen keyboard's height in pixels. Returns 0 if there is no " -"keyboard or if it is currently hidden." -msgstr "" - -#: doc/classes/OS.xml:491 -msgid "" -"Returns unobscured area of the window where interactive controls should be " -"rendered." -msgstr "" - -#: doc/classes/OS.xml:506 -msgid "" -"Add a new item with text \"label\" to global menu. Use \"_dock\" menu to add " -"item to the macOS dock icon menu.\n" -"[b]Note:[/b] This method is implemented on macOS." -msgstr "" - -#: doc/classes/OS.xml:516 -msgid "" -"Add a separator between items. Separators also occupy an index.\n" -"[b]Note:[/b] This method is implemented on macOS." -msgstr "" - -#: doc/classes/OS.xml:526 -msgid "" -"Clear the global menu, in effect removing all items.\n" -"[b]Note:[/b] This method is implemented on macOS." -msgstr "" - -#: doc/classes/OS.xml:538 -msgid "" -"Removes the item at index \"idx\" from the global menu. Note that the " -"indexes of items after the removed item are going to be shifted by one.\n" -"[b]Note:[/b] This method is implemented on macOS." -msgstr "" - -#: doc/classes/OS.xml:548 +#: doc/classes/OS.xml:344 msgid "Returns [code]true[/code] if an environment variable exists." msgstr "" -#: doc/classes/OS.xml:557 +#: doc/classes/OS.xml:353 msgid "" "Returns [code]true[/code] if the feature for the given feature tag is " "supported in the currently running instance, depending on platform, build " @@ -32861,22 +33104,7 @@ msgid "" "[b]Note:[/b] Tag names are case-sensitive." msgstr "" -#: doc/classes/OS.xml:565 -msgid "" -"Returns [code]true[/code] if the device has a touchscreen or emulates one." -msgstr "" - -#: doc/classes/OS.xml:572 -msgid "" -"Returns [code]true[/code] if the platform has a virtual keyboard, " -"[code]false[/code] otherwise." -msgstr "" - -#: doc/classes/OS.xml:579 -msgid "Hides the virtual keyboard if it is shown, does nothing otherwise." -msgstr "" - -#: doc/classes/OS.xml:586 +#: doc/classes/OS.xml:361 msgid "" "Returns [code]true[/code] if the Godot binary used to run the project is a " "[i]debug[/i] export template, or when running in the editor.\n" @@ -32887,45 +33115,26 @@ msgid "" "instead." msgstr "" -#: doc/classes/OS.xml:597 +#: doc/classes/OS.xml:372 msgid "" "Returns [code]true[/code] if the input keycode corresponds to a Unicode " "character." msgstr "" -#: doc/classes/OS.xml:604 -msgid "" -"Returns [code]true[/code] if the [b]OK[/b] button should appear on the left " -"and [b]Cancel[/b] on the right." -msgstr "" - -#: doc/classes/OS.xml:611 +#: doc/classes/OS.xml:379 msgid "" "Returns [code]true[/code] if the engine was executed with [code]-v[/code] " "(verbose stdout)." msgstr "" -#: doc/classes/OS.xml:618 +#: doc/classes/OS.xml:386 msgid "" "If [code]true[/code], the [code]user://[/code] file system is persistent, so " "that its state is the same after a player quits and starts the game again. " "Relevant to the HTML5 platform, where this persistence may be unavailable." msgstr "" -#: doc/classes/OS.xml:625 -msgid "" -"Returns [code]true[/code] if the window should always be on top of other " -"windows." -msgstr "" - -#: doc/classes/OS.xml:632 -msgid "" -"Returns [code]true[/code] if the window is currently focused.\n" -"[b]Note:[/b] Only implemented on desktop platforms. On other platforms, it " -"will always return [code]true[/code]." -msgstr "" - -#: doc/classes/OS.xml:642 +#: doc/classes/OS.xml:395 msgid "" "Kill (terminate) the process identified by the given process ID ([code]pid[/" "code]), e.g. the one returned by [method execute] in non-blocking mode.\n" @@ -32935,83 +33144,37 @@ msgid "" "Windows." msgstr "" -#: doc/classes/OS.xml:651 -msgid "" -"Moves the window to the front.\n" -"[b]Note:[/b] This method is implemented on Linux, macOS and Windows." -msgstr "" - -#: doc/classes/OS.xml:659 -msgid "" -"Returns [code]true[/code] if native video is playing.\n" -"[b]Note:[/b] This method is implemented on Android and iOS." -msgstr "" - -#: doc/classes/OS.xml:667 -msgid "" -"Pauses native video playback.\n" -"[b]Note:[/b] This method is implemented on Android and iOS." -msgstr "" - -#: doc/classes/OS.xml:683 -msgid "" -"Plays native video from the specified path, at the given volume and with " -"audio and subtitle tracks.\n" -"[b]Note:[/b] This method is implemented on Android and iOS, and the current " -"Android implementation does not support the [code]volume[/code], " -"[code]audio_track[/code] and [code]subtitle_track[/code] options." -msgstr "" - -#: doc/classes/OS.xml:691 -msgid "" -"Stops native video playback.\n" -"[b]Note:[/b] This method is implemented on Android and iOS." -msgstr "" - -#: doc/classes/OS.xml:699 -msgid "" -"Resumes native video playback.\n" -"[b]Note:[/b] This method is implemented on Android and iOS." -msgstr "" - -#: doc/classes/OS.xml:707 +#: doc/classes/OS.xml:404 msgid "" "Initialises the singleton for the system MIDI driver.\n" "[b]Note:[/b] This method is implemented on Linux, macOS and Windows." msgstr "" -#: doc/classes/OS.xml:717 +#: doc/classes/OS.xml:414 msgid "" "Shows all resources in the game. Optionally, the list can be written to a " "file by specifying a file path in [code]tofile[/code]." msgstr "" -#: doc/classes/OS.xml:724 +#: doc/classes/OS.xml:421 msgid "Shows the list of loaded textures sorted by size in memory." msgstr "" -#: doc/classes/OS.xml:733 +#: doc/classes/OS.xml:430 msgid "Shows the number of resources loaded by the game of the given types." msgstr "" -#: doc/classes/OS.xml:742 +#: doc/classes/OS.xml:439 msgid "Shows all resources currently used by the game." msgstr "" -#: doc/classes/OS.xml:749 -msgid "" -"Request the user attention to the window. It'll flash the taskbar button on " -"Windows or bounce the dock icon on OSX.\n" -"[b]Note:[/b] This method is implemented on Linux, macOS and Windows." -msgstr "" - -#: doc/classes/OS.xml:759 +#: doc/classes/OS.xml:448 msgid "" "At the moment this function is only used by [code]AudioDriverOpenSL[/code] " "to request permission for [code]RECORD_AUDIO[/code] on Android." msgstr "" -#: doc/classes/OS.xml:766 +#: doc/classes/OS.xml:455 msgid "" "With this function you can request dangerous permissions since normal " "permissions are automatically granted at install time in Android " @@ -33019,63 +33182,15 @@ msgid "" "[b]Note:[/b] This method is implemented on Android." msgstr "" -#: doc/classes/OS.xml:776 -msgid "" -"Sets the game's icon using an [Image] resource.\n" -"The same image is used for window caption, taskbar/dock and window selection " -"dialog. Image is scaled as needed.\n" -"[b]Note:[/b] This method is implemented on HTML5, Linux, macOS and Windows." -msgstr "" - -#: doc/classes/OS.xml:787 -msgid "" -"Sets whether IME input mode should be enabled.\n" -"If active IME handles key events before the application and creates an " -"composition string and suggestion list.\n" -"Application can retrieve the composition status by using [method " -"get_ime_selection] and [method get_ime_text] functions.\n" -"Completed composition string is committed when input is finished.\n" -"[b]Note:[/b] This method is implemented on Linux, macOS and Windows." -msgstr "" - -#: doc/classes/OS.xml:800 -msgid "" -"Sets position of IME suggestion list popup (in window coordinates).\n" -"[b]Note:[/b] This method is implemented on Linux, macOS and Windows." -msgstr "" - -#: doc/classes/OS.xml:810 -msgid "" -"Sets the game's icon using a multi-size platform-specific icon file ([code]*." -"ico[/code] on Windows and [code]*.icns[/code] on macOS).\n" -"Appropriate size sub-icons are used for window caption, taskbar/dock and " -"window selection dialog.\n" -"[b]Note:[/b] This method is implemented on macOS and Windows." -msgstr "" - -#: doc/classes/OS.xml:821 +#: doc/classes/OS.xml:465 msgid "Sets the name of the current thread." msgstr "" -#: doc/classes/OS.xml:830 +#: doc/classes/OS.xml:474 msgid "Enables backup saves if [code]enabled[/code] is [code]true[/code]." msgstr "" -#: doc/classes/OS.xml:839 -msgid "" -"Sets whether the window should always be on top.\n" -"[b]Note:[/b] This method is implemented on Linux, macOS and Windows." -msgstr "" - -#: doc/classes/OS.xml:849 -msgid "" -"Sets the window title to the specified string.\n" -"[b]Note:[/b] This should be used sporadically. Don't set this every frame, " -"as that will negatively affect performance on some window managers.\n" -"[b]Note:[/b] This method is implemented on HTML5, Linux, macOS and Windows." -msgstr "" - -#: doc/classes/OS.xml:860 +#: doc/classes/OS.xml:483 msgid "" "Requests the OS to open a resource with the most appropriate program. For " "example:\n" @@ -33088,28 +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:873 -msgid "" -"Shows the virtual keyboard if the platform has one. The [code]existing_text[/" -"code] parameter is useful for implementing your own LineEdit, as it tells " -"the virtual keyboard what text has already been typed (the virtual keyboard " -"uses it for auto-correct and predictions).\n" -"[b]Note:[/b] This method is implemented on Android, iOS and UWP." -msgstr "" - -#: doc/classes/OS.xml:880 -msgid "The clipboard from the host OS. Might be unavailable on some platforms." -msgstr "" - -#: doc/classes/OS.xml:883 -msgid "The current screen index (starting from 0)." -msgstr "" - -#: doc/classes/OS.xml:886 +#: 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 " @@ -33119,245 +33219,133 @@ msgid "" "with an [code]exit_code[/code] argument passed." msgstr "" -#: doc/classes/OS.xml:890 -msgid "" -"If [code]true[/code], the engine tries to keep the screen on while the game " -"is running. Useful on mobile." -msgstr "" - -#: doc/classes/OS.xml:893 +#: 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:896 +#: 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:899 -msgid "" -"The maximum size of the window (without counting window manager " -"decorations). Does not affect fullscreen mode. Set to [code](0, 0)[/code] to " -"reset to the system default value." -msgstr "" - -#: doc/classes/OS.xml:902 -msgid "" -"The minimum size of the window (without counting window manager " -"decorations). Does not affect fullscreen mode. Set to [code](0, 0)[/code] to " -"reset to the system default value." -msgstr "" - -#: doc/classes/OS.xml:905 -msgid "The current screen orientation." -msgstr "" - -#: doc/classes/OS.xml:908 -msgid "If [code]true[/code], vertical synchronization (Vsync) is enabled." -msgstr "" - -#: doc/classes/OS.xml:911 -msgid "" -"If [code]true[/code] and [code]vsync_enabled[/code] is true, the operating " -"system's window compositor will be used for vsync when the compositor is " -"enabled and the game is in windowed mode.\n" -"[b]Note:[/b] This option is experimental and meant to alleviate stutter " -"experienced by some users. However, some users have experienced a Vsync " -"framerate halving (e.g. from 60 FPS to 30 FPS) when using it.\n" -"[b]Note:[/b] This property is only implemented on Windows." -msgstr "" - -#: doc/classes/OS.xml:916 -msgid "" -"If [code]true[/code], removes the window frame.\n" -"[b]Note:[/b] Setting [code]window_borderless[/code] to [code]false[/code] " -"disables per-pixel transparency." -msgstr "" - -#: doc/classes/OS.xml:920 -msgid "If [code]true[/code], the window is fullscreen." -msgstr "" - -#: doc/classes/OS.xml:923 -msgid "If [code]true[/code], the window is maximized." -msgstr "" - -#: doc/classes/OS.xml:926 -msgid "If [code]true[/code], the window is minimized." -msgstr "" - -#: doc/classes/OS.xml:929 -msgid "" -"If [code]true[/code], the window background is transparent and window frame " -"is removed.\n" -"Use [code]get_tree().get_root().set_transparent_background(true)[/code] to " -"disable main viewport background rendering.\n" -"[b]Note:[/b] This property has no effect if [b]Project > Project Settings > " -"Display > Window > Per-pixel transparency > Allowed[/b] setting is " -"disabled.\n" -"[b]Note:[/b] This property is implemented on HTML5, Linux, macOS and Windows." -msgstr "" - -#: doc/classes/OS.xml:935 -msgid "" -"The window position relative to the screen, the origin is the top left " -"corner, +Y axis goes to the bottom and +X axis goes to the right." -msgstr "" - -#: doc/classes/OS.xml:938 -msgid "If [code]true[/code], the window is resizable by the user." -msgstr "" - -#: doc/classes/OS.xml:941 -msgid "The size of the window (without counting window manager decorations)." -msgstr "" - -#: doc/classes/OS.xml:946 +#: 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:949 +#: doc/classes/OS.xml:509 msgid "The Vulkan rendering backend." msgstr "" -#: doc/classes/OS.xml:952 +#: doc/classes/OS.xml:512 msgid "Sunday." msgstr "" -#: doc/classes/OS.xml:955 +#: doc/classes/OS.xml:515 msgid "Monday." msgstr "" -#: doc/classes/OS.xml:958 +#: doc/classes/OS.xml:518 msgid "Tuesday." msgstr "" -#: doc/classes/OS.xml:961 +#: doc/classes/OS.xml:521 msgid "Wednesday." msgstr "" -#: doc/classes/OS.xml:964 +#: doc/classes/OS.xml:524 msgid "Thursday." msgstr "" -#: doc/classes/OS.xml:967 +#: doc/classes/OS.xml:527 msgid "Friday." msgstr "" -#: doc/classes/OS.xml:970 +#: doc/classes/OS.xml:530 msgid "Saturday." msgstr "" -#: doc/classes/OS.xml:973 +#: doc/classes/OS.xml:533 msgid "January." msgstr "" -#: doc/classes/OS.xml:976 +#: doc/classes/OS.xml:536 msgid "February." msgstr "" -#: doc/classes/OS.xml:979 +#: doc/classes/OS.xml:539 msgid "March." msgstr "" -#: doc/classes/OS.xml:982 +#: doc/classes/OS.xml:542 msgid "April." msgstr "" -#: doc/classes/OS.xml:985 +#: doc/classes/OS.xml:545 msgid "May." msgstr "" -#: doc/classes/OS.xml:988 +#: doc/classes/OS.xml:548 msgid "June." msgstr "" -#: doc/classes/OS.xml:991 +#: doc/classes/OS.xml:551 msgid "July." msgstr "" -#: doc/classes/OS.xml:994 +#: doc/classes/OS.xml:554 msgid "August." msgstr "" -#: doc/classes/OS.xml:997 +#: doc/classes/OS.xml:557 msgid "September." msgstr "" -#: doc/classes/OS.xml:1000 +#: doc/classes/OS.xml:560 msgid "October." msgstr "" -#: doc/classes/OS.xml:1003 +#: doc/classes/OS.xml:563 msgid "November." msgstr "" -#: doc/classes/OS.xml:1006 +#: doc/classes/OS.xml:566 msgid "December." msgstr "" -#: doc/classes/OS.xml:1009 -msgid "Landscape screen orientation." -msgstr "" - -#: doc/classes/OS.xml:1012 -msgid "Portrait screen orientation." -msgstr "" - -#: doc/classes/OS.xml:1015 -msgid "Reverse landscape screen orientation." -msgstr "" - -#: doc/classes/OS.xml:1018 -msgid "Reverse portrait screen orientation." -msgstr "" - -#: doc/classes/OS.xml:1021 -msgid "Uses landscape or reverse landscape based on the hardware sensor." -msgstr "" - -#: doc/classes/OS.xml:1024 -msgid "Uses portrait or reverse portrait based on the hardware sensor." -msgstr "" - -#: doc/classes/OS.xml:1027 -msgid "Uses most suitable orientation based on the hardware sensor." -msgstr "" - -#: doc/classes/OS.xml:1030 +#: doc/classes/OS.xml:569 msgid "Desktop directory path." msgstr "" -#: doc/classes/OS.xml:1033 +#: doc/classes/OS.xml:572 msgid "DCIM (Digital Camera Images) directory path." msgstr "" -#: doc/classes/OS.xml:1036 +#: doc/classes/OS.xml:575 msgid "Documents directory path." msgstr "" -#: doc/classes/OS.xml:1039 +#: doc/classes/OS.xml:578 msgid "Downloads directory path." msgstr "" -#: doc/classes/OS.xml:1042 +#: doc/classes/OS.xml:581 msgid "Movies directory path." msgstr "" -#: doc/classes/OS.xml:1045 +#: doc/classes/OS.xml:584 msgid "Music directory path." msgstr "" -#: doc/classes/OS.xml:1048 +#: doc/classes/OS.xml:587 msgid "Pictures directory path." msgstr "" -#: doc/classes/OS.xml:1051 +#: doc/classes/OS.xml:590 msgid "Ringtones directory path." msgstr "" @@ -33629,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, " @@ -33680,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" @@ -34033,7 +34024,7 @@ msgid "" "as a parent and container for other types of [Control] nodes." msgstr "" -#: doc/classes/Panel.xml:17 +#: doc/classes/Panel.xml:25 msgid "The style of this [Panel]." msgstr "" @@ -34051,15 +34042,15 @@ msgstr "" msgid "The style of [PanelContainer]'s background." msgstr "" -#: doc/classes/PanoramaSky.xml:4 -msgid "A type of [Sky] used to draw a background texture." +#: doc/classes/PanoramaSkyMaterial.xml:4 +msgid "A [Material] used with [Sky] to draw a background texture." msgstr "" -#: doc/classes/PanoramaSky.xml:7 +#: doc/classes/PanoramaSkyMaterial.xml:7 msgid "" -"A resource referenced in an [Environment] that is used to draw a background. " -"The Panorama sky functions similar to skyboxes in other engines, except it " -"uses an equirectangular sky map instead of a cube map.\n" +"A resource referenced in a [Sky] that is used to draw a background. The " +"Panorama sky material functions similar to skyboxes in other engines, except " +"it uses an equirectangular sky map instead of a cube map.\n" "Using an HDR panorama is strongly recommended for accurate, high-quality " "reflections. Godot supports the Radiance HDR ([code].hdr[/code]) and OpenEXR " "([code].exr[/code]) image formats for this purpose.\n" @@ -34068,8 +34059,8 @@ msgid "" "equirectangular sky map." msgstr "" -#: doc/classes/PanoramaSky.xml:17 -msgid "[Texture2D] to be applied to the PanoramaSky." +#: doc/classes/PanoramaSkyMaterial.xml:17 +msgid "[Texture2D] to be applied to the [PanoramaSkyMaterial]." msgstr "" #: doc/classes/ParallaxBackground.xml:4 @@ -34153,146 +34144,15 @@ msgid "" "it will not scroll." msgstr "" -#: doc/classes/Particles.xml:4 -msgid "3D particle emitter." -msgstr "" - -#: doc/classes/Particles.xml:7 -msgid "" -"3D particle node used to create a variety of particle systems and effects. " -"[Particles] features an emitter that generates some number of particles at a " -"given rate.\n" -"Use the [code]process_material[/code] property to add a [ParticlesMaterial] " -"to configure particle appearance and behavior. Alternatively, you can add a " -"[ShaderMaterial] which will be applied to all particles." -msgstr "" - -#: doc/classes/Particles.xml:11 -msgid "" -"https://docs.godotengine.org/en/latest/tutorials/3d/vertex_animation/" -"controlling_thousands_of_fish.html" -msgstr "" - -#: doc/classes/Particles.xml:18 -msgid "" -"Returns the axis-aligned bounding box that contains all the particles that " -"are active in the current frame." -msgstr "" - -#: doc/classes/Particles.xml:27 -msgid "Returns the [Mesh] that is drawn at index [code]pass[/code]." -msgstr "" - -#: doc/classes/Particles.xml:34 -msgid "Restarts the particle emission, clearing existing particles." -msgstr "" - -#: doc/classes/Particles.xml:45 -msgid "Sets the [Mesh] that is drawn at index [code]pass[/code]." -msgstr "" - -#: doc/classes/Particles.xml:51 -msgid "Number of particles to emit." -msgstr "" - -#: doc/classes/Particles.xml:57 -msgid "[Mesh] that is drawn for the first draw pass." -msgstr "" - -#: doc/classes/Particles.xml:60 -msgid "[Mesh] that is drawn for the second draw pass." -msgstr "" - -#: doc/classes/Particles.xml:63 -msgid "[Mesh] that is drawn for the third draw pass." -msgstr "" - -#: doc/classes/Particles.xml:66 -msgid "[Mesh] that is drawn for the fourth draw pass." -msgstr "" - -#: doc/classes/Particles.xml:69 -msgid "The number of draw passes when rendering particles." -msgstr "" - -#: doc/classes/Particles.xml:75 -msgid "" -"Time ratio between each emission. If [code]0[/code], particles are emitted " -"continuously. If [code]1[/code], all particles are emitted simultaneously." -msgstr "" - -#: doc/classes/Particles.xml:90 -msgid "" -"If [code]true[/code], only [code]amount[/code] particles will be emitted." -msgstr "" - -#: doc/classes/Particles.xml:93 -msgid "" -"Amount of time to preprocess the particles before animation starts. Lets you " -"start the animation some time after particles have started emitting." -msgstr "" - -#: doc/classes/Particles.xml:96 doc/classes/Particles2D.xml:64 -msgid "" -"[Material] for processing particles. Can be a [ParticlesMaterial] or a " -"[ShaderMaterial]." -msgstr "" - -#: doc/classes/Particles.xml:99 -msgid "Emission randomness ratio." -msgstr "" - -#: doc/classes/Particles.xml:102 -msgid "" -"Speed scaling ratio. A value of [code]0[/code] can be used to pause the " -"particles." -msgstr "" - -#: doc/classes/Particles.xml:105 -msgid "" -"The [AABB] that determines the area of the world part of which needs to be " -"visible on screen for the particle system to be active." -msgstr "" - -#: doc/classes/Particles.xml:119 -msgid "Maximum number of draw passes supported." -msgstr "" - -#: doc/classes/Particles2D.xml:4 -msgid "2D particle emitter." -msgstr "" - -#: doc/classes/Particles2D.xml:7 -msgid "" -"2D particle node used to create a variety of particle systems and effects. " -"[Particles2D] features an emitter that generates some number of particles at " -"a given rate.\n" -"Use the [code]process_material[/code] property to add a [ParticlesMaterial] " -"to configure particle appearance and behavior. Alternatively, you can add a " -"[ShaderMaterial] which will be applied to all particles." -msgstr "" - -#: doc/classes/Particles2D.xml:18 -msgid "Returns a rectangle containing the positions of all existing particles." -msgstr "" - -#: doc/classes/Particles2D.xml:25 -msgid "Restarts all the existing particles." -msgstr "" - -#: doc/classes/Particles2D.xml:76 -msgid "Editor visibility helper." -msgstr "" - #: doc/classes/ParticlesMaterial.xml:4 -msgid "Particle properties for [Particles] and [Particles2D] nodes." +msgid "Particle properties for [GPUParticles3D] and [GPUParticles2D] nodes." msgstr "" #: doc/classes/ParticlesMaterial.xml:7 msgid "" "ParticlesMaterial defines particle properties and behavior. It is used in " -"the [code]process_material[/code] of [Particles] and [Particles2D] emitter " -"nodes.\n" +"the [code]process_material[/code] of [GPUParticles3D] and [GPUParticles2D] " +"emitter nodes.\n" "Some of this material's properties are applied to each particle when " "emitted, while others can have a [CurveTexture] applied to vary values over " "the lifetime of the particle.\n" @@ -34369,9 +34229,9 @@ msgstr "" #: doc/classes/ParticlesMaterial.xml:135 msgid "" -"Each particle's initial color. If the [Particles2D]'s [code]texture[/code] " -"is defined, it will be multiplied by this color. To have particle display " -"color in a [BaseMaterial3D] make sure to set [member BaseMaterial3D." +"Each particle's initial color. If the [GPUParticles2D]'s [code]texture[/" +"code] is defined, it will be multiplied by this color. To have particle " +"display color in a [BaseMaterial3D] make sure to set [member BaseMaterial3D." "vertex_color_use_as_albedo] to [code]true[/code]." msgstr "" @@ -34579,27 +34439,6 @@ msgid "" "be modulated by [member emission_color_texture]." msgstr "" -#: doc/classes/Path.xml:4 -msgid "Contains a [Curve3D] path for [PathFollow] nodes to follow." -msgstr "" - -#: doc/classes/Path.xml:7 -msgid "" -"Can have [PathFollow] child nodes moving along the [Curve3D]. See " -"[PathFollow] for more information on the usage.\n" -"Note that the path is considered as relative to the moved nodes (children of " -"[PathFollow]). As such, the curve should usually start with a zero vector " -"[code](0, 0, 0)[/code]." -msgstr "" - -#: doc/classes/Path.xml:16 -msgid "A [Curve3D] describing the path." -msgstr "" - -#: doc/classes/Path.xml:22 -msgid "Emitted when the [member curve] changes." -msgstr "" - #: doc/classes/Path2D.xml:4 msgid "Contains a [Curve2D] path for [PathFollow2D] nodes to follow." msgstr "" @@ -34617,13 +34456,34 @@ msgstr "" msgid "A [Curve2D] describing the path." msgstr "" -#: doc/classes/PathFollow.xml:4 -msgid "Point sampler for a [Path]." +#: doc/classes/Path3D.xml:4 +msgid "Contains a [Curve3D] path for [PathFollow3D] nodes to follow." msgstr "" -#: doc/classes/PathFollow.xml:7 +#: doc/classes/Path3D.xml:7 msgid "" -"This node takes its parent [Path], and returns the coordinates of a point " +"Can have [PathFollow3D] child nodes moving along the [Curve3D]. See " +"[PathFollow3D] for more information on the usage.\n" +"Note that the path is considered as relative to the moved nodes (children of " +"[PathFollow3D]). As such, the curve should usually start with a zero vector " +"[code](0, 0, 0)[/code]." +msgstr "" + +#: doc/classes/Path3D.xml:16 +msgid "A [Curve3D] describing the path." +msgstr "" + +#: doc/classes/Path3D.xml:22 +msgid "Emitted when the [member curve] changes." +msgstr "" + +#: doc/classes/PathFollow2D.xml:4 +msgid "Point sampler for a [Path2D]." +msgstr "" + +#: doc/classes/PathFollow2D.xml:7 +msgid "" +"This node takes its parent [Path2D], and returns the coordinates of a point " "within it, given a distance from the first vertex.\n" "It is useful for making other nodes follow a path, without coding the " "movement pattern. For that, the nodes must be children of this node. The " @@ -34631,84 +34491,65 @@ msgid "" "node." msgstr "" -#: doc/classes/PathFollow.xml:16 +#: doc/classes/PathFollow2D.xml:16 msgid "" "If [code]true[/code], the position between two cached points is interpolated " "cubically, and linearly otherwise.\n" -"The points along the [Curve3D] of the [Path] are precomputed before use, for " -"faster calculations. The point at the requested offset is then calculated " -"interpolating between two adjacent cached points. This may present a problem " -"if the curve makes sharp turns, as the cached points may not follow the " -"curve closely enough.\n" +"The points along the [Curve2D] of the [Path2D] are precomputed before use, " +"for faster calculations. The point at the requested offset is then " +"calculated interpolating between two adjacent cached points. This may " +"present a problem if the curve makes sharp turns, as the cached points may " +"not follow the curve closely enough.\n" "There are two answers to this problem: either increase the number of cached " "points and increase memory consumption, or make a cubic interpolation " "between two points at the cost of (slightly) slower calculations." msgstr "" -#: doc/classes/PathFollow.xml:21 doc/classes/PathFollow2D.xml:21 +#: doc/classes/PathFollow2D.xml:21 doc/classes/PathFollow3D.xml:21 msgid "The node's offset along the curve." msgstr "" -#: doc/classes/PathFollow.xml:24 doc/classes/PathFollow2D.xml:27 +#: doc/classes/PathFollow2D.xml:24 +msgid "" +"How far to look ahead of the curve to calculate the tangent if the node is " +"rotating. E.g. shorter lookaheads will lead to faster rotations." +msgstr "" + +#: doc/classes/PathFollow2D.xml:27 doc/classes/PathFollow3D.xml:24 msgid "" "If [code]true[/code], any offset outside the path's length will wrap around, " "instead of stopping at the ends. Use it for cyclic paths." msgstr "" -#: doc/classes/PathFollow.xml:27 -msgid "" -"The distance from the first vertex, measured in 3D units along the path. " -"This sets this node's position to a point within the path." +#: doc/classes/PathFollow2D.xml:30 +msgid "The distance along the path in pixels." msgstr "" -#: doc/classes/PathFollow.xml:30 +#: doc/classes/PathFollow2D.xml:33 msgid "" -"Allows or forbids rotation on one or more axes, depending on the [enum " -"RotationMode] constants being used." +"If [code]true[/code], this node rotates to follow the path, making its " +"descendants rotate." msgstr "" -#: doc/classes/PathFollow.xml:33 +#: doc/classes/PathFollow2D.xml:36 msgid "" -"The distance from the first vertex, considering 0.0 as the first vertex and " -"1.0 as the last. This is just another way of expressing the offset within " -"the path, as the offset supplied is multiplied internally by the path's " -"length." +"The distance along the path as a number in the range 0.0 (for the first " +"vertex) to 1.0 (for the last). This is just another way of expressing the " +"offset within the path, as the offset supplied is multiplied internally by " +"the path's length." msgstr "" -#: doc/classes/PathFollow.xml:36 doc/classes/PathFollow2D.xml:39 +#: doc/classes/PathFollow2D.xml:39 doc/classes/PathFollow3D.xml:36 msgid "The node's offset perpendicular to the curve." msgstr "" -#: doc/classes/PathFollow.xml:41 -msgid "Forbids the PathFollow to rotate." -msgstr "" - -#: doc/classes/PathFollow.xml:44 -msgid "Allows the PathFollow to rotate in the Y axis only." +#: doc/classes/PathFollow3D.xml:4 +msgid "Point sampler for a [Path3D]." msgstr "" -#: doc/classes/PathFollow.xml:47 -msgid "Allows the PathFollow to rotate in both the X, and Y axes." -msgstr "" - -#: doc/classes/PathFollow.xml:50 -msgid "Allows the PathFollow to rotate in any axis." -msgstr "" - -#: doc/classes/PathFollow.xml:53 +#: doc/classes/PathFollow3D.xml:7 msgid "" -"Uses the up vector information in a [Curve3D] to enforce orientation. This " -"rotation mode requires the [Path]'s [member Curve3D.up_vector_enabled] " -"property to be set to [code]true[/code]." -msgstr "" - -#: doc/classes/PathFollow2D.xml:4 -msgid "Point sampler for a [Path2D]." -msgstr "" - -#: doc/classes/PathFollow2D.xml:7 -msgid "" -"This node takes its parent [Path2D], and returns the coordinates of a point " +"This node takes its parent [Path3D], and returns the coordinates of a point " "within it, given a distance from the first vertex.\n" "It is useful for making other nodes follow a path, without coding the " "movement pattern. For that, the nodes must be children of this node. The " @@ -34716,11 +34557,11 @@ msgid "" "node." msgstr "" -#: doc/classes/PathFollow2D.xml:16 +#: doc/classes/PathFollow3D.xml:16 msgid "" "If [code]true[/code], the position between two cached points is interpolated " "cubically, and linearly otherwise.\n" -"The points along the [Curve2D] of the [Path2D] are precomputed before use, " +"The points along the [Curve3D] of the [Path3D] are precomputed before use, " "for faster calculations. The point at the requested offset is then " "calculated interpolating between two adjacent cached points. This may " "present a problem if the curve makes sharp turns, as the cached points may " @@ -34730,28 +34571,47 @@ msgid "" "between two points at the cost of (slightly) slower calculations." msgstr "" -#: doc/classes/PathFollow2D.xml:24 +#: doc/classes/PathFollow3D.xml:27 msgid "" -"How far to look ahead of the curve to calculate the tangent if the node is " -"rotating. E.g. shorter lookaheads will lead to faster rotations." +"The distance from the first vertex, measured in 3D units along the path. " +"This sets this node's position to a point within the path." msgstr "" -#: doc/classes/PathFollow2D.xml:30 -msgid "The distance along the path in pixels." +#: doc/classes/PathFollow3D.xml:30 +msgid "" +"Allows or forbids rotation on one or more axes, depending on the [enum " +"RotationMode] constants being used." msgstr "" -#: doc/classes/PathFollow2D.xml:33 +#: doc/classes/PathFollow3D.xml:33 msgid "" -"If [code]true[/code], this node rotates to follow the path, making its " -"descendants rotate." +"The distance from the first vertex, considering 0.0 as the first vertex and " +"1.0 as the last. This is just another way of expressing the offset within " +"the path, as the offset supplied is multiplied internally by the path's " +"length." msgstr "" -#: doc/classes/PathFollow2D.xml:36 +#: doc/classes/PathFollow3D.xml:41 +msgid "Forbids the PathFollow3D to rotate." +msgstr "" + +#: doc/classes/PathFollow3D.xml:44 +msgid "Allows the PathFollow3D to rotate in the Y axis only." +msgstr "" + +#: doc/classes/PathFollow3D.xml:47 +msgid "Allows the PathFollow3D to rotate in both the X, and Y axes." +msgstr "" + +#: doc/classes/PathFollow3D.xml:50 +msgid "Allows the PathFollow3D to rotate in any axis." +msgstr "" + +#: doc/classes/PathFollow3D.xml:53 msgid "" -"The distance along the path as a number in the range 0.0 (for the first " -"vertex) to 1.0 (for the last). This is just another way of expressing the " -"offset within the path, as the offset supplied is multiplied internally by " -"the path's length." +"Uses the up vector information in a [Curve3D] to enforce orientation. This " +"rotation mode requires the [Path3D]'s [member Curve3D.up_vector_enabled] " +"property to be set to [code]true[/code]." msgstr "" #: doc/classes/PCKPacker.xml:4 @@ -34890,20 +34750,20 @@ msgstr "" msgid "Draw calls per frame. 3D only." msgstr "" -#: doc/classes/Performance.xml:77 doc/classes/VisualServer.xml:3718 +#: 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/VisualServer.xml:3721 +#: 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/VisualServer.xml:3724 +#: 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/VisualServer.xml:3715 +#: doc/classes/Performance.xml:86 doc/classes/RenderingServer.xml:3919 msgid "Unimplemented in the GLES2 rendering backend, always returns 0." msgstr "" @@ -34920,7 +34780,7 @@ msgid "Number of islands in the 2D physics engine." msgstr "" #: doc/classes/Performance.xml:98 -msgid "Number of active [RigidBody] and [VehicleBody] nodes in the game." +msgid "Number of active [RigidBody3D] and [VehicleBody3D] nodes in the game." msgstr "" #: doc/classes/Performance.xml:101 @@ -34955,47 +34815,293 @@ msgid "" "resource." msgstr "" -#: doc/classes/Physics2DDirectBodyState.xml:4 -msgid "Direct access object to a physics body in the [Physics2DServer]." +#: 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 "" + +#: doc/classes/PhysicalSkyMaterial.xml:7 +msgid "" +"The [PhysicalSkyMaterial] uses the Preetham analytic daylight model to draw " +"a sky based on physical properties. This results in a substantially more " +"realistic sky than the [ProceduralSkyMaterial], but it is slightly slower " +"and less flexible.\n" +"The [PhysicalSkyMaterial] only supports one sun. The color, energy, and " +"direction of the sun are taken from the first [DirectionalLight3D] in the " +"scene tree.\n" +"As it is based on a daylight model, the sky fades to black as the sunset " +"ends. If you want a full day/night cycle, you will have to add a night sky " +"by converting this to a [ShaderMaterial] and adding a night sky directly " +"into the resulting shader." +msgstr "" + +#: doc/classes/PhysicalSkyMaterial.xml:17 +msgid "" +"Sets the amount of dithering to use. Dithering helps reduce banding that " +"appears from the smooth changes in color in the sky. Use the lowest value " +"possible, higher amounts may add fuzziness to the sky." +msgstr "" + +#: doc/classes/PhysicalSkyMaterial.xml:20 +msgid "" +"Sets the exposure of the sky. Higher exposure values make the entire sky " +"brighter." +msgstr "" + +#: doc/classes/PhysicalSkyMaterial.xml:23 +msgid "" +"Modulates the [Color] on the bottom half of the sky to represent the ground." +msgstr "" + +#: doc/classes/PhysicalSkyMaterial.xml:26 +msgid "" +"Controls the strength of mie scattering for the sky. Mie scattering results " +"from light colliding with larger particles (like water). On earth, mie " +"scattering results in a whiteish color around the sun and horizon." +msgstr "" + +#: doc/classes/PhysicalSkyMaterial.xml:29 +msgid "" +"Controls the [Color] of the mie scattering effect. While not physically " +"accurate, this allows for the creation of alien looking planets." +msgstr "" + +#: doc/classes/PhysicalSkyMaterial.xml:32 +msgid "" +"Controls the direction of the mie scattering. A value of [code]1[/code] " +"means that when light hits a particle it passing through straight forward. A " +"value of [code]-1[/code] means that all light is scatter backwards." +msgstr "" + +#: doc/classes/PhysicalSkyMaterial.xml:35 +msgid "" +"Controls the strength of the rayleigh scattering. Rayleigh scattering " +"results from light colliding with small particles. It is responsible for the " +"blue color of the sky." +msgstr "" + +#: doc/classes/PhysicalSkyMaterial.xml:38 +msgid "" +"Controls the [Color] of the rayleigh scattering. While not physically " +"accurate, this allows for the creation of alien looking planets. For " +"example, setting this to a red [Color] results in a mars looking atmosphere " +"with a corresponding blue sunset." +msgstr "" + +#: doc/classes/PhysicalSkyMaterial.xml:41 +msgid "" +"Sets the size of the sun disk. Default value is based on Sol's perceived " +"size from Earth." +msgstr "" + +#: doc/classes/PhysicalSkyMaterial.xml:44 +msgid "" +"Sets the thickness of the atmosphere. High turbidity creates a foggy looking " +"atmosphere, while a low turbidity results in a clearer atmosphere." +msgstr "" + +#: doc/classes/PhysicsBody2D.xml:4 +msgid "Base class for all objects affected by physics in 2D space." +msgstr "" + +#: doc/classes/PhysicsBody2D.xml:7 +msgid "" +"PhysicsBody2D is an abstract base class for implementing a physics body. All " +"*Body2D types inherit from it." +msgstr "" + +#: doc/classes/PhysicsBody2D.xml:19 doc/classes/PhysicsBody3D.xml:19 +#: doc/classes/SoftBody3D.xml:19 +msgid "Adds a body to the list of bodies that this body can't collide with." +msgstr "" + +#: doc/classes/PhysicsBody2D.xml:26 doc/classes/PhysicsBody3D.xml:26 +#: doc/classes/SoftBody3D.xml:26 +msgid "" +"Returns an array of nodes that were added as collision exceptions for this " +"body." +msgstr "" + +#: doc/classes/PhysicsBody2D.xml:53 doc/classes/PhysicsBody3D.xml:53 +#: doc/classes/SoftBody3D.xml:53 +msgid "" +"Removes a body from the list of bodies that this body can't collide with." +msgstr "" + +#: doc/classes/PhysicsBody2D.xml:64 doc/classes/PhysicsBody3D.xml:64 +msgid "" +"Sets individual bits on the [member collision_layer] bitmask. Use this if " +"you only need to change one layer's value." +msgstr "" + +#: doc/classes/PhysicsBody2D.xml:75 doc/classes/PhysicsBody3D.xml:75 +msgid "" +"Sets individual bits on the [member collision_mask] bitmask. Use this if you " +"only need to change one layer's value." msgstr "" -#: doc/classes/Physics2DDirectBodyState.xml:7 +#: doc/classes/PhysicsBody2D.xml:81 doc/classes/PhysicsBody3D.xml:81 msgid "" -"Provides direct access to a physics body in the [Physics2DServer], allowing " +"The physics layers this area is in.\n" +"Collidable objects can exist in any of 32 different layers. These layers " +"work like a tagging system, and are not visual. A collidable can use these " +"layers to select with which objects it can collide, using the [member " +"collision_mask] property.\n" +"A contact is detected if object A is in any of the layers that object B " +"scans, or object B is in any layer scanned by object A." +msgstr "" + +#: doc/classes/PhysicsBody2D.xml:86 doc/classes/PhysicsBody3D.xml:86 +msgid "The physics layers this area scans for collisions." +msgstr "" + +#: doc/classes/PhysicsBody2D.xml:90 +msgid "" +"Both [member collision_layer] and [member collision_mask]. Returns [member " +"collision_layer] when accessed. Updates [member collision_layer] and [member " +"collision_mask] when modified." +msgstr "" + +#: doc/classes/PhysicsBody3D.xml:4 +msgid "Base class for all objects affected by physics in 3D space." +msgstr "" + +#: doc/classes/PhysicsBody3D.xml:7 +msgid "" +"PhysicsBody3D is an abstract base class for implementing a physics body. All " +"*Body types inherit from it." +msgstr "" + +#: doc/classes/PhysicsDirectBodyState2D.xml:4 +msgid "Direct access object to a physics body in the [PhysicsServer2D]." +msgstr "" + +#: doc/classes/PhysicsDirectBodyState2D.xml:7 +msgid "" +"Provides direct access to a physics body in the [PhysicsServer2D], allowing " "safe changes to physics properties. This object is passed via the direct " "state callback of rigid/character bodies, and is intended for changing the " "direct state of that body. See [method RigidBody2D._integrate_forces]." msgstr "" -#: doc/classes/Physics2DDirectBodyState.xml:10 -#: doc/classes/Physics2DDirectSpaceState.xml:10 -#: doc/classes/PhysicsDirectSpaceState.xml:10 doc/classes/RayCast.xml:14 -#: doc/classes/RayCast2D.xml:14 doc/classes/World.xml:10 -#: doc/classes/World2D.xml:10 +#: doc/classes/PhysicsDirectBodyState2D.xml:10 +#: doc/classes/PhysicsDirectSpaceState2D.xml:10 +#: doc/classes/PhysicsDirectSpaceState3D.xml:10 doc/classes/RayCast2D.xml:14 +#: doc/classes/RayCast3D.xml:14 doc/classes/World2D.xml:10 +#: doc/classes/World3D.xml:10 msgid "" "https://docs.godotengine.org/en/latest/tutorials/physics/ray-casting.html" msgstr "" -#: doc/classes/Physics2DDirectBodyState.xml:19 doc/classes/RigidBody2D.xml:31 +#: doc/classes/PhysicsDirectBodyState2D.xml:19 doc/classes/RigidBody2D.xml:31 msgid "Adds a constant directional force without affecting rotation." msgstr "" -#: doc/classes/Physics2DDirectBodyState.xml:30 -#: doc/classes/PhysicsDirectBodyState.xml:30 doc/classes/RigidBody2D.xml:42 +#: doc/classes/PhysicsDirectBodyState2D.xml:30 +#: doc/classes/PhysicsDirectBodyState3D.xml:30 doc/classes/RigidBody2D.xml:42 msgid "" "Adds a positioned force to the body. Both the force and the offset from the " "body origin are in global coordinates." msgstr "" -#: doc/classes/Physics2DDirectBodyState.xml:39 doc/classes/RigidBody2D.xml:51 +#: doc/classes/PhysicsDirectBodyState2D.xml:39 doc/classes/RigidBody2D.xml:51 msgid "Adds a constant rotational force." msgstr "" -#: doc/classes/Physics2DDirectBodyState.xml:48 doc/classes/RigidBody2D.xml:60 +#: doc/classes/PhysicsDirectBodyState2D.xml:48 doc/classes/RigidBody2D.xml:60 msgid "Applies a directional impulse without affecting rotation." msgstr "" -#: doc/classes/Physics2DDirectBodyState.xml:59 +#: doc/classes/PhysicsDirectBodyState2D.xml:59 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. " @@ -35004,180 +35110,228 @@ msgid "" "the global coordinate system, but is centered at the object's origin." msgstr "" -#: doc/classes/Physics2DDirectBodyState.xml:68 doc/classes/RigidBody2D.xml:80 +#: doc/classes/PhysicsDirectBodyState2D.xml:68 doc/classes/RigidBody2D.xml:80 msgid "Applies a rotational impulse to the body." msgstr "" -#: doc/classes/Physics2DDirectBodyState.xml:77 -#: doc/classes/PhysicsDirectBodyState.xml:78 +#: doc/classes/PhysicsDirectBodyState2D.xml:77 +#: doc/classes/PhysicsDirectBodyState3D.xml:78 msgid "Returns the collider's [RID]." msgstr "" -#: doc/classes/Physics2DDirectBodyState.xml:86 -#: doc/classes/PhysicsDirectBodyState.xml:87 +#: doc/classes/PhysicsDirectBodyState2D.xml:86 +#: doc/classes/PhysicsDirectBodyState3D.xml:87 msgid "Returns the collider's object id." msgstr "" -#: doc/classes/Physics2DDirectBodyState.xml:95 +#: doc/classes/PhysicsDirectBodyState2D.xml:95 msgid "" "Returns the collider object. This depends on how it was created (will return " "a scene node if such was used to create it)." msgstr "" -#: doc/classes/Physics2DDirectBodyState.xml:104 -#: doc/classes/PhysicsDirectBodyState.xml:105 +#: doc/classes/PhysicsDirectBodyState2D.xml:104 +#: doc/classes/PhysicsDirectBodyState3D.xml:105 msgid "Returns the contact position in the collider." msgstr "" -#: doc/classes/Physics2DDirectBodyState.xml:113 -#: doc/classes/PhysicsDirectBodyState.xml:114 +#: doc/classes/PhysicsDirectBodyState2D.xml:113 +#: doc/classes/PhysicsDirectBodyState3D.xml:114 msgid "Returns the collider's shape index." msgstr "" -#: doc/classes/Physics2DDirectBodyState.xml:122 +#: doc/classes/PhysicsDirectBodyState2D.xml:122 msgid "" "Returns the collided shape's metadata. This metadata is different from " -"[method Object.get_meta], and is set with [method Physics2DServer." +"[method Object.get_meta], and is set with [method PhysicsServer2D." "shape_set_data]." msgstr "" -#: doc/classes/Physics2DDirectBodyState.xml:131 -#: doc/classes/PhysicsDirectBodyState.xml:123 +#: doc/classes/PhysicsDirectBodyState2D.xml:131 +#: doc/classes/PhysicsDirectBodyState3D.xml:123 msgid "Returns the linear velocity vector at the collider's contact point." msgstr "" -#: doc/classes/Physics2DDirectBodyState.xml:138 +#: doc/classes/PhysicsDirectBodyState2D.xml:138 msgid "" "Returns the number of contacts this body has with other bodies.\n" "[b]Note:[/b] By default, this returns 0 unless bodies are configured to " "monitor contacts. See [member RigidBody2D.contact_monitor]." msgstr "" -#: doc/classes/Physics2DDirectBodyState.xml:148 -#: doc/classes/PhysicsDirectBodyState.xml:149 +#: doc/classes/PhysicsDirectBodyState2D.xml:148 +#: doc/classes/PhysicsDirectBodyState3D.xml:149 msgid "Returns the local normal at the contact point." msgstr "" -#: doc/classes/Physics2DDirectBodyState.xml:157 -#: doc/classes/PhysicsDirectBodyState.xml:158 +#: doc/classes/PhysicsDirectBodyState2D.xml:157 +#: doc/classes/PhysicsDirectBodyState3D.xml:158 msgid "Returns the local position of the contact point." msgstr "" -#: doc/classes/Physics2DDirectBodyState.xml:166 -#: doc/classes/PhysicsDirectBodyState.xml:167 +#: doc/classes/PhysicsDirectBodyState2D.xml:166 +#: doc/classes/PhysicsDirectBodyState3D.xml:167 msgid "Returns the local shape index of the collision." msgstr "" -#: doc/classes/Physics2DDirectBodyState.xml:173 -#: doc/classes/PhysicsDirectBodyState.xml:174 +#: doc/classes/PhysicsDirectBodyState2D.xml:173 +#: doc/classes/PhysicsDirectBodyState3D.xml:174 msgid "Returns the current state of the space, useful for queries." msgstr "" -#: doc/classes/Physics2DDirectBodyState.xml:180 -#: doc/classes/PhysicsDirectBodyState.xml:181 +#: doc/classes/PhysicsDirectBodyState2D.xml:180 +#: doc/classes/PhysicsDirectBodyState3D.xml:181 msgid "Calls the built-in force integration code." msgstr "" -#: doc/classes/Physics2DDirectBodyState.xml:186 -#: doc/classes/PhysicsDirectBodyState.xml:187 doc/classes/RigidBody2D.xml:121 +#: doc/classes/PhysicsDirectBodyState2D.xml:186 +#: doc/classes/PhysicsDirectBodyState3D.xml:187 doc/classes/RigidBody2D.xml:121 msgid "The body's rotational velocity." msgstr "" -#: doc/classes/Physics2DDirectBodyState.xml:189 -#: doc/classes/PhysicsDirectBodyState.xml:192 +#: doc/classes/PhysicsDirectBodyState2D.xml:189 +#: doc/classes/PhysicsDirectBodyState3D.xml:192 msgid "The inverse of the inertia of the body." msgstr "" -#: doc/classes/Physics2DDirectBodyState.xml:192 -#: doc/classes/PhysicsDirectBodyState.xml:195 +#: doc/classes/PhysicsDirectBodyState2D.xml:192 +#: doc/classes/PhysicsDirectBodyState3D.xml:195 msgid "The inverse of the mass of the body." msgstr "" -#: doc/classes/Physics2DDirectBodyState.xml:195 -#: doc/classes/PhysicsDirectBodyState.xml:198 doc/classes/RigidBody2D.xml:155 +#: doc/classes/PhysicsDirectBodyState2D.xml:195 +#: doc/classes/PhysicsDirectBodyState3D.xml:198 doc/classes/RigidBody2D.xml:155 msgid "The body's linear velocity." msgstr "" -#: doc/classes/Physics2DDirectBodyState.xml:198 -#: doc/classes/PhysicsDirectBodyState.xml:203 +#: doc/classes/PhysicsDirectBodyState2D.xml:198 +#: doc/classes/PhysicsDirectBodyState3D.xml:203 msgid "If [code]true[/code], this body is currently sleeping (not active)." msgstr "" -#: doc/classes/Physics2DDirectBodyState.xml:201 -#: doc/classes/PhysicsDirectBodyState.xml:206 +#: doc/classes/PhysicsDirectBodyState2D.xml:201 +#: doc/classes/PhysicsDirectBodyState3D.xml:206 msgid "The timestep (delta) used for the simulation." msgstr "" -#: doc/classes/Physics2DDirectBodyState.xml:204 -#: doc/classes/PhysicsDirectBodyState.xml:209 +#: doc/classes/PhysicsDirectBodyState2D.xml:204 +#: doc/classes/PhysicsDirectBodyState3D.xml:209 msgid "" "The rate at which the body stops rotating, if there are not any other forces " "moving it." msgstr "" -#: doc/classes/Physics2DDirectBodyState.xml:207 -#: doc/classes/PhysicsDirectBodyState.xml:212 +#: doc/classes/PhysicsDirectBodyState2D.xml:207 +#: doc/classes/PhysicsDirectBodyState3D.xml:212 msgid "The total gravity vector being currently applied to this body." msgstr "" -#: doc/classes/Physics2DDirectBodyState.xml:210 -#: doc/classes/PhysicsDirectBodyState.xml:215 +#: doc/classes/PhysicsDirectBodyState2D.xml:210 +#: doc/classes/PhysicsDirectBodyState3D.xml:215 msgid "" "The rate at which the body stops moving, if there are not any other forces " "moving it." msgstr "" -#: doc/classes/Physics2DDirectBodyState.xml:213 -#: doc/classes/PhysicsDirectBodyState.xml:218 +#: doc/classes/PhysicsDirectBodyState2D.xml:213 +#: doc/classes/PhysicsDirectBodyState3D.xml:218 msgid "The body's transformation matrix." msgstr "" -#: doc/classes/Physics2DDirectBodyStateSW.xml:4 -msgid "Software implementation of [Physics2DDirectBodyState]." +#: doc/classes/PhysicsDirectBodyState3D.xml:4 +msgid "Direct access object to a physics body in the [PhysicsServer3D]." msgstr "" -#: doc/classes/Physics2DDirectBodyStateSW.xml:7 +#: doc/classes/PhysicsDirectBodyState3D.xml:7 msgid "" -"Software implementation of [Physics2DDirectBodyState]. This object exposes " -"no new methods or properties and should not be used, as " -"[Physics2DDirectBodyState] selects the best implementation available." +"Provides direct access to a physics body in the [PhysicsServer3D], allowing " +"safe changes to physics properties. This object is passed via the direct " +"state callback of rigid/character bodies, and is intended for changing the " +"direct state of that body. See [method RigidBody3D._integrate_forces]." +msgstr "" + +#: 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]." +msgstr "" + +#: doc/classes/PhysicsDirectBodyState3D.xml:39 +msgid "Adds a constant rotational force without affecting position." +msgstr "" + +#: doc/classes/PhysicsDirectBodyState3D.xml:48 +msgid "" +"Applies a single directional impulse without affecting rotation.\n" +"This is equivalent to [code]apply_impulse(Vector3(0, 0, 0), impulse)[/code]." +msgstr "" + +#: doc/classes/PhysicsDirectBodyState3D.xml:60 +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. " +"For this reason it should only be used when simulating one-time impacts. The " +"position uses the rotation of the global coordinate system, but is centered " +"at the object's origin." +msgstr "" + +#: doc/classes/PhysicsDirectBodyState3D.xml:69 +msgid "" +"Apply a torque impulse (which will be affected by the body mass and shape). " +"This will rotate the body around the vector [code]j[/code] passed as " +"parameter." +msgstr "" + +#: doc/classes/PhysicsDirectBodyState3D.xml:96 +msgid "Returns the collider object." +msgstr "" + +#: doc/classes/PhysicsDirectBodyState3D.xml:130 +msgid "" +"Returns the number of contacts this body has with other bodies.\n" +"[b]Note:[/b] By default, this returns 0 unless bodies are configured to " +"monitor contacts. See [member RigidBody3D.contact_monitor]." msgstr "" -#: doc/classes/Physics2DDirectSpaceState.xml:4 -msgid "Direct access object to a space in the [Physics2DServer]." +#: doc/classes/PhysicsDirectBodyState3D.xml:140 +msgid "Impulse created by the contact. Only implemented for Bullet physics." msgstr "" -#: doc/classes/Physics2DDirectSpaceState.xml:7 +#: doc/classes/PhysicsDirectSpaceState2D.xml:4 +msgid "Direct access object to a space in the [PhysicsServer2D]." +msgstr "" + +#: doc/classes/PhysicsDirectSpaceState2D.xml:7 msgid "" -"Direct access object to a space in the [Physics2DServer]. It's used mainly " +"Direct access object to a space in the [PhysicsServer2D]. It's used mainly " "to do queries against objects and areas residing in a given space." msgstr "" -#: doc/classes/Physics2DDirectSpaceState.xml:19 +#: doc/classes/PhysicsDirectSpaceState2D.xml:19 msgid "" "Checks how far the shape can travel toward a point. If the shape can not " "move, the array will be empty.\n" "[b]Note:[/b] Both the shape and the motion are supplied through a " -"[Physics2DShapeQueryParameters] object. The method will return an array with " +"[PhysicsShapeQueryParameters2D] object. The method will return an array with " "two floats between 0 and 1, both representing a fraction of [code]motion[/" "code]. The first is how far the shape can move without triggering a " "collision, and the second is the point at which a collision will occur. If " "no collision is detected, the returned array will be [code][1, 1][/code]." msgstr "" -#: doc/classes/Physics2DDirectSpaceState.xml:31 +#: doc/classes/PhysicsDirectSpaceState2D.xml:31 msgid "" "Checks the intersections of a shape, given through a " -"[Physics2DShapeQueryParameters] object, against the space. The resulting " +"[PhysicsShapeQueryParameters2D] object, against the space. The resulting " "array contains a list of points where the shape intersects another. Like " "with [method intersect_shape], the number of returned results can be limited " "to save processing time." msgstr "" -#: doc/classes/Physics2DDirectSpaceState.xml:40 +#: doc/classes/PhysicsDirectSpaceState2D.xml:40 msgid "" "Checks the intersections of a shape, given through a " -"[Physics2DShapeQueryParameters] object, against the space. If it collides " +"[PhysicsShapeQueryParameters2D] object, against the space. If it collides " "with more than one shape, the nearest one is selected. If the shape did not " "intersect anything, then an empty dictionary is returned instead.\n" "[b]Note:[/b] This method does not take into account the [code]motion[/code] " @@ -35188,14 +35342,14 @@ msgid "" "the object is an [Area2D], the result is [code](0, 0)[/code].\n" "[code]metadata[/code]: The intersecting shape's metadata. This metadata is " "different from [method Object.get_meta], and is set with [method " -"Physics2DServer.shape_set_data].\n" +"PhysicsServer2D.shape_set_data].\n" "[code]normal[/code]: The object's surface normal at the intersection point.\n" "[code]point[/code]: The intersection point.\n" "[code]rid[/code]: The intersecting object's [RID].\n" "[code]shape[/code]: The shape index of the colliding shape." msgstr "" -#: doc/classes/Physics2DDirectSpaceState.xml:67 +#: doc/classes/PhysicsDirectSpaceState2D.xml:67 msgid "" "Checks whether a point is inside any shape. The shapes the point is inside " "of are returned in an array containing dictionaries with the following " @@ -35204,17 +35358,17 @@ msgid "" "[code]collider_id[/code]: The colliding object's ID.\n" "[code]metadata[/code]: The intersecting shape's metadata. This metadata is " "different from [method Object.get_meta], and is set with [method " -"Physics2DServer.shape_set_data].\n" +"PhysicsServer2D.shape_set_data].\n" "[code]rid[/code]: The intersecting object's [RID].\n" "[code]shape[/code]: The shape index of the colliding shape.\n" "Additionally, the method can take an [code]exclude[/code] array of objects " "or [RID]s that are to be excluded from collisions, a [code]collision_mask[/" "code] bitmask representing the physics layers to check in, or booleans to " -"determine if the ray should collide with [PhysicsBody]s or [Area]s, " +"determine if the ray should collide with [PhysicsBody2D]s or [Area2D]s, " "respectively." msgstr "" -#: doc/classes/Physics2DDirectSpaceState.xml:112 +#: doc/classes/PhysicsDirectSpaceState2D.xml:112 msgid "" "Intersects a ray in a given space. The returned object is a dictionary with " "the following fields:\n" @@ -35222,7 +35376,7 @@ msgid "" "[code]collider_id[/code]: The colliding object's ID.\n" "[code]metadata[/code]: The intersecting shape's metadata. This metadata is " "different from [method Object.get_meta], and is set with [method " -"Physics2DServer.shape_set_data].\n" +"PhysicsServer2D.shape_set_data].\n" "[code]normal[/code]: The object's surface normal at the intersection point.\n" "[code]position[/code]: The intersection point.\n" "[code]rid[/code]: The intersecting object's [RID].\n" @@ -35232,14 +35386,14 @@ msgid "" "Additionally, the method can take an [code]exclude[/code] array of objects " "or [RID]s that are to be excluded from collisions, a [code]collision_mask[/" "code] bitmask representing the physics layers to check in, or booleans to " -"determine if the ray should collide with [PhysicsBody]s or [Area]s, " +"determine if the ray should collide with [PhysicsBody2D]s or [Area2D]s, " "respectively." msgstr "" -#: doc/classes/Physics2DDirectSpaceState.xml:132 +#: doc/classes/PhysicsDirectSpaceState2D.xml:132 msgid "" "Checks the intersections of a shape, given through a " -"[Physics2DShapeQueryParameters] object, against the space.\n" +"[PhysicsShapeQueryParameters2D] object, against the space.\n" "[b]Note:[/b] This method does not take into account the [code]motion[/code] " "property of the object. The intersected shapes are returned in an array " "containing dictionaries with the following fields:\n" @@ -35247,96 +35401,192 @@ msgid "" "[code]collider_id[/code]: The colliding object's ID.\n" "[code]metadata[/code]: The intersecting shape's metadata. This metadata is " "different from [method Object.get_meta], and is set with [method " -"Physics2DServer.shape_set_data].\n" +"PhysicsServer2D.shape_set_data].\n" +"[code]rid[/code]: The intersecting object's [RID].\n" +"[code]shape[/code]: The shape index of the colliding shape.\n" +"The number of intersections can be limited with the [code]max_results[/code] " +"parameter, to reduce the processing time." +msgstr "" + +#: doc/classes/PhysicsDirectSpaceState3D.xml:4 +msgid "Direct access object to a space in the [PhysicsServer3D]." +msgstr "" + +#: doc/classes/PhysicsDirectSpaceState3D.xml:7 +msgid "" +"Direct access object to a space in the [PhysicsServer3D]. It's used mainly " +"to do queries against objects and areas residing in a given space." +msgstr "" + +#: doc/classes/PhysicsDirectSpaceState3D.xml:21 +msgid "" +"Checks whether the shape can travel to a point. The method will return an " +"array with two floats between 0 and 1, both representing a fraction of " +"[code]motion[/code]. The first is how far the shape can move without " +"triggering a collision, and the second is the point at which a collision " +"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 GodotPhysics3D." +msgstr "" + +#: doc/classes/PhysicsDirectSpaceState3D.xml:33 +msgid "" +"Checks the intersections of a shape, given through a " +"[PhysicsShapeQueryParameters3D] object, against the space. The resulting " +"array contains a list of points where the shape intersects another. Like " +"with [method intersect_shape], the number of returned results can be limited " +"to save processing time." +msgstr "" + +#: doc/classes/PhysicsDirectSpaceState3D.xml:42 +msgid "" +"Checks the intersections of a shape, given through a " +"[PhysicsShapeQueryParameters3D] object, against the space. If it collides " +"with more than one shape, the nearest one is selected. The returned object " +"is a dictionary containing the following fields:\n" +"[code]collider_id[/code]: The colliding object's ID.\n" +"[code]linear_velocity[/code]: The colliding object's velocity [Vector3]. If " +"the object is an [Area3D], the result is [code](0, 0, 0)[/code].\n" +"[code]normal[/code]: The object's surface normal at the intersection point.\n" +"[code]point[/code]: The intersection point.\n" +"[code]rid[/code]: The intersecting object's [RID].\n" +"[code]shape[/code]: The shape index of the colliding shape.\n" +"If the shape did not intersect anything, then an empty dictionary is " +"returned instead." +msgstr "" + +#: doc/classes/PhysicsDirectSpaceState3D.xml:68 +msgid "" +"Intersects a ray in a given space. The returned object is a dictionary with " +"the following fields:\n" +"[code]collider[/code]: The colliding object.\n" +"[code]collider_id[/code]: The colliding object's ID.\n" +"[code]normal[/code]: The object's surface normal at the intersection point.\n" +"[code]position[/code]: The intersection point.\n" +"[code]rid[/code]: The intersecting object's [RID].\n" +"[code]shape[/code]: The shape index of the colliding shape.\n" +"If the ray did not intersect anything, then an empty dictionary is returned " +"instead.\n" +"Additionally, the method can take an [code]exclude[/code] array of objects " +"or [RID]s that are to be excluded from collisions, a [code]collision_mask[/" +"code] bitmask representing the physics layers to check in, or booleans to " +"determine if the ray should collide with [PhysicsBody3D]s or [Area3D]s, " +"respectively." +msgstr "" + +#: doc/classes/PhysicsDirectSpaceState3D.xml:87 +msgid "" +"Checks the intersections of a shape, given through a " +"[PhysicsShapeQueryParameters3D] object, against the space. The intersected " +"shapes are returned in an array containing dictionaries with the following " +"fields:\n" +"[code]collider[/code]: The colliding object.\n" +"[code]collider_id[/code]: The colliding object's ID.\n" "[code]rid[/code]: The intersecting object's [RID].\n" "[code]shape[/code]: The shape index of the colliding shape.\n" "The number of intersections can be limited with the [code]max_results[/code] " "parameter, to reduce the processing time." msgstr "" -#: doc/classes/Physics2DServer.xml:4 +#: doc/classes/PhysicsMaterial.xml:4 +msgid "A material for physics properties." +msgstr "" + +#: doc/classes/PhysicsMaterial.xml:7 +msgid "" +"Provides a means of modifying the collision properties of a [PhysicsBody3D]." +msgstr "" + +#: doc/classes/PhysicsMaterial.xml:20 +msgid "" +"The body's friction. Values range from [code]0[/code] (frictionless) to " +"[code]1[/code] (maximum friction)." +msgstr "" + +#: doc/classes/PhysicsServer2D.xml:4 msgid "Server interface for low-level 2D physics access." msgstr "" -#: doc/classes/Physics2DServer.xml:7 +#: doc/classes/PhysicsServer2D.xml:7 msgid "" -"Physics2DServer is the server responsible for all 2D physics. It can create " +"PhysicsServer2D is the server responsible for all 2D physics. It can create " "many kinds of physics objects, but does not insert them on the node tree." msgstr "" -#: doc/classes/Physics2DServer.xml:24 doc/classes/PhysicsServer.xml:24 +#: doc/classes/PhysicsServer2D.xml:24 doc/classes/PhysicsServer3D.xml:24 msgid "" "Adds a shape to the area, along with a transform matrix. Shapes are usually " "referenced by their index, so you should track which shape has a given index." msgstr "" -#: doc/classes/Physics2DServer.xml:45 doc/classes/Physics2DServer.xml:418 -#: doc/classes/PhysicsServer.xml:35 doc/classes/PhysicsServer.xml:409 +#: doc/classes/PhysicsServer2D.xml:45 doc/classes/PhysicsServer2D.xml:418 +#: doc/classes/PhysicsServer3D.xml:35 doc/classes/PhysicsServer3D.xml:409 msgid "" "Assigns the area to a descendant of [Object], so it can exist in the node " "tree." msgstr "" -#: doc/classes/Physics2DServer.xml:54 doc/classes/PhysicsServer.xml:44 +#: doc/classes/PhysicsServer2D.xml:54 doc/classes/PhysicsServer3D.xml:44 msgid "" "Removes all shapes from an area. It does not delete the shapes, so they can " "be reassigned later." msgstr "" -#: doc/classes/Physics2DServer.xml:61 +#: doc/classes/PhysicsServer2D.xml:61 msgid "Creates an [Area2D]." msgstr "" -#: doc/classes/Physics2DServer.xml:78 doc/classes/Physics2DServer.xml:505 -#: doc/classes/PhysicsServer.xml:60 doc/classes/PhysicsServer.xml:492 +#: doc/classes/PhysicsServer2D.xml:78 doc/classes/PhysicsServer2D.xml:505 +#: doc/classes/PhysicsServer3D.xml:60 doc/classes/PhysicsServer3D.xml:492 msgid "Gets the instance ID of the object the area is assigned to." msgstr "" -#: doc/classes/Physics2DServer.xml:89 +#: doc/classes/PhysicsServer2D.xml:89 msgid "" "Returns an area parameter value. See [enum AreaParameter] for a list of " "available parameters." msgstr "" -#: doc/classes/Physics2DServer.xml:100 doc/classes/PhysicsServer.xml:82 +#: doc/classes/PhysicsServer2D.xml:100 doc/classes/PhysicsServer3D.xml:82 msgid "Returns the [RID] of the nth shape of an area." msgstr "" -#: doc/classes/Physics2DServer.xml:109 doc/classes/PhysicsServer.xml:91 +#: doc/classes/PhysicsServer2D.xml:109 doc/classes/PhysicsServer3D.xml:91 msgid "Returns the number of shapes assigned to an area." msgstr "" -#: doc/classes/Physics2DServer.xml:120 doc/classes/PhysicsServer.xml:102 +#: doc/classes/PhysicsServer2D.xml:120 doc/classes/PhysicsServer3D.xml:102 msgid "Returns the transform matrix of a shape within an area." msgstr "" -#: doc/classes/Physics2DServer.xml:129 doc/classes/PhysicsServer.xml:111 +#: doc/classes/PhysicsServer2D.xml:129 doc/classes/PhysicsServer3D.xml:111 msgid "Returns the space assigned to the area." msgstr "" -#: doc/classes/Physics2DServer.xml:138 doc/classes/PhysicsServer.xml:120 +#: doc/classes/PhysicsServer2D.xml:138 doc/classes/PhysicsServer3D.xml:120 msgid "Returns the space override mode for the area." msgstr "" -#: doc/classes/Physics2DServer.xml:147 doc/classes/PhysicsServer.xml:129 +#: doc/classes/PhysicsServer2D.xml:147 doc/classes/PhysicsServer3D.xml:129 msgid "Returns the transform matrix for an area." msgstr "" -#: doc/classes/Physics2DServer.xml:158 doc/classes/PhysicsServer.xml:149 +#: doc/classes/PhysicsServer2D.xml:158 doc/classes/PhysicsServer3D.xml:149 msgid "" "Removes a shape from an area. It does not delete the shape, so it can be " "reassigned later." msgstr "" -#: doc/classes/Physics2DServer.xml:181 doc/classes/PhysicsServer.xml:172 +#: doc/classes/PhysicsServer2D.xml:181 doc/classes/PhysicsServer3D.xml:172 msgid "Assigns the area to one or many physics layers." msgstr "" -#: doc/classes/Physics2DServer.xml:192 doc/classes/PhysicsServer.xml:183 +#: doc/classes/PhysicsServer2D.xml:192 doc/classes/PhysicsServer3D.xml:183 msgid "Sets which physics layers the area will monitor." msgstr "" -#: doc/classes/Physics2DServer.xml:205 doc/classes/PhysicsServer.xml:196 +#: doc/classes/PhysicsServer2D.xml:205 doc/classes/PhysicsServer3D.xml:196 msgid "" "Sets the function to call when any body/area enters or exits the area. This " "callback will be called for any object interacting with the area, and takes " @@ -35349,45 +35599,45 @@ msgid "" "5: The shape index of the area where the object entered/exited." msgstr "" -#: doc/classes/Physics2DServer.xml:233 +#: doc/classes/PhysicsServer2D.xml:233 msgid "" "Sets the value for an area parameter. See [enum AreaParameter] for a list of " "available parameters." msgstr "" -#: doc/classes/Physics2DServer.xml:246 doc/classes/PhysicsServer.xml:248 +#: doc/classes/PhysicsServer2D.xml:246 doc/classes/PhysicsServer3D.xml:248 msgid "" "Substitutes a given area shape by another. The old shape is selected by its " "index, the new one by its [RID]." msgstr "" -#: doc/classes/Physics2DServer.xml:259 +#: doc/classes/PhysicsServer2D.xml:259 msgid "Disables a given shape in an area." msgstr "" -#: doc/classes/Physics2DServer.xml:272 doc/classes/PhysicsServer.xml:273 +#: doc/classes/PhysicsServer2D.xml:272 doc/classes/PhysicsServer3D.xml:273 msgid "Sets the transform matrix for an area shape." msgstr "" -#: doc/classes/Physics2DServer.xml:283 doc/classes/PhysicsServer.xml:284 +#: doc/classes/PhysicsServer2D.xml:283 doc/classes/PhysicsServer3D.xml:284 msgid "Assigns a space to the area." msgstr "" -#: doc/classes/Physics2DServer.xml:294 +#: doc/classes/PhysicsServer2D.xml:294 msgid "" "Sets the space override mode for the area. See [enum AreaSpaceOverrideMode] " "for a list of available modes." msgstr "" -#: doc/classes/Physics2DServer.xml:305 doc/classes/PhysicsServer.xml:306 +#: doc/classes/PhysicsServer2D.xml:305 doc/classes/PhysicsServer3D.xml:306 msgid "Sets the transform matrix for an area." msgstr "" -#: doc/classes/Physics2DServer.xml:326 doc/classes/PhysicsServer.xml:327 +#: doc/classes/PhysicsServer2D.xml:326 doc/classes/PhysicsServer3D.xml:327 msgid "Adds a body to the list of bodies exempt from collisions." msgstr "" -#: doc/classes/Physics2DServer.xml:339 +#: doc/classes/PhysicsServer2D.xml:339 msgid "" "Adds a positioned force to the applied force and torque. As with [method " "body_apply_impulse], both the force and the offset from the body origin are " @@ -35395,114 +35645,114 @@ msgid "" "two are forces, the impulse clears itself after being applied." msgstr "" -#: doc/classes/Physics2DServer.xml:354 doc/classes/PhysicsServer.xml:354 +#: doc/classes/PhysicsServer2D.xml:354 doc/classes/PhysicsServer3D.xml:354 msgid "" "Adds a shape to the body, along with a transform matrix. Shapes are usually " "referenced by their index, so you should track which shape has a given index." msgstr "" -#: doc/classes/Physics2DServer.xml:387 +#: doc/classes/PhysicsServer2D.xml:387 msgid "" "Adds a positioned impulse to the applied force and torque. Both the force " "and the offset from the body origin are in global coordinates." msgstr "" -#: doc/classes/Physics2DServer.xml:427 doc/classes/PhysicsServer.xml:418 +#: doc/classes/PhysicsServer2D.xml:427 doc/classes/PhysicsServer3D.xml:418 msgid "Removes all shapes from a body." msgstr "" -#: doc/classes/Physics2DServer.xml:434 +#: doc/classes/PhysicsServer2D.xml:434 msgid "Creates a physics body." msgstr "" -#: doc/classes/Physics2DServer.xml:451 doc/classes/PhysicsServer.xml:438 +#: doc/classes/PhysicsServer2D.xml:451 doc/classes/PhysicsServer3D.xml:438 msgid "Returns the physics layer or layers a body belongs to." msgstr "" -#: doc/classes/Physics2DServer.xml:460 +#: doc/classes/PhysicsServer2D.xml:460 msgid "Returns the physics layer or layers a body can collide with." msgstr "" -#: doc/classes/Physics2DServer.xml:469 +#: doc/classes/PhysicsServer2D.xml:469 msgid "Returns the continuous collision detection mode." msgstr "" -#: doc/classes/Physics2DServer.xml:478 -msgid "Returns the [Physics2DDirectBodyState] of the body." +#: doc/classes/PhysicsServer2D.xml:478 +msgid "Returns the [PhysicsDirectBodyState2D] of the body." msgstr "" -#: doc/classes/Physics2DServer.xml:487 doc/classes/PhysicsServer.xml:474 +#: doc/classes/PhysicsServer2D.xml:487 doc/classes/PhysicsServer3D.xml:474 msgid "" "Returns the maximum contacts that can be reported. See [method " "body_set_max_contacts_reported]." msgstr "" -#: doc/classes/Physics2DServer.xml:496 doc/classes/PhysicsServer.xml:483 +#: doc/classes/PhysicsServer2D.xml:496 doc/classes/PhysicsServer3D.xml:483 msgid "Returns the body mode." msgstr "" -#: doc/classes/Physics2DServer.xml:516 +#: doc/classes/PhysicsServer2D.xml:516 msgid "" "Returns the value of a body parameter. See [enum BodyParameter] for a list " "of available parameters." msgstr "" -#: doc/classes/Physics2DServer.xml:527 doc/classes/PhysicsServer.xml:514 +#: doc/classes/PhysicsServer2D.xml:527 doc/classes/PhysicsServer3D.xml:514 msgid "Returns the [RID] of the nth shape of a body." msgstr "" -#: doc/classes/Physics2DServer.xml:536 doc/classes/PhysicsServer.xml:523 +#: doc/classes/PhysicsServer2D.xml:536 doc/classes/PhysicsServer3D.xml:523 msgid "Returns the number of shapes assigned to a body." msgstr "" -#: doc/classes/Physics2DServer.xml:547 +#: doc/classes/PhysicsServer2D.xml:547 msgid "Returns the metadata of a shape of a body." msgstr "" -#: doc/classes/Physics2DServer.xml:558 doc/classes/PhysicsServer.xml:534 +#: doc/classes/PhysicsServer2D.xml:558 doc/classes/PhysicsServer3D.xml:534 msgid "Returns the transform matrix of a body shape." msgstr "" -#: doc/classes/Physics2DServer.xml:567 doc/classes/PhysicsServer.xml:543 +#: doc/classes/PhysicsServer2D.xml:567 doc/classes/PhysicsServer3D.xml:543 msgid "Returns the [RID] of the space assigned to a body." msgstr "" -#: doc/classes/Physics2DServer.xml:578 doc/classes/PhysicsServer.xml:554 +#: doc/classes/PhysicsServer2D.xml:578 doc/classes/PhysicsServer3D.xml:554 msgid "Returns a body state." msgstr "" -#: doc/classes/Physics2DServer.xml:587 doc/classes/PhysicsServer.xml:582 +#: doc/classes/PhysicsServer2D.xml:587 doc/classes/PhysicsServer3D.xml:582 msgid "" "Returns whether a body uses a callback function to calculate its own physics " "(see [method body_set_force_integration_callback])." msgstr "" -#: doc/classes/Physics2DServer.xml:598 +#: doc/classes/PhysicsServer2D.xml:598 msgid "Removes a body from the list of bodies exempt from collisions." msgstr "" -#: doc/classes/Physics2DServer.xml:609 doc/classes/PhysicsServer.xml:614 +#: doc/classes/PhysicsServer2D.xml:609 doc/classes/PhysicsServer3D.xml:614 msgid "" "Removes a shape from a body. The shape is not deleted, so it can be reused " "afterwards." msgstr "" -#: doc/classes/Physics2DServer.xml:620 doc/classes/PhysicsServer.xml:637 -#: doc/classes/RigidBody.xml:119 +#: doc/classes/PhysicsServer2D.xml:620 doc/classes/PhysicsServer3D.xml:637 +#: 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." msgstr "" -#: doc/classes/Physics2DServer.xml:631 doc/classes/PhysicsServer.xml:648 +#: doc/classes/PhysicsServer2D.xml:631 doc/classes/PhysicsServer3D.xml:648 msgid "Sets the physics layer or layers a body belongs to." msgstr "" -#: doc/classes/Physics2DServer.xml:642 doc/classes/PhysicsServer.xml:659 +#: doc/classes/PhysicsServer2D.xml:642 doc/classes/PhysicsServer3D.xml:659 msgid "Sets the physics layer or layers a body can collide with." msgstr "" -#: doc/classes/Physics2DServer.xml:653 +#: doc/classes/PhysicsServer2D.xml:653 msgid "" "Sets the continuous collision detection mode using one of the [enum CCDMode] " "constants.\n" @@ -35510,223 +35760,223 @@ msgid "" "collide, instead of moving it and correcting its movement if it collided." msgstr "" -#: doc/classes/Physics2DServer.xml:669 doc/classes/PhysicsServer.xml:686 +#: doc/classes/PhysicsServer2D.xml:669 doc/classes/PhysicsServer3D.xml:686 msgid "" "Sets the function used to calculate physics for an object, if that object " "allows it (see [method body_set_omit_force_integration])." msgstr "" -#: doc/classes/Physics2DServer.xml:680 doc/classes/PhysicsServer.xml:707 +#: doc/classes/PhysicsServer2D.xml:680 doc/classes/PhysicsServer3D.xml:707 msgid "" "Sets 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/Physics2DServer.xml:691 +#: doc/classes/PhysicsServer2D.xml:691 msgid "Sets the body mode using one of the [enum BodyMode] constants." msgstr "" -#: doc/classes/Physics2DServer.xml:702 doc/classes/PhysicsServer.xml:729 +#: doc/classes/PhysicsServer2D.xml:702 doc/classes/PhysicsServer3D.xml:729 msgid "" "Sets whether a body uses a callback function to calculate its own physics " "(see [method body_set_force_integration_callback])." msgstr "" -#: doc/classes/Physics2DServer.xml:715 +#: doc/classes/PhysicsServer2D.xml:715 msgid "" "Sets a body parameter. See [enum BodyParameter] for a list of available " "parameters." msgstr "" -#: doc/classes/Physics2DServer.xml:728 doc/classes/PhysicsServer.xml:766 +#: doc/classes/PhysicsServer2D.xml:728 doc/classes/PhysicsServer3D.xml:766 msgid "" "Substitutes a given body shape by another. The old shape is selected by its " "index, the new one by its [RID]." msgstr "" -#: doc/classes/Physics2DServer.xml:743 +#: doc/classes/PhysicsServer2D.xml:743 msgid "" "Enables one way collision on body if [code]enable[/code] is [code]true[/" "code]." msgstr "" -#: doc/classes/Physics2DServer.xml:756 +#: doc/classes/PhysicsServer2D.xml:756 msgid "Disables shape in body if [code]disable[/code] is [code]true[/code]." msgstr "" -#: doc/classes/Physics2DServer.xml:769 +#: doc/classes/PhysicsServer2D.xml:769 msgid "" "Sets metadata of a shape within a body. This metadata is different from " "[method Object.set_meta], and can be retrieved on shape queries." msgstr "" -#: doc/classes/Physics2DServer.xml:782 doc/classes/PhysicsServer.xml:791 +#: doc/classes/PhysicsServer2D.xml:782 doc/classes/PhysicsServer3D.xml:791 msgid "Sets the transform matrix for a body shape." msgstr "" -#: doc/classes/Physics2DServer.xml:793 doc/classes/PhysicsServer.xml:802 +#: doc/classes/PhysicsServer2D.xml:793 doc/classes/PhysicsServer3D.xml:802 msgid "Assigns a space to the body (see [method space_create])." msgstr "" -#: doc/classes/Physics2DServer.xml:806 +#: doc/classes/PhysicsServer2D.xml:806 msgid "Sets a body state using one of the [enum BodyState] constants." msgstr "" -#: doc/classes/Physics2DServer.xml:825 +#: doc/classes/PhysicsServer2D.xml:825 msgid "" "Returns [code]true[/code] if a collision would result from moving in the " "given direction from a given point in space. Margin increases the size of " -"the shapes involved in the collision detection. [Physics2DTestMotionResult] " +"the shapes involved in the collision detection. [PhysicsTestMotionResult2D] " "can be passed to return additional information in." msgstr "" -#: doc/classes/Physics2DServer.xml:864 +#: doc/classes/PhysicsServer2D.xml:864 msgid "" "Creates a damped spring joint between two bodies. If not specified, the " "second body is assumed to be the joint itself." msgstr "" -#: doc/classes/Physics2DServer.xml:875 +#: doc/classes/PhysicsServer2D.xml:875 msgid "Returns the value of a damped spring joint parameter." msgstr "" -#: doc/classes/Physics2DServer.xml:888 +#: doc/classes/PhysicsServer2D.xml:888 msgid "" "Sets a damped spring joint parameter. See [enum DampedStringParam] for a " "list of available parameters." msgstr "" -#: doc/classes/Physics2DServer.xml:897 +#: doc/classes/PhysicsServer2D.xml:897 msgid "" -"Destroys any of the objects created by Physics2DServer. If the [RID] passed " -"is not one of the objects that can be created by Physics2DServer, an error " +"Destroys any of the objects created by PhysicsServer2D. If the [RID] passed " +"is not one of the objects that can be created by PhysicsServer2D, an error " "will be sent to the console." msgstr "" -#: doc/classes/Physics2DServer.xml:906 +#: doc/classes/PhysicsServer2D.xml:906 msgid "" "Returns information about the current state of the 2D physics engine. See " "[enum ProcessInfo] for a list of available states." msgstr "" -#: doc/classes/Physics2DServer.xml:923 +#: doc/classes/PhysicsServer2D.xml:923 msgid "" "Creates a groove joint between two bodies. If not specified, the bodies are " "assumed to be the joint itself." msgstr "" -#: doc/classes/Physics2DServer.xml:934 +#: doc/classes/PhysicsServer2D.xml:934 msgid "Returns the value of a joint parameter." msgstr "" -#: doc/classes/Physics2DServer.xml:943 +#: doc/classes/PhysicsServer2D.xml:943 msgid "Returns a joint's type (see [enum JointType])." msgstr "" -#: doc/classes/Physics2DServer.xml:956 +#: doc/classes/PhysicsServer2D.xml:956 msgid "" "Sets a joint parameter. See [enum JointParam] for a list of available " "parameters." msgstr "" -#: doc/classes/Physics2DServer.xml:975 +#: doc/classes/PhysicsServer2D.xml:975 msgid "" "Creates a pin joint between two bodies. If not specified, the second body is " "assumed to be the joint itself." msgstr "" -#: doc/classes/Physics2DServer.xml:1002 +#: doc/classes/PhysicsServer2D.xml:1002 msgid "Activates or deactivates the 2D physics engine." msgstr "" -#: doc/classes/Physics2DServer.xml:1011 doc/classes/PhysicsServer.xml:1156 +#: doc/classes/PhysicsServer2D.xml:1011 doc/classes/PhysicsServer3D.xml:1156 msgid "Returns the shape data." msgstr "" -#: doc/classes/Physics2DServer.xml:1020 +#: doc/classes/PhysicsServer2D.xml:1020 msgid "Returns a shape's type (see [enum ShapeType])." msgstr "" -#: doc/classes/Physics2DServer.xml:1031 doc/classes/PhysicsServer.xml:1176 +#: doc/classes/PhysicsServer2D.xml:1031 doc/classes/PhysicsServer3D.xml:1176 msgid "" "Sets the shape data that defines its shape and size. The data to be passed " "depends on the kind of shape created [method shape_get_type]." msgstr "" -#: doc/classes/Physics2DServer.xml:1038 doc/classes/PhysicsServer.xml:1207 +#: doc/classes/PhysicsServer2D.xml:1038 doc/classes/PhysicsServer3D.xml:1207 msgid "" "Creates a space. A space is a collection of parameters for the physics " "engine that can be assigned to an area or a body. It can be assigned to an " "area with [method area_set_space], or to a body with [method body_set_space]." msgstr "" -#: doc/classes/Physics2DServer.xml:1047 +#: doc/classes/PhysicsServer2D.xml:1047 msgid "" -"Returns the state of a space, a [Physics2DDirectSpaceState]. This object can " +"Returns the state of a space, a [PhysicsDirectSpaceState2D]. This object can " "be used to make collision/intersection queries." msgstr "" -#: doc/classes/Physics2DServer.xml:1058 doc/classes/PhysicsServer.xml:1227 +#: doc/classes/PhysicsServer2D.xml:1058 doc/classes/PhysicsServer3D.xml:1227 msgid "Returns the value of a space parameter." msgstr "" -#: doc/classes/Physics2DServer.xml:1067 doc/classes/PhysicsServer.xml:1236 +#: doc/classes/PhysicsServer2D.xml:1067 doc/classes/PhysicsServer3D.xml:1236 msgid "Returns whether the space is active." msgstr "" -#: doc/classes/Physics2DServer.xml:1078 doc/classes/PhysicsServer.xml:1247 +#: doc/classes/PhysicsServer2D.xml:1078 doc/classes/PhysicsServer3D.xml:1247 msgid "" "Marks a space as active. It will not have an effect, unless it is assigned " "to an area or body." msgstr "" -#: doc/classes/Physics2DServer.xml:1091 +#: doc/classes/PhysicsServer2D.xml:1091 msgid "" "Sets the value for a space parameter. See [enum SpaceParameter] for a list " "of available parameters." msgstr "" -#: doc/classes/Physics2DServer.xml:1097 doc/classes/PhysicsServer.xml:1602 +#: doc/classes/PhysicsServer2D.xml:1097 doc/classes/PhysicsServer3D.xml:1602 msgid "" "Constant to set/get the maximum distance a pair of bodies has to move before " "their collision status has to be recalculated." msgstr "" -#: doc/classes/Physics2DServer.xml:1100 doc/classes/PhysicsServer.xml:1605 +#: doc/classes/PhysicsServer2D.xml:1100 doc/classes/PhysicsServer3D.xml:1605 msgid "" "Constant to set/get the maximum distance a shape can be from another before " "they are considered separated." msgstr "" -#: doc/classes/Physics2DServer.xml:1103 doc/classes/PhysicsServer.xml:1608 +#: doc/classes/PhysicsServer2D.xml:1103 doc/classes/PhysicsServer3D.xml:1608 msgid "" "Constant to set/get the maximum distance a shape can penetrate another shape " "before it is considered a collision." msgstr "" -#: doc/classes/Physics2DServer.xml:1106 doc/classes/PhysicsServer.xml:1611 +#: doc/classes/PhysicsServer2D.xml:1106 doc/classes/PhysicsServer3D.xml:1611 msgid "" "Constant to set/get the threshold linear velocity of activity. A body marked " "as potentially inactive for both linear and angular velocity will be put to " "sleep after the time given." msgstr "" -#: doc/classes/Physics2DServer.xml:1109 doc/classes/PhysicsServer.xml:1614 +#: doc/classes/PhysicsServer2D.xml:1109 doc/classes/PhysicsServer3D.xml:1614 msgid "" "Constant to set/get the threshold angular velocity of activity. A body " "marked as potentially inactive for both linear and angular velocity will be " "put to sleep after the time given." msgstr "" -#: doc/classes/Physics2DServer.xml:1112 doc/classes/PhysicsServer.xml:1617 +#: doc/classes/PhysicsServer2D.xml:1112 doc/classes/PhysicsServer3D.xml:1617 msgid "" "Constant to set/get the maximum time of activity. A body marked as " "potentially inactive for both linear and angular velocity will be put to " "sleep after this time." msgstr "" -#: doc/classes/Physics2DServer.xml:1115 doc/classes/PhysicsServer.xml:1622 +#: doc/classes/PhysicsServer2D.xml:1115 doc/classes/PhysicsServer3D.xml:1622 msgid "" "Constant to set/get the default solver bias for all physics constraints. A " "solver bias is a factor controlling how much two objects \"rebound\", after " @@ -35734,40 +35984,40 @@ msgid "" "numerical imprecision." msgstr "" -#: doc/classes/Physics2DServer.xml:1120 +#: doc/classes/PhysicsServer2D.xml:1120 msgid "" "This is the constant for creating line shapes. A line shape is an infinite " "line with an origin point, and a normal. Thus, it can be used for front/" "behind checks." msgstr "" -#: doc/classes/Physics2DServer.xml:1125 +#: doc/classes/PhysicsServer2D.xml:1125 msgid "" "This is the constant for creating segment shapes. A segment shape is a line " "from a point A to a point B. It can be checked for intersections." msgstr "" -#: doc/classes/Physics2DServer.xml:1128 +#: doc/classes/PhysicsServer2D.xml:1128 msgid "" "This is the constant for creating circle shapes. A circle shape only has a " "radius. It can be used for intersections and inside/outside checks." msgstr "" -#: doc/classes/Physics2DServer.xml:1131 +#: doc/classes/PhysicsServer2D.xml:1131 msgid "" "This is the constant for creating rectangle shapes. A rectangle shape is " "defined by a width and a height. It can be used for intersections and inside/" "outside checks." msgstr "" -#: doc/classes/Physics2DServer.xml:1134 +#: doc/classes/PhysicsServer2D.xml:1134 msgid "" "This is the constant for creating capsule shapes. A capsule shape is defined " "by a radius and a length. It can be used for intersections and inside/" "outside checks." msgstr "" -#: doc/classes/Physics2DServer.xml:1137 +#: doc/classes/PhysicsServer2D.xml:1137 msgid "" "This is the constant for creating convex polygon shapes. A polygon is " "defined by a list of points. It can be used for intersections and inside/" @@ -35776,1177 +36026,914 @@ msgid "" "supplied form is a convex polygon." msgstr "" -#: doc/classes/Physics2DServer.xml:1140 +#: doc/classes/PhysicsServer2D.xml:1140 msgid "" "This is the constant for creating concave polygon shapes. A polygon is " "defined by a list of points. It can be used for intersections checks, but " "not for inside/outside checks." msgstr "" -#: doc/classes/Physics2DServer.xml:1143 doc/classes/PhysicsServer.xml:1497 +#: doc/classes/PhysicsServer2D.xml:1143 doc/classes/PhysicsServer3D.xml:1497 msgid "" "This constant is used internally by the engine. Any attempt to create this " "kind of shape results in an error." msgstr "" -#: doc/classes/Physics2DServer.xml:1146 doc/classes/PhysicsServer.xml:1500 +#: doc/classes/PhysicsServer2D.xml:1146 doc/classes/PhysicsServer3D.xml:1500 msgid "Constant to set/get gravity strength in an area." msgstr "" -#: doc/classes/Physics2DServer.xml:1149 doc/classes/PhysicsServer.xml:1503 +#: doc/classes/PhysicsServer2D.xml:1149 doc/classes/PhysicsServer3D.xml:1503 msgid "Constant to set/get gravity vector/center in an area." msgstr "" -#: doc/classes/Physics2DServer.xml:1152 doc/classes/PhysicsServer.xml:1506 +#: doc/classes/PhysicsServer2D.xml:1152 doc/classes/PhysicsServer3D.xml:1506 msgid "" "Constant to set/get whether the gravity vector of an area is a direction, or " "a center point." msgstr "" -#: doc/classes/Physics2DServer.xml:1155 doc/classes/PhysicsServer.xml:1509 +#: doc/classes/PhysicsServer2D.xml:1155 doc/classes/PhysicsServer3D.xml:1509 msgid "" "Constant to set/get the falloff factor for point gravity of an area. The " "greater this value is, the faster the strength of gravity decreases with the " "square of distance." msgstr "" -#: doc/classes/Physics2DServer.xml:1158 doc/classes/PhysicsServer.xml:1512 +#: doc/classes/PhysicsServer2D.xml:1158 doc/classes/PhysicsServer3D.xml:1512 msgid "" "This constant was used to set/get the falloff factor for point gravity. It " "has been superseded by [constant AREA_PARAM_GRAVITY_DISTANCE_SCALE]." msgstr "" -#: doc/classes/Physics2DServer.xml:1161 doc/classes/PhysicsServer.xml:1515 +#: doc/classes/PhysicsServer2D.xml:1161 doc/classes/PhysicsServer3D.xml:1515 msgid "Constant to set/get the linear dampening factor of an area." msgstr "" -#: doc/classes/Physics2DServer.xml:1164 doc/classes/PhysicsServer.xml:1518 +#: doc/classes/PhysicsServer2D.xml:1164 doc/classes/PhysicsServer3D.xml:1518 msgid "Constant to set/get the angular dampening factor of an area." msgstr "" -#: doc/classes/Physics2DServer.xml:1167 doc/classes/PhysicsServer.xml:1521 +#: doc/classes/PhysicsServer2D.xml:1167 doc/classes/PhysicsServer3D.xml:1521 msgid "Constant to set/get the priority (order of processing) of an area." msgstr "" -#: doc/classes/Physics2DServer.xml:1170 doc/classes/PhysicsServer.xml:1524 +#: doc/classes/PhysicsServer2D.xml:1170 doc/classes/PhysicsServer3D.xml:1524 msgid "" "This area does not affect gravity/damp. These are generally areas that exist " "only to detect collisions, and objects entering or exiting them." msgstr "" -#: doc/classes/Physics2DServer.xml:1173 doc/classes/PhysicsServer.xml:1527 +#: doc/classes/PhysicsServer2D.xml:1173 doc/classes/PhysicsServer3D.xml:1527 msgid "" "This area adds its gravity/damp values to whatever has been calculated so " "far. This way, many overlapping areas can combine their physics to make " "interesting effects." msgstr "" -#: doc/classes/Physics2DServer.xml:1176 doc/classes/PhysicsServer.xml:1530 +#: doc/classes/PhysicsServer2D.xml:1176 doc/classes/PhysicsServer3D.xml:1530 msgid "" "This area adds its gravity/damp values to whatever has been calculated so " "far. Then stops taking into account the rest of the areas, even the default " "one." msgstr "" -#: doc/classes/Physics2DServer.xml:1179 doc/classes/PhysicsServer.xml:1533 +#: doc/classes/PhysicsServer2D.xml:1179 doc/classes/PhysicsServer3D.xml:1533 msgid "" "This area replaces any gravity/damp, even the default one, and stops taking " "into account the rest of the areas." msgstr "" -#: doc/classes/Physics2DServer.xml:1182 doc/classes/PhysicsServer.xml:1536 +#: doc/classes/PhysicsServer2D.xml:1182 doc/classes/PhysicsServer3D.xml:1536 msgid "" "This area replaces any gravity/damp calculated so far, but keeps calculating " "the rest of the areas, down to the default one." msgstr "" -#: doc/classes/Physics2DServer.xml:1185 doc/classes/PhysicsServer.xml:1539 +#: doc/classes/PhysicsServer2D.xml:1185 doc/classes/PhysicsServer3D.xml:1539 msgid "Constant for static bodies." msgstr "" -#: doc/classes/Physics2DServer.xml:1188 doc/classes/PhysicsServer.xml:1542 +#: doc/classes/PhysicsServer2D.xml:1188 doc/classes/PhysicsServer3D.xml:1542 msgid "Constant for kinematic bodies." msgstr "" -#: doc/classes/Physics2DServer.xml:1191 doc/classes/PhysicsServer.xml:1545 +#: doc/classes/PhysicsServer2D.xml:1191 doc/classes/PhysicsServer3D.xml:1545 msgid "Constant for rigid bodies." msgstr "" -#: doc/classes/Physics2DServer.xml:1194 doc/classes/PhysicsServer.xml:1548 +#: doc/classes/PhysicsServer2D.xml:1194 doc/classes/PhysicsServer3D.xml:1548 msgid "" "Constant for rigid bodies in character mode. In this mode, a body can not " "rotate, and only its linear velocity is affected by physics." msgstr "" -#: doc/classes/Physics2DServer.xml:1197 doc/classes/PhysicsServer.xml:1551 +#: doc/classes/PhysicsServer2D.xml:1197 doc/classes/PhysicsServer3D.xml:1551 msgid "Constant to set/get a body's bounce factor." msgstr "" -#: doc/classes/Physics2DServer.xml:1200 doc/classes/PhysicsServer.xml:1554 +#: doc/classes/PhysicsServer2D.xml:1200 doc/classes/PhysicsServer3D.xml:1554 msgid "Constant to set/get a body's friction." msgstr "" -#: doc/classes/Physics2DServer.xml:1203 doc/classes/PhysicsServer.xml:1557 +#: doc/classes/PhysicsServer2D.xml:1203 doc/classes/PhysicsServer3D.xml:1557 msgid "Constant to set/get a body's mass." msgstr "" -#: doc/classes/Physics2DServer.xml:1206 +#: doc/classes/PhysicsServer2D.xml:1206 msgid "Constant to set/get a body's inertia." msgstr "" -#: doc/classes/Physics2DServer.xml:1209 doc/classes/PhysicsServer.xml:1560 +#: doc/classes/PhysicsServer2D.xml:1209 doc/classes/PhysicsServer3D.xml:1560 msgid "Constant to set/get a body's gravity multiplier." msgstr "" -#: doc/classes/Physics2DServer.xml:1212 doc/classes/PhysicsServer.xml:1563 +#: doc/classes/PhysicsServer2D.xml:1212 doc/classes/PhysicsServer3D.xml:1563 msgid "Constant to set/get a body's linear dampening factor." msgstr "" -#: doc/classes/Physics2DServer.xml:1215 doc/classes/PhysicsServer.xml:1566 +#: doc/classes/PhysicsServer2D.xml:1215 doc/classes/PhysicsServer3D.xml:1566 msgid "Constant to set/get a body's angular dampening factor." msgstr "" -#: doc/classes/Physics2DServer.xml:1218 doc/classes/PhysicsServer.xml:1569 +#: doc/classes/PhysicsServer2D.xml:1218 doc/classes/PhysicsServer3D.xml:1569 msgid "Represents the size of the [enum BodyParameter] enum." msgstr "" -#: doc/classes/Physics2DServer.xml:1221 doc/classes/PhysicsServer.xml:1572 +#: doc/classes/PhysicsServer2D.xml:1221 doc/classes/PhysicsServer3D.xml:1572 msgid "Constant to set/get the current transform matrix of the body." msgstr "" -#: doc/classes/Physics2DServer.xml:1224 doc/classes/PhysicsServer.xml:1575 +#: doc/classes/PhysicsServer2D.xml:1224 doc/classes/PhysicsServer3D.xml:1575 msgid "Constant to set/get the current linear velocity of the body." msgstr "" -#: doc/classes/Physics2DServer.xml:1227 doc/classes/PhysicsServer.xml:1578 +#: doc/classes/PhysicsServer2D.xml:1227 doc/classes/PhysicsServer3D.xml:1578 msgid "Constant to set/get the current angular velocity of the body." msgstr "" -#: doc/classes/Physics2DServer.xml:1230 doc/classes/PhysicsServer.xml:1581 +#: doc/classes/PhysicsServer2D.xml:1230 doc/classes/PhysicsServer3D.xml:1581 msgid "Constant to sleep/wake up a body, or to get whether it is sleeping." msgstr "" -#: doc/classes/Physics2DServer.xml:1233 doc/classes/PhysicsServer.xml:1584 +#: doc/classes/PhysicsServer2D.xml:1233 doc/classes/PhysicsServer3D.xml:1584 msgid "Constant to set/get whether the body can sleep." msgstr "" -#: doc/classes/Physics2DServer.xml:1236 +#: doc/classes/PhysicsServer2D.xml:1236 msgid "Constant to create pin joints." msgstr "" -#: doc/classes/Physics2DServer.xml:1239 +#: doc/classes/PhysicsServer2D.xml:1239 msgid "Constant to create groove joints." msgstr "" -#: doc/classes/Physics2DServer.xml:1242 +#: doc/classes/PhysicsServer2D.xml:1242 msgid "Constant to create damped spring joints." msgstr "" -#: doc/classes/Physics2DServer.xml:1251 +#: doc/classes/PhysicsServer2D.xml:1251 msgid "" "Sets the resting length of the spring joint. The joint will always try to go " "to back this length when pulled apart." msgstr "" -#: doc/classes/Physics2DServer.xml:1254 +#: doc/classes/PhysicsServer2D.xml:1254 msgid "" "Sets the stiffness of the spring joint. The joint applies a force equal to " "the stiffness times the distance from its resting length." msgstr "" -#: doc/classes/Physics2DServer.xml:1257 +#: doc/classes/PhysicsServer2D.xml:1257 msgid "" "Sets the damping ratio of the spring joint. A value of 0 indicates an " "undamped spring, while 1 causes the system to reach equilibrium as fast as " "possible (critical damping)." msgstr "" -#: doc/classes/Physics2DServer.xml:1260 +#: doc/classes/PhysicsServer2D.xml:1260 msgid "" "Disables continuous collision detection. This is the fastest way to detect " "body collisions, but can miss small, fast-moving objects." msgstr "" -#: doc/classes/Physics2DServer.xml:1263 +#: doc/classes/PhysicsServer2D.xml:1263 msgid "" "Enables continuous collision detection by raycasting. It is faster than " "shapecasting, but less precise." msgstr "" -#: doc/classes/Physics2DServer.xml:1266 +#: doc/classes/PhysicsServer2D.xml:1266 msgid "" "Enables continuous collision detection by shapecasting. It is the slowest " "CCD method, and the most precise." msgstr "" -#: doc/classes/Physics2DServer.xml:1269 doc/classes/PhysicsServer.xml:1587 +#: doc/classes/PhysicsServer2D.xml:1269 doc/classes/PhysicsServer3D.xml:1587 msgid "" "The value of the first parameter and area callback function receives, when " "an object enters one of its shapes." msgstr "" -#: doc/classes/Physics2DServer.xml:1272 doc/classes/PhysicsServer.xml:1590 +#: doc/classes/PhysicsServer2D.xml:1272 doc/classes/PhysicsServer3D.xml:1590 msgid "" "The value of the first parameter and area callback function receives, when " "an object exits one of its shapes." msgstr "" -#: doc/classes/Physics2DServer.xml:1275 doc/classes/PhysicsServer.xml:1593 +#: doc/classes/PhysicsServer2D.xml:1275 doc/classes/PhysicsServer3D.xml:1593 msgid "Constant to get the number of objects that are not sleeping." msgstr "" -#: doc/classes/Physics2DServer.xml:1278 doc/classes/PhysicsServer.xml:1596 +#: doc/classes/PhysicsServer2D.xml:1278 doc/classes/PhysicsServer3D.xml:1596 msgid "Constant to get the number of possible collisions." msgstr "" -#: doc/classes/Physics2DServer.xml:1281 doc/classes/PhysicsServer.xml:1599 +#: doc/classes/PhysicsServer2D.xml:1281 doc/classes/PhysicsServer3D.xml:1599 msgid "" "Constant to get the number of space regions where a collision could occur." msgstr "" -#: doc/classes/Physics2DServerSW.xml:4 -msgid "Software implementation of [Physics2DServer]." -msgstr "" - -#: doc/classes/Physics2DServerSW.xml:7 -msgid "" -"This class exposes no new methods or properties and should not be used, as " -"[Physics2DServer] automatically selects the best implementation available." -msgstr "" - -#: doc/classes/Physics2DShapeQueryParameters.xml:4 -msgid "Parameters to be sent to a 2D shape physics query." -msgstr "" - -#: doc/classes/Physics2DShapeQueryParameters.xml:7 -msgid "" -"This class contains the shape and other parameters for 2D intersection/" -"collision queries. See also [Physics2DShapeQueryResult]." -msgstr "" - -#: doc/classes/Physics2DShapeQueryParameters.xml:18 -msgid "" -"Sets the [Shape2D] that will be used for collision/intersection queries." -msgstr "" - -#: doc/classes/Physics2DShapeQueryParameters.xml:24 -msgid "If [code]true[/code], the query will take [Area2D]s into account." -msgstr "" - -#: doc/classes/Physics2DShapeQueryParameters.xml:27 -msgid "" -"If [code]true[/code], the query will take [PhysicsBody2D]s into account." -msgstr "" - -#: doc/classes/Physics2DShapeQueryParameters.xml:30 -#: doc/classes/PhysicsShapeQueryParameters.xml:30 -msgid "The physics layer(s) the query will take into account (as a bitmask)." -msgstr "" - -#: doc/classes/Physics2DShapeQueryParameters.xml:33 -#: doc/classes/PhysicsShapeQueryParameters.xml:33 -msgid "" -"The list of objects or object [RID]s that will be excluded from collisions." -msgstr "" - -#: doc/classes/Physics2DShapeQueryParameters.xml:36 -#: doc/classes/PhysicsShapeQueryParameters.xml:36 doc/classes/Shape.xml:16 -msgid "The collision margin for the shape." -msgstr "" - -#: doc/classes/Physics2DShapeQueryParameters.xml:39 -msgid "The motion of the shape being queried for." -msgstr "" - -#: doc/classes/Physics2DShapeQueryParameters.xml:42 -#: doc/classes/PhysicsShapeQueryParameters.xml:39 -msgid "The queried shape's [RID]. See also [method set_shape]." -msgstr "" - -#: doc/classes/Physics2DShapeQueryParameters.xml:45 -#: doc/classes/PhysicsShapeQueryParameters.xml:42 -msgid "The queried shape's transform matrix." -msgstr "" - -#: doc/classes/Physics2DShapeQueryResult.xml:4 -msgid "Result of a 2D shape query in [Physics2DServer]." -msgstr "" - -#: doc/classes/Physics2DShapeQueryResult.xml:7 -msgid "" -"The result of a 2D shape query in [Physics2DServer]. See also " -"[Physics2DShapeQueryParameters]." -msgstr "" - -#: doc/classes/Physics2DShapeQueryResult.xml:16 -#: doc/classes/PhysicsShapeQueryResult.xml:16 -msgid "Returns the number of objects that intersected with the shape." -msgstr "" - -#: doc/classes/Physics2DShapeQueryResult.xml:25 -#: doc/classes/PhysicsShapeQueryResult.xml:25 -msgid "" -"Returns the [Object] that intersected with the shape at index [code]idx[/" -"code]." -msgstr "" - -#: doc/classes/Physics2DShapeQueryResult.xml:34 -#: doc/classes/PhysicsShapeQueryResult.xml:34 -msgid "" -"Returns the instance ID of the [Object] that intersected with the shape at " -"index [code]idx[/code]." -msgstr "" - -#: doc/classes/Physics2DShapeQueryResult.xml:43 -#: doc/classes/PhysicsShapeQueryResult.xml:43 -msgid "" -"Returns the child index of the object's [Shape] that intersected with the " -"shape at index [code]idx[/code]." -msgstr "" - -#: doc/classes/Physics2DShapeQueryResult.xml:52 -#: doc/classes/PhysicsShapeQueryResult.xml:52 -msgid "" -"Returns the [RID] of the object that intersected with the shape at index " -"[code]idx[/code]." -msgstr "" - -#: doc/classes/PhysicsBody.xml:4 -msgid "Base class for all objects affected by physics in 3D space." -msgstr "" - -#: doc/classes/PhysicsBody.xml:7 -msgid "" -"PhysicsBody is an abstract base class for implementing a physics body. All " -"*Body types inherit from it." -msgstr "" - -#: doc/classes/PhysicsBody.xml:19 doc/classes/PhysicsBody2D.xml:19 -#: doc/classes/SoftBody.xml:19 -msgid "Adds a body to the list of bodies that this body can't collide with." -msgstr "" - -#: doc/classes/PhysicsBody.xml:26 doc/classes/PhysicsBody2D.xml:26 -#: doc/classes/SoftBody.xml:26 -msgid "" -"Returns an array of nodes that were added as collision exceptions for this " -"body." -msgstr "" - -#: doc/classes/PhysicsBody.xml:53 doc/classes/PhysicsBody2D.xml:53 -#: doc/classes/SoftBody.xml:53 -msgid "" -"Removes a body from the list of bodies that this body can't collide with." -msgstr "" - -#: doc/classes/PhysicsBody.xml:64 doc/classes/PhysicsBody2D.xml:64 -msgid "" -"Sets individual bits on the [member collision_layer] bitmask. Use this if " -"you only need to change one layer's value." -msgstr "" - -#: doc/classes/PhysicsBody.xml:75 doc/classes/PhysicsBody2D.xml:75 -msgid "" -"Sets individual bits on the [member collision_mask] bitmask. Use this if you " -"only need to change one layer's value." -msgstr "" - -#: doc/classes/PhysicsBody.xml:81 doc/classes/PhysicsBody2D.xml:81 -msgid "" -"The physics layers this area is in.\n" -"Collidable objects can exist in any of 32 different layers. These layers " -"work like a tagging system, and are not visual. A collidable can use these " -"layers to select with which objects it can collide, using the [member " -"collision_mask] property.\n" -"A contact is detected if object A is in any of the layers that object B " -"scans, or object B is in any layer scanned by object A." -msgstr "" - -#: doc/classes/PhysicsBody.xml:86 doc/classes/PhysicsBody2D.xml:86 -msgid "The physics layers this area scans for collisions." -msgstr "" - -#: doc/classes/PhysicsBody2D.xml:4 -msgid "Base class for all objects affected by physics in 2D space." -msgstr "" - -#: doc/classes/PhysicsBody2D.xml:7 -msgid "" -"PhysicsBody2D is an abstract base class for implementing a physics body. All " -"*Body2D types inherit from it." -msgstr "" - -#: doc/classes/PhysicsBody2D.xml:90 -msgid "" -"Both [member collision_layer] and [member collision_mask]. Returns [member " -"collision_layer] when accessed. Updates [member collision_layer] and [member " -"collision_mask] when modified." -msgstr "" - -#: doc/classes/PhysicsDirectBodyState.xml:4 -msgid "Direct access object to a physics body in the [PhysicsServer]." -msgstr "" - -#: doc/classes/PhysicsDirectBodyState.xml:7 -msgid "" -"Provides direct access to a physics body in the [PhysicsServer], allowing " -"safe changes to physics properties. This object is passed via the direct " -"state callback of rigid/character bodies, and is intended for changing the " -"direct state of that body. See [method RigidBody._integrate_forces]." -msgstr "" - -#: doc/classes/PhysicsDirectBodyState.xml:18 doc/classes/RigidBody.xml:31 -msgid "" -"Adds a constant directional force without affecting rotation.\n" -"This is equivalent to [code]add_force(force, Vector3(0,0,0))[/code]." -msgstr "" - -#: doc/classes/PhysicsDirectBodyState.xml:39 -msgid "Adds a constant rotational force without affecting position." -msgstr "" - -#: doc/classes/PhysicsDirectBodyState.xml:48 -msgid "" -"Applies a single directional impulse without affecting rotation.\n" -"This is equivalent to [code]apply_impulse(Vector3(0, 0, 0), impulse)[/code]." -msgstr "" - -#: doc/classes/PhysicsDirectBodyState.xml:60 -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. " -"For this reason it should only be used when simulating one-time impacts. The " -"position uses the rotation of the global coordinate system, but is centered " -"at the object's origin." -msgstr "" - -#: doc/classes/PhysicsDirectBodyState.xml:69 -msgid "" -"Apply a torque impulse (which will be affected by the body mass and shape). " -"This will rotate the body around the vector [code]j[/code] passed as " -"parameter." -msgstr "" - -#: doc/classes/PhysicsDirectBodyState.xml:96 -msgid "Returns the collider object." -msgstr "" - -#: doc/classes/PhysicsDirectBodyState.xml:130 -msgid "" -"Returns the number of contacts this body has with other bodies.\n" -"[b]Note:[/b] By default, this returns 0 unless bodies are configured to " -"monitor contacts. See [member RigidBody.contact_monitor]." -msgstr "" - -#: doc/classes/PhysicsDirectBodyState.xml:140 -msgid "Impulse created by the contact. Only implemented for Bullet physics." -msgstr "" - -#: doc/classes/PhysicsDirectSpaceState.xml:4 -msgid "Direct access object to a space in the [PhysicsServer]." -msgstr "" - -#: doc/classes/PhysicsDirectSpaceState.xml:7 -msgid "" -"Direct access object to a space in the [PhysicsServer]. It's used mainly to " -"do queries against objects and areas residing in a given space." -msgstr "" - -#: doc/classes/PhysicsDirectSpaceState.xml:21 -msgid "" -"Checks whether the shape can travel to a point. The method will return an " -"array with two floats between 0 and 1, both representing a fraction of " -"[code]motion[/code]. The first is how far the shape can move without " -"triggering a collision, and the second is the point at which a collision " -"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." -msgstr "" - -#: doc/classes/PhysicsDirectSpaceState.xml:33 -msgid "" -"Checks the intersections of a shape, given through a " -"[PhysicsShapeQueryParameters] object, against the space. The resulting array " -"contains a list of points where the shape intersects another. Like with " -"[method intersect_shape], the number of returned results can be limited to " -"save processing time." -msgstr "" - -#: doc/classes/PhysicsDirectSpaceState.xml:42 -msgid "" -"Checks the intersections of a shape, given through a " -"[PhysicsShapeQueryParameters] object, against the space. If it collides with " -"more than one shape, the nearest one is selected. The returned object is a " -"dictionary containing the following fields:\n" -"[code]collider_id[/code]: The colliding object's ID.\n" -"[code]linear_velocity[/code]: The colliding object's velocity [Vector3]. If " -"the object is an [Area], the result is [code](0, 0, 0)[/code].\n" -"[code]normal[/code]: The object's surface normal at the intersection point.\n" -"[code]point[/code]: The intersection point.\n" -"[code]rid[/code]: The intersecting object's [RID].\n" -"[code]shape[/code]: The shape index of the colliding shape.\n" -"If the shape did not intersect anything, then an empty dictionary is " -"returned instead." -msgstr "" - -#: doc/classes/PhysicsDirectSpaceState.xml:68 -msgid "" -"Intersects a ray in a given space. The returned object is a dictionary with " -"the following fields:\n" -"[code]collider[/code]: The colliding object.\n" -"[code]collider_id[/code]: The colliding object's ID.\n" -"[code]normal[/code]: The object's surface normal at the intersection point.\n" -"[code]position[/code]: The intersection point.\n" -"[code]rid[/code]: The intersecting object's [RID].\n" -"[code]shape[/code]: The shape index of the colliding shape.\n" -"If the ray did not intersect anything, then an empty dictionary is returned " -"instead.\n" -"Additionally, the method can take an [code]exclude[/code] array of objects " -"or [RID]s that are to be excluded from collisions, a [code]collision_mask[/" -"code] bitmask representing the physics layers to check in, or booleans to " -"determine if the ray should collide with [PhysicsBody]s or [Area]s, " -"respectively." -msgstr "" - -#: doc/classes/PhysicsDirectSpaceState.xml:87 -msgid "" -"Checks the intersections of a shape, given through a " -"[PhysicsShapeQueryParameters] object, against the space. The intersected " -"shapes are returned in an array containing dictionaries with the following " -"fields:\n" -"[code]collider[/code]: The colliding object.\n" -"[code]collider_id[/code]: The colliding object's ID.\n" -"[code]rid[/code]: The intersecting object's [RID].\n" -"[code]shape[/code]: The shape index of the colliding shape.\n" -"The number of intersections can be limited with the [code]max_results[/code] " -"parameter, to reduce the processing time." -msgstr "" - -#: doc/classes/PhysicsMaterial.xml:4 -msgid "A material for physics properties." -msgstr "" - -#: doc/classes/PhysicsMaterial.xml:7 -msgid "" -"Provides a means of modifying the collision properties of a [PhysicsBody]." -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 " -"[code]1[/code] (maximum friction)." -msgstr "" - -#: doc/classes/PhysicsServer.xml:4 +#: doc/classes/PhysicsServer3D.xml:4 msgid "Server interface for low-level physics access." msgstr "" -#: doc/classes/PhysicsServer.xml:7 +#: doc/classes/PhysicsServer3D.xml:7 msgid "" -"PhysicsServer is the server responsible for all 3D physics. It can create " +"PhysicsServer3D is the server responsible for all 3D physics. It can create " "many kinds of physics objects, but does not insert them on the node tree." msgstr "" -#: doc/classes/PhysicsServer.xml:51 -msgid "Creates an [Area]." +#: doc/classes/PhysicsServer3D.xml:51 +msgid "Creates an [Area3D]." msgstr "" -#: doc/classes/PhysicsServer.xml:71 +#: doc/classes/PhysicsServer3D.xml:71 msgid "" "Returns an area parameter value. A list of available parameters is on the " "[enum AreaParameter] constants." msgstr "" -#: doc/classes/PhysicsServer.xml:138 +#: doc/classes/PhysicsServer3D.xml:138 msgid "If [code]true[/code], area collides with rays." msgstr "" -#: doc/classes/PhysicsServer.xml:224 +#: doc/classes/PhysicsServer3D.xml:224 msgid "" "Sets the value for an area parameter. A list of available parameters is on " "the [enum AreaParameter] constants." msgstr "" -#: doc/classes/PhysicsServer.xml:235 +#: doc/classes/PhysicsServer3D.xml:235 msgid "Sets object pickable with rays." msgstr "" -#: doc/classes/PhysicsServer.xml:295 +#: doc/classes/PhysicsServer3D.xml:295 msgid "" "Sets the space override mode for the area. The modes are described in the " "[enum AreaSpaceOverrideMode] constants." msgstr "" -#: doc/classes/PhysicsServer.xml:387 +#: doc/classes/PhysicsServer3D.xml:387 msgid "" "Gives the body a push at a [code]position[/code] in the direction of the " "[code]impulse[/code]." msgstr "" -#: doc/classes/PhysicsServer.xml:398 +#: doc/classes/PhysicsServer3D.xml:398 msgid "Gives the body a push to rotate it." msgstr "" -#: doc/classes/PhysicsServer.xml:429 +#: doc/classes/PhysicsServer3D.xml:429 msgid "" "Creates a physics body. The first parameter can be any value from [enum " "BodyMode] constants, for the type of body created. Additionally, the body " "can be created in sleeping state to save processing time." msgstr "" -#: doc/classes/PhysicsServer.xml:447 +#: doc/classes/PhysicsServer3D.xml:447 msgid "" "Returns the physics layer or layers a body can collide with.\n" "-" msgstr "" -#: doc/classes/PhysicsServer.xml:457 -msgid "Returns the [PhysicsDirectBodyState] of the body." +#: doc/classes/PhysicsServer3D.xml:457 +msgid "Returns the [PhysicsDirectBodyState3D] of the body." msgstr "" -#: doc/classes/PhysicsServer.xml:503 +#: doc/classes/PhysicsServer3D.xml:503 msgid "" "Returns the value of a body parameter. A list of available parameters is on " "the [enum BodyParameter] constants." msgstr "" -#: doc/classes/PhysicsServer.xml:573 +#: doc/classes/PhysicsServer3D.xml:573 msgid "" "If [code]true[/code], the continuous collision detection mode is enabled." msgstr "" -#: doc/classes/PhysicsServer.xml:591 +#: doc/classes/PhysicsServer3D.xml:591 msgid "If [code]true[/code], the body can be detected by rays." msgstr "" -#: doc/classes/PhysicsServer.xml:602 +#: doc/classes/PhysicsServer3D.xml:602 msgid "" "Removes a body from the list of bodies exempt from collisions.\n" "Continuous collision detection tries to predict where a moving body will " "collide, instead of moving it and correcting its movement if it collided." msgstr "" -#: doc/classes/PhysicsServer.xml:670 +#: doc/classes/PhysicsServer3D.xml:670 msgid "" "If [code]true[/code], the continuous collision detection mode is enabled.\n" "Continuous collision detection tries to predict where a moving body will " "collide, instead of moving it and correcting its movement if it collided." msgstr "" -#: doc/classes/PhysicsServer.xml:718 +#: doc/classes/PhysicsServer3D.xml:718 msgid "Sets the body mode, from one of the [enum BodyMode] constants." msgstr "" -#: doc/classes/PhysicsServer.xml:742 +#: doc/classes/PhysicsServer3D.xml:742 msgid "" "Sets a body parameter. A list of available parameters is on the [enum " "BodyParameter] constants." msgstr "" -#: doc/classes/PhysicsServer.xml:753 +#: doc/classes/PhysicsServer3D.xml:753 msgid "Sets the body pickable with rays if [code]enabled[/code] is set." msgstr "" -#: doc/classes/PhysicsServer.xml:815 +#: doc/classes/PhysicsServer3D.xml:815 msgid "Sets a body state (see [enum BodyState] constants)." msgstr "" -#: doc/classes/PhysicsServer.xml:826 +#: doc/classes/PhysicsServer3D.xml:826 msgid "" "Gets a cone_twist_joint parameter (see [enum ConeTwistJointParam] constants)." msgstr "" -#: doc/classes/PhysicsServer.xml:839 +#: doc/classes/PhysicsServer3D.xml:839 msgid "" "Sets a cone_twist_joint parameter (see [enum ConeTwistJointParam] constants)." msgstr "" -#: doc/classes/PhysicsServer.xml:848 +#: doc/classes/PhysicsServer3D.xml:848 msgid "" -"Destroys any of the objects created by PhysicsServer. If the [RID] passed is " -"not one of the objects that can be created by PhysicsServer, an error will " -"be sent to the console." +"Destroys any of the objects created by PhysicsServer3D. If the [RID] passed " +"is not one of the objects that can be created by PhysicsServer3D, an error " +"will be sent to the console." msgstr "" -#: doc/classes/PhysicsServer.xml:861 +#: doc/classes/PhysicsServer3D.xml:861 msgid "" "Gets a generic_6_DOF_joint flag (see [enum G6DOFJointAxisFlag] constants)." msgstr "" -#: doc/classes/PhysicsServer.xml:874 +#: doc/classes/PhysicsServer3D.xml:874 msgid "" "Gets a generic_6_DOF_joint parameter (see [enum G6DOFJointAxisParam] " "constants)." msgstr "" -#: doc/classes/PhysicsServer.xml:889 +#: doc/classes/PhysicsServer3D.xml:889 msgid "" "Sets a generic_6_DOF_joint flag (see [enum G6DOFJointAxisFlag] constants)." msgstr "" -#: doc/classes/PhysicsServer.xml:904 +#: doc/classes/PhysicsServer3D.xml:904 msgid "" "Sets a generic_6_DOF_joint parameter (see [enum G6DOFJointAxisParam] " "constants)." msgstr "" -#: doc/classes/PhysicsServer.xml:913 +#: doc/classes/PhysicsServer3D.xml:913 msgid "Returns an Info defined by the [enum ProcessInfo] input given." msgstr "" -#: doc/classes/PhysicsServer.xml:924 +#: doc/classes/PhysicsServer3D.xml:924 msgid "Gets a hinge_joint flag (see [enum HingeJointFlag] constants)." msgstr "" -#: doc/classes/PhysicsServer.xml:935 +#: doc/classes/PhysicsServer3D.xml:935 msgid "Gets a hinge_joint parameter (see [enum HingeJointParam])." msgstr "" -#: doc/classes/PhysicsServer.xml:948 +#: doc/classes/PhysicsServer3D.xml:948 msgid "Sets a hinge_joint flag (see [enum HingeJointFlag] constants)." msgstr "" -#: doc/classes/PhysicsServer.xml:961 +#: doc/classes/PhysicsServer3D.xml:961 msgid "Sets a hinge_joint parameter (see [enum HingeJointParam] constants)." msgstr "" -#: doc/classes/PhysicsServer.xml:976 -msgid "Creates a [ConeTwistJoint]." +#: doc/classes/PhysicsServer3D.xml:976 +msgid "Creates a [ConeTwistJoint3D]." msgstr "" -#: doc/classes/PhysicsServer.xml:991 -msgid "Creates a [Generic6DOFJoint]." +#: doc/classes/PhysicsServer3D.xml:991 +msgid "Creates a [Generic6DOFJoint3D]." msgstr "" -#: doc/classes/PhysicsServer.xml:1006 -msgid "Creates a [HingeJoint]." +#: doc/classes/PhysicsServer3D.xml:1006 +msgid "Creates a [HingeJoint3D]." msgstr "" -#: doc/classes/PhysicsServer.xml:1021 -msgid "Creates a [PinJoint]." +#: doc/classes/PhysicsServer3D.xml:1021 +msgid "Creates a [PinJoint3D]." msgstr "" -#: doc/classes/PhysicsServer.xml:1036 -msgid "Creates a [SliderJoint]." +#: doc/classes/PhysicsServer3D.xml:1036 +msgid "Creates a [SliderJoint3D]." msgstr "" -#: doc/classes/PhysicsServer.xml:1045 -msgid "Gets the priority value of the Joint." +#: doc/classes/PhysicsServer3D.xml:1045 +msgid "Gets the priority value of the Joint3D." msgstr "" -#: doc/classes/PhysicsServer.xml:1054 -msgid "Returns the type of the Joint." +#: doc/classes/PhysicsServer3D.xml:1054 +msgid "Returns the type of the Joint3D." msgstr "" -#: doc/classes/PhysicsServer.xml:1065 -msgid "Sets the priority value of the Joint." +#: doc/classes/PhysicsServer3D.xml:1065 +msgid "Sets the priority value of the Joint3D." msgstr "" -#: doc/classes/PhysicsServer.xml:1074 +#: doc/classes/PhysicsServer3D.xml:1074 msgid "" "Returns position of the joint in the local space of body a of the joint." msgstr "" -#: doc/classes/PhysicsServer.xml:1083 +#: doc/classes/PhysicsServer3D.xml:1083 msgid "" "Returns position of the joint in the local space of body b of the joint." msgstr "" -#: doc/classes/PhysicsServer.xml:1094 +#: doc/classes/PhysicsServer3D.xml:1094 msgid "Gets a pin_joint parameter (see [enum PinJointParam] constants)." msgstr "" -#: doc/classes/PhysicsServer.xml:1105 +#: doc/classes/PhysicsServer3D.xml:1105 msgid "Sets position of the joint in the local space of body a of the joint." msgstr "" -#: doc/classes/PhysicsServer.xml:1116 +#: doc/classes/PhysicsServer3D.xml:1116 msgid "Sets position of the joint in the local space of body b of the joint." msgstr "" -#: doc/classes/PhysicsServer.xml:1129 +#: doc/classes/PhysicsServer3D.xml:1129 msgid "Sets a pin_joint parameter (see [enum PinJointParam] constants)." msgstr "" -#: doc/classes/PhysicsServer.xml:1138 +#: doc/classes/PhysicsServer3D.xml:1138 msgid "Activates or deactivates the 3D physics engine." msgstr "" -#: doc/classes/PhysicsServer.xml:1147 +#: doc/classes/PhysicsServer3D.xml:1147 msgid "" "Creates a shape of a type from [enum ShapeType]. Does not assign it to a " "body or an area. To do so, you must use [method area_set_shape] or [method " "body_set_shape]." msgstr "" -#: doc/classes/PhysicsServer.xml:1165 +#: doc/classes/PhysicsServer3D.xml:1165 msgid "Returns the type of shape (see [enum ShapeType] constants)." msgstr "" -#: doc/classes/PhysicsServer.xml:1187 doc/classes/PhysicsServer.xml:1200 +#: doc/classes/PhysicsServer3D.xml:1187 doc/classes/PhysicsServer3D.xml:1200 msgid "Gets a slider_joint parameter (see [enum SliderJointParam] constants)." msgstr "" -#: doc/classes/PhysicsServer.xml:1216 +#: doc/classes/PhysicsServer3D.xml:1216 msgid "" -"Returns the state of a space, a [PhysicsDirectSpaceState]. This object can " +"Returns the state of a space, a [PhysicsDirectSpaceState3D]. This object can " "be used to make collision/intersection queries." msgstr "" -#: doc/classes/PhysicsServer.xml:1260 +#: doc/classes/PhysicsServer3D.xml:1260 msgid "" "Sets the value for a space parameter. A list of available parameters is on " "the [enum SpaceParameter] constants." msgstr "" -#: doc/classes/PhysicsServer.xml:1266 -msgid "The [Joint] is a [PinJoint]." +#: doc/classes/PhysicsServer3D.xml:1266 +msgid "The [Joint3D] is a [PinJoint3D]." msgstr "" -#: doc/classes/PhysicsServer.xml:1269 -msgid "The [Joint] is a [HingeJoint]." +#: doc/classes/PhysicsServer3D.xml:1269 +msgid "The [Joint3D] is a [HingeJoint3D]." msgstr "" -#: doc/classes/PhysicsServer.xml:1272 -msgid "The [Joint] is a [SliderJoint]." +#: doc/classes/PhysicsServer3D.xml:1272 +msgid "The [Joint3D] is a [SliderJoint3D]." msgstr "" -#: doc/classes/PhysicsServer.xml:1275 -msgid "The [Joint] is a [ConeTwistJoint]." +#: doc/classes/PhysicsServer3D.xml:1275 +msgid "The [Joint3D] is a [ConeTwistJoint3D]." msgstr "" -#: doc/classes/PhysicsServer.xml:1278 -msgid "The [Joint] is a [Generic6DOFJoint]." +#: doc/classes/PhysicsServer3D.xml:1278 +msgid "The [Joint3D] is a [Generic6DOFJoint3D]." msgstr "" -#: doc/classes/PhysicsServer.xml:1281 +#: doc/classes/PhysicsServer3D.xml:1281 msgid "" "The strength with which the pinned objects try to stay in positional " "relation to each other.\n" "The higher, the stronger." msgstr "" -#: doc/classes/PhysicsServer.xml:1285 +#: doc/classes/PhysicsServer3D.xml:1285 msgid "" "The strength with which the pinned objects try to stay in velocity relation " "to each other.\n" "The higher, the stronger." msgstr "" -#: doc/classes/PhysicsServer.xml:1289 +#: doc/classes/PhysicsServer3D.xml:1289 msgid "" -"If above 0, this value is the maximum value for an impulse that this Joint " +"If above 0, this value is the maximum value for an impulse that this Joint3D " "puts on its ends." msgstr "" -#: doc/classes/PhysicsServer.xml:1295 +#: doc/classes/PhysicsServer3D.xml:1295 msgid "The maximum rotation across the Hinge." msgstr "" -#: doc/classes/PhysicsServer.xml:1298 +#: doc/classes/PhysicsServer3D.xml:1298 msgid "The minimum rotation across the Hinge." msgstr "" -#: doc/classes/PhysicsServer.xml:1315 +#: doc/classes/PhysicsServer3D.xml:1315 msgid "If [code]true[/code], the Hinge has a maximum and a minimum rotation." msgstr "" -#: doc/classes/PhysicsServer.xml:1318 +#: doc/classes/PhysicsServer3D.xml:1318 msgid "If [code]true[/code], a motor turns the Hinge." msgstr "" -#: doc/classes/PhysicsServer.xml:1321 doc/classes/SliderJoint.xml:81 -#: doc/classes/SliderJoint.xml:104 +#: doc/classes/PhysicsServer3D.xml:1321 doc/classes/SliderJoint3D.xml:81 +#: doc/classes/SliderJoint3D.xml:104 msgid "" "The maximum difference between the pivot points on their X axis before " "damping happens." msgstr "" -#: doc/classes/PhysicsServer.xml:1324 doc/classes/SliderJoint.xml:72 -#: doc/classes/SliderJoint.xml:107 +#: doc/classes/PhysicsServer3D.xml:1324 doc/classes/SliderJoint3D.xml:72 +#: doc/classes/SliderJoint3D.xml:107 msgid "" "The minimum difference between the pivot points on their X axis before " "damping happens." msgstr "" -#: doc/classes/PhysicsServer.xml:1327 doc/classes/SliderJoint.xml:78 -#: doc/classes/SliderJoint.xml:110 +#: doc/classes/PhysicsServer3D.xml:1327 doc/classes/SliderJoint3D.xml:78 +#: doc/classes/SliderJoint3D.xml:110 msgid "" "A factor applied to the movement across the slider axis once the limits get " "surpassed. The lower, the slower the movement." msgstr "" -#: doc/classes/PhysicsServer.xml:1330 doc/classes/SliderJoint.xml:113 +#: doc/classes/PhysicsServer3D.xml:1330 doc/classes/SliderJoint3D.xml:113 msgid "" "The amount of restitution once the limits are surpassed. The lower, the more " "velocityenergy gets lost." msgstr "" -#: doc/classes/PhysicsServer.xml:1333 doc/classes/SliderJoint.xml:116 +#: doc/classes/PhysicsServer3D.xml:1333 doc/classes/SliderJoint3D.xml:116 msgid "The amount of damping once the slider limits are surpassed." msgstr "" -#: doc/classes/PhysicsServer.xml:1336 doc/classes/SliderJoint.xml:90 -#: doc/classes/SliderJoint.xml:119 +#: doc/classes/PhysicsServer3D.xml:1336 doc/classes/SliderJoint3D.xml:90 +#: doc/classes/SliderJoint3D.xml:119 msgid "" "A factor applied to the movement across the slider axis as long as the " "slider is in the limits. The lower, the slower the movement." msgstr "" -#: doc/classes/PhysicsServer.xml:1339 doc/classes/SliderJoint.xml:87 -#: doc/classes/SliderJoint.xml:122 +#: doc/classes/PhysicsServer3D.xml:1339 doc/classes/SliderJoint3D.xml:87 +#: doc/classes/SliderJoint3D.xml:122 msgid "The amount of restitution inside the slider limits." msgstr "" -#: doc/classes/PhysicsServer.xml:1342 doc/classes/SliderJoint.xml:84 -#: doc/classes/SliderJoint.xml:125 +#: doc/classes/PhysicsServer3D.xml:1342 doc/classes/SliderJoint3D.xml:84 +#: doc/classes/SliderJoint3D.xml:125 msgid "The amount of damping inside the slider limits." msgstr "" -#: doc/classes/PhysicsServer.xml:1345 doc/classes/SliderJoint.xml:99 -#: doc/classes/SliderJoint.xml:128 +#: doc/classes/PhysicsServer3D.xml:1345 doc/classes/SliderJoint3D.xml:99 +#: doc/classes/SliderJoint3D.xml:128 msgid "A factor applied to the movement across axes orthogonal to the slider." msgstr "" -#: doc/classes/PhysicsServer.xml:1348 doc/classes/SliderJoint.xml:96 -#: doc/classes/SliderJoint.xml:131 +#: doc/classes/PhysicsServer3D.xml:1348 doc/classes/SliderJoint3D.xml:96 +#: doc/classes/SliderJoint3D.xml:131 msgid "" "The amount of restitution when movement is across axes orthogonal to the " "slider." msgstr "" -#: doc/classes/PhysicsServer.xml:1351 doc/classes/SliderJoint.xml:93 -#: doc/classes/SliderJoint.xml:134 +#: doc/classes/PhysicsServer3D.xml:1351 doc/classes/SliderJoint3D.xml:93 +#: doc/classes/SliderJoint3D.xml:134 msgid "" "The amount of damping when movement is across axes orthogonal to the slider." msgstr "" -#: doc/classes/PhysicsServer.xml:1354 doc/classes/SliderJoint.xml:48 -#: doc/classes/SliderJoint.xml:137 +#: doc/classes/PhysicsServer3D.xml:1354 doc/classes/SliderJoint3D.xml:48 +#: doc/classes/SliderJoint3D.xml:137 msgid "The upper limit of rotation in the slider." msgstr "" -#: doc/classes/PhysicsServer.xml:1357 doc/classes/SliderJoint.xml:37 -#: doc/classes/SliderJoint.xml:140 +#: doc/classes/PhysicsServer3D.xml:1357 doc/classes/SliderJoint3D.xml:37 +#: doc/classes/SliderJoint3D.xml:140 msgid "The lower limit of rotation in the slider." msgstr "" -#: doc/classes/PhysicsServer.xml:1360 doc/classes/SliderJoint.xml:143 +#: doc/classes/PhysicsServer3D.xml:1360 doc/classes/SliderJoint3D.xml:143 msgid "A factor applied to the all rotation once the limit is surpassed." msgstr "" -#: doc/classes/PhysicsServer.xml:1363 doc/classes/SliderJoint.xml:146 +#: doc/classes/PhysicsServer3D.xml:1363 doc/classes/SliderJoint3D.xml:146 msgid "The amount of restitution of the rotation when the limit is surpassed." msgstr "" -#: doc/classes/PhysicsServer.xml:1366 doc/classes/SliderJoint.xml:149 +#: doc/classes/PhysicsServer3D.xml:1366 doc/classes/SliderJoint3D.xml:149 msgid "The amount of damping of the rotation when the limit is surpassed." msgstr "" -#: doc/classes/PhysicsServer.xml:1369 +#: doc/classes/PhysicsServer3D.xml:1369 msgid "A factor that gets applied to the all rotation in the limits." msgstr "" -#: doc/classes/PhysicsServer.xml:1372 doc/classes/SliderJoint.xml:54 -#: doc/classes/SliderJoint.xml:155 +#: doc/classes/PhysicsServer3D.xml:1372 doc/classes/SliderJoint3D.xml:54 +#: doc/classes/SliderJoint3D.xml:155 msgid "The amount of restitution of the rotation in the limits." msgstr "" -#: doc/classes/PhysicsServer.xml:1375 doc/classes/SliderJoint.xml:51 -#: doc/classes/SliderJoint.xml:158 +#: doc/classes/PhysicsServer3D.xml:1375 doc/classes/SliderJoint3D.xml:51 +#: doc/classes/SliderJoint3D.xml:158 msgid "The amount of damping of the rotation in the limits." msgstr "" -#: doc/classes/PhysicsServer.xml:1378 +#: doc/classes/PhysicsServer3D.xml:1378 msgid "" "A factor that gets applied to the all rotation across axes orthogonal to the " "slider." msgstr "" -#: doc/classes/PhysicsServer.xml:1381 doc/classes/SliderJoint.xml:63 -#: doc/classes/SliderJoint.xml:164 +#: doc/classes/PhysicsServer3D.xml:1381 doc/classes/SliderJoint3D.xml:63 +#: doc/classes/SliderJoint3D.xml:164 msgid "" "The amount of restitution of the rotation across axes orthogonal to the " "slider." msgstr "" -#: doc/classes/PhysicsServer.xml:1384 doc/classes/SliderJoint.xml:60 -#: doc/classes/SliderJoint.xml:167 +#: doc/classes/PhysicsServer3D.xml:1384 doc/classes/SliderJoint3D.xml:60 +#: doc/classes/SliderJoint3D.xml:167 msgid "" "The amount of damping of the rotation across axes orthogonal to the slider." msgstr "" -#: doc/classes/PhysicsServer.xml:1387 +#: doc/classes/PhysicsServer3D.xml:1387 msgid "Represents the size of the [enum SliderJointParam] enum." msgstr "" -#: doc/classes/PhysicsServer.xml:1404 +#: doc/classes/PhysicsServer3D.xml:1404 msgid "" -"The ease with which the Joint twists, if it's too low, it takes more force " +"The ease with which the Joint3D twists, if it's too low, it takes more force " "to twist the joint." msgstr "" -#: doc/classes/PhysicsServer.xml:1416 +#: doc/classes/PhysicsServer3D.xml:1416 msgid "" "A factor that gets applied to the movement across the axes. The lower, the " "slower the movement." msgstr "" -#: doc/classes/PhysicsServer.xml:1419 +#: doc/classes/PhysicsServer3D.xml:1419 msgid "" "The amount of restitution on the axes movement. The lower, the more velocity-" "energy gets lost." msgstr "" -#: doc/classes/PhysicsServer.xml:1425 +#: doc/classes/PhysicsServer3D.xml:1425 msgid "The velocity that the joint's linear motor will attempt to reach." msgstr "" -#: doc/classes/PhysicsServer.xml:1428 +#: doc/classes/PhysicsServer3D.xml:1428 msgid "" "The maximum force that the linear motor can apply while trying to reach the " "target velocity." msgstr "" -#: doc/classes/PhysicsServer.xml:1437 +#: doc/classes/PhysicsServer3D.xml:1437 msgid "A factor that gets multiplied onto all rotations across the axes." msgstr "" -#: doc/classes/PhysicsServer.xml:1449 +#: doc/classes/PhysicsServer3D.xml:1449 msgid "" "When correcting the crossing of limits in rotation across the axes, this " "error tolerance factor defines how much the correction gets slowed down. The " "lower, the slower." msgstr "" -#: doc/classes/PhysicsServer.xml:1458 +#: doc/classes/PhysicsServer3D.xml:1458 msgid "" "If [code]set[/code] there is linear motion possible within the given limits." msgstr "" -#: doc/classes/PhysicsServer.xml:1461 +#: doc/classes/PhysicsServer3D.xml:1461 msgid "If [code]set[/code] there is rotational motion possible." msgstr "" -#: doc/classes/PhysicsServer.xml:1464 +#: doc/classes/PhysicsServer3D.xml:1464 msgid "If [code]set[/code] there is a rotational motor across these axes." msgstr "" -#: doc/classes/PhysicsServer.xml:1467 +#: doc/classes/PhysicsServer3D.xml:1467 msgid "" "If [code]set[/code] there is a linear motor on this axis that targets a " "specific velocity." msgstr "" -#: doc/classes/PhysicsServer.xml:1470 -msgid "The [Shape] is a [WorldMarginShape]." +#: doc/classes/PhysicsServer3D.xml:1470 +msgid "The [Shape3D] is a [WorldMarginShape3D]." +msgstr "" + +#: doc/classes/PhysicsServer3D.xml:1473 +msgid "The [Shape3D] is a [RayShape3D]." msgstr "" -#: doc/classes/PhysicsServer.xml:1473 -msgid "The [Shape] is a [RayShape]." +#: doc/classes/PhysicsServer3D.xml:1476 +msgid "The [Shape3D] is a [SphereShape3D]." msgstr "" -#: doc/classes/PhysicsServer.xml:1476 -msgid "The [Shape] is a [SphereShape]." +#: doc/classes/PhysicsServer3D.xml:1479 +msgid "The [Shape3D] is a [BoxShape3D]." msgstr "" -#: doc/classes/PhysicsServer.xml:1479 -msgid "The [Shape] is a [BoxShape]." +#: doc/classes/PhysicsServer3D.xml:1482 +msgid "The [Shape3D] is a [CapsuleShape3D]." msgstr "" -#: doc/classes/PhysicsServer.xml:1482 -msgid "The [Shape] is a [CapsuleShape]." +#: doc/classes/PhysicsServer3D.xml:1485 +msgid "The [Shape3D] is a [CylinderShape3D]." msgstr "" -#: doc/classes/PhysicsServer.xml:1485 -msgid "The [Shape] is a [CylinderShape]." +#: doc/classes/PhysicsServer3D.xml:1488 +msgid "The [Shape3D] is a [ConvexPolygonShape3D]." msgstr "" -#: doc/classes/PhysicsServer.xml:1488 -msgid "The [Shape] is a [ConvexPolygonShape]." +#: doc/classes/PhysicsServer3D.xml:1491 +msgid "The [Shape3D] is a [ConcavePolygonShape3D]." msgstr "" -#: doc/classes/PhysicsServer.xml:1491 -msgid "The [Shape] is a [ConcavePolygonShape]." +#: doc/classes/PhysicsServer3D.xml:1494 +msgid "The [Shape3D] is a [HeightMapShape3D]." msgstr "" -#: doc/classes/PhysicsServer.xml:1494 -msgid "The [Shape] is a [HeightMapShape]." +#: doc/classes/PhysicsShapeQueryParameters2D.xml:4 +msgid "Parameters to be sent to a 2D shape physics query." +msgstr "" + +#: doc/classes/PhysicsShapeQueryParameters2D.xml:7 +msgid "" +"This class contains the shape and other parameters for 2D intersection/" +"collision queries. See also [PhysicsShapeQueryResult2D]." +msgstr "" + +#: doc/classes/PhysicsShapeQueryParameters2D.xml:18 +msgid "" +"Sets the [Shape2D] that will be used for collision/intersection queries." +msgstr "" + +#: doc/classes/PhysicsShapeQueryParameters2D.xml:24 +msgid "If [code]true[/code], the query will take [Area2D]s into account." +msgstr "" + +#: doc/classes/PhysicsShapeQueryParameters2D.xml:27 +msgid "" +"If [code]true[/code], the query will take [PhysicsBody2D]s into account." +msgstr "" + +#: doc/classes/PhysicsShapeQueryParameters2D.xml:30 +#: doc/classes/PhysicsShapeQueryParameters3D.xml:30 +msgid "The physics layer(s) the query will take into account (as a bitmask)." +msgstr "" + +#: doc/classes/PhysicsShapeQueryParameters2D.xml:33 +#: doc/classes/PhysicsShapeQueryParameters3D.xml:33 +msgid "" +"The list of objects or object [RID]s that will be excluded from collisions." +msgstr "" + +#: doc/classes/PhysicsShapeQueryParameters2D.xml:36 +#: doc/classes/PhysicsShapeQueryParameters3D.xml:36 doc/classes/Shape3D.xml:16 +msgid "The collision margin for the shape." +msgstr "" + +#: doc/classes/PhysicsShapeQueryParameters2D.xml:39 +msgid "The motion of the shape being queried for." +msgstr "" + +#: doc/classes/PhysicsShapeQueryParameters2D.xml:42 +#: doc/classes/PhysicsShapeQueryParameters3D.xml:39 +msgid "The queried shape's [RID]. See also [method set_shape]." msgstr "" -#: doc/classes/PhysicsShapeQueryParameters.xml:4 +#: doc/classes/PhysicsShapeQueryParameters2D.xml:45 +#: doc/classes/PhysicsShapeQueryParameters3D.xml:42 +msgid "The queried shape's transform matrix." +msgstr "" + +#: doc/classes/PhysicsShapeQueryParameters3D.xml:4 msgid "Parameters to be sent to a 3D shape physics query." msgstr "" -#: doc/classes/PhysicsShapeQueryParameters.xml:7 +#: doc/classes/PhysicsShapeQueryParameters3D.xml:7 msgid "" "This class contains the shape and other parameters for 3D intersection/" -"collision queries. See also [PhysicsShapeQueryResult]." +"collision queries. See also [PhysicsShapeQueryResult3D]." msgstr "" -#: doc/classes/PhysicsShapeQueryParameters.xml:18 -msgid "Sets the [Shape] that will be used for collision/intersection queries." +#: doc/classes/PhysicsShapeQueryParameters3D.xml:18 +msgid "" +"Sets the [Shape3D] that will be used for collision/intersection queries." msgstr "" -#: doc/classes/PhysicsShapeQueryParameters.xml:24 -msgid "If [code]true[/code], the query will take [Area]s into account." +#: doc/classes/PhysicsShapeQueryParameters3D.xml:24 +msgid "If [code]true[/code], the query will take [Area3D]s into account." msgstr "" -#: doc/classes/PhysicsShapeQueryParameters.xml:27 -msgid "If [code]true[/code], the query will take [PhysicsBody]s into account." +#: doc/classes/PhysicsShapeQueryParameters3D.xml:27 +msgid "" +"If [code]true[/code], the query will take [PhysicsBody3D]s into account." msgstr "" -#: doc/classes/PhysicsShapeQueryResult.xml:4 -msgid "Result of a 3D shape query in [PhysicsServer]." +#: doc/classes/PhysicsShapeQueryResult2D.xml:4 +msgid "Result of a 2D shape query in [PhysicsServer2D]." msgstr "" -#: doc/classes/PhysicsShapeQueryResult.xml:7 +#: doc/classes/PhysicsShapeQueryResult2D.xml:7 msgid "" -"The result of a 3D shape query in [PhysicsServer]. See also " -"[PhysicsShapeQueryParameters]." +"The result of a 2D shape query in [PhysicsServer2D]. See also " +"[PhysicsShapeQueryParameters2D]." msgstr "" -#: doc/classes/PinJoint.xml:4 -msgid "Pin joint for 3D shapes." +#: doc/classes/PhysicsShapeQueryResult2D.xml:16 +#: doc/classes/PhysicsShapeQueryResult3D.xml:16 +msgid "Returns the number of objects that intersected with the shape." msgstr "" -#: doc/classes/PinJoint.xml:7 +#: doc/classes/PhysicsShapeQueryResult2D.xml:25 +#: doc/classes/PhysicsShapeQueryResult3D.xml:25 msgid "" -"Pin joint for 3D rigid bodies. It pins 2 bodies (rigid or static) together." +"Returns the [Object] that intersected with the shape at index [code]idx[/" +"code]." msgstr "" -#: doc/classes/PinJoint.xml:35 doc/classes/PinJoint.xml:46 +#: doc/classes/PhysicsShapeQueryResult2D.xml:34 +#: doc/classes/PhysicsShapeQueryResult3D.xml:34 msgid "" -"The force with which the pinned objects stay in positional relation to each " -"other. The higher, the stronger." +"Returns the instance ID of the [Object] that intersected with the shape at " +"index [code]idx[/code]." msgstr "" -#: doc/classes/PinJoint.xml:38 doc/classes/PinJoint.xml:49 +#: doc/classes/PhysicsShapeQueryResult2D.xml:43 msgid "" -"The force with which the pinned objects stay in velocity relation to each " -"other. The higher, the stronger." +"Returns the child index of the object's [Shape2D] that intersected with the " +"shape at index [code]idx[/code]." msgstr "" -#: doc/classes/PinJoint.xml:41 doc/classes/PinJoint.xml:52 +#: doc/classes/PhysicsShapeQueryResult2D.xml:52 +#: doc/classes/PhysicsShapeQueryResult3D.xml:52 msgid "" -"If above 0, this value is the maximum value for an impulse that this Joint " -"produces." +"Returns the [RID] of the object that intersected with the shape at index " +"[code]idx[/code]." +msgstr "" + +#: doc/classes/PhysicsShapeQueryResult3D.xml:4 +msgid "Result of a 3D shape query in [PhysicsServer3D]." +msgstr "" + +#: doc/classes/PhysicsShapeQueryResult3D.xml:7 +msgid "" +"The result of a 3D shape query in [PhysicsServer3D]. See also " +"[PhysicsShapeQueryParameters3D]." +msgstr "" + +#: doc/classes/PhysicsShapeQueryResult3D.xml:43 +msgid "" +"Returns the child index of the object's [Shape3D] that intersected with the " +"shape at index [code]idx[/code]." msgstr "" #: doc/classes/PinJoint2D.xml:4 -msgid "Pin Joint for 2D shapes." +msgid "Pin joint for 2D shapes." msgstr "" #: doc/classes/PinJoint2D.xml:7 msgid "" -"Pin Joint for 2D rigid bodies. It pins two bodies (rigid or static) together." +"Pin joint for 2D rigid bodies. It pins two bodies (rigid or static) together." msgstr "" #: doc/classes/PinJoint2D.xml:15 @@ -36954,6 +36941,33 @@ msgid "" "The higher this value, the more the bond to the pinned partner can flex." msgstr "" +#: doc/classes/PinJoint3D.xml:4 +msgid "Pin joint for 3D shapes." +msgstr "" + +#: doc/classes/PinJoint3D.xml:7 +msgid "" +"Pin joint for 3D rigid bodies. It pins 2 bodies (rigid or static) together." +msgstr "" + +#: doc/classes/PinJoint3D.xml:35 doc/classes/PinJoint3D.xml:46 +msgid "" +"The force with which the pinned objects stay in positional relation to each " +"other. The higher, the stronger." +msgstr "" + +#: doc/classes/PinJoint3D.xml:38 doc/classes/PinJoint3D.xml:49 +msgid "" +"The force with which the pinned objects stay in velocity relation to each " +"other. The higher, the stronger." +msgstr "" + +#: doc/classes/PinJoint3D.xml:41 doc/classes/PinJoint3D.xml:52 +msgid "" +"If above 0, this value is the maximum value for an impulse that this Joint3D " +"produces." +msgstr "" + #: doc/classes/Plane.xml:4 msgid "Plane in hessian form." msgstr "" @@ -37256,83 +37270,13 @@ msgstr "" msgid "" "Popup is a base [Control] used to show dialogs and popups. It's a subwindow " "and modal by default (see [Control]) and has helpers for custom popup " -"behavior. All popup methods ensure correct placement within the viewport." -msgstr "" - -#: doc/classes/Popup.xml:18 -msgid "Popup (show the control in modal form)." -msgstr "" - -#: doc/classes/Popup.xml:27 -msgid "" -"Popup (show the control in modal form) in the center of the screen relative " -"to its current canvas transform, at the current size, or at a size " -"determined by [code]size[/code]." -msgstr "" - -#: doc/classes/Popup.xml:38 -msgid "" -"Popup (show the control in modal form) in the center of the screen relative " -"to the current canvas transform, clamping the size to [code]size[/code], " -"then ensuring the popup is no larger than the viewport size multiplied by " -"[code]fallback_ratio[/code]." -msgstr "" - -#: doc/classes/Popup.xml:47 -msgid "" -"Popup (show the control in modal form) in the center of the screen relative " -"to the current canvas transform, ensuring the size is never smaller than " -"[code]minsize[/code]." -msgstr "" - -#: doc/classes/Popup.xml:56 -msgid "" -"Popup (show the control in modal form) in the center of the screen relative " -"to the current canvas transform, scaled at a ratio of size of the screen." -msgstr "" - -#: doc/classes/Popup.xml:63 -msgid "Shrink popup to keep to the minimum size of content." -msgstr "" - -#: doc/classes/Popup.xml:69 -msgid "" -"If [code]true[/code], the popup will not be hidden when a click event occurs " -"outside of it, or when it receives the [code]ui_cancel[/code] action event." -msgstr "" - -#: doc/classes/Popup.xml:76 -msgid "" -"Emitted when a popup is about to be shown. This is often used in [PopupMenu] " -"to clear the list of options then create a new one according to the current " -"context." +"behavior." msgstr "" -#: doc/classes/Popup.xml:81 +#: doc/classes/Popup.xml:23 msgid "Emitted when a popup is hidden." msgstr "" -#: doc/classes/Popup.xml:87 -msgid "Notification sent right after the popup is shown." -msgstr "" - -#: doc/classes/Popup.xml:90 -msgid "Notification sent right after the popup is hidden." -msgstr "" - -#: doc/classes/PopupDialog.xml:4 -msgid "Base class for popup dialogs." -msgstr "" - -#: doc/classes/PopupDialog.xml:7 -msgid "" -"PopupDialog is a base class for popup dialogs, along with [WindowDialog]." -msgstr "" - -#: doc/classes/PopupDialog.xml:17 -msgid "Sets a custom [StyleBox] for the panel of the [PopupDialog]." -msgstr "" - #: doc/classes/PopupMenu.xml:4 msgid "PopupMenu displays a list of options." msgstr "" @@ -37540,13 +37484,7 @@ msgid "" "code]." msgstr "" -#: doc/classes/PopupMenu.xml:337 -msgid "" -"Returns [code]true[/code] if the popup will be hidden when the window loses " -"focus or not." -msgstr "" - -#: doc/classes/PopupMenu.xml:346 +#: doc/classes/PopupMenu.xml:339 msgid "" "Returns [code]true[/code] if the item at index [code]idx[/code] is checkable " "in some way, i.e. if it has a checkbox or radio button.\n" @@ -37555,19 +37493,19 @@ msgid "" "manually." msgstr "" -#: doc/classes/PopupMenu.xml:356 +#: doc/classes/PopupMenu.xml:349 msgid "" "Returns [code]true[/code] if the item at index [code]idx[/code] is checked." msgstr "" -#: doc/classes/PopupMenu.xml:365 +#: doc/classes/PopupMenu.xml:358 msgid "" "Returns [code]true[/code] if the item at index [code]idx[/code] is disabled. " "When it is disabled it can't be selected, or its action invoked.\n" "See [method set_item_disabled] for more info on how to disable an item." msgstr "" -#: doc/classes/PopupMenu.xml:375 +#: doc/classes/PopupMenu.xml:368 msgid "" "Returns [code]true[/code] if the item at index [code]idx[/code] has radio " "button-style checkability.\n" @@ -37575,36 +37513,32 @@ msgid "" "unchecking items in radio groups." msgstr "" -#: doc/classes/PopupMenu.xml:385 +#: doc/classes/PopupMenu.xml:378 msgid "" "Returns [code]true[/code] if the item is a separator. If it is, it will be " "displayed as a line. See [method add_separator] for more info on how to add " "a separator." msgstr "" -#: doc/classes/PopupMenu.xml:394 +#: doc/classes/PopupMenu.xml:387 msgid "Returns [code]true[/code] if the specified item's shortcut is disabled." msgstr "" -#: doc/classes/PopupMenu.xml:403 +#: doc/classes/PopupMenu.xml:396 msgid "" "Removes the item at index [code]idx[/code] from the menu.\n" "[b]Note:[/b] The indices of items after the removed item will be shifted by " "one." msgstr "" -#: doc/classes/PopupMenu.xml:413 -msgid "Hides the [PopupMenu] when the window loses focus." -msgstr "" - -#: doc/classes/PopupMenu.xml:424 +#: doc/classes/PopupMenu.xml:408 msgid "" "Sets the accelerator of the item at index [code]idx[/code]. Accelerators are " "special combinations of keys that activate the item, no matter which control " "is focused." msgstr "" -#: doc/classes/PopupMenu.xml:435 +#: doc/classes/PopupMenu.xml:419 msgid "" "Sets whether the item at index [code]idx[/code] has a checkbox. If " "[code]false[/code], sets the type of the item to plain text.\n" @@ -37612,204 +37546,204 @@ msgid "" "built-in checking behavior and must be checked/unchecked manually." msgstr "" -#: doc/classes/PopupMenu.xml:447 +#: doc/classes/PopupMenu.xml:431 msgid "" "Sets the type of the item at the specified index [code]idx[/code] to radio " "button. If [code]false[/code], sets the type of the item to plain text." msgstr "" -#: doc/classes/PopupMenu.xml:458 +#: doc/classes/PopupMenu.xml:442 msgid "" "Mark the item at index [code]idx[/code] as a separator, which means that it " "would be displayed as a line. If [code]false[/code], sets the type of the " "item to plain text." msgstr "" -#: doc/classes/PopupMenu.xml:469 +#: doc/classes/PopupMenu.xml:453 msgid "Sets the checkstate status of the item at index [code]idx[/code]." msgstr "" -#: doc/classes/PopupMenu.xml:480 +#: doc/classes/PopupMenu.xml:464 msgid "" "Enables/disables the item at index [code]idx[/code]. When it is disabled, it " "can't be selected and its action can't be invoked." msgstr "" -#: doc/classes/PopupMenu.xml:491 +#: doc/classes/PopupMenu.xml:475 msgid "Replaces the [Texture2D] icon of the specified [code]idx[/code]." msgstr "" -#: doc/classes/PopupMenu.xml:502 +#: doc/classes/PopupMenu.xml:486 msgid "Sets the [code]id[/code] of the item at index [code]idx[/code]." msgstr "" -#: doc/classes/PopupMenu.xml:513 +#: doc/classes/PopupMenu.xml:497 msgid "" "Sets the metadata of an item, which may be of any type. You can later get it " "with [method get_item_metadata], which provides a simple way of assigning " "context data to items." msgstr "" -#: doc/classes/PopupMenu.xml:524 +#: doc/classes/PopupMenu.xml:508 msgid "" "Sets the state of an multistate item. See [method add_multistate_item] for " "details." msgstr "" -#: doc/classes/PopupMenu.xml:537 +#: doc/classes/PopupMenu.xml:521 msgid "Sets a [ShortCut] for the specified item [code]idx[/code]." msgstr "" -#: doc/classes/PopupMenu.xml:548 +#: doc/classes/PopupMenu.xml:532 msgid "Disables the [ShortCut] of the specified index [code]idx[/code]." msgstr "" -#: doc/classes/PopupMenu.xml:559 +#: doc/classes/PopupMenu.xml:543 msgid "" "Sets the submenu of the item at index [code]idx[/code]. The submenu is the " "name of a child [PopupMenu] node that would be shown when the item is " "clicked." msgstr "" -#: doc/classes/PopupMenu.xml:581 +#: doc/classes/PopupMenu.xml:565 msgid "" "Sets the [String] tooltip of the item at the specified index [code]idx[/" "code]." msgstr "" -#: doc/classes/PopupMenu.xml:590 +#: doc/classes/PopupMenu.xml:574 msgid "" "Toggles the check state of the item of the specified index [code]idx[/code]." msgstr "" -#: doc/classes/PopupMenu.xml:599 +#: doc/classes/PopupMenu.xml:583 msgid "" "Cycle to the next state of an multistate item. See [method " "add_multistate_item] for details." msgstr "" -#: doc/classes/PopupMenu.xml:605 +#: doc/classes/PopupMenu.xml:589 msgid "If [code]true[/code], allows to navigate [PopupMenu] with letter keys." msgstr "" -#: doc/classes/PopupMenu.xml:609 +#: doc/classes/PopupMenu.xml:592 msgid "" "If [code]true[/code], hides the [PopupMenu] when a checkbox or radio button " "is selected." msgstr "" -#: doc/classes/PopupMenu.xml:612 +#: doc/classes/PopupMenu.xml:595 msgid "If [code]true[/code], hides the [PopupMenu] when an item is selected." msgstr "" -#: doc/classes/PopupMenu.xml:615 +#: doc/classes/PopupMenu.xml:598 msgid "" "If [code]true[/code], hides the [PopupMenu] when a state item is selected." msgstr "" -#: doc/classes/PopupMenu.xml:618 +#: doc/classes/PopupMenu.xml:601 msgid "" "Sets the delay time in seconds for the submenu item to popup on mouse " "hovering. If the popup menu is added as a child of another (acting as a " "submenu), it will inherit the delay time of the parent menu item." msgstr "" -#: doc/classes/PopupMenu.xml:626 +#: doc/classes/PopupMenu.xml:609 msgid "" "Emitted when user navigated to an item of some [code]id[/code] using " "[code]ui_up[/code] or [code]ui_down[/code] action." msgstr "" -#: doc/classes/PopupMenu.xml:633 +#: doc/classes/PopupMenu.xml:616 msgid "" "Emitted when an item of some [code]id[/code] is pressed or its accelerator " "is activated." msgstr "" -#: doc/classes/PopupMenu.xml:640 +#: doc/classes/PopupMenu.xml:623 msgid "" "Emitted when an item of some [code]index[/code] is pressed or its " "accelerator is activated." msgstr "" -#: doc/classes/PopupMenu.xml:648 +#: doc/classes/PopupMenu.xml:631 msgid "[Texture2D] icon for the checked checkbox items." msgstr "" -#: doc/classes/PopupMenu.xml:651 +#: doc/classes/PopupMenu.xml:634 msgid "[Font] used for the menu items." msgstr "" -#: doc/classes/PopupMenu.xml:654 +#: doc/classes/PopupMenu.xml:637 msgid "The default text [Color] for menu items' names." msgstr "" -#: doc/classes/PopupMenu.xml:657 +#: doc/classes/PopupMenu.xml:640 msgid "" "The text [Color] used for shortcuts and accelerators that show next to the " "menu item name when defined. See [method get_item_accelerator] for more info " "on accelerators." msgstr "" -#: doc/classes/PopupMenu.xml:660 +#: doc/classes/PopupMenu.xml:643 msgid "[Color] used for disabled menu items' text." msgstr "" -#: doc/classes/PopupMenu.xml:663 +#: doc/classes/PopupMenu.xml:646 msgid "[Color] used for the hovered text." msgstr "" -#: doc/classes/PopupMenu.xml:666 +#: doc/classes/PopupMenu.xml:649 msgid "[StyleBox] displayed when the [PopupMenu] item is hovered." msgstr "" -#: doc/classes/PopupMenu.xml:669 +#: doc/classes/PopupMenu.xml:652 msgid "" "The horizontal space between the item's name and the shortcut text/submenu " "arrow." msgstr "" -#: doc/classes/PopupMenu.xml:672 +#: doc/classes/PopupMenu.xml:655 msgid "" "[StyleBox] for the left side of labeled separator. See [method " "add_separator]." msgstr "" -#: doc/classes/PopupMenu.xml:675 +#: doc/classes/PopupMenu.xml:658 msgid "" "[StyleBox] for the right side of labeled separator. See [method " "add_separator]." msgstr "" -#: doc/classes/PopupMenu.xml:678 +#: doc/classes/PopupMenu.xml:661 msgid "Default [StyleBox] of the [PopupMenu] items." msgstr "" -#: doc/classes/PopupMenu.xml:681 +#: doc/classes/PopupMenu.xml:664 msgid "[StyleBox] used when the [PopupMenu] item is disabled." msgstr "" -#: doc/classes/PopupMenu.xml:684 +#: doc/classes/PopupMenu.xml:667 msgid "[Texture2D] icon for the checked radio button items." msgstr "" -#: doc/classes/PopupMenu.xml:687 +#: doc/classes/PopupMenu.xml:670 msgid "[Texture2D] icon for the unchecked radio button items." msgstr "" -#: doc/classes/PopupMenu.xml:690 +#: doc/classes/PopupMenu.xml:673 msgid "[StyleBox] used for the separators. See [method add_separator]." msgstr "" -#: doc/classes/PopupMenu.xml:693 +#: doc/classes/PopupMenu.xml:676 msgid "[Texture2D] icon for the submenu arrow." msgstr "" -#: doc/classes/PopupMenu.xml:696 +#: doc/classes/PopupMenu.xml:679 msgid "[Texture2D] icon for the unchecked checkbox items." msgstr "" -#: doc/classes/PopupMenu.xml:699 +#: doc/classes/PopupMenu.xml:682 msgid "The vertical space between each menu item." msgstr "" @@ -37821,7 +37755,7 @@ msgstr "" msgid "" "Class for displaying popups with a panel background. In some cases it might " "be simpler to use than [Popup], since it provides a configurable background. " -"If you are making windows, better check [WindowDialog]." +"If you are making windows, better check [Window]." msgstr "" #: doc/classes/PopupPanel.xml:17 @@ -37845,7 +37779,7 @@ msgstr "" #: doc/classes/Position3D.xml:7 msgid "" -"Generic 3D position hint for editing. It's just like a plain [Spatial], but " +"Generic 3D position hint for editing. It's just like a plain [Node3D], but " "it displays as a cross in the 3D editor at all times." msgstr "" @@ -37913,125 +37847,79 @@ msgstr "" msgid "Number of added edge loops along the X axis." msgstr "" -#: doc/classes/ProceduralSky.xml:4 +#: doc/classes/ProceduralSkyMaterial.xml:4 msgid "" -"Type of [Sky] that is generated procedurally based on user input parameters." +"A [Material] used with [Sky] to generate a background based on user input " +"parameters." msgstr "" -#: doc/classes/ProceduralSky.xml:7 -msgid "" -"ProceduralSky provides a way to create an effective background quickly by " -"defining procedural parameters for the sun, the sky and the ground. The sky " -"and ground are very similar, they are defined by a color at the horizon, " -"another color, and finally an easing curve to interpolate between these two " -"colors. Similarly, the sun is described by a position in the sky, a color, " -"and an easing curve. However, the sun also defines a minimum and maximum " -"angle, these two values define at what distance the easing curve begins and " -"ends from the sun, and thus end up defining the size of the sun in the sky.\n" -"The ProceduralSky is updated on the CPU after the parameters change. It is " -"stored in a texture and then displayed as a background in the scene. This " -"makes it relatively unsuitable for real-time updates during gameplay. " -"However, with a small enough texture size, it can still be updated " -"relatively frequently, as it is updated on a background thread when multi-" -"threading is available." +#: doc/classes/ProceduralSkyMaterial.xml:7 +msgid "" +"ProceduralSkyMaterial provides a way to create an effective background " +"quickly by defining procedural parameters for the sun, the sky and the " +"ground. The sky and ground are very similar, they are defined by a color at " +"the horizon, another color, and finally an easing curve to interpolate " +"between these two colors. Similarly, the sun is described by a position in " +"the sky, a color, and an easing curve. However, the sun also defines a " +"minimum and maximum angle, these two values define at what distance the " +"easing curve begins and ends from the sun, and thus end up defining the size " +"of the sun in the sky.\n" +"The [ProceduralSkyMaterial] uses a lightweight shader to draw the sky and is " +"thus suited for real time updates. When you do not need a quick sky that is " +"not realistic, this is a good option.\n" +"The [ProceduralSkyMaterial] supports up to 4 suns. Each sun takes its color, " +"energy, and direction from the corresponding [DirectionalLight3D] in the " +"scene." msgstr "" -#: doc/classes/ProceduralSky.xml:16 -msgid "Color of the ground at the bottom." +#: doc/classes/ProceduralSkyMaterial.xml:17 +msgid "" +"Color of the ground at the bottom. Blends with [member ground_horizon_color]." msgstr "" -#: doc/classes/ProceduralSky.xml:19 +#: doc/classes/ProceduralSkyMaterial.xml:20 msgid "" "How quickly the [member ground_horizon_color] fades into the [member " "ground_bottom_color]." msgstr "" -#: doc/classes/ProceduralSky.xml:22 +#: doc/classes/ProceduralSkyMaterial.xml:23 msgid "Amount of energy contribution from the ground." msgstr "" -#: doc/classes/ProceduralSky.xml:25 -msgid "Color of the ground at the horizon." +#: doc/classes/ProceduralSkyMaterial.xml:26 +msgid "" +"Color of the ground at the horizon. Blends with [member ground_bottom_color]." msgstr "" -#: doc/classes/ProceduralSky.xml:28 +#: doc/classes/ProceduralSkyMaterial.xml:29 msgid "" "How quickly the [member sky_horizon_color] fades into the [member " "sky_top_color]." msgstr "" -#: doc/classes/ProceduralSky.xml:31 +#: doc/classes/ProceduralSkyMaterial.xml:32 msgid "Amount of energy contribution from the sky." msgstr "" -#: doc/classes/ProceduralSky.xml:34 -msgid "Color of the sky at the horizon." +#: doc/classes/ProceduralSkyMaterial.xml:35 +msgid "Color of the sky at the horizon. Blends with [member sky_top_color]." msgstr "" -#: doc/classes/ProceduralSky.xml:37 -msgid "Color of the sky at the top." +#: doc/classes/ProceduralSkyMaterial.xml:38 +msgid "Color of the sky at the top. Blends with [member sky_horizon_color]." msgstr "" -#: doc/classes/ProceduralSky.xml:40 +#: doc/classes/ProceduralSkyMaterial.xml:41 msgid "Distance from center of sun where it fades out completely." msgstr "" -#: doc/classes/ProceduralSky.xml:43 -msgid "Distance from sun where it goes from solid to starting to fade." -msgstr "" - -#: doc/classes/ProceduralSky.xml:46 -msgid "The sun's color." -msgstr "" - -#: doc/classes/ProceduralSky.xml:49 +#: doc/classes/ProceduralSkyMaterial.xml:44 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 "" -#: doc/classes/ProceduralSky.xml:52 -msgid "Amount of energy contribution from the sun." -msgstr "" - -#: doc/classes/ProceduralSky.xml:55 -msgid "The sun's height using polar coordinates." -msgstr "" - -#: doc/classes/ProceduralSky.xml:58 -msgid "The direction of the sun using polar coordinates." -msgstr "" - -#: doc/classes/ProceduralSky.xml:61 -msgid "" -"Size of [Texture2D] that the ProceduralSky will generate. The size is set " -"using [enum TextureSize]." -msgstr "" - -#: doc/classes/ProceduralSky.xml:66 -msgid "Sky texture will be 256x128." -msgstr "" - -#: doc/classes/ProceduralSky.xml:69 -msgid "Sky texture will be 512x256." -msgstr "" - -#: doc/classes/ProceduralSky.xml:72 -msgid "Sky texture will be 1024x512. This is the default size." -msgstr "" - -#: doc/classes/ProceduralSky.xml:75 -msgid "Sky texture will be 2048x1024." -msgstr "" - -#: doc/classes/ProceduralSky.xml:78 -msgid "Sky texture will be 4096x2048." -msgstr "" - -#: doc/classes/ProceduralSky.xml:81 -msgid "Represents the size of the [enum TextureSize] enum." -msgstr "" - #: doc/classes/ProgressBar.xml:4 msgid "General-purpose progress bar." msgstr "" @@ -38243,7 +38131,8 @@ msgstr "" #: doc/classes/ProjectSettings.xml:205 msgid "" "Icon set in [code].icns[/code] format used on macOS to set the game's icon. " -"This is done automatically on start by calling [method OS.set_native_icon]." +"This is done automatically on start by calling [method DisplayServer." +"set_native_icon]." msgstr "" #: doc/classes/ProjectSettings.xml:208 @@ -38275,7 +38164,8 @@ msgstr "" #: doc/classes/ProjectSettings.xml:218 msgid "" "Icon set in [code].ico[/code] format used on Windows to set the game's icon. " -"This is done automatically on start by calling [method OS.set_native_icon]." +"This is done automatically on start by calling [method DisplayServer." +"set_native_icon]." msgstr "" #: doc/classes/ProjectSettings.xml:221 @@ -38361,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 @@ -38676,59 +38580,48 @@ msgid "" msgstr "" #: doc/classes/ProjectSettings.xml:430 -msgid "" -"If [code]true[/code], allows per-pixel transparency in a desktop window. " -"This affects performance, so leave it on [code]false[/code] unless you need " -"it." -msgstr "" - -#: doc/classes/ProjectSettings.xml:433 -msgid "Sets the window background to transparent when it starts." -msgstr "" - -#: doc/classes/ProjectSettings.xml:436 msgid "Force the window to be always on top." msgstr "" -#: doc/classes/ProjectSettings.xml:439 +#: doc/classes/ProjectSettings.xml:433 msgid "Force the window to be borderless." msgstr "" -#: doc/classes/ProjectSettings.xml:442 +#: doc/classes/ProjectSettings.xml:436 msgid "Sets the window to full screen when it starts." msgstr "" -#: doc/classes/ProjectSettings.xml:445 +#: doc/classes/ProjectSettings.xml:439 msgid "" "Sets the game's main viewport height. On desktop platforms, this is the " "default window size. Stretch mode settings also use this as a reference when " "enabled." msgstr "" -#: doc/classes/ProjectSettings.xml:448 +#: doc/classes/ProjectSettings.xml:442 msgid "Allows the window to be resizable by default." msgstr "" -#: doc/classes/ProjectSettings.xml:451 +#: doc/classes/ProjectSettings.xml:445 msgid "" "If greater than zero, overrides the window height when running the game. " "Useful for testing stretch modes." msgstr "" -#: doc/classes/ProjectSettings.xml:454 +#: doc/classes/ProjectSettings.xml:448 msgid "" "If greater than zero, overrides the window width when running the game. " "Useful for testing stretch modes." msgstr "" -#: doc/classes/ProjectSettings.xml:457 +#: doc/classes/ProjectSettings.xml:451 msgid "" "Sets the game's main viewport width. On desktop platforms, this is the " "default window size. Stretch mode settings also use this as a reference when " "enabled." msgstr "" -#: doc/classes/ProjectSettings.xml:460 +#: doc/classes/ProjectSettings.xml:454 msgid "" "If [code]true[/code], enables vertical synchronization. This eliminates " "tearing that may appear in moving scenes, at the cost of higher input " @@ -38737,7 +38630,7 @@ msgid "" "regardless (such as mobile platforms and HTML5)." msgstr "" -#: doc/classes/ProjectSettings.xml:463 +#: doc/classes/ProjectSettings.xml:457 msgid "" "If [code]Use Vsync[/code] is enabled and this setting is [code]true[/code], " "enables vertical synchronization via the operating system's window " @@ -38748,13 +38641,13 @@ msgid "" "framerate halving (e.g. from 60 FPS to 30 FPS) when using it." msgstr "" -#: doc/classes/ProjectSettings.xml:467 +#: doc/classes/ProjectSettings.xml:461 msgid "" "Search path for project-specific script templates. Script templates will be " "search both in the editor-specific path and in this project-specific path." msgstr "" -#: doc/classes/ProjectSettings.xml:470 +#: doc/classes/ProjectSettings.xml:464 msgid "" "Text-based file extensions to include in the script editor's \"Find in Files" "\" feature. You can add e.g. [code]tscn[/code] if you wish to also parse " @@ -38762,49 +38655,49 @@ msgid "" "serialized in the scene files." msgstr "" -#: doc/classes/ProjectSettings.xml:473 +#: doc/classes/ProjectSettings.xml:467 msgid "" "Default value for [member ScrollContainer.scroll_deadzone], which will be " "used for all [ScrollContainer]s unless overridden." msgstr "" -#: doc/classes/ProjectSettings.xml:476 +#: doc/classes/ProjectSettings.xml:470 msgid "" "If [code]true[/code], swaps OK and Cancel buttons in dialogs on Windows and " "UWP to follow interface conventions." msgstr "" -#: doc/classes/ProjectSettings.xml:479 +#: 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:482 +#: 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:485 +#: doc/classes/ProjectSettings.xml:481 msgid "If [code]true[/code], makes sure the theme used works with HiDPI." msgstr "" -#: doc/classes/ProjectSettings.xml:488 +#: doc/classes/ProjectSettings.xml:484 msgid "" "Timer setting for incremental search in [Tree], [ItemList], etc. controls " "(in milliseconds)." msgstr "" -#: doc/classes/ProjectSettings.xml:491 +#: doc/classes/ProjectSettings.xml:487 msgid "Timer for detecting idle in [TextEdit] (in seconds)." msgstr "" -#: doc/classes/ProjectSettings.xml:494 +#: doc/classes/ProjectSettings.xml:490 msgid "Default delay for tooltips (in seconds)." msgstr "" -#: doc/classes/ProjectSettings.xml:497 +#: doc/classes/ProjectSettings.xml:493 msgid "" "Default [InputEventAction] to confirm a focused button, menu or list item, " "or validate input.\n" @@ -38813,7 +38706,7 @@ msgid "" "to the action can however be modified." msgstr "" -#: doc/classes/ProjectSettings.xml:501 +#: 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 " @@ -38821,7 +38714,7 @@ msgid "" "to the action can however be modified." msgstr "" -#: doc/classes/ProjectSettings.xml:505 +#: 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 " @@ -38829,7 +38722,7 @@ msgid "" "to the action can however be modified." msgstr "" -#: doc/classes/ProjectSettings.xml:509 +#: 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 " @@ -38839,7 +38732,7 @@ msgid "" "to the action can however be modified." msgstr "" -#: doc/classes/ProjectSettings.xml:513 +#: 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" @@ -38848,7 +38741,7 @@ msgid "" "to the action can however be modified." msgstr "" -#: doc/classes/ProjectSettings.xml:517 +#: 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" @@ -38857,7 +38750,7 @@ msgid "" "to the action can however be modified." msgstr "" -#: doc/classes/ProjectSettings.xml:521 +#: 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 " @@ -38867,7 +38760,7 @@ msgid "" "to the action can however be modified." msgstr "" -#: doc/classes/ProjectSettings.xml:525 +#: 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 " @@ -38875,7 +38768,7 @@ msgid "" "to the action can however be modified." msgstr "" -#: doc/classes/ProjectSettings.xml:529 +#: 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 " @@ -38885,7 +38778,7 @@ msgid "" "to the action can however be modified." msgstr "" -#: doc/classes/ProjectSettings.xml:533 +#: 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 " @@ -38895,7 +38788,7 @@ msgid "" "to the action can however be modified." msgstr "" -#: doc/classes/ProjectSettings.xml:537 +#: 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 " @@ -38903,7 +38796,7 @@ msgid "" "to the action can however be modified." msgstr "" -#: doc/classes/ProjectSettings.xml:541 +#: doc/classes/ProjectSettings.xml:537 msgid "" "Default [InputEventAction] to select an item in a [Control] (e.g. in an " "[ItemList] or a [Tree]).\n" @@ -38912,7 +38805,7 @@ msgid "" "to the action can however be modified." msgstr "" -#: doc/classes/ProjectSettings.xml:545 +#: 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 " @@ -38920,371 +38813,371 @@ msgid "" "to the action can however be modified." msgstr "" -#: doc/classes/ProjectSettings.xml:549 +#: 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:552 +#: 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:555 +#: doc/classes/ProjectSettings.xml:551 msgid "Optional name for the 2D physics layer 1." msgstr "" -#: doc/classes/ProjectSettings.xml:558 +#: doc/classes/ProjectSettings.xml:554 msgid "Optional name for the 2D physics layer 10." msgstr "" -#: doc/classes/ProjectSettings.xml:561 +#: doc/classes/ProjectSettings.xml:557 msgid "Optional name for the 2D physics layer 11." msgstr "" -#: doc/classes/ProjectSettings.xml:564 +#: doc/classes/ProjectSettings.xml:560 msgid "Optional name for the 2D physics layer 12." msgstr "" -#: doc/classes/ProjectSettings.xml:567 +#: doc/classes/ProjectSettings.xml:563 msgid "Optional name for the 2D physics layer 13." msgstr "" -#: doc/classes/ProjectSettings.xml:570 +#: doc/classes/ProjectSettings.xml:566 msgid "Optional name for the 2D physics layer 14." msgstr "" -#: doc/classes/ProjectSettings.xml:573 +#: doc/classes/ProjectSettings.xml:569 msgid "Optional name for the 2D physics layer 15." msgstr "" -#: doc/classes/ProjectSettings.xml:576 +#: doc/classes/ProjectSettings.xml:572 msgid "Optional name for the 2D physics layer 16." msgstr "" -#: doc/classes/ProjectSettings.xml:579 +#: doc/classes/ProjectSettings.xml:575 msgid "Optional name for the 2D physics layer 17." msgstr "" -#: doc/classes/ProjectSettings.xml:582 +#: doc/classes/ProjectSettings.xml:578 msgid "Optional name for the 2D physics layer 18." msgstr "" -#: doc/classes/ProjectSettings.xml:585 +#: doc/classes/ProjectSettings.xml:581 msgid "Optional name for the 2D physics layer 19." msgstr "" -#: doc/classes/ProjectSettings.xml:588 +#: doc/classes/ProjectSettings.xml:584 msgid "Optional name for the 2D physics layer 2." msgstr "" -#: doc/classes/ProjectSettings.xml:591 +#: doc/classes/ProjectSettings.xml:587 msgid "Optional name for the 2D physics layer 20." msgstr "" -#: doc/classes/ProjectSettings.xml:594 +#: doc/classes/ProjectSettings.xml:590 msgid "Optional name for the 2D physics layer 3." msgstr "" -#: doc/classes/ProjectSettings.xml:597 +#: doc/classes/ProjectSettings.xml:593 msgid "Optional name for the 2D physics layer 4." msgstr "" -#: doc/classes/ProjectSettings.xml:600 +#: doc/classes/ProjectSettings.xml:596 msgid "Optional name for the 2D physics layer 5." msgstr "" -#: doc/classes/ProjectSettings.xml:603 +#: doc/classes/ProjectSettings.xml:599 msgid "Optional name for the 2D physics layer 6." msgstr "" -#: doc/classes/ProjectSettings.xml:606 +#: doc/classes/ProjectSettings.xml:602 msgid "Optional name for the 2D physics layer 7." msgstr "" -#: doc/classes/ProjectSettings.xml:609 +#: doc/classes/ProjectSettings.xml:605 msgid "Optional name for the 2D physics layer 8." msgstr "" -#: doc/classes/ProjectSettings.xml:612 +#: doc/classes/ProjectSettings.xml:608 msgid "Optional name for the 2D physics layer 9." msgstr "" -#: doc/classes/ProjectSettings.xml:615 +#: doc/classes/ProjectSettings.xml:611 msgid "Optional name for the 2D render layer 1." msgstr "" -#: doc/classes/ProjectSettings.xml:618 +#: doc/classes/ProjectSettings.xml:614 msgid "Optional name for the 2D render layer 10." msgstr "" -#: doc/classes/ProjectSettings.xml:621 +#: doc/classes/ProjectSettings.xml:617 msgid "Optional name for the 2D render layer 11." msgstr "" -#: doc/classes/ProjectSettings.xml:624 +#: doc/classes/ProjectSettings.xml:620 msgid "Optional name for the 2D render layer 12." msgstr "" -#: doc/classes/ProjectSettings.xml:627 +#: doc/classes/ProjectSettings.xml:623 msgid "Optional name for the 2D render layer 13." msgstr "" -#: doc/classes/ProjectSettings.xml:630 +#: doc/classes/ProjectSettings.xml:626 msgid "Optional name for the 2D render layer 14." msgstr "" -#: doc/classes/ProjectSettings.xml:633 +#: doc/classes/ProjectSettings.xml:629 msgid "Optional name for the 2D render layer 15." msgstr "" -#: doc/classes/ProjectSettings.xml:636 +#: doc/classes/ProjectSettings.xml:632 msgid "Optional name for the 2D render layer 16." msgstr "" -#: doc/classes/ProjectSettings.xml:639 +#: doc/classes/ProjectSettings.xml:635 msgid "Optional name for the 2D render layer 17." msgstr "" -#: doc/classes/ProjectSettings.xml:642 +#: doc/classes/ProjectSettings.xml:638 msgid "Optional name for the 2D render layer 18." msgstr "" -#: doc/classes/ProjectSettings.xml:645 +#: doc/classes/ProjectSettings.xml:641 msgid "Optional name for the 2D render layer 19." msgstr "" -#: doc/classes/ProjectSettings.xml:648 +#: doc/classes/ProjectSettings.xml:644 msgid "Optional name for the 2D render layer 2." msgstr "" -#: doc/classes/ProjectSettings.xml:651 +#: doc/classes/ProjectSettings.xml:647 msgid "Optional name for the 2D render layer 20." msgstr "" -#: doc/classes/ProjectSettings.xml:654 +#: doc/classes/ProjectSettings.xml:650 msgid "Optional name for the 2D render layer 3." msgstr "" -#: doc/classes/ProjectSettings.xml:657 +#: doc/classes/ProjectSettings.xml:653 msgid "Optional name for the 2D render layer 4." msgstr "" -#: doc/classes/ProjectSettings.xml:660 +#: doc/classes/ProjectSettings.xml:656 msgid "Optional name for the 2D render layer 5." msgstr "" -#: doc/classes/ProjectSettings.xml:663 +#: doc/classes/ProjectSettings.xml:659 msgid "Optional name for the 2D render layer 6." msgstr "" -#: doc/classes/ProjectSettings.xml:666 +#: doc/classes/ProjectSettings.xml:662 msgid "Optional name for the 2D render layer 7." msgstr "" -#: doc/classes/ProjectSettings.xml:669 +#: doc/classes/ProjectSettings.xml:665 msgid "Optional name for the 2D render layer 8." msgstr "" -#: doc/classes/ProjectSettings.xml:672 +#: doc/classes/ProjectSettings.xml:668 msgid "Optional name for the 2D render layer 9." msgstr "" -#: doc/classes/ProjectSettings.xml:675 +#: doc/classes/ProjectSettings.xml:671 msgid "Optional name for the 3D physics layer 1." msgstr "" -#: doc/classes/ProjectSettings.xml:678 +#: doc/classes/ProjectSettings.xml:674 msgid "Optional name for the 3D physics layer 10." msgstr "" -#: doc/classes/ProjectSettings.xml:681 +#: doc/classes/ProjectSettings.xml:677 msgid "Optional name for the 3D physics layer 11." msgstr "" -#: doc/classes/ProjectSettings.xml:684 +#: doc/classes/ProjectSettings.xml:680 msgid "Optional name for the 3D physics layer 12." msgstr "" -#: doc/classes/ProjectSettings.xml:687 +#: doc/classes/ProjectSettings.xml:683 msgid "Optional name for the 3D physics layer 13." msgstr "" -#: doc/classes/ProjectSettings.xml:690 +#: doc/classes/ProjectSettings.xml:686 msgid "Optional name for the 3D physics layer 14." msgstr "" -#: doc/classes/ProjectSettings.xml:693 +#: doc/classes/ProjectSettings.xml:689 msgid "Optional name for the 3D physics layer 15." msgstr "" -#: doc/classes/ProjectSettings.xml:696 +#: doc/classes/ProjectSettings.xml:692 msgid "Optional name for the 3D physics layer 16." msgstr "" -#: doc/classes/ProjectSettings.xml:699 +#: doc/classes/ProjectSettings.xml:695 msgid "Optional name for the 3D physics layer 17." msgstr "" -#: doc/classes/ProjectSettings.xml:702 +#: doc/classes/ProjectSettings.xml:698 msgid "Optional name for the 3D physics layer 18." msgstr "" -#: doc/classes/ProjectSettings.xml:705 +#: doc/classes/ProjectSettings.xml:701 msgid "Optional name for the 3D physics layer 19." msgstr "" -#: doc/classes/ProjectSettings.xml:708 +#: doc/classes/ProjectSettings.xml:704 msgid "Optional name for the 3D physics layer 2." msgstr "" -#: doc/classes/ProjectSettings.xml:711 +#: doc/classes/ProjectSettings.xml:707 msgid "Optional name for the 3D physics layer 20." msgstr "" -#: doc/classes/ProjectSettings.xml:714 +#: doc/classes/ProjectSettings.xml:710 msgid "Optional name for the 3D physics layer 3." msgstr "" -#: doc/classes/ProjectSettings.xml:717 +#: doc/classes/ProjectSettings.xml:713 msgid "Optional name for the 3D physics layer 4." msgstr "" -#: doc/classes/ProjectSettings.xml:720 +#: doc/classes/ProjectSettings.xml:716 msgid "Optional name for the 3D physics layer 5." msgstr "" -#: doc/classes/ProjectSettings.xml:723 +#: doc/classes/ProjectSettings.xml:719 msgid "Optional name for the 3D physics layer 6." msgstr "" -#: doc/classes/ProjectSettings.xml:726 +#: doc/classes/ProjectSettings.xml:722 msgid "Optional name for the 3D physics layer 7." msgstr "" -#: doc/classes/ProjectSettings.xml:729 +#: doc/classes/ProjectSettings.xml:725 msgid "Optional name for the 3D physics layer 8." msgstr "" -#: doc/classes/ProjectSettings.xml:732 +#: doc/classes/ProjectSettings.xml:728 msgid "Optional name for the 3D physics layer 9." msgstr "" -#: doc/classes/ProjectSettings.xml:735 +#: doc/classes/ProjectSettings.xml:731 msgid "Optional name for the 3D render layer 1." msgstr "" -#: doc/classes/ProjectSettings.xml:738 +#: doc/classes/ProjectSettings.xml:734 msgid "Optional name for the 3D render layer 10." msgstr "" -#: doc/classes/ProjectSettings.xml:741 +#: doc/classes/ProjectSettings.xml:737 msgid "Optional name for the 3D render layer 11." msgstr "" -#: doc/classes/ProjectSettings.xml:744 +#: doc/classes/ProjectSettings.xml:740 msgid "Optional name for the 3D render layer 12." msgstr "" -#: doc/classes/ProjectSettings.xml:747 +#: doc/classes/ProjectSettings.xml:743 msgid "Optional name for the 3D render layer 13." msgstr "" -#: doc/classes/ProjectSettings.xml:750 +#: doc/classes/ProjectSettings.xml:746 msgid "Optional name for the 3D render layer 14" msgstr "" -#: doc/classes/ProjectSettings.xml:753 +#: doc/classes/ProjectSettings.xml:749 msgid "Optional name for the 3D render layer 15." msgstr "" -#: doc/classes/ProjectSettings.xml:756 +#: doc/classes/ProjectSettings.xml:752 msgid "Optional name for the 3D render layer 16." msgstr "" -#: doc/classes/ProjectSettings.xml:759 +#: doc/classes/ProjectSettings.xml:755 msgid "Optional name for the 3D render layer 17." msgstr "" -#: doc/classes/ProjectSettings.xml:762 +#: doc/classes/ProjectSettings.xml:758 msgid "Optional name for the 3D render layer 18." msgstr "" -#: doc/classes/ProjectSettings.xml:765 +#: doc/classes/ProjectSettings.xml:761 msgid "Optional name for the 3D render layer 19." msgstr "" -#: doc/classes/ProjectSettings.xml:768 +#: doc/classes/ProjectSettings.xml:764 msgid "Optional name for the 3D render layer 2." msgstr "" -#: doc/classes/ProjectSettings.xml:771 +#: doc/classes/ProjectSettings.xml:767 msgid "Optional name for the 3D render layer 20." msgstr "" -#: doc/classes/ProjectSettings.xml:774 +#: doc/classes/ProjectSettings.xml:770 msgid "Optional name for the 3D render layer 3." msgstr "" -#: doc/classes/ProjectSettings.xml:777 +#: doc/classes/ProjectSettings.xml:773 msgid "Optional name for the 3D render layer 4." msgstr "" -#: doc/classes/ProjectSettings.xml:780 +#: doc/classes/ProjectSettings.xml:776 msgid "Optional name for the 3D render layer 5." msgstr "" -#: doc/classes/ProjectSettings.xml:783 +#: doc/classes/ProjectSettings.xml:779 msgid "Optional name for the 3D render layer 6." msgstr "" -#: doc/classes/ProjectSettings.xml:786 +#: doc/classes/ProjectSettings.xml:782 msgid "Optional name for the 3D render layer 7." msgstr "" -#: doc/classes/ProjectSettings.xml:789 +#: doc/classes/ProjectSettings.xml:785 msgid "Optional name for the 3D render layer 8." msgstr "" -#: doc/classes/ProjectSettings.xml:792 +#: doc/classes/ProjectSettings.xml:788 msgid "Optional name for the 3D render layer 9." msgstr "" -#: doc/classes/ProjectSettings.xml:795 +#: 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:798 +#: 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:801 +#: doc/classes/ProjectSettings.xml:797 msgid "If [code]true[/code], logs all output to files." msgstr "" -#: doc/classes/ProjectSettings.xml:804 +#: 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:807 +#: doc/classes/ProjectSettings.xml:803 msgid "Specifies the maximum amount of log files allowed (used for rotation)." msgstr "" -#: doc/classes/ProjectSettings.xml:810 +#: 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:813 +#: 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 " @@ -39292,173 +39185,173 @@ msgid "" "thread, increase this number." msgstr "" -#: doc/classes/ProjectSettings.xml:828 +#: 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:831 +#: 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:834 +#: 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:837 +#: 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:840 +#: 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:843 +#: doc/classes/ProjectSettings.xml:839 msgid "Timeout (in seconds) for connection attempts using TCP." msgstr "" -#: doc/classes/ProjectSettings.xml:846 +#: doc/classes/ProjectSettings.xml:842 msgid "Maximum size (in kiB) for the [WebRTCDataChannel] input buffer." msgstr "" -#: doc/classes/ProjectSettings.xml:849 +#: doc/classes/ProjectSettings.xml:845 msgid "Maximum size (in kiB) for the [WebSocketClient] input buffer." msgstr "" -#: doc/classes/ProjectSettings.xml:852 +#: doc/classes/ProjectSettings.xml:848 msgid "Maximum number of concurrent input packets for [WebSocketClient]." msgstr "" -#: doc/classes/ProjectSettings.xml:855 +#: doc/classes/ProjectSettings.xml:851 msgid "Maximum size (in kiB) for the [WebSocketClient] output buffer." msgstr "" -#: doc/classes/ProjectSettings.xml:858 +#: doc/classes/ProjectSettings.xml:854 msgid "Maximum number of concurrent output packets for [WebSocketClient]." msgstr "" -#: doc/classes/ProjectSettings.xml:861 +#: doc/classes/ProjectSettings.xml:857 msgid "Maximum size (in kiB) for the [WebSocketServer] input buffer." msgstr "" -#: doc/classes/ProjectSettings.xml:864 +#: doc/classes/ProjectSettings.xml:860 msgid "Maximum number of concurrent input packets for [WebSocketServer]." msgstr "" -#: doc/classes/ProjectSettings.xml:867 +#: doc/classes/ProjectSettings.xml:863 msgid "Maximum size (in kiB) for the [WebSocketServer] output buffer." msgstr "" -#: doc/classes/ProjectSettings.xml:870 +#: doc/classes/ProjectSettings.xml:866 msgid "Maximum number of concurrent output packets for [WebSocketServer]." msgstr "" -#: doc/classes/ProjectSettings.xml:873 +#: 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:876 +#: doc/classes/ProjectSettings.xml:872 msgid "Page size used by remote filesystem (in bytes)." msgstr "" -#: doc/classes/ProjectSettings.xml:879 +#: 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:882 +#: 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:885 +#: 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:888 +#: 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:891 +#: doc/classes/ProjectSettings.xml:887 msgid "Cell size used for the broad-phase 2D hash grid algorithm." msgstr "" -#: doc/classes/ProjectSettings.xml:894 +#: doc/classes/ProjectSettings.xml:890 msgid "The default angular damp in 2D." msgstr "" -#: doc/classes/ProjectSettings.xml:897 +#: 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 " "the default gravity at runtime, use the following code sample:\n" "[codeblock]\n" "# Set the default gravity strength to 98.\n" -"Physics2DServer.area_set_param(get_viewport().find_world_2d().get_space(), " -"Physics2DServer.AREA_PARAM_GRAVITY, 98)\n" +"PhysicsServer2D.area_set_param(get_viewport().find_world_2d().get_space(), " +"PhysicsServer2D.AREA_PARAM_GRAVITY, 98)\n" "[/codeblock]" msgstr "" -#: doc/classes/ProjectSettings.xml:905 +#: 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 " "the default gravity vector at runtime, use the following code sample:\n" "[codeblock]\n" "# Set the default gravity direction to `Vector2(0, 1)`.\n" -"Physics2DServer.area_set_param(get_viewport().find_world_2d().get_space(), " -"Physics2DServer.AREA_PARAM_GRAVITY_VECTOR, Vector2(0, 1))\n" +"PhysicsServer2D.area_set_param(get_viewport().find_world_2d().get_space(), " +"PhysicsServer2D.AREA_PARAM_GRAVITY_VECTOR, Vector2(0, 1))\n" "[/codeblock]" msgstr "" -#: doc/classes/ProjectSettings.xml:913 +#: doc/classes/ProjectSettings.xml:909 msgid "The default linear damp in 2D." msgstr "" -#: doc/classes/ProjectSettings.xml:916 +#: 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:919 +#: 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:923 +#: doc/classes/ProjectSettings.xml:919 msgid "" "Threshold angular velocity under which a 2D physics body will be considered " -"inactive. See [constant Physics2DServer." +"inactive. See [constant PhysicsServer2D." "SPACE_PARAM_BODY_ANGULAR_VELOCITY_SLEEP_THRESHOLD]." msgstr "" -#: doc/classes/ProjectSettings.xml:926 +#: doc/classes/ProjectSettings.xml:922 msgid "" "Threshold linear velocity under which a 2D physics body will be considered " -"inactive. See [constant Physics2DServer." +"inactive. See [constant PhysicsServer2D." "SPACE_PARAM_BODY_LINEAR_VELOCITY_SLEEP_THRESHOLD]." msgstr "" -#: doc/classes/ProjectSettings.xml:929 +#: 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 " @@ -39468,63 +39361,63 @@ msgid "" "give you extra performance and no regressions when using it." msgstr "" -#: doc/classes/ProjectSettings.xml:933 +#: doc/classes/ProjectSettings.xml:929 msgid "" "Time (in seconds) of inactivity before which a 2D physics body will put to " -"sleep. See [constant Physics2DServer.SPACE_PARAM_BODY_TIME_TO_SLEEP]." +"sleep. See [constant PhysicsServer2D.SPACE_PARAM_BODY_TIME_TO_SLEEP]." msgstr "" -#: doc/classes/ProjectSettings.xml:936 +#: doc/classes/ProjectSettings.xml:932 msgid "" "Sets whether the 3D physics world will be created with support for " -"[SoftBody] physics. Only applies to the Bullet physics engine." +"[SoftBody3D] physics. Only applies to the Bullet physics engine." msgstr "" -#: doc/classes/ProjectSettings.xml:939 +#: doc/classes/ProjectSettings.xml:935 msgid "The default angular damp in 3D." msgstr "" -#: doc/classes/ProjectSettings.xml:942 +#: 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 " "the default gravity at runtime, use the following code sample:\n" "[codeblock]\n" "# Set the default gravity strength to 9.8.\n" -"PhysicsServer.area_set_param(get_viewport().find_world().get_space(), " -"PhysicsServer.AREA_PARAM_GRAVITY, 9.8)\n" +"PhysicsServer3D.area_set_param(get_viewport().find_world().get_space(), " +"PhysicsServer3D.AREA_PARAM_GRAVITY, 9.8)\n" "[/codeblock]" msgstr "" -#: doc/classes/ProjectSettings.xml:950 +#: 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 " "the default gravity vector at runtime, use the following code sample:\n" "[codeblock]\n" "# Set the default gravity direction to `Vector3(0, -1, 0)`.\n" -"PhysicsServer.area_set_param(get_viewport().find_world().get_space(), " -"PhysicsServer.AREA_PARAM_GRAVITY_VECTOR, Vector3(0, -1, 0))\n" +"PhysicsServer3D.area_set_param(get_viewport().find_world().get_space(), " +"PhysicsServer3D.AREA_PARAM_GRAVITY_VECTOR, Vector3(0, -1, 0))\n" "[/codeblock]" msgstr "" -#: doc/classes/ProjectSettings.xml:958 +#: doc/classes/ProjectSettings.xml:954 msgid "The default linear damp in 3D." msgstr "" -#: doc/classes/ProjectSettings.xml:961 +#: 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:965 +#: doc/classes/ProjectSettings.xml:961 msgid "Enables [member Viewport.physics_object_picking] on the root viewport." msgstr "" -#: doc/classes/ProjectSettings.xml:968 +#: 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" @@ -39533,7 +39426,7 @@ msgid "" "instead." msgstr "" -#: doc/classes/ProjectSettings.xml:972 +#: doc/classes/ProjectSettings.xml:968 msgid "" "Fix to improve physics jitter, specially on monitors where refresh rate is " "different than the physics FPS.\n" @@ -39541,15 +39434,15 @@ msgid "" "the physics FPS at runtime, set [member Engine.physics_jitter_fix] instead." msgstr "" -#: doc/classes/ProjectSettings.xml:976 +#: doc/classes/ProjectSettings.xml:972 msgid "" "Default background clear color. Overridable per [Viewport] using its " "[Environment]. See [member Environment.background_mode] and [member " "Environment.background_color] in particular. To change this default color " -"programmatically, use [method VisualServer.set_default_clear_color]." +"programmatically, use [method RenderingServer.set_default_clear_color]." msgstr "" -#: doc/classes/ProjectSettings.xml:979 +#: 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 " @@ -39559,7 +39452,7 @@ msgid "" "here." msgstr "" -#: doc/classes/ProjectSettings.xml:982 +#: 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 " @@ -39586,58 +39479,101 @@ msgstr "" #: 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:995 +#: 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:998 +#: 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:1001 +#: 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:1004 +#: 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]--" -"video-driver[/code] command line argument. In such cases, this property is " -"not updated, so use [method OS.get_current_video_driver] to query it at run-" -"time." +"rendering-driver[/code] command line argument.\n" +"[b]FIXME:[/b] No longer valid after DisplayServer split:\n" +"In such cases, this property is not updated, so use [code]OS." +"get_current_video_driver[/code] to query it at run-time." msgstr "" -#: doc/classes/ProjectSettings.xml:1016 +#: 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:1024 +#: 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 " @@ -39646,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 " @@ -39690,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 " @@ -39711,129 +39647,230 @@ 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:1064 +#: 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:1067 +#: 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:1070 +#: 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:1073 +#: 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:1076 +#: 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:1079 +#: 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:1082 doc/classes/ProjectSettings.xml:1085 -#: doc/classes/ProjectSettings.xml:1088 doc/classes/ProjectSettings.xml:1091 +#: 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:1094 +#: doc/classes/ProjectSettings.xml:1117 msgid "" "Size for shadow atlas (used for OmniLights and SpotLights). See " "documentation." msgstr "" -#: doc/classes/ProjectSettings.xml:1097 +#: 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:1100 +#: 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:1103 +#: 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: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:1110 +#: 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:1113 +#: 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:1116 +#: 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:1119 +#: 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:1122 +#: 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:1125 +#: 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/ProximityGroup.xml:4 doc/classes/ProximityGroup.xml:7 +#: 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 "" @@ -40143,220 +40180,221 @@ msgstr "" msgid "Emitted when [member value] changes." msgstr "" -#: doc/classes/RayCast.xml:4 doc/classes/RayCast2D.xml:4 +#: doc/classes/RayCast2D.xml:4 doc/classes/RayCast3D.xml:4 msgid "Query the closest object intersecting a ray." msgstr "" -#: doc/classes/RayCast.xml:7 +#: doc/classes/RayCast2D.xml:7 msgid "" "A RayCast represents a line from its origin to its destination position, " -"[code]cast_to[/code]. It is used to query the 3D space in order to find the " +"[code]cast_to[/code]. It is used to query the 2D space in order to find the " "closest object along the path of the ray.\n" -"RayCast can ignore some objects by adding them to the exception list via " -"[code]add_exception[/code] or by setting proper filtering with collision " -"layers and masks.\n" -"RayCast can be configured to report collisions with [Area]s ([member " -"collide_with_areas]) and/or [PhysicsBody]s ([member collide_with_bodies]).\n" +"RayCast2D can ignore some objects by adding them to the exception list via " +"[code]add_exception[/code], by setting proper filtering with collision " +"layers, or by filtering object types with type masks.\n" +"RayCast2D can be configured to report collisions with [Area2D]s ([member " +"collide_with_areas]) and/or [PhysicsBody2D]s ([member " +"collide_with_bodies]).\n" "Only enabled raycasts will be able to query the space and report " "collisions.\n" -"RayCast calculates intersection every physics frame (see [Node]), and the " +"RayCast2D calculates intersection every physics frame (see [Node]), and the " "result is cached so it can be used later until the next frame. If multiple " -"queries are required between physics frames (or during the same frame), use " +"queries are required between physics frames (or during the same frame) use " "[method force_raycast_update] after adjusting the raycast." msgstr "" -#: doc/classes/RayCast.xml:23 doc/classes/RayCast2D.xml:23 +#: doc/classes/RayCast2D.xml:23 doc/classes/RayCast3D.xml:23 msgid "" "Adds a collision exception so the ray does not report collisions with the " "specified node." msgstr "" -#: doc/classes/RayCast.xml:32 doc/classes/RayCast2D.xml:32 +#: doc/classes/RayCast2D.xml:32 doc/classes/RayCast3D.xml:32 msgid "" "Adds a collision exception so the ray does not report collisions with the " "specified [RID]." msgstr "" -#: doc/classes/RayCast.xml:39 doc/classes/RayCast2D.xml:39 +#: doc/classes/RayCast2D.xml:39 doc/classes/RayCast3D.xml:39 msgid "Removes all collision exceptions for this ray." msgstr "" -#: doc/classes/RayCast.xml:46 +#: doc/classes/RayCast2D.xml:46 msgid "" -"Updates the collision information for the ray.\n" -"Use this method to update the collision information immediately instead of " -"waiting for the next [code]_physics_process[/code] call, for example if the " -"ray or its parent has changed state.\n" +"Updates the collision information for the ray. Use this method to update the " +"collision information immediately instead of waiting for the next " +"[code]_physics_process[/code] call, for example if the ray or its parent has " +"changed state.\n" "[b]Note:[/b] [code]enabled == true[/code] is not required for this to work." msgstr "" -#: doc/classes/RayCast.xml:55 doc/classes/RayCast2D.xml:54 +#: doc/classes/RayCast2D.xml:54 doc/classes/RayCast3D.xml:55 msgid "" "Returns the first object that the ray intersects, or [code]null[/code] if no " "object is intersecting the ray (i.e. [method is_colliding] returns " "[code]false[/code])." msgstr "" -#: doc/classes/RayCast.xml:62 doc/classes/RayCast2D.xml:61 +#: doc/classes/RayCast2D.xml:61 doc/classes/RayCast3D.xml:62 msgid "" "Returns the shape ID of the first object that the ray intersects, or " "[code]0[/code] if no object is intersecting the ray (i.e. [method " "is_colliding] returns [code]false[/code])." msgstr "" -#: doc/classes/RayCast.xml:71 -msgid "" -"Returns [code]true[/code] if the bit index passed is turned on.\n" -"[b]Note:[/b] Bit indices range from 0-19." -msgstr "" - -#: doc/classes/RayCast.xml:79 doc/classes/RayCast2D.xml:77 +#: doc/classes/RayCast2D.xml:77 doc/classes/RayCast3D.xml:79 msgid "" "Returns the normal of the intersecting object's shape at the collision point." msgstr "" -#: doc/classes/RayCast.xml:86 +#: doc/classes/RayCast2D.xml:84 msgid "" "Returns the collision point at which the ray intersects the closest object.\n" -"[b]Note:[/b] This point is in the [b]global[/b] coordinate system." +"[b]Note:[/b] this point is in the [b]global[/b] coordinate system." msgstr "" -#: doc/classes/RayCast.xml:94 doc/classes/RayCast2D.xml:92 +#: doc/classes/RayCast2D.xml:92 doc/classes/RayCast3D.xml:94 msgid "" "Returns whether any object is intersecting with the ray's vector " "(considering the vector length)." msgstr "" -#: doc/classes/RayCast.xml:103 doc/classes/RayCast2D.xml:101 +#: doc/classes/RayCast2D.xml:101 doc/classes/RayCast3D.xml:103 msgid "" "Removes a collision exception so the ray does report collisions with the " "specified node." msgstr "" -#: doc/classes/RayCast.xml:112 doc/classes/RayCast2D.xml:110 +#: doc/classes/RayCast2D.xml:110 doc/classes/RayCast3D.xml:112 msgid "" "Removes a collision exception so the ray does report collisions with the " "specified [RID]." msgstr "" -#: doc/classes/RayCast.xml:123 +#: doc/classes/RayCast2D.xml:121 msgid "" -"Sets the bit index passed to the [code]value[/code] passed.\n" -"[b]Note:[/b] Bit indexes range from 0-19." +"Sets or clears individual bits on the collision mask. This makes selecting " +"the areas scanned easier." msgstr "" -#: doc/classes/RayCast.xml:130 doc/classes/RayCast2D.xml:127 +#: doc/classes/RayCast2D.xml:127 doc/classes/RayCast3D.xml:130 msgid "" "The ray's destination point, relative to the RayCast's [code]position[/code]." msgstr "" -#: doc/classes/RayCast.xml:133 -msgid "If [code]true[/code], collision with [Area]s will be reported." +#: doc/classes/RayCast2D.xml:130 +msgid "If [code]true[/code], collision with [Area2D]s will be reported." msgstr "" -#: doc/classes/RayCast.xml:136 -msgid "If [code]true[/code], collision with [PhysicsBody]s will be reported." +#: doc/classes/RayCast2D.xml:133 +msgid "If [code]true[/code], collision with [PhysicsBody2D]s will be reported." msgstr "" -#: doc/classes/RayCast.xml:139 doc/classes/RayCast2D.xml:136 +#: doc/classes/RayCast2D.xml:136 doc/classes/RayCast3D.xml:139 msgid "" "The ray's collision mask. Only objects in at least one collision layer " "enabled in the mask will be detected." msgstr "" -#: doc/classes/RayCast.xml:142 doc/classes/RayCast2D.xml:139 +#: doc/classes/RayCast2D.xml:139 doc/classes/RayCast3D.xml:142 msgid "If [code]true[/code], collisions will be reported." msgstr "" -#: doc/classes/RayCast.xml:145 +#: doc/classes/RayCast2D.xml:142 msgid "" -"If [code]true[/code], collisions will be ignored for this RayCast's " -"immediate parent." +"If [code]true[/code], the parent node will be excluded from collision " +"detection." msgstr "" -#: doc/classes/RayCast2D.xml:7 +#: doc/classes/RayCast3D.xml:7 msgid "" "A RayCast represents a line from its origin to its destination position, " -"[code]cast_to[/code]. It is used to query the 2D space in order to find the " +"[code]cast_to[/code]. It is used to query the 3D space in order to find the " "closest object along the path of the ray.\n" -"RayCast2D can ignore some objects by adding them to the exception list via " -"[code]add_exception[/code], by setting proper filtering with collision " -"layers, or by filtering object types with type masks.\n" -"RayCast2D can be configured to report collisions with [Area2D]s ([member " -"collide_with_areas]) and/or [PhysicsBody2D]s ([member " +"RayCast3D can ignore some objects by adding them to the exception list via " +"[code]add_exception[/code] or by setting proper filtering with collision " +"layers and masks.\n" +"RayCast3D can be configured to report collisions with [Area3D]s ([member " +"collide_with_areas]) and/or [PhysicsBody3D]s ([member " "collide_with_bodies]).\n" "Only enabled raycasts will be able to query the space and report " "collisions.\n" -"RayCast2D calculates intersection every physics frame (see [Node]), and the " +"RayCast3D calculates intersection every physics frame (see [Node]), and the " "result is cached so it can be used later until the next frame. If multiple " -"queries are required between physics frames (or during the same frame) use " +"queries are required between physics frames (or during the same frame), use " "[method force_raycast_update] after adjusting the raycast." msgstr "" -#: doc/classes/RayCast2D.xml:46 +#: doc/classes/RayCast3D.xml:46 msgid "" -"Updates the collision information for the ray. Use this method to update the " -"collision information immediately instead of waiting for the next " -"[code]_physics_process[/code] call, for example if the ray or its parent has " -"changed state.\n" +"Updates the collision information for the ray.\n" +"Use this method to update the collision information immediately instead of " +"waiting for the next [code]_physics_process[/code] call, for example if the " +"ray or its parent has changed state.\n" "[b]Note:[/b] [code]enabled == true[/code] is not required for this to work." msgstr "" -#: doc/classes/RayCast2D.xml:84 +#: doc/classes/RayCast3D.xml:71 +msgid "" +"Returns [code]true[/code] if the bit index passed is turned on.\n" +"[b]Note:[/b] Bit indices range from 0-19." +msgstr "" + +#: doc/classes/RayCast3D.xml:86 msgid "" "Returns the collision point at which the ray intersects the closest object.\n" -"[b]Note:[/b] this point is in the [b]global[/b] coordinate system." +"[b]Note:[/b] This point is in the [b]global[/b] coordinate system." msgstr "" -#: doc/classes/RayCast2D.xml:121 +#: doc/classes/RayCast3D.xml:123 msgid "" -"Sets or clears individual bits on the collision mask. This makes selecting " -"the areas scanned easier." +"Sets the bit index passed to the [code]value[/code] passed.\n" +"[b]Note:[/b] Bit indexes range from 0-19." msgstr "" -#: doc/classes/RayCast2D.xml:130 -msgid "If [code]true[/code], collision with [Area2D]s will be reported." +#: doc/classes/RayCast3D.xml:133 +msgid "If [code]true[/code], collision with [Area3D]s will be reported." msgstr "" -#: doc/classes/RayCast2D.xml:133 -msgid "If [code]true[/code], collision with [PhysicsBody2D]s will be reported." +#: doc/classes/RayCast3D.xml:136 +msgid "If [code]true[/code], collision with [PhysicsBody3D]s will be reported." msgstr "" -#: doc/classes/RayCast2D.xml:142 +#: doc/classes/RayCast3D.xml:145 msgid "" -"If [code]true[/code], the parent node will be excluded from collision " -"detection." +"If [code]true[/code], collisions will be ignored for this RayCast3D's " +"immediate parent." msgstr "" -#: doc/classes/RayShape.xml:4 -msgid "Ray shape for 3D collisions." +#: doc/classes/RayShape2D.xml:4 +msgid "Ray shape for 2D collisions." msgstr "" -#: doc/classes/RayShape.xml:7 +#: doc/classes/RayShape2D.xml:7 msgid "" -"Ray shape for 3D collisions, which can be set into a [PhysicsBody] or " -"[Area]. A ray is not really a collision body; instead, it tries to separate " -"itself from whatever is touching its far endpoint. It's often useful for " -"characters." +"Ray shape for 2D collisions. A ray is not really a collision body; instead, " +"it tries to separate itself from whatever is touching its far endpoint. It's " +"often useful for characters." msgstr "" -#: doc/classes/RayShape.xml:15 doc/classes/RayShape2D.xml:15 +#: doc/classes/RayShape2D.xml:15 doc/classes/RayShape3D.xml:15 msgid "The ray's length." msgstr "" -#: doc/classes/RayShape.xml:18 doc/classes/RayShape2D.xml:18 +#: doc/classes/RayShape2D.xml:18 doc/classes/RayShape3D.xml:18 msgid "If [code]true[/code], allow the shape to return the correct normal." msgstr "" -#: doc/classes/RayShape2D.xml:4 -msgid "Ray shape for 2D collisions." +#: doc/classes/RayShape3D.xml:4 +msgid "Ray shape for 3D collisions." msgstr "" -#: doc/classes/RayShape2D.xml:7 +#: doc/classes/RayShape3D.xml:7 msgid "" -"Ray shape for 2D collisions. A ray is not really a collision body; instead, " -"it tries to separate itself from whatever is touching its far endpoint. It's " -"often useful for characters." +"Ray shape for 3D collisions, which can be set into a [PhysicsBody3D] or " +"[Area3D]. A ray is not really a collision body; instead, it tries to " +"separate itself from whatever is touching its far endpoint. It's often " +"useful for characters." msgstr "" #: doc/classes/Rect2.xml:4 @@ -40590,7 +40628,7 @@ msgstr "" #: doc/classes/ReflectionProbe.xml:20 msgid "" "Sets the cull mask which determines what objects are drawn by this probe. " -"Every [VisualInstance] with a layer included in this cull mask will be " +"Every [VisualInstance3D] with a layer included in this cull mask will be " "rendered by the probe. It is best to only include large objects which are " "likely to take up a lot of space in the reflection in order to save on " "rendering cost." @@ -40854,78 +40892,2477 @@ msgid "" "The source string used with the search pattern to find this matching result." msgstr "" -#: doc/classes/RemoteTransform.xml:4 +#: doc/classes/RemoteTransform2D.xml:4 msgid "" -"RemoteTransform pushes its own [Transform] to another [Spatial] derived Node " -"in the scene." +"RemoteTransform2D pushes its own [Transform2D] to another [CanvasItem] " +"derived Node in the scene." msgstr "" -#: doc/classes/RemoteTransform.xml:7 +#: doc/classes/RemoteTransform2D.xml:7 msgid "" -"RemoteTransform pushes its own [Transform] to another [Spatial] derived Node " -"(called the remote node) in the scene.\n" +"RemoteTransform2D pushes its own [Transform2D] to another [CanvasItem] " +"derived Node (called the remote node) in the scene.\n" "It can be set to update another Node's position, rotation and/or scale. It " "can use either global or local coordinates." msgstr "" -#: doc/classes/RemoteTransform.xml:17 +#: doc/classes/RemoteTransform2D.xml:17 msgid "" -"[RemoteTransform] caches the remote node. It may not notice if the remote " +"[RemoteTransform2D] caches the remote node. It may not notice if the remote " "node disappears; [method force_update_cache] forces it to update the cache " "again." msgstr "" -#: doc/classes/RemoteTransform.xml:23 +#: doc/classes/RemoteTransform2D.xml:23 msgid "" -"The [NodePath] to the remote node, relative to the RemoteTransform's " +"The [NodePath] to the remote node, relative to the RemoteTransform2D's " "position in the scene." msgstr "" -#: doc/classes/RemoteTransform.xml:26 doc/classes/RemoteTransform2D.xml:26 +#: doc/classes/RemoteTransform2D.xml:26 doc/classes/RemoteTransform3D.xml:26 msgid "If [code]true[/code], the remote node's position is updated." msgstr "" -#: doc/classes/RemoteTransform.xml:29 doc/classes/RemoteTransform2D.xml:29 +#: doc/classes/RemoteTransform2D.xml:29 doc/classes/RemoteTransform3D.xml:29 msgid "If [code]true[/code], the remote node's rotation is updated." msgstr "" -#: doc/classes/RemoteTransform.xml:32 doc/classes/RemoteTransform2D.xml:32 +#: doc/classes/RemoteTransform2D.xml:32 doc/classes/RemoteTransform3D.xml:32 msgid "If [code]true[/code], the remote node's scale is updated." msgstr "" -#: doc/classes/RemoteTransform.xml:35 doc/classes/RemoteTransform2D.xml:35 +#: doc/classes/RemoteTransform2D.xml:35 doc/classes/RemoteTransform3D.xml:35 msgid "" "If [code]true[/code], global coordinates are used. If [code]false[/code], " "local coordinates are used." msgstr "" -#: doc/classes/RemoteTransform2D.xml:4 +#: doc/classes/RemoteTransform3D.xml:4 msgid "" -"RemoteTransform2D pushes its own [Transform2D] to another [CanvasItem] " -"derived Node in the scene." +"RemoteTransform3D pushes its own [Transform] to another [Node3D] derived " +"Node in the scene." msgstr "" -#: doc/classes/RemoteTransform2D.xml:7 +#: doc/classes/RemoteTransform3D.xml:7 msgid "" -"RemoteTransform2D pushes its own [Transform2D] to another [CanvasItem] " -"derived Node (called the remote node) in the scene.\n" +"RemoteTransform3D pushes its own [Transform] to another [Node3D] derived " +"Node (called the remote node) in the scene.\n" "It can be set to update another Node's position, rotation and/or scale. It " "can use either global or local coordinates." msgstr "" -#: doc/classes/RemoteTransform2D.xml:17 +#: doc/classes/RemoteTransform3D.xml:17 msgid "" -"[RemoteTransform2D] caches the remote node. It may not notice if the remote " +"[RemoteTransform3D] caches the remote node. It may not notice if the remote " "node disappears; [method force_update_cache] forces it to update the cache " "again." msgstr "" -#: doc/classes/RemoteTransform2D.xml:23 +#: doc/classes/RemoteTransform3D.xml:23 msgid "" -"The [NodePath] to the remote node, relative to the RemoteTransform2D's " +"The [NodePath] to the remote node, relative to the RemoteTransform3D's " "position in the scene." msgstr "" +#: doc/classes/RenderingServer.xml:4 +msgid "Server for anything visible." +msgstr "" + +#: doc/classes/RenderingServer.xml:7 +msgid "" +"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 rendering server is completely opaque, the internals are entirely " +"implementation specific and cannot be accessed.\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 " +"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].\n" +"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].\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. " +"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.\n" +"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." +msgstr "" + +#: doc/classes/RenderingServer.xml:18 +msgid "" +"https://docs.godotengine.org/en/latest/tutorials/optimization/using_servers." +"html" +msgstr "" + +#: doc/classes/RenderingServer.xml:33 +msgid "Sets images to be rendered in the window margin." +msgstr "" + +#: doc/classes/RenderingServer.xml:48 +msgid "" +"Sets margin size, where black bars (or images, if [method " +"black_bars_set_images] was used) are rendered." +msgstr "" + +#: doc/classes/RenderingServer.xml:55 +msgid "" +"Creates a camera and adds it to the RenderingServer. It can be accessed with " +"the RID that is returned. This RID will be used in all [code]camera_*[/code] " +"RenderingServer functions.\n" +"Once finished with your RID, you will want to free the RID using the " +"RenderingServer's [method free_rid] static method." +msgstr "" + +#: doc/classes/RenderingServer.xml:67 +msgid "" +"Sets the cull mask associated with this camera. The cull mask describes " +"which 3D layers are rendered by this camera. Equivalent to [member Camera3D." +"cull_mask]." +msgstr "" + +#: doc/classes/RenderingServer.xml:78 +msgid "" +"Sets the environment used by this camera. Equivalent to [member Camera3D." +"environment]." +msgstr "" + +#: doc/classes/RenderingServer.xml:95 +msgid "" +"Sets camera to use frustum projection. This mode allows adjusting the " +"[code]offset[/code] argument to create \"tilted frustum\" effects." +msgstr "" + +#: doc/classes/RenderingServer.xml:110 +msgid "" +"Sets camera to use orthogonal projection, also known as orthographic " +"projection. Objects remain the same size on the screen no matter how far " +"away they are." +msgstr "" + +#: doc/classes/RenderingServer.xml:125 +msgid "" +"Sets camera to use perspective projection. Objects on the screen becomes " +"smaller when they are far away." +msgstr "" + +#: doc/classes/RenderingServer.xml:136 +msgid "Sets [Transform] of camera." +msgstr "" + +#: doc/classes/RenderingServer.xml:147 +msgid "" +"If [code]true[/code], preserves the horizontal aspect ratio which is " +"equivalent to [constant Camera3D.KEEP_WIDTH]. If [code]false[/code], " +"preserves the vertical aspect ratio which is equivalent to [constant " +"Camera3D.KEEP_HEIGHT]." +msgstr "" + +#: doc/classes/RenderingServer.xml:154 +msgid "" +"Creates a canvas and returns the assigned [RID]. It can be accessed with the " +"RID that is returned. This RID will be used in all [code]canvas_*[/code] " +"RenderingServer functions.\n" +"Once finished with your RID, you will want to free the RID using the " +"RenderingServer's [method free_rid] static method." +msgstr "" + +#: doc/classes/RenderingServer.xml:164 +msgid "Clears the [CanvasItem] and removes all commands in it." +msgstr "" + +#: doc/classes/RenderingServer.xml:177 +msgid "Sets the [CanvasItem] to copy a rect to the backbuffer." +msgstr "" + +#: doc/classes/RenderingServer.xml:188 +msgid "Sets the index for the [CanvasItem]." +msgstr "" + +#: doc/classes/RenderingServer.xml:199 +msgid "Sets a new material to the [CanvasItem]." +msgstr "" + +#: doc/classes/RenderingServer.xml:210 +msgid "Sets if the [CanvasItem] uses its parent's material." +msgstr "" + +#: doc/classes/RenderingServer.xml:221 +msgid "" +"If this is enabled, the Z index of the parent will be added to the " +"children's Z index." +msgstr "" + +#: doc/classes/RenderingServer.xml:232 +msgid "" +"Sets the [CanvasItem]'s Z index, i.e. its draw order (lower indexes are " +"drawn first)." +msgstr "" + +#: doc/classes/RenderingServer.xml:243 +msgid "" +"Attaches the canvas light to the canvas. Removes it from its previous canvas." +msgstr "" + +#: doc/classes/RenderingServer.xml:250 +msgid "" +"Creates a canvas light and adds it to the RenderingServer. It can be " +"accessed with the RID that is returned. This RID will be used in all " +"[code]canvas_light_*[/code] RenderingServer functions.\n" +"Once finished with your RID, you will want to free the RID using the " +"RenderingServer's [method free_rid] static method." +msgstr "" + +#: doc/classes/RenderingServer.xml:262 +msgid "" +"Attaches a light occluder to the canvas. Removes it from its previous canvas." +msgstr "" + +#: doc/classes/RenderingServer.xml:269 +msgid "" +"Creates a light occluder and adds it to the RenderingServer. It can be " +"accessed with the RID that is returned. This RID will be used in all " +"[code]canvas_light_ocluder_*[/code] RenderingServer functions.\n" +"Once finished with your RID, you will want to free the RID using the " +"RenderingServer's [method free_rid] static method." +msgstr "" + +#: doc/classes/RenderingServer.xml:281 +msgid "Enables or disables light occluder." +msgstr "" + +#: doc/classes/RenderingServer.xml:292 doc/classes/RenderingServer.xml:369 +msgid "" +"The light mask. See [LightOccluder2D] for more information on light masks." +msgstr "" + +#: doc/classes/RenderingServer.xml:303 +msgid "Sets a light occluder's polygon." +msgstr "" + +#: doc/classes/RenderingServer.xml:314 +msgid "Sets a light occluder's [Transform2D]." +msgstr "" + +#: doc/classes/RenderingServer.xml:325 +msgid "Sets the color for a light." +msgstr "" + +#: doc/classes/RenderingServer.xml:336 +msgid "Enables or disables a canvas light." +msgstr "" + +#: doc/classes/RenderingServer.xml:347 +msgid "Sets a canvas light's energy." +msgstr "" + +#: doc/classes/RenderingServer.xml:358 +msgid "Sets a canvas light's height." +msgstr "" + +#: doc/classes/RenderingServer.xml:380 +msgid "" +"The binary mask used to determine which layers this canvas light's shadows " +"affects. See [LightOccluder2D] for more information on light masks." +msgstr "" + +#: doc/classes/RenderingServer.xml:393 +msgid "The layer range that gets rendered with this light." +msgstr "" + +#: doc/classes/RenderingServer.xml:404 +msgid "The mode of the light, see [enum CanvasLightMode] constants." +msgstr "" + +#: doc/classes/RenderingServer.xml:415 +msgid "" +"Sets the texture's scale factor of the light. Equivalent to [member Light2D." +"texture_scale]." +msgstr "" + +#: doc/classes/RenderingServer.xml:426 +msgid "" +"Sets the width of the shadow buffer, size gets scaled to the next power of " +"two for this." +msgstr "" + +#: doc/classes/RenderingServer.xml:437 +msgid "Sets the color of the canvas light's shadow." +msgstr "" + +#: doc/classes/RenderingServer.xml:448 +msgid "Enables or disables the canvas light's shadow." +msgstr "" + +#: doc/classes/RenderingServer.xml:459 +msgid "" +"Sets the canvas light's shadow's filter, see [enum CanvasLightShadowFilter] " +"constants." +msgstr "" + +#: doc/classes/RenderingServer.xml:470 +msgid "Smoothens the shadow. The lower, the smoother." +msgstr "" + +#: doc/classes/RenderingServer.xml:481 +msgid "" +"Sets texture to be used by light. Equivalent to [member Light2D.texture]." +msgstr "" + +#: doc/classes/RenderingServer.xml:492 +msgid "" +"Sets the offset of the light's texture. Equivalent to [member Light2D." +"offset]." +msgstr "" + +#: doc/classes/RenderingServer.xml:503 +msgid "Sets the canvas light's [Transform2D]." +msgstr "" + +#: doc/classes/RenderingServer.xml:516 +msgid "" +"Sets the Z range of objects that will be affected by this light. Equivalent " +"to [member Light2D.range_z_min] and [member Light2D.range_z_max]." +msgstr "" + +#: doc/classes/RenderingServer.xml:523 +msgid "" +"Creates a new light occluder polygon and adds it to the RenderingServer. It " +"can be accessed with the RID that is returned. This RID will be used in all " +"[code]canvas_occluder_polygon_*[/code] RenderingServer functions.\n" +"Once finished with your RID, you will want to free the RID using the " +"RenderingServer's [method free_rid] static method." +msgstr "" + +#: doc/classes/RenderingServer.xml:535 +msgid "" +"Sets an occluder polygons cull mode. See [enum " +"CanvasOccluderPolygonCullMode] constants." +msgstr "" + +#: doc/classes/RenderingServer.xml:548 +msgid "Sets the shape of the occluder polygon." +msgstr "" + +#: doc/classes/RenderingServer.xml:559 +msgid "Sets the shape of the occluder polygon as lines." +msgstr "" + +#: doc/classes/RenderingServer.xml:572 +msgid "" +"A copy of the canvas item will be drawn with a local offset of the mirroring " +"[Vector2]." +msgstr "" + +#: doc/classes/RenderingServer.xml:583 +msgid "Modulates all colors in the given canvas." +msgstr "" + +#: doc/classes/RenderingServer.xml:590 +msgid "" +"Creates a directional 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_*[/code] RenderingServer functions.\n" +"Once finished with your RID, you will want to free the RID using the " +"RenderingServer's [method free_rid] static method.\n" +"To place in a scene, attach this directional light to an instance using " +"[method instance_set_base] using the returned RID." +msgstr "" + +#: doc/classes/RenderingServer.xml:599 +msgid "" +"Creates an environment and adds it to the RenderingServer. It can be " +"accessed with the RID that is returned. This RID will be used in all " +"[code]environment_*[/code] RenderingServer functions.\n" +"Once finished with your RID, you will want to free the RID using the " +"RenderingServer's [method free_rid] static method." +msgstr "" + +#: doc/classes/RenderingServer.xml:619 +msgid "" +"Sets the values to be used with the \"Adjustment\" post-process effect. See " +"[Environment] for more details." +msgstr "" + +#: doc/classes/RenderingServer.xml:650 +msgid "" +"Sets the [i]BGMode[/i] of the environment. Equivalent to [member Environment." +"background_mode]." +msgstr "" + +#: doc/classes/RenderingServer.xml:661 +msgid "" +"Color displayed for clear areas of the scene (if using Custom color or Color" +"+Sky background modes)." +msgstr "" + +#: doc/classes/RenderingServer.xml:672 +msgid "Sets the intensity of the background color." +msgstr "" + +#: doc/classes/RenderingServer.xml:683 +msgid "Sets the maximum layer to use if using Canvas background mode." +msgstr "" + +#: doc/classes/RenderingServer.xml:700 +msgid "" +"Sets the variables to be used with the scene fog. See [Environment] for more " +"details." +msgstr "" + +#: doc/classes/RenderingServer.xml:721 +msgid "" +"Sets the variables to be used with the fog depth effect. See [Environment] " +"for more details." +msgstr "" + +#: doc/classes/RenderingServer.xml:738 +msgid "" +"Sets the variables to be used with the fog height effect. See [Environment] " +"for more details." +msgstr "" + +#: doc/classes/RenderingServer.xml:777 +msgid "" +"Sets the [Sky] to be used as the environment's background when using " +"[i]BGMode[/i] sky. Equivalent to [member Environment.sky]." +msgstr "" + +#: doc/classes/RenderingServer.xml:788 +msgid "" +"Sets a custom field of view for the background [Sky]. Equivalent to [member " +"Environment.sky_custom_fov]." +msgstr "" + +#: doc/classes/RenderingServer.xml:799 +msgid "" +"Sets the rotation of the background [Sky] expressed as a [Basis]. Equivalent " +"to [member Environment.sky_rotation], where the rotation vector is used to " +"construct the [Basis]." +msgstr "" + +#: doc/classes/RenderingServer.xml:842 +msgid "" +"Sets the variables to be used with the \"screen space reflections\" post-" +"process effect. See [Environment] for more details." +msgstr "" + +#: doc/classes/RenderingServer.xml:867 +msgid "" +"Sets the variables to be used with the \"tonemap\" post-process effect. See " +"[Environment] for more details." +msgstr "" + +#: doc/classes/RenderingServer.xml:874 +msgid "Removes buffers and clears testcubes." +msgstr "" + +#: doc/classes/RenderingServer.xml:885 +msgid "" +"Forces a frame to be drawn when the function is called. Drawing a frame " +"updates all [Viewport]s that are set to update. Use with extreme caution." +msgstr "" + +#: doc/classes/RenderingServer.xml:892 +msgid "Synchronizes threads." +msgstr "" + +#: doc/classes/RenderingServer.xml:901 +msgid "Tries to free an object in the RenderingServer." +msgstr "" + +#: doc/classes/RenderingServer.xml:910 +msgid "Returns a certain information, see [enum RenderInfo] for options." +msgstr "" + +#: doc/classes/RenderingServer.xml:917 +msgid "Returns the id of the test cube. Creates one if none exists." +msgstr "" + +#: doc/classes/RenderingServer.xml:924 +msgid "Returns the id of the test texture. Creates one if none exists." +msgstr "" + +#: doc/classes/RenderingServer.xml:931 +msgid "" +"Returns the name of the video adapter (e.g. \"GeForce GTX 1080/PCIe/" +"SSE2\").\n" +"[b]Note:[/b] When running a headless or server binary, this function returns " +"an empty string." +msgstr "" + +#: doc/classes/RenderingServer.xml:939 +msgid "" +"Returns the vendor of the video adapter (e.g. \"NVIDIA Corporation\").\n" +"[b]Note:[/b] When running a headless or server binary, this function returns " +"an empty string." +msgstr "" + +#: doc/classes/RenderingServer.xml:947 +msgid "Returns the id of a white texture. Creates one if none exists." +msgstr "" + +#: 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:1015 +msgid "Not yet implemented. Always returns [code]false[/code]." +msgstr "" + +#: 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:1037 +msgid "" +"Sets up [ImmediateGeometry3D] internals to prepare for drawing. Equivalent " +"to [method ImmediateGeometry3D.begin]." +msgstr "" + +#: 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:1057 +msgid "" +"Sets the color to be used with next vertex. Equivalent to [method " +"ImmediateGeometry3D.set_color]." +msgstr "" + +#: 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 " +"[code]immediate_*[/code] RenderingServer functions.\n" +"Once finished with your RID, you will want to free the RID using the " +"RenderingServer's [method free_rid] static method.\n" +"To place in a scene, attach this immediate geometry to an instance using " +"[method instance_set_base] using the returned RID." +msgstr "" + +#: doc/classes/RenderingServer.xml:1075 +msgid "" +"Ends drawing the [ImmediateGeometry3D] and displays it. Equivalent to " +"[method ImmediateGeometry3D.end]." +msgstr "" + +#: doc/classes/RenderingServer.xml:1084 +msgid "Returns the material assigned to the [ImmediateGeometry3D]." +msgstr "" + +#: 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:1106 +msgid "Sets the material to be used to draw the [ImmediateGeometry3D]." +msgstr "" + +#: 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:1128 +msgid "" +"Sets the UV to be used with next vertex. Equivalent to [method " +"ImmediateGeometry3D.set_uv]." +msgstr "" + +#: 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:1150 +msgid "" +"Adds the next vertex using the information provided in advance. Equivalent " +"to [method ImmediateGeometry3D.add_vertex]." +msgstr "" + +#: 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:1168 +msgid "" +"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: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:1190 +msgid "" +"Attaches a skeleton to an instance. Removes the previous skeleton from the " +"instance." +msgstr "" + +#: 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 " +"[code]instance_*[/code] RenderingServer functions.\n" +"Once finished with your RID, you will want to free the RID using the " +"RenderingServer's [method free_rid] static method.\n" +"An instance is a way of placing a 3D object in the scenario. Objects like " +"particles, meshes, and reflection probes need to be associated with an " +"instance to be visible in the scenario using [method instance_set_base]." +msgstr "" + +#: 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 " +"RID will be used in all [code]instance_*[/code] RenderingServer functions.\n" +"Once finished with your RID, you will want to free the RID using the " +"RenderingServer's [method free_rid] static method." +msgstr "" + +#: 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:1233 +msgid "" +"Sets the shadow casting setting to one of [enum ShadowCastingSetting]. " +"Equivalent to [member GeometryInstance3D.cast_shadow]." +msgstr "" + +#: 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: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: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 " +"the light types, mesh, multimesh, immediate geometry, particle system, " +"reflection probe, lightmap capture, and the GI probe are all types that can " +"be set as the base of an instance in order to be displayed in the scenario." +msgstr "" + +#: doc/classes/RenderingServer.xml:1298 +msgid "Sets the weight for a given blend shape associated with this instance." +msgstr "" + +#: 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:1320 +msgid "Function not implemented in Godot 3.x." +msgstr "" + +#: 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:1342 +msgid "" +"Sets the render layers that this instance will be drawn to. Equivalent to " +"[member VisualInstance3D.layers]." +msgstr "" + +#: 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:1366 +msgid "" +"Sets the material of a specific surface. Equivalent to [method " +"MeshInstance3D.set_surface_material]." +msgstr "" + +#: doc/classes/RenderingServer.xml:1377 +msgid "" +"Sets the world space transform of the instance. Equivalent to [member Node3D." +"transform]." +msgstr "" + +#: doc/classes/RenderingServer.xml:1390 +msgid "Sets the lightmap to use with this instance." +msgstr "" + +#: doc/classes/RenderingServer.xml:1401 +msgid "" +"Sets whether an instance is drawn or not. Equivalent to [member Node3D." +"visible]." +msgstr "" + +#: 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 " +"[DirectionalLight3D]. Use [method @GDScript.instance_from_id] to obtain the " +"actual nodes. A scenario RID must be provided, which is available in the " +"[World3D] you want to query. This forces an update for all resources queued " +"to update.\n" +"[b]Warning:[/b] This function is primarily intended for editor usage. For in-" +"game use cases, prefer physics collision." +msgstr "" + +#: 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 " +"[DirectionalLight3D]. Use [method @GDScript.instance_from_id] to obtain the " +"actual nodes. A scenario RID must be provided, which is available in the " +"[World3D] you want to query. This forces an update for all resources queued " +"to update.\n" +"[b]Warning:[/b] This function is primarily intended for editor usage. For in-" +"game use cases, prefer physics collision." +msgstr "" + +#: 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 " +"[DirectionalLight3D]. Use [method @GDScript.instance_from_id] to obtain the " +"actual nodes. A scenario RID must be provided, which is available in the " +"[World3D] you want to query. This forces an update for all resources queued " +"to update.\n" +"[b]Warning:[/b] This function is primarily intended for editor usage. For in-" +"game use cases, prefer physics collision." +msgstr "" + +#: 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: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: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: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:1494 +msgid "" +"Sets the color of the light. Equivalent to [member Light3D.light_color]." +msgstr "" + +#: 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: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:1529 +msgid "" +"Sets the specified light parameter. See [enum LightParam] for options. " +"Equivalent to [method Light3D.set_param]." +msgstr "" + +#: 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 " +"cast a shadow on both sides of the mesh, set the mesh to use double sided " +"shadows with [method instance_geometry_set_cast_shadows_setting]. Equivalent " +"to [member Light3D.shadow_reverse_cull_face]." +msgstr "" + +#: 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:1573 +msgid "" +"Sets the color of the shadow cast by the light. Equivalent to [member " +"Light3D.shadow_color]." +msgstr "" + +#: doc/classes/RenderingServer.xml:1584 +msgid "Sets whether GI probes capture light information from this light." +msgstr "" + +#: 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 " +"[code]lightmap_capture_*[/code] RenderingServer functions.\n" +"Once finished with your RID, you will want to free the RID using the " +"RenderingServer's [method free_rid] static method.\n" +"To place in a scene, attach this lightmap capture to an instance using " +"[method instance_set_base] using the returned RID." +msgstr "" + +#: doc/classes/RenderingServer.xml:1602 +msgid "Returns the size of the lightmap capture area." +msgstr "" + +#: doc/classes/RenderingServer.xml:1611 +msgid "Returns the energy multiplier used by the lightmap capture." +msgstr "" + +#: doc/classes/RenderingServer.xml:1620 +msgid "Returns the octree used by the lightmap capture." +msgstr "" + +#: doc/classes/RenderingServer.xml:1629 +msgid "" +"Returns the cell subdivision amount used by this lightmap capture's octree." +msgstr "" + +#: doc/classes/RenderingServer.xml:1638 +msgid "Returns the cell transform for this lightmap capture's octree." +msgstr "" + +#: doc/classes/RenderingServer.xml:1649 +msgid "Sets the size of the area covered by the lightmap capture." +msgstr "" + +#: doc/classes/RenderingServer.xml:1660 +msgid "Sets the energy multiplier for this lightmap capture." +msgstr "" + +#: doc/classes/RenderingServer.xml:1671 +msgid "Sets the octree to be used by this lightmap capture." +msgstr "" + +#: doc/classes/RenderingServer.xml:1682 +msgid "Sets the subdivision level of this lightmap capture's octree." +msgstr "" + +#: doc/classes/RenderingServer.xml:1693 +msgid "Sets the octree cell transform for this lightmap capture's octree." +msgstr "" + +#: 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: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 " +"[code]material_*[/code] RenderingServer functions.\n" +"Once finished with your RID, you will want to free the RID using the " +"RenderingServer's [method free_rid] static method." +msgstr "" + +#: doc/classes/RenderingServer.xml:1725 +msgid "Returns the value of a certain material's parameter." +msgstr "" + +#: doc/classes/RenderingServer.xml:1736 +msgid "Sets an object's next material." +msgstr "" + +#: doc/classes/RenderingServer.xml:1749 +msgid "Sets a material's parameter." +msgstr "" + +#: doc/classes/RenderingServer.xml:1760 +msgid "Sets a material's render priority." +msgstr "" + +#: doc/classes/RenderingServer.xml:1771 +msgid "Sets a shader material's shader." +msgstr "" + +#: doc/classes/RenderingServer.xml:1800 +msgid "Removes all surfaces from a mesh." +msgstr "" + +#: 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_*[/" +"code] RenderingServer functions.\n" +"Once finished with your RID, you will want to free the RID using the " +"RenderingServer's [method free_rid] static method.\n" +"To place in a scene, attach this mesh to an instance using [method " +"instance_set_base] using the returned RID." +msgstr "" + +#: doc/classes/RenderingServer.xml:1818 +msgid "Returns a mesh's blend shape count." +msgstr "" + +#: doc/classes/RenderingServer.xml:1827 +msgid "Returns a mesh's blend shape mode." +msgstr "" + +#: doc/classes/RenderingServer.xml:1836 +msgid "Returns a mesh's custom aabb." +msgstr "" + +#: doc/classes/RenderingServer.xml:1845 +msgid "Returns a mesh's number of surfaces." +msgstr "" + +#: doc/classes/RenderingServer.xml:1856 +msgid "Sets a mesh's blend shape mode." +msgstr "" + +#: doc/classes/RenderingServer.xml:1867 +msgid "Sets a mesh's custom aabb." +msgstr "" + +#: doc/classes/RenderingServer.xml:1878 +msgid "Returns a mesh's surface's buffer arrays." +msgstr "" + +#: doc/classes/RenderingServer.xml:1889 +msgid "Returns a mesh's surface's arrays for blend shapes." +msgstr "" + +#: doc/classes/RenderingServer.xml:1904 doc/classes/RenderingServer.xml:1917 +msgid "Function is unused in Godot 3.x." +msgstr "" + +#: doc/classes/RenderingServer.xml:1928 +msgid "Returns a mesh's surface's material." +msgstr "" + +#: doc/classes/RenderingServer.xml:1941 +msgid "Sets a mesh's surface's material." +msgstr "" + +#: 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: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 " +"functions.\n" +"Once finished with your RID, you will want to free the RID using the " +"RenderingServer's [method free_rid] static method.\n" +"To place in a scene, attach this multimesh to an instance using [method " +"instance_set_base] using the returned RID." +msgstr "" + +#: 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:2007 +msgid "Returns the number of instances allocated for this multimesh." +msgstr "" + +#: 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:2025 +msgid "Returns the number of visible instances for this multimesh." +msgstr "" + +#: doc/classes/RenderingServer.xml:2036 +msgid "Returns the color by which the specified instance will be modulated." +msgstr "" + +#: doc/classes/RenderingServer.xml:2047 +msgid "Returns the custom data associated with the specified instance." +msgstr "" + +#: doc/classes/RenderingServer.xml:2058 +msgid "Returns the [Transform] of the specified instance." +msgstr "" + +#: 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:2082 +msgid "" +"Sets the color by which this instance will be modulated. Equivalent to " +"[method MultiMesh.set_instance_color]." +msgstr "" + +#: 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:2108 +msgid "" +"Sets the [Transform] for this instance. Equivalent to [method MultiMesh." +"set_instance_transform]." +msgstr "" + +#: 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:2142 +msgid "" +"Sets the mesh to be drawn by the multimesh. Equivalent to [member MultiMesh." +"mesh]." +msgstr "" + +#: 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: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 " +"[code]light_*[/code] RenderingServer functions.\n" +"Once finished with your RID, you will want to free the RID using the " +"RenderingServer's [method free_rid] static method.\n" +"To place in a scene, attach this omni light to an instance using [method " +"instance_set_base] using the returned RID." +msgstr "" + +#: 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 " +"[code]particles_*[/code] RenderingServer functions.\n" +"Once finished with your RID, you will want to free the RID using the " +"RenderingServer's [method free_rid] static method.\n" +"To place in a scene, attach these particles to an instance using [method " +"instance_set_base] using the returned RID." +msgstr "" + +#: 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:2189 +msgid "Returns [code]true[/code] if particles are currently set to emitting." +msgstr "" + +#: 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: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 " +"instances_cull_aabb], [method instances_cull_convex], or [method " +"instances_cull_ray]." +msgstr "" + +#: doc/classes/RenderingServer.xml:2216 +msgid "" +"Reset the particles on the next update. Equivalent to [method GPUParticles3D." +"restart]." +msgstr "" + +#: 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:2238 +msgid "" +"Sets a custom axis-aligned bounding box for the particle system. Equivalent " +"to [member GPUParticles3D.visibility_aabb]." +msgstr "" + +#: 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: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:2273 +msgid "" +"Sets the number of draw passes to use. Equivalent to [member GPUParticles3D." +"draw_passes]." +msgstr "" + +#: 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: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:2306 +msgid "" +"Sets the explosiveness ratio. Equivalent to [member GPUParticles3D." +"explosiveness]." +msgstr "" + +#: 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: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:2339 +msgid "" +"Sets the lifetime of each particle in the system. Equivalent to [member " +"GPUParticles3D.lifetime]." +msgstr "" + +#: 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: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: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: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:2394 +msgid "" +"Sets the speed scale of the particle system. Equivalent to [member " +"GPUParticles3D.speed_scale]." +msgstr "" + +#: 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: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 " +"[code]reflection_probe_*[/code] RenderingServer functions.\n" +"Once finished with your RID, you will want to free the RID using the " +"RenderingServer's [method free_rid] static method.\n" +"To place in a scene, attach this reflection probe to an instance using " +"[method instance_set_base] using the returned RID." +msgstr "" + +#: 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: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: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: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:2469 +msgid "" +"Sets the size of the area that the reflection probe will capture. Equivalent " +"to [member ReflectionProbe.extents]." +msgstr "" + +#: 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: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: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: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 " +"ambient light matches the color of the room. Equivalent to [member " +"ReflectionProbe.interior_ambient_contrib]." +msgstr "" + +#: 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: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: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:2559 +msgid "" +"Schedules a callback to the corresponding named [code]method[/code] on " +"[code]where[/code] after a frame has been drawn.\n" +"The callback method must use only 1 argument which will be called with " +"[code]userdata[/code]." +msgstr "" + +#: 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 " +"[code]scenario_*[/code] RenderingServer functions.\n" +"Once finished with your RID, you will want to free the RID using the " +"RenderingServer's [method free_rid] static method.\n" +"The scenario is the 3D world that all the visual instances exist in." +msgstr "" + +#: doc/classes/RenderingServer.xml:2580 +msgid "" +"Sets the [enum ScenarioDebugMode] for this scenario. See [enum " +"ScenarioDebugMode] for options." +msgstr "" + +#: doc/classes/RenderingServer.xml:2591 +msgid "Sets the environment that will be used with this scenario." +msgstr "" + +#: 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: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. " +"If [code]use_filter[/code] is [code]true[/code], the image will be scaled " +"with linear interpolation. If [code]use_filter[/code] is [code]false[/code], " +"the image will be scaled with nearest-neighbor interpolation." +msgstr "" + +#: 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:2635 +msgid "" +"Sets the default clear color which is used when a specific clear color has " +"not been selected." +msgstr "" + +#: 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 " +"[code]shader_*[/code] RenderingServer functions.\n" +"Once finished with your RID, you will want to free the RID using the " +"RenderingServer's [method free_rid] static method." +msgstr "" + +#: doc/classes/RenderingServer.xml:2652 +msgid "Returns a shader's code." +msgstr "" + +#: doc/classes/RenderingServer.xml:2663 +msgid "Returns a default texture from a shader searched by name." +msgstr "" + +#: doc/classes/RenderingServer.xml:2682 +msgid "Returns the parameters of a shader." +msgstr "" + +#: doc/classes/RenderingServer.xml:2693 +msgid "Sets a shader's code." +msgstr "" + +#: doc/classes/RenderingServer.xml:2706 +msgid "Sets a shader's default texture. Overwrites the texture given by name." +msgstr "" + +#: doc/classes/RenderingServer.xml:2719 +msgid "Allocates the GPU buffers for this skeleton." +msgstr "" + +#: doc/classes/RenderingServer.xml:2730 +msgid "Returns the [Transform] set for a specific bone of this skeleton." +msgstr "" + +#: doc/classes/RenderingServer.xml:2741 +msgid "Returns the [Transform2D] set for a specific bone of this skeleton." +msgstr "" + +#: doc/classes/RenderingServer.xml:2754 +msgid "Sets the [Transform] for a specific bone of this skeleton." +msgstr "" + +#: doc/classes/RenderingServer.xml:2767 +msgid "Sets the [Transform2D] for a specific bone of this skeleton." +msgstr "" + +#: 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 " +"[code]skeleton_*[/code] RenderingServer functions.\n" +"Once finished with your RID, you will want to free the RID using the " +"RenderingServer's [method free_rid] static method." +msgstr "" + +#: doc/classes/RenderingServer.xml:2784 +msgid "Returns the number of bones allocated for this skeleton." +msgstr "" + +#: 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_*[/" +"code] RenderingServer functions.\n" +"Once finished with your RID, you will want to free the RID using the " +"RenderingServer's [method free_rid] static method." +msgstr "" + +#: 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: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_*[/" +"code] RenderingServer functions.\n" +"Once finished with your RID, you will want to free the RID using the " +"RenderingServer's [method free_rid] static method.\n" +"To place in a scene, attach this spot light to an instance using [method " +"instance_set_base] using the returned RID." +msgstr "" + +#: doc/classes/RenderingServer.xml:2839 +msgid "Sets a viewport's camera." +msgstr "" + +#: doc/classes/RenderingServer.xml:2850 +msgid "Sets a viewport's canvas." +msgstr "" + +#: 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[/" +"code], then the viewport does not use a framebuffer and the contents of the " +"viewport are rendered directly to screen. However, note that the root " +"viewport is drawn last, therefore it will draw over the screen. Accordingly, " +"you must set the root viewport to an area that does not cover the area that " +"you have attached this viewport to.\n" +"For example, you can set the root viewport to not render at all with the " +"following code:\n" +"[codeblock]\n" +"func _ready():\n" +" get_viewport().set_attach_to_screen_rect(Rect2())\n" +" $Viewport.set_attach_to_screen_rect(Rect2(0, 0, 600, 600))\n" +"[/codeblock]\n" +"Using this can result in significant optimization, especially on lower-end " +"devices. However, it comes at the cost of having to manage your viewports " +"manually. For a further optimization see, [method " +"viewport_set_render_direct_to_screen]." +msgstr "" + +#: 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 " +"[code]viewport_*[/code] RenderingServer functions.\n" +"Once finished with your RID, you will want to free the RID using the " +"RenderingServer's [method free_rid] static method." +msgstr "" + +#: doc/classes/RenderingServer.xml:2889 +msgid "" +"Returns a viewport's render information. For options, see the [enum " +"ViewportRenderInfo] constants." +msgstr "" + +#: doc/classes/RenderingServer.xml:2898 +msgid "Returns the viewport's last rendered frame." +msgstr "" + +#: doc/classes/RenderingServer.xml:2909 +msgid "Detaches a viewport from a canvas and vice versa." +msgstr "" + +#: doc/classes/RenderingServer.xml:2920 +msgid "If [code]true[/code], sets the viewport active, else sets it inactive." +msgstr "" + +#: 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:2949 +msgid "Sets the transformation of a viewport's canvas." +msgstr "" + +#: doc/classes/RenderingServer.xml:2960 +msgid "" +"Sets the clear mode of a viewport. See [enum ViewportClearMode] for options." +msgstr "" + +#: doc/classes/RenderingServer.xml:2971 +msgid "" +"Sets the debug draw mode of a viewport. See [enum ViewportDebugDraw] for " +"options." +msgstr "" + +#: doc/classes/RenderingServer.xml:2982 +msgid "" +"If [code]true[/code], rendering of a viewport's environment is disabled." +msgstr "" + +#: doc/classes/RenderingServer.xml:2993 +msgid "Sets the viewport's global transformation matrix." +msgstr "" + +#: doc/classes/RenderingServer.xml:3004 +msgid "If [code]true[/code], the viewport's canvas is not rendered." +msgstr "" + +#: doc/classes/RenderingServer.xml:3015 +msgid "Currently unimplemented in Godot 3.x." +msgstr "" + +#: doc/classes/RenderingServer.xml:3026 +msgid "Sets the anti-aliasing mode. See [enum ViewportMSAA] for options." +msgstr "" + +#: doc/classes/RenderingServer.xml:3037 +msgid "Sets the viewport's parent to another viewport." +msgstr "" + +#: 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 " +"viewport to the root viewport. While this optimization can result in a " +"significant increase in speed (especially on older devices), it comes at a " +"cost of usability. When this is enabled, you cannot read from the viewport " +"or from the [code]SCREEN_TEXTURE[/code]. You also lose the benefit of " +"certain window settings, such as the various stretch modes. Another " +"consequence to be aware of is that in 2D the rendering happens in window " +"coordinates, so if you have a viewport that is double the size of the " +"window, and you set this, then only the portion that fits within the window " +"will be drawn, no automatic scaling is possible, even if your game scene is " +"significantly larger than the window size." +msgstr "" + +#: 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:3073 +msgid "Sets the shadow atlas quadrant's subdivision." +msgstr "" + +#: 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:3097 +msgid "Sets the viewport's width and height." +msgstr "" + +#: doc/classes/RenderingServer.xml:3108 +msgid "" +"If [code]true[/code], the viewport renders its background as transparent." +msgstr "" + +#: doc/classes/RenderingServer.xml:3119 +msgid "" +"Sets when the viewport should be updated. See [enum ViewportUpdateMode] " +"constants for options." +msgstr "" + +#: doc/classes/RenderingServer.xml:3130 +msgid "" +"If [code]true[/code], the viewport uses augmented or virtual reality " +"technologies. See [XRInterface]." +msgstr "" + +#: 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:3142 +msgid "" +"Emitted at the beginning of the frame, before the RenderingServer updates " +"all the Viewports." +msgstr "" + +#: doc/classes/RenderingServer.xml:3148 +msgid "Marks an error that shows that the index array is empty." +msgstr "" + +#: doc/classes/RenderingServer.xml:3151 +msgid "Number of weights/bones per vertex." +msgstr "" + +#: doc/classes/RenderingServer.xml:3154 +msgid "The minimum Z-layer for canvas items." +msgstr "" + +#: doc/classes/RenderingServer.xml:3157 +msgid "The maximum Z-layer for canvas items." +msgstr "" + +#: 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:3163 +msgid "Unused enum in Godot 3.x." +msgstr "" + +#: doc/classes/RenderingServer.xml:3184 +msgid "Shader is a 3D shader." +msgstr "" + +#: doc/classes/RenderingServer.xml:3187 +msgid "Shader is a 2D shader." +msgstr "" + +#: doc/classes/RenderingServer.xml:3190 +msgid "Shader is a particle shader." +msgstr "" + +#: doc/classes/RenderingServer.xml:3193 +msgid "Shader is a sky shader." +msgstr "" + +#: doc/classes/RenderingServer.xml:3196 +msgid "Represents the size of the [enum ShaderMode] enum." +msgstr "" + +#: 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:3208 +msgid "Array is a normal array." +msgstr "" + +#: doc/classes/RenderingServer.xml:3211 +msgid "Array is a tangent array." +msgstr "" + +#: doc/classes/RenderingServer.xml:3214 +msgid "Array is a color array." +msgstr "" + +#: doc/classes/RenderingServer.xml:3217 +msgid "Array is an UV coordinates array." +msgstr "" + +#: doc/classes/RenderingServer.xml:3220 +msgid "Array is an UV coordinates array for the second UV coordinates." +msgstr "" + +#: doc/classes/RenderingServer.xml:3223 +msgid "Array contains bone information." +msgstr "" + +#: doc/classes/RenderingServer.xml:3226 +msgid "Array is weight information." +msgstr "" + +#: doc/classes/RenderingServer.xml:3229 +msgid "Array is index array." +msgstr "" + +#: doc/classes/RenderingServer.xml:3235 +msgid "Flag used to mark a vertex array." +msgstr "" + +#: doc/classes/RenderingServer.xml:3238 +msgid "Flag used to mark a normal array." +msgstr "" + +#: doc/classes/RenderingServer.xml:3241 +msgid "Flag used to mark a tangent array." +msgstr "" + +#: doc/classes/RenderingServer.xml:3244 +msgid "Flag used to mark a color array." +msgstr "" + +#: doc/classes/RenderingServer.xml:3247 +msgid "Flag used to mark an UV coordinates array." +msgstr "" + +#: doc/classes/RenderingServer.xml:3250 +msgid "" +"Flag used to mark an UV coordinates array for the second UV coordinates." +msgstr "" + +#: doc/classes/RenderingServer.xml:3253 +msgid "Flag used to mark a bone information array." +msgstr "" + +#: doc/classes/RenderingServer.xml:3256 +msgid "Flag used to mark a weights array." +msgstr "" + +#: doc/classes/RenderingServer.xml:3259 +msgid "Flag used to mark an index array." +msgstr "" + +#: doc/classes/RenderingServer.xml:3288 +msgid "Primitive to draw consists of points." +msgstr "" + +#: doc/classes/RenderingServer.xml:3291 +msgid "Primitive to draw consists of lines." +msgstr "" + +#: doc/classes/RenderingServer.xml:3294 +msgid "Primitive to draw consists of a line strip from start to end." +msgstr "" + +#: doc/classes/RenderingServer.xml:3297 +msgid "Primitive to draw consists of triangles." +msgstr "" + +#: 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:3303 +msgid "Represents the size of the [enum PrimitiveType] enum." +msgstr "" + +#: doc/classes/RenderingServer.xml:3312 +msgid "Use [Transform2D] to store MultiMesh transform." +msgstr "" + +#: doc/classes/RenderingServer.xml:3315 +msgid "Use [Transform] to store MultiMesh transform." +msgstr "" + +#: doc/classes/RenderingServer.xml:3318 +msgid "Is a directional (sun) light." +msgstr "" + +#: doc/classes/RenderingServer.xml:3321 +msgid "Is an omni light." +msgstr "" + +#: doc/classes/RenderingServer.xml:3324 +msgid "Is a spot light." +msgstr "" + +#: doc/classes/RenderingServer.xml:3327 +msgid "The light's energy." +msgstr "" + +#: doc/classes/RenderingServer.xml:3332 +msgid "The light's influence on specularity." +msgstr "" + +#: doc/classes/RenderingServer.xml:3335 +msgid "The light's range." +msgstr "" + +#: 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:3344 +msgid "The spotlight's angle." +msgstr "" + +#: doc/classes/RenderingServer.xml:3347 +msgid "The spotlight's attenuation." +msgstr "" + +#: doc/classes/RenderingServer.xml:3350 +msgid "Max distance that shadows will be rendered." +msgstr "" + +#: doc/classes/RenderingServer.xml:3353 +msgid "Proportion of shadow atlas occupied by the first split." +msgstr "" + +#: doc/classes/RenderingServer.xml:3356 +msgid "Proportion of shadow atlas occupied by the second split." +msgstr "" + +#: 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: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:3368 +msgid "Bias the shadow lookup to fix self-shadowing artifacts." +msgstr "" + +#: doc/classes/RenderingServer.xml:3379 +msgid "Represents the size of the [enum LightParam] enum." +msgstr "" + +#: doc/classes/RenderingServer.xml:3382 +msgid "Use a dual paraboloid shadow map for omni lights." +msgstr "" + +#: 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:3388 +msgid "Use orthogonal shadow projection for directional light." +msgstr "" + +#: doc/classes/RenderingServer.xml:3391 +msgid "Use 2 splits for shadow projection when using directional light." +msgstr "" + +#: doc/classes/RenderingServer.xml:3394 +msgid "Use 4 splits for shadow projection when using directional light." +msgstr "" + +#: doc/classes/RenderingServer.xml:3397 +msgid "" +"Keeps shadows stable as camera moves but has lower effective resolution." +msgstr "" + +#: 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:3403 +msgid "Reflection probe will update reflections once and then stop." +msgstr "" + +#: 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:3419 +msgid "Draw particles in the order that they appear in the particles array." +msgstr "" + +#: doc/classes/RenderingServer.xml:3422 +msgid "Sort particles based on their lifetime." +msgstr "" + +#: doc/classes/RenderingServer.xml:3425 +msgid "Sort particles based on their distance to the camera." +msgstr "" + +#: doc/classes/RenderingServer.xml:3428 +msgid "Do not update the viewport." +msgstr "" + +#: doc/classes/RenderingServer.xml:3431 +msgid "Update the viewport once then set to disabled." +msgstr "" + +#: doc/classes/RenderingServer.xml:3434 +msgid "Update the viewport whenever it is visible." +msgstr "" + +#: doc/classes/RenderingServer.xml:3439 +msgid "Always update the viewport." +msgstr "" + +#: doc/classes/RenderingServer.xml:3442 +msgid "The viewport is always cleared before drawing." +msgstr "" + +#: doc/classes/RenderingServer.xml:3445 +msgid "The viewport is never cleared before drawing." +msgstr "" + +#: 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:3451 +msgid "Multisample antialiasing is disabled." +msgstr "" + +#: doc/classes/RenderingServer.xml:3454 +msgid "Multisample antialiasing uses 2 samples per pixel." +msgstr "" + +#: doc/classes/RenderingServer.xml:3457 +msgid "Multisample antialiasing uses 4 samples per pixel." +msgstr "" + +#: doc/classes/RenderingServer.xml:3460 +msgid "Multisample antialiasing uses 8 samples per pixel." +msgstr "" + +#: doc/classes/RenderingServer.xml:3463 +msgid "Multisample antialiasing uses 16 samples per pixel." +msgstr "" + +#: doc/classes/RenderingServer.xml:3474 +msgid "Number of objects drawn in a single frame." +msgstr "" + +#: doc/classes/RenderingServer.xml:3477 +msgid "Number of vertices drawn in a single frame." +msgstr "" + +#: doc/classes/RenderingServer.xml:3480 +msgid "Number of material changes during this frame." +msgstr "" + +#: doc/classes/RenderingServer.xml:3483 +msgid "Number of shader changes during this frame." +msgstr "" + +#: doc/classes/RenderingServer.xml:3486 +msgid "Number of surface changes during this frame." +msgstr "" + +#: doc/classes/RenderingServer.xml:3489 +msgid "Number of draw calls during this frame." +msgstr "" + +#: doc/classes/RenderingServer.xml:3492 +msgid "Represents the size of the [enum ViewportRenderInfo] enum." +msgstr "" + +#: doc/classes/RenderingServer.xml:3495 +msgid "Debug draw is disabled. Default setting." +msgstr "" + +#: 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: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:3507 +msgid "Debug draw draws objects in wireframe." +msgstr "" + +#: 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:3551 +msgid "Use a specified color as the background." +msgstr "" + +#: doc/classes/RenderingServer.xml:3554 +msgid "Use a sky resource for the background." +msgstr "" + +#: 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:3560 +msgid "" +"Do not clear the background, use whatever was rendered last frame as the " +"background." +msgstr "" + +#: doc/classes/RenderingServer.xml:3566 +msgid "Represents the size of the [enum EnvironmentBG] enum." +msgstr "" + +#: doc/classes/RenderingServer.xml:3605 +msgid "Output color as they came in." +msgstr "" + +#: doc/classes/RenderingServer.xml:3608 +msgid "Use the Reinhard tonemapper." +msgstr "" + +#: doc/classes/RenderingServer.xml:3611 +msgid "Use the filmic tonemapper." +msgstr "" + +#: doc/classes/RenderingServer.xml:3614 +msgid "Use the ACES tonemapper." +msgstr "" + +#: doc/classes/RenderingServer.xml:3625 +msgid "Disables the blur set for SSAO. Will make SSAO look noisier." +msgstr "" + +#: doc/classes/RenderingServer.xml:3628 +msgid "Perform a 1x1 blur on the SSAO output." +msgstr "" + +#: doc/classes/RenderingServer.xml:3631 +msgid "Performs a 2x2 blur on the SSAO output." +msgstr "" + +#: doc/classes/RenderingServer.xml:3634 +msgid "Performs a 3x3 blur on the SSAO output. Use this for smoothest SSAO." +msgstr "" + +#: doc/classes/RenderingServer.xml:3637 +msgid "Lowest quality of screen space ambient occlusion." +msgstr "" + +#: doc/classes/RenderingServer.xml:3640 +msgid "Medium quality screen space ambient occlusion." +msgstr "" + +#: 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: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:3693 +msgid "Draw all objects as wireframe models." +msgstr "" + +#: 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:3699 +msgid "" +"Draw all objects without shading. Equivalent to setting all objects shaders " +"to [code]unshaded[/code]." +msgstr "" + +#: doc/classes/RenderingServer.xml:3702 +msgid "The instance does not have a type." +msgstr "" + +#: doc/classes/RenderingServer.xml:3705 +msgid "The instance is a mesh." +msgstr "" + +#: doc/classes/RenderingServer.xml:3708 +msgid "The instance is a multimesh." +msgstr "" + +#: doc/classes/RenderingServer.xml:3711 +msgid "The instance is an immediate geometry." +msgstr "" + +#: doc/classes/RenderingServer.xml:3714 +msgid "The instance is a particle emitter." +msgstr "" + +#: doc/classes/RenderingServer.xml:3717 +msgid "The instance is a light." +msgstr "" + +#: doc/classes/RenderingServer.xml:3720 +msgid "The instance is a reflection probe." +msgstr "" + +#: 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:3729 +msgid "The instance is a lightmap capture." +msgstr "" + +#: doc/classes/RenderingServer.xml:3732 +msgid "Represents the size of the [enum InstanceType] enum." +msgstr "" + +#: doc/classes/RenderingServer.xml:3735 +msgid "" +"A combination of the flags of geometry instances (mesh, multimesh, immediate " +"and particles)." +msgstr "" + +#: doc/classes/RenderingServer.xml:3738 +msgid "Allows the instance to be used in baked lighting." +msgstr "" + +#: 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:3747 +msgid "Represents the size of the [enum InstanceFlags] enum." +msgstr "" + +#: doc/classes/RenderingServer.xml:3750 +msgid "Disable shadows from this instance." +msgstr "" + +#: doc/classes/RenderingServer.xml:3753 +msgid "Cast shadows from this instance." +msgstr "" + +#: 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:3759 +msgid "" +"Only render the shadows from the object. The object itself will not be drawn." +msgstr "" + +#: doc/classes/RenderingServer.xml:3762 +msgid "The nine patch gets stretched where needed." +msgstr "" + +#: doc/classes/RenderingServer.xml:3765 +msgid "The nine patch gets filled with tiles where needed." +msgstr "" + +#: 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: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:3813 +msgid "Adds light color subtractive to the canvas." +msgstr "" + +#: doc/classes/RenderingServer.xml:3816 +msgid "The light adds color depending on transparency." +msgstr "" + +#: doc/classes/RenderingServer.xml:3819 +msgid "The light adds color depending on mask." +msgstr "" + +#: doc/classes/RenderingServer.xml:3822 +msgid "Do not apply a filter to canvas light shadows." +msgstr "" + +#: doc/classes/RenderingServer.xml:3825 +msgid "Use PCF5 filtering to filter canvas light shadows." +msgstr "" + +#: doc/classes/RenderingServer.xml:3828 +msgid "Use PCF13 filtering to filter canvas light shadows." +msgstr "" + +#: 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:3837 +msgid "Culling of the canvas occluder is clockwise." +msgstr "" + +#: doc/classes/RenderingServer.xml:3840 +msgid "Culling of the canvas occluder is counterclockwise." +msgstr "" + +#: doc/classes/RenderingServer.xml:3901 +msgid "The amount of objects in the frame." +msgstr "" + +#: doc/classes/RenderingServer.xml:3904 +msgid "The amount of vertices in the frame." +msgstr "" + +#: doc/classes/RenderingServer.xml:3907 +msgid "The amount of modified materials in the frame." +msgstr "" + +#: doc/classes/RenderingServer.xml:3910 +msgid "The amount of shader rebinds in the frame." +msgstr "" + +#: doc/classes/RenderingServer.xml:3913 +msgid "The amount of surface changes in the frame." +msgstr "" + +#: doc/classes/RenderingServer.xml:3916 +msgid "The amount of draw calls in frame." +msgstr "" + +#: doc/classes/RenderingServer.xml:3931 +msgid "Hardware supports shaders. This enum is currently unused in Godot 3.x." +msgstr "" + +#: doc/classes/RenderingServer.xml:3934 +msgid "" +"Hardware supports multithreading. This enum is currently unused in Godot 3.x." +msgstr "" + #: doc/classes/Resource.xml:4 msgid "Base class for all resources." msgstr "" @@ -41763,7 +44200,7 @@ msgid "" "The RID type is used to access the unique integer ID of a resource. They are " "opaque, which means they do not grant access to the associated resource by " "themselves. They are used by and with the low-level Server classes such as " -"[VisualServer]." +"[RenderingServer]." msgstr "" #: doc/classes/RID.xml:18 @@ -41776,272 +44213,6 @@ msgstr "" msgid "Returns the ID of the referenced resource." msgstr "" -#: doc/classes/RigidBody.xml:4 -msgid "" -"Physics Body whose position is determined through physics simulation in 3D " -"space." -msgstr "" - -#: doc/classes/RigidBody.xml:7 -msgid "" -"This is the node that implements full 3D physics. This means that you do not " -"control a RigidBody directly. Instead, you can apply forces to it (gravity, " -"impulses, etc.), and the physics simulation will calculate the resulting " -"movement, collision, bouncing, rotating, etc.\n" -"A RigidBody has 4 behavior [member mode]s: Rigid, Static, Character, and " -"Kinematic.\n" -"[b]Note:[/b] Don't change a RigidBody's position every frame or very often. " -"Sporadic changes work fine, but physics runs at a different granularity " -"(fixed Hz) than usual rendering (process callback) and maybe even in a " -"separate thread, so changing this from a process loop may result in strange " -"behavior. If you need to directly affect the body's state, use [method " -"_integrate_forces], which allows you to directly access the physics state.\n" -"If you need to override the default physics behavior, you can write a custom " -"force integration function. See [member custom_integrator]." -msgstr "" - -#: doc/classes/RigidBody.xml:22 -msgid "" -"Called during physics processing, allowing you to read and safely modify the " -"simulation state for the object. By default, it works in addition to the " -"usual physics behavior, but the [member custom_integrator] property allows " -"you to disable the default behavior and do fully custom force integration " -"for a body." -msgstr "" - -#: doc/classes/RigidBody.xml:43 -msgid "Adds a constant force (i.e. acceleration)." -msgstr "" - -#: doc/classes/RigidBody.xml:52 -msgid "" -"Adds a constant rotational force (i.e. a motor) without affecting position." -msgstr "" - -#: doc/classes/RigidBody.xml:61 -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/RigidBody.xml:73 -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. " -"For this reason it should only be used when simulating one-time impacts. The " -"position uses the rotation of the global coordinate system, but is centered " -"at the object's origin." -msgstr "" - -#: doc/classes/RigidBody.xml:82 -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/RigidBody.xml:91 -msgid "" -"Returns [code]true[/code] if the specified linear or rotational axis is " -"locked." -msgstr "" - -#: doc/classes/RigidBody.xml:98 -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 " -"to increase it.\n" -"[b]Note:[/b] The result of this test is not immediate after moving objects. " -"For performance, list of collisions is updated once per frame and before the " -"physics step. Consider using signals instead." -msgstr "" - -#: doc/classes/RigidBody.xml:110 -msgid "Locks the specified linear or rotational axis." -msgstr "" - -#: doc/classes/RigidBody.xml:125 -msgid "Damps RigidBody's rotational forces." -msgstr "" - -#: doc/classes/RigidBody.xml:128 -msgid "RigidBody's rotational velocity." -msgstr "" - -#: doc/classes/RigidBody.xml:131 -msgid "Lock the body's rotation in the X axis." -msgstr "" - -#: doc/classes/RigidBody.xml:134 -msgid "Lock the body's rotation in the Y axis." -msgstr "" - -#: doc/classes/RigidBody.xml:137 -msgid "Lock the body's rotation in the Z axis." -msgstr "" - -#: doc/classes/RigidBody.xml:140 -msgid "Lock the body's movement in the X axis." -msgstr "" - -#: doc/classes/RigidBody.xml:143 -msgid "Lock the body's movement in the Y axis." -msgstr "" - -#: doc/classes/RigidBody.xml:146 -msgid "Lock the body's movement in the Z axis." -msgstr "" - -#: doc/classes/RigidBody.xml:149 -msgid "" -"If [code]true[/code], the RigidBody 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/RigidBody.xml:152 -msgid "" -"If [code]true[/code], the RigidBody will emit signals when it collides with " -"another RigidBody." -msgstr "" - -#: doc/classes/RigidBody.xml:155 -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/RigidBody.xml:158 -msgid "" -"If [code]true[/code], continuous collision detection is used.\n" -"Continuous collision detection tries to predict where a moving body will " -"collide, instead of moving it and correcting its movement if it collided. " -"Continuous collision detection is more precise, and misses fewer impacts by " -"small, fast-moving objects. Not using continuous collision detection is " -"faster to compute, but can miss small, fast-moving objects." -msgstr "" - -#: doc/classes/RigidBody.xml:162 -msgid "" -"If [code]true[/code], internal force integration will be disabled (like " -"gravity or air friction) for this body. Other than collision response, the " -"body will only move as determined by the [method _integrate_forces] " -"function, if defined." -msgstr "" - -#: doc/classes/RigidBody.xml:165 -msgid "" -"This is multiplied by the global 3D gravity setting found in [b]Project > " -"Project Settings > Physics > 3d[/b] to produce RigidBody'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/RigidBody.xml:168 -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/RigidBody.xml:171 -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 " -"different granularity. Use [method _integrate_forces] as your process loop " -"for precise control of the body state." -msgstr "" - -#: doc/classes/RigidBody.xml:174 doc/classes/RigidBody2D.xml:158 -msgid "The body's mass." -msgstr "" - -#: doc/classes/RigidBody.xml:177 -msgid "The body mode. See [enum Mode] for possible values." -msgstr "" - -#: doc/classes/RigidBody.xml:180 doc/classes/RigidBody2D.xml:164 -#: doc/classes/StaticBody.xml:22 doc/classes/StaticBody2D.xml:22 -msgid "" -"The physics material override for the body.\n" -"If a material is assigned to this property, it will be used instead of any " -"other physics material, such as an inherited one." -msgstr "" - -#: doc/classes/RigidBody.xml:184 -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/RigidBody.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/RigidBody.xml:195 -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/RigidBody.xml:202 -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/RigidBody.xml:215 -msgid "" -"Emitted when a body enters into contact with this one. Contact monitor and " -"contacts reported must be enabled for this to work.\n" -"This signal not only receives the body that collided with this one, but also " -"its [RID] ([code]body_id[/code]), the shape index from the colliding body " -"([code]body_shape[/code]), and the shape index from this body " -"([code]local_shape[/code]) the other body collided with." -msgstr "" - -#: doc/classes/RigidBody.xml:229 -msgid "" -"Emitted when a body shape exits contact with this one. Contact monitor and " -"contacts reported must be enabled for this to work.\n" -"This signal not only receives the body that stopped colliding with this one, " -"but also its [RID] ([code]body_id[/code]), the shape index from the " -"colliding body ([code]body_shape[/code]), and the shape index from this body " -"([code]local_shape[/code]) the other body stopped colliding with." -msgstr "" - -#: doc/classes/RigidBody.xml:235 -msgid "" -"Emitted when the body changes its sleeping state. Either by sleeping or " -"waking up." -msgstr "" - -#: doc/classes/RigidBody.xml:241 -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/RigidBody.xml:244 -msgid "" -"Static mode. The body behaves like a [StaticBody], and can only move by user " -"code." -msgstr "" - -#: doc/classes/RigidBody.xml:247 -msgid "" -"Character body mode. This behaves like a rigid body, but can not rotate." -msgstr "" - -#: doc/classes/RigidBody.xml:250 -msgid "" -"Kinematic body mode. The body behaves like a [KinematicBody], and can only " -"move by user code." -msgstr "" - #: doc/classes/RigidBody2D.xml:4 msgid "A body that is controlled by the 2D physics engine." msgstr "" @@ -42108,7 +44279,7 @@ msgid "" "Returns [code]true[/code] if a collision would result from moving in the " "given vector. [code]margin[/code] increases the size of the shapes involved " "in the collision detection, and [code]result[/code] is an object of type " -"[Physics2DTestMotionResult], which contains additional information about the " +"[PhysicsTestMotionResult2D], which contains additional information about the " "collision (should there be one)." msgstr "" @@ -42189,6 +44360,14 @@ msgstr "" msgid "The body's mode. See [enum Mode] for possible values." msgstr "" +#: 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" +"If a material is assigned to this property, it will be used instead of any " +"other physics material, such as an inherited one." +msgstr "" + #: doc/classes/RigidBody2D.xml:168 msgid "" "If [code]true[/code], the body is sleeping and will not calculate forces " @@ -42276,6 +44455,233 @@ msgid "" "slowest CCD method and the most precise." msgstr "" +#: doc/classes/RigidBody3D.xml:4 +msgid "" +"Physics Body whose position is determined through physics simulation in 3D " +"space." +msgstr "" + +#: doc/classes/RigidBody3D.xml:7 +msgid "" +"This is the node that implements full 3D physics. This means that you do not " +"control a RigidBody3D directly. Instead, you can apply forces to it " +"(gravity, impulses, etc.), and the physics simulation will calculate the " +"resulting movement, collision, bouncing, rotating, etc.\n" +"A RigidBody3D has 4 behavior [member mode]s: Rigid, Static, Character, and " +"Kinematic.\n" +"[b]Note:[/b] Don't change a RigidBody3D's position every frame or very " +"often. Sporadic changes work fine, but physics runs at a different " +"granularity (fixed Hz) than usual rendering (process callback) and maybe " +"even in a separate thread, so changing this from a process loop may result " +"in strange behavior. If you need to directly affect the body's state, use " +"[method _integrate_forces], which allows you to directly access the physics " +"state.\n" +"If you need to override the default physics behavior, you can write a custom " +"force integration function. See [member custom_integrator]." +msgstr "" + +#: doc/classes/RigidBody3D.xml:22 +msgid "" +"Called during physics processing, allowing you to read and safely modify the " +"simulation state for the object. By default, it works in addition to the " +"usual physics behavior, but the [member custom_integrator] property allows " +"you to disable the default behavior and do fully custom force integration " +"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 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:53 +msgid "" +"Adds a constant rotational force (i.e. a motor) without affecting position." +msgstr "" + +#: 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: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. " +"For this reason it should only be used when simulating one-time impacts. The " +"position uses the rotation of the global coordinate system, but is centered " +"at the object's origin." +msgstr "" + +#: 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:92 +msgid "" +"Returns [code]true[/code] if the specified linear or rotational axis is " +"locked." +msgstr "" + +#: 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 " +"to increase it.\n" +"[b]Note:[/b] The result of this test is not immediate after moving objects. " +"For performance, list of collisions is updated once per frame and before the " +"physics step. Consider using signals instead." +msgstr "" + +#: doc/classes/RigidBody3D.xml:111 +msgid "Locks the specified linear or rotational axis." +msgstr "" + +#: doc/classes/RigidBody3D.xml:126 +msgid "Damps RigidBody3D's rotational forces." +msgstr "" + +#: doc/classes/RigidBody3D.xml:129 +msgid "RigidBody3D's rotational velocity." +msgstr "" + +#: 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: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:159 +msgid "" +"If [code]true[/code], continuous collision detection is used.\n" +"Continuous collision detection tries to predict where a moving body will " +"collide, instead of moving it and correcting its movement if it collided. " +"Continuous collision detection is more precise, and misses fewer impacts by " +"small, fast-moving objects. Not using continuous collision detection is " +"faster to compute, but can miss small, fast-moving objects." +msgstr "" + +#: 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 " +"body will only move as determined by the [method _integrate_forces] " +"function, if defined." +msgstr "" + +#: 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 " +"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/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: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 " +"different granularity. Use [method _integrate_forces] as your process loop " +"for precise control of the body state." +msgstr "" + +#: doc/classes/RigidBody3D.xml:178 +msgid "The body mode. See [enum Mode] for possible values." +msgstr "" + +#: 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: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: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: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" +"This signal not only receives the body that collided with this one, but also " +"its [RID] ([code]body_id[/code]), the shape index from the colliding body " +"([code]body_shape[/code]), and the shape index from this body " +"([code]local_shape[/code]) the other body collided with." +msgstr "" + +#: 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" +"This signal not only receives the body that stopped colliding with this one, " +"but also its [RID] ([code]body_id[/code]), the shape index from the " +"colliding body ([code]body_shape[/code]), and the shape index from this body " +"([code]local_shape[/code]) the other body stopped colliding with." +msgstr "" + +#: 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: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:245 +msgid "" +"Static mode. The body behaves like a [StaticBody3D], and can only move by " +"user code." +msgstr "" + +#: doc/classes/RigidBody3D.xml:248 +msgid "" +"Character body mode. This behaves like a rigid body, but can not rotate." +msgstr "" + +#: doc/classes/RigidBody3D.xml:251 +msgid "" +"Kinematic body mode. The body behaves like a [KinematicBody3D], and can only " +"move by user code." +msgstr "" + #: doc/classes/SceneState.xml:4 msgid "A script interface to a scene file's data." msgstr "" @@ -42534,33 +44940,27 @@ msgstr "" #: doc/classes/SceneTree.xml:142 msgid "" -"Returns [code]true[/code] if the most recent [InputEvent] was marked as " -"handled with [method set_input_as_handled]." -msgstr "" - -#: doc/classes/SceneTree.xml:149 -msgid "" "Returns [code]true[/code] if this [SceneTree]'s [member network_peer] is in " "server mode (listening for connections)." msgstr "" -#: doc/classes/SceneTree.xml:160 +#: doc/classes/SceneTree.xml:153 msgid "Sends the given notification to all members of the [code]group[/code]." msgstr "" -#: doc/classes/SceneTree.xml:173 +#: doc/classes/SceneTree.xml:166 msgid "" "Sends the given notification to all members of the [code]group[/code], " "respecting the given [enum GroupCallFlags]." msgstr "" -#: doc/classes/SceneTree.xml:182 +#: doc/classes/SceneTree.xml:175 msgid "" "Queues the given object for deletion, delaying the call to [method Object." "free] to after the current frame." msgstr "" -#: doc/classes/SceneTree.xml:191 +#: doc/classes/SceneTree.xml:184 msgid "" "Quits the application. A process [code]exit_code[/code] can optionally be " "passed as an argument. If this argument is [code]0[/code] or greater, it " @@ -42568,7 +44968,7 @@ msgid "" "application." msgstr "" -#: doc/classes/SceneTree.xml:198 +#: doc/classes/SceneTree.xml:191 msgid "" "Reloads the currently active scene.\n" "Returns [constant OK] on success, [constant ERR_UNCONFIGURED] if no [member " @@ -42577,68 +44977,58 @@ msgid "" "ERR_CANT_CREATE] if the scene cannot be instantiated." msgstr "" -#: doc/classes/SceneTree.xml:208 +#: doc/classes/SceneTree.xml:201 msgid "" "If [code]true[/code], the application automatically accepts quitting. " "Enabled by default.\n" "For mobile platforms, see [method set_quit_on_go_back]." msgstr "" -#: doc/classes/SceneTree.xml:222 +#: doc/classes/SceneTree.xml:215 msgid "" "Sets the given [code]property[/code] to [code]value[/code] on all members of " "the given group." msgstr "" -#: doc/classes/SceneTree.xml:237 +#: doc/classes/SceneTree.xml:230 msgid "" "Sets the given [code]property[/code] to [code]value[/code] on all members of " "the given group, respecting the given [enum GroupCallFlags]." msgstr "" -#: doc/classes/SceneTree.xml:244 -msgid "Marks the most recent [InputEvent] as handled." -msgstr "" - -#: doc/classes/SceneTree.xml:253 +#: doc/classes/SceneTree.xml:239 msgid "" "If [code]true[/code], the application quits automatically on going back (e." "g. on Android). Enabled by default.\n" "To handle 'Go Back' button when this option is disabled, use [constant " -"MainLoop.NOTIFICATION_WM_GO_BACK_REQUEST]." +"DisplayServer.WINDOW_EVENT_GO_BACK_REQUEST]." msgstr "" -#: doc/classes/SceneTree.xml:269 -msgid "" -"Configures screen stretching to the given [enum StretchMode], [enum " -"StretchAspect], minimum size and [code]shrink[/code] ratio." -msgstr "" - -#: doc/classes/SceneTree.xml:275 +#: doc/classes/SceneTree.xml:246 msgid "The current scene." msgstr "" -#: doc/classes/SceneTree.xml:278 +#: doc/classes/SceneTree.xml:249 msgid "" "If [code]true[/code], collision shapes will be visible when running the game " "from the editor for debugging purposes." msgstr "" -#: doc/classes/SceneTree.xml:281 +#: doc/classes/SceneTree.xml:252 msgid "" "If [code]true[/code], navigation polygons will be visible when running the " "game from the editor for debugging purposes." msgstr "" -#: doc/classes/SceneTree.xml:284 +#: doc/classes/SceneTree.xml:255 msgid "The root of the edited scene." msgstr "" -#: doc/classes/SceneTree.xml:287 +#: doc/classes/SceneTree.xml:258 msgid "The default [MultiplayerAPI] instance for this [SceneTree]." msgstr "" -#: doc/classes/SceneTree.xml:290 +#: doc/classes/SceneTree.xml:261 msgid "" "If [code]true[/code] (default value), enables automatic polling of the " "[MultiplayerAPI] for this SceneTree during [signal idle_frame].\n" @@ -42649,7 +45039,7 @@ msgid "" "threads." msgstr "" -#: doc/classes/SceneTree.xml:294 +#: doc/classes/SceneTree.xml:265 msgid "" "The peer object to handle the RPC system (effectively enabling networking " "when set). Depending on the peer itself, the [SceneTree] will become a " @@ -42660,7 +45050,7 @@ msgid "" "disconnection, new clients) is done by connecting to [SceneTree]'s signals." msgstr "" -#: doc/classes/SceneTree.xml:297 +#: doc/classes/SceneTree.xml:268 msgid "" "If [code]true[/code], the [SceneTree] is paused. Doing so will have the " "following behavior:\n" @@ -42669,50 +45059,42 @@ msgid "" "_input] will not be called anymore in nodes." msgstr "" -#: doc/classes/SceneTree.xml:302 +#: doc/classes/SceneTree.xml:273 msgid "" "If [code]true[/code], the [SceneTree]'s [member network_peer] refuses new " "incoming connections." msgstr "" -#: doc/classes/SceneTree.xml:305 -msgid "The [SceneTree]'s root [Viewport]." -msgstr "" - -#: doc/classes/SceneTree.xml:308 -msgid "If [code]true[/code], font oversampling is used." +#: doc/classes/SceneTree.xml:276 +msgid "The [SceneTree]'s root [Window]." msgstr "" -#: doc/classes/SceneTree.xml:314 +#: doc/classes/SceneTree.xml:282 msgid "" "Emitted whenever this [SceneTree]'s [member network_peer] successfully " "connected to a server. Only emitted on clients." msgstr "" -#: doc/classes/SceneTree.xml:319 +#: doc/classes/SceneTree.xml:287 msgid "" "Emitted whenever this [SceneTree]'s [member network_peer] fails to establish " "a connection to a server. Only emitted on clients." msgstr "" -#: doc/classes/SceneTree.xml:328 +#: doc/classes/SceneTree.xml:296 msgid "" "Emitted when files are dragged from the OS file manager and dropped in the " "game window. The arguments are a list of file paths and the identifier of " "the screen where the drag originated." msgstr "" -#: doc/classes/SceneTree.xml:337 -msgid "Emitted whenever global menu item is clicked." -msgstr "" - -#: doc/classes/SceneTree.xml:342 +#: doc/classes/SceneTree.xml:301 msgid "" "Emitted immediately before [method Node._process] is called on every node in " "the [SceneTree]." msgstr "" -#: doc/classes/SceneTree.xml:349 +#: doc/classes/SceneTree.xml:308 msgid "" "Emitted whenever this [SceneTree]'s [member network_peer] connects with a " "new peer. ID is the peer ID of the new peer. Clients get notified when other " @@ -42720,115 +45102,65 @@ msgid "" "also receives this signal for the server (with ID being 1)." msgstr "" -#: doc/classes/SceneTree.xml:356 +#: doc/classes/SceneTree.xml:315 msgid "" "Emitted whenever this [SceneTree]'s [member network_peer] disconnects from a " "peer. Clients get notified when other clients disconnect from the same " "server." msgstr "" -#: doc/classes/SceneTree.xml:363 +#: doc/classes/SceneTree.xml:322 msgid "Emitted whenever a node is added to the [SceneTree]." msgstr "" -#: doc/classes/SceneTree.xml:370 +#: doc/classes/SceneTree.xml:329 msgid "" "Emitted when a node's configuration changed. Only emitted in [code]tool[/" "code] mode." msgstr "" -#: doc/classes/SceneTree.xml:377 +#: doc/classes/SceneTree.xml:336 msgid "Emitted whenever a node is removed from the [SceneTree]." msgstr "" -#: doc/classes/SceneTree.xml:384 +#: doc/classes/SceneTree.xml:343 msgid "Emitted whenever a node is renamed." msgstr "" -#: doc/classes/SceneTree.xml:389 +#: doc/classes/SceneTree.xml:348 msgid "" "Emitted immediately before [method Node._physics_process] is called on every " "node in the [SceneTree]." msgstr "" -#: doc/classes/SceneTree.xml:394 -msgid "" -"Emitted when the screen resolution (fullscreen) or window size (windowed) " -"changes." -msgstr "" - -#: doc/classes/SceneTree.xml:399 +#: doc/classes/SceneTree.xml:353 msgid "" "Emitted whenever this [SceneTree]'s [member network_peer] disconnected from " "server. Only emitted on clients." msgstr "" -#: doc/classes/SceneTree.xml:404 +#: doc/classes/SceneTree.xml:358 msgid "" "Emitted whenever the [SceneTree] hierarchy changed (children being moved or " "renamed, etc.)." msgstr "" -#: doc/classes/SceneTree.xml:410 +#: doc/classes/SceneTree.xml:364 msgid "Call a group with no flags (default)." msgstr "" -#: doc/classes/SceneTree.xml:413 +#: doc/classes/SceneTree.xml:367 msgid "Call a group in reverse scene order." msgstr "" -#: doc/classes/SceneTree.xml:416 +#: doc/classes/SceneTree.xml:370 msgid "Call a group immediately (calls are normally made on idle)." msgstr "" -#: doc/classes/SceneTree.xml:419 +#: doc/classes/SceneTree.xml:373 msgid "Call a group only once even if the call is executed many times." msgstr "" -#: doc/classes/SceneTree.xml:422 -msgid "No stretching." -msgstr "" - -#: doc/classes/SceneTree.xml:425 -msgid "Render stretching in higher resolution (interpolated)." -msgstr "" - -#: doc/classes/SceneTree.xml:428 -msgid "" -"Keep the specified display resolution. No interpolation. Content may appear " -"pixelated." -msgstr "" - -#: doc/classes/SceneTree.xml:431 -msgid "" -"Fill the window with the content stretched to cover excessive space. Content " -"may appear stretched." -msgstr "" - -#: doc/classes/SceneTree.xml:434 -msgid "" -"Retain the same aspect ratio by padding with black bars on either axis. This " -"prevents distortion." -msgstr "" - -#: doc/classes/SceneTree.xml:437 -msgid "" -"Expand vertically. Left/right black bars may appear if the window is too " -"wide." -msgstr "" - -#: doc/classes/SceneTree.xml:440 -msgid "" -"Expand horizontally. Top/bottom black bars may appear if the window is too " -"tall." -msgstr "" - -#: doc/classes/SceneTree.xml:443 -msgid "" -"Expand in both directions, retaining the same aspect ratio. This prevents " -"distortion while avoiding black bars." -msgstr "" - #: doc/classes/SceneTreeTimer.xml:4 msgid "One-shot timer." msgstr "" @@ -42946,7 +45278,7 @@ msgstr "" msgid "" "The [ScriptCreateDialog] creates script files according to a given template " "for a given scripting language. The standard use is to configure its fields " -"prior to calling one of the [method Popup.popup] methods.\n" +"prior to calling one of the [method Window.popup] methods.\n" "[codeblock]\n" "func _ready():\n" " dialog.config(\"Node\", \"res://new_node.gd\") # For in-engine types\n" @@ -42960,7 +45292,7 @@ msgstr "" msgid "Prefills required fields to configure the ScriptCreateDialog for use." msgstr "" -#: doc/classes/ScriptCreateDialog.xml:46 +#: doc/classes/ScriptCreateDialog.xml:43 msgid "Emitted when the user clicks the OK button." msgstr "" @@ -42968,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." @@ -43050,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 "" @@ -43058,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 "" @@ -43204,6 +45542,12 @@ msgid "" "used for drawing." msgstr "" +#: doc/classes/Shader.xml:70 +msgid "" +"Mode used for drawing skies. Only works with shaders attached to [Sky] " +"objects." +msgstr "" + #: doc/classes/ShaderMaterial.xml:4 msgid "A material that uses a custom [Shader] program." msgstr "" @@ -43243,16 +45587,6 @@ msgstr "" msgid "The [Shader] program used to render this material." msgstr "" -#: doc/classes/Shape.xml:4 -msgid "Base class for all 3D shape resources." -msgstr "" - -#: doc/classes/Shape.xml:7 -msgid "" -"Base class for all 3D shape resources. Nodes that inherit from this can be " -"used as shapes for a [PhysicsBody] or [Area] objects." -msgstr "" - #: doc/classes/Shape2D.xml:4 msgid "Base class for all 2D shapes." msgstr "" @@ -43308,6 +45642,16 @@ msgstr "" msgid "The shape's custom solver bias." msgstr "" +#: doc/classes/Shape3D.xml:4 +msgid "Base class for all 3D shape resources." +msgstr "" + +#: doc/classes/Shape3D.xml:7 +msgid "" +"Base class for all 3D shape resources. Nodes that inherit from this can be " +"used as shapes for a [PhysicsBody3D] or [Area3D] objects." +msgstr "" + #: doc/classes/ShortCut.xml:4 msgid "A shortcut for binding input." msgstr "" @@ -43387,13 +45731,47 @@ msgid "" "signal." msgstr "" -#: doc/classes/Skeleton.xml:4 +#: doc/classes/Skeleton2D.xml:4 +msgid "Skeleton for 2D characters and animated objects." +msgstr "" + +#: doc/classes/Skeleton2D.xml:7 +msgid "" +"Skeleton2D parents a hierarchy of [Bone2D] objects. It is a requirement of " +"[Bone2D]. Skeleton2D holds a reference to the rest pose of its children and " +"acts as a single point of access to its bones." +msgstr "" + +#: doc/classes/Skeleton2D.xml:10 +msgid "" +"https://docs.godotengine.org/en/latest/tutorials/animation/2d_skeletons.html" +msgstr "" + +#: doc/classes/Skeleton2D.xml:19 +msgid "" +"Returns a [Bone2D] from the node hierarchy parented by Skeleton2D. The " +"object to return is identified by the parameter [code]idx[/code]. Bones are " +"indexed by descending the node hierarchy from top to bottom, adding the " +"children of each branch before moving to the next sibling." +msgstr "" + +#: doc/classes/Skeleton2D.xml:26 +msgid "" +"Returns the number of [Bone2D] nodes in the node hierarchy parented by " +"Skeleton2D." +msgstr "" + +#: doc/classes/Skeleton2D.xml:33 +msgid "Returns the [RID] of a Skeleton2D instance." +msgstr "" + +#: doc/classes/Skeleton3D.xml:4 msgid "Skeleton for characters and animated objects." msgstr "" -#: doc/classes/Skeleton.xml:7 +#: doc/classes/Skeleton3D.xml:7 msgid "" -"Skeleton provides a hierarchical interface for managing bones, including " +"Skeleton3D provides a hierarchical interface for managing bones, including " "pose, rest and animation (see [Animation]). It can also use ragdoll " "physics.\n" "The overall transform of a bone with respect to the skeleton is determined " @@ -43403,47 +45781,47 @@ msgid "" "bone." msgstr "" -#: doc/classes/Skeleton.xml:20 +#: doc/classes/Skeleton3D.xml:20 msgid "" "Adds a bone, with name [code]name[/code]. [method get_bone_count] will " "become the bone index." msgstr "" -#: doc/classes/Skeleton.xml:31 doc/classes/Skeleton.xml:118 -#: doc/classes/Skeleton.xml:249 +#: doc/classes/Skeleton3D.xml:31 doc/classes/Skeleton3D.xml:124 +#: doc/classes/Skeleton3D.xml:255 msgid "[i]Deprecated soon.[/i]" msgstr "" -#: doc/classes/Skeleton.xml:38 +#: doc/classes/Skeleton3D.xml:38 msgid "Clear all the bones in this skeleton." msgstr "" -#: doc/classes/Skeleton.xml:47 +#: doc/classes/Skeleton3D.xml:53 msgid "Returns the bone index that matches [code]name[/code] as its name." msgstr "" -#: doc/classes/Skeleton.xml:54 +#: doc/classes/Skeleton3D.xml:60 msgid "Returns the amount of bones in the skeleton." msgstr "" -#: doc/classes/Skeleton.xml:63 +#: doc/classes/Skeleton3D.xml:69 msgid "" "Returns the custom pose of the specified bone. Custom pose is applied on top " "of the rest pose." msgstr "" -#: doc/classes/Skeleton.xml:72 +#: doc/classes/Skeleton3D.xml:78 msgid "" "Returns the overall transform of the specified bone, with respect to the " "skeleton. Being relative to the skeleton frame, this is not the actual " "\"global\" transform of the bone." msgstr "" -#: doc/classes/Skeleton.xml:81 +#: doc/classes/Skeleton3D.xml:87 msgid "Returns the name of the bone at index [code]index[/code]." msgstr "" -#: doc/classes/Skeleton.xml:90 +#: doc/classes/Skeleton3D.xml:96 msgid "" "Returns the bone index which is the parent of the bone at [code]bone_idx[/" "code]. If -1, then bone has no parent.\n" @@ -43451,67 +45829,39 @@ msgid "" "[code]bone_idx[/code]." msgstr "" -#: doc/classes/Skeleton.xml:100 +#: doc/classes/Skeleton3D.xml:106 msgid "" "Returns the pose transform of the specified bone. Pose is applied on top of " "the custom pose, which is applied on top the rest pose." msgstr "" -#: doc/classes/Skeleton.xml:109 +#: doc/classes/Skeleton3D.xml:115 msgid "Returns the rest transform for a bone [code]bone_idx[/code]." msgstr "" -#: doc/classes/Skeleton.xml:215 +#: doc/classes/Skeleton3D.xml:221 msgid "" "Sets the bone index [code]parent_idx[/code] as the parent of the bone at " "[code]bone_idx[/code]. If -1, then bone has no parent.\n" "[b]Note:[/b] [code]parent_idx[/code] must be less than [code]bone_idx[/code]." msgstr "" -#: doc/classes/Skeleton.xml:227 +#: doc/classes/Skeleton3D.xml:233 msgid "Returns the pose transform for bone [code]bone_idx[/code]." msgstr "" -#: doc/classes/Skeleton.xml:238 +#: doc/classes/Skeleton3D.xml:244 msgid "Sets the rest transform for bone [code]bone_idx[/code]." msgstr "" -#: doc/classes/Skeleton2D.xml:4 -msgid "Skeleton for 2D characters and animated objects." +#: doc/classes/Sky.xml:4 +msgid "Background that uses a [Material] to draw a sky." msgstr "" -#: doc/classes/Skeleton2D.xml:7 +#: doc/classes/Sky.xml:7 msgid "" -"Skeleton2D parents a hierarchy of [Bone2D] objects. It is a requirement of " -"[Bone2D]. Skeleton2D holds a reference to the rest pose of its children and " -"acts as a single point of access to its bones." -msgstr "" - -#: doc/classes/Skeleton2D.xml:10 -msgid "" -"https://docs.godotengine.org/en/latest/tutorials/animation/2d_skeletons.html" -msgstr "" - -#: doc/classes/Skeleton2D.xml:19 -msgid "" -"Returns a [Bone2D] from the node hierarchy parented by Skeleton2D. The " -"object to return is identified by the parameter [code]idx[/code]. Bones are " -"indexed by descending the node hierarchy from top to bottom, adding the " -"children of each branch before moving to the next sibling." -msgstr "" - -#: doc/classes/Skeleton2D.xml:26 -msgid "" -"Returns the number of [Bone2D] nodes in the node hierarchy parented by " -"Skeleton2D." -msgstr "" - -#: doc/classes/Skeleton2D.xml:33 -msgid "Returns the [RID] of a Skeleton2D instance." -msgstr "" - -#: doc/classes/Sky.xml:4 doc/classes/Sky.xml:7 -msgid "The base class for [PanoramaSky] and [ProceduralSky]." +"The [Sky] class uses a [Material] to draw the background and update the " +"reflection/radiance cubemaps." msgstr "" #: doc/classes/Sky.xml:15 @@ -43532,52 +45882,62 @@ msgid "" "on high-end hardware." msgstr "" -#: doc/classes/Sky.xml:25 -msgid "Radiance texture size is 32×32 pixels." +#: doc/classes/Sky.xml:23 +msgid "" +"[Material] used to draw the background. Can be [PanoramaSkyMaterial], " +"[ProceduralSkyMaterial], [PhysicalSkyMaterial], or even a [ShaderMaterial] " +"if you want to use your own custom shader." msgstr "" #: doc/classes/Sky.xml:28 -msgid "Radiance texture size is 64×64 pixels." +msgid "Radiance texture size is 32×32 pixels." msgstr "" #: doc/classes/Sky.xml:31 -msgid "Radiance texture size is 128×128 pixels." +msgid "Radiance texture size is 64×64 pixels." msgstr "" #: doc/classes/Sky.xml:34 -msgid "Radiance texture size is 256×256 pixels." +msgid "Radiance texture size is 128×128 pixels." msgstr "" #: doc/classes/Sky.xml:37 -msgid "Radiance texture size is 512×512 pixels." +msgid "Radiance texture size is 256×256 pixels." msgstr "" #: doc/classes/Sky.xml:40 -msgid "Radiance texture size is 1024×1024 pixels." +msgid "Radiance texture size is 512×512 pixels." msgstr "" #: doc/classes/Sky.xml:43 -msgid "Radiance texture size is 2048×2048 pixels." +msgid "Radiance texture size is 1024×1024 pixels." msgstr "" #: doc/classes/Sky.xml:46 -msgid "Represents the size of the [enum RadianceSize] enum." +msgid "Radiance texture size is 2048×2048 pixels." msgstr "" #: doc/classes/Sky.xml:49 +msgid "Represents the size of the [enum RadianceSize] enum." +msgstr "" + +#: doc/classes/Sky.xml:52 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:52 +#: doc/classes/Sky.xml:55 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 128x128 cubemaps, so " -"[member radiance_size] must be set to [constant RADIANCE_SIZE_128]." +"[b]Note:[/b] The fast filtering algorithm is limited to 256x256 cubemaps, so " +"[member radiance_size] must be set to [constant RADIANCE_SIZE_256]." msgstr "" #: doc/classes/Slider.xml:4 doc/classes/Slider.xml:7 @@ -43606,72 +45966,72 @@ msgid "" "values." msgstr "" -#: doc/classes/SliderJoint.xml:4 +#: doc/classes/SliderJoint3D.xml:4 msgid "Piston kind of slider between two bodies in 3D." msgstr "" -#: doc/classes/SliderJoint.xml:7 +#: doc/classes/SliderJoint3D.xml:7 msgid "Slides across the X axis of the pivot object." msgstr "" -#: doc/classes/SliderJoint.xml:33 +#: doc/classes/SliderJoint3D.xml:33 msgid "" "The amount of damping of the rotation when the limit is surpassed.\n" "A lower damping value allows a rotation initiated by body A to travel to " "body B slower." msgstr "" -#: doc/classes/SliderJoint.xml:40 +#: doc/classes/SliderJoint3D.xml:40 msgid "" "The amount of restitution of the rotation when the limit is surpassed.\n" "Does not affect damping." msgstr "" -#: doc/classes/SliderJoint.xml:44 +#: doc/classes/SliderJoint3D.xml:44 msgid "" "A factor applied to the all rotation once the limit is surpassed.\n" "Makes all rotation slower when between 0 and 1." msgstr "" -#: doc/classes/SliderJoint.xml:57 doc/classes/SliderJoint.xml:152 +#: doc/classes/SliderJoint3D.xml:57 doc/classes/SliderJoint3D.xml:152 msgid "A factor applied to the all rotation in the limits." msgstr "" -#: doc/classes/SliderJoint.xml:66 doc/classes/SliderJoint.xml:161 +#: doc/classes/SliderJoint3D.xml:66 doc/classes/SliderJoint3D.xml:161 msgid "" "A factor applied to the all rotation across axes orthogonal to the slider." msgstr "" -#: doc/classes/SliderJoint.xml:69 +#: doc/classes/SliderJoint3D.xml:69 msgid "" "The amount of damping that happens once the limit defined by [member " "linear_limit/lower_distance] and [member linear_limit/upper_distance] is " "surpassed." msgstr "" -#: doc/classes/SliderJoint.xml:75 +#: doc/classes/SliderJoint3D.xml:75 msgid "" "The amount of restitution once the limits are surpassed. The lower, the more " "velocity-energy gets lost." msgstr "" -#: doc/classes/SoftBody.xml:4 +#: doc/classes/SoftBody3D.xml:4 msgid "A soft mesh physics body." msgstr "" -#: doc/classes/SoftBody.xml:7 +#: doc/classes/SoftBody3D.xml:7 msgid "" "A deformable physics body. Used to create elastic or deformable objects such " "as cloth, rubber, or other flexible materials." msgstr "" -#: doc/classes/SoftBody.xml:10 +#: doc/classes/SoftBody3D.xml:10 msgid "https://docs.godotengine.org/en/latest/tutorials/physics/soft_body.html" msgstr "" -#: doc/classes/SoftBody.xml:83 +#: doc/classes/SoftBody3D.xml:83 msgid "" -"The physics layers this SoftBody is in.\n" +"The physics layers this SoftBody3D is in.\n" "Collidable objects can exist in any of 32 different layers. These layers " "work like a tagging system, and are not visual. A collidable can use these " "layers to select with which objects it can collide, using the collision_mask " @@ -43680,314 +46040,27 @@ msgid "" "scans, or object B is in any layer scanned by object A." msgstr "" -#: doc/classes/SoftBody.xml:88 -msgid "The physics layers this SoftBody scans for collisions." +#: doc/classes/SoftBody3D.xml:88 +msgid "The physics layers this SoftBody3D scans for collisions." msgstr "" -#: doc/classes/SoftBody.xml:97 -msgid "[NodePath] to a [CollisionObject] this SoftBody should avoid clipping." +#: doc/classes/SoftBody3D.xml:97 +msgid "" +"[NodePath] to a [CollisionObject3D] this SoftBody3D should avoid clipping." msgstr "" -#: doc/classes/SoftBody.xml:104 -msgid "If [code]true[/code], the [SoftBody] will respond to [RayCast]s." +#: doc/classes/SoftBody3D.xml:104 +msgid "If [code]true[/code], the [SoftBody3D] will respond to [RayCast3D]s." msgstr "" -#: doc/classes/SoftBody.xml:107 +#: doc/classes/SoftBody3D.xml:107 msgid "" "Increasing this value will improve the resulting simulation, but can affect " "performance. Use with care." msgstr "" -#: doc/classes/SoftBody.xml:110 -msgid "The SoftBody's mass." -msgstr "" - -#: doc/classes/Spatial.xml:4 -msgid "Most basic 3D game object, parent of all 3D-related nodes." -msgstr "" - -#: doc/classes/Spatial.xml:7 -msgid "" -"Most basic 3D game object, with a 3D [Transform] and visibility settings. " -"All other 3D game objects inherit from Spatial. Use [Spatial] as a parent " -"node to move, scale, rotate and show/hide children in a 3D project.\n" -"Affine operations (rotate, scale, translate) happen in parent's local " -"coordinate system, unless the [Spatial] object is set as top-level. Affine " -"operations in this coordinate system correspond to direct affine operations " -"on the [Spatial]'s transform. The word local below refers to this coordinate " -"system. The coordinate system that is attached to the [Spatial] object " -"itself is referred to as object-local coordinate system." -msgstr "" - -#: doc/classes/Spatial.xml:11 -msgid "" -"https://docs.godotengine.org/en/latest/tutorials/3d/introduction_to_3d.html" -msgstr "" - -#: doc/classes/Spatial.xml:25 -msgid "" -"Returns the parent [Spatial], or an empty [Object] if no parent exists or " -"parent is not of type [Spatial]." -msgstr "" - -#: doc/classes/Spatial.xml:32 -msgid "" -"Returns the current [World] resource this [Spatial] node is registered to." -msgstr "" - -#: doc/classes/Spatial.xml:43 -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/Spatial.xml:52 -msgid "" -"Scales the global (world) transformation by the given [Vector3] scale " -"factors." -msgstr "" - -#: doc/classes/Spatial.xml:61 -msgid "" -"Moves the global (world) transformation by [Vector3] offset. The offset is " -"in global coordinate system." -msgstr "" - -#: doc/classes/Spatial.xml:68 -msgid "" -"Disables rendering of this node. Changes [member visible] to [code]false[/" -"code]." -msgstr "" - -#: doc/classes/Spatial.xml:75 -msgid "" -"Returns whether node notifies about its local transformation changes. " -"[Spatial] will not propagate this by default." -msgstr "" - -#: doc/classes/Spatial.xml:82 -msgid "" -"Returns whether this node uses a scale of [code](1, 1, 1)[/code] or its " -"local transformation scale." -msgstr "" - -#: doc/classes/Spatial.xml:89 -msgid "" -"Returns whether this node is set as Toplevel, that is whether it ignores its " -"parent nodes transformations." -msgstr "" - -#: doc/classes/Spatial.xml:96 -msgid "" -"Returns whether the node notifies about its global and local transformation " -"changes. [Spatial] will not propagate this by default." -msgstr "" - -#: doc/classes/Spatial.xml:103 -msgid "" -"Returns whether the node is visible, taking into consideration that its " -"parents visibility." -msgstr "" - -#: doc/classes/Spatial.xml:114 -msgid "" -"Rotates itself so that the local -Z axis points towards the [code]target[/" -"code] position.\n" -"The transform will first be rotated around the given [code]up[/code] vector, " -"and then fully aligned to the target by a further rotation around an axis " -"perpendicular to both the [code]target[/code] and [code]up[/code] vectors.\n" -"Operations take place in global space." -msgstr "" - -#: doc/classes/Spatial.xml:129 -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/Spatial.xml:136 -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/Spatial.xml:147 -msgid "" -"Rotates the local transformation around axis, a unit [Vector3], by specified " -"angle in radians." -msgstr "" - -#: doc/classes/Spatial.xml:158 -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/Spatial.xml:167 -msgid "Rotates the local transformation around the X axis by angle in radians." -msgstr "" - -#: doc/classes/Spatial.xml:176 -msgid "Rotates the local transformation around the Y axis by angle in radians." -msgstr "" - -#: doc/classes/Spatial.xml:185 -msgid "Rotates the local transformation around the Z axis by angle in radians." -msgstr "" - -#: doc/classes/Spatial.xml:194 -msgid "" -"Scales the local transformation by given 3D scale factors in object-local " -"coordinate system." -msgstr "" - -#: doc/classes/Spatial.xml:203 -msgid "" -"Makes the node ignore its parents transformations. Node transformations are " -"only in global space." -msgstr "" - -#: doc/classes/Spatial.xml:212 -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/Spatial.xml:219 -msgid "" -"Reset all transformations for this node (sets its [Transform] to the " -"identity matrix)." -msgstr "" - -#: doc/classes/Spatial.xml:228 -msgid "" -"Sets whether the node ignores notification that its transformation (global " -"or local) changed." -msgstr "" - -#: doc/classes/Spatial.xml:237 -msgid "" -"Sets whether the node notifies about its local transformation changes. " -"[Spatial] will not propagate this by default." -msgstr "" - -#: doc/classes/Spatial.xml:246 -msgid "" -"Sets whether the node notifies about its global and local transformation " -"changes. [Spatial] will not propagate this by default." -msgstr "" - -#: doc/classes/Spatial.xml:253 -msgid "" -"Enables rendering of this node. Changes [member visible] to [code]true[/" -"code]." -msgstr "" - -#: doc/classes/Spatial.xml:262 -msgid "" -"Transforms [code]local_point[/code] from this node's local space to world " -"space." -msgstr "" - -#: doc/classes/Spatial.xml:271 -msgid "" -"Transforms [code]global_point[/code] from world space to this node's local " -"space." -msgstr "" - -#: doc/classes/Spatial.xml:280 -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 " -"scale, so if scaled by e.g. [code](10, 1, 1)[/code], a translation by an " -"offset of [code](2, 0, 0)[/code] would actually add 20 ([code]2 * 10[/code]) " -"to the X coordinate." -msgstr "" - -#: doc/classes/Spatial.xml:290 -msgid "" -"Changes the node's position by the given offset [Vector3] in local space." -msgstr "" - -#: doc/classes/Spatial.xml:297 -msgid "Updates the [SpatialGizmo] of this node." -msgstr "" - -#: doc/classes/Spatial.xml:303 -msgid "" -"The [SpatialGizmo] for this node. Used for example in [EditorSpatialGizmo] " -"as custom visualization and editing handles in Editor." -msgstr "" - -#: doc/classes/Spatial.xml:306 -msgid "World space (global) [Transform] of this node." -msgstr "" - -#: doc/classes/Spatial.xml:309 -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" -"[b]Note:[/b] In the mathematical sense, rotation is a matrix and not a " -"vector. The three Euler angles, which are the three independent parameters " -"of the Euler-angle parametrization of the rotation matrix, are stored in a " -"[Vector3] data structure not because the rotation is a vector, but only " -"because [Vector3] exists as a convenient data-structure to store 3 floating-" -"point numbers. Therefore, applying affine operations on the rotation \"vector" -"\" is not meaningful." -msgstr "" - -#: doc/classes/Spatial.xml:313 -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/Spatial.xml:316 -msgid "Scale part of the local transformation." -msgstr "" - -#: doc/classes/Spatial.xml:319 -msgid "Local space [Transform] of this node, with respect to the parent node." -msgstr "" - -#: doc/classes/Spatial.xml:322 -msgid "Local translation of this node." -msgstr "" - -#: doc/classes/Spatial.xml:325 -msgid "If [code]true[/code], this node is drawn." -msgstr "" - -#: doc/classes/Spatial.xml:331 -msgid "Emitted when node visibility changes." -msgstr "" - -#: doc/classes/Spatial.xml:337 -msgid "" -"Spatial nodes receives this notification when their global transform " -"changes. This means that either the current or a parent node changed its " -"transform.\n" -"In order for [constant NOTIFICATION_TRANSFORM_CHANGED] to work, users first " -"need to ask for it, with [method set_notify_transform]." -msgstr "" - -#: doc/classes/Spatial.xml:341 -msgid "" -"Spatial nodes receives this notification when they are registered to new " -"[World] resource." -msgstr "" - -#: doc/classes/Spatial.xml:344 -msgid "" -"Spatial nodes receives this notification when they are unregistered from " -"current [World] resource." -msgstr "" - -#: doc/classes/Spatial.xml:347 -msgid "Spatial nodes receives this notification when their visibility changes." +#: doc/classes/SoftBody3D.xml:110 +msgid "The SoftBody3D's mass." msgstr "" #: doc/classes/SphereMesh.xml:4 doc/classes/SphereMesh.xml:7 @@ -44017,17 +46090,17 @@ msgstr "" msgid "Number of segments along the height of the sphere." msgstr "" -#: doc/classes/SphereShape.xml:4 +#: doc/classes/SphereShape3D.xml:4 msgid "Sphere shape for 3D collisions." msgstr "" -#: doc/classes/SphereShape.xml:7 +#: doc/classes/SphereShape3D.xml:7 msgid "" -"Sphere shape for 3D collisions, which can be set into a [PhysicsBody] or " -"[Area]. This shape is useful for modeling sphere-like 3D objects." +"Sphere shape for 3D collisions, which can be set into a [PhysicsBody3D] or " +"[Area3D]. This shape is useful for modeling sphere-like 3D objects." msgstr "" -#: doc/classes/SphereShape.xml:15 +#: doc/classes/SphereShape3D.xml:15 msgid "The sphere's radius. The shape's diameter is double the radius." msgstr "" @@ -44138,120 +46211,120 @@ msgstr "" msgid "The split dragger is never visible and its space collapsed." msgstr "" -#: doc/classes/SpotLight.xml:4 +#: doc/classes/SpotLight3D.xml:4 msgid "A spotlight, such as a reflector spotlight or a lantern." msgstr "" -#: doc/classes/SpotLight.xml:7 +#: doc/classes/SpotLight3D.xml:7 msgid "" -"A Spotlight is a type of [Light] node that emits lights in a specific " +"A Spotlight is a type of [Light3D] node that emits lights in a specific " "direction, in the shape of a cone. The light is attenuated through the " "distance. This attenuation can be configured by changing the energy, radius " -"and attenuation parameters of [Light]." +"and attenuation parameters of [Light3D]." msgstr "" -#: doc/classes/SpotLight.xml:16 +#: doc/classes/SpotLight3D.xml:16 msgid "The spotlight's angle in degrees." msgstr "" -#: doc/classes/SpotLight.xml:19 +#: doc/classes/SpotLight3D.xml:19 msgid "The spotlight's angular attenuation curve." msgstr "" -#: doc/classes/SpotLight.xml:22 +#: doc/classes/SpotLight3D.xml:22 msgid "The spotlight's light energy attenuation curve." msgstr "" -#: doc/classes/SpotLight.xml:25 +#: doc/classes/SpotLight3D.xml:25 msgid "The maximal range that can be reached by the spotlight." msgstr "" -#: doc/classes/SpringArm.xml:4 +#: doc/classes/SpringArm3D.xml:4 msgid "A helper node, mostly used in 3rd person cameras." msgstr "" -#: doc/classes/SpringArm.xml:7 +#: doc/classes/SpringArm3D.xml:7 msgid "" -"The SpringArm node is a node that casts a ray (or collision shape) along its " -"z axis and moves all its direct children to the collision point, minus a " +"The SpringArm3D node is a node that casts a ray (or collision shape) along " +"its z axis and moves all its direct children to the collision point, minus a " "margin.\n" "The most common use case for this is to make a 3rd person camera that reacts " "to collisions in the environment.\n" -"The SpringArm will either cast a ray, or if a shape is given, it will cast " +"The SpringArm3D will either cast a ray, or if a shape is given, it will cast " "the shape in the direction of its z axis.\n" -"If you use the SpringArm as a camera controller for your player, you might " -"need to exclude the player's collider from the SpringArm's collision check." +"If you use the SpringArm3D as a camera controller for your player, you might " +"need to exclude the player's collider from the SpringArm3D's collision check." msgstr "" -#: doc/classes/SpringArm.xml:21 +#: doc/classes/SpringArm3D.xml:21 msgid "" -"Adds the [PhysicsBody] object with the given [RID] to the list of " -"[PhysicsBody] objects excluded from the collision check." +"Adds the [PhysicsBody3D] object with the given [RID] to the list of " +"[PhysicsBody3D] objects excluded from the collision check." msgstr "" -#: doc/classes/SpringArm.xml:28 +#: doc/classes/SpringArm3D.xml:28 msgid "" -"Clears the list of [PhysicsBody] objects excluded from the collision check." +"Clears the list of [PhysicsBody3D] objects excluded from the collision check." msgstr "" -#: doc/classes/SpringArm.xml:35 +#: doc/classes/SpringArm3D.xml:35 msgid "" "Returns the proportion between the current arm length (after checking for " "collisions) and the [member spring_length]. Ranges from 0 to 1." msgstr "" -#: doc/classes/SpringArm.xml:44 +#: doc/classes/SpringArm3D.xml:44 msgid "" -"Removes the given [RID] from the list of [PhysicsBody] objects excluded from " -"the collision check." +"Removes the given [RID] from the list of [PhysicsBody3D] objects excluded " +"from the collision check." msgstr "" -#: doc/classes/SpringArm.xml:50 +#: doc/classes/SpringArm3D.xml:50 msgid "The layers against which the collision check shall be done." msgstr "" -#: doc/classes/SpringArm.xml:53 +#: doc/classes/SpringArm3D.xml:53 msgid "" -"When the collision check is made, a candidate length for the SpringArm is " +"When the collision check is made, a candidate length for the SpringArm3D is " "given.\n" "The margin is then subtracted to this length and the translation is applied " -"to the child objects of the SpringArm.\n" -"This margin is useful for when the SpringArm has a [Camera] as a child node: " -"without the margin, the [Camera] would be placed on the exact point of " -"collision, while with the margin the [Camera] would be placed close to the " -"point of collision." +"to the child objects of the SpringArm3D.\n" +"This margin is useful for when the SpringArm3D has a [Camera3D] as a child " +"node: without the margin, the [Camera3D] would be placed on the exact point " +"of collision, while with the margin the [Camera3D] would be placed close to " +"the point of collision." msgstr "" -#: doc/classes/SpringArm.xml:58 +#: doc/classes/SpringArm3D.xml:58 msgid "" -"The [Shape] to use for the SpringArm.\n" -"When the shape is set, the SpringArm will cast the [Shape] on its z axis " +"The [Shape3D] to use for the SpringArm3D.\n" +"When the shape is set, the SpringArm3D will cast the [Shape3D] on its z axis " "instead of performing a ray cast." msgstr "" -#: doc/classes/SpringArm.xml:62 +#: doc/classes/SpringArm3D.xml:62 msgid "" -"The maximum extent of the SpringArm. This is used as a length for both the " +"The maximum extent of the SpringArm3D. This is used as a length for both the " "ray and the shape cast used internally to calculate the desired position of " -"the SpringArm's child nodes.\n" +"the SpringArm3D's child nodes.\n" "To know more about how to perform a shape cast or a ray cast, please consult " -"the [PhysicsDirectSpaceState] documentation." +"the [PhysicsDirectSpaceState3D] documentation." msgstr "" -#: doc/classes/Sprite.xml:4 +#: doc/classes/Sprite2D.xml:4 msgid "General-purpose sprite node." msgstr "" -#: doc/classes/Sprite.xml:7 +#: doc/classes/Sprite2D.xml:7 msgid "" "A node that displays a 2D texture. The texture displayed can be a region " "from a larger atlas texture, or a frame from a sprite sheet animation." msgstr "" -#: doc/classes/Sprite.xml:16 +#: doc/classes/Sprite2D.xml:16 msgid "" -"Returns a [Rect2] representing the Sprite's boundary in local coordinates. " -"Can be used to detect if the Sprite was clicked. Example:\n" +"Returns a [Rect2] representing the Sprite2D's boundary in local coordinates. " +"Can be used to detect if the Sprite2D was clicked. Example:\n" "[codeblock]\n" "func _input(event):\n" " if event is InputEventMouseButton and event.pressed and event." @@ -44261,7 +46334,7 @@ msgid "" "[/codeblock]" msgstr "" -#: doc/classes/Sprite.xml:31 +#: doc/classes/Sprite2D.xml:31 msgid "" "Returns [code]true[/code], if the pixel at the given position is opaque and " "[code]false[/code] in other case.\n" @@ -44269,68 +46342,68 @@ msgid "" "[code]null[/code] or if the given position is invalid." msgstr "" -#: doc/classes/Sprite.xml:38 +#: doc/classes/Sprite2D.xml:38 msgid "If [code]true[/code], texture is centered." msgstr "" -#: doc/classes/Sprite.xml:47 doc/classes/Sprite3D.xml:16 +#: doc/classes/Sprite2D.xml:47 doc/classes/Sprite3D.xml:16 msgid "" "Current frame to display from sprite sheet. [member vframes] or [member " "hframes] must be greater than 1." msgstr "" -#: doc/classes/Sprite.xml:50 doc/classes/Sprite3D.xml:19 +#: doc/classes/Sprite2D.xml:50 doc/classes/Sprite3D.xml:19 msgid "" "Coordinates of the frame to display from sprite sheet. This is as an alias " "for the [member frame] property. [member vframes] or [member hframes] must " "be greater than 1." msgstr "" -#: doc/classes/Sprite.xml:53 doc/classes/Sprite3D.xml:22 +#: doc/classes/Sprite2D.xml:53 doc/classes/Sprite3D.xml:22 msgid "The number of columns in the sprite sheet." msgstr "" -#: doc/classes/Sprite.xml:56 -msgid "The normal map gives depth to the Sprite." +#: doc/classes/Sprite2D.xml:56 +msgid "The normal map gives depth to the Sprite2D." msgstr "" -#: doc/classes/Sprite.xml:62 +#: doc/classes/Sprite2D.xml:62 msgid "" "If [code]true[/code], texture is cut from a larger atlas texture. See " "[member region_rect]." msgstr "" -#: doc/classes/Sprite.xml:65 +#: doc/classes/Sprite2D.xml:65 msgid "If [code]true[/code], the outermost pixels get blurred out." msgstr "" -#: doc/classes/Sprite.xml:68 doc/classes/Sprite3D.xml:28 +#: doc/classes/Sprite2D.xml:68 doc/classes/Sprite3D.xml:28 msgid "" "The region of the atlas texture to display. [member region_enabled] must be " "[code]true[/code]." msgstr "" -#: doc/classes/Sprite.xml:71 -msgid "Strength of the specular light effect of this [Sprite]." +#: doc/classes/Sprite2D.xml:71 +msgid "Strength of the specular light effect of this [Sprite2D]." msgstr "" -#: doc/classes/Sprite.xml:77 +#: doc/classes/Sprite2D.xml:77 msgid "The specular map is used for more control on the shininess effect." msgstr "" -#: doc/classes/Sprite.xml:80 doc/classes/Sprite3D.xml:31 +#: doc/classes/Sprite2D.xml:80 doc/classes/Sprite3D.xml:31 msgid "[Texture2D] object to draw." msgstr "" -#: doc/classes/Sprite.xml:83 doc/classes/Sprite3D.xml:34 +#: doc/classes/Sprite2D.xml:83 doc/classes/Sprite3D.xml:34 msgid "The number of rows in the sprite sheet." msgstr "" -#: doc/classes/Sprite.xml:89 doc/classes/Sprite3D.xml:40 +#: doc/classes/Sprite2D.xml:89 doc/classes/Sprite3D.xml:40 msgid "Emitted when the [member frame] changes." msgstr "" -#: doc/classes/Sprite.xml:94 +#: doc/classes/Sprite2D.xml:94 msgid "Emitted when the [member texture] changes." msgstr "" @@ -44345,8 +46418,8 @@ msgid "" "animation.\n" "[b]Note:[/b] There are [url=https://github.com/godotengine/godot/" "issues/20855]known performance issues[/url] when using [Sprite3D]. Consider " -"using a [MeshInstance] with a [QuadMesh] as the mesh instead. You can still " -"have billboarding by enabling billboard properties in the QuadMesh's " +"using a [MeshInstance3D] with a [QuadMesh] as the mesh instead. You can " +"still have billboarding by enabling billboard properties in the QuadMesh's " "[StandardMaterial3D]." msgstr "" @@ -44400,7 +46473,7 @@ msgstr "" #: doc/classes/SpriteBase3D.xml:79 msgid "" -"If [code]true[/code], the [Light] in the [Environment] has effects on the " +"If [code]true[/code], the [Light3D] in the [Environment] has effects on the " "sprite." msgstr "" @@ -44431,12 +46504,12 @@ msgid "Represents the size of the [enum DrawFlags] enum." msgstr "" #: doc/classes/SpriteFrames.xml:4 -msgid "Sprite frame library for AnimatedSprite." +msgid "Sprite frame library for AnimatedSprite2D." msgstr "" #: doc/classes/SpriteFrames.xml:7 msgid "" -"Sprite frame library for [AnimatedSprite]. Contains frames and animation " +"Sprite frame library for [AnimatedSprite2D]. Contains frames and animation " "data for playback." msgstr "" @@ -44506,56 +46579,56 @@ msgstr "" msgid "Compatibility property, always equals to an empty array." msgstr "" -#: doc/classes/StaticBody.xml:4 -msgid "Static body for 3D physics." +#: doc/classes/StaticBody2D.xml:4 +msgid "Static body for 2D physics." msgstr "" -#: doc/classes/StaticBody.xml:7 +#: doc/classes/StaticBody2D.xml:7 msgid "" -"Static body for 3D physics. A static body is a simple body that is not " -"intended to move. In contrast to [RigidBody], they don't consume any CPU " -"resources as long as they don't move.\n" +"Static body for 2D physics. A StaticBody2D is a body that is not intended to " +"move. It is ideal for implementing objects in the environment, such as walls " +"or platforms.\n" "Additionally, a constant linear or angular velocity can be set for the " -"static body, so even if it doesn't move, it affects other bodies as if it " -"was moving (this is useful for simulating conveyor belts or conveyor wheels)." +"static body, which will affect colliding bodies as if it were moving (for " +"example, a conveyor belt)." msgstr "" -#: doc/classes/StaticBody.xml:16 +#: doc/classes/StaticBody2D.xml:16 msgid "" "The body's constant angular velocity. This does not rotate the body, but " -"affects other bodies that touch it, as if it was in a state of rotation." +"affects colliding bodies, as if it were rotating." msgstr "" -#: doc/classes/StaticBody.xml:19 +#: doc/classes/StaticBody2D.xml:19 msgid "" "The body's constant linear velocity. This does not move the body, but " -"affects other bodies that touch it, as if it was in a state of movement." +"affects colliding bodies, as if it were moving." msgstr "" -#: doc/classes/StaticBody2D.xml:4 -msgid "Static body for 2D physics." +#: doc/classes/StaticBody3D.xml:4 +msgid "Static body for 3D physics." msgstr "" -#: doc/classes/StaticBody2D.xml:7 +#: doc/classes/StaticBody3D.xml:7 msgid "" -"Static body for 2D physics. A StaticBody2D is a body that is not intended to " -"move. It is ideal for implementing objects in the environment, such as walls " -"or platforms.\n" +"Static body for 3D physics. A static body is a simple body that is not " +"intended to move. In contrast to [RigidBody3D], they don't consume any CPU " +"resources as long as they don't move.\n" "Additionally, a constant linear or angular velocity can be set for the " -"static body, which will affect colliding bodies as if it were moving (for " -"example, a conveyor belt)." +"static body, so even if it doesn't move, it affects other bodies as if it " +"was moving (this is useful for simulating conveyor belts or conveyor wheels)." msgstr "" -#: doc/classes/StaticBody2D.xml:16 +#: doc/classes/StaticBody3D.xml:16 msgid "" "The body's constant angular velocity. This does not rotate the body, but " -"affects colliding bodies, as if it were rotating." +"affects other bodies that touch it, as if it was in a state of rotation." msgstr "" -#: doc/classes/StaticBody2D.xml:19 +#: doc/classes/StaticBody3D.xml:19 msgid "" "The body's constant linear velocity. This does not move the body, but " -"affects colliding bodies, as if it were moving." +"affects other bodies that touch it, as if it was in a state of movement." msgstr "" #: doc/classes/StreamPeer.xml:4 @@ -46049,6 +48122,94 @@ msgid "" "be slightly stretched to make the nine-patch texture tile seamlessly." msgstr "" +#: doc/classes/SubViewport.xml:13 +msgid "The clear mode when the sub-viewport is used as a render target." +msgstr "" + +#: doc/classes/SubViewport.xml:16 +msgid "The update mode when the sub-viewport is used as a render target." +msgstr "" + +#: doc/classes/SubViewport.xml:19 +msgid "The width and height of the sub-viewport." +msgstr "" + +#: 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: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 "Always clear the render target before drawing." +msgstr "" + +#: doc/classes/SubViewport.xml:36 +msgid "Never clear the render target." +msgstr "" + +#: doc/classes/SubViewport.xml:39 +msgid "" +"Clear the render target next frame, then switch to [constant " +"CLEAR_MODE_NEVER]." +msgstr "" + +#: doc/classes/SubViewport.xml:42 +msgid "Do not update the render target." +msgstr "" + +#: doc/classes/SubViewport.xml:45 +msgid "" +"Update the render target once, then switch to [constant UPDATE_DISABLED]." +msgstr "" + +#: doc/classes/SubViewport.xml:48 +msgid "" +"Update the render target only when it is visible. This is the default value." +msgstr "" + +#: doc/classes/SubViewport.xml:51 +msgid "Update the render target only when the its parent is visible." +msgstr "" + +#: doc/classes/SubViewport.xml:54 +msgid "Always update the render target." +msgstr "" + +#: doc/classes/SubViewportContainer.xml:4 +msgid "Control for holding [SubViewport]s." +msgstr "" + +#: doc/classes/SubViewportContainer.xml:7 +msgid "" +"A [Container] node that holds a [SubViewport], automatically setting its " +"size." +msgstr "" + +#: doc/classes/SubViewportContainer.xml:15 +msgid "" +"If [code]true[/code], the sub-viewport will be scaled to the control's size." +msgstr "" + +#: doc/classes/SubViewportContainer.xml:18 +msgid "" +"Divides the sub-viewport's effective resolution by this value while " +"preserving its scale. This can be used to speed up rendering.\n" +"For example, a 1280×720 sub-viewport with [member stretch_shrink] set to " +"[code]2[/code] will be rendered at 640×360 while occupying the same size in " +"the container.\n" +"[b]Note:[/b] [member stretch] must be [code]true[/code] for this property to " +"work." +msgstr "" + #: doc/classes/SurfaceTool.xml:4 msgid "Helper tool to create geometry." msgstr "" @@ -46075,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 " @@ -46163,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 " @@ -46192,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 "" @@ -46238,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 @@ -46907,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." @@ -47064,7 +49242,7 @@ msgstr "" #: doc/classes/Texture2D.xml:7 msgid "" "A texture works by registering an image in the video hardware, which then " -"can be used in 3D models or 2D [Sprite] or GUI [Control].\n" +"can be used in 3D models or 2D [Sprite2D] or GUI [Control].\n" "Textures are often created by loading them from a file. See [method " "@GDScript.load].\n" "[Texture2D] is a base for other resources. It cannot be used directly." @@ -47072,17 +49250,18 @@ msgstr "" #: doc/classes/Texture2D.xml:36 msgid "" -"Draws the texture using a [CanvasItem] with the [VisualServer] API at the " +"Draws the texture using a [CanvasItem] with the [RenderingServer] API at the " "specified [code]position[/code]." msgstr "" #: doc/classes/Texture2D.xml:63 -msgid "Draws the texture using a [CanvasItem] with the [VisualServer] API." +msgid "Draws the texture using a [CanvasItem] with the [RenderingServer] API." msgstr "" #: doc/classes/Texture2D.xml:92 msgid "" -"Draws a part of the texture using a [CanvasItem] with the [VisualServer] API." +"Draws a part of the texture using a [CanvasItem] with the [RenderingServer] " +"API." msgstr "" #: doc/classes/Texture2D.xml:99 @@ -47666,9 +49845,10 @@ msgstr "" #: doc/classes/Thread.xml:39 msgid "" "Starts a new [Thread] that runs [code]method[/code] on object " -"[code]instance[/code] with [code]userdata[/code] passed as an argument. The " -"[code]priority[/code] of the [Thread] can be changed by passing a value from " -"the [enum Priority] enum.\n" +"[code]instance[/code] with [code]userdata[/code] passed as an argument. Even " +"if no userdata is passed, [code]method[/code] must accept one argument and " +"it will be null. The [code]priority[/code] of the [Thread] can be changed by " +"passing a value from the [enum Priority] enum.\n" "Returns [constant OK] on success, or [constant ERR_CANT_CREATE] on failure." msgstr "" @@ -47721,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 @@ -47779,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 " @@ -48586,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 @@ -48698,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 " @@ -48855,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 @@ -49341,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 " @@ -49354,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 " @@ -49444,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 " @@ -49460,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" @@ -49550,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 "" @@ -49651,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" @@ -49667,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 " @@ -49687,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 " @@ -49699,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]). " @@ -49721,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, " @@ -49733,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] " @@ -49745,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[/" @@ -49822,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 " @@ -49834,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[/" @@ -49850,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." @@ -51082,41 +53277,41 @@ msgstr "" msgid "Enumerated value for the Z axis." msgstr "" -#: doc/classes/VehicleBody.xml:4 +#: doc/classes/VehicleBody3D.xml:4 msgid "Physics body that simulates the behavior of a car." msgstr "" -#: doc/classes/VehicleBody.xml:7 +#: doc/classes/VehicleBody3D.xml:7 msgid "" "This node implements all the physics logic needed to simulate a car. It is " "based on the raycast vehicle system commonly found in physics engines. You " -"will need to add a [CollisionShape] for the main body of your vehicle and " -"add [VehicleWheel] nodes for the wheels. You should also add a " -"[MeshInstance] to this node for the 3D model of your car but this model " +"will need to add a [CollisionShape3D] for the main body of your vehicle and " +"add [VehicleWheel3D] nodes for the wheels. You should also add a " +"[MeshInstance3D] to this node for the 3D model of your car but this model " "should not include meshes for the wheels. You should control the vehicle by " "using the [member brake], [member engine_force], and [member steering] " "properties and not change the position or orientation of this node " "directly.\n" -"[b]Note:[/b] The origin point of your VehicleBody will determine the center " -"of gravity of your vehicle so it is better to keep this low and move the " -"[CollisionShape] and [MeshInstance] upwards." +"[b]Note:[/b] The origin point of your VehicleBody3D will determine the " +"center of gravity of your vehicle so it is better to keep this low and move " +"the [CollisionShape3D] and [MeshInstance3D] upwards." msgstr "" -#: doc/classes/VehicleBody.xml:16 +#: doc/classes/VehicleBody3D.xml:16 msgid "" "Slows down the vehicle by applying a braking force. The vehicle is only " "slowed down if the wheels are in contact with a surface. The force you need " "to apply to adequately slow down your vehicle depends on the [member " -"RigidBody.mass] of the vehicle. For a vehicle with a mass set to 1000, try a " -"value in the 25 - 30 range for hard braking." +"RigidBody3D.mass] of the vehicle. For a vehicle with a mass set to 1000, try " +"a value in the 25 - 30 range for hard braking." msgstr "" -#: doc/classes/VehicleBody.xml:19 +#: doc/classes/VehicleBody3D.xml:19 msgid "" "Accelerates the vehicle by applying an engine force. The vehicle is only " -"speed up if the wheels that have [member VehicleWheel.use_as_traction] set " +"speed up if the wheels that have [member VehicleWheel3D.use_as_traction] set " "to [code]true[/code] and are in contact with a surface. The [member " -"RigidBody.mass] of the vehicle has an effect on the acceleration of the " +"RigidBody3D.mass] of the vehicle has an effect on the acceleration of the " "vehicle. For a vehicle with a mass set to 1000, try a value in the 25 - 50 " "range for acceleration.\n" "[b]Note:[/b] The simulation does not take the effect of gears into account, " @@ -51124,50 +53319,50 @@ msgid "" "A negative value will result in the vehicle reversing." msgstr "" -#: doc/classes/VehicleBody.xml:25 +#: doc/classes/VehicleBody3D.xml:25 msgid "" "The steering angle for the vehicle. Setting this to a non-zero value will " "result in the vehicle turning when it's moving. Wheels that have [member " -"VehicleWheel.use_as_steering] set to [code]true[/code] will automatically be " -"rotated." +"VehicleWheel3D.use_as_steering] set to [code]true[/code] will automatically " +"be rotated." msgstr "" -#: doc/classes/VehicleWheel.xml:4 +#: doc/classes/VehicleWheel3D.xml:4 msgid "Physics object that simulates the behavior of a wheel." msgstr "" -#: doc/classes/VehicleWheel.xml:7 +#: doc/classes/VehicleWheel3D.xml:7 msgid "" -"This node needs to be used as a child node of [VehicleBody] and simulates " +"This node needs to be used as a child node of [VehicleBody3D] and simulates " "the behavior of one of its wheels. This node also acts as a collider to " "detect if the wheel is touching a surface." msgstr "" -#: doc/classes/VehicleWheel.xml:16 +#: doc/classes/VehicleWheel3D.xml:16 msgid "Returns the rotational speed of the wheel in revolutions per minute." msgstr "" -#: doc/classes/VehicleWheel.xml:23 +#: doc/classes/VehicleWheel3D.xml:23 msgid "" "Returns a value between 0.0 and 1.0 that indicates whether this wheel is " "skidding. 0.0 is skidding (the wheel has lost grip, e.g. icy terrain), 1.0 " "means not skidding (the wheel has full grip, e.g. dry asphalt road)." msgstr "" -#: doc/classes/VehicleWheel.xml:30 +#: doc/classes/VehicleWheel3D.xml:30 msgid "Returns [code]true[/code] if this wheel is in contact with a surface." msgstr "" -#: doc/classes/VehicleWheel.xml:36 +#: doc/classes/VehicleWheel3D.xml:36 msgid "" "Slows down the wheel by applying a braking force. The wheel is only slowed " "down if it is in contact with a surface. The force you need to apply to " -"adequately slow down your vehicle depends on the [member RigidBody.mass] of " -"the vehicle. For a vehicle with a mass set to 1000, try a value in the 25 - " -"30 range for hard braking." +"adequately slow down your vehicle depends on the [member RigidBody3D.mass] " +"of the vehicle. For a vehicle with a mass set to 1000, try a value in the 25 " +"- 30 range for hard braking." msgstr "" -#: doc/classes/VehicleWheel.xml:39 +#: doc/classes/VehicleWheel3D.xml:39 msgid "" "The damping applied to the spring when the spring is being compressed. This " "value should be between 0.0 (no damping) and 1.0. A value of 0.0 means the " @@ -51175,7 +53370,7 @@ msgid "" "is around 0.3 for a normal car, 0.5 for a race car." msgstr "" -#: doc/classes/VehicleWheel.xml:42 +#: doc/classes/VehicleWheel3D.xml:42 msgid "" "The damping applied to the spring when relaxing. This value should be " "between 0.0 (no damping) and 1.0. This value should always be slightly " @@ -51183,10 +53378,10 @@ msgid "" "damping_compression] value of 0.3, try a relaxation value of 0.5." msgstr "" -#: doc/classes/VehicleWheel.xml:45 +#: doc/classes/VehicleWheel3D.xml:45 msgid "" "Accelerates the wheel by applying an engine force. The wheel is only speed " -"up if it is in contact with a surface. The [member RigidBody.mass] of the " +"up if it is in contact with a surface. The [member RigidBody3D.mass] of the " "vehicle has an effect on the acceleration of the vehicle. For a vehicle with " "a mass set to 1000, try a value in the 25 - 50 range for acceleration.\n" "[b]Note:[/b] The simulation does not take the effect of gears into account, " @@ -51194,50 +53389,50 @@ msgid "" "A negative value will result in the wheel reversing." msgstr "" -#: doc/classes/VehicleWheel.xml:50 +#: doc/classes/VehicleWheel3D.xml:50 msgid "" "The steering angle for the wheel. Setting this to a non-zero value will " "result in the vehicle turning when it's moving." msgstr "" -#: doc/classes/VehicleWheel.xml:53 +#: doc/classes/VehicleWheel3D.xml:53 msgid "" "The maximum force the spring can resist. This value should be higher than a " -"quarter of the [member RigidBody.mass] of the [VehicleBody] or the spring " -"will not carry the weight of the vehicle. Good results are often obtained by " -"a value that is about 3× to 4× this number." +"quarter of the [member RigidBody3D.mass] of the [VehicleBody3D] or the " +"spring will not carry the weight of the vehicle. Good results are often " +"obtained by a value that is about 3× to 4× this number." msgstr "" -#: doc/classes/VehicleWheel.xml:56 +#: doc/classes/VehicleWheel3D.xml:56 msgid "" "This value defines the stiffness of the suspension. Use a value lower than " "50 for an off-road car, a value between 50 and 100 for a race car and try " "something around 200 for something like a Formula 1 car." msgstr "" -#: doc/classes/VehicleWheel.xml:59 +#: doc/classes/VehicleWheel3D.xml:59 msgid "" "This is the distance the suspension can travel. As Godot units are " "equivalent to meters, keep this setting relatively low. Try a value between " "0.1 and 0.3 depending on the type of car." msgstr "" -#: doc/classes/VehicleWheel.xml:62 +#: doc/classes/VehicleWheel3D.xml:62 msgid "" "If [code]true[/code], this wheel will be turned when the car steers. This " -"value is used in conjunction with [member VehicleBody.steering] and ignored " -"if you are using the per-wheel [member steering] value instead." +"value is used in conjunction with [member VehicleBody3D.steering] and " +"ignored if you are using the per-wheel [member steering] value instead." msgstr "" -#: doc/classes/VehicleWheel.xml:65 +#: doc/classes/VehicleWheel3D.xml:65 msgid "" "If [code]true[/code], this wheel transfers engine force to the ground to " "propel the vehicle forward. This value is used in conjunction with [member " -"VehicleBody.engine_force] and ignored if you are using the per-wheel [member " -"engine_force] value instead." +"VehicleBody3D.engine_force] and ignored if you are using the per-wheel " +"[member engine_force] value instead." msgstr "" -#: doc/classes/VehicleWheel.xml:68 +#: doc/classes/VehicleWheel3D.xml:68 msgid "" "This determines how much grip this wheel has. It is combined with the " "friction setting of the surface the wheel is in contact with. 0.0 means no " @@ -51247,11 +53442,11 @@ msgid "" "It's best to set this to 1.0 when starting out." msgstr "" -#: doc/classes/VehicleWheel.xml:72 +#: doc/classes/VehicleWheel3D.xml:72 msgid "The radius of the wheel in meters." msgstr "" -#: doc/classes/VehicleWheel.xml:75 +#: doc/classes/VehicleWheel3D.xml:75 msgid "" "This is the distance in meters the wheel is lowered from its origin point. " "Don't set this to 0.0 and move the wheel into position, instead move the " @@ -51260,7 +53455,7 @@ msgid "" "down to the position it should be in when the car is in rest." msgstr "" -#: doc/classes/VehicleWheel.xml:78 +#: doc/classes/VehicleWheel3D.xml:78 msgid "" "This value affects the roll of your vehicle. If set to 1.0 for all wheels, " "your vehicle will be prone to rolling over, while a value of 0.0 will resist " @@ -51438,11 +53633,11 @@ msgstr "" #: doc/classes/Viewport.xml:7 msgid "" "A Viewport creates a different view into the screen, or a sub-view inside " -"another viewport. Children 2D Nodes will display on it, and children Camera " -"3D nodes will render on it too.\n" +"another viewport. Children 2D Nodes will display on it, and children " +"Camera3D 3D nodes will render on it too.\n" "Optionally, a viewport can have its own 2D or 3D world, so they don't share " "what they draw with other viewports.\n" -"If a viewport is a child of a [ViewportContainer], it will automatically " +"If a viewport is a child of a [SubViewportContainer], it will automatically " "take up its size, otherwise it must be set manually.\n" "Viewports can also choose to be audio listeners, so they generate positional " "audio depending on a 2D or 3D camera child of it.\n" @@ -51475,26 +53670,18 @@ msgid "Returns the total transform of the viewport." msgstr "" #: doc/classes/Viewport.xml:51 -msgid "Returns the topmost modal in the stack." -msgstr "" - -#: doc/classes/Viewport.xml:58 msgid "Returns the mouse position relative to the viewport." msgstr "" -#: doc/classes/Viewport.xml:67 +#: doc/classes/Viewport.xml:60 msgid "Returns information about the viewport from the rendering pipeline." msgstr "" -#: doc/classes/Viewport.xml:76 +#: doc/classes/Viewport.xml:69 msgid "Returns the [enum ShadowAtlasQuadrantSubdiv] of the specified quadrant." msgstr "" -#: doc/classes/Viewport.xml:83 -msgid "Returns the size override set with [method set_size_override]." -msgstr "" - -#: doc/classes/Viewport.xml:90 +#: doc/classes/Viewport.xml:76 msgid "" "Returns the viewport's texture.\n" "[b]Note:[/b] Due to the way OpenGL works, the resulting [ViewportTexture] is " @@ -51506,49 +53693,31 @@ msgid "" "[/codeblock]" msgstr "" -#: doc/classes/Viewport.xml:102 -msgid "Returns the viewport's RID from the [VisualServer]." +#: doc/classes/Viewport.xml:88 +msgid "Returns the viewport's RID from the [RenderingServer]." msgstr "" -#: doc/classes/Viewport.xml:109 +#: doc/classes/Viewport.xml:95 msgid "Returns the visible rectangle in global screen coordinates." msgstr "" -#: doc/classes/Viewport.xml:116 +#: doc/classes/Viewport.xml:102 msgid "" "Returns the drag data from the GUI, that was previously returned by [method " "Control.get_drag_data]." msgstr "" -#: doc/classes/Viewport.xml:123 -msgid "Returns [code]true[/code] if there are visible modals on-screen." -msgstr "" - -#: doc/classes/Viewport.xml:130 +#: doc/classes/Viewport.xml:109 msgid "" "Returns [code]true[/code] if the viewport is currently performing a drag " "operation." msgstr "" -#: doc/classes/Viewport.xml:151 -msgid "" -"Returns [code]true[/code] if the size override is enabled. See [method " -"set_size_override]." -msgstr "" - -#: doc/classes/Viewport.xml:160 -msgid "" -"Attaches this [Viewport] to the root [Viewport] with the specified " -"rectangle. This bypasses the need for another node to display this " -"[Viewport] but makes you responsible for updating the position of this " -"[Viewport] manually." -msgstr "" - -#: doc/classes/Viewport.xml:167 +#: doc/classes/Viewport.xml:146 msgid "Stops the input from propagating further down the [SceneTree]." msgstr "" -#: doc/classes/Viewport.xml:178 +#: doc/classes/Viewport.xml:157 msgid "" "Sets the number of subdivisions to use in the specified quadrant. A higher " "number of subdivisions allows you to have more shadows in the scene at once, " @@ -51557,114 +53726,106 @@ msgid "" "possible." msgstr "" -#: doc/classes/Viewport.xml:191 -msgid "" -"Sets the size override of the viewport. If the [code]enable[/code] parameter " -"is [code]true[/code] the override is used, otherwise it uses the default " -"size. If the size parameter is [code](-1, -1)[/code], it won't update the " -"size." -msgstr "" - -#: doc/classes/Viewport.xml:206 +#: doc/classes/Viewport.xml:174 msgid "Forces update of the 2D and 3D worlds." msgstr "" -#: doc/classes/Viewport.xml:215 +#: doc/classes/Viewport.xml:183 msgid "Warps the mouse to a position relative to the viewport." msgstr "" -#: doc/classes/Viewport.xml:221 -msgid "If [code]true[/code], the viewport will be used in AR/VR process." -msgstr "" - -#: doc/classes/Viewport.xml:224 +#: doc/classes/Viewport.xml:189 msgid "If [code]true[/code], the viewport will process 2D audio streams." msgstr "" -#: doc/classes/Viewport.xml:227 +#: doc/classes/Viewport.xml:192 msgid "If [code]true[/code], the viewport will process 3D audio streams." msgstr "" -#: doc/classes/Viewport.xml:234 +#: 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:237 +#: doc/classes/Viewport.xml:204 msgid "The overlay mode for test rendered geometry in debug purposes." msgstr "" -#: doc/classes/Viewport.xml:240 +#: 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:243 +#: doc/classes/Viewport.xml:210 msgid "If [code]true[/code], the viewport will not receive input event." msgstr "" -#: doc/classes/Viewport.xml:246 +#: 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:251 +#: 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:254 +#: doc/classes/Viewport.xml:223 msgid "" -"If [code]true[/code], the viewport will use [World] defined in [code]world[/" -"code] property." +"If [code]true[/code], the viewport will use [World3D] defined in " +"[code]world[/code] property." msgstr "" -#: doc/classes/Viewport.xml:257 +#: 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:260 +#: doc/classes/Viewport.xml:229 msgid "" -"If [code]true[/code], renders the Viewport directly to the screen instead of " -"to the root viewport. Only available in GLES2. This is a low-level " -"optimization and should not be used in most cases. If used, reading from the " -"Viewport or from [code]SCREEN_TEXTURE[/code] becomes unavailable. For more " -"information see [method VisualServer.viewport_set_render_direct_to_screen]." -msgstr "" - -#: doc/classes/Viewport.xml:263 -msgid "The clear mode when viewport used as a render target." -msgstr "" - -#: doc/classes/Viewport.xml:266 -msgid "The update mode when viewport used as a render target." +"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:269 +#: doc/classes/Viewport.xml:232 msgid "The subdivision amount of the first quadrant on the shadow atlas." msgstr "" -#: doc/classes/Viewport.xml:272 +#: doc/classes/Viewport.xml:235 msgid "The subdivision amount of the second quadrant on the shadow atlas." msgstr "" -#: doc/classes/Viewport.xml:275 +#: doc/classes/Viewport.xml:238 msgid "The subdivision amount of the third quadrant on the shadow atlas." msgstr "" -#: doc/classes/Viewport.xml:278 +#: doc/classes/Viewport.xml:241 msgid "The subdivision amount of the fourth quadrant on the shadow atlas." msgstr "" -#: doc/classes/Viewport.xml:281 +#: 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" @@ -51673,201 +53834,177 @@ msgid "" "manually." msgstr "" -#: doc/classes/Viewport.xml:285 -msgid "The width and height of viewport." -msgstr "" - -#: doc/classes/Viewport.xml:288 -msgid "If [code]true[/code], the size override affects stretch as well." -msgstr "" - -#: doc/classes/Viewport.xml:291 +#: doc/classes/Viewport.xml:248 msgid "" "If [code]true[/code], the viewport should render its background as " "transparent." msgstr "" -#: doc/classes/Viewport.xml:294 -msgid "The custom [World] which can be used as 3D environment source." +#: doc/classes/Viewport.xml:251 +msgid "The custom [World3D] which can be used as 3D environment source." msgstr "" -#: doc/classes/Viewport.xml:297 +#: doc/classes/Viewport.xml:254 msgid "The custom [World2D] which can be used as 2D environment source." msgstr "" -#: doc/classes/Viewport.xml:305 +#: doc/classes/Viewport.xml:262 msgid "Emitted when a Control node grabs keyboard focus." msgstr "" -#: doc/classes/Viewport.xml:310 -msgid "" -"Emitted when the size of the viewport is changed, whether by [method " -"set_size_override], resize of window, or some other means." -msgstr "" - -#: doc/classes/Viewport.xml:316 -msgid "Do not update the render target." -msgstr "" - -#: doc/classes/Viewport.xml:319 +#: doc/classes/Viewport.xml:267 msgid "" -"Update the render target once, then switch to [constant UPDATE_DISABLED]." -msgstr "" - -#: doc/classes/Viewport.xml:322 -msgid "" -"Update the render target only when it is visible. This is the default value." +"Emitted when the size of the viewport is changed, whether by resizing of " +"window, or some other means." msgstr "" -#: doc/classes/Viewport.xml:325 -msgid "Always update the render target." -msgstr "" - -#: doc/classes/Viewport.xml:328 +#: doc/classes/Viewport.xml:273 msgid "This quadrant will not be used." msgstr "" -#: doc/classes/Viewport.xml:331 +#: doc/classes/Viewport.xml:276 msgid "This quadrant will only be used by one shadow map." msgstr "" -#: doc/classes/Viewport.xml:334 +#: 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:337 +#: 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:340 +#: 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:343 +#: 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:346 +#: 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:349 +#: doc/classes/Viewport.xml:294 msgid "Represents the size of the [enum ShadowAtlasQuadrantSubdiv] enum." msgstr "" -#: doc/classes/Viewport.xml:352 -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:355 -msgid "Amount of vertices in frame." +#: doc/classes/Viewport.xml:300 +msgid "Use 2x Multisample Antialiasing." msgstr "" -#: doc/classes/Viewport.xml:358 -msgid "Amount of material changes in frame." +#: doc/classes/Viewport.xml:303 +msgid "Use 4x Multisample Antialiasing." msgstr "" -#: doc/classes/Viewport.xml:361 -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:364 -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:367 -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:370 -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:373 -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:376 -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:379 -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:382 -msgid "Objects are displayed in wireframe style." +#: doc/classes/Viewport.xml:327 +msgid "Amount of vertices in frame." msgstr "" -#: doc/classes/Viewport.xml:399 -msgid "Multisample anti-aliasing mode disabled. This is the default value." +#: doc/classes/Viewport.xml:330 +msgid "Amount of material changes in frame." msgstr "" -#: doc/classes/Viewport.xml:402 -msgid "Use 2x Multisample Antialiasing." +#: doc/classes/Viewport.xml:333 +msgid "Amount of shader changes in frame." msgstr "" -#: doc/classes/Viewport.xml:405 -msgid "Use 4x Multisample Antialiasing." +#: doc/classes/Viewport.xml:336 +msgid "Amount of surface changes in frame." msgstr "" -#: doc/classes/Viewport.xml:408 -msgid "" -"Use 8x Multisample Antialiasing. Likely unsupported on low-end and older " -"hardware." +#: doc/classes/Viewport.xml:339 +msgid "Amount of draw calls in frame." msgstr "" -#: doc/classes/Viewport.xml:411 -msgid "" -"Use 16x Multisample Antialiasing. Likely unsupported on medium and low-end " -"hardware." +#: doc/classes/Viewport.xml:342 +msgid "Represents the size of the [enum RenderInfo] enum." msgstr "" -#: doc/classes/Viewport.xml:414 -msgid "Always clear the render target before drawing." +#: doc/classes/Viewport.xml:345 +msgid "Objects are displayed normally." msgstr "" -#: doc/classes/Viewport.xml:417 -msgid "Never clear the render target." +#: doc/classes/Viewport.xml:356 +msgid "Objects are displayed in wireframe style." msgstr "" -#: doc/classes/Viewport.xml:420 +#: doc/classes/Viewport.xml:378 msgid "" -"Clear the render target next frame, then switch to [constant " -"CLEAR_MODE_NEVER]." +"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/ViewportContainer.xml:4 -msgid "Control for holding [Viewport]s." +#: doc/classes/Viewport.xml:384 +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, and yellow." msgstr "" -#: doc/classes/ViewportContainer.xml:7 +#: doc/classes/Viewport.xml:387 msgid "" -"A [Container] node that holds a [Viewport], automatically setting its size." +"Draws the decal atlas used by [Decal]s and light projector textures in the " +"upper left quadrant of the [Viewport]." msgstr "" -#: doc/classes/ViewportContainer.xml:15 -msgid "" -"If [code]true[/code], the viewport will be scaled to the control's size." +#: doc/classes/Viewport.xml:402 +msgid "Max value for [enum DefaultCanvasItemTextureFilter] enum." msgstr "" -#: doc/classes/ViewportContainer.xml:18 -msgid "" -"Divides the viewport's effective resolution by this value while preserving " -"its scale. This can be used to speed up rendering.\n" -"For example, a 1280×720 viewport with [member stretch_shrink] set to " -"[code]2[/code] will be rendered at 640×360 while occupying the same size in " -"the container.\n" -"[b]Note:[/b] [member stretch] must be [code]true[/code] for this property to " -"work." +#: doc/classes/Viewport.xml:414 +msgid "Max value for [enum DefaultCanvasItemTextureRepeat] enum." msgstr "" #: doc/classes/ViewportTexture.xml:4 @@ -51888,242 +54025,264 @@ msgid "" "root, not to the node which uses the texture." msgstr "" -#: doc/classes/VisibilityEnabler.xml:4 doc/classes/VisibilityEnabler2D.xml:4 -msgid "Enables certain nodes only when visible." +#: doc/classes/VisibilityEnabler2D.xml:4 doc/classes/VisibilityEnabler3D.xml:4 +msgid "Enables certain nodes only when approximately visible." msgstr "" -#: doc/classes/VisibilityEnabler.xml:7 +#: doc/classes/VisibilityEnabler2D.xml:7 msgid "" -"The VisibilityEnabler will disable [RigidBody] and [AnimationPlayer] nodes " -"when they are not visible. It will only affect other nodes within the same " -"scene as the VisibilityEnabler itself.\n" -"Note that VisibilityEnabler will not affect nodes added after scene " +"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" +"[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/VisibilityEnabler.xml:19 doc/classes/VisibilityEnabler2D.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/VisibilityEnabler.xml:30 doc/classes/VisibilityEnabler2D.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/VisibilityEnabler.xml:36 -msgid "If [code]true[/code], [RigidBody] nodes will be paused." +#: doc/classes/VisibilityEnabler2D.xml:37 +msgid "If [code]true[/code], [RigidBody2D] nodes will be paused." msgstr "" -#: doc/classes/VisibilityEnabler.xml:39 doc/classes/VisibilityEnabler2D.xml:42 -msgid "If [code]true[/code], [AnimationPlayer] nodes will be paused." +#: doc/classes/VisibilityEnabler2D.xml:40 +msgid "If [code]true[/code], [AnimatedSprite2D] nodes will be paused." msgstr "" -#: doc/classes/VisibilityEnabler.xml:44 doc/classes/VisibilityEnabler2D.xml:56 -msgid "This enabler will pause [AnimationPlayer] nodes." +#: doc/classes/VisibilityEnabler2D.xml:43 +#: doc/classes/VisibilityEnabler3D.xml:40 +msgid "If [code]true[/code], [AnimationPlayer] nodes will be paused." msgstr "" -#: doc/classes/VisibilityEnabler.xml:47 -msgid "This enabler will freeze [RigidBody] nodes." +#: doc/classes/VisibilityEnabler2D.xml:46 +msgid "If [code]true[/code], [GPUParticles2D] nodes will be paused." msgstr "" -#: doc/classes/VisibilityEnabler.xml:50 doc/classes/VisibilityEnabler2D.xml:74 -msgid "Represents the size of the [enum Enabler] enum." +#: 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:7 +#: doc/classes/VisibilityEnabler2D.xml:52 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 " -"initialization." +"If [code]true[/code], the parent's [method Node._process] will be stopped." msgstr "" -#: doc/classes/VisibilityEnabler2D.xml:36 -msgid "If [code]true[/code], [RigidBody2D] nodes will be paused." +#: doc/classes/VisibilityEnabler2D.xml:57 +#: doc/classes/VisibilityEnabler3D.xml:45 +msgid "This enabler will pause [AnimationPlayer] nodes." msgstr "" -#: doc/classes/VisibilityEnabler2D.xml:39 -msgid "If [code]true[/code], [AnimatedSprite] nodes will be paused." +#: doc/classes/VisibilityEnabler2D.xml:60 +msgid "This enabler will freeze [RigidBody2D] nodes." msgstr "" -#: doc/classes/VisibilityEnabler2D.xml:45 -msgid "If [code]true[/code], [Particles2D] nodes will be paused." +#: doc/classes/VisibilityEnabler2D.xml:63 +msgid "This enabler will stop [GPUParticles2D] nodes." msgstr "" -#: doc/classes/VisibilityEnabler2D.xml:48 -msgid "" -"If [code]true[/code], the parent's [method Node._physics_process] will be " -"stopped." +#: doc/classes/VisibilityEnabler2D.xml:66 +msgid "This enabler will stop the parent's _process function." msgstr "" -#: doc/classes/VisibilityEnabler2D.xml:51 -msgid "" -"If [code]true[/code], the parent's [method Node._process] will be stopped." +#: doc/classes/VisibilityEnabler2D.xml:69 +msgid "This enabler will stop the parent's _physics_process function." msgstr "" -#: doc/classes/VisibilityEnabler2D.xml:59 -msgid "This enabler will freeze [RigidBody2D] nodes." +#: doc/classes/VisibilityEnabler2D.xml:72 +msgid "This enabler will stop [AnimatedSprite2D] nodes animations." msgstr "" -#: doc/classes/VisibilityEnabler2D.xml:62 -msgid "This enabler will stop [Particles2D] nodes." +#: doc/classes/VisibilityEnabler2D.xml:75 +#: doc/classes/VisibilityEnabler3D.xml:51 +msgid "Represents the size of the [enum Enabler] enum." msgstr "" -#: doc/classes/VisibilityEnabler2D.xml:65 -msgid "This enabler will stop the parent's _process function." +#: doc/classes/VisibilityEnabler3D.xml:7 +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" +"[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/VisibilityEnabler2D.xml:68 -msgid "This enabler will stop the parent's _physics_process function." +#: doc/classes/VisibilityEnabler3D.xml:37 +msgid "If [code]true[/code], [RigidBody3D] nodes will be paused." msgstr "" -#: doc/classes/VisibilityEnabler2D.xml:71 -msgid "This enabler will stop [AnimatedSprite] nodes animations." +#: doc/classes/VisibilityEnabler3D.xml:48 +msgid "This enabler will freeze [RigidBody3D] nodes." msgstr "" -#: doc/classes/VisibilityNotifier.xml:4 doc/classes/VisibilityNotifier2D.xml:4 -msgid "Detects when the node is visible on screen." +#: doc/classes/VisibilityNotifier2D.xml:4 +#: doc/classes/VisibilityNotifier3D.xml:4 +msgid "Detects approximately when the node is visible on screen." msgstr "" -#: doc/classes/VisibilityNotifier.xml:7 +#: doc/classes/VisibilityNotifier2D.xml:7 msgid "" -"The VisibilityNotifier detects when it is visible on the screen. It also " +"The VisibilityNotifier2D detects when it is visible on the screen. It also " "notifies when its bounding rectangle enters or exits the screen or a " -"[Camera]'s view." +"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/VisibilityNotifier.xml:16 +#: doc/classes/VisibilityNotifier2D.xml:17 msgid "" -"If [code]true[/code], the bounding box is on the screen.\n" +"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 " "once added to the scene tree, so this method will return [code]false[/code] " "right after it is instantiated, even if it will be on screen in the draw " "pass." msgstr "" -#: doc/classes/VisibilityNotifier.xml:23 -msgid "The VisibilityNotifier's bounding box." +#: doc/classes/VisibilityNotifier2D.xml:24 +msgid "The VisibilityNotifier2D's bounding rectangle." msgstr "" -#: doc/classes/VisibilityNotifier.xml:31 -msgid "Emitted when the VisibilityNotifier enters a [Camera]'s view." +#: doc/classes/VisibilityNotifier2D.xml:30 +msgid "Emitted when the VisibilityNotifier2D enters the screen." msgstr "" -#: doc/classes/VisibilityNotifier.xml:38 -msgid "Emitted when the VisibilityNotifier exits a [Camera]'s view." +#: doc/classes/VisibilityNotifier2D.xml:35 +msgid "Emitted when the VisibilityNotifier2D exits the screen." msgstr "" -#: doc/classes/VisibilityNotifier.xml:43 -msgid "Emitted when the VisibilityNotifier enters the screen." +#: doc/classes/VisibilityNotifier2D.xml:42 +msgid "Emitted when the VisibilityNotifier2D enters a [Viewport]'s view." msgstr "" -#: doc/classes/VisibilityNotifier.xml:48 -msgid "Emitted when the VisibilityNotifier exits the screen." +#: doc/classes/VisibilityNotifier2D.xml:49 +msgid "Emitted when the VisibilityNotifier2D exits a [Viewport]'s view." msgstr "" -#: doc/classes/VisibilityNotifier2D.xml:7 +#: doc/classes/VisibilityNotifier3D.xml:7 msgid "" -"The VisibilityNotifier2D detects when it is visible on the screen. It also " +"The VisibilityNotifier3D detects when it is visible on the screen. It also " "notifies when its bounding rectangle enters or exits the screen or a " -"viewport." +"[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/VisibilityNotifier2D.xml:16 +#: doc/classes/VisibilityNotifier3D.xml:17 msgid "" -"If [code]true[/code], the bounding rectangle is on the screen.\n" +"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 " "once added to the scene tree, so this method will return [code]false[/code] " "right after it is instantiated, even if it will be on screen in the draw " "pass." msgstr "" -#: doc/classes/VisibilityNotifier2D.xml:23 -msgid "The VisibilityNotifier2D's bounding rectangle." +#: doc/classes/VisibilityNotifier3D.xml:24 +msgid "The VisibilityNotifier3D's bounding box." msgstr "" -#: doc/classes/VisibilityNotifier2D.xml:29 -msgid "Emitted when the VisibilityNotifier2D enters the screen." +#: doc/classes/VisibilityNotifier3D.xml:32 +msgid "Emitted when the VisibilityNotifier3D enters a [Camera3D]'s view." msgstr "" -#: doc/classes/VisibilityNotifier2D.xml:34 -msgid "Emitted when the VisibilityNotifier2D exits the screen." +#: doc/classes/VisibilityNotifier3D.xml:39 +msgid "Emitted when the VisibilityNotifier3D exits a [Camera3D]'s view." msgstr "" -#: doc/classes/VisibilityNotifier2D.xml:41 -msgid "Emitted when the VisibilityNotifier2D enters a [Viewport]'s view." +#: doc/classes/VisibilityNotifier3D.xml:44 +msgid "Emitted when the VisibilityNotifier3D enters the screen." msgstr "" -#: doc/classes/VisibilityNotifier2D.xml:48 -msgid "Emitted when the VisibilityNotifier2D exits a [Viewport]'s view." +#: doc/classes/VisibilityNotifier3D.xml:49 +msgid "Emitted when the VisibilityNotifier3D exits the screen." msgstr "" -#: doc/classes/VisualInstance.xml:4 +#: doc/classes/VisualInstance3D.xml:4 msgid "Parent of all visual 3D nodes." msgstr "" -#: doc/classes/VisualInstance.xml:7 +#: doc/classes/VisualInstance3D.xml:7 msgid "" -"The [VisualInstance] is used to connect a resource to a visual " -"representation. All visual 3D nodes inherit from the [VisualInstance]. In " -"general, you should not access the [VisualInstance] properties directly as " +"The [VisualInstance3D] is used to connect a resource to a visual " +"representation. All visual 3D nodes inherit from the [VisualInstance3D]. In " +"general, you should not access the [VisualInstance3D] properties directly as " "they are accessed and managed by the nodes that inherit from " -"[VisualInstance]. [VisualInstance] is the node representation of the " -"[VisualServer] instance." +"[VisualInstance3D]. [VisualInstance3D] is the node representation of the " +"[RenderingServer] instance." msgstr "" -#: doc/classes/VisualInstance.xml:16 +#: doc/classes/VisualInstance3D.xml:16 msgid "" "Returns the [AABB] (also known as the bounding box) for this " -"[VisualInstance]." +"[VisualInstance3D]." msgstr "" -#: doc/classes/VisualInstance.xml:23 +#: doc/classes/VisualInstance3D.xml:23 msgid "" -"Returns the RID of the resource associated with this [VisualInstance]. For " -"example, if the Node is a [MeshInstance], this will return the RID of the " +"Returns the RID of the resource associated with this [VisualInstance3D]. For " +"example, if the Node is a [MeshInstance3D], this will return the RID of the " "associated [Mesh]." msgstr "" -#: doc/classes/VisualInstance.xml:30 +#: doc/classes/VisualInstance3D.xml:30 msgid "" "Returns the RID of this instance. This RID is the same as the RID returned " -"by [method VisualServer.instance_create]. This RID is needed if you want to " -"call [VisualServer] functions directly on this [VisualInstance]." +"by [method RenderingServer.instance_create]. This RID is needed if you want " +"to call [RenderingServer] functions directly on this [VisualInstance3D]." msgstr "" -#: doc/classes/VisualInstance.xml:39 +#: doc/classes/VisualInstance3D.xml:39 msgid "" "Returns [code]true[/code] when the specified layer is enabled in [member " "layers] and [code]false[/code] otherwise." msgstr "" -#: doc/classes/VisualInstance.xml:46 +#: doc/classes/VisualInstance3D.xml:46 msgid "" "Returns the transformed [AABB] (also known as the bounding box) for this " -"[VisualInstance].\n" +"[VisualInstance3D].\n" "Transformed in this case means the [AABB] plus the position, rotation, and " -"scale of the [Spatial]'s [Transform]." +"scale of the [Node3D]'s [Transform]." msgstr "" -#: doc/classes/VisualInstance.xml:56 +#: doc/classes/VisualInstance3D.xml:56 msgid "" -"Sets the resource that is instantiated by this [VisualInstance], which " -"changes how the engine handles the [VisualInstance] under the hood. " -"Equivalent to [method VisualServer.instance_set_base]." +"Sets the resource that is instantiated by this [VisualInstance3D], which " +"changes how the engine handles the [VisualInstance3D] under the hood. " +"Equivalent to [method RenderingServer.instance_set_base]." msgstr "" -#: doc/classes/VisualInstance.xml:67 +#: doc/classes/VisualInstance3D.xml:67 msgid "Enables a particular layer in [member layers]." msgstr "" -#: doc/classes/VisualInstance.xml:73 +#: doc/classes/VisualInstance3D.xml:73 msgid "" -"The render layer(s) this [VisualInstance] is drawn on.\n" -"This object will only be visible for [Camera]s whose cull mask includes the " -"render object this [VisualInstance] is set to." +"The render layer(s) this [VisualInstance3D] is drawn on.\n" +"This object will only be visible for [Camera3D]s whose cull mask includes " +"the render object this [VisualInstance3D] is set to." msgstr "" #: modules/visual_script/doc_classes/VisualScript.xml:4 @@ -53278,2239 +55437,6 @@ msgid "" "- Sequence: [code]exit[/code]" msgstr "" -#: doc/classes/VisualServer.xml:4 -msgid "Server for anything visible." -msgstr "" - -#: doc/classes/VisualServer.xml:7 -msgid "" -"Server for anything visible. The visual 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 " -"implementation specific and cannot be accessed.\n" -"The visual 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 " -"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].\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 " -"[Spatial] node with [method Spatial.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. " -"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.\n" -"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." -msgstr "" - -#: doc/classes/VisualServer.xml:18 -msgid "" -"https://docs.godotengine.org/en/latest/tutorials/optimization/using_servers." -"html" -msgstr "" - -#: doc/classes/VisualServer.xml:33 -msgid "Sets images to be rendered in the window margin." -msgstr "" - -#: doc/classes/VisualServer.xml:48 -msgid "" -"Sets margin size, where black bars (or images, if [method " -"black_bars_set_images] was used) are rendered." -msgstr "" - -#: doc/classes/VisualServer.xml:55 -msgid "" -"Creates a camera and adds it to the VisualServer. It can be accessed with " -"the RID that is returned. This RID will be used in all [code]camera_*[/code] " -"VisualServer functions.\n" -"Once finished with your RID, you will want to free the RID using the " -"VisualServer's [method free_rid] static method." -msgstr "" - -#: doc/classes/VisualServer.xml:67 -msgid "" -"Sets the cull mask associated with this camera. The cull mask describes " -"which 3D layers are rendered by this camera. Equivalent to [member Camera." -"cull_mask]." -msgstr "" - -#: doc/classes/VisualServer.xml:78 -msgid "" -"Sets the environment used by this camera. Equivalent to [member Camera." -"environment]." -msgstr "" - -#: doc/classes/VisualServer.xml:95 -msgid "" -"Sets camera to use frustum projection. This mode allows adjusting the " -"[code]offset[/code] argument to create \"tilted frustum\" effects." -msgstr "" - -#: doc/classes/VisualServer.xml:110 -msgid "" -"Sets camera to use orthogonal projection, also known as orthographic " -"projection. Objects remain the same size on the screen no matter how far " -"away they are." -msgstr "" - -#: doc/classes/VisualServer.xml:125 -msgid "" -"Sets camera to use perspective projection. Objects on the screen becomes " -"smaller when they are far away." -msgstr "" - -#: doc/classes/VisualServer.xml:136 -msgid "Sets [Transform] of camera." -msgstr "" - -#: doc/classes/VisualServer.xml:147 -msgid "" -"If [code]true[/code], preserves the horizontal aspect ratio which is " -"equivalent to [constant Camera.KEEP_WIDTH]. If [code]false[/code], preserves " -"the vertical aspect ratio which is equivalent to [constant Camera." -"KEEP_HEIGHT]." -msgstr "" - -#: doc/classes/VisualServer.xml:154 -msgid "" -"Creates a canvas and returns the assigned [RID]. It can be accessed with the " -"RID that is returned. This RID will be used in all [code]canvas_*[/code] " -"VisualServer functions.\n" -"Once finished with your RID, you will want to free the RID using the " -"VisualServer's [method free_rid] static method." -msgstr "" - -#: doc/classes/VisualServer.xml:164 -msgid "Clears the [CanvasItem] and removes all commands in it." -msgstr "" - -#: doc/classes/VisualServer.xml:177 -msgid "Sets the [CanvasItem] to copy a rect to the backbuffer." -msgstr "" - -#: doc/classes/VisualServer.xml:188 -msgid "Sets the index for the [CanvasItem]." -msgstr "" - -#: doc/classes/VisualServer.xml:199 -msgid "Sets a new material to the [CanvasItem]." -msgstr "" - -#: doc/classes/VisualServer.xml:210 -msgid "Sets if the [CanvasItem] uses its parent's material." -msgstr "" - -#: doc/classes/VisualServer.xml:221 -msgid "" -"If this is enabled, the Z index of the parent will be added to the " -"children's Z index." -msgstr "" - -#: doc/classes/VisualServer.xml:232 -msgid "" -"Sets the [CanvasItem]'s Z index, i.e. its draw order (lower indexes are " -"drawn first)." -msgstr "" - -#: doc/classes/VisualServer.xml:243 -msgid "" -"Attaches the canvas light to the canvas. Removes it from its previous canvas." -msgstr "" - -#: doc/classes/VisualServer.xml:250 -msgid "" -"Creates a canvas light and adds it to the VisualServer. It can be accessed " -"with the RID that is returned. This RID will be used in all " -"[code]canvas_light_*[/code] VisualServer functions.\n" -"Once finished with your RID, you will want to free the RID using the " -"VisualServer's [method free_rid] static method." -msgstr "" - -#: doc/classes/VisualServer.xml:262 -msgid "" -"Attaches a light occluder to the canvas. Removes it from its previous canvas." -msgstr "" - -#: doc/classes/VisualServer.xml:269 -msgid "" -"Creates a light occluder and adds it to the VisualServer. It can be accessed " -"with the RID that is returned. This RID will be used in all " -"[code]canvas_light_ocluder_*[/code] VisualServer functions.\n" -"Once finished with your RID, you will want to free the RID using the " -"VisualServer's [method free_rid] static method." -msgstr "" - -#: doc/classes/VisualServer.xml:281 -msgid "Enables or disables light occluder." -msgstr "" - -#: doc/classes/VisualServer.xml:292 doc/classes/VisualServer.xml:369 -msgid "" -"The light mask. See [LightOccluder2D] for more information on light masks." -msgstr "" - -#: doc/classes/VisualServer.xml:303 -msgid "Sets a light occluder's polygon." -msgstr "" - -#: doc/classes/VisualServer.xml:314 -msgid "Sets a light occluder's [Transform2D]." -msgstr "" - -#: doc/classes/VisualServer.xml:325 -msgid "Sets the color for a light." -msgstr "" - -#: doc/classes/VisualServer.xml:336 -msgid "Enables or disables a canvas light." -msgstr "" - -#: doc/classes/VisualServer.xml:347 -msgid "Sets a canvas light's energy." -msgstr "" - -#: doc/classes/VisualServer.xml:358 -msgid "Sets a canvas light's height." -msgstr "" - -#: doc/classes/VisualServer.xml:380 -msgid "" -"The binary mask used to determine which layers this canvas light's shadows " -"affects. See [LightOccluder2D] for more information on light masks." -msgstr "" - -#: doc/classes/VisualServer.xml:393 -msgid "The layer range that gets rendered with this light." -msgstr "" - -#: doc/classes/VisualServer.xml:404 -msgid "The mode of the light, see [enum CanvasLightMode] constants." -msgstr "" - -#: doc/classes/VisualServer.xml:415 -msgid "" -"Sets the texture's scale factor of the light. Equivalent to [member Light2D." -"texture_scale]." -msgstr "" - -#: doc/classes/VisualServer.xml:426 -msgid "" -"Sets the width of the shadow buffer, size gets scaled to the next power of " -"two for this." -msgstr "" - -#: doc/classes/VisualServer.xml:437 -msgid "Sets the color of the canvas light's shadow." -msgstr "" - -#: doc/classes/VisualServer.xml:448 -msgid "Enables or disables the canvas light's shadow." -msgstr "" - -#: doc/classes/VisualServer.xml:459 -msgid "" -"Sets the canvas light's shadow's filter, see [enum CanvasLightShadowFilter] " -"constants." -msgstr "" - -#: doc/classes/VisualServer.xml:470 -msgid "Smoothens the shadow. The lower, the smoother." -msgstr "" - -#: doc/classes/VisualServer.xml:481 -msgid "" -"Sets texture to be used by light. Equivalent to [member Light2D.texture]." -msgstr "" - -#: doc/classes/VisualServer.xml:492 -msgid "" -"Sets the offset of the light's texture. Equivalent to [member Light2D." -"offset]." -msgstr "" - -#: doc/classes/VisualServer.xml:503 -msgid "Sets the canvas light's [Transform2D]." -msgstr "" - -#: doc/classes/VisualServer.xml:516 -msgid "" -"Sets the Z range of objects that will be affected by this light. Equivalent " -"to [member Light2D.range_z_min] and [member Light2D.range_z_max]." -msgstr "" - -#: doc/classes/VisualServer.xml:523 -msgid "" -"Creates a new light occluder polygon and adds it to the VisualServer. It can " -"be accessed with the RID that is returned. This RID will be used in all " -"[code]canvas_occluder_polygon_*[/code] VisualServer functions.\n" -"Once finished with your RID, you will want to free the RID using the " -"VisualServer's [method free_rid] static method." -msgstr "" - -#: doc/classes/VisualServer.xml:535 -msgid "" -"Sets an occluder polygons cull mode. See [enum " -"CanvasOccluderPolygonCullMode] constants." -msgstr "" - -#: doc/classes/VisualServer.xml:548 -msgid "Sets the shape of the occluder polygon." -msgstr "" - -#: doc/classes/VisualServer.xml:559 -msgid "Sets the shape of the occluder polygon as lines." -msgstr "" - -#: doc/classes/VisualServer.xml:572 -msgid "" -"A copy of the canvas item will be drawn with a local offset of the mirroring " -"[Vector2]." -msgstr "" - -#: doc/classes/VisualServer.xml:583 -msgid "Modulates all colors in the given canvas." -msgstr "" - -#: doc/classes/VisualServer.xml:590 -msgid "" -"Creates a directional light and adds it to the VisualServer. It can be " -"accessed with the RID that is returned. This RID can be used in most " -"[code]light_*[/code] VisualServer functions.\n" -"Once finished with your RID, you will want to free the RID using the " -"VisualServer's [method free_rid] static method.\n" -"To place in a scene, attach this directional light to an instance using " -"[method instance_set_base] using the returned RID." -msgstr "" - -#: doc/classes/VisualServer.xml:599 -msgid "" -"Creates an environment and adds it to the VisualServer. It can be accessed " -"with the RID that is returned. This RID will be used in all " -"[code]environment_*[/code] VisualServer functions.\n" -"Once finished with your RID, you will want to free the RID using the " -"VisualServer's [method free_rid] static method." -msgstr "" - -#: doc/classes/VisualServer.xml:619 -msgid "" -"Sets the values to be used with the \"Adjustment\" post-process effect. See " -"[Environment] for more details." -msgstr "" - -#: doc/classes/VisualServer.xml:650 -msgid "" -"Sets the [i]BGMode[/i] of the environment. Equivalent to [member Environment." -"background_mode]." -msgstr "" - -#: doc/classes/VisualServer.xml:661 -msgid "" -"Color displayed for clear areas of the scene (if using Custom color or Color" -"+Sky background modes)." -msgstr "" - -#: doc/classes/VisualServer.xml:672 -msgid "Sets the intensity of the background color." -msgstr "" - -#: doc/classes/VisualServer.xml:683 -msgid "Sets the maximum layer to use if using Canvas background mode." -msgstr "" - -#: doc/classes/VisualServer.xml:700 -msgid "" -"Sets the variables to be used with the scene fog. See [Environment] for more " -"details." -msgstr "" - -#: doc/classes/VisualServer.xml:721 -msgid "" -"Sets the variables to be used with the fog depth effect. See [Environment] " -"for more details." -msgstr "" - -#: doc/classes/VisualServer.xml:738 -msgid "" -"Sets the variables to be used with the fog height effect. See [Environment] " -"for more details." -msgstr "" - -#: doc/classes/VisualServer.xml:779 -msgid "" -"Sets the [Sky] to be used as the environment's background when using " -"[i]BGMode[/i] sky. Equivalent to [member Environment.sky]." -msgstr "" - -#: doc/classes/VisualServer.xml:790 -msgid "" -"Sets a custom field of view for the background [Sky]. Equivalent to [member " -"Environment.sky_custom_fov]." -msgstr "" - -#: doc/classes/VisualServer.xml:801 -msgid "" -"Sets the rotation of the background [Sky] expressed as a [Basis]. Equivalent " -"to [member Environment.sky_rotation], where the rotation vector is used to " -"construct the [Basis]." -msgstr "" - -#: doc/classes/VisualServer.xml:846 -msgid "" -"Sets the variables to be used with the \"screen space reflections\" post-" -"process effect. See [Environment] for more details." -msgstr "" - -#: doc/classes/VisualServer.xml:871 -msgid "" -"Sets the variables to be used with the \"tonemap\" post-process effect. See " -"[Environment] for more details." -msgstr "" - -#: doc/classes/VisualServer.xml:878 -msgid "Removes buffers and clears testcubes." -msgstr "" - -#: doc/classes/VisualServer.xml:889 -msgid "" -"Forces a frame to be drawn when the function is called. Drawing a frame " -"updates all [Viewport]s that are set to update. Use with extreme caution." -msgstr "" - -#: doc/classes/VisualServer.xml:896 -msgid "Synchronizes threads." -msgstr "" - -#: doc/classes/VisualServer.xml:905 -msgid "Tries to free an object in the VisualServer." -msgstr "" - -#: doc/classes/VisualServer.xml:914 -msgid "Returns a certain information, see [enum RenderInfo] for options." -msgstr "" - -#: doc/classes/VisualServer.xml:921 -msgid "Returns the id of the test cube. Creates one if none exists." -msgstr "" - -#: doc/classes/VisualServer.xml:928 -msgid "Returns the id of the test texture. Creates one if none exists." -msgstr "" - -#: doc/classes/VisualServer.xml:935 -msgid "" -"Returns the name of the video adapter (e.g. \"GeForce GTX 1080/PCIe/" -"SSE2\").\n" -"[b]Note:[/b] When running a headless or server binary, this function returns " -"an empty string." -msgstr "" - -#: doc/classes/VisualServer.xml:943 -msgid "" -"Returns the vendor of the video adapter (e.g. \"NVIDIA Corporation\").\n" -"[b]Note:[/b] When running a headless or server binary, this function returns " -"an empty string." -msgstr "" - -#: doc/classes/VisualServer.xml:951 -msgid "Returns the id of a white texture. Creates one if none exists." -msgstr "" - -#: doc/classes/VisualServer.xml:958 -msgid "" -"Returns [code]true[/code] if changes have been made to the VisualServer's " -"data. [method force_draw] is usually called if this happens." -msgstr "" - -#: doc/classes/VisualServer.xml:967 -msgid "Not yet implemented. Always returns [code]false[/code]." -msgstr "" - -#: doc/classes/VisualServer.xml:976 -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/VisualServer.xml:989 -msgid "" -"Sets up [ImmediateGeometry] internals to prepare for drawing. Equivalent to " -"[method ImmediateGeometry.begin]." -msgstr "" - -#: doc/classes/VisualServer.xml:998 -msgid "" -"Clears everything that was set up between [method immediate_begin] and " -"[method immediate_end]. Equivalent to [method ImmediateGeometry.clear]." -msgstr "" - -#: doc/classes/VisualServer.xml:1009 -msgid "" -"Sets the color to be used with next vertex. Equivalent to [method " -"ImmediateGeometry.set_color]." -msgstr "" - -#: doc/classes/VisualServer.xml:1016 -msgid "" -"Creates an immediate geometry and adds it to the VisualServer. It can be " -"accessed with the RID that is returned. This RID will be used in all " -"[code]immediate_*[/code] VisualServer functions.\n" -"Once finished with your RID, you will want to free the RID using the " -"VisualServer's [method free_rid] static method.\n" -"To place in a scene, attach this immediate geometry to an instance using " -"[method instance_set_base] using the returned RID." -msgstr "" - -#: doc/classes/VisualServer.xml:1027 -msgid "" -"Ends drawing the [ImmediateGeometry] and displays it. Equivalent to [method " -"ImmediateGeometry.end]." -msgstr "" - -#: doc/classes/VisualServer.xml:1036 -msgid "Returns the material assigned to the [ImmediateGeometry]." -msgstr "" - -#: doc/classes/VisualServer.xml:1047 -msgid "" -"Sets the normal to be used with next vertex. Equivalent to [method " -"ImmediateGeometry.set_normal]." -msgstr "" - -#: doc/classes/VisualServer.xml:1058 -msgid "Sets the material to be used to draw the [ImmediateGeometry]." -msgstr "" - -#: doc/classes/VisualServer.xml:1069 -msgid "" -"Sets the tangent to be used with next vertex. Equivalent to [method " -"ImmediateGeometry.set_tangent]." -msgstr "" - -#: doc/classes/VisualServer.xml:1080 -msgid "" -"Sets the UV to be used with next vertex. Equivalent to [method " -"ImmediateGeometry.set_uv]." -msgstr "" - -#: doc/classes/VisualServer.xml:1091 -msgid "" -"Sets the UV2 to be used with next vertex. Equivalent to [method " -"ImmediateGeometry.set_uv2]." -msgstr "" - -#: doc/classes/VisualServer.xml:1102 -msgid "" -"Adds the next vertex using the information provided in advance. Equivalent " -"to [method ImmediateGeometry.add_vertex]." -msgstr "" - -#: doc/classes/VisualServer.xml:1113 -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 ImmediateGeometry.add_vertex]." -msgstr "" - -#: doc/classes/VisualServer.xml:1120 -msgid "" -"Initializes the visual 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/VisualServer.xml:1131 -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/VisualServer.xml:1142 -msgid "" -"Attaches a skeleton to an instance. Removes the previous skeleton from the " -"instance." -msgstr "" - -#: doc/classes/VisualServer.xml:1149 -msgid "" -"Creates a visual instance and adds it to the VisualServer. It can be " -"accessed with the RID that is returned. This RID will be used in all " -"[code]instance_*[/code] VisualServer functions.\n" -"Once finished with your RID, you will want to free the RID using the " -"VisualServer's [method free_rid] static method.\n" -"An instance is a way of placing a 3D object in the scenario. Objects like " -"particles, meshes, and reflection probes need to be associated with an " -"instance to be visible in the scenario using [method instance_set_base]." -msgstr "" - -#: doc/classes/VisualServer.xml:1162 -msgid "" -"Creates a visual instance, adds it to the VisualServer, and sets both base " -"and scenario. It can be accessed with the RID that is returned. This RID " -"will be used in all [code]instance_*[/code] VisualServer functions.\n" -"Once finished with your RID, you will want to free the RID using the " -"VisualServer's [method free_rid] static method." -msgstr "" - -#: doc/classes/VisualServer.xml:1174 doc/classes/VisualServer.xml:1202 -#: doc/classes/VisualServer.xml:1492 -msgid "Not implemented in Godot 3.x." -msgstr "" - -#: doc/classes/VisualServer.xml:1185 -msgid "" -"Sets the shadow casting setting to one of [enum ShadowCastingSetting]. " -"Equivalent to [member GeometryInstance.cast_shadow]." -msgstr "" - -#: doc/classes/VisualServer.xml:1215 -msgid "" -"Sets the flag for a given [enum InstanceFlags]. See [enum InstanceFlags] for " -"more details." -msgstr "" - -#: doc/classes/VisualServer.xml:1226 -msgid "" -"Sets a material that will override the material for all surfaces on the mesh " -"associated with this instance. Equivalent to [member GeometryInstance." -"material_override]." -msgstr "" - -#: doc/classes/VisualServer.xml:1237 -msgid "" -"Sets the base of the instance. A base can be any of the 3D objects that are " -"created in the VisualServer that can be displayed. For example, any of the " -"light types, mesh, multimesh, immediate geometry, particle system, " -"reflection probe, lightmap capture, and the GI probe are all types that can " -"be set as the base of an instance in order to be displayed in the scenario." -msgstr "" - -#: doc/classes/VisualServer.xml:1250 -msgid "Sets the weight for a given blend shape associated with this instance." -msgstr "" - -#: doc/classes/VisualServer.xml:1261 -msgid "" -"Sets a custom AABB to use when culling objects from the view frustum. " -"Equivalent to [method GeometryInstance.set_custom_aabb]." -msgstr "" - -#: doc/classes/VisualServer.xml:1272 -msgid "Function not implemented in Godot 3.x." -msgstr "" - -#: doc/classes/VisualServer.xml:1283 -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 GeometryInstance.extra_cull_margin]." -msgstr "" - -#: doc/classes/VisualServer.xml:1294 -msgid "" -"Sets the render layers that this instance will be drawn to. Equivalent to " -"[member VisualInstance.layers]." -msgstr "" - -#: doc/classes/VisualServer.xml:1305 -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/VisualServer.xml:1318 -msgid "" -"Sets the material of a specific surface. Equivalent to [method MeshInstance." -"set_surface_material]." -msgstr "" - -#: doc/classes/VisualServer.xml:1329 -msgid "" -"Sets the world space transform of the instance. Equivalent to [member " -"Spatial.transform]." -msgstr "" - -#: doc/classes/VisualServer.xml:1342 -msgid "Sets the lightmap to use with this instance." -msgstr "" - -#: doc/classes/VisualServer.xml:1353 -msgid "" -"Sets whether an instance is drawn or not. Equivalent to [member Spatial." -"visible]." -msgstr "" - -#: doc/classes/VisualServer.xml:1364 -msgid "" -"Returns an array of object IDs intersecting with the provided AABB. Only " -"visual 3D nodes are considered, such as [MeshInstance] or " -"[DirectionalLight]. Use [method @GDScript.instance_from_id] to obtain the " -"actual nodes. A scenario RID must be provided, which is available in the " -"[World] you want to query. This forces an update for all resources queued to " -"update.\n" -"[b]Warning:[/b] This function is primarily intended for editor usage. For in-" -"game use cases, prefer physics collision." -msgstr "" - -#: doc/classes/VisualServer.xml:1376 -msgid "" -"Returns an array of object IDs intersecting with the provided convex shape. " -"Only visual 3D nodes are considered, such as [MeshInstance] or " -"[DirectionalLight]. Use [method @GDScript.instance_from_id] to obtain the " -"actual nodes. A scenario RID must be provided, which is available in the " -"[World] you want to query. This forces an update for all resources queued to " -"update.\n" -"[b]Warning:[/b] This function is primarily intended for editor usage. For in-" -"game use cases, prefer physics collision." -msgstr "" - -#: doc/classes/VisualServer.xml:1390 -msgid "" -"Returns an array of object IDs intersecting with the provided 3D ray. Only " -"visual 3D nodes are considered, such as [MeshInstance] or " -"[DirectionalLight]. Use [method @GDScript.instance_from_id] to obtain the " -"actual nodes. A scenario RID must be provided, which is available in the " -"[World] you want to query. This forces an update for all resources queued to " -"update.\n" -"[b]Warning:[/b] This function is primarily intended for editor usage. For in-" -"game use cases, prefer physics collision." -msgstr "" - -#: doc/classes/VisualServer.xml:1402 -msgid "" -"If [code]true[/code], this directional light will blend between shadow map " -"splits resulting in a smoother transition between them. Equivalent to " -"[member DirectionalLight.directional_shadow_blend_splits]." -msgstr "" - -#: doc/classes/VisualServer.xml:1413 -msgid "" -"Sets the shadow depth range mode for this directional light. Equivalent to " -"[member DirectionalLight.directional_shadow_depth_range]. See [enum " -"LightDirectionalShadowDepthRangeMode] for options." -msgstr "" - -#: doc/classes/VisualServer.xml:1424 -msgid "" -"Sets the shadow mode for this directional light. Equivalent to [member " -"DirectionalLight.directional_shadow_mode]. See [enum " -"LightDirectionalShadowMode] for options." -msgstr "" - -#: doc/classes/VisualServer.xml:1435 -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 " -"OmniLight.omni_shadow_mode]." -msgstr "" - -#: doc/classes/VisualServer.xml:1446 -msgid "Sets the color of the light. Equivalent to [member Light.light_color]." -msgstr "" - -#: doc/classes/VisualServer.xml:1457 -msgid "" -"Sets the cull mask for this Light. Lights only affect objects in the " -"selected layers. Equivalent to [member Light.light_cull_mask]." -msgstr "" - -#: doc/classes/VisualServer.xml:1468 -msgid "" -"If [code]true[/code], light will subtract light instead of adding light. " -"Equivalent to [member Light.light_negative]." -msgstr "" - -#: doc/classes/VisualServer.xml:1481 -msgid "" -"Sets the specified light parameter. See [enum LightParam] for options. " -"Equivalent to [method Light.set_param]." -msgstr "" - -#: doc/classes/VisualServer.xml:1503 -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 " -"cast a shadow on both sides of the mesh, set the mesh to use double sided " -"shadows with [method instance_geometry_set_cast_shadows_setting]. Equivalent " -"to [member Light.shadow_reverse_cull_face]." -msgstr "" - -#: doc/classes/VisualServer.xml:1514 -msgid "" -"If [code]true[/code], light will cast shadows. Equivalent to [member Light." -"shadow_enabled]." -msgstr "" - -#: doc/classes/VisualServer.xml:1525 -msgid "" -"Sets the color of the shadow cast by the light. Equivalent to [member Light." -"shadow_color]." -msgstr "" - -#: doc/classes/VisualServer.xml:1536 -msgid "Sets whether GI probes capture light information from this light." -msgstr "" - -#: doc/classes/VisualServer.xml:1543 -msgid "" -"Creates a lightmap capture and adds it to the VisualServer. It can be " -"accessed with the RID that is returned. This RID will be used in all " -"[code]lightmap_capture_*[/code] VisualServer functions.\n" -"Once finished with your RID, you will want to free the RID using the " -"VisualServer's [method free_rid] static method.\n" -"To place in a scene, attach this lightmap capture to an instance using " -"[method instance_set_base] using the returned RID." -msgstr "" - -#: doc/classes/VisualServer.xml:1554 -msgid "Returns the size of the lightmap capture area." -msgstr "" - -#: doc/classes/VisualServer.xml:1563 -msgid "Returns the energy multiplier used by the lightmap capture." -msgstr "" - -#: doc/classes/VisualServer.xml:1572 -msgid "Returns the octree used by the lightmap capture." -msgstr "" - -#: doc/classes/VisualServer.xml:1581 -msgid "" -"Returns the cell subdivision amount used by this lightmap capture's octree." -msgstr "" - -#: doc/classes/VisualServer.xml:1590 -msgid "Returns the cell transform for this lightmap capture's octree." -msgstr "" - -#: doc/classes/VisualServer.xml:1601 -msgid "Sets the size of the area covered by the lightmap capture." -msgstr "" - -#: doc/classes/VisualServer.xml:1612 -msgid "Sets the energy multiplier for this lightmap capture." -msgstr "" - -#: doc/classes/VisualServer.xml:1623 -msgid "Sets the octree to be used by this lightmap capture." -msgstr "" - -#: doc/classes/VisualServer.xml:1634 -msgid "Sets the subdivision level of this lightmap capture's octree." -msgstr "" - -#: doc/classes/VisualServer.xml:1645 -msgid "Sets the octree cell transform for this lightmap capture's octree." -msgstr "" - -#: doc/classes/VisualServer.xml:1658 -msgid "" -"Returns a mesh of a sphere with the given amount of horizontal and vertical " -"subdivisions." -msgstr "" - -#: doc/classes/VisualServer.xml:1665 -msgid "" -"Creates an empty material and adds it to the VisualServer. It can be " -"accessed with the RID that is returned. This RID will be used in all " -"[code]material_*[/code] VisualServer functions.\n" -"Once finished with your RID, you will want to free the RID using the " -"VisualServer's [method free_rid] static method." -msgstr "" - -#: doc/classes/VisualServer.xml:1677 -msgid "Returns the value of a certain material's parameter." -msgstr "" - -#: doc/classes/VisualServer.xml:1688 -msgid "Sets an object's next material." -msgstr "" - -#: doc/classes/VisualServer.xml:1701 -msgid "Sets a material's parameter." -msgstr "" - -#: doc/classes/VisualServer.xml:1712 -msgid "Sets a material's render priority." -msgstr "" - -#: doc/classes/VisualServer.xml:1723 -msgid "Sets a shader material's shader." -msgstr "" - -#: doc/classes/VisualServer.xml:1752 -msgid "Removes all surfaces from a mesh." -msgstr "" - -#: doc/classes/VisualServer.xml:1759 -msgid "" -"Creates a new mesh and adds it to the VisualServer. It can be accessed with " -"the RID that is returned. This RID will be used in all [code]mesh_*[/code] " -"VisualServer functions.\n" -"Once finished with your RID, you will want to free the RID using the " -"VisualServer's [method free_rid] static method.\n" -"To place in a scene, attach this mesh to an instance using [method " -"instance_set_base] using the returned RID." -msgstr "" - -#: doc/classes/VisualServer.xml:1770 -msgid "Returns a mesh's blend shape count." -msgstr "" - -#: doc/classes/VisualServer.xml:1779 -msgid "Returns a mesh's blend shape mode." -msgstr "" - -#: doc/classes/VisualServer.xml:1788 -msgid "Returns a mesh's custom aabb." -msgstr "" - -#: doc/classes/VisualServer.xml:1797 -msgid "Returns a mesh's number of surfaces." -msgstr "" - -#: doc/classes/VisualServer.xml:1808 -msgid "Sets a mesh's blend shape mode." -msgstr "" - -#: doc/classes/VisualServer.xml:1819 -msgid "Sets a mesh's custom aabb." -msgstr "" - -#: doc/classes/VisualServer.xml:1830 -msgid "Returns a mesh's surface's buffer arrays." -msgstr "" - -#: doc/classes/VisualServer.xml:1841 -msgid "Returns a mesh's surface's arrays for blend shapes." -msgstr "" - -#: doc/classes/VisualServer.xml:1856 doc/classes/VisualServer.xml:1869 -msgid "Function is unused in Godot 3.x." -msgstr "" - -#: doc/classes/VisualServer.xml:1880 -msgid "Returns a mesh's surface's material." -msgstr "" - -#: doc/classes/VisualServer.xml:1893 -msgid "Sets a mesh's surface's material." -msgstr "" - -#: doc/classes/VisualServer.xml:1908 -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/VisualServer.xml:1931 -msgid "" -"Creates a new multimesh on the VisualServer and returns an [RID] handle. " -"This RID will be used in all [code]multimesh_*[/code] VisualServer " -"functions.\n" -"Once finished with your RID, you will want to free the RID using the " -"VisualServer's [method free_rid] static method.\n" -"To place in a scene, attach this multimesh to an instance using [method " -"instance_set_base] using the returned RID." -msgstr "" - -#: doc/classes/VisualServer.xml:1942 -msgid "" -"Calculates and returns the axis-aligned bounding box that encloses all " -"instances within the multimesh." -msgstr "" - -#: doc/classes/VisualServer.xml:1959 -msgid "Returns the number of instances allocated for this multimesh." -msgstr "" - -#: doc/classes/VisualServer.xml:1968 -msgid "" -"Returns the RID of the mesh that will be used in drawing this multimesh." -msgstr "" - -#: doc/classes/VisualServer.xml:1977 -msgid "Returns the number of visible instances for this multimesh." -msgstr "" - -#: doc/classes/VisualServer.xml:1988 -msgid "Returns the color by which the specified instance will be modulated." -msgstr "" - -#: doc/classes/VisualServer.xml:1999 -msgid "Returns the custom data associated with the specified instance." -msgstr "" - -#: doc/classes/VisualServer.xml:2010 -msgid "Returns the [Transform] of the specified instance." -msgstr "" - -#: doc/classes/VisualServer.xml:2021 -msgid "" -"Returns the [Transform2D] of the specified instance. For use when the " -"multimesh is set to use 2D transforms." -msgstr "" - -#: doc/classes/VisualServer.xml:2034 -msgid "" -"Sets the color by which this instance will be modulated. Equivalent to " -"[method MultiMesh.set_instance_color]." -msgstr "" - -#: doc/classes/VisualServer.xml:2047 -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/VisualServer.xml:2060 -msgid "" -"Sets the [Transform] for this instance. Equivalent to [method MultiMesh." -"set_instance_transform]." -msgstr "" - -#: doc/classes/VisualServer.xml:2073 -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/VisualServer.xml:2094 -msgid "" -"Sets the mesh to be drawn by the multimesh. Equivalent to [member MultiMesh." -"mesh]." -msgstr "" - -#: doc/classes/VisualServer.xml:2105 -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/VisualServer.xml:2112 -msgid "" -"Creates a new omni light and adds it to the VisualServer. It can be accessed " -"with the RID that is returned. This RID can be used in most [code]light_*[/" -"code] VisualServer functions.\n" -"Once finished with your RID, you will want to free the RID using the " -"VisualServer's [method free_rid] static method.\n" -"To place in a scene, attach this omni light to an instance using [method " -"instance_set_base] using the returned RID." -msgstr "" - -#: doc/classes/VisualServer.xml:2121 -msgid "" -"Creates a particle system and adds it to the VisualServer. It can be " -"accessed with the RID that is returned. This RID will be used in all " -"[code]particles_*[/code] VisualServer functions.\n" -"Once finished with your RID, you will want to free the RID using the " -"VisualServer's [method free_rid] static method.\n" -"To place in a scene, attach these particles to an instance using [method " -"instance_set_base] using the returned RID." -msgstr "" - -#: doc/classes/VisualServer.xml:2132 -msgid "" -"Calculates and returns the axis-aligned bounding box that contains all the " -"particles. Equivalent to [method Particles.capture_aabb]." -msgstr "" - -#: doc/classes/VisualServer.xml:2141 -msgid "Returns [code]true[/code] if particles are currently set to emitting." -msgstr "" - -#: doc/classes/VisualServer.xml:2150 -msgid "" -"Returns [code]true[/code] if particles are not emitting and particles are " -"set to inactive." -msgstr "" - -#: doc/classes/VisualServer.xml:2159 -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 " -"instances_cull_aabb], [method instances_cull_convex], or [method " -"instances_cull_ray]." -msgstr "" - -#: doc/classes/VisualServer.xml:2168 -msgid "" -"Reset the particles on the next update. Equivalent to [method Particles." -"restart]." -msgstr "" - -#: doc/classes/VisualServer.xml:2179 -msgid "" -"Sets the number of particles to be drawn and allocates the memory for them. " -"Equivalent to [member Particles.amount]." -msgstr "" - -#: doc/classes/VisualServer.xml:2190 -msgid "" -"Sets a custom axis-aligned bounding box for the particle system. Equivalent " -"to [member Particles.visibility_aabb]." -msgstr "" - -#: doc/classes/VisualServer.xml:2201 -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 Particles.draw_order]." -msgstr "" - -#: doc/classes/VisualServer.xml:2214 -msgid "" -"Sets the mesh to be used for the specified draw pass. Equivalent to [member " -"Particles.draw_pass_1], [member Particles.draw_pass_2], [member Particles." -"draw_pass_3], and [member Particles.draw_pass_4]." -msgstr "" - -#: doc/classes/VisualServer.xml:2225 -msgid "" -"Sets the number of draw passes to use. Equivalent to [member Particles." -"draw_passes]." -msgstr "" - -#: doc/classes/VisualServer.xml:2236 -msgid "" -"Sets the [Transform] that will be used by the particles when they first emit." -msgstr "" - -#: doc/classes/VisualServer.xml:2247 -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 Particles.emitting]." -msgstr "" - -#: doc/classes/VisualServer.xml:2258 -msgid "" -"Sets the explosiveness ratio. Equivalent to [member Particles.explosiveness]." -msgstr "" - -#: doc/classes/VisualServer.xml:2269 -msgid "" -"Sets the frame rate that the particle system rendering will be fixed to. " -"Equivalent to [member Particles.fixed_fps]." -msgstr "" - -#: doc/classes/VisualServer.xml:2280 -msgid "" -"If [code]true[/code], uses fractional delta which smooths the movement of " -"the particles. Equivalent to [member Particles.fract_delta]." -msgstr "" - -#: doc/classes/VisualServer.xml:2291 -msgid "" -"Sets the lifetime of each particle in the system. Equivalent to [member " -"Particles.lifetime]." -msgstr "" - -#: doc/classes/VisualServer.xml:2302 -msgid "" -"If [code]true[/code], particles will emit once and then stop. Equivalent to " -"[member Particles.one_shot]." -msgstr "" - -#: doc/classes/VisualServer.xml:2313 -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 Particles.preprocess]." -msgstr "" - -#: doc/classes/VisualServer.xml:2324 -msgid "" -"Sets the material for processing the particles. Note: this is not the " -"material used to draw the materials. Equivalent to [member Particles." -"process_material]." -msgstr "" - -#: doc/classes/VisualServer.xml:2335 -msgid "" -"Sets the emission randomness ratio. This randomizes the emission of " -"particles within their phase. Equivalent to [member Particles.randomness]." -msgstr "" - -#: doc/classes/VisualServer.xml:2346 -msgid "" -"Sets the speed scale of the particle system. Equivalent to [member Particles." -"speed_scale]." -msgstr "" - -#: doc/classes/VisualServer.xml:2357 -msgid "" -"If [code]true[/code], particles use local coordinates. If [code]false[/code] " -"they use global coordinates. Equivalent to [member Particles.local_coords]." -msgstr "" - -#: doc/classes/VisualServer.xml:2364 -msgid "" -"Creates a reflection probe and adds it to the VisualServer. It can be " -"accessed with the RID that is returned. This RID will be used in all " -"[code]reflection_probe_*[/code] VisualServer functions.\n" -"Once finished with your RID, you will want to free the RID using the " -"VisualServer's [method free_rid] static method.\n" -"To place in a scene, attach this reflection probe to an instance using " -"[method instance_set_base] using the returned RID." -msgstr "" - -#: doc/classes/VisualServer.xml:2377 -msgid "" -"If [code]true[/code], reflections will ignore sky contribution. Equivalent " -"to [member ReflectionProbe.interior_enable]." -msgstr "" - -#: doc/classes/VisualServer.xml:2388 -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/VisualServer.xml:2399 -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/VisualServer.xml:2410 -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/VisualServer.xml:2421 -msgid "" -"Sets the size of the area that the reflection probe will capture. Equivalent " -"to [member ReflectionProbe.extents]." -msgstr "" - -#: doc/classes/VisualServer.xml:2432 -msgid "" -"Sets the intensity of the reflection probe. Intensity modulates the strength " -"of the reflection. Equivalent to [member ReflectionProbe.intensity]." -msgstr "" - -#: doc/classes/VisualServer.xml:2443 -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/VisualServer.xml:2454 -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/VisualServer.xml:2465 -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 " -"ambient light matches the color of the room. Equivalent to [member " -"ReflectionProbe.interior_ambient_contrib]." -msgstr "" - -#: doc/classes/VisualServer.xml:2476 -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/VisualServer.xml:2487 -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/VisualServer.xml:2498 -msgid "" -"Sets how often the reflection probe updates. Can either be once or every " -"frame. See [enum ReflectionProbeUpdateMode] for options." -msgstr "" - -#: doc/classes/VisualServer.xml:2511 -msgid "" -"Schedules a callback to the corresponding named [code]method[/code] on " -"[code]where[/code] after a frame has been drawn.\n" -"The callback method must use only 1 argument which will be called with " -"[code]userdata[/code]." -msgstr "" - -#: doc/classes/VisualServer.xml:2519 -msgid "" -"Creates a scenario and adds it to the VisualServer. It can be accessed with " -"the RID that is returned. This RID will be used in all [code]scenario_*[/" -"code] VisualServer functions.\n" -"Once finished with your RID, you will want to free the RID using the " -"VisualServer's [method free_rid] static method.\n" -"The scenario is the 3D world that all the visual instances exist in." -msgstr "" - -#: doc/classes/VisualServer.xml:2532 -msgid "" -"Sets the [enum ScenarioDebugMode] for this scenario. See [enum " -"ScenarioDebugMode] for options." -msgstr "" - -#: doc/classes/VisualServer.xml:2543 -msgid "Sets the environment that will be used with this scenario." -msgstr "" - -#: doc/classes/VisualServer.xml:2554 -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/VisualServer.xml:2569 -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. " -"If [code]use_filter[/code] is [code]true[/code], the image will be scaled " -"with linear interpolation. If [code]use_filter[/code] is [code]false[/code], " -"the image will be scaled with nearest-neighbor interpolation." -msgstr "" - -#: doc/classes/VisualServer.xml:2578 -msgid "" -"If [code]true[/code], the engine will generate wireframes for use with the " -"wireframe debug mode." -msgstr "" - -#: doc/classes/VisualServer.xml:2587 -msgid "" -"Sets the default clear color which is used when a specific clear color has " -"not been selected." -msgstr "" - -#: doc/classes/VisualServer.xml:2594 -msgid "" -"Creates an empty shader and adds it to the VisualServer. It can be accessed " -"with the RID that is returned. This RID will be used in all [code]shader_*[/" -"code] VisualServer functions.\n" -"Once finished with your RID, you will want to free the RID using the " -"VisualServer's [method free_rid] static method." -msgstr "" - -#: doc/classes/VisualServer.xml:2604 -msgid "Returns a shader's code." -msgstr "" - -#: doc/classes/VisualServer.xml:2615 -msgid "Returns a default texture from a shader searched by name." -msgstr "" - -#: doc/classes/VisualServer.xml:2634 -msgid "Returns the parameters of a shader." -msgstr "" - -#: doc/classes/VisualServer.xml:2645 -msgid "Sets a shader's code." -msgstr "" - -#: doc/classes/VisualServer.xml:2658 -msgid "Sets a shader's default texture. Overwrites the texture given by name." -msgstr "" - -#: doc/classes/VisualServer.xml:2671 -msgid "Allocates the GPU buffers for this skeleton." -msgstr "" - -#: doc/classes/VisualServer.xml:2682 -msgid "Returns the [Transform] set for a specific bone of this skeleton." -msgstr "" - -#: doc/classes/VisualServer.xml:2693 -msgid "Returns the [Transform2D] set for a specific bone of this skeleton." -msgstr "" - -#: doc/classes/VisualServer.xml:2706 -msgid "Sets the [Transform] for a specific bone of this skeleton." -msgstr "" - -#: doc/classes/VisualServer.xml:2719 -msgid "Sets the [Transform2D] for a specific bone of this skeleton." -msgstr "" - -#: doc/classes/VisualServer.xml:2726 -msgid "" -"Creates a skeleton and adds it to the VisualServer. It can be accessed with " -"the RID that is returned. This RID will be used in all [code]skeleton_*[/" -"code] VisualServer functions.\n" -"Once finished with your RID, you will want to free the RID using the " -"VisualServer's [method free_rid] static method." -msgstr "" - -#: doc/classes/VisualServer.xml:2736 -msgid "Returns the number of bones allocated for this skeleton." -msgstr "" - -#: doc/classes/VisualServer.xml:2743 -msgid "" -"Creates an empty sky and adds it to the VisualServer. It can be accessed " -"with the RID that is returned. This RID will be used in all [code]sky_*[/" -"code] VisualServer functions.\n" -"Once finished with your RID, you will want to free the RID using the " -"VisualServer's [method free_rid] static method." -msgstr "" - -#: doc/classes/VisualServer.xml:2761 -msgid "" -"Creates a spot light and adds it to the VisualServer. It can be accessed " -"with the RID that is returned. This RID can be used in most [code]light_*[/" -"code] VisualServer functions.\n" -"Once finished with your RID, you will want to free the RID using the " -"VisualServer's [method free_rid] static method.\n" -"To place in a scene, attach this spot light to an instance using [method " -"instance_set_base] using the returned RID." -msgstr "" - -#: doc/classes/VisualServer.xml:2790 -msgid "Sets a viewport's camera." -msgstr "" - -#: doc/classes/VisualServer.xml:2801 -msgid "Sets a viewport's canvas." -msgstr "" - -#: doc/classes/VisualServer.xml:2814 -msgid "" -"Copies viewport to a region of the screen specified by [code]rect[/code]. If " -"[member Viewport.render_direct_to_screen] is [code]true[/code], then " -"viewport does not use a framebuffer and the contents of the viewport are " -"rendered directly to screen. However, note that the root viewport is drawn " -"last, therefore it will draw over the screen. Accordingly, you must set the " -"root viewport to an area that does not cover the area that you have attached " -"this viewport to.\n" -"For example, you can set the root viewport to not render at all with the " -"following code:\n" -"[codeblock]\n" -"func _ready():\n" -" get_viewport().set_attach_to_screen_rect(Rect2())\n" -" $Viewport.set_attach_to_screen_rect(Rect2(0, 0, 600, 600))\n" -"[/codeblock]\n" -"Using this can result in significant optimization, especially on lower-end " -"devices. However, it comes at the cost of having to manage your viewports " -"manually. For a further optimization see, [method " -"viewport_set_render_direct_to_screen]." -msgstr "" - -#: doc/classes/VisualServer.xml:2828 -msgid "" -"Creates an empty viewport and adds it to the VisualServer. It can be " -"accessed with the RID that is returned. This RID will be used in all " -"[code]viewport_*[/code] VisualServer functions.\n" -"Once finished with your RID, you will want to free the RID using the " -"VisualServer's [method free_rid] static method." -msgstr "" - -#: doc/classes/VisualServer.xml:2838 -msgid "Detaches the viewport from the screen." -msgstr "" - -#: doc/classes/VisualServer.xml:2849 -msgid "" -"Returns a viewport's render information. For options, see the [enum " -"ViewportRenderInfo] constants." -msgstr "" - -#: doc/classes/VisualServer.xml:2858 -msgid "Returns the viewport's last rendered frame." -msgstr "" - -#: doc/classes/VisualServer.xml:2869 -msgid "Detaches a viewport from a canvas and vice versa." -msgstr "" - -#: doc/classes/VisualServer.xml:2880 -msgid "If [code]true[/code], sets the viewport active, else sets it inactive." -msgstr "" - -#: doc/classes/VisualServer.xml:2895 -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/VisualServer.xml:2909 -msgid "Sets the transformation of a viewport's canvas." -msgstr "" - -#: doc/classes/VisualServer.xml:2920 -msgid "" -"Sets the clear mode of a viewport. See [enum ViewportClearMode] for options." -msgstr "" - -#: doc/classes/VisualServer.xml:2931 -msgid "" -"Sets the debug draw mode of a viewport. See [enum ViewportDebugDraw] for " -"options." -msgstr "" - -#: doc/classes/VisualServer.xml:2942 -msgid "" -"If [code]true[/code], rendering of a viewport's environment is disabled." -msgstr "" - -#: doc/classes/VisualServer.xml:2953 -msgid "Sets the viewport's global transformation matrix." -msgstr "" - -#: doc/classes/VisualServer.xml:2964 -msgid "If [code]true[/code], the viewport's canvas is not rendered." -msgstr "" - -#: doc/classes/VisualServer.xml:2975 -msgid "Currently unimplemented in Godot 3.x." -msgstr "" - -#: doc/classes/VisualServer.xml:2986 -msgid "Sets the anti-aliasing mode. See [enum ViewportMSAA] for options." -msgstr "" - -#: doc/classes/VisualServer.xml:2997 -msgid "Sets the viewport's parent to another viewport." -msgstr "" - -#: doc/classes/VisualServer.xml:3008 -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 " -"viewport to the root viewport. While this optimization can result in a " -"significant increase in speed (especially on older devices), it comes at a " -"cost of usability. When this is enabled, you cannot read from the viewport " -"or from the [code]SCREEN_TEXTURE[/code]. You also lose the benefit of " -"certain window settings, such as the various stretch modes. Another " -"consequence to be aware of is that in 2D the rendering happens in window " -"coordinates, so if you have a viewport that is double the size of the " -"window, and you set this, then only the portion that fits within the window " -"will be drawn, no automatic scaling is possible, even if your game scene is " -"significantly larger than the window size." -msgstr "" - -#: doc/classes/VisualServer.xml:3019 -msgid "" -"Sets a viewport's scenario.\n" -"The scenario contains information about the [enum ScenarioDebugMode], " -"environment information, reflection atlas etc." -msgstr "" - -#: doc/classes/VisualServer.xml:3033 -msgid "Sets the shadow atlas quadrant's subdivision." -msgstr "" - -#: doc/classes/VisualServer.xml:3044 -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/VisualServer.xml:3057 -msgid "Sets the viewport's width and height." -msgstr "" - -#: doc/classes/VisualServer.xml:3068 -msgid "" -"If [code]true[/code], the viewport renders its background as transparent." -msgstr "" - -#: doc/classes/VisualServer.xml:3079 -msgid "" -"Sets when the viewport should be updated. See [enum ViewportUpdateMode] " -"constants for options." -msgstr "" - -#: doc/classes/VisualServer.xml:3090 -msgid "" -"If [code]true[/code], the viewport uses augmented or virtual reality " -"technologies. See [ARVRInterface]." -msgstr "" - -#: doc/classes/VisualServer.xml:3097 -msgid "" -"Emitted at the end of the frame, after the VisualServer has finished " -"updating all the Viewports." -msgstr "" - -#: doc/classes/VisualServer.xml:3102 -msgid "" -"Emitted at the beginning of the frame, before the VisualServer updates all " -"the Viewports." -msgstr "" - -#: doc/classes/VisualServer.xml:3108 -msgid "Marks an error that shows that the index array is empty." -msgstr "" - -#: doc/classes/VisualServer.xml:3111 -msgid "Number of weights/bones per vertex." -msgstr "" - -#: doc/classes/VisualServer.xml:3114 -msgid "The minimum Z-layer for canvas items." -msgstr "" - -#: doc/classes/VisualServer.xml:3117 -msgid "The maximum Z-layer for canvas items." -msgstr "" - -#: doc/classes/VisualServer.xml:3120 -msgid "" -"Max number of glow levels that can be used with glow post-process effect." -msgstr "" - -#: doc/classes/VisualServer.xml:3123 -msgid "Unused enum in Godot 3.x." -msgstr "" - -#: doc/classes/VisualServer.xml:3126 -msgid "The minimum renderpriority of all materials." -msgstr "" - -#: doc/classes/VisualServer.xml:3129 -msgid "The maximum renderpriority of all materials." -msgstr "" - -#: doc/classes/VisualServer.xml:3150 -msgid "Shader is a 3D shader." -msgstr "" - -#: doc/classes/VisualServer.xml:3153 -msgid "Shader is a 2D shader." -msgstr "" - -#: doc/classes/VisualServer.xml:3156 -msgid "Shader is a particle shader." -msgstr "" - -#: doc/classes/VisualServer.xml:3159 -msgid "Represents the size of the [enum ShaderMode] enum." -msgstr "" - -#: doc/classes/VisualServer.xml:3162 -msgid "Array is a vertex array." -msgstr "" - -#: doc/classes/VisualServer.xml:3165 -msgid "Array is a normal array." -msgstr "" - -#: doc/classes/VisualServer.xml:3168 -msgid "Array is a tangent array." -msgstr "" - -#: doc/classes/VisualServer.xml:3171 -msgid "Array is a color array." -msgstr "" - -#: doc/classes/VisualServer.xml:3174 -msgid "Array is an UV coordinates array." -msgstr "" - -#: doc/classes/VisualServer.xml:3177 -msgid "Array is an UV coordinates array for the second UV coordinates." -msgstr "" - -#: doc/classes/VisualServer.xml:3180 -msgid "Array contains bone information." -msgstr "" - -#: doc/classes/VisualServer.xml:3183 -msgid "Array is weight information." -msgstr "" - -#: doc/classes/VisualServer.xml:3186 -msgid "Array is index array." -msgstr "" - -#: doc/classes/VisualServer.xml:3192 -msgid "Flag used to mark a vertex array." -msgstr "" - -#: doc/classes/VisualServer.xml:3195 -msgid "Flag used to mark a normal array." -msgstr "" - -#: doc/classes/VisualServer.xml:3198 -msgid "Flag used to mark a tangent array." -msgstr "" - -#: doc/classes/VisualServer.xml:3201 -msgid "Flag used to mark a color array." -msgstr "" - -#: doc/classes/VisualServer.xml:3204 -msgid "Flag used to mark an UV coordinates array." -msgstr "" - -#: doc/classes/VisualServer.xml:3207 -msgid "" -"Flag used to mark an UV coordinates array for the second UV coordinates." -msgstr "" - -#: doc/classes/VisualServer.xml:3210 -msgid "Flag used to mark a bone information array." -msgstr "" - -#: doc/classes/VisualServer.xml:3213 -msgid "Flag used to mark a weights array." -msgstr "" - -#: doc/classes/VisualServer.xml:3216 -msgid "Flag used to mark an index array." -msgstr "" - -#: doc/classes/VisualServer.xml:3245 -msgid "Primitive to draw consists of points." -msgstr "" - -#: doc/classes/VisualServer.xml:3248 -msgid "Primitive to draw consists of lines." -msgstr "" - -#: doc/classes/VisualServer.xml:3251 -msgid "Primitive to draw consists of a line strip from start to end." -msgstr "" - -#: doc/classes/VisualServer.xml:3254 -msgid "Primitive to draw consists of triangles." -msgstr "" - -#: doc/classes/VisualServer.xml:3257 -msgid "" -"Primitive to draw consists of a triangle strip (the last 3 vertices are " -"always combined to make a triangle)." -msgstr "" - -#: doc/classes/VisualServer.xml:3260 -msgid "Represents the size of the [enum PrimitiveType] enum." -msgstr "" - -#: doc/classes/VisualServer.xml:3269 -msgid "Use [Transform2D] to store MultiMesh transform." -msgstr "" - -#: doc/classes/VisualServer.xml:3272 -msgid "Use [Transform] to store MultiMesh transform." -msgstr "" - -#: doc/classes/VisualServer.xml:3275 -msgid "Is a directional (sun) light." -msgstr "" - -#: doc/classes/VisualServer.xml:3278 -msgid "Is an omni light." -msgstr "" - -#: doc/classes/VisualServer.xml:3281 -msgid "Is a spot light." -msgstr "" - -#: doc/classes/VisualServer.xml:3284 -msgid "The light's energy." -msgstr "" - -#: doc/classes/VisualServer.xml:3289 -msgid "The light's influence on specularity." -msgstr "" - -#: doc/classes/VisualServer.xml:3292 -msgid "The light's range." -msgstr "" - -#: doc/classes/VisualServer.xml:3295 -msgid "The light's attenuation." -msgstr "" - -#: doc/classes/VisualServer.xml:3298 -msgid "The spotlight's angle." -msgstr "" - -#: doc/classes/VisualServer.xml:3301 -msgid "The spotlight's attenuation." -msgstr "" - -#: doc/classes/VisualServer.xml:3304 -msgid "Scales the shadow color." -msgstr "" - -#: doc/classes/VisualServer.xml:3307 -msgid "Max distance that shadows will be rendered." -msgstr "" - -#: doc/classes/VisualServer.xml:3310 -msgid "Proportion of shadow atlas occupied by the first split." -msgstr "" - -#: doc/classes/VisualServer.xml:3313 -msgid "Proportion of shadow atlas occupied by the second split." -msgstr "" - -#: doc/classes/VisualServer.xml:3316 -msgid "" -"Proportion of shadow atlas occupied by the third split. The fourth split " -"occupies the rest." -msgstr "" - -#: doc/classes/VisualServer.xml:3321 -msgid "" -"Normal bias used to offset shadow lookup by object normal. Can be used to " -"fix self-shadowing artifacts." -msgstr "" - -#: doc/classes/VisualServer.xml:3324 -msgid "Bias the shadow lookup to fix self-shadowing artifacts." -msgstr "" - -#: doc/classes/VisualServer.xml:3327 -msgid "" -"Increases bias on further splits to fix self-shadowing that only occurs far " -"away from the camera." -msgstr "" - -#: doc/classes/VisualServer.xml:3330 -msgid "Represents the size of the [enum LightParam] enum." -msgstr "" - -#: doc/classes/VisualServer.xml:3333 -msgid "Use a dual paraboloid shadow map for omni lights." -msgstr "" - -#: doc/classes/VisualServer.xml:3336 -msgid "" -"Use a cubemap shadow map for omni lights. Slower but better quality than " -"dual paraboloid." -msgstr "" - -#: doc/classes/VisualServer.xml:3339 -msgid "Use orthogonal shadow projection for directional light." -msgstr "" - -#: doc/classes/VisualServer.xml:3342 -msgid "Use 2 splits for shadow projection when using directional light." -msgstr "" - -#: doc/classes/VisualServer.xml:3345 -msgid "Use 4 splits for shadow projection when using directional light." -msgstr "" - -#: doc/classes/VisualServer.xml:3348 -msgid "" -"Keeps shadows stable as camera moves but has lower effective resolution." -msgstr "" - -#: doc/classes/VisualServer.xml:3351 -msgid "" -"Optimize use of shadow maps, increasing the effective resolution. But may " -"result in shadows moving or flickering slightly." -msgstr "" - -#: doc/classes/VisualServer.xml:3354 -msgid "Reflection probe will update reflections once and then stop." -msgstr "" - -#: doc/classes/VisualServer.xml:3357 -msgid "" -"Reflection probe will update each frame. This mode is necessary to capture " -"moving objects." -msgstr "" - -#: doc/classes/VisualServer.xml:3360 -msgid "Draw particles in the order that they appear in the particles array." -msgstr "" - -#: doc/classes/VisualServer.xml:3363 -msgid "Sort particles based on their lifetime." -msgstr "" - -#: doc/classes/VisualServer.xml:3366 -msgid "Sort particles based on their distance to the camera." -msgstr "" - -#: doc/classes/VisualServer.xml:3369 -msgid "Do not update the viewport." -msgstr "" - -#: doc/classes/VisualServer.xml:3372 -msgid "Update the viewport once then set to disabled." -msgstr "" - -#: doc/classes/VisualServer.xml:3375 -msgid "Update the viewport whenever it is visible." -msgstr "" - -#: doc/classes/VisualServer.xml:3378 -msgid "Always update the viewport." -msgstr "" - -#: doc/classes/VisualServer.xml:3381 -msgid "The viewport is always cleared before drawing." -msgstr "" - -#: doc/classes/VisualServer.xml:3384 -msgid "The viewport is never cleared before drawing." -msgstr "" - -#: doc/classes/VisualServer.xml:3387 -msgid "" -"The viewport is cleared once, then the clear mode is set to [constant " -"VIEWPORT_CLEAR_NEVER]." -msgstr "" - -#: doc/classes/VisualServer.xml:3390 -msgid "Multisample antialiasing is disabled." -msgstr "" - -#: doc/classes/VisualServer.xml:3393 -msgid "Multisample antialiasing is set to 2×." -msgstr "" - -#: doc/classes/VisualServer.xml:3396 -msgid "Multisample antialiasing is set to 4×." -msgstr "" - -#: doc/classes/VisualServer.xml:3399 -msgid "Multisample antialiasing is set to 8×." -msgstr "" - -#: doc/classes/VisualServer.xml:3402 -msgid "Multisample antialiasing is set to 16×." -msgstr "" - -#: doc/classes/VisualServer.xml:3405 -msgid "" -"Multisample antialiasing is set to 2× on external texture. Special mode for " -"GLES2 Android VR (Oculus Quest and Go)." -msgstr "" - -#: doc/classes/VisualServer.xml:3408 -msgid "" -"Multisample antialiasing is set to 4× on external texture. Special mode for " -"GLES2 Android VR (Oculus Quest and Go)." -msgstr "" - -#: doc/classes/VisualServer.xml:3411 -msgid "Number of objects drawn in a single frame." -msgstr "" - -#: doc/classes/VisualServer.xml:3414 -msgid "Number of vertices drawn in a single frame." -msgstr "" - -#: doc/classes/VisualServer.xml:3417 -msgid "Number of material changes during this frame." -msgstr "" - -#: doc/classes/VisualServer.xml:3420 -msgid "Number of shader changes during this frame." -msgstr "" - -#: doc/classes/VisualServer.xml:3423 -msgid "Number of surface changes during this frame." -msgstr "" - -#: doc/classes/VisualServer.xml:3426 -msgid "Number of draw calls during this frame." -msgstr "" - -#: doc/classes/VisualServer.xml:3429 -msgid "Represents the size of the [enum ViewportRenderInfo] enum." -msgstr "" - -#: doc/classes/VisualServer.xml:3432 -msgid "Debug draw is disabled. Default setting." -msgstr "" - -#: doc/classes/VisualServer.xml:3435 -msgid "Debug draw sets objects to unshaded." -msgstr "" - -#: doc/classes/VisualServer.xml:3440 -msgid "Overwrites clear color to [code](0,0,0,0)[/code]." -msgstr "" - -#: doc/classes/VisualServer.xml:3443 -msgid "Debug draw draws objects in wireframe." -msgstr "" - -#: doc/classes/VisualServer.xml:3468 -msgid "Use the clear color as background." -msgstr "" - -#: doc/classes/VisualServer.xml:3471 -msgid "Use a specified color as the background." -msgstr "" - -#: doc/classes/VisualServer.xml:3474 -msgid "Use a sky resource for the background." -msgstr "" - -#: doc/classes/VisualServer.xml:3477 -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/VisualServer.xml:3480 -msgid "" -"Do not clear the background, use whatever was rendered last frame as the " -"background." -msgstr "" - -#: doc/classes/VisualServer.xml:3486 -msgid "Represents the size of the [enum EnvironmentBG] enum." -msgstr "" - -#: doc/classes/VisualServer.xml:3513 -msgid "Output color as they came in." -msgstr "" - -#: doc/classes/VisualServer.xml:3516 -msgid "Use the Reinhard tonemapper." -msgstr "" - -#: doc/classes/VisualServer.xml:3519 -msgid "Use the filmic tonemapper." -msgstr "" - -#: doc/classes/VisualServer.xml:3522 -msgid "Use the ACES tonemapper." -msgstr "" - -#: doc/classes/VisualServer.xml:3525 -msgid "Disables the blur set for SSAO. Will make SSAO look noisier." -msgstr "" - -#: doc/classes/VisualServer.xml:3528 -msgid "Perform a 1x1 blur on the SSAO output." -msgstr "" - -#: doc/classes/VisualServer.xml:3531 -msgid "Performs a 2x2 blur on the SSAO output." -msgstr "" - -#: doc/classes/VisualServer.xml:3534 -msgid "Performs a 3x3 blur on the SSAO output. Use this for smoothest SSAO." -msgstr "" - -#: doc/classes/VisualServer.xml:3537 -msgid "Lowest quality of screen space ambient occlusion." -msgstr "" - -#: doc/classes/VisualServer.xml:3540 -msgid "Medium quality screen space ambient occlusion." -msgstr "" - -#: doc/classes/VisualServer.xml:3543 -msgid "Highest quality screen space ambient occlusion." -msgstr "" - -#: doc/classes/VisualServer.xml:3562 -msgid "Do not use a debug mode." -msgstr "" - -#: doc/classes/VisualServer.xml:3565 -msgid "Draw all objects as wireframe models." -msgstr "" - -#: doc/classes/VisualServer.xml:3568 -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/VisualServer.xml:3571 -msgid "" -"Draw all objects without shading. Equivalent to setting all objects shaders " -"to [code]unshaded[/code]." -msgstr "" - -#: doc/classes/VisualServer.xml:3574 -msgid "The instance does not have a type." -msgstr "" - -#: doc/classes/VisualServer.xml:3577 -msgid "The instance is a mesh." -msgstr "" - -#: doc/classes/VisualServer.xml:3580 -msgid "The instance is a multimesh." -msgstr "" - -#: doc/classes/VisualServer.xml:3583 -msgid "The instance is an immediate geometry." -msgstr "" - -#: doc/classes/VisualServer.xml:3586 -msgid "The instance is a particle emitter." -msgstr "" - -#: doc/classes/VisualServer.xml:3589 -msgid "The instance is a light." -msgstr "" - -#: doc/classes/VisualServer.xml:3592 -msgid "The instance is a reflection probe." -msgstr "" - -#: doc/classes/VisualServer.xml:3595 -msgid "The instance is a GI probe." -msgstr "" - -#: doc/classes/VisualServer.xml:3598 -msgid "The instance is a lightmap capture." -msgstr "" - -#: doc/classes/VisualServer.xml:3601 -msgid "Represents the size of the [enum InstanceType] enum." -msgstr "" - -#: doc/classes/VisualServer.xml:3604 -msgid "" -"A combination of the flags of geometry instances (mesh, multimesh, immediate " -"and particles)." -msgstr "" - -#: doc/classes/VisualServer.xml:3607 -msgid "Allows the instance to be used in baked lighting." -msgstr "" - -#: doc/classes/VisualServer.xml:3612 -msgid "When set, manually requests to draw geometry on next frame." -msgstr "" - -#: doc/classes/VisualServer.xml:3615 -msgid "Represents the size of the [enum InstanceFlags] enum." -msgstr "" - -#: doc/classes/VisualServer.xml:3618 -msgid "Disable shadows from this instance." -msgstr "" - -#: doc/classes/VisualServer.xml:3621 -msgid "Cast shadows from this instance." -msgstr "" - -#: doc/classes/VisualServer.xml:3624 -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/VisualServer.xml:3627 -msgid "" -"Only render the shadows from the object. The object itself will not be drawn." -msgstr "" - -#: doc/classes/VisualServer.xml:3630 -msgid "The nine patch gets stretched where needed." -msgstr "" - -#: doc/classes/VisualServer.xml:3633 -msgid "The nine patch gets filled with tiles where needed." -msgstr "" - -#: doc/classes/VisualServer.xml:3636 -msgid "" -"The nine patch gets filled with tiles where needed and stretches them a bit " -"if needed." -msgstr "" - -#: doc/classes/VisualServer.xml:3665 -msgid "Adds light color additive to the canvas." -msgstr "" - -#: doc/classes/VisualServer.xml:3668 -msgid "Adds light color subtractive to the canvas." -msgstr "" - -#: doc/classes/VisualServer.xml:3671 -msgid "The light adds color depending on transparency." -msgstr "" - -#: doc/classes/VisualServer.xml:3674 -msgid "The light adds color depending on mask." -msgstr "" - -#: doc/classes/VisualServer.xml:3677 -msgid "Do not apply a filter to canvas light shadows." -msgstr "" - -#: doc/classes/VisualServer.xml:3680 -msgid "Use PCF5 filtering to filter canvas light shadows." -msgstr "" - -#: doc/classes/VisualServer.xml:3683 -msgid "Use PCF13 filtering to filter canvas light shadows." -msgstr "" - -#: doc/classes/VisualServer.xml:3688 -msgid "Culling of the canvas occluder is disabled." -msgstr "" - -#: doc/classes/VisualServer.xml:3691 -msgid "Culling of the canvas occluder is clockwise." -msgstr "" - -#: doc/classes/VisualServer.xml:3694 -msgid "Culling of the canvas occluder is counterclockwise." -msgstr "" - -#: doc/classes/VisualServer.xml:3697 -msgid "The amount of objects in the frame." -msgstr "" - -#: doc/classes/VisualServer.xml:3700 -msgid "The amount of vertices in the frame." -msgstr "" - -#: doc/classes/VisualServer.xml:3703 -msgid "The amount of modified materials in the frame." -msgstr "" - -#: doc/classes/VisualServer.xml:3706 -msgid "The amount of shader rebinds in the frame." -msgstr "" - -#: doc/classes/VisualServer.xml:3709 -msgid "The amount of surface changes in the frame." -msgstr "" - -#: doc/classes/VisualServer.xml:3712 -msgid "The amount of draw calls in frame." -msgstr "" - -#: doc/classes/VisualServer.xml:3727 -msgid "Hardware supports shaders. This enum is currently unused in Godot 3.x." -msgstr "" - -#: doc/classes/VisualServer.xml:3730 -msgid "" -"Hardware supports multithreading. This enum is currently unused in Godot 3.x." -msgstr "" - #: doc/classes/VisualShader.xml:4 msgid "A custom shader program with a visual editor." msgstr "" @@ -56881,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]." @@ -57601,128 +57527,68 @@ msgid "" "multiplayer peer." msgstr "" -#: doc/classes/WindowDialog.xml:4 -msgid "Base class for window dialogs." +#: doc/classes/World2D.xml:4 +msgid "Class that has everything pertaining to a 2D world." msgstr "" -#: doc/classes/WindowDialog.xml:7 +#: doc/classes/World2D.xml:7 msgid "" -"Windowdialog is the base class for all window-based dialogs. It's a by-" -"default toplevel [Control] that draws a window decoration and allows motion " -"and resizing." -msgstr "" - -#: doc/classes/WindowDialog.xml:16 -msgid "Returns the close [TextureButton]." -msgstr "" - -#: doc/classes/WindowDialog.xml:22 -msgid "If [code]true[/code], the user can resize the window." -msgstr "" - -#: doc/classes/WindowDialog.xml:25 -msgid "The text displayed in the window's title bar." -msgstr "" - -#: doc/classes/WindowDialog.xml:32 -msgid "The icon for the close button." -msgstr "" - -#: doc/classes/WindowDialog.xml:35 -msgid "The horizontal offset of the close button." +"Class that has everything pertaining to a 2D world. A physics space, a " +"visual scenario and a sound space. 2D nodes register their resources into " +"the current 2D world." msgstr "" -#: doc/classes/WindowDialog.xml:38 +#: doc/classes/World2D.xml:16 msgid "" -"The icon used for the close button when it's hovered with the mouse cursor." +"The [RID] of this world's canvas resource. Used by the [RenderingServer] for " +"2D drawing." msgstr "" -#: doc/classes/WindowDialog.xml:44 +#: doc/classes/World2D.xml:19 msgid "" -"The style for both the content background of the [WindowDialog] and the " -"title bar." +"The state of this world's physics space. This allows arbitrary querying for " +"collision." msgstr "" -#: doc/classes/WindowDialog.xml:47 +#: doc/classes/World2D.xml:22 msgid "" -"The thickness of the border that can be dragged when scaling the window (if " -"[member resizable] is enabled)." -msgstr "" - -#: doc/classes/WindowDialog.xml:50 -msgid "The color of the title text." -msgstr "" - -#: doc/classes/WindowDialog.xml:53 -msgid "The font used to draw the title." -msgstr "" - -#: doc/classes/WindowDialog.xml:56 -msgid "The vertical offset of the title text." +"The [RID] of this world's physics space resource. Used by the " +"[PhysicsServer2D] for 2D physics, treating it as both a space and an area." msgstr "" -#: doc/classes/World.xml:4 +#: doc/classes/World3D.xml:4 msgid "Class that has everything pertaining to a world." msgstr "" -#: doc/classes/World.xml:7 +#: doc/classes/World3D.xml:7 msgid "" "Class that has everything pertaining to a world. A physics space, a visual " -"scenario and a sound space. Spatial nodes register their resources into the " +"scenario and a sound space. Node3D nodes register their resources into the " "current world." msgstr "" -#: doc/classes/World.xml:18 +#: doc/classes/World3D.xml:18 msgid "" -"The World's physics direct space state, used for making various queries. " +"The World3D's physics direct space state, used for making various queries. " "Might be used only during [code]_physics_process[/code]." msgstr "" -#: doc/classes/World.xml:21 -msgid "The World's [Environment]." +#: doc/classes/World3D.xml:21 +msgid "The World3D's [Environment]." msgstr "" -#: doc/classes/World.xml:24 +#: doc/classes/World3D.xml:24 msgid "" -"The World's fallback_environment will be used if the World's [Environment] " -"fails or is missing." -msgstr "" - -#: doc/classes/World.xml:27 -msgid "The World's visual scenario." -msgstr "" - -#: doc/classes/World.xml:30 -msgid "The World's physics space." +"The World3D's fallback_environment will be used if the World3D's " +"[Environment] fails or is missing." msgstr "" -#: doc/classes/World2D.xml:4 -msgid "Class that has everything pertaining to a 2D world." +#: doc/classes/World3D.xml:27 +msgid "The World3D's visual scenario." msgstr "" -#: doc/classes/World2D.xml:7 -msgid "" -"Class that has everything pertaining to a 2D world. A physics space, a " -"visual scenario and a sound space. 2D nodes register their resources into " -"the current 2D world." -msgstr "" - -#: doc/classes/World2D.xml:16 -msgid "" -"The [RID] of this world's canvas resource. Used by the [VisualServer] for 2D " -"drawing." -msgstr "" - -#: doc/classes/World2D.xml:19 -msgid "" -"The state of this world's physics space. This allows arbitrary querying for " -"collision." -msgstr "" - -#: doc/classes/World2D.xml:22 -msgid "" -"The [RID] of this world's physics space resource. Used by the " -"[Physics2DServer] for 2D physics, treating it as both a space and an area." +#: doc/classes/World3D.xml:30 +msgid "The World3D's physics space." msgstr "" #: doc/classes/WorldEnvironment.xml:4 @@ -57736,7 +57602,7 @@ msgid "" "The [WorldEnvironment] node is used to configure the default [Environment] " "for the scene.\n" "The parameters defined in the [WorldEnvironment] can be overridden by an " -"[Environment] node set on the current [Camera]. Additionally, only one " +"[Environment] node set on the current [Camera3D]. Additionally, only one " "[WorldEnvironment] may be instanced in a given scene at a time.\n" "The [WorldEnvironment] allows the user to specify default lighting " "parameters (e.g. ambient lighting), various post-processing effects (e.g. " @@ -57751,20 +57617,20 @@ msgid "" "default properties." msgstr "" -#: doc/classes/WorldMarginShape.xml:4 +#: doc/classes/WorldMarginShape3D.xml:4 msgid "Infinite plane shape for 3D collisions." msgstr "" -#: doc/classes/WorldMarginShape.xml:7 +#: doc/classes/WorldMarginShape3D.xml:7 msgid "" "An infinite plane shape for 3D collisions. Note that the [Plane]'s normal " "matters; anything \"below\" the plane will collide with it. If the " -"[WorldMarginShape] is used in a [PhysicsBody], it will cause colliding " +"[WorldMarginShape3D] is used in a [PhysicsBody3D], it will cause colliding " "objects placed \"below\" it to teleport \"above\" the plane." msgstr "" -#: doc/classes/WorldMarginShape.xml:15 -msgid "The [Plane] used by the [WorldMarginShape] for collision." +#: doc/classes/WorldMarginShape3D.xml:15 +msgid "The [Plane] used by the [WorldMarginShape3D] for collision." msgstr "" #: doc/classes/X509Certificate.xml:4 @@ -57923,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 new file mode 100644 index 0000000000..d39ab5f248 --- /dev/null +++ b/doc/translations/fr.po @@ -0,0 +1,58481 @@ +# French translation of the Godot Engine class reference. +# Copyright (c) 2007-2020 Juan Linietsky, Ariel Manzur. +# Copyright (c) 2014-2020 Godot Engine contributors (cf. AUTHORS.md). +# This file is distributed under the same license as the Godot source code. +# +# Rémi Verschelde <remi@godotengine.org>, 2020. +# +msgid "" +msgstr "" +"Project-Id-Version: Godot Engine class reference\n" +"Report-Msgid-Bugs-To: https://github.com/godotengine/godot\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 +msgid "Description" +msgstr "Description" + +#: doc/tools/makerst.py +msgid "Tutorials" +msgstr "Tutoriels" + +#: doc/tools/makerst.py +msgid "Properties" +msgstr "Propriétés" + +#: doc/tools/makerst.py +msgid "Methods" +msgstr "Méthodes" + +#: doc/tools/makerst.py +msgid "Theme Properties" +msgstr "Propriétés de thème" + +#: doc/tools/makerst.py +msgid "Signals" +msgstr "Signaux" + +#: doc/tools/makerst.py +msgid "Enumerations" +msgstr "Énumérations" + +#: doc/tools/makerst.py +msgid "Constants" +msgstr "Constantes" + +#: doc/tools/makerst.py +msgid "Property Descriptions" +msgstr "Description des propriétés" + +#: doc/tools/makerst.py +msgid "Method Descriptions" +msgstr "Description des méthodes" + +#: modules/gdscript/doc_classes/@GDScript.xml:4 +msgid "Built-in GDScript functions." +msgstr "Fonctions intégrées à GDScript." + +#: modules/gdscript/doc_classes/@GDScript.xml:7 +msgid "" +"List of core built-in GDScript functions. Math functions and other " +"utilities. Everything else is provided by objects. (Keywords: builtin, built " +"in, global functions.)" +msgstr "" +"Liste de fonctions de base intégrées à GDScript. Fonctions mathématiques et " +"autres fonctions utilitaires. Toutes les autres fonctionalités sont fournies " +"directement par les objets. (Mots-clés : builtin, built-in, intégré, " +"intégrées, fonctions de base, fonctions globales.)" + +#: modules/gdscript/doc_classes/@GDScript.xml:24 +msgid "" +"Returns a color constructed from integer red, green, blue, and alpha " +"channels. Each channel should have 8 bits of information ranging from 0 to " +"255.\n" +"[code]r8[/code] red channel\n" +"[code]g8[/code] green channel\n" +"[code]b8[/code] blue channel\n" +"[code]a8[/code] alpha channel\n" +"[codeblock]\n" +"red = Color8(255, 0, 0)\n" +"[/codeblock]" +msgstr "" + +#: modules/gdscript/doc_classes/@GDScript.xml:42 +msgid "" +"Returns a color according to the standardized [code]name[/code] with " +"[code]alpha[/code] ranging from 0 to 1.\n" +"[codeblock]\n" +"red = ColorN(\"red\", 1)\n" +"[/codeblock]\n" +"Supported color names are the same as the constants defined in [Color]." +msgstr "" + +#: modules/gdscript/doc_classes/@GDScript.xml:55 +msgid "" +"Returns the absolute value of parameter [code]s[/code] (i.e. unsigned value, " +"works for integer and float).\n" +"[codeblock]\n" +"# a is 1\n" +"a = abs(-1)\n" +"[/codeblock]" +msgstr "" + +#: modules/gdscript/doc_classes/@GDScript.xml:68 +msgid "" +"Returns the arc cosine of [code]s[/code] in radians. Use to get the angle of " +"cosine [code]s[/code].\n" +"[codeblock]\n" +"# c is 0.523599 or 30 degrees if converted with rad2deg(s)\n" +"c = acos(0.866025)\n" +"[/codeblock]" +msgstr "" + +#: modules/gdscript/doc_classes/@GDScript.xml:81 +msgid "" +"Returns the arc sine of [code]s[/code] in radians. Use to get the angle of " +"sine [code]s[/code].\n" +"[codeblock]\n" +"# s is 0.523599 or 30 degrees if converted with rad2deg(s)\n" +"s = asin(0.5)\n" +"[/codeblock]" +msgstr "" + +#: modules/gdscript/doc_classes/@GDScript.xml:96 +msgid "" +"Asserts that the [code]condition[/code] is [code]true[/code]. If the " +"[code]condition[/code] is [code]false[/code], an error is generated and the " +"program is halted until you resume it. Only executes in debug builds, or " +"when running the game from the editor. Use it for debugging purposes, to " +"make sure a statement is [code]true[/code] during development.\n" +"The optional [code]message[/code] argument, if given, is shown in addition " +"to the generic \"Assertion failed\" message. You can use this to provide " +"additional details about why the assertion failed.\n" +"[codeblock]\n" +"# Imagine we always want speed to be between 0 and 20\n" +"speed = -10\n" +"assert(speed < 20) # True, the program will continue\n" +"assert(speed >= 0) # False, the program will stop\n" +"assert(speed >= 0 && speed < 20) # You can also combine the two conditional " +"statements in one check\n" +"assert(speed < 20, \"speed = %f, but the speed limit is 20\" % speed) # Show " +"a message with clarifying details\n" +"[/codeblock]" +msgstr "" + +#: modules/gdscript/doc_classes/@GDScript.xml:114 +msgid "" +"Returns the arc tangent of [code]s[/code] in radians. Use it to get the " +"angle from an angle's tangent in trigonometry: [code]atan(tan(angle)) == " +"angle[/code].\n" +"The method cannot know in which quadrant the angle should fall. See [method " +"atan2] if you always want an exact angle.\n" +"[codeblock]\n" +"a = atan(0.5) # a is 0.463648\n" +"[/codeblock]" +msgstr "" + +#: modules/gdscript/doc_classes/@GDScript.xml:129 +msgid "" +"Returns the arc tangent of [code]y/x[/code] in radians. Use to get the angle " +"of tangent [code]y/x[/code]. To compute the value, the method takes into " +"account the sign of both arguments in order to determine the quadrant.\n" +"[codeblock]\n" +"a = atan2(0, -1) # a is 3.141593\n" +"[/codeblock]" +msgstr "" + +#: modules/gdscript/doc_classes/@GDScript.xml:143 +msgid "" +"Decodes a byte array back to a value. When [code]allow_objects[/code] is " +"[code]true[/code] decoding objects is allowed.\n" +"[b]WARNING:[/b] Deserialized object can contain code which gets executed. Do " +"not use this option if the serialized object comes from untrusted sources to " +"avoid potential security threats (remote code execution)." +msgstr "" + +#: modules/gdscript/doc_classes/@GDScript.xml:155 +#: modules/visual_script/doc_classes/VisualScriptBuiltinFunc.xml:145 +msgid "" +"Converts a 2D point expressed in the cartesian coordinate system (X and Y " +"axis) to the polar coordinate system (a distance from the origin and an " +"angle)." +msgstr "" + +#: modules/gdscript/doc_classes/@GDScript.xml:164 +msgid "" +"Rounds [code]s[/code] upward, returning the smallest integral value that is " +"not less than [code]s[/code].\n" +"[codeblock]\n" +"i = ceil(1.45) # i is 2\n" +"i = ceil(1.001) # i is 2\n" +"[/codeblock]" +msgstr "" + +#: modules/gdscript/doc_classes/@GDScript.xml:177 +msgid "" +"Returns a character as a String of the given Unicode code point (which is " +"compatible with ASCII code).\n" +"[codeblock]\n" +"a = char(65) # a is \"A\"\n" +"a = char(65 + 32) # a is \"a\"\n" +"a = char(8364) # a is \"€\"\n" +"[/codeblock]\n" +"This is the inverse of [method ord]." +msgstr "" + +#: modules/gdscript/doc_classes/@GDScript.xml:196 +msgid "" +"Clamps [code]value[/code] and returns a value not less than [code]min[/code] " +"and not more than [code]max[/code].\n" +"[codeblock]\n" +"speed = 1000\n" +"# a is 20\n" +"a = clamp(speed, 1, 20)\n" +"\n" +"speed = -10\n" +"# a is 1\n" +"a = clamp(speed, 1, 20)\n" +"[/codeblock]" +msgstr "" + +#: modules/gdscript/doc_classes/@GDScript.xml:216 +msgid "" +"Converts from a type to another in the best way possible. The [code]type[/" +"code] parameter uses the [enum Variant.Type] values.\n" +"[codeblock]\n" +"a = Vector2(1, 0)\n" +"# Prints 1\n" +"print(a.length())\n" +"a = convert(a, TYPE_STRING)\n" +"# Prints 6 as \"(1, 0)\" is 6 characters\n" +"print(a.length())\n" +"[/codeblock]" +msgstr "" + +#: modules/gdscript/doc_classes/@GDScript.xml:233 +msgid "" +"Returns the cosine of angle [code]s[/code] in radians.\n" +"[codeblock]\n" +"# Prints 1 then -1\n" +"print(cos(PI * 2))\n" +"print(cos(PI))\n" +"[/codeblock]" +msgstr "" + +#: modules/gdscript/doc_classes/@GDScript.xml:247 +msgid "" +"Returns the hyperbolic cosine of [code]s[/code] in radians.\n" +"[codeblock]\n" +"# Prints 1.543081\n" +"print(cosh(1))\n" +"[/codeblock]" +msgstr "" + +#: modules/gdscript/doc_classes/@GDScript.xml:260 +msgid "Converts from decibels to linear energy (audio)." +msgstr "" + +#: modules/gdscript/doc_classes/@GDScript.xml:273 +msgid "" +"Returns the result of [code]value[/code] decreased by [code]step[/code] * " +"[code]amount[/code].\n" +"[codeblock]\n" +"# a = 59\n" +"a = dectime(60, 10, 0.1))\n" +"[/codeblock]" +msgstr "" + +#: modules/gdscript/doc_classes/@GDScript.xml:286 +msgid "" +"Returns degrees converted to radians.\n" +"[codeblock]\n" +"# r is 3.141593\n" +"r = deg2rad(180)\n" +"[/codeblock]" +msgstr "" + +#: modules/gdscript/doc_classes/@GDScript.xml:299 +msgid "" +"Converts a previously converted instance to a dictionary, back into an " +"instance. Useful for deserializing." +msgstr "" + +#: modules/gdscript/doc_classes/@GDScript.xml:310 +#: modules/visual_script/doc_classes/VisualScriptBuiltinFunc.xml:90 +msgid "" +"Easing function, based on exponent. 0 is constant, 1 is linear, 0 to 1 is " +"ease-in, 1+ is ease out. Negative values are in-out/out in." +msgstr "" + +#: modules/gdscript/doc_classes/@GDScript.xml:319 +msgid "" +"The natural exponential function. It raises the mathematical constant [b]e[/" +"b] to the power of [code]s[/code] and returns it.\n" +"[b]e[/b] has an approximate value of 2.71828.\n" +"For exponents to other bases use the method [method pow].\n" +"[codeblock]\n" +"a = exp(2) # Approximately 7.39\n" +"[/codeblock]" +msgstr "" + +#: modules/gdscript/doc_classes/@GDScript.xml:333 +msgid "" +"Rounds [code]s[/code] to the closest smaller integer and returns it.\n" +"[codeblock]\n" +"# a is 2.0\n" +"a = floor(2.99)\n" +"# a is -3.0\n" +"a = floor(-2.99)\n" +"[/codeblock]\n" +"[b]Note:[/b] This method returns a float. If you need an integer, you can " +"use [code]int(s)[/code] directly." +msgstr "" + +#: modules/gdscript/doc_classes/@GDScript.xml:351 +msgid "" +"Returns the floating-point remainder of [code]a/b[/code], keeping the sign " +"of [code]a[/code].\n" +"[codeblock]\n" +"# Remainder is 1.5\n" +"var remainder = fmod(7, 5.5)\n" +"[/codeblock]\n" +"For the integer remainder operation, use the % operator." +msgstr "" + +#: modules/gdscript/doc_classes/@GDScript.xml:367 +msgid "" +"Returns the floating-point modulus of [code]a/b[/code] that wraps equally in " +"positive and negative.\n" +"[codeblock]\n" +"var i = -6\n" +"while i < 5:\n" +" prints(i, fposmod(i, 3))\n" +" i += 1\n" +"[/codeblock]\n" +"Produces:\n" +"[codeblock]\n" +"-6 0\n" +"-5 1\n" +"-4 2\n" +"-3 0\n" +"-2 1\n" +"-1 2\n" +"0 0\n" +"1 1\n" +"2 2\n" +"3 0\n" +"4 1\n" +"[/codeblock]" +msgstr "" + +#: modules/gdscript/doc_classes/@GDScript.xml:398 +msgid "" +"Returns a reference to the specified function [code]funcname[/code] in the " +"[code]instance[/code] node. As functions aren't first-class objects in " +"GDscript, use [code]funcref[/code] to store a [FuncRef] in a variable and " +"call it later.\n" +"[codeblock]\n" +"func foo():\n" +" return(\"bar\")\n" +"\n" +"a = funcref(self, \"foo\")\n" +"print(a.call_func()) # Prints bar\n" +"[/codeblock]" +msgstr "" + +#: modules/gdscript/doc_classes/@GDScript.xml:412 +msgid "" +"Returns an array of dictionaries representing the current call stack.\n" +"[codeblock]\n" +"func _ready():\n" +" foo()\n" +"\n" +"func foo():\n" +" bar()\n" +"\n" +"func bar():\n" +" print(get_stack())\n" +"[/codeblock]\n" +"would print\n" +"[codeblock]\n" +"[{function:bar, line:12, source:res://script.gd}, {function:foo, line:9, " +"source:res://script.gd}, {function:_ready, line:6, source:res://script.gd}]\n" +"[/codeblock]" +msgstr "" + +#: modules/gdscript/doc_classes/@GDScript.xml:435 +msgid "" +"Returns the integer hash of the variable passed.\n" +"[codeblock]\n" +"print(hash(\"a\")) # Prints 177670\n" +"[/codeblock]" +msgstr "" + +#: modules/gdscript/doc_classes/@GDScript.xml:447 +msgid "" +"Returns the passed instance converted to a dictionary (useful for " +"serializing).\n" +"[codeblock]\n" +"var foo = \"bar\"\n" +"func _ready():\n" +" var d = inst2dict(self)\n" +" print(d.keys())\n" +" print(d.values())\n" +"[/codeblock]\n" +"Prints out:\n" +"[codeblock]\n" +"[@subpath, @path, foo]\n" +"[, res://test.gd, bar]\n" +"[/codeblock]" +msgstr "" + +#: modules/gdscript/doc_classes/@GDScript.xml:468 +msgid "" +"Returns the Object that corresponds to [code]instance_id[/code]. All Objects " +"have a unique instance ID.\n" +"[codeblock]\n" +"var foo = \"bar\"\n" +"func _ready():\n" +" var id = get_instance_id()\n" +" var inst = instance_from_id(id)\n" +" print(inst.foo) # Prints bar\n" +"[/codeblock]" +msgstr "" + +#: modules/gdscript/doc_classes/@GDScript.xml:488 +msgid "" +"Returns a normalized value considering the given range. This is the opposite " +"of [method lerp].\n" +"[codeblock]\n" +"var middle = lerp(20, 30, 0.75)\n" +"# `middle` is now 27.5.\n" +"# Now, we pretend to have forgotten the original ratio and want to get it " +"back.\n" +"var ratio = inverse_lerp(20, 30, 27.5)\n" +"# `ratio` is now 0.75.\n" +"[/codeblock]" +msgstr "" + +#: modules/gdscript/doc_classes/@GDScript.xml:506 +msgid "" +"Returns [code]true[/code] if [code]a[/code] and [code]b[/code] are " +"approximately equal to each other." +msgstr "" + +#: modules/gdscript/doc_classes/@GDScript.xml:515 +msgid "" +"Returns whether [code]s[/code] is an infinity value (either positive " +"infinity or negative infinity)." +msgstr "" + +#: modules/gdscript/doc_classes/@GDScript.xml:524 +msgid "" +"Returns whether [code]instance[/code] is a valid object (e.g. has not been " +"deleted from memory)." +msgstr "" + +#: modules/gdscript/doc_classes/@GDScript.xml:533 +msgid "Returns whether [code]s[/code] is a NaN (Not-A-Number) value." +msgstr "" + +#: modules/gdscript/doc_classes/@GDScript.xml:542 +msgid "Returns [code]true[/code] if [code]s[/code] is zero or almost zero." +msgstr "" + +#: modules/gdscript/doc_classes/@GDScript.xml:551 +msgid "" +"Returns length of Variant [code]var[/code]. Length is the character count of " +"String, element count of Array, size of Dictionary, etc.\n" +"[b]Note:[/b] Generates a fatal error if Variant can not provide a length.\n" +"[codeblock]\n" +"a = [1, 2, 3, 4]\n" +"len(a) # Returns 4\n" +"[/codeblock]" +msgstr "" + +#: modules/gdscript/doc_classes/@GDScript.xml:569 +msgid "" +"Linearly interpolates between two values by a normalized value. This is the " +"opposite of [method inverse_lerp].\n" +"If the [code]from[/code] and [code]to[/code] arguments are of type [int] or " +"[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]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" +"[/codeblock]" +msgstr "" + +#: modules/gdscript/doc_classes/@GDScript.xml:588 +msgid "" +"Linearly interpolates between two angles (in radians) by a normalized " +"value.\n" +"Similar to [method lerp], but interpolates correctly when the angles wrap " +"around [constant @GDScript.TAU].\n" +"[codeblock]\n" +"extends Sprite\n" +"var elapsed = 0.0\n" +"func _process(delta):\n" +" var min_angle = deg2rad(0.0)\n" +" var max_angle = deg2rad(90.0)\n" +" rotation = lerp_angle(min_angle, max_angle, elapsed)\n" +" elapsed += delta\n" +"[/codeblock]" +msgstr "" + +#: modules/gdscript/doc_classes/@GDScript.xml:607 +msgid "" +"Converts from linear energy to decibels (audio). This can be used to " +"implement volume sliders that behave as expected (since volume isn't " +"linear). Example:\n" +"[codeblock]\n" +"# \"Slider\" refers to a node that inherits Range such as HSlider or " +"VSlider.\n" +"# Its range must be configured to go from 0 to 1.\n" +"# Change the bus name if you'd like to change the volume of a specific bus " +"only.\n" +"AudioServer.set_bus_volume_db(AudioServer.get_bus_index(\"Master\"), " +"linear2db($Slider.value))\n" +"[/codeblock]" +msgstr "" + +#: modules/gdscript/doc_classes/@GDScript.xml:622 +msgid "" +"Loads a resource from the filesystem located at [code]path[/code].\n" +"[b]Note:[/b] Resource paths can be obtained by right-clicking on a resource " +"in the FileSystem dock and choosing [b]Copy Path[/b].\n" +"[codeblock]\n" +"# Load a scene called main located in the root of the project directory.\n" +"var main = load(\"res://main.tscn\")\n" +"[/codeblock]\n" +"[b]Important:[/b] The path must be absolute, a local path will just return " +"[code]null[/code]." +msgstr "" + +#: modules/gdscript/doc_classes/@GDScript.xml:637 +msgid "" +"Natural logarithm. The amount of time needed to reach a certain level of " +"continuous growth.\n" +"[b]Note:[/b] This is not the same as the \"log\" function on most " +"calculators, which uses a base 10 logarithm.\n" +"[codeblock]\n" +"log(10) # Returns 2.302585\n" +"[/codeblock]" +msgstr "" + +#: modules/gdscript/doc_classes/@GDScript.xml:652 +msgid "" +"Returns the maximum of two values.\n" +"[codeblock]\n" +"max(1, 2) # Returns 2\n" +"max(-3.99, -4) # Returns -3.99\n" +"[/codeblock]" +msgstr "" + +#: modules/gdscript/doc_classes/@GDScript.xml:667 +msgid "" +"Returns the minimum of two values.\n" +"[codeblock]\n" +"min(1, 2) # Returns 1\n" +"min(-3.99, -4) # Returns -4\n" +"[/codeblock]" +msgstr "" + +#: modules/gdscript/doc_classes/@GDScript.xml:684 +msgid "" +"Moves [code]from[/code] toward [code]to[/code] by the [code]delta[/code] " +"value.\n" +"Use a negative [code]delta[/code] value to move away.\n" +"[codeblock]\n" +"move_toward(10, 5, 4) # Returns 6\n" +"[/codeblock]" +msgstr "" + +#: modules/gdscript/doc_classes/@GDScript.xml:697 +msgid "" +"Returns the nearest larger power of 2 for integer [code]value[/code].\n" +"[codeblock]\n" +"nearest_po2(3) # Returns 4\n" +"nearest_po2(4) # Returns 4\n" +"nearest_po2(5) # Returns 8\n" +"[/codeblock]" +msgstr "" + +#: modules/gdscript/doc_classes/@GDScript.xml:711 +msgid "" +"Returns an integer representing the Unicode code point of the given Unicode " +"character [code]char[/code].\n" +"[codeblock]\n" +"a = ord(\"A\") # a is 65\n" +"a = ord(\"a\") # a is 97\n" +"a = ord(\"€\") # a is 8364\n" +"[/codeblock]\n" +"This is the inverse of [method char]." +msgstr "" + +#: modules/gdscript/doc_classes/@GDScript.xml:726 +msgid "" +"Parse JSON text to a Variant (use [method typeof] to check if it is what you " +"expect).\n" +"Be aware that the JSON specification does not define integer or float types, " +"but only a number type. Therefore, parsing a JSON text will convert all " +"numerical values to [float] types.\n" +"Note that JSON objects do not preserve key order like Godot dictionaries, " +"thus you should not rely on keys being in a certain order if a dictionary is " +"constructed from JSON. In contrast, JSON arrays retain the order of their " +"elements:\n" +"[codeblock]\n" +"p = parse_json('[\"a\", \"b\", \"c\"]')\n" +"if typeof(p) == TYPE_ARRAY:\n" +" print(p[0]) # Prints a\n" +"else:\n" +" print(\"unexpected results\")\n" +"[/codeblock]" +msgstr "" + +#: modules/gdscript/doc_classes/@GDScript.xml:746 +#: modules/visual_script/doc_classes/VisualScriptBuiltinFunc.xml:142 +msgid "" +"Converts a 2D point expressed in the polar coordinate system (a distance " +"from the origin [code]r[/code] and an angle [code]th[/code]) to the " +"cartesian coordinate system (X and Y axis)." +msgstr "" + +#: modules/gdscript/doc_classes/@GDScript.xml:757 +msgid "" +"Returns the integer modulus of [code]a/b[/code] that wraps equally in " +"positive and negative.\n" +"[codeblock]\n" +"var i = -6\n" +"while i < 5:\n" +" prints(i, posmod(i, 3))\n" +" i += 1\n" +"[/codeblock]\n" +"Produces:\n" +"[codeblock]\n" +"-6 0\n" +"-5 1\n" +"-4 2\n" +"-3 0\n" +"-2 1\n" +"-1 2\n" +"0 0\n" +"1 1\n" +"2 2\n" +"3 0\n" +"4 1\n" +"[/codeblock]" +msgstr "" + +#: modules/gdscript/doc_classes/@GDScript.xml:788 +msgid "" +"Returns the result of [code]x[/code] raised to the power of [code]y[/code].\n" +"[codeblock]\n" +"pow(2, 5) # Returns 32\n" +"[/codeblock]" +msgstr "" + +#: modules/gdscript/doc_classes/@GDScript.xml:800 +msgid "" +"Returns a resource from the filesystem that is loaded during script " +"parsing.\n" +"[b]Note:[/b] Resource paths can be obtained by right clicking on a resource " +"in the Assets Panel and choosing \"Copy Path\".\n" +"[codeblock]\n" +"# Load a scene called main located in the root of the project directory.\n" +"var main = preload(\"res://main.tscn\")\n" +"[/codeblock]" +msgstr "" + +#: modules/gdscript/doc_classes/@GDScript.xml:812 +msgid "" +"Converts one or more arguments to strings in the best way possible and " +"prints them to the console.\n" +"[codeblock]\n" +"a = [1, 2, 3]\n" +"print(\"a\", \"b\", a) # Prints ab[1, 2, 3]\n" +"[/codeblock]" +msgstr "" + +#: modules/gdscript/doc_classes/@GDScript.xml:823 +msgid "Like [method print], but prints only when used in debug mode." +msgstr "" + +#: modules/gdscript/doc_classes/@GDScript.xml:830 +msgid "" +"Prints a stack track at code location, only works when running with debugger " +"turned on.\n" +"Output in the console would look something like this:\n" +"[codeblock]\n" +"Frame 0 - res://test.gd:16 in function '_process'\n" +"[/codeblock]" +msgstr "" + +#: modules/gdscript/doc_classes/@GDScript.xml:841 +msgid "" +"Prints one or more arguments to strings in the best way possible to standard " +"error line.\n" +"[codeblock]\n" +"printerr(\"prints to stderr\")\n" +"[/codeblock]" +msgstr "" + +#: modules/gdscript/doc_classes/@GDScript.xml:851 +msgid "" +"Prints one or more arguments to strings in the best way possible to console. " +"No newline is added at the end.\n" +"[codeblock]\n" +"printraw(\"A\")\n" +"printraw(\"B\")\n" +"# Prints AB\n" +"[/codeblock]\n" +"[b]Note:[/b] Due to limitations with Godot's built-in console, this only " +"prints to the terminal. If you need to print in the editor, use another " +"method, such as [method print]." +msgstr "" + +#: modules/gdscript/doc_classes/@GDScript.xml:864 +msgid "" +"Prints one or more arguments to the console with a space between each " +"argument.\n" +"[codeblock]\n" +"prints(\"A\", \"B\", \"C\") # Prints A B C\n" +"[/codeblock]" +msgstr "" + +#: modules/gdscript/doc_classes/@GDScript.xml:874 +msgid "" +"Prints one or more arguments to the console with a tab between each " +"argument.\n" +"[codeblock]\n" +"printt(\"A\", \"B\", \"C\") # Prints A B C\n" +"[/codeblock]" +msgstr "" + +#: modules/gdscript/doc_classes/@GDScript.xml:886 +msgid "" +"Pushes an error message to Godot's built-in debugger and to the OS " +"terminal.\n" +"[codeblock]\n" +"push_error(\"test error\") # Prints \"test error\" to debugger and terminal " +"as error call\n" +"[/codeblock]" +msgstr "" + +#: modules/gdscript/doc_classes/@GDScript.xml:898 +msgid "" +"Pushes a warning message to Godot's built-in debugger and to the OS " +"terminal.\n" +"[codeblock]\n" +"push_warning(\"test warning\") # Prints \"test warning\" to debugger and " +"terminal as warning call\n" +"[/codeblock]" +msgstr "" + +#: modules/gdscript/doc_classes/@GDScript.xml:910 +msgid "" +"Converts from radians to degrees.\n" +"[codeblock]\n" +"rad2deg(0.523599) # Returns 30\n" +"[/codeblock]" +msgstr "" + +#: modules/gdscript/doc_classes/@GDScript.xml:924 +msgid "" +"Random range, any floating point value between [code]from[/code] and " +"[code]to[/code].\n" +"[codeblock]\n" +"prints(rand_range(0, 1), rand_range(0, 1)) # Prints e.g. 0.135591 0.405263\n" +"[/codeblock]" +msgstr "" + +#: modules/gdscript/doc_classes/@GDScript.xml:936 +msgid "" +"Random from seed: pass a [code]seed[/code], and an array with both number " +"and new seed is returned. \"Seed\" here refers to the internal state of the " +"pseudo random number generator. The internal state of the current " +"implementation is 64 bits." +msgstr "" + +#: modules/gdscript/doc_classes/@GDScript.xml:943 +msgid "" +"Returns a random floating point value on the interval [code][0, 1][/code].\n" +"[codeblock]\n" +"randf() # Returns e.g. 0.375671\n" +"[/codeblock]" +msgstr "" + +#: modules/gdscript/doc_classes/@GDScript.xml:953 +msgid "" +"Returns a random unsigned 32 bit integer. Use remainder to obtain a random " +"value in the interval [code][0, N - 1][/code] (where N is smaller than " +"2^32).\n" +"[codeblock]\n" +"randi() # Returns random integer between 0 and 2^32 - 1\n" +"randi() % 20 # Returns random integer between 0 and 19\n" +"randi() % 100 # Returns random integer between 0 and 99\n" +"randi() % 100 + 1 # Returns random integer between 1 and 100\n" +"[/codeblock]" +msgstr "" + +#: modules/gdscript/doc_classes/@GDScript.xml:966 +msgid "" +"Randomizes the seed (or the internal state) of the random number generator. " +"Current implementation reseeds using a number based on time.\n" +"[codeblock]\n" +"func _ready():\n" +" randomize()\n" +"[/codeblock]" +msgstr "" + +#: modules/gdscript/doc_classes/@GDScript.xml:977 +msgid "" +"Returns an array with the given range. Range can be 1 argument N (0 to N-1), " +"two arguments (initial, final-1) or three arguments (initial, final-1, " +"increment).\n" +"[codeblock]\n" +"for i in range(4):\n" +" print(i)\n" +"for i in range(2, 5):\n" +" print(i)\n" +"for i in range(0, 6, 2):\n" +" print(i)\n" +"[/codeblock]\n" +"Output:\n" +"[codeblock]\n" +"0\n" +"1\n" +"2\n" +"3\n" +"\n" +"2\n" +"3\n" +"4\n" +"\n" +"0\n" +"2\n" +"4\n" +"[/codeblock]" +msgstr "" + +#: modules/gdscript/doc_classes/@GDScript.xml:1017 +msgid "" +"Maps a [code]value[/code] from range [code][istart, istop][/code] to [code]" +"[ostart, ostop][/code].\n" +"[codeblock]\n" +"range_lerp(75, 0, 100, -1, 1) # Returns 0.5\n" +"[/codeblock]" +msgstr "" + +#: modules/gdscript/doc_classes/@GDScript.xml:1029 +msgid "" +"Returns the integral value that is nearest to [code]s[/code], with halfway " +"cases rounded away from zero.\n" +"[codeblock]\n" +"round(2.6) # Returns 3\n" +"[/codeblock]" +msgstr "" + +#: modules/gdscript/doc_classes/@GDScript.xml:1041 +msgid "" +"Sets seed for the random number generator.\n" +"[codeblock]\n" +"my_seed = \"Godot Rocks\"\n" +"seed(my_seed.hash())\n" +"[/codeblock]" +msgstr "" + +#: modules/gdscript/doc_classes/@GDScript.xml:1054 +msgid "" +"Returns the sign of [code]s[/code]: -1 or 1. Returns 0 if [code]s[/code] is " +"0.\n" +"[codeblock]\n" +"sign(-6) # Returns -1\n" +"sign(0) # Returns 0\n" +"sign(6) # Returns 1\n" +"[/codeblock]" +msgstr "" + +#: modules/gdscript/doc_classes/@GDScript.xml:1068 +msgid "" +"Returns the sine of angle [code]s[/code] in radians.\n" +"[codeblock]\n" +"sin(0.523599) # Returns 0.5\n" +"[/codeblock]" +msgstr "" + +#: modules/gdscript/doc_classes/@GDScript.xml:1080 +msgid "" +"Returns the hyperbolic sine of [code]s[/code].\n" +"[codeblock]\n" +"a = log(2.0) # Returns 0.693147\n" +"sinh(a) # Returns 0.75\n" +"[/codeblock]" +msgstr "" + +#: modules/gdscript/doc_classes/@GDScript.xml:1097 +msgid "" +"Returns a number smoothly interpolated between the [code]from[/code] and " +"[code]to[/code], based on the [code]weight[/code]. Similar to [method lerp], " +"but interpolates faster at the beginning and slower at the end.\n" +"[codeblock]\n" +"smoothstep(0, 2, 0.5) # Returns 0.15\n" +"smoothstep(0, 2, 1.0) # Returns 0.5\n" +"smoothstep(0, 2, 2.0) # Returns 1.0\n" +"[/codeblock]" +msgstr "" + +#: modules/gdscript/doc_classes/@GDScript.xml:1111 +msgid "" +"Returns the square root of [code]s[/code].\n" +"[codeblock]\n" +"sqrt(9) # Returns 3\n" +"[/codeblock]" +msgstr "" + +#: modules/gdscript/doc_classes/@GDScript.xml:1123 +msgid "" +"Returns the position of the first non-zero digit, after the decimal point. " +"Note that the maximum return value is 10, which is a design decision in the " +"implementation.\n" +"[codeblock]\n" +"# n is 0\n" +"n = step_decimals(5)\n" +"# n is 4\n" +"n = step_decimals(1.0005)\n" +"# n is 9\n" +"n = step_decimals(0.000000005)\n" +"[/codeblock]" +msgstr "" + +#: modules/gdscript/doc_classes/@GDScript.xml:1142 +msgid "" +"Snaps float value [code]s[/code] to a given [code]step[/code]. This can also " +"be used to round a floating point number to an arbitrary number of " +"decimals.\n" +"[codeblock]\n" +"stepify(100, 32) # Returns 96\n" +"stepify(3.14159, 0.01) # Returns 3.14\n" +"[/codeblock]" +msgstr "" + +#: modules/gdscript/doc_classes/@GDScript.xml:1153 +msgid "" +"Converts one or more arguments to string in the best way possible.\n" +"[codeblock]\n" +"var a = [10, 20, 30]\n" +"var b = str(a);\n" +"len(a) # Returns 3\n" +"len(b) # Returns 12\n" +"[/codeblock]" +msgstr "" + +#: modules/gdscript/doc_classes/@GDScript.xml:1168 +msgid "" +"Converts a formatted string that was returned by [method var2str] to the " +"original value.\n" +"[codeblock]\n" +"a = '{ \"a\": 1, \"b\": 2 }'\n" +"b = str2var(a)\n" +"print(b[\"a\"]) # Prints 1\n" +"[/codeblock]" +msgstr "" + +#: modules/gdscript/doc_classes/@GDScript.xml:1182 +msgid "" +"Returns the tangent of angle [code]s[/code] in radians.\n" +"[codeblock]\n" +"tan(deg2rad(45)) # Returns 1\n" +"[/codeblock]" +msgstr "" + +#: modules/gdscript/doc_classes/@GDScript.xml:1194 +msgid "" +"Returns the hyperbolic tangent of [code]s[/code].\n" +"[codeblock]\n" +"a = log(2.0) # Returns 0.693147\n" +"tanh(a) # Returns 0.6\n" +"[/codeblock]" +msgstr "" + +#: modules/gdscript/doc_classes/@GDScript.xml:1207 +msgid "" +"Converts a Variant [code]var[/code] to JSON text and return the result. " +"Useful for serializing data to store or send over the network.\n" +"[codeblock]\n" +"a = { \"a\": 1, \"b\": 2 }\n" +"b = to_json(a)\n" +"print(b) # {\"a\":1, \"b\":2}\n" +"[/codeblock]" +msgstr "" + +#: modules/gdscript/doc_classes/@GDScript.xml:1221 +msgid "" +"Returns whether the given class exists in [ClassDB].\n" +"[codeblock]\n" +"type_exists(\"Sprite2D\") # Returns true\n" +"type_exists(\"Variant\") # Returns false\n" +"[/codeblock]" +msgstr "" + +#: modules/gdscript/doc_classes/@GDScript.xml:1234 +msgid "" +"Returns the internal type of the given Variant object, using the [enum " +"Variant.Type] values.\n" +"[codeblock]\n" +"p = parse_json('[\"a\", \"b\", \"c\"]')\n" +"if typeof(p) == TYPE_ARRAY:\n" +" print(p[0]) # Prints a\n" +"else:\n" +" print(\"unexpected results\")\n" +"[/codeblock]" +msgstr "" + +#: modules/gdscript/doc_classes/@GDScript.xml:1250 +msgid "" +"Checks that [code]json[/code] is valid JSON data. Returns an empty string if " +"valid, or an error message otherwise.\n" +"[codeblock]\n" +"j = to_json([1, 2, 3])\n" +"v = validate_json(j)\n" +"if not v:\n" +" print(\"valid\")\n" +"else:\n" +" prints(\"invalid\", v)\n" +"[/codeblock]" +msgstr "" + +#: modules/gdscript/doc_classes/@GDScript.xml:1269 +msgid "" +"Encodes a variable value to a byte array. When [code]full_objects[/code] is " +"[code]true[/code] encoding objects is allowed (and can potentially include " +"code)." +msgstr "" + +#: modules/gdscript/doc_classes/@GDScript.xml:1278 +msgid "" +"Converts a Variant [code]var[/code] to a formatted string that can later be " +"parsed using [method str2var].\n" +"[codeblock]\n" +"a = { \"a\": 1, \"b\": 2 }\n" +"print(var2str(a))\n" +"[/codeblock]\n" +"prints\n" +"[codeblock]\n" +"{\n" +"\"a\": 1,\n" +"\"b\": 2\n" +"}\n" +"[/codeblock]" +msgstr "" + +#: modules/gdscript/doc_classes/@GDScript.xml:1298 +msgid "" +"Returns a weak reference to an object.\n" +"A weak reference to an object is not enough to keep the object alive: when " +"the only remaining references to a referent are weak references, garbage " +"collection is free to destroy the referent and reuse its memory for " +"something else. However, until the object is actually destroyed the weak " +"reference may return the object even if there are no strong references to it." +msgstr "" + +#: modules/gdscript/doc_classes/@GDScript.xml:1312 +msgid "" +"Wraps float [code]value[/code] between [code]min[/code] and [code]max[/" +"code].\n" +"Usable for creating loop-alike behavior or infinite surfaces.\n" +"[codeblock]\n" +"# a is 0.5\n" +"a = wrapf(10.5, 0.0, 10.0)\n" +"[/codeblock]\n" +"[codeblock]\n" +"# a is 9.5\n" +"a = wrapf(-0.5, 0.0, 10.0)\n" +"[/codeblock]\n" +"[codeblock]\n" +"# Infinite loop between 0.0 and 0.99\n" +"f = wrapf(f + 0.1, 0.0, 1.0)\n" +"[/codeblock]\n" +"[codeblock]\n" +"# Infinite rotation (in radians)\n" +"angle = wrapf(angle + 0.1, 0.0, TAU)\n" +"[/codeblock]\n" +"[b]Note:[/b] If you just want to wrap between 0.0 and [code]n[/code] (where " +"[code]n[/code] is a positive floating-point value), it is better for " +"performance to use the [method fmod] method like [code]fmod(number, n)[/" +"code].\n" +"[code]wrapf[/code] is more flexible than using the [method fmod] approach by " +"giving the user a simple control over the minimum value. It also fully " +"supports negative numbers, e.g.\n" +"[codeblock]\n" +"# Infinite rotation (in radians)\n" +"angle = wrapf(angle + 0.1, -PI, PI)\n" +"[/codeblock]" +msgstr "" + +#: modules/gdscript/doc_classes/@GDScript.xml:1348 +msgid "" +"Wraps integer [code]value[/code] between [code]min[/code] and [code]max[/" +"code].\n" +"Usable for creating loop-alike behavior or infinite surfaces.\n" +"[codeblock]\n" +"# a is 0\n" +"a = wrapi(10, 0, 10)\n" +"[/codeblock]\n" +"[codeblock]\n" +"# a is 9\n" +"a = wrapi(-1, 0, 10)\n" +"[/codeblock]\n" +"[codeblock]\n" +"# Infinite loop between 0 and 9\n" +"frame = wrapi(frame + 1, 0, 10)\n" +"[/codeblock]\n" +"[b]Note:[/b] If you just want to wrap between 0 and [code]n[/code] (where " +"[code]n[/code] is a positive integer value), it is better for performance to " +"use the modulo operator like [code]number % n[/code].\n" +"[code]wrapi[/code] is more flexible than using the modulo approach by giving " +"the user a simple control over the minimum value. It also fully supports " +"negative numbers, e.g.\n" +"[codeblock]\n" +"# result is -2\n" +"var result = wrapi(-6, -5, -1)\n" +"[/codeblock]" +msgstr "" + +#: modules/gdscript/doc_classes/@GDScript.xml:1378 +msgid "" +"Stops the function execution and returns the current suspended state to the " +"calling function.\n" +"From the caller, call [method GDScriptFunctionState.resume] on the state to " +"resume execution. This invalidates the state. Within the resumed function, " +"[code]yield()[/code] returns whatever was passed to the [code]resume()[/" +"code] function call.\n" +"If passed an object and a signal, the execution is resumed when the object " +"emits the given signal. In this case, [code]yield()[/code] returns the " +"argument passed to [code]emit_signal()[/code] if the signal takes only one " +"argument, or an array containing all the arguments passed to " +"[code]emit_signal()[/code] if the signal takes multiple arguments.\n" +"You can also use [code]yield[/code] to wait for a function to finish:\n" +"[codeblock]\n" +"func _ready():\n" +" yield(countdown(), \"completed\") # waiting for the countdown() function " +"to complete\n" +" print('Ready')\n" +"\n" +"func countdown():\n" +" yield(get_tree(), \"idle_frame\") # returns a GDScriptFunctionState " +"object to _ready()\n" +" print(3)\n" +" yield(get_tree().create_timer(1.0), \"timeout\")\n" +" print(2)\n" +" yield(get_tree().create_timer(1.0), \"timeout\")\n" +" print(1)\n" +" yield(get_tree().create_timer(1.0), \"timeout\")\n" +"\n" +"# prints:\n" +"# 3\n" +"# 2\n" +"# 1\n" +"# Ready\n" +"[/codeblock]\n" +"When yielding on a function, the [code]completed[/code] signal will be " +"emitted automatically when the function returns. It can, therefore, be used " +"as the [code]signal[/code] parameter of the [code]yield[/code] method to " +"resume.\n" +"In order to yield on a function, the resulting function should also return a " +"[code]GDScriptFunctionState[/code]. Notice [code]yield(get_tree(), " +"\"idle_frame\")[/code] from the above example." +msgstr "" + +#: modules/gdscript/doc_classes/@GDScript.xml:1409 +msgid "" +"Constant that represents how many times the diameter of a circle fits around " +"its perimeter." +msgstr "" + +#: modules/gdscript/doc_classes/@GDScript.xml:1412 +msgid "The circle constant, the circumference of the unit circle." +msgstr "" + +#: modules/gdscript/doc_classes/@GDScript.xml:1415 +msgid "A positive infinity. (For negative infinity, use -INF)." +msgstr "" + +#: modules/gdscript/doc_classes/@GDScript.xml:1418 +msgid "" +"Macro constant that expands to an expression of type float that represents a " +"NaN.\n" +"The NaN values are used to identify undefined or non-representable values " +"for floating-point elements, such as the square root of negative numbers or " +"the result of 0/0." +msgstr "" + +#: doc/classes/@GlobalScope.xml:4 +msgid "Global scope constants and variables." +msgstr "" + +#: doc/classes/@GlobalScope.xml:7 +msgid "" +"Global scope constants and variables. This is all that resides in the " +"globals, constants regarding error codes, keycodes, property hints, etc.\n" +"Singletons are also documented here, since they can be accessed from " +"anywhere." +msgstr "" + +#: doc/classes/@GlobalScope.xml:16 +msgid "The [AudioServer] singleton." +msgstr "" + +#: doc/classes/@GlobalScope.xml:19 +msgid "The [CameraServer] singleton." +msgstr "" + +#: doc/classes/@GlobalScope.xml:22 +msgid "The [ClassDB] singleton." +msgstr "" + +#: doc/classes/@GlobalScope.xml:25 +msgid "The [DisplayServer] singleton." +msgstr "" + +#: doc/classes/@GlobalScope.xml:28 +msgid "The [Engine] singleton." +msgstr "" + +#: doc/classes/@GlobalScope.xml:31 +msgid "The [Geometry] singleton." +msgstr "" + +#: doc/classes/@GlobalScope.xml:34 +msgid "The [IP] singleton." +msgstr "" + +#: doc/classes/@GlobalScope.xml:37 +msgid "The [Input] singleton." +msgstr "" + +#: doc/classes/@GlobalScope.xml:40 +msgid "The [InputMap] singleton." +msgstr "" + +#: doc/classes/@GlobalScope.xml:43 +msgid "The [JSON] singleton." +msgstr "" + +#: doc/classes/@GlobalScope.xml:46 +msgid "" +"The [JavaClassWrapper] singleton.\n" +"[b]Note:[/b] Only implemented on Android." +msgstr "" + +#: doc/classes/@GlobalScope.xml:50 +msgid "" +"The [JavaScript] singleton.\n" +"[b]Note:[/b] Only implemented on HTML5." +msgstr "" + +#: doc/classes/@GlobalScope.xml:54 +msgid "The [Marshalls] singleton." +msgstr "" + +#: doc/classes/@GlobalScope.xml:57 +msgid "The [NavigationMeshGenerator] singleton." +msgstr "" + +#: doc/classes/@GlobalScope.xml:60 doc/classes/@GlobalScope.xml:63 +msgid "The [NavigationServer2D] singleton." +msgstr "" + +#: doc/classes/@GlobalScope.xml:66 +msgid "The [OS] singleton." +msgstr "" + +#: doc/classes/@GlobalScope.xml:69 +msgid "The [Performance] singleton." +msgstr "" + +#: doc/classes/@GlobalScope.xml:72 +msgid "The [PhysicsServer2D] singleton." +msgstr "" + +#: doc/classes/@GlobalScope.xml:75 +msgid "The [PhysicsServer3D] singleton." +msgstr "" + +#: doc/classes/@GlobalScope.xml:78 +msgid "The [ProjectSettings] singleton." +msgstr "" + +#: doc/classes/@GlobalScope.xml:81 +msgid "The [RenderingServer] singleton." +msgstr "" + +#: doc/classes/@GlobalScope.xml:84 +msgid "The [ResourceLoader] singleton." +msgstr "" + +#: doc/classes/@GlobalScope.xml:87 +msgid "The [ResourceSaver] singleton." +msgstr "" + +#: doc/classes/@GlobalScope.xml:90 +msgid "The [TranslationServer] singleton." +msgstr "" + +#: 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 "" + +#: doc/classes/@GlobalScope.xml:104 +msgid "Top margin, usually used for [Control] or [StyleBox]-derived classes." +msgstr "" + +#: doc/classes/@GlobalScope.xml:107 +msgid "Right margin, usually used for [Control] or [StyleBox]-derived classes." +msgstr "" + +#: doc/classes/@GlobalScope.xml:110 +msgid "" +"Bottom margin, usually used for [Control] or [StyleBox]-derived classes." +msgstr "" + +#: doc/classes/@GlobalScope.xml:113 +msgid "Top-left corner." +msgstr "" + +#: doc/classes/@GlobalScope.xml:116 +msgid "Top-right corner." +msgstr "" + +#: doc/classes/@GlobalScope.xml:119 +msgid "Bottom-right corner." +msgstr "" + +#: doc/classes/@GlobalScope.xml:122 +msgid "Bottom-left corner." +msgstr "" + +#: doc/classes/@GlobalScope.xml:125 +msgid "" +"General vertical alignment, usually used for [Separator], [ScrollBar], " +"[Slider], etc." +msgstr "" + +#: doc/classes/@GlobalScope.xml:128 +msgid "" +"General horizontal alignment, usually used for [Separator], [ScrollBar], " +"[Slider], etc." +msgstr "" + +#: doc/classes/@GlobalScope.xml:131 +msgid "Horizontal left alignment, usually for text-derived classes." +msgstr "" + +#: doc/classes/@GlobalScope.xml:134 +msgid "Horizontal center alignment, usually for text-derived classes." +msgstr "" + +#: doc/classes/@GlobalScope.xml:137 +msgid "Horizontal right alignment, usually for text-derived classes." +msgstr "" + +#: doc/classes/@GlobalScope.xml:140 +msgid "Vertical top alignment, usually for text-derived classes." +msgstr "" + +#: doc/classes/@GlobalScope.xml:143 +msgid "Vertical center alignment, usually for text-derived classes." +msgstr "" + +#: doc/classes/@GlobalScope.xml:146 +msgid "Vertical bottom alignment, usually for text-derived classes." +msgstr "" + +#: doc/classes/@GlobalScope.xml:149 +msgid "Keycodes with this bit applied are non-printable." +msgstr "" + +#: doc/classes/@GlobalScope.xml:152 +msgid "Escape key." +msgstr "" + +#: doc/classes/@GlobalScope.xml:155 +msgid "Tab key." +msgstr "" + +#: doc/classes/@GlobalScope.xml:158 +msgid "Shift + Tab key." +msgstr "" + +#: doc/classes/@GlobalScope.xml:161 +msgid "Backspace key." +msgstr "" + +#: doc/classes/@GlobalScope.xml:164 +msgid "Return key (on the main keyboard)." +msgstr "" + +#: doc/classes/@GlobalScope.xml:167 +msgid "Enter key on the numeric keypad." +msgstr "" + +#: doc/classes/@GlobalScope.xml:170 +msgid "Insert key." +msgstr "" + +#: doc/classes/@GlobalScope.xml:173 +msgid "Delete key." +msgstr "" + +#: doc/classes/@GlobalScope.xml:176 +msgid "Pause key." +msgstr "" + +#: doc/classes/@GlobalScope.xml:179 +msgid "Print Screen key." +msgstr "" + +#: doc/classes/@GlobalScope.xml:182 +msgid "System Request key." +msgstr "" + +#: doc/classes/@GlobalScope.xml:185 +msgid "Clear key." +msgstr "" + +#: doc/classes/@GlobalScope.xml:188 +msgid "Home key." +msgstr "" + +#: doc/classes/@GlobalScope.xml:191 +msgid "End key." +msgstr "" + +#: doc/classes/@GlobalScope.xml:194 +msgid "Left arrow key." +msgstr "" + +#: doc/classes/@GlobalScope.xml:197 +msgid "Up arrow key." +msgstr "" + +#: doc/classes/@GlobalScope.xml:200 +msgid "Right arrow key." +msgstr "" + +#: doc/classes/@GlobalScope.xml:203 +msgid "Down arrow key." +msgstr "" + +#: doc/classes/@GlobalScope.xml:206 +msgid "Page Up key." +msgstr "" + +#: doc/classes/@GlobalScope.xml:209 +msgid "Page Down key." +msgstr "" + +#: doc/classes/@GlobalScope.xml:212 +msgid "Shift key." +msgstr "" + +#: doc/classes/@GlobalScope.xml:215 +msgid "Control key." +msgstr "" + +#: doc/classes/@GlobalScope.xml:218 +msgid "Meta key." +msgstr "" + +#: doc/classes/@GlobalScope.xml:221 +msgid "Alt key." +msgstr "" + +#: doc/classes/@GlobalScope.xml:224 +msgid "Caps Lock key." +msgstr "" + +#: doc/classes/@GlobalScope.xml:227 +msgid "Num Lock key." +msgstr "" + +#: doc/classes/@GlobalScope.xml:230 +msgid "Scroll Lock key." +msgstr "" + +#: doc/classes/@GlobalScope.xml:233 +msgid "F1 key." +msgstr "" + +#: doc/classes/@GlobalScope.xml:236 +msgid "F2 key." +msgstr "" + +#: doc/classes/@GlobalScope.xml:239 +msgid "F3 key." +msgstr "" + +#: doc/classes/@GlobalScope.xml:242 +msgid "F4 key." +msgstr "" + +#: doc/classes/@GlobalScope.xml:245 +msgid "F5 key." +msgstr "" + +#: doc/classes/@GlobalScope.xml:248 +msgid "F6 key." +msgstr "" + +#: doc/classes/@GlobalScope.xml:251 +msgid "F7 key." +msgstr "" + +#: doc/classes/@GlobalScope.xml:254 +msgid "F8 key." +msgstr "" + +#: doc/classes/@GlobalScope.xml:257 +msgid "F9 key." +msgstr "" + +#: doc/classes/@GlobalScope.xml:260 +msgid "F10 key." +msgstr "" + +#: doc/classes/@GlobalScope.xml:263 +msgid "F11 key." +msgstr "" + +#: doc/classes/@GlobalScope.xml:266 +msgid "F12 key." +msgstr "" + +#: doc/classes/@GlobalScope.xml:269 +msgid "F13 key." +msgstr "" + +#: doc/classes/@GlobalScope.xml:272 +msgid "F14 key." +msgstr "" + +#: doc/classes/@GlobalScope.xml:275 +msgid "F15 key." +msgstr "" + +#: doc/classes/@GlobalScope.xml:278 +msgid "F16 key." +msgstr "" + +#: doc/classes/@GlobalScope.xml:281 +msgid "Multiply (*) key on the numeric keypad." +msgstr "" + +#: doc/classes/@GlobalScope.xml:284 +msgid "Divide (/) key on the numeric keypad." +msgstr "" + +#: doc/classes/@GlobalScope.xml:287 +msgid "Subtract (-) key on the numeric keypad." +msgstr "" + +#: doc/classes/@GlobalScope.xml:290 +msgid "Period (.) key on the numeric keypad." +msgstr "" + +#: doc/classes/@GlobalScope.xml:293 +msgid "Add (+) key on the numeric keypad." +msgstr "" + +#: doc/classes/@GlobalScope.xml:296 +msgid "Number 0 on the numeric keypad." +msgstr "" + +#: doc/classes/@GlobalScope.xml:299 +msgid "Number 1 on the numeric keypad." +msgstr "" + +#: doc/classes/@GlobalScope.xml:302 +msgid "Number 2 on the numeric keypad." +msgstr "" + +#: doc/classes/@GlobalScope.xml:305 +msgid "Number 3 on the numeric keypad." +msgstr "" + +#: doc/classes/@GlobalScope.xml:308 +msgid "Number 4 on the numeric keypad." +msgstr "" + +#: doc/classes/@GlobalScope.xml:311 +msgid "Number 5 on the numeric keypad." +msgstr "" + +#: doc/classes/@GlobalScope.xml:314 +msgid "Number 6 on the numeric keypad." +msgstr "" + +#: doc/classes/@GlobalScope.xml:317 +msgid "Number 7 on the numeric keypad." +msgstr "" + +#: doc/classes/@GlobalScope.xml:320 +msgid "Number 8 on the numeric keypad." +msgstr "" + +#: doc/classes/@GlobalScope.xml:323 +msgid "Number 9 on the numeric keypad." +msgstr "" + +#: doc/classes/@GlobalScope.xml:326 +msgid "Left Super key (Windows key)." +msgstr "" + +#: doc/classes/@GlobalScope.xml:329 +msgid "Right Super key (Windows key)." +msgstr "" + +#: doc/classes/@GlobalScope.xml:332 +msgid "Context menu key." +msgstr "" + +#: doc/classes/@GlobalScope.xml:335 +msgid "Left Hyper key." +msgstr "" + +#: doc/classes/@GlobalScope.xml:338 +msgid "Right Hyper key." +msgstr "" + +#: doc/classes/@GlobalScope.xml:341 +msgid "Help key." +msgstr "" + +#: doc/classes/@GlobalScope.xml:344 +msgid "Left Direction key." +msgstr "" + +#: doc/classes/@GlobalScope.xml:347 +msgid "Right Direction key." +msgstr "" + +#: doc/classes/@GlobalScope.xml:350 +msgid "Back key." +msgstr "" + +#: doc/classes/@GlobalScope.xml:353 +msgid "Forward key." +msgstr "" + +#: doc/classes/@GlobalScope.xml:356 +msgid "Stop key." +msgstr "" + +#: doc/classes/@GlobalScope.xml:359 +msgid "Refresh key." +msgstr "" + +#: doc/classes/@GlobalScope.xml:362 +msgid "Volume down key." +msgstr "" + +#: doc/classes/@GlobalScope.xml:365 +msgid "Mute volume key." +msgstr "" + +#: doc/classes/@GlobalScope.xml:368 +msgid "Volume up key." +msgstr "" + +#: doc/classes/@GlobalScope.xml:371 +msgid "Bass Boost key." +msgstr "" + +#: doc/classes/@GlobalScope.xml:374 +msgid "Bass up key." +msgstr "" + +#: doc/classes/@GlobalScope.xml:377 +msgid "Bass down key." +msgstr "" + +#: doc/classes/@GlobalScope.xml:380 +msgid "Treble up key." +msgstr "" + +#: doc/classes/@GlobalScope.xml:383 +msgid "Treble down key." +msgstr "" + +#: doc/classes/@GlobalScope.xml:386 +msgid "Media play key." +msgstr "" + +#: doc/classes/@GlobalScope.xml:389 +msgid "Media stop key." +msgstr "" + +#: doc/classes/@GlobalScope.xml:392 +msgid "Previous song key." +msgstr "" + +#: doc/classes/@GlobalScope.xml:395 +msgid "Next song key." +msgstr "" + +#: doc/classes/@GlobalScope.xml:398 +msgid "Media record key." +msgstr "" + +#: doc/classes/@GlobalScope.xml:401 +msgid "Home page key." +msgstr "" + +#: doc/classes/@GlobalScope.xml:404 +msgid "Favorites key." +msgstr "" + +#: doc/classes/@GlobalScope.xml:407 +msgid "Search key." +msgstr "" + +#: doc/classes/@GlobalScope.xml:410 +msgid "Standby key." +msgstr "" + +#: doc/classes/@GlobalScope.xml:413 +msgid "Open URL / Launch Browser key." +msgstr "" + +#: doc/classes/@GlobalScope.xml:416 +msgid "Launch Mail key." +msgstr "" + +#: doc/classes/@GlobalScope.xml:419 +msgid "Launch Media key." +msgstr "" + +#: doc/classes/@GlobalScope.xml:422 +msgid "Launch Shortcut 0 key." +msgstr "" + +#: doc/classes/@GlobalScope.xml:425 +msgid "Launch Shortcut 1 key." +msgstr "" + +#: doc/classes/@GlobalScope.xml:428 +msgid "Launch Shortcut 2 key." +msgstr "" + +#: doc/classes/@GlobalScope.xml:431 +msgid "Launch Shortcut 3 key." +msgstr "" + +#: doc/classes/@GlobalScope.xml:434 +msgid "Launch Shortcut 4 key." +msgstr "" + +#: doc/classes/@GlobalScope.xml:437 +msgid "Launch Shortcut 5 key." +msgstr "" + +#: doc/classes/@GlobalScope.xml:440 +msgid "Launch Shortcut 6 key." +msgstr "" + +#: doc/classes/@GlobalScope.xml:443 +msgid "Launch Shortcut 7 key." +msgstr "" + +#: doc/classes/@GlobalScope.xml:446 +msgid "Launch Shortcut 8 key." +msgstr "" + +#: doc/classes/@GlobalScope.xml:449 +msgid "Launch Shortcut 9 key." +msgstr "" + +#: doc/classes/@GlobalScope.xml:452 +msgid "Launch Shortcut A key." +msgstr "" + +#: doc/classes/@GlobalScope.xml:455 +msgid "Launch Shortcut B key." +msgstr "" + +#: doc/classes/@GlobalScope.xml:458 +msgid "Launch Shortcut C key." +msgstr "" + +#: doc/classes/@GlobalScope.xml:461 +msgid "Launch Shortcut D key." +msgstr "" + +#: doc/classes/@GlobalScope.xml:464 +msgid "Launch Shortcut E key." +msgstr "" + +#: doc/classes/@GlobalScope.xml:467 +msgid "Launch Shortcut F key." +msgstr "" + +#: doc/classes/@GlobalScope.xml:470 +msgid "Unknown key." +msgstr "" + +#: doc/classes/@GlobalScope.xml:473 +msgid "Space key." +msgstr "" + +#: doc/classes/@GlobalScope.xml:476 +msgid "! key." +msgstr "" + +#: doc/classes/@GlobalScope.xml:479 +msgid "\" key." +msgstr "" + +#: doc/classes/@GlobalScope.xml:482 +msgid "# key." +msgstr "" + +#: doc/classes/@GlobalScope.xml:485 +msgid "$ key." +msgstr "" + +#: doc/classes/@GlobalScope.xml:488 +msgid "% key." +msgstr "" + +#: doc/classes/@GlobalScope.xml:491 +msgid "& key." +msgstr "" + +#: doc/classes/@GlobalScope.xml:494 +msgid "' key." +msgstr "" + +#: doc/classes/@GlobalScope.xml:497 +msgid "( key." +msgstr "" + +#: doc/classes/@GlobalScope.xml:500 +msgid ") key." +msgstr "" + +#: doc/classes/@GlobalScope.xml:503 +msgid "* key." +msgstr "" + +#: doc/classes/@GlobalScope.xml:506 +msgid "+ key." +msgstr "" + +#: doc/classes/@GlobalScope.xml:509 +msgid ", key." +msgstr "" + +#: doc/classes/@GlobalScope.xml:512 +msgid "- key." +msgstr "" + +#: doc/classes/@GlobalScope.xml:515 +msgid ". key." +msgstr "" + +#: doc/classes/@GlobalScope.xml:518 +msgid "/ key." +msgstr "" + +#: doc/classes/@GlobalScope.xml:521 +msgid "Number 0." +msgstr "" + +#: doc/classes/@GlobalScope.xml:524 +msgid "Number 1." +msgstr "" + +#: doc/classes/@GlobalScope.xml:527 +msgid "Number 2." +msgstr "" + +#: doc/classes/@GlobalScope.xml:530 +msgid "Number 3." +msgstr "" + +#: doc/classes/@GlobalScope.xml:533 +msgid "Number 4." +msgstr "" + +#: doc/classes/@GlobalScope.xml:536 +msgid "Number 5." +msgstr "" + +#: doc/classes/@GlobalScope.xml:539 +msgid "Number 6." +msgstr "" + +#: doc/classes/@GlobalScope.xml:542 +msgid "Number 7." +msgstr "" + +#: doc/classes/@GlobalScope.xml:545 +msgid "Number 8." +msgstr "" + +#: doc/classes/@GlobalScope.xml:548 +msgid "Number 9." +msgstr "" + +#: doc/classes/@GlobalScope.xml:551 +msgid ": key." +msgstr "" + +#: doc/classes/@GlobalScope.xml:554 +msgid "; key." +msgstr "" + +#: doc/classes/@GlobalScope.xml:557 +msgid "< key." +msgstr "" + +#: doc/classes/@GlobalScope.xml:560 +msgid "= key." +msgstr "" + +#: doc/classes/@GlobalScope.xml:563 +msgid "> key." +msgstr "" + +#: doc/classes/@GlobalScope.xml:566 +msgid "? key." +msgstr "" + +#: doc/classes/@GlobalScope.xml:569 +msgid "@ key." +msgstr "" + +#: doc/classes/@GlobalScope.xml:572 +msgid "A key." +msgstr "" + +#: doc/classes/@GlobalScope.xml:575 +msgid "B key." +msgstr "" + +#: doc/classes/@GlobalScope.xml:578 +msgid "C key." +msgstr "" + +#: doc/classes/@GlobalScope.xml:581 +msgid "D key." +msgstr "" + +#: doc/classes/@GlobalScope.xml:584 +msgid "E key." +msgstr "" + +#: doc/classes/@GlobalScope.xml:587 +msgid "F key." +msgstr "" + +#: doc/classes/@GlobalScope.xml:590 +msgid "G key." +msgstr "" + +#: doc/classes/@GlobalScope.xml:593 +msgid "H key." +msgstr "" + +#: doc/classes/@GlobalScope.xml:596 +msgid "I key." +msgstr "" + +#: doc/classes/@GlobalScope.xml:599 +msgid "J key." +msgstr "" + +#: doc/classes/@GlobalScope.xml:602 +msgid "K key." +msgstr "" + +#: doc/classes/@GlobalScope.xml:605 +msgid "L key." +msgstr "" + +#: doc/classes/@GlobalScope.xml:608 +msgid "M key." +msgstr "" + +#: doc/classes/@GlobalScope.xml:611 +msgid "N key." +msgstr "" + +#: doc/classes/@GlobalScope.xml:614 +msgid "O key." +msgstr "" + +#: doc/classes/@GlobalScope.xml:617 +msgid "P key." +msgstr "" + +#: doc/classes/@GlobalScope.xml:620 +msgid "Q key." +msgstr "" + +#: doc/classes/@GlobalScope.xml:623 +msgid "R key." +msgstr "" + +#: doc/classes/@GlobalScope.xml:626 +msgid "S key." +msgstr "" + +#: doc/classes/@GlobalScope.xml:629 +msgid "T key." +msgstr "" + +#: doc/classes/@GlobalScope.xml:632 +msgid "U key." +msgstr "" + +#: doc/classes/@GlobalScope.xml:635 +msgid "V key." +msgstr "" + +#: doc/classes/@GlobalScope.xml:638 +msgid "W key." +msgstr "" + +#: doc/classes/@GlobalScope.xml:641 +msgid "X key." +msgstr "" + +#: doc/classes/@GlobalScope.xml:644 +msgid "Y key." +msgstr "" + +#: doc/classes/@GlobalScope.xml:647 +msgid "Z key." +msgstr "" + +#: doc/classes/@GlobalScope.xml:650 +msgid "[ key." +msgstr "" + +#: doc/classes/@GlobalScope.xml:653 +msgid "\\ key." +msgstr "" + +#: doc/classes/@GlobalScope.xml:656 +msgid "] key." +msgstr "" + +#: doc/classes/@GlobalScope.xml:659 +msgid "^ key." +msgstr "" + +#: doc/classes/@GlobalScope.xml:662 +msgid "_ key." +msgstr "" + +#: doc/classes/@GlobalScope.xml:665 +msgid "` key." +msgstr "" + +#: doc/classes/@GlobalScope.xml:668 +msgid "{ key." +msgstr "" + +#: doc/classes/@GlobalScope.xml:671 +msgid "| key." +msgstr "" + +#: doc/classes/@GlobalScope.xml:674 +msgid "} key." +msgstr "" + +#: doc/classes/@GlobalScope.xml:677 +msgid "~ key." +msgstr "" + +#: doc/classes/@GlobalScope.xml:680 +msgid "Non-breakable space key." +msgstr "" + +#: doc/classes/@GlobalScope.xml:683 +msgid "¡ key." +msgstr "" + +#: doc/classes/@GlobalScope.xml:686 +msgid "¢ key." +msgstr "" + +#: doc/classes/@GlobalScope.xml:689 +msgid "£ key." +msgstr "" + +#: doc/classes/@GlobalScope.xml:692 +msgid "¤ key." +msgstr "" + +#: doc/classes/@GlobalScope.xml:695 +msgid "¥ key." +msgstr "" + +#: doc/classes/@GlobalScope.xml:698 +msgid "¦ key." +msgstr "" + +#: doc/classes/@GlobalScope.xml:701 +msgid "§ key." +msgstr "" + +#: doc/classes/@GlobalScope.xml:704 +msgid "¨ key." +msgstr "" + +#: doc/classes/@GlobalScope.xml:707 +msgid "© key." +msgstr "" + +#: doc/classes/@GlobalScope.xml:710 +msgid "ª key." +msgstr "" + +#: doc/classes/@GlobalScope.xml:713 +msgid "« key." +msgstr "" + +#: doc/classes/@GlobalScope.xml:716 +msgid "¬ key." +msgstr "" + +#: doc/classes/@GlobalScope.xml:719 +msgid "Soft hyphen key." +msgstr "" + +#: doc/classes/@GlobalScope.xml:722 +msgid "® key." +msgstr "" + +#: doc/classes/@GlobalScope.xml:725 +msgid "¯ key." +msgstr "" + +#: doc/classes/@GlobalScope.xml:728 +msgid "° key." +msgstr "" + +#: doc/classes/@GlobalScope.xml:731 +msgid "± key." +msgstr "" + +#: doc/classes/@GlobalScope.xml:734 +msgid "² key." +msgstr "" + +#: doc/classes/@GlobalScope.xml:737 +msgid "³ key." +msgstr "" + +#: doc/classes/@GlobalScope.xml:740 +msgid "´ key." +msgstr "" + +#: doc/classes/@GlobalScope.xml:743 +msgid "µ key." +msgstr "" + +#: doc/classes/@GlobalScope.xml:746 +msgid "¶ key." +msgstr "" + +#: doc/classes/@GlobalScope.xml:749 +msgid "· key." +msgstr "" + +#: doc/classes/@GlobalScope.xml:752 +msgid "¸ key." +msgstr "" + +#: doc/classes/@GlobalScope.xml:755 +msgid "¹ key." +msgstr "" + +#: doc/classes/@GlobalScope.xml:758 +msgid "º key." +msgstr "" + +#: doc/classes/@GlobalScope.xml:761 +msgid "» key." +msgstr "" + +#: doc/classes/@GlobalScope.xml:764 +msgid "¼ key." +msgstr "" + +#: doc/classes/@GlobalScope.xml:767 +msgid "½ key." +msgstr "" + +#: doc/classes/@GlobalScope.xml:770 +msgid "¾ key." +msgstr "" + +#: doc/classes/@GlobalScope.xml:773 +msgid "¿ key." +msgstr "" + +#: doc/classes/@GlobalScope.xml:776 +msgid "À key." +msgstr "" + +#: doc/classes/@GlobalScope.xml:779 +msgid "à key." +msgstr "" + +#: doc/classes/@GlobalScope.xml:782 +msgid "Â key." +msgstr "" + +#: doc/classes/@GlobalScope.xml:785 +msgid "Ã key." +msgstr "" + +#: doc/classes/@GlobalScope.xml:788 +msgid "Ä key." +msgstr "" + +#: doc/classes/@GlobalScope.xml:791 +msgid "Å key." +msgstr "" + +#: doc/classes/@GlobalScope.xml:794 +msgid "Æ key." +msgstr "" + +#: doc/classes/@GlobalScope.xml:797 +msgid "Ç key." +msgstr "" + +#: doc/classes/@GlobalScope.xml:800 +msgid "È key." +msgstr "" + +#: doc/classes/@GlobalScope.xml:803 +msgid "É key." +msgstr "" + +#: doc/classes/@GlobalScope.xml:806 +msgid "Ê key." +msgstr "" + +#: doc/classes/@GlobalScope.xml:809 +msgid "Ë key." +msgstr "" + +#: doc/classes/@GlobalScope.xml:812 +msgid "Ì key." +msgstr "" + +#: doc/classes/@GlobalScope.xml:815 +msgid "à key." +msgstr "" + +#: doc/classes/@GlobalScope.xml:818 +msgid "Î key." +msgstr "" + +#: doc/classes/@GlobalScope.xml:821 +msgid "à key." +msgstr "" + +#: doc/classes/@GlobalScope.xml:824 +msgid "à key." +msgstr "" + +#: doc/classes/@GlobalScope.xml:827 +msgid "Ñ key." +msgstr "" + +#: doc/classes/@GlobalScope.xml:830 +msgid "Ò key." +msgstr "" + +#: doc/classes/@GlobalScope.xml:833 +msgid "Ó key." +msgstr "" + +#: doc/classes/@GlobalScope.xml:836 +msgid "Ô key." +msgstr "" + +#: doc/classes/@GlobalScope.xml:839 +msgid "Õ key." +msgstr "" + +#: doc/classes/@GlobalScope.xml:842 +msgid "Ö key." +msgstr "" + +#: doc/classes/@GlobalScope.xml:845 +msgid "× key." +msgstr "" + +#: doc/classes/@GlobalScope.xml:848 +msgid "Ø key." +msgstr "" + +#: doc/classes/@GlobalScope.xml:851 +msgid "Ù key." +msgstr "" + +#: doc/classes/@GlobalScope.xml:854 +msgid "Ú key." +msgstr "" + +#: doc/classes/@GlobalScope.xml:857 +msgid "Û key." +msgstr "" + +#: doc/classes/@GlobalScope.xml:860 +msgid "Ü key." +msgstr "" + +#: doc/classes/@GlobalScope.xml:863 +msgid "à key." +msgstr "" + +#: doc/classes/@GlobalScope.xml:866 +msgid "Þ key." +msgstr "" + +#: doc/classes/@GlobalScope.xml:869 +msgid "ß key." +msgstr "" + +#: doc/classes/@GlobalScope.xml:872 +msgid "÷ key." +msgstr "" + +#: doc/classes/@GlobalScope.xml:875 +msgid "ÿ key." +msgstr "" + +#: doc/classes/@GlobalScope.xml:878 +msgid "Key Code mask." +msgstr "" + +#: doc/classes/@GlobalScope.xml:881 +msgid "Modifier key mask." +msgstr "" + +#: doc/classes/@GlobalScope.xml:884 +msgid "Shift key mask." +msgstr "" + +#: doc/classes/@GlobalScope.xml:887 +msgid "Alt key mask." +msgstr "" + +#: doc/classes/@GlobalScope.xml:890 +msgid "Meta key mask." +msgstr "" + +#: doc/classes/@GlobalScope.xml:893 +msgid "Ctrl key mask." +msgstr "" + +#: doc/classes/@GlobalScope.xml:896 +msgid "" +"Command key mask. On macOS, this is equivalent to [constant KEY_MASK_META]. " +"On other platforms, this is equivalent to [constant KEY_MASK_CTRL]. This " +"mask should be preferred to [constant KEY_MASK_META] or [constant " +"KEY_MASK_CTRL] for system shortcuts as it handles all platforms correctly." +msgstr "" + +#: doc/classes/@GlobalScope.xml:899 +msgid "Keypad key mask." +msgstr "" + +#: doc/classes/@GlobalScope.xml:902 +msgid "Group Switch key mask." +msgstr "" + +#: doc/classes/@GlobalScope.xml:905 +msgid "Left mouse button." +msgstr "" + +#: doc/classes/@GlobalScope.xml:908 +msgid "Right mouse button." +msgstr "" + +#: doc/classes/@GlobalScope.xml:911 +msgid "Middle mouse button." +msgstr "" + +#: doc/classes/@GlobalScope.xml:914 +msgid "Extra mouse button 1 (only present on some mice)." +msgstr "" + +#: doc/classes/@GlobalScope.xml:917 +msgid "Extra mouse button 2 (only present on some mice)." +msgstr "" + +#: doc/classes/@GlobalScope.xml:920 +msgid "Mouse wheel up." +msgstr "" + +#: doc/classes/@GlobalScope.xml:923 +msgid "Mouse wheel down." +msgstr "" + +#: doc/classes/@GlobalScope.xml:926 +msgid "Mouse wheel left button (only present on some mice)." +msgstr "" + +#: doc/classes/@GlobalScope.xml:929 +msgid "Mouse wheel right button (only present on some mice)." +msgstr "" + +#: doc/classes/@GlobalScope.xml:932 +msgid "Left mouse button mask." +msgstr "" + +#: doc/classes/@GlobalScope.xml:935 +msgid "Right mouse button mask." +msgstr "" + +#: doc/classes/@GlobalScope.xml:938 +msgid "Middle mouse button mask." +msgstr "" + +#: doc/classes/@GlobalScope.xml:941 +msgid "Extra mouse button 1 mask." +msgstr "" + +#: doc/classes/@GlobalScope.xml:944 +msgid "Extra mouse button 2 mask." +msgstr "" + +#: doc/classes/@GlobalScope.xml:947 +msgid "Gamepad button 0." +msgstr "" + +#: doc/classes/@GlobalScope.xml:950 +msgid "Gamepad button 1." +msgstr "" + +#: doc/classes/@GlobalScope.xml:953 +msgid "Gamepad button 2." +msgstr "" + +#: doc/classes/@GlobalScope.xml:956 +msgid "Gamepad button 3." +msgstr "" + +#: doc/classes/@GlobalScope.xml:959 +msgid "Gamepad button 4." +msgstr "" + +#: doc/classes/@GlobalScope.xml:962 +msgid "Gamepad button 5." +msgstr "" + +#: doc/classes/@GlobalScope.xml:965 +msgid "Gamepad button 6." +msgstr "" + +#: doc/classes/@GlobalScope.xml:968 +msgid "Gamepad button 7." +msgstr "" + +#: doc/classes/@GlobalScope.xml:971 +msgid "Gamepad button 8." +msgstr "" + +#: doc/classes/@GlobalScope.xml:974 +msgid "Gamepad button 9." +msgstr "" + +#: doc/classes/@GlobalScope.xml:977 +msgid "Gamepad button 10." +msgstr "" + +#: doc/classes/@GlobalScope.xml:980 +msgid "Gamepad button 11." +msgstr "" + +#: doc/classes/@GlobalScope.xml:983 +msgid "Gamepad button 12." +msgstr "" + +#: doc/classes/@GlobalScope.xml:986 +msgid "Gamepad button 13." +msgstr "" + +#: doc/classes/@GlobalScope.xml:989 +msgid "Gamepad button 14." +msgstr "" + +#: doc/classes/@GlobalScope.xml:992 +msgid "Gamepad button 15." +msgstr "" + +#: doc/classes/@GlobalScope.xml:995 +msgid "Represents the maximum number of joystick buttons supported." +msgstr "" + +#: doc/classes/@GlobalScope.xml:998 +msgid "DualShock circle button." +msgstr "" + +#: doc/classes/@GlobalScope.xml:1001 +msgid "DualShock X button." +msgstr "" + +#: doc/classes/@GlobalScope.xml:1004 +msgid "DualShock square button." +msgstr "" + +#: doc/classes/@GlobalScope.xml:1007 +msgid "DualShock triangle button." +msgstr "" + +#: doc/classes/@GlobalScope.xml:1010 +msgid "Xbox controller B button." +msgstr "" + +#: doc/classes/@GlobalScope.xml:1013 +msgid "Xbox controller A button." +msgstr "" + +#: doc/classes/@GlobalScope.xml:1016 +msgid "Xbox controller X button." +msgstr "" + +#: doc/classes/@GlobalScope.xml:1019 +msgid "Xbox controller Y button." +msgstr "" + +#: doc/classes/@GlobalScope.xml:1022 +msgid "Nintendo controller A button." +msgstr "" + +#: doc/classes/@GlobalScope.xml:1025 +msgid "Nintendo controller B button." +msgstr "" + +#: doc/classes/@GlobalScope.xml:1028 +msgid "Nintendo controller X button." +msgstr "" + +#: doc/classes/@GlobalScope.xml:1031 +msgid "Nintendo controller Y button." +msgstr "" + +#: doc/classes/@GlobalScope.xml:1034 +msgid "Grip (side) buttons on a VR controller." +msgstr "" + +#: doc/classes/@GlobalScope.xml:1037 +msgid "Push down on the touchpad or main joystick on a VR controller." +msgstr "" + +#: doc/classes/@GlobalScope.xml:1040 +msgid "Trigger on a VR controller." +msgstr "" + +#: doc/classes/@GlobalScope.xml:1043 +msgid "" +"A button on the right Oculus Touch controller, X button on the left " +"controller (also when used in OpenVR)." +msgstr "" + +#: doc/classes/@GlobalScope.xml:1046 +msgid "" +"B button on the right Oculus Touch controller, Y button on the left " +"controller (also when used in OpenVR)." +msgstr "" + +#: doc/classes/@GlobalScope.xml:1049 +msgid "Menu button on either Oculus Touch controller." +msgstr "" + +#: doc/classes/@GlobalScope.xml:1052 +msgid "Menu button in OpenVR (Except when Oculus Touch controllers are used)." +msgstr "" + +#: doc/classes/@GlobalScope.xml:1055 +msgid "Gamepad button Select." +msgstr "" + +#: doc/classes/@GlobalScope.xml:1058 +msgid "Gamepad button Start." +msgstr "" + +#: doc/classes/@GlobalScope.xml:1061 +msgid "Gamepad DPad up." +msgstr "" + +#: doc/classes/@GlobalScope.xml:1064 +msgid "Gamepad DPad down." +msgstr "" + +#: doc/classes/@GlobalScope.xml:1067 +msgid "Gamepad DPad left." +msgstr "" + +#: doc/classes/@GlobalScope.xml:1070 +msgid "Gamepad DPad right." +msgstr "" + +#: doc/classes/@GlobalScope.xml:1073 +msgid "Gamepad left Shoulder button." +msgstr "" + +#: doc/classes/@GlobalScope.xml:1076 +msgid "Gamepad left trigger." +msgstr "" + +#: doc/classes/@GlobalScope.xml:1079 +msgid "Gamepad left stick click." +msgstr "" + +#: doc/classes/@GlobalScope.xml:1082 +msgid "Gamepad right Shoulder button." +msgstr "" + +#: doc/classes/@GlobalScope.xml:1085 +msgid "Gamepad right trigger." +msgstr "" + +#: doc/classes/@GlobalScope.xml:1088 +msgid "Gamepad right stick click." +msgstr "" + +#: doc/classes/@GlobalScope.xml:1091 doc/classes/@GlobalScope.xml:1124 +msgid "Gamepad left stick horizontal axis." +msgstr "" + +#: doc/classes/@GlobalScope.xml:1094 doc/classes/@GlobalScope.xml:1127 +msgid "Gamepad left stick vertical axis." +msgstr "" + +#: doc/classes/@GlobalScope.xml:1097 doc/classes/@GlobalScope.xml:1130 +msgid "Gamepad right stick horizontal axis." +msgstr "" + +#: doc/classes/@GlobalScope.xml:1100 doc/classes/@GlobalScope.xml:1133 +msgid "Gamepad right stick vertical axis." +msgstr "" + +#: doc/classes/@GlobalScope.xml:1103 +msgid "Generic gamepad axis 4." +msgstr "" + +#: doc/classes/@GlobalScope.xml:1106 +msgid "Generic gamepad axis 5." +msgstr "" + +#: doc/classes/@GlobalScope.xml:1109 +msgid "Gamepad left trigger analog axis." +msgstr "" + +#: doc/classes/@GlobalScope.xml:1112 +msgid "Gamepad right trigger analog axis." +msgstr "" + +#: doc/classes/@GlobalScope.xml:1115 +msgid "Generic gamepad axis 8." +msgstr "" + +#: doc/classes/@GlobalScope.xml:1118 +msgid "Generic gamepad axis 9." +msgstr "" + +#: doc/classes/@GlobalScope.xml:1121 +msgid "Represents the maximum number of joystick axes supported." +msgstr "" + +#: doc/classes/@GlobalScope.xml:1136 +msgid "Gamepad left analog trigger." +msgstr "" + +#: doc/classes/@GlobalScope.xml:1139 +msgid "Gamepad right analog trigger." +msgstr "" + +#: doc/classes/@GlobalScope.xml:1142 +msgid "VR Controller analog trigger." +msgstr "" + +#: doc/classes/@GlobalScope.xml:1145 +msgid "VR Controller analog grip (side buttons)." +msgstr "" + +#: doc/classes/@GlobalScope.xml:1148 +msgid "" +"OpenVR touchpad X axis (Joystick axis on Oculus Touch and Windows MR " +"controllers)." +msgstr "" + +#: doc/classes/@GlobalScope.xml:1151 +msgid "" +"OpenVR touchpad Y axis (Joystick axis on Oculus Touch and Windows MR " +"controllers)." +msgstr "" + +#: doc/classes/@GlobalScope.xml:1154 +msgid "MIDI note OFF message." +msgstr "" + +#: doc/classes/@GlobalScope.xml:1157 +msgid "MIDI note ON message." +msgstr "" + +#: doc/classes/@GlobalScope.xml:1160 +msgid "MIDI aftertouch message." +msgstr "" + +#: doc/classes/@GlobalScope.xml:1163 +msgid "MIDI control change message." +msgstr "" + +#: doc/classes/@GlobalScope.xml:1166 +msgid "MIDI program change message." +msgstr "" + +#: doc/classes/@GlobalScope.xml:1169 +msgid "MIDI channel pressure message." +msgstr "" + +#: doc/classes/@GlobalScope.xml:1172 +msgid "MIDI pitch bend message." +msgstr "" + +#: doc/classes/@GlobalScope.xml:1175 +msgid "" +"Methods that return [enum Error] return [constant OK] when no error " +"occurred. Note that many functions don't return an error code but will print " +"error messages to standard output.\n" +"Since [constant OK] has value 0, and all other failure codes are positive " +"integers, it can also be used in boolean checks, e.g.:\n" +"[codeblock]\n" +"var err = method_that_returns_error()\n" +"if err != OK:\n" +" print(\"Failure!)\n" +"# Or, equivalent:\n" +"if err:\n" +" print(\"Still failing!)\n" +"[/codeblock]" +msgstr "" + +#: doc/classes/@GlobalScope.xml:1187 +msgid "Generic error." +msgstr "" + +#: doc/classes/@GlobalScope.xml:1190 +msgid "Unavailable error." +msgstr "" + +#: doc/classes/@GlobalScope.xml:1193 +msgid "Unconfigured error." +msgstr "" + +#: doc/classes/@GlobalScope.xml:1196 +msgid "Unauthorized error." +msgstr "" + +#: doc/classes/@GlobalScope.xml:1199 +msgid "Parameter range error." +msgstr "" + +#: doc/classes/@GlobalScope.xml:1202 +msgid "Out of memory (OOM) error." +msgstr "" + +#: doc/classes/@GlobalScope.xml:1205 +msgid "File: Not found error." +msgstr "" + +#: doc/classes/@GlobalScope.xml:1208 +msgid "File: Bad drive error." +msgstr "" + +#: doc/classes/@GlobalScope.xml:1211 +msgid "File: Bad path error." +msgstr "" + +#: doc/classes/@GlobalScope.xml:1214 +msgid "File: No permission error." +msgstr "" + +#: doc/classes/@GlobalScope.xml:1217 +msgid "File: Already in use error." +msgstr "" + +#: doc/classes/@GlobalScope.xml:1220 +msgid "File: Can't open error." +msgstr "" + +#: doc/classes/@GlobalScope.xml:1223 +msgid "File: Can't write error." +msgstr "" + +#: doc/classes/@GlobalScope.xml:1226 +msgid "File: Can't read error." +msgstr "" + +#: doc/classes/@GlobalScope.xml:1229 +msgid "File: Unrecognized error." +msgstr "" + +#: doc/classes/@GlobalScope.xml:1232 +msgid "File: Corrupt error." +msgstr "" + +#: doc/classes/@GlobalScope.xml:1235 +msgid "File: Missing dependencies error." +msgstr "" + +#: doc/classes/@GlobalScope.xml:1238 +msgid "File: End of file (EOF) error." +msgstr "" + +#: doc/classes/@GlobalScope.xml:1241 +msgid "Can't open error." +msgstr "" + +#: doc/classes/@GlobalScope.xml:1244 +msgid "Can't create error." +msgstr "" + +#: doc/classes/@GlobalScope.xml:1247 +msgid "Query failed error." +msgstr "" + +#: doc/classes/@GlobalScope.xml:1250 +msgid "Already in use error." +msgstr "" + +#: doc/classes/@GlobalScope.xml:1253 +msgid "Locked error." +msgstr "" + +#: doc/classes/@GlobalScope.xml:1256 +msgid "Timeout error." +msgstr "" + +#: doc/classes/@GlobalScope.xml:1259 +msgid "Can't connect error." +msgstr "" + +#: doc/classes/@GlobalScope.xml:1262 +msgid "Can't resolve error." +msgstr "" + +#: doc/classes/@GlobalScope.xml:1265 +msgid "Connection error." +msgstr "" + +#: doc/classes/@GlobalScope.xml:1268 +msgid "Can't acquire resource error." +msgstr "" + +#: doc/classes/@GlobalScope.xml:1271 +msgid "Can't fork process error." +msgstr "" + +#: doc/classes/@GlobalScope.xml:1274 +msgid "Invalid data error." +msgstr "" + +#: doc/classes/@GlobalScope.xml:1277 +msgid "Invalid parameter error." +msgstr "" + +#: doc/classes/@GlobalScope.xml:1280 +msgid "Already exists error." +msgstr "" + +#: doc/classes/@GlobalScope.xml:1283 +msgid "Does not exist error." +msgstr "" + +#: doc/classes/@GlobalScope.xml:1286 +msgid "Database: Read error." +msgstr "" + +#: doc/classes/@GlobalScope.xml:1289 +msgid "Database: Write error." +msgstr "" + +#: doc/classes/@GlobalScope.xml:1292 +msgid "Compilation failed error." +msgstr "" + +#: doc/classes/@GlobalScope.xml:1295 +msgid "Method not found error." +msgstr "" + +#: doc/classes/@GlobalScope.xml:1298 +msgid "Linking failed error." +msgstr "" + +#: doc/classes/@GlobalScope.xml:1301 +msgid "Script failed error." +msgstr "" + +#: doc/classes/@GlobalScope.xml:1304 +msgid "Cycling link (import cycle) error." +msgstr "" + +#: doc/classes/@GlobalScope.xml:1307 +msgid "Invalid declaration error." +msgstr "" + +#: doc/classes/@GlobalScope.xml:1310 +msgid "Duplicate symbol error." +msgstr "" + +#: doc/classes/@GlobalScope.xml:1313 +msgid "Parse error." +msgstr "" + +#: doc/classes/@GlobalScope.xml:1316 +msgid "Busy error." +msgstr "" + +#: doc/classes/@GlobalScope.xml:1319 +msgid "Skip error." +msgstr "" + +#: doc/classes/@GlobalScope.xml:1322 +msgid "Help error." +msgstr "" + +#: doc/classes/@GlobalScope.xml:1325 +msgid "Bug error." +msgstr "" + +#: doc/classes/@GlobalScope.xml:1328 +msgid "" +"Printer on fire error. (This is an easter egg, no engine methods return this " +"error code.)" +msgstr "" + +#: doc/classes/@GlobalScope.xml:1331 +msgid "No hint for the edited property." +msgstr "" + +#: doc/classes/@GlobalScope.xml:1334 +msgid "" +"Hints that an integer or float property should be within a range specified " +"via the hint string [code]\"min,max\"[/code] or [code]\"min,max,step\"[/" +"code]. The hint string can optionally include [code]\"or_greater\"[/code] " +"and/or [code]\"or_lesser\"[/code] to allow manual input going respectively " +"above the max or below the min values. Example: [code]\"-360,360,1," +"or_greater,or_lesser\"[/code]." +msgstr "" + +#: doc/classes/@GlobalScope.xml:1337 +msgid "" +"Hints that an integer or float property should be within an exponential " +"range specified via the hint string [code]\"min,max\"[/code] or [code]\"min," +"max,step\"[/code]. The hint string can optionally include [code]\"or_greater" +"\"[/code] and/or [code]\"or_lesser\"[/code] to allow manual input going " +"respectively above the max or below the min values. Example: " +"[code]\"0.01,100,0.01,or_greater\"[/code]." +msgstr "" + +#: doc/classes/@GlobalScope.xml:1340 +msgid "" +"Hints that an integer, float or string property is an enumerated value to " +"pick in a list specified via a hint string such as [code]\"Hello,Something," +"Else\"[/code]." +msgstr "" + +#: doc/classes/@GlobalScope.xml:1343 +msgid "" +"Hints that a float property should be edited via an exponential easing " +"function. The hint string can include [code]\"attenuation\"[/code] to flip " +"the curve horizontally and/or [code]\"inout\"[/code] to also include in/out " +"easing." +msgstr "" + +#: doc/classes/@GlobalScope.xml:1346 doc/classes/@GlobalScope.xml:1349 +msgid "Deprecated hint, unused." +msgstr "" + +#: doc/classes/@GlobalScope.xml:1352 +msgid "" +"Hints that an integer property is a bitmask with named bit flags. For " +"example, to allow toggling bits 0, 1, 2 and 4, the hint could be something " +"like [code]\"Bit0,Bit1,Bit2,,Bit4\"[/code]." +msgstr "" + +#: doc/classes/@GlobalScope.xml:1355 +msgid "" +"Hints that an integer property is a bitmask using the optionally named 2D " +"render layers." +msgstr "" + +#: doc/classes/@GlobalScope.xml:1358 +msgid "" +"Hints that an integer property is a bitmask using the optionally named 2D " +"physics layers." +msgstr "" + +#: doc/classes/@GlobalScope.xml:1361 +msgid "" +"Hints that an integer property is a bitmask using the optionally named 3D " +"render layers." +msgstr "" + +#: doc/classes/@GlobalScope.xml:1364 +msgid "" +"Hints that an integer property is a bitmask using the optionally named 3D " +"physics layers." +msgstr "" + +#: doc/classes/@GlobalScope.xml:1367 +msgid "" +"Hints that a string property is a path to a file. Editing it will show a " +"file dialog for picking the path. The hint string can be a set of filters " +"with wildcards like [code]\"*.png,*.jpg\"[/code]." +msgstr "" + +#: doc/classes/@GlobalScope.xml:1370 +msgid "" +"Hints that a string property is a path to a directory. Editing it will show " +"a file dialog for picking the path." +msgstr "" + +#: doc/classes/@GlobalScope.xml:1373 +msgid "" +"Hints that a string property is an absolute path to a file outside the " +"project folder. Editing it will show a file dialog for picking the path. The " +"hint string can be a set of filters with wildcards like [code]\"*.png,*.jpg" +"\"[/code]." +msgstr "" + +#: doc/classes/@GlobalScope.xml:1376 +msgid "" +"Hints that a string property is an absolute path to a directory outside the " +"project folder. Editing it will show a file dialog for picking the path." +msgstr "" + +#: doc/classes/@GlobalScope.xml:1379 +msgid "" +"Hints that a property is an instance of a [Resource]-derived type, " +"optionally specified via the hint string (e.g. [code]\"Texture2D\"[/code]). " +"Editing it will show a popup menu of valid resource types to instantiate." +msgstr "" + +#: doc/classes/@GlobalScope.xml:1382 +msgid "" +"Hints that a string property is text with line breaks. Editing it will show " +"a text input field where line breaks can be typed." +msgstr "" + +#: doc/classes/@GlobalScope.xml:1385 +msgid "" +"Hints that a string property should have a placeholder text visible on its " +"input field, whenever the property is empty. The hint string is the " +"placeholder text to use." +msgstr "" + +#: doc/classes/@GlobalScope.xml:1388 +msgid "" +"Hints that a color property should be edited without changing its alpha " +"component, i.e. only R, G and B channels are edited." +msgstr "" + +#: doc/classes/@GlobalScope.xml:1391 +msgid "Hints that an image is compressed using lossy compression." +msgstr "" + +#: doc/classes/@GlobalScope.xml:1394 +msgid "Hints that an image is compressed using lossless compression." +msgstr "" + +#: doc/classes/@GlobalScope.xml:1397 +msgid "The property is serialized and saved in the scene file (default)." +msgstr "" + +#: doc/classes/@GlobalScope.xml:1400 +msgid "The property is shown in the editor inspector (default)." +msgstr "" + +#: doc/classes/@GlobalScope.xml:1403 doc/classes/@GlobalScope.xml:1406 +msgid "Deprecated usage flag, unused." +msgstr "" + +#: doc/classes/@GlobalScope.xml:1409 +msgid "The property can be checked in the editor inspector." +msgstr "" + +#: doc/classes/@GlobalScope.xml:1412 +msgid "The property is checked in the editor inspector." +msgstr "" + +#: doc/classes/@GlobalScope.xml:1415 +msgid "The property is a translatable string." +msgstr "" + +#: doc/classes/@GlobalScope.xml:1418 +msgid "Used to group properties together in the editor." +msgstr "" + +#: doc/classes/@GlobalScope.xml:1421 +msgid "Used to categorize properties together in the editor." +msgstr "" + +#: doc/classes/@GlobalScope.xml:1424 +msgid "" +"Used to group properties together in the editor in a subgroup (under a " +"group)." +msgstr "" + +#: doc/classes/@GlobalScope.xml:1427 +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:1436 +msgid "Default usage (storage, editor and network)." +msgstr "" + +#: doc/classes/@GlobalScope.xml:1439 +msgid "" +"Default usage for translatable strings (storage, editor, network and " +"internationalized)." +msgstr "" + +#: doc/classes/@GlobalScope.xml:1442 +msgid "" +"Default usage but without showing the property in the editor (storage, " +"network)." +msgstr "" + +#: doc/classes/@GlobalScope.xml:1445 +msgid "Flag for a normal method." +msgstr "" + +#: doc/classes/@GlobalScope.xml:1448 +msgid "Flag for an editor method." +msgstr "" + +#: 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:1454 +msgid "Flag for a constant method." +msgstr "" + +#: doc/classes/@GlobalScope.xml:1460 +msgid "Flag for a virtual method." +msgstr "" + +#: doc/classes/@GlobalScope.xml:1466 +msgid "Default method flags." +msgstr "" + +#: doc/classes/@GlobalScope.xml:1469 +msgid "Variable is [code]null[/code]." +msgstr "" + +#: doc/classes/@GlobalScope.xml:1472 +msgid "Variable is of type [bool]." +msgstr "" + +#: doc/classes/@GlobalScope.xml:1475 +msgid "Variable is of type [int]." +msgstr "" + +#: doc/classes/@GlobalScope.xml:1478 +msgid "Variable is of type [float] (real)." +msgstr "" + +#: doc/classes/@GlobalScope.xml:1481 +msgid "Variable is of type [String]." +msgstr "" + +#: doc/classes/@GlobalScope.xml:1484 +msgid "Variable is of type [Vector2]." +msgstr "" + +#: doc/classes/@GlobalScope.xml:1487 +msgid "Variable is of type [Vector2i]." +msgstr "" + +#: doc/classes/@GlobalScope.xml:1490 +msgid "Variable is of type [Rect2]." +msgstr "" + +#: doc/classes/@GlobalScope.xml:1493 +msgid "Variable is of type [Rect2i]." +msgstr "" + +#: doc/classes/@GlobalScope.xml:1496 +msgid "Variable is of type [Vector3]." +msgstr "" + +#: doc/classes/@GlobalScope.xml:1499 +msgid "Variable is of type [Vector3i]." +msgstr "" + +#: doc/classes/@GlobalScope.xml:1502 +msgid "Variable is of type [Transform2D]." +msgstr "" + +#: doc/classes/@GlobalScope.xml:1505 +msgid "Variable is of type [Plane]." +msgstr "" + +#: doc/classes/@GlobalScope.xml:1508 +msgid "Variable is of type [Quat]." +msgstr "" + +#: doc/classes/@GlobalScope.xml:1511 +msgid "Variable is of type [AABB]." +msgstr "" + +#: doc/classes/@GlobalScope.xml:1514 +msgid "Variable is of type [Basis]." +msgstr "" + +#: doc/classes/@GlobalScope.xml:1517 +msgid "Variable is of type [Transform]." +msgstr "" + +#: doc/classes/@GlobalScope.xml:1520 +msgid "Variable is of type [Color]." +msgstr "" + +#: doc/classes/@GlobalScope.xml:1523 +msgid "Variable is of type [StringName]." +msgstr "" + +#: doc/classes/@GlobalScope.xml:1526 +msgid "Variable is of type [NodePath]." +msgstr "" + +#: doc/classes/@GlobalScope.xml:1529 +msgid "Variable is of type [RID]." +msgstr "" + +#: doc/classes/@GlobalScope.xml:1532 +msgid "Variable is of type [Object]." +msgstr "" + +#: doc/classes/@GlobalScope.xml:1535 +msgid "Variable is of type [Callable]." +msgstr "" + +#: doc/classes/@GlobalScope.xml:1538 +msgid "Variable is of type [Signal]." +msgstr "" + +#: doc/classes/@GlobalScope.xml:1541 +msgid "Variable is of type [Dictionary]." +msgstr "" + +#: doc/classes/@GlobalScope.xml:1544 +msgid "Variable is of type [Array]." +msgstr "" + +#: doc/classes/@GlobalScope.xml:1547 +msgid "Variable is of type [PackedByteArray]." +msgstr "" + +#: doc/classes/@GlobalScope.xml:1550 +msgid "Variable is of type [PackedInt32Array]." +msgstr "" + +#: doc/classes/@GlobalScope.xml:1553 +msgid "Variable is of type [PackedInt64Array]." +msgstr "" + +#: doc/classes/@GlobalScope.xml:1556 +msgid "Variable is of type [PackedFloat32Array]." +msgstr "" + +#: doc/classes/@GlobalScope.xml:1559 +msgid "Variable is of type [PackedFloat64Array]." +msgstr "" + +#: doc/classes/@GlobalScope.xml:1562 +msgid "Variable is of type [PackedStringArray]." +msgstr "" + +#: doc/classes/@GlobalScope.xml:1565 +msgid "Variable is of type [PackedVector2Array]." +msgstr "" + +#: doc/classes/@GlobalScope.xml:1568 +msgid "Variable is of type [PackedVector3Array]." +msgstr "" + +#: doc/classes/@GlobalScope.xml:1571 +msgid "Variable is of type [PackedColorArray]." +msgstr "" + +#: doc/classes/@GlobalScope.xml:1574 +msgid "Represents the size of the [enum Variant.Type] enum." +msgstr "" + +#: doc/classes/@GlobalScope.xml:1577 +msgid "Equality operator ([code]==[/code])." +msgstr "" + +#: doc/classes/@GlobalScope.xml:1580 +msgid "Inequality operator ([code]!=[/code])." +msgstr "" + +#: doc/classes/@GlobalScope.xml:1583 +msgid "Less than operator ([code]<[/code])." +msgstr "" + +#: doc/classes/@GlobalScope.xml:1586 +msgid "Less than or equal operator ([code]<=[/code])." +msgstr "" + +#: doc/classes/@GlobalScope.xml:1589 +msgid "Greater than operator ([code]>[/code])." +msgstr "" + +#: doc/classes/@GlobalScope.xml:1592 +msgid "Greater than or equal operator ([code]>=[/code])." +msgstr "" + +#: doc/classes/@GlobalScope.xml:1595 +msgid "Addition operator ([code]+[/code])." +msgstr "" + +#: doc/classes/@GlobalScope.xml:1598 +msgid "Subtraction operator ([code]-[/code])." +msgstr "" + +#: doc/classes/@GlobalScope.xml:1601 +msgid "Multiplication operator ([code]*[/code])." +msgstr "" + +#: doc/classes/@GlobalScope.xml:1604 +msgid "Division operator ([code]/[/code])." +msgstr "" + +#: doc/classes/@GlobalScope.xml:1607 +msgid "Unary negation operator ([code]-[/code])." +msgstr "" + +#: doc/classes/@GlobalScope.xml:1610 +msgid "Unary plus operator ([code]+[/code])." +msgstr "" + +#: doc/classes/@GlobalScope.xml:1613 +msgid "Remainder/modulo operator ([code]%[/code])." +msgstr "" + +#: doc/classes/@GlobalScope.xml:1616 +msgid "String concatenation operator ([code]+[/code])." +msgstr "" + +#: doc/classes/@GlobalScope.xml:1619 +msgid "Left shift operator ([code]<<[/code])." +msgstr "" + +#: doc/classes/@GlobalScope.xml:1622 +msgid "Right shift operator ([code]>>[/code])." +msgstr "" + +#: doc/classes/@GlobalScope.xml:1625 +msgid "Bitwise AND operator ([code]&[/code])." +msgstr "" + +#: doc/classes/@GlobalScope.xml:1628 +msgid "Bitwise OR operator ([code]|[/code])." +msgstr "" + +#: doc/classes/@GlobalScope.xml:1631 +msgid "Bitwise XOR operator ([code]^[/code])." +msgstr "" + +#: doc/classes/@GlobalScope.xml:1634 +msgid "Bitwise NOT operator ([code]~[/code])." +msgstr "" + +#: doc/classes/@GlobalScope.xml:1637 +msgid "Logical AND operator ([code]and[/code] or [code]&&[/code])." +msgstr "" + +#: doc/classes/@GlobalScope.xml:1640 +msgid "Logical OR operator ([code]or[/code] or [code]||[/code])." +msgstr "" + +#: doc/classes/@GlobalScope.xml:1643 +msgid "Logical XOR operator (not implemented in GDScript)." +msgstr "" + +#: doc/classes/@GlobalScope.xml:1646 +msgid "Logical NOT operator ([code]not[/code] or [code]![/code])." +msgstr "" + +#: doc/classes/@GlobalScope.xml:1649 +msgid "Logical IN operator ([code]in[/code])." +msgstr "" + +#: doc/classes/@GlobalScope.xml:1652 +msgid "Represents the size of the [enum Variant.Operator] enum." +msgstr "" + +#: modules/visual_script/doc_classes/@VisualScript.xml:4 +msgid "Built-in visual script functions." +msgstr "" + +#: modules/visual_script/doc_classes/@VisualScript.xml:7 +msgid "" +"A list of built-in visual script functions, see [VisualScriptBuiltinFunc] " +"and [VisualScript]." +msgstr "" + +#: doc/classes/AABB.xml:4 +msgid "Axis-Aligned Bounding Box." +msgstr "" + +#: doc/classes/AABB.xml:7 +msgid "" +"AABB consists of a position, a size, and several utility functions. It is " +"typically used for fast overlap tests." +msgstr "" + +#: doc/classes/AABB.xml:10 doc/classes/Plane.xml:10 doc/classes/Rect2.xml:11 +#: doc/classes/Rect2i.xml:11 doc/classes/Transform.xml:10 +#: doc/classes/Vector2.xml:11 doc/classes/Vector2i.xml:11 +#: doc/classes/Vector3.xml:11 doc/classes/Vector3i.xml:11 +msgid "https://docs.godotengine.org/en/latest/tutorials/math/index.html" +msgstr "" + +#: doc/classes/AABB.xml:21 +msgid "Optional constructor, accepts position and size." +msgstr "" + +#: doc/classes/AABB.xml:30 +msgid "" +"Returns [code]true[/code] if this [AABB] completely encloses another one." +msgstr "" + +#: doc/classes/AABB.xml:39 +msgid "Returns this [AABB] expanded to include a given point." +msgstr "" + +#: doc/classes/AABB.xml:46 +msgid "Returns the volume of the [AABB]." +msgstr "" + +#: doc/classes/AABB.xml:55 +msgid "Gets the position of the 8 endpoints of the [AABB] in space." +msgstr "" + +#: doc/classes/AABB.xml:62 +msgid "Returns the normalized longest axis of the [AABB]." +msgstr "" + +#: doc/classes/AABB.xml:69 +msgid "" +"Returns the index of the longest axis of the [AABB] (according to " +"[Vector3]'s [code]AXIS_*[/code] constants)." +msgstr "" + +#: doc/classes/AABB.xml:76 +msgid "Returns the scalar length of the longest axis of the [AABB]." +msgstr "" + +#: doc/classes/AABB.xml:83 +msgid "Returns the normalized shortest axis of the [AABB]." +msgstr "" + +#: doc/classes/AABB.xml:90 +msgid "" +"Returns the index of the shortest axis of the [AABB] (according to " +"[Vector3]::AXIS* enum)." +msgstr "" + +#: doc/classes/AABB.xml:97 +msgid "Returns the scalar length of the shortest axis of the [AABB]." +msgstr "" + +#: doc/classes/AABB.xml:106 +msgid "" +"Returns the support point in a given direction. This is useful for collision " +"detection algorithms." +msgstr "" + +#: doc/classes/AABB.xml:115 +msgid "" +"Returns a copy of the [AABB] grown a given amount of units towards all the " +"sides." +msgstr "" + +#: doc/classes/AABB.xml:122 +msgid "Returns [code]true[/code] if the [AABB] is flat or empty." +msgstr "" + +#: doc/classes/AABB.xml:129 +msgid "Returns [code]true[/code] if the [AABB] is empty." +msgstr "" + +#: doc/classes/AABB.xml:138 +msgid "Returns [code]true[/code] if the [AABB] contains a point." +msgstr "" + +#: doc/classes/AABB.xml:147 +msgid "" +"Returns the intersection between two [AABB]. An empty AABB (size 0,0,0) is " +"returned on failure." +msgstr "" + +#: doc/classes/AABB.xml:156 +msgid "Returns [code]true[/code] if the [AABB] overlaps with another." +msgstr "" + +#: doc/classes/AABB.xml:165 +msgid "Returns [code]true[/code] if the [AABB] is on both sides of a plane." +msgstr "" + +#: doc/classes/AABB.xml:176 +msgid "" +"Returns [code]true[/code] if the [AABB] intersects the line segment between " +"[code]from[/code] and [code]to[/code]." +msgstr "" + +#: doc/classes/AABB.xml:185 +msgid "" +"Returns [code]true[/code] if this [AABB] and [code]aabb[/code] are " +"approximately equal, by calling [method @GDScript.is_equal_approx] on each " +"component." +msgstr "" + +#: doc/classes/AABB.xml:194 +msgid "" +"Returns a larger [AABB] that contains both this [AABB] and [code]with[/code]." +msgstr "" + +#: doc/classes/AABB.xml:200 +msgid "" +"Ending corner. This is calculated as [code]position + size[/code]. Changing " +"this property changes [member size] accordingly." +msgstr "" + +#: doc/classes/AABB.xml:203 +msgid "Beginning corner." +msgstr "" + +#: doc/classes/AABB.xml:206 doc/classes/Rect2.xml:180 +msgid "Size from position to end." +msgstr "" + +#: doc/classes/AcceptDialog.xml:4 +msgid "Base dialog for user notification." +msgstr "" + +#: doc/classes/AcceptDialog.xml:7 +msgid "" +"This dialog is useful for small notifications to the user about an event. It " +"can only be accepted or closed, with the same result." +msgstr "" + +#: doc/classes/AcceptDialog.xml:22 +msgid "" +"Adds a button with label [code]text[/code] and a custom [code]action[/code] " +"to the dialog and returns the created button. [code]action[/code] will be " +"passed to the [signal custom_action] signal when pressed.\n" +"If [code]true[/code], [code]right[/code] will place the button to the right " +"of any sibling buttons." +msgstr "" + +#: doc/classes/AcceptDialog.xml:32 +msgid "" +"Adds a button with label [code]name[/code] and a cancel action to the dialog " +"and returns the created button." +msgstr "" + +#: doc/classes/AcceptDialog.xml:39 +msgid "Returns the label used for built-in text." +msgstr "" + +#: doc/classes/AcceptDialog.xml:46 +msgid "Returns the OK [Button] instance." +msgstr "" + +#: doc/classes/AcceptDialog.xml:55 +msgid "" +"Registers a [LineEdit] in the dialog. When the enter key is pressed, the " +"dialog will be accepted." +msgstr "" + +#: doc/classes/AcceptDialog.xml:61 +msgid "Sets autowrapping for the text in the dialog." +msgstr "" + +#: doc/classes/AcceptDialog.xml:64 +msgid "" +"If [code]true[/code], the dialog is hidden when the OK button is pressed. " +"You can set it to [code]false[/code] if you want to do e.g. input validation " +"when receiving the [signal confirmed] signal, and handle hiding the dialog " +"in your own logic.\n" +"[b]Note:[/b] Some nodes derived from this class can have a different default " +"value, and potentially their own built-in logic overriding this setting. For " +"example [FileDialog] defaults to [code]false[/code], and has its own input " +"validation code that is called when you press OK, which eventually hides the " +"dialog if the input is valid. As such, this property can't be used in " +"[FileDialog] to disable hiding the dialog when pressing OK." +msgstr "" + +#: doc/classes/AcceptDialog.xml:68 +msgid "The text displayed by the dialog." +msgstr "" + +#: doc/classes/AcceptDialog.xml:82 +msgid "Emitted when the dialog is accepted, i.e. the OK button is pressed." +msgstr "" + +#: doc/classes/AcceptDialog.xml:89 +msgid "Emitted when a custom button is pressed. See [method add_button]." +msgstr "" + +#: doc/classes/AnimatedSprite2D.xml:4 +msgid "Sprite node that can use multiple textures for animation." +msgstr "" + +#: doc/classes/AnimatedSprite2D.xml:7 doc/classes/AnimatedSprite3D.xml:7 +msgid "" +"Animations are created using a [SpriteFrames] resource, which can be " +"configured in the editor via the SpriteFrames panel." +msgstr "" + +#: doc/classes/AnimatedSprite2D.xml:16 doc/classes/AnimatedSprite3D.xml:16 +msgid "Returns [code]true[/code] if an animation is currently being played." +msgstr "" + +#: doc/classes/AnimatedSprite2D.xml:27 +msgid "" +"Plays the animation named [code]anim[/code]. If no [code]anim[/code] is " +"provided, the current animation is played. If [code]backwards[/code] is " +"[code]true[/code], the animation will be played in reverse." +msgstr "" + +#: doc/classes/AnimatedSprite2D.xml:34 doc/classes/AnimatedSprite3D.xml:32 +msgid "Stops the current animation (does not reset the frame counter)." +msgstr "" + +#: doc/classes/AnimatedSprite2D.xml:40 doc/classes/AnimatedSprite3D.xml:38 +msgid "" +"The current animation from the [code]frames[/code] resource. If this value " +"changes, the [code]frame[/code] counter is reset." +msgstr "" + +#: doc/classes/AnimatedSprite2D.xml:43 doc/classes/SpriteBase3D.xml:55 +msgid "If [code]true[/code], texture will be centered." +msgstr "" + +#: doc/classes/AnimatedSprite2D.xml:46 doc/classes/Sprite2D.xml:41 +#: doc/classes/SpriteBase3D.xml:61 doc/classes/TextureRect.xml:18 +msgid "If [code]true[/code], texture is flipped horizontally." +msgstr "" + +#: doc/classes/AnimatedSprite2D.xml:49 doc/classes/Sprite2D.xml:44 +#: doc/classes/SpriteBase3D.xml:64 doc/classes/TextureRect.xml:21 +msgid "If [code]true[/code], texture is flipped vertically." +msgstr "" + +#: doc/classes/AnimatedSprite2D.xml:52 doc/classes/AnimatedSprite3D.xml:41 +msgid "The displayed animation frame's index." +msgstr "" + +#: doc/classes/AnimatedSprite2D.xml:55 doc/classes/AnimatedSprite3D.xml:44 +msgid "The [SpriteFrames] resource containing the animation(s)." +msgstr "" + +#: doc/classes/AnimatedSprite2D.xml:58 doc/classes/Sprite2D.xml:59 +#: doc/classes/SpriteBase3D.xml:70 +msgid "The texture's drawing offset." +msgstr "" + +#: doc/classes/AnimatedSprite2D.xml:61 doc/classes/AnimatedSprite3D.xml:47 +msgid "If [code]true[/code], the [member animation] is currently playing." +msgstr "" + +#: doc/classes/AnimatedSprite2D.xml:64 +msgid "Strength of the specular light effect of this [AnimatedSprite2D]." +msgstr "" + +#: doc/classes/AnimatedSprite2D.xml:67 doc/classes/Sprite2D.xml:74 +msgid "The color of the specular light effect." +msgstr "" + +#: doc/classes/AnimatedSprite2D.xml:70 +msgid "The animation speed is multiplied by this value." +msgstr "" + +#: doc/classes/AnimatedSprite2D.xml:76 +msgid "" +"Emitted when the animation is finished (when it plays the last frame). If " +"the animation is looping, this signal is emitted every time the last frame " +"is drawn." +msgstr "" + +#: doc/classes/AnimatedSprite2D.xml:81 doc/classes/AnimatedSprite3D.xml:53 +msgid "Emitted when [member frame] changed." +msgstr "" + +#: doc/classes/AnimatedSprite3D.xml:4 +msgid "" +"2D sprite node in 3D world, that can use multiple 2D textures for animation." +msgstr "" + +#: doc/classes/AnimatedSprite3D.xml:25 +msgid "" +"Plays the animation named [code]anim[/code]. If no [code]anim[/code] is " +"provided, the current animation is played." +msgstr "" + +#: doc/classes/AnimatedTexture.xml:4 +msgid "Proxy texture for simple frame-based animations." +msgstr "" + +#: doc/classes/AnimatedTexture.xml:7 +msgid "" +"[AnimatedTexture] is a resource format for frame-based animations, where " +"multiple textures can be chained automatically with a predefined delay for " +"each frame. Unlike [AnimationPlayer] or [AnimatedSprite2D], it isn't a " +"[Node], but has the advantage of being usable anywhere a [Texture2D] " +"resource can be used, e.g. in a [TileSet].\n" +"The playback of the animation is controlled by the [member fps] property as " +"well as each frame's optional delay (see [method set_frame_delay]). The " +"animation loops, i.e. it will restart at frame 0 automatically after playing " +"the last frame.\n" +"[AnimatedTexture] currently requires all frame textures to have the same " +"size, otherwise the bigger ones will be cropped to match the smallest one. " +"Also, it doesn't support [AtlasTexture]. Each frame needs to be separate " +"image." +msgstr "" + +#: doc/classes/AnimatedTexture.xml:20 +msgid "Returns the given frame's delay value." +msgstr "" + +#: doc/classes/AnimatedTexture.xml:29 +msgid "Returns the given frame's [Texture2D]." +msgstr "" + +#: doc/classes/AnimatedTexture.xml:40 +msgid "" +"Sets an additional delay (in seconds) between this frame and the next one, " +"that will be added to the time interval defined by [member fps]. By default, " +"frames have no delay defined. If a delay value is defined, the final time " +"interval between this frame and the next will be [code]1.0 / fps + delay[/" +"code].\n" +"For example, for an animation with 3 frames, 2 FPS and a frame delay on the " +"second frame of 1.2, the resulting playback will be:\n" +"[codeblock]\n" +"Frame 0: 0.5 s (1 / fps)\n" +"Frame 1: 1.7 s (1 / fps + 1.2)\n" +"Frame 2: 0.5 s (1 / fps)\n" +"Total duration: 2.7 s\n" +"[/codeblock]" +msgstr "" + +#: doc/classes/AnimatedTexture.xml:58 +msgid "" +"Assigns a [Texture2D] to the given frame. Frame IDs start at 0, so the first " +"frame has ID 0, and the last frame of the animation has ID [member frames] - " +"1.\n" +"You can define any number of textures up to [constant MAX_FRAMES], but keep " +"in mind that only frames from 0 to [member frames] - 1 will be part of the " +"animation." +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 " +"of the animation loop based on the [member frames] property. A value of 0 " +"means no predefined number of frames per second, the animation will play " +"according to each frame's frame delay (see [method set_frame_delay]).\n" +"For example, an animation with 8 frames, no frame delay and a [code]fps[/" +"code] value of 2 will run for 4 seconds, with each frame lasting 0.5 seconds." +msgstr "" + +#: 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 " +"for the animation to take new frames into account. The maximum number of " +"frames is [constant MAX_FRAMES]." +msgstr "" + +#: 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]." +msgstr "" + +#: doc/classes/Animation.xml:4 +msgid "Contains data used to animate everything in the engine." +msgstr "" + +#: doc/classes/Animation.xml:7 +msgid "" +"An Animation resource contains data used to animate everything in the " +"engine. Animations are divided into tracks, and each track must be linked to " +"a node. The state of that node can be changed through time, by adding timed " +"keys (events) to the track.\n" +"[codeblock]\n" +"# This creates an animation that makes the node \"Enemy\" move to the right " +"by\n" +"# 100 pixels in 1 second.\n" +"var animation = Animation.new()\n" +"var track_index = animation.add_track(Animation.TYPE_VALUE)\n" +"animation.track_set_path(track_index, \"Enemy:position.x\")\n" +"animation.track_insert_key(track_index, 0.0, 0)\n" +"animation.track_insert_key(track_index, 0.5, 100)\n" +"[/codeblock]\n" +"Animations are just data containers, and must be added to nodes such as an " +"[AnimationPlayer] to be played back. Animation tracks have different types, " +"each with its own set of dedicated methods. Check [enum TrackType] to see " +"available types." +msgstr "" + +#: doc/classes/Animation.xml:20 doc/classes/AnimationPlayer.xml:13 +msgid "https://docs.godotengine.org/en/latest/tutorials/animation/index.html" +msgstr "" + +#: doc/classes/Animation.xml:31 +msgid "Adds a track to the Animation." +msgstr "" + +#: doc/classes/Animation.xml:42 +msgid "" +"Returns the animation name at the key identified by [code]key_idx[/code]. " +"The [code]track_idx[/code] must be the index of an Animation Track." +msgstr "" + +#: doc/classes/Animation.xml:55 +msgid "" +"Inserts a key with value [code]animation[/code] at the given [code]time[/" +"code] (in seconds). The [code]track_idx[/code] must be the index of an " +"Animation Track." +msgstr "" + +#: doc/classes/Animation.xml:68 +msgid "" +"Sets the key identified by [code]key_idx[/code] to value [code]animation[/" +"code]. The [code]track_idx[/code] must be the index of an Animation Track." +msgstr "" + +#: doc/classes/Animation.xml:79 +msgid "" +"Returns the end offset of the key identified by [code]key_idx[/code]. The " +"[code]track_idx[/code] must be the index of an Audio Track.\n" +"End offset is the number of seconds cut off at the ending of the audio " +"stream." +msgstr "" + +#: doc/classes/Animation.xml:91 +msgid "" +"Returns the start offset of the key identified by [code]key_idx[/code]. The " +"[code]track_idx[/code] must be the index of an Audio Track.\n" +"Start offset is the number of seconds cut off at the beginning of the audio " +"stream." +msgstr "" + +#: doc/classes/Animation.xml:103 +msgid "" +"Returns the audio stream of the key identified by [code]key_idx[/code]. The " +"[code]track_idx[/code] must be the index of an Audio Track." +msgstr "" + +#: doc/classes/Animation.xml:120 +msgid "" +"Inserts an Audio Track key at the given [code]time[/code] in seconds. The " +"[code]track_idx[/code] must be the index of an Audio Track.\n" +"[code]stream[/code] is the [AudioStream] resource to play. " +"[code]start_offset[/code] is the number of seconds cut off at the beginning " +"of the audio stream, while [code]end_offset[/code] is at the ending." +msgstr "" + +#: doc/classes/Animation.xml:134 +msgid "" +"Sets the end offset of the key identified by [code]key_idx[/code] to value " +"[code]offset[/code]. The [code]track_idx[/code] must be the index of an " +"Audio Track." +msgstr "" + +#: doc/classes/Animation.xml:147 +msgid "" +"Sets the start offset of the key identified by [code]key_idx[/code] to value " +"[code]offset[/code]. The [code]track_idx[/code] must be the index of an " +"Audio Track." +msgstr "" + +#: doc/classes/Animation.xml:160 +msgid "" +"Sets the stream of the key identified by [code]key_idx[/code] to value " +"[code]offset[/code]. The [code]track_idx[/code] must be the index of an " +"Audio Track." +msgstr "" + +#: doc/classes/Animation.xml:171 +msgid "" +"Returns the in handle of the key identified by [code]key_idx[/code]. The " +"[code]track_idx[/code] must be the index of a Bezier Track." +msgstr "" + +#: doc/classes/Animation.xml:182 +msgid "" +"Returns the out handle of the key identified by [code]key_idx[/code]. The " +"[code]track_idx[/code] must be the index of a Bezier Track." +msgstr "" + +#: doc/classes/Animation.xml:193 +msgid "" +"Returns the value of the key identified by [code]key_idx[/code]. The " +"[code]track_idx[/code] must be the index of a Bezier Track." +msgstr "" + +#: doc/classes/Animation.xml:210 +msgid "" +"Inserts a Bezier Track key at the given [code]time[/code] in seconds. The " +"[code]track_idx[/code] must be the index of a Bezier Track.\n" +"[code]in_handle[/code] is the left-side weight of the added Bezier curve " +"point, [code]out_handle[/code] is the right-side one, while [code]value[/" +"code] is the actual value at this point." +msgstr "" + +#: doc/classes/Animation.xml:222 +msgid "" +"Returns the interpolated value at the given [code]time[/code] (in seconds). " +"The [code]track_idx[/code] must be the index of a Bezier Track." +msgstr "" + +#: doc/classes/Animation.xml:235 +msgid "" +"Sets the in handle of the key identified by [code]key_idx[/code] to value " +"[code]in_handle[/code]. The [code]track_idx[/code] must be the index of a " +"Bezier Track." +msgstr "" + +#: doc/classes/Animation.xml:248 +msgid "" +"Sets the out handle of the key identified by [code]key_idx[/code] to value " +"[code]out_handle[/code]. The [code]track_idx[/code] must be the index of a " +"Bezier Track." +msgstr "" + +#: doc/classes/Animation.xml:261 +msgid "" +"Sets the value of the key identified by [code]key_idx[/code] to the given " +"value. The [code]track_idx[/code] must be the index of a Bezier Track." +msgstr "" + +#: doc/classes/Animation.xml:268 +msgid "Clear the animation (clear all tracks and reset all)." +msgstr "" + +#: doc/classes/Animation.xml:279 +msgid "" +"Adds a new track that is a copy of the given track from [code]to_animation[/" +"code]." +msgstr "" + +#: doc/classes/Animation.xml:288 +msgid "" +"Returns the index of the specified track. If the track is not found, return " +"-1." +msgstr "" + +#: doc/classes/Animation.xml:295 +msgid "Returns the amount of tracks in the animation." +msgstr "" + +#: doc/classes/Animation.xml:308 +msgid "" +"Returns all the key indices of a method track, given a position and delta " +"time." +msgstr "" + +#: doc/classes/Animation.xml:319 +msgid "Returns the method name of a method track." +msgstr "" + +#: doc/classes/Animation.xml:330 +msgid "" +"Returns the arguments values to be called on a method track for a given key " +"in a given track." +msgstr "" + +#: doc/classes/Animation.xml:339 +msgid "Removes a track by specifying the track index." +msgstr "" + +#: doc/classes/Animation.xml:352 +msgid "" +"Finds the key index by time in a given track. Optionally, only find it if " +"the exact time is given." +msgstr "" + +#: doc/classes/Animation.xml:361 +msgid "" +"Returns [code]true[/code] if the track at [code]idx[/code] wraps the " +"interpolation loop. New tracks wrap the interpolation loop by default." +msgstr "" + +#: doc/classes/Animation.xml:370 +msgid "Returns the interpolation type of a given track." +msgstr "" + +#: doc/classes/Animation.xml:379 +msgid "Returns the amount of keys in a given track." +msgstr "" + +#: doc/classes/Animation.xml:390 +msgid "Returns the time at which the key is located." +msgstr "" + +#: doc/classes/Animation.xml:401 +msgid "" +"Returns the transition curve (easing) for a specific key (see the built-in " +"math function [method @GDScript.ease])." +msgstr "" + +#: doc/classes/Animation.xml:412 +msgid "Returns the value of a given key in a given track." +msgstr "" + +#: doc/classes/Animation.xml:421 +msgid "" +"Gets the path of a track. For more information on the path format, see " +"[method track_set_path]." +msgstr "" + +#: doc/classes/Animation.xml:430 +msgid "Gets the type of a track." +msgstr "" + +#: doc/classes/Animation.xml:445 +msgid "Insert a generic key in a given track." +msgstr "" + +#: doc/classes/Animation.xml:454 +msgid "" +"Returns [code]true[/code] if the track at index [code]idx[/code] is enabled." +msgstr "" + +#: doc/classes/Animation.xml:463 +msgid "" +"Returns [code]true[/code] if the given track is imported. Else, return " +"[code]false[/code]." +msgstr "" + +#: doc/classes/Animation.xml:472 +msgid "Moves a track down." +msgstr "" + +#: doc/classes/Animation.xml:483 +msgid "" +"Changes the index position of track [code]idx[/code] to the one defined in " +"[code]to_idx[/code]." +msgstr "" + +#: doc/classes/Animation.xml:492 +msgid "Moves a track up." +msgstr "" + +#: doc/classes/Animation.xml:503 +msgid "Removes a key by index in a given track." +msgstr "" + +#: doc/classes/Animation.xml:514 +msgid "Removes a key by position (seconds) in a given track." +msgstr "" + +#: doc/classes/Animation.xml:525 +msgid "Enables/disables the given track. Tracks are enabled by default." +msgstr "" + +#: doc/classes/Animation.xml:536 +msgid "Sets the given track as imported or not." +msgstr "" + +#: doc/classes/Animation.xml:547 +msgid "" +"If [code]true[/code], the track at [code]idx[/code] wraps the interpolation " +"loop." +msgstr "" + +#: doc/classes/Animation.xml:558 +msgid "Sets the interpolation type of a given track." +msgstr "" + +#: doc/classes/Animation.xml:571 +msgid "Sets the time of an existing key." +msgstr "" + +#: doc/classes/Animation.xml:584 +msgid "" +"Sets the transition curve (easing) for a specific key (see the built-in math " +"function [method @GDScript.ease])." +msgstr "" + +#: doc/classes/Animation.xml:597 +msgid "Sets the value of an existing key." +msgstr "" + +#: doc/classes/Animation.xml:608 +msgid "" +"Sets the path of a track. Paths must be valid scene-tree paths to a node, " +"and must be specified starting from the parent node of the node that will " +"reproduce the animation. Tracks that control properties or bones must append " +"their name after the path, separated by [code]\":\"[/code].\n" +"For example, [code]\"character/skeleton:ankle\"[/code] or [code]\"character/" +"mesh:transform/local\"[/code]." +msgstr "" + +#: doc/classes/Animation.xml:620 +msgid "" +"Swaps the track [code]idx[/code]'s index position with the track " +"[code]with_idx[/code]." +msgstr "" + +#: doc/classes/Animation.xml:637 +msgid "Insert a transform key for a transform track." +msgstr "" + +#: doc/classes/Animation.xml:648 +msgid "" +"Returns the interpolated value of a transform track at a given time (in " +"seconds). An array consisting of 3 elements: position ([Vector3]), rotation " +"([Quat]) and scale ([Vector3])." +msgstr "" + +#: doc/classes/Animation.xml:661 +msgid "" +"Returns all the key indices of a value track, given a position and delta " +"time." +msgstr "" + +#: doc/classes/Animation.xml:670 +msgid "Returns the update mode of a value track." +msgstr "" + +#: doc/classes/Animation.xml:681 +msgid "Sets the update mode (see [enum UpdateMode]) of a value track." +msgstr "" + +#: doc/classes/Animation.xml:687 +msgid "" +"The total length of the animation (in seconds).\n" +"[b]Note:[/b] Length is not delimited by the last key, as this one may be " +"before or after the end to ensure correct interpolation and looping." +msgstr "" + +#: doc/classes/Animation.xml:691 +msgid "" +"A flag indicating that the animation must loop. This is uses for correct " +"interpolation of animation cycles, and for hinting the player that it must " +"restart the animation." +msgstr "" + +#: doc/classes/Animation.xml:694 +msgid "The animation step value." +msgstr "" + +#: doc/classes/Animation.xml:700 +msgid "" +"Emitted when there's a change in the list of tracks, e.g. tracks are added, " +"moved or have changed paths." +msgstr "" + +#: doc/classes/Animation.xml:706 +msgid "" +"Value tracks set values in node properties, but only those which can be " +"Interpolated." +msgstr "" + +#: doc/classes/Animation.xml:709 +msgid "" +"Transform tracks are used to change node local transforms or skeleton pose " +"bones. Transitions are interpolated." +msgstr "" + +#: doc/classes/Animation.xml:712 +msgid "Method tracks call functions with given arguments per key." +msgstr "" + +#: doc/classes/Animation.xml:715 +msgid "" +"Bezier tracks are used to interpolate a value using custom curves. They can " +"also be used to animate sub-properties of vectors and colors (e.g. alpha " +"value of a [Color])." +msgstr "" + +#: doc/classes/Animation.xml:718 +msgid "" +"Audio tracks are used to play an audio stream with either type of " +"[AudioStreamPlayer]. The stream can be trimmed and previewed in the " +"animation." +msgstr "" + +#: doc/classes/Animation.xml:721 +msgid "Animation tracks play animations in other [AnimationPlayer] nodes." +msgstr "" + +#: doc/classes/Animation.xml:724 +msgid "No interpolation (nearest value)." +msgstr "" + +#: doc/classes/Animation.xml:727 +msgid "Linear interpolation." +msgstr "" + +#: doc/classes/Animation.xml:730 +msgid "Cubic interpolation." +msgstr "" + +#: doc/classes/Animation.xml:733 +msgid "Update between keyframes." +msgstr "" + +#: doc/classes/Animation.xml:736 +msgid "Update at the keyframes and hold the value." +msgstr "" + +#: doc/classes/Animation.xml:739 +msgid "Update at the keyframes." +msgstr "" + +#: doc/classes/Animation.xml:742 +msgid "" +"Same as linear interpolation, but also interpolates from the current value " +"(i.e. dynamically at runtime) if the first key isn't at 0 seconds." +msgstr "" + +#: doc/classes/AnimationNode.xml:4 +msgid "Base resource for [AnimationTree] nodes." +msgstr "" + +#: doc/classes/AnimationNode.xml:7 +msgid "" +"Base resource for [AnimationTree] nodes. In general, it's not used directly, " +"but you can create custom ones with custom blending formulas.\n" +"Inherit this when creating nodes mainly for use in [AnimationNodeBlendTree], " +"otherwise [AnimationRootNode] should be used instead." +msgstr "" + +#: doc/classes/AnimationNode.xml:11 doc/classes/AnimationNodeAdd2.xml:10 +#: doc/classes/AnimationNodeAdd3.xml:14 +#: doc/classes/AnimationNodeAnimation.xml:10 +#: doc/classes/AnimationNodeBlend2.xml:10 +#: doc/classes/AnimationNodeBlend3.xml:14 +#: doc/classes/AnimationNodeBlendSpace1D.xml:13 +#: doc/classes/AnimationNodeBlendSpace2D.xml:12 +#: doc/classes/AnimationNodeBlendTree.xml:10 +#: doc/classes/AnimationNodeOneShot.xml:10 +#: doc/classes/AnimationNodeOutput.xml:9 +#: doc/classes/AnimationNodeStateMachine.xml:15 +#: doc/classes/AnimationNodeStateMachinePlayback.xml:15 +#: doc/classes/AnimationNodeStateMachineTransition.xml:8 +#: doc/classes/AnimationNodeTimeScale.xml:10 +#: doc/classes/AnimationNodeTimeSeek.xml:10 +#: doc/classes/AnimationNodeTransition.xml:10 doc/classes/AnimationTree.xml:9 +msgid "" +"https://docs.godotengine.org/en/latest/tutorials/animation/animation_tree." +"html" +msgstr "" + +#: doc/classes/AnimationNode.xml:20 +msgid "" +"Adds an input to the node. This is only useful for nodes created for use in " +"an [AnimationNodeBlendTree]." +msgstr "" + +#: doc/classes/AnimationNode.xml:37 +msgid "" +"Blend an animation by [code]blend[/code] amount (name must be valid in the " +"linked [AnimationPlayer]). A [code]time[/code] and [code]delta[/code] may be " +"passed, as well as whether [code]seek[/code] happened." +msgstr "" + +#: doc/classes/AnimationNode.xml:56 +msgid "" +"Blend an input. This is only useful for nodes created for an " +"[AnimationNodeBlendTree]. The [code]time[/code] parameter is a relative " +"delta, unless [code]seek[/code] is [code]true[/code], in which case it is " +"absolute. A filter mode may be optionally passed (see [enum FilterAction] " +"for options)." +msgstr "" + +#: doc/classes/AnimationNode.xml:77 +msgid "" +"Blend another animation node (in case this node contains children animation " +"nodes). This function is only useful if you inherit from [AnimationRootNode] " +"instead, else editors will not display your node for addition." +msgstr "" + +#: doc/classes/AnimationNode.xml:84 +msgid "Gets the text caption for this node (used by some editors)." +msgstr "" + +#: doc/classes/AnimationNode.xml:93 +msgid "" +"Gets a child node by index (used by editors inheriting from " +"[AnimationRootNode])." +msgstr "" + +#: doc/classes/AnimationNode.xml:100 +msgid "" +"Gets all children nodes in order as a [code]name: node[/code] dictionary. " +"Only useful when inheriting [AnimationRootNode]." +msgstr "" + +#: doc/classes/AnimationNode.xml:107 +msgid "" +"Amount of inputs in this node, only useful for nodes that go into " +"[AnimationNodeBlendTree]." +msgstr "" + +#: doc/classes/AnimationNode.xml:116 +msgid "Gets the name of an input by index." +msgstr "" + +#: doc/classes/AnimationNode.xml:125 +msgid "" +"Gets the value of a parameter. Parameters are custom local memory used for " +"your nodes, given a resource can be reused in multiple trees." +msgstr "" + +#: doc/classes/AnimationNode.xml:134 +msgid "" +"Gets the default value of a parameter. Parameters are custom local memory " +"used for your nodes, given a resource can be reused in multiple trees." +msgstr "" + +#: doc/classes/AnimationNode.xml:141 +msgid "" +"Gets the property information for parameter. Parameters are custom local " +"memory used for your nodes, given a resource can be reused in multiple " +"trees. Format is similar to [method Object.get_property_list]." +msgstr "" + +#: doc/classes/AnimationNode.xml:148 +msgid "" +"Returns [code]true[/code] whether you want the blend tree editor to display " +"filter editing on this node." +msgstr "" + +#: doc/classes/AnimationNode.xml:157 +msgid "Returns [code]true[/code] whether a given path is filtered." +msgstr "" + +#: doc/classes/AnimationNode.xml:168 +msgid "" +"User-defined callback called when a custom node is processed. The " +"[code]time[/code] parameter is a relative delta, unless [code]seek[/code] is " +"[code]true[/code], in which case it is absolute.\n" +"Here, call the [method blend_input], [method blend_node] or [method " +"blend_animation] functions. You can also use [method get_parameter] and " +"[method set_parameter] to modify local memory.\n" +"This function should return the time left for the current animation to " +"finish (if unsure, pass the value from the main blend being called)." +msgstr "" + +#: doc/classes/AnimationNode.xml:179 +msgid "Removes an input, call this only when inactive." +msgstr "" + +#: doc/classes/AnimationNode.xml:190 +msgid "Adds or removes a path for the filter." +msgstr "" + +#: doc/classes/AnimationNode.xml:201 +msgid "" +"Sets a custom parameter. These are used as local storage, because resources " +"can be reused across the tree or scenes." +msgstr "" + +#: doc/classes/AnimationNode.xml:207 +msgid "If [code]true[/code], filtering is enabled." +msgstr "" + +#: doc/classes/AnimationNode.xml:213 +msgid "Called when the node was removed from the graph." +msgstr "" + +#: doc/classes/AnimationNode.xml:218 +msgid "" +"Emitted by nodes that inherit from this class and that have an internal tree " +"when one of their nodes changes. The nodes that emit this signal are " +"[AnimationNodeBlendSpace1D], [AnimationNodeBlendSpace2D], " +"[AnimationNodeStateMachine], and [AnimationNodeBlendTree]." +msgstr "" + +#: doc/classes/AnimationNode.xml:224 +msgid "Do not use filtering." +msgstr "" + +#: doc/classes/AnimationNode.xml:227 +msgid "Paths matching the filter will be allowed to pass." +msgstr "" + +#: doc/classes/AnimationNode.xml:230 +msgid "Paths matching the filter will be discarded." +msgstr "" + +#: doc/classes/AnimationNode.xml:233 +msgid "Paths matching the filter will be blended (by the blend value)." +msgstr "" + +#: doc/classes/AnimationNodeAdd2.xml:4 +msgid "Blends two animations additively inside of an [AnimationNodeBlendTree]." +msgstr "" + +#: doc/classes/AnimationNodeAdd2.xml:7 +msgid "" +"A resource to add to an [AnimationNodeBlendTree]. Blends two animations " +"additively based on an amount value in the [code][0.0, 1.0][/code] range." +msgstr "" + +#: doc/classes/AnimationNodeAdd2.xml:16 doc/classes/AnimationNodeAdd3.xml:20 +#: doc/classes/AnimationNodeBlend2.xml:16 +#: doc/classes/AnimationNodeBlend3.xml:20 +msgid "" +"If [code]true[/code], sets the [code]optimization[/code] to [code]false[/" +"code] when calling [method AnimationNode.blend_input], forcing the blended " +"animations to update every frame." +msgstr "" + +#: doc/classes/AnimationNodeAdd3.xml:4 +msgid "" +"Blends two of three animations additively inside of an " +"[AnimationNodeBlendTree]." +msgstr "" + +#: doc/classes/AnimationNodeAdd3.xml:7 +msgid "" +"A resource to add to an [AnimationNodeBlendTree]. Blends two animations " +"together additively out of three based on a value in the [code][-1.0, 1.0][/" +"code] range.\n" +"This node has three inputs:\n" +"- The base animation to add to\n" +"- A -add animation to blend with when the blend amount is in the [code]" +"[-1.0, 0.0][/code] range.\n" +"- A +add animation to blend with when the blend amount is in the [code][0.0, " +"1.0][/code] range" +msgstr "" + +#: doc/classes/AnimationNodeAnimation.xml:4 +msgid "Input animation to use in an [AnimationNodeBlendTree]." +msgstr "" + +#: doc/classes/AnimationNodeAnimation.xml:7 +msgid "" +"A resource to add to an [AnimationNodeBlendTree]. Only features one output " +"set using the [member animation] property. Use it as an input for " +"[AnimationNode] that blend animations together." +msgstr "" + +#: doc/classes/AnimationNodeAnimation.xml:16 +msgid "" +"Animation to use as an output. It is one of the animations provided by " +"[member AnimationTree.anim_player]." +msgstr "" + +#: doc/classes/AnimationNodeBlend2.xml:4 +msgid "Blends two animations linearly inside of an [AnimationNodeBlendTree]." +msgstr "" + +#: doc/classes/AnimationNodeBlend2.xml:7 +msgid "" +"A resource to add to an [AnimationNodeBlendTree]. Blends two animations " +"linearly based on an amount value in the [code][0.0, 1.0][/code] range." +msgstr "" + +#: doc/classes/AnimationNodeBlend3.xml:4 +msgid "" +"Blends two of three animations linearly inside of an " +"[AnimationNodeBlendTree]." +msgstr "" + +#: doc/classes/AnimationNodeBlend3.xml:7 +msgid "" +"A resource to add to an [AnimationNodeBlendTree]. Blends two animations " +"together linearly out of three based on a value in the [code][-1.0, 1.0][/" +"code] range.\n" +"This node has three inputs:\n" +"- The base animation\n" +"- A -blend animation to blend with when the blend amount is in the [code]" +"[-1.0, 0.0][/code] range.\n" +"- A +blend animation to blend with when the blend amount is in the [code]" +"[0.0, 1.0][/code] range" +msgstr "" + +#: doc/classes/AnimationNodeBlendSpace1D.xml:4 +msgid "" +"Blends linearly between two of any number of [AnimationNode] of any type " +"placed on a virtual axis." +msgstr "" + +#: doc/classes/AnimationNodeBlendSpace1D.xml:7 +msgid "" +"A resource to add to an [AnimationNodeBlendTree].\n" +"This is a virtual axis on which you can add any type of [AnimationNode] " +"using [method add_blend_point].\n" +"Outputs the linear blend of the two [AnimationNode]s closest to the node's " +"current value.\n" +"You can set the extents of the axis using the [member min_space] and [member " +"max_space]." +msgstr "" + +#: doc/classes/AnimationNodeBlendSpace1D.xml:26 +msgid "" +"Adds a new point that represents a [code]node[/code] on the virtual axis at " +"a given position set by [code]pos[/code]. You can insert it at a specific " +"index using the [code]at_index[/code] argument. If you use the default value " +"for [code]at_index[/code], the point is inserted at the end of the blend " +"points array." +msgstr "" + +#: doc/classes/AnimationNodeBlendSpace1D.xml:33 +msgid "Returns the number of points on the blend axis." +msgstr "" + +#: doc/classes/AnimationNodeBlendSpace1D.xml:42 +msgid "" +"Returns the [AnimationNode] referenced by the point at index [code]point[/" +"code]." +msgstr "" + +#: doc/classes/AnimationNodeBlendSpace1D.xml:51 +#: doc/classes/AnimationNodeBlendSpace2D.xml:65 +msgid "Returns the position of the point at index [code]point[/code]." +msgstr "" + +#: doc/classes/AnimationNodeBlendSpace1D.xml:60 +msgid "Removes the point at index [code]point[/code] from the blend axis." +msgstr "" + +#: doc/classes/AnimationNodeBlendSpace1D.xml:71 +#: doc/classes/AnimationNodeBlendSpace2D.xml:112 +msgid "" +"Changes the [AnimationNode] referenced by the point at index [code]point[/" +"code]." +msgstr "" + +#: doc/classes/AnimationNodeBlendSpace1D.xml:82 +#: doc/classes/AnimationNodeBlendSpace2D.xml:123 +msgid "" +"Updates the position of the point at index [code]point[/code] on the blend " +"axis." +msgstr "" + +#: doc/classes/AnimationNodeBlendSpace1D.xml:88 +msgid "" +"The blend space's axis's upper limit for the points' position. See [method " +"add_blend_point]." +msgstr "" + +#: doc/classes/AnimationNodeBlendSpace1D.xml:91 +msgid "" +"The blend space's axis's lower limit for the points' position. See [method " +"add_blend_point]." +msgstr "" + +#: doc/classes/AnimationNodeBlendSpace1D.xml:94 +msgid "Position increment to snap to when moving a point on the axis." +msgstr "" + +#: doc/classes/AnimationNodeBlendSpace1D.xml:97 +msgid "Label of the virtual axis of the blend space." +msgstr "" + +#: doc/classes/AnimationNodeBlendSpace2D.xml:4 +msgid "" +"Blends linearly between three [AnimationNode] of any type placed in a 2D " +"space." +msgstr "" + +#: doc/classes/AnimationNodeBlendSpace2D.xml:7 +msgid "" +"A resource to add to an [AnimationNodeBlendTree].\n" +"This node allows you to blend linearly between three animations using a " +"[Vector2] weight.\n" +"You can add vertices to the blend space with [method add_blend_point] and " +"automatically triangulate it by setting [member auto_triangles] to " +"[code]true[/code]. Otherwise, use [method add_triangle] and [method " +"remove_triangle] to create up the blend space by hand." +msgstr "" + +#: doc/classes/AnimationNodeBlendSpace2D.xml:25 +msgid "" +"Adds a new point that represents a [code]node[/code] at the position set by " +"[code]pos[/code]. You can insert it at a specific index using the " +"[code]at_index[/code] argument. If you use the default value for " +"[code]at_index[/code], the point is inserted at the end of the blend points " +"array." +msgstr "" + +#: doc/classes/AnimationNodeBlendSpace2D.xml:40 +msgid "" +"Creates a new triangle using three points [code]x[/code], [code]y[/code], " +"and [code]z[/code]. Triangles can overlap. You can insert the triangle at a " +"specific index using the [code]at_index[/code] argument. If you use the " +"default value for [code]at_index[/code], the point is inserted at the end of " +"the blend points array." +msgstr "" + +#: doc/classes/AnimationNodeBlendSpace2D.xml:47 +msgid "Returns the number of points in the blend space." +msgstr "" + +#: doc/classes/AnimationNodeBlendSpace2D.xml:56 +msgid "" +"Returns the [AnimationRootNode] referenced by the point at index " +"[code]point[/code]." +msgstr "" + +#: doc/classes/AnimationNodeBlendSpace2D.xml:72 +msgid "Returns the number of triangles in the blend space." +msgstr "" + +#: doc/classes/AnimationNodeBlendSpace2D.xml:83 +msgid "" +"Returns the position of the point at index [code]point[/code] in the " +"triangle of index [code]triangle[/code]." +msgstr "" + +#: doc/classes/AnimationNodeBlendSpace2D.xml:92 +msgid "Removes the point at index [code]point[/code] from the blend space." +msgstr "" + +#: doc/classes/AnimationNodeBlendSpace2D.xml:101 +msgid "" +"Removes the triangle at index [code]triangle[/code] from the blend space." +msgstr "" + +#: doc/classes/AnimationNodeBlendSpace2D.xml:129 +msgid "" +"If [code]true[/code], the blend space is triangulated automatically. The " +"mesh updates every time you add or remove points with [method " +"add_blend_point] and [method remove_blend_point]." +msgstr "" + +#: doc/classes/AnimationNodeBlendSpace2D.xml:132 +msgid "" +"Controls the interpolation between animations. See [enum BlendMode] " +"constants." +msgstr "" + +#: doc/classes/AnimationNodeBlendSpace2D.xml:135 +msgid "" +"The blend space's X and Y axes' upper limit for the points' position. See " +"[method add_blend_point]." +msgstr "" + +#: doc/classes/AnimationNodeBlendSpace2D.xml:138 +msgid "" +"The blend space's X and Y axes' lower limit for the points' position. See " +"[method add_blend_point]." +msgstr "" + +#: doc/classes/AnimationNodeBlendSpace2D.xml:141 +msgid "Position increment to snap to when moving a point." +msgstr "" + +#: doc/classes/AnimationNodeBlendSpace2D.xml:144 +msgid "Name of the blend space's X axis." +msgstr "" + +#: doc/classes/AnimationNodeBlendSpace2D.xml:147 +msgid "Name of the blend space's Y axis." +msgstr "" + +#: doc/classes/AnimationNodeBlendSpace2D.xml:153 +msgid "" +"Emitted every time the blend space's triangles are created, removed, or when " +"one of their vertices changes position." +msgstr "" + +#: doc/classes/AnimationNodeBlendSpace2D.xml:159 +msgid "The interpolation between animations is linear." +msgstr "" + +#: doc/classes/AnimationNodeBlendSpace2D.xml:162 +msgid "" +"The blend space plays the animation of the node the blending position is " +"closest to. Useful for frame-by-frame 2D animations." +msgstr "" + +#: doc/classes/AnimationNodeBlendSpace2D.xml:165 +msgid "" +"Similar to [constant BLEND_MODE_DISCRETE], but starts the new animation at " +"the last animation's playback position." +msgstr "" + +#: doc/classes/AnimationNodeBlendTree.xml:4 +msgid "[AnimationTree] node resource that contains many blend type nodes." +msgstr "" + +#: doc/classes/AnimationNodeBlendTree.xml:7 +msgid "" +"This node may contain a sub-tree of any other blend type nodes, such as mix, " +"blend2, blend3, one shot, etc. This is one of the most commonly used roots." +msgstr "" + +#: doc/classes/AnimationNodeBlendTree.xml:23 +msgid "" +"Adds an [AnimationNode] at the given [code]position[/code]. The [code]name[/" +"code] is used to identify the created sub-node later." +msgstr "" + +#: doc/classes/AnimationNodeBlendTree.xml:36 +msgid "" +"Connects the output of an [AnimationNode] as input for another " +"[AnimationNode], at the input port specified by [code]input_index[/code]." +msgstr "" + +#: doc/classes/AnimationNodeBlendTree.xml:47 +msgid "Disconnects the node connected to the specified input." +msgstr "" + +#: doc/classes/AnimationNodeBlendTree.xml:56 +msgid "Returns the sub-node with the specified [code]name[/code]." +msgstr "" + +#: doc/classes/AnimationNodeBlendTree.xml:65 +msgid "" +"Returns the position of the sub-node with the specified [code]name[/code]." +msgstr "" + +#: doc/classes/AnimationNodeBlendTree.xml:74 +msgid "" +"Returns [code]true[/code] if a sub-node with specified [code]name[/code] " +"exists." +msgstr "" + +#: doc/classes/AnimationNodeBlendTree.xml:83 +msgid "Removes a sub-node." +msgstr "" + +#: doc/classes/AnimationNodeBlendTree.xml:94 +msgid "Changes the name of a sub-node." +msgstr "" + +#: doc/classes/AnimationNodeBlendTree.xml:105 +msgid "Modifies the position of a sub-node." +msgstr "" + +#: doc/classes/AnimationNodeBlendTree.xml:111 +msgid "The global offset of all sub-nodes." +msgstr "" + +#: doc/classes/AnimationNodeBlendTree.xml:116 +msgid "The connection was successful." +msgstr "" + +#: doc/classes/AnimationNodeBlendTree.xml:119 +msgid "The input node is [code]null[/code]." +msgstr "" + +#: doc/classes/AnimationNodeBlendTree.xml:122 +msgid "The specified input port is out of range." +msgstr "" + +#: doc/classes/AnimationNodeBlendTree.xml:125 +msgid "The output node is [code]null[/code]." +msgstr "" + +#: doc/classes/AnimationNodeBlendTree.xml:128 +msgid "Input and output nodes are the same." +msgstr "" + +#: doc/classes/AnimationNodeBlendTree.xml:131 +msgid "The specified connection already exists." +msgstr "" + +#: doc/classes/AnimationNodeOneShot.xml:4 +msgid "Plays an animation once in [AnimationNodeBlendTree]." +msgstr "" + +#: doc/classes/AnimationNodeOneShot.xml:7 +msgid "" +"A resource to add to an [AnimationNodeBlendTree]. This node will execute a " +"sub-animation and return once it finishes. Blend times for fading in and out " +"can be customized, as well as filters." +msgstr "" + +#: doc/classes/AnimationNodeOneShot.xml:30 +msgid "" +"If [code]true[/code], the sub-animation will restart automatically after " +"finishing." +msgstr "" + +#: doc/classes/AnimationNodeOneShot.xml:33 +msgid "The delay after which the automatic restart is triggered, in seconds." +msgstr "" + +#: doc/classes/AnimationNodeOneShot.xml:36 +msgid "" +"If [member autorestart] is [code]true[/code], a random additional delay (in " +"seconds) between 0 and this value will be added to [member " +"autorestart_delay]." +msgstr "" + +#: doc/classes/AnimationNodeOutput.xml:4 +msgid "Generic output node to be added to [AnimationNodeBlendTree]." +msgstr "" + +#: doc/classes/AnimationNodeStateMachine.xml:4 +msgid "State machine for control of animations." +msgstr "" + +#: doc/classes/AnimationNodeStateMachine.xml:7 +msgid "" +"Contains multiple nodes representing animation states, connected in a graph. " +"Node transitions can be configured to happen automatically or via code, " +"using a shortest-path algorithm. Retrieve the " +"[AnimationNodeStateMachinePlayback] object from the [AnimationTree] node to " +"control it programmatically.\n" +"[b]Example:[/b]\n" +"[codeblock]\n" +"var state_machine = $AnimationTree.get(\"parameters/playback\")\n" +"state_machine.travel(\"some_state\")\n" +"[/codeblock]" +msgstr "" + +#: doc/classes/AnimationNodeStateMachine.xml:28 +msgid "" +"Adds a new node to the graph. The [code]position[/code] is used for display " +"in the editor." +msgstr "" + +#: doc/classes/AnimationNodeStateMachine.xml:41 +msgid "Adds a transition between the given nodes." +msgstr "" + +#: doc/classes/AnimationNodeStateMachine.xml:48 +#: doc/classes/AnimationNodeStateMachine.xml:89 +msgid "Returns the graph's end node." +msgstr "" + +#: doc/classes/AnimationNodeStateMachine.xml:55 +msgid "Returns the draw offset of the graph. Used for display in the editor." +msgstr "" + +#: doc/classes/AnimationNodeStateMachine.xml:64 +msgid "Returns the animation node with the given name." +msgstr "" + +#: doc/classes/AnimationNodeStateMachine.xml:73 +msgid "Returns the given animation node's name." +msgstr "" + +#: doc/classes/AnimationNodeStateMachine.xml:82 +msgid "Returns the given node's coordinates. Used for display in the editor." +msgstr "" + +#: doc/classes/AnimationNodeStateMachine.xml:98 +msgid "Returns the given transition." +msgstr "" + +#: doc/classes/AnimationNodeStateMachine.xml:105 +msgid "Returns the number of connections in the graph." +msgstr "" + +#: doc/classes/AnimationNodeStateMachine.xml:114 +msgid "Returns the given transition's start node." +msgstr "" + +#: doc/classes/AnimationNodeStateMachine.xml:123 +msgid "Returns the given transition's end node." +msgstr "" + +#: doc/classes/AnimationNodeStateMachine.xml:132 +msgid "Returns [code]true[/code] if the graph contains the given node." +msgstr "" + +#: doc/classes/AnimationNodeStateMachine.xml:143 +msgid "" +"Returns [code]true[/code] if there is a transition between the given nodes." +msgstr "" + +#: doc/classes/AnimationNodeStateMachine.xml:152 +msgid "Deletes the given node from the graph." +msgstr "" + +#: doc/classes/AnimationNodeStateMachine.xml:163 +msgid "Deletes the transition between the two specified nodes." +msgstr "" + +#: doc/classes/AnimationNodeStateMachine.xml:172 +msgid "Deletes the given transition by index." +msgstr "" + +#: doc/classes/AnimationNodeStateMachine.xml:183 +msgid "Renames the given node." +msgstr "" + +#: doc/classes/AnimationNodeStateMachine.xml:202 +msgid "Sets the given node as the graph end point." +msgstr "" + +#: doc/classes/AnimationNodeStateMachine.xml:211 +msgid "Sets the draw offset of the graph. Used for display in the editor." +msgstr "" + +#: doc/classes/AnimationNodeStateMachine.xml:222 +msgid "Sets the node's coordinates. Used for display in the editor." +msgstr "" + +#: doc/classes/AnimationNodeStateMachine.xml:231 +msgid "Sets the given node as the graph start point." +msgstr "" + +#: doc/classes/AnimationNodeStateMachinePlayback.xml:4 +msgid "Playback control for [AnimationNodeStateMachine]." +msgstr "" + +#: doc/classes/AnimationNodeStateMachinePlayback.xml:7 +msgid "" +"Allows control of [AnimationTree] state machines created with " +"[AnimationNodeStateMachine]. Retrieve with [code]$AnimationTree." +"get(\"parameters/playback\")[/code].\n" +"[b]Example:[/b]\n" +"[codeblock]\n" +"var state_machine = $AnimationTree.get(\"parameters/playback\")\n" +"state_machine.travel(\"some_state\")\n" +"[/codeblock]" +msgstr "" + +#: doc/classes/AnimationNodeStateMachinePlayback.xml:22 +msgid "Returns the currently playing animation state." +msgstr "" + +#: doc/classes/AnimationNodeStateMachinePlayback.xml:29 +msgid "" +"Returns the current travel path as computed internally by the A* algorithm." +msgstr "" + +#: doc/classes/AnimationNodeStateMachinePlayback.xml:36 +msgid "Returns [code]true[/code] if an animation is playing." +msgstr "" + +#: doc/classes/AnimationNodeStateMachinePlayback.xml:45 +msgid "Starts playing the given animation." +msgstr "" + +#: doc/classes/AnimationNodeStateMachinePlayback.xml:52 +msgid "Stops the currently playing animation." +msgstr "" + +#: doc/classes/AnimationNodeStateMachinePlayback.xml:61 +msgid "" +"Transitions from the current state to another one, following the shortest " +"path." +msgstr "" + +#: doc/classes/AnimationNodeStateMachineTransition.xml:14 +msgid "" +"Turn on auto advance when this condition is set. The provided name will " +"become a boolean parameter on the [AnimationTree] that can be controlled " +"from code (see [url=https://docs.godotengine.org/en/latest/tutorials/" +"animation/animation_tree.html#controlling-from-code][/url]). For example, if " +"[member AnimationTree.tree_root] is an [AnimationNodeStateMachine] and " +"[member advance_condition] is set to [code]\"idle\"[/code]:\n" +"[codeblock]\n" +"$animation_tree[\"parameters/conditions/idle\"] = is_on_floor and " +"(linear_velocity.x == 0)\n" +"[/codeblock]" +msgstr "" + +#: doc/classes/AnimationNodeStateMachineTransition.xml:20 +msgid "" +"Turn on the transition automatically when this state is reached. This works " +"best with [constant SWITCH_MODE_AT_END]." +msgstr "" + +#: doc/classes/AnimationNodeStateMachineTransition.xml:23 +msgid "" +"Don't use this transition during [method AnimationNodeStateMachinePlayback." +"travel] or [member auto_advance]." +msgstr "" + +#: doc/classes/AnimationNodeStateMachineTransition.xml:26 +msgid "" +"Lower priority transitions are preferred when travelling through the tree " +"via [method AnimationNodeStateMachinePlayback.travel] or [member " +"auto_advance]." +msgstr "" + +#: doc/classes/AnimationNodeStateMachineTransition.xml:29 +msgid "The transition type." +msgstr "" + +#: doc/classes/AnimationNodeStateMachineTransition.xml:32 +msgid "The time to cross-fade between this state and the next." +msgstr "" + +#: doc/classes/AnimationNodeStateMachineTransition.xml:38 +msgid "Emitted when [member advance_condition] is changed." +msgstr "" + +#: doc/classes/AnimationNodeStateMachineTransition.xml:44 +msgid "" +"Switch to the next state immediately. The current state will end and blend " +"into the beginning of the new one." +msgstr "" + +#: doc/classes/AnimationNodeStateMachineTransition.xml:47 +msgid "" +"Switch to the next state immediately, but will seek the new state to the " +"playback position of the old state." +msgstr "" + +#: doc/classes/AnimationNodeStateMachineTransition.xml:50 +msgid "" +"Wait for the current state playback to end, then switch to the beginning of " +"the next state animation." +msgstr "" + +#: doc/classes/AnimationNodeTimeScale.xml:4 +msgid "A time-scaling animation node to be used with [AnimationTree]." +msgstr "" + +#: doc/classes/AnimationNodeTimeScale.xml:7 +msgid "" +"Allows scaling the speed of the animation (or reversing it) in any children " +"nodes. Setting it to 0 will pause the animation." +msgstr "" + +#: doc/classes/AnimationNodeTimeSeek.xml:4 +msgid "A time-seeking animation node to be used with [AnimationTree]." +msgstr "" + +#: doc/classes/AnimationNodeTimeSeek.xml:7 +msgid "" +"This node can be used to cause a seek command to happen to any sub-children " +"of the graph. After setting the time, this value returns to -1." +msgstr "" + +#: doc/classes/AnimationNodeTransition.xml:4 +msgid "A generic animation transition node for [AnimationTree]." +msgstr "" + +#: doc/classes/AnimationNodeTransition.xml:7 +msgid "" +"Simple state machine for cases which don't require a more advanced " +"[AnimationNodeStateMachine]. Animations can be connected to the inputs and " +"transition times can be specified." +msgstr "" + +#: doc/classes/AnimationNodeTransition.xml:52 +msgid "The number of available input ports for this node." +msgstr "" + +#: doc/classes/AnimationNodeTransition.xml:55 +msgid "" +"Cross-fading time (in seconds) between each animation connected to the " +"inputs." +msgstr "" + +#: doc/classes/AnimationPlayer.xml:4 +msgid "Container and player of [Animation] resources." +msgstr "" + +#: doc/classes/AnimationPlayer.xml:7 +msgid "" +"An animation player is used for general-purpose playback of [Animation] " +"resources. It contains a dictionary of animations (referenced by name) and " +"custom blend times between their transitions. Additionally, animations can " +"be played and blended in different channels.\n" +"[AnimationPlayer] is more suited than [Tween] for animations where you know " +"the final values in advance. For example, fading a screen in and out is more " +"easily done with an [AnimationPlayer] node thanks to the animation tools " +"provided by the editor. That particular example can also be implemented with " +"a [Tween] node, but it requires doing everything by code.\n" +"Updating the target properties of animations occurs at process time." +msgstr "" + +#: doc/classes/AnimationPlayer.xml:12 +msgid "" +"https://docs.godotengine.org/en/latest/getting_started/step_by_step/" +"animations.html" +msgstr "" + +#: doc/classes/AnimationPlayer.xml:24 +msgid "" +"Adds [code]animation[/code] to the player accessible with the key " +"[code]name[/code]." +msgstr "" + +#: doc/classes/AnimationPlayer.xml:33 +msgid "" +"Shifts position in the animation timeline and immediately updates the " +"animation. [code]delta[/code] is the time in seconds to shift. Events " +"between the current frame and [code]delta[/code] are handled." +msgstr "" + +#: doc/classes/AnimationPlayer.xml:42 +msgid "Returns the name of the next animation in the queue." +msgstr "" + +#: doc/classes/AnimationPlayer.xml:53 +msgid "" +"Triggers the [code]anim_to[/code] animation when the [code]anim_from[/code] " +"animation completes." +msgstr "" + +#: doc/classes/AnimationPlayer.xml:60 +msgid "" +"[AnimationPlayer] caches animated nodes. It may not notice if a node " +"disappears; [method clear_caches] forces it to update the cache again." +msgstr "" + +#: doc/classes/AnimationPlayer.xml:67 +msgid "Clears all queued, unplayed animations." +msgstr "" + +#: doc/classes/AnimationPlayer.xml:76 +msgid "" +"Returns the name of [code]animation[/code] or an empty string if not found." +msgstr "" + +#: doc/classes/AnimationPlayer.xml:85 +msgid "" +"Returns the [Animation] with key [code]name[/code] or [code]null[/code] if " +"not found." +msgstr "" + +#: doc/classes/AnimationPlayer.xml:92 +msgid "Returns the list of stored animation names." +msgstr "" + +#: doc/classes/AnimationPlayer.xml:103 +msgid "" +"Gets the blend time (in seconds) between two animations, referenced by their " +"names." +msgstr "" + +#: doc/classes/AnimationPlayer.xml:110 +msgid "" +"Gets the actual playing speed of current animation or 0 if not playing. This " +"speed is the [member playback_speed] property multiplied by " +"[code]custom_speed[/code] argument specified when calling the [method play] " +"method." +msgstr "" + +#: doc/classes/AnimationPlayer.xml:117 +msgid "" +"Returns a list of the animation names that are currently queued to play." +msgstr "" + +#: doc/classes/AnimationPlayer.xml:126 +msgid "" +"Returns [code]true[/code] if the [AnimationPlayer] stores an [Animation] " +"with key [code]name[/code]." +msgstr "" + +#: doc/classes/AnimationPlayer.xml:133 +msgid "Returns [code]true[/code] if playing an animation." +msgstr "" + +#: doc/classes/AnimationPlayer.xml:148 +msgid "" +"Plays the animation with key [code]name[/code]. Custom blend times and speed " +"can be set. If [code]custom_speed[/code] is negative and [code]from_end[/" +"code] is [code]true[/code], the animation will play backwards (which is " +"equivalent to calling [method play_backwards]).\n" +"The [AnimationPlayer] keeps track of its current or last played animation " +"with [member assigned_animation]. If this method is called with that same " +"animation [code]name[/code], or with no [code]name[/code] parameter, the " +"assigned animation will resume playing if it was paused, or restart if it " +"was stopped (see [method stop] for both pause and stop). If the animation " +"was already playing, it will keep playing.\n" +"[b]Note:[/b] The animation will be updated the next time the " +"[AnimationPlayer] is processed. If other variables are updated at the same " +"time this is called, they may be updated too early. To perform the update " +"immediately, call [code]advance(0)[/code]." +msgstr "" + +#: doc/classes/AnimationPlayer.xml:161 +msgid "" +"Plays the animation with key [code]name[/code] in reverse.\n" +"This method is a shorthand for [method play] with [code]custom_speed = -1.0[/" +"code] and [code]from_end = true[/code], so see its description for more " +"information." +msgstr "" + +#: doc/classes/AnimationPlayer.xml:171 +msgid "" +"Queues an animation for playback once the current one is done.\n" +"[b]Note:[/b] If a looped animation is currently playing, the queued " +"animation will never play unless the looped animation is stopped somehow." +msgstr "" + +#: doc/classes/AnimationPlayer.xml:181 +msgid "Removes the animation with key [code]name[/code]." +msgstr "" + +#: doc/classes/AnimationPlayer.xml:192 +msgid "" +"Renames an existing animation with key [code]name[/code] to [code]newname[/" +"code]." +msgstr "" + +#: doc/classes/AnimationPlayer.xml:203 +msgid "" +"Seeks the animation to the [code]seconds[/code] point in time (in seconds). " +"If [code]update[/code] is [code]true[/code], the animation updates too, " +"otherwise it updates at process time. Events between the current frame and " +"[code]seconds[/code] are skipped." +msgstr "" + +#: doc/classes/AnimationPlayer.xml:216 +msgid "" +"Specifies a blend time (in seconds) between two animations, referenced by " +"their names." +msgstr "" + +#: doc/classes/AnimationPlayer.xml:225 +msgid "" +"Stops or pauses the currently playing animation. If [code]reset[/code] is " +"[code]true[/code], the animation position is reset to [code]0[/code] and the " +"playback speed is reset to [code]1.0[/code].\n" +"If [code]reset[/code] is [code]false[/code], the [member " +"current_animation_position] will be kept and calling [method play] or " +"[method play_backwards] without arguments or with the same animation name as " +"[member assigned_animation] will resume the animation." +msgstr "" + +#: doc/classes/AnimationPlayer.xml:232 +msgid "" +"If playing, the current animation; otherwise, the animation last played. " +"When set, would change the animation, but would not play it unless currently " +"playing. See also [member current_animation]." +msgstr "" + +#: doc/classes/AnimationPlayer.xml:235 +msgid "The name of the animation to play when the scene loads." +msgstr "" + +#: doc/classes/AnimationPlayer.xml:238 +msgid "" +"The name of the current animation, \"\" if not playing anything. When being " +"set, does not restart the animation. See also [method play]." +msgstr "" + +#: doc/classes/AnimationPlayer.xml:241 +msgid "The length (in seconds) of the currently being played animation." +msgstr "" + +#: doc/classes/AnimationPlayer.xml:244 +msgid "The position (in seconds) of the currently playing animation." +msgstr "" + +#: doc/classes/AnimationPlayer.xml:247 +msgid "The call mode to use for Call Method tracks." +msgstr "" + +#: doc/classes/AnimationPlayer.xml:250 +msgid "" +"If [code]true[/code], updates animations in response to process-related " +"notifications." +msgstr "" + +#: doc/classes/AnimationPlayer.xml:253 +msgid "" +"The default time in which to blend animations. Ranges from 0 to 4096 with " +"0.01 precision." +msgstr "" + +#: doc/classes/AnimationPlayer.xml:256 +msgid "The process notification in which to update animations." +msgstr "" + +#: doc/classes/AnimationPlayer.xml:259 +msgid "" +"The speed scaling ratio. For instance, if this value is 1, then the " +"animation plays at normal speed. If it's 0.5, then it plays at half speed. " +"If it's 2, then it plays at double speed." +msgstr "" + +#: doc/classes/AnimationPlayer.xml:262 +msgid "The node from which node path references will travel." +msgstr "" + +#: doc/classes/AnimationPlayer.xml:272 +msgid "" +"If the currently being played animation changes, this signal will notify of " +"such change." +msgstr "" + +#: doc/classes/AnimationPlayer.xml:279 +msgid "Notifies when an animation finished playing." +msgstr "" + +#: doc/classes/AnimationPlayer.xml:286 +msgid "Notifies when an animation starts playing." +msgstr "" + +#: doc/classes/AnimationPlayer.xml:291 +msgid "" +"Notifies when the caches have been cleared, either automatically, or " +"manually via [method clear_caches]." +msgstr "" + +#: doc/classes/AnimationPlayer.xml:297 +msgid "" +"Process animation during the physics process. This is especially useful when " +"animating physics bodies." +msgstr "" + +#: doc/classes/AnimationPlayer.xml:300 +msgid "Process animation during the idle process." +msgstr "" + +#: doc/classes/AnimationPlayer.xml:303 +msgid "" +"Do not process animation. Use [method advance] to process the animation " +"manually." +msgstr "" + +#: doc/classes/AnimationPlayer.xml:306 +msgid "" +"Batch method calls during the animation process, then do the calls after " +"events are processed. This avoids bugs involving deleting nodes or modifying " +"the AnimationPlayer while playing." +msgstr "" + +#: doc/classes/AnimationPlayer.xml:309 +msgid "Make method calls immediately when reached in the animation." +msgstr "" + +#: doc/classes/AnimationTree.xml:4 +msgid "" +"A node to be used for advanced animation transitions in an [AnimationPlayer]." +msgstr "" + +#: doc/classes/AnimationTree.xml:10 +msgid "https://github.com/godotengine/tps-demo" +msgstr "" + +#: doc/classes/AnimationTree.xml:19 +msgid "Manually advance the animations by the specified time (in seconds)." +msgstr "" + +#: doc/classes/AnimationTree.xml:41 +msgid "If [code]true[/code], the [AnimationTree] will be processing." +msgstr "" + +#: doc/classes/AnimationTree.xml:44 +msgid "The path to the [AnimationPlayer] used for animating." +msgstr "" + +#: doc/classes/AnimationTree.xml:47 +msgid "" +"The process mode of this [AnimationTree]. See [enum AnimationProcessMode] " +"for available modes." +msgstr "" + +#: doc/classes/AnimationTree.xml:52 +msgid "The root animation node of this [AnimationTree]. See [AnimationNode]." +msgstr "" + +#: doc/classes/AnimationTree.xml:57 +msgid "" +"The animations will progress during the physics frame (i.e. [method Node." +"_physics_process])." +msgstr "" + +#: doc/classes/AnimationTree.xml:60 +msgid "" +"The animations will progress during the idle frame (i.e. [method Node." +"_process])." +msgstr "" + +#: doc/classes/AnimationTree.xml:63 +msgid "The animations will only progress manually (see [method advance])." +msgstr "" + +#: doc/classes/Area2D.xml:4 +msgid "2D area for detection and 2D physics influence." +msgstr "" + +#: doc/classes/Area2D.xml:7 +msgid "" +"2D area that detects [CollisionObject2D] nodes overlapping, entering, or " +"exiting. Can also alter or override local physics parameters (gravity, " +"damping)." +msgstr "" + +#: doc/classes/Area2D.xml:10 +msgid "" +"https://docs.godotengine.org/en/latest/tutorials/physics/using_area_2d.html" +msgstr "" + +#: doc/classes/Area2D.xml:19 +msgid "" +"Returns an individual bit on the layer mask. Describes whether other areas " +"will collide with this one on the given layer." +msgstr "" + +#: doc/classes/Area2D.xml:28 +msgid "" +"Returns an individual bit on the collision mask. Describes whether this area " +"will collide with others on the given layer." +msgstr "" + +#: doc/classes/Area2D.xml:35 +msgid "" +"Returns a list of intersecting [Area2D]s. For performance reasons " +"(collisions are all processed at the same time) this list is modified once " +"during the physics step, not immediately after objects are moved. Consider " +"using signals instead." +msgstr "" + +#: doc/classes/Area2D.xml:42 +msgid "" +"Returns a list of intersecting [PhysicsBody2D]s. For performance reasons " +"(collisions are all processed at the same time) this list is modified once " +"during the physics step, not immediately after objects are moved. Consider " +"using signals instead." +msgstr "" + +#: doc/classes/Area2D.xml:51 +msgid "" +"If [code]true[/code], the given area overlaps the Area2D.\n" +"[b]Note:[/b] The result of this test is not immediate after moving objects. " +"For performance, list of overlaps is updated once per frame and before the " +"physics step. Consider using signals instead." +msgstr "" + +#: doc/classes/Area2D.xml:61 +msgid "" +"If [code]true[/code], the given physics body overlaps the Area2D.\n" +"[b]Note:[/b] The result of this test is not immediate after moving objects. " +"For performance, list of overlaps is updated once per frame and before the " +"physics step. Consider using signals instead.\n" +"The [code]body[/code] argument can either be a [PhysicsBody2D] or a " +"[TileMap] instance (while TileMaps are not physics body themselves, they " +"register their tiles with collision shapes as a virtual physics body)." +msgstr "" + +#: doc/classes/Area2D.xml:74 +msgid "" +"Set/clear individual bits on the layer mask. This makes getting an area in/" +"out of only one layer easier." +msgstr "" + +#: doc/classes/Area2D.xml:85 +msgid "" +"Set/clear individual bits on the collision mask. This makes selecting the " +"areas scanned easier." +msgstr "" + +#: doc/classes/Area2D.xml:91 doc/classes/Area3D.xml:90 +msgid "" +"The rate at which objects stop spinning in this area. Represents the angular " +"velocity lost per second. Values range from [code]0[/code] (no damping) to " +"[code]1[/code] (full damping)." +msgstr "" + +#: doc/classes/Area2D.xml:94 doc/classes/Area3D.xml:93 +msgid "The name of the area's audio bus." +msgstr "" + +#: doc/classes/Area2D.xml:97 doc/classes/Area3D.xml:96 +msgid "" +"If [code]true[/code], the area's audio bus overrides the default audio bus." +msgstr "" + +#: doc/classes/Area2D.xml:100 doc/classes/Area3D.xml:99 +msgid "" +"The area's physics layer(s). Collidable objects can exist in any of 32 " +"different layers. A contact is detected if object A is in any of the layers " +"that object B scans, or object B is in any layers that object A scans. See " +"also [member collision_mask]." +msgstr "" + +#: doc/classes/Area2D.xml:103 doc/classes/Area3D.xml:102 +msgid "The physics layers this area scans to determine collision detection." +msgstr "" + +#: doc/classes/Area2D.xml:106 doc/classes/Area3D.xml:105 +msgid "" +"The area's gravity intensity (ranges from -1024 to 1024). This value " +"multiplies the gravity vector. This is useful to alter the force of gravity " +"without altering its direction." +msgstr "" + +#: doc/classes/Area2D.xml:109 doc/classes/Area3D.xml:108 +msgid "" +"The falloff factor for point gravity. The greater the value, the faster " +"gravity decreases with distance." +msgstr "" + +#: doc/classes/Area2D.xml:112 doc/classes/Area3D.xml:111 +msgid "" +"If [code]true[/code], gravity is calculated from a point (set via [member " +"gravity_vec]). See also [member space_override]." +msgstr "" + +#: doc/classes/Area2D.xml:115 doc/classes/Area3D.xml:114 +msgid "" +"The area's gravity vector (not normalized). If gravity is a point (see " +"[member gravity_point]), this will be the point of attraction." +msgstr "" + +#: doc/classes/Area2D.xml:118 doc/classes/Area3D.xml:117 +msgid "" +"The rate at which objects stop moving in this area. Represents the linear " +"velocity lost per second. Values range from [code]0[/code] (no damping) to " +"[code]1[/code] (full damping)." +msgstr "" + +#: doc/classes/Area2D.xml:121 doc/classes/Area3D.xml:120 +msgid "If [code]true[/code], other monitoring areas can detect this area." +msgstr "" + +#: doc/classes/Area2D.xml:124 doc/classes/Area3D.xml:123 +msgid "" +"If [code]true[/code], the area detects bodies or areas entering and exiting " +"it." +msgstr "" + +#: doc/classes/Area2D.xml:127 doc/classes/Area3D.xml:126 +msgid "The area's priority. Higher priority areas are processed first." +msgstr "" + +#: doc/classes/Area2D.xml:130 doc/classes/Area3D.xml:141 +msgid "" +"Override mode for gravity and damping calculations within this area. See " +"[enum SpaceOverride] for possible values." +msgstr "" + +#: doc/classes/Area2D.xml:138 doc/classes/Area3D.xml:149 +msgid "Emitted when another area enters." +msgstr "" + +#: doc/classes/Area2D.xml:145 doc/classes/Area3D.xml:156 +msgid "Emitted when another area exits." +msgstr "" + +#: doc/classes/Area2D.xml:158 +msgid "" +"Emitted when another area enters, reporting which shapes overlapped. " +"[code]shape_owner_get_owner(shape_find_owner(shape))[/code] returns the " +"parent object of the owner of the [code]shape[/code]." +msgstr "" + +#: doc/classes/Area2D.xml:171 +msgid "" +"Emitted when another area exits, reporting which shapes were overlapping." +msgstr "" + +#: doc/classes/Area2D.xml:178 +msgid "" +"Emitted when a physics body enters.\n" +"The [code]body[/code] argument can either be a [PhysicsBody2D] or a " +"[TileMap] instance (while TileMaps are not physics body themselves, they " +"register their tiles with collision shapes as a virtual physics body)." +msgstr "" + +#: doc/classes/Area2D.xml:186 +msgid "" +"Emitted when a physics body exits.\n" +"The [code]body[/code] argument can either be a [PhysicsBody2D] or a " +"[TileMap] instance (while TileMaps are not physics body themselves, they " +"register their tiles with collision shapes as a virtual physics body)." +msgstr "" + +#: doc/classes/Area2D.xml:200 +msgid "" +"Emitted when a physics body enters, reporting which shapes overlapped.\n" +"The [code]body[/code] argument can either be a [PhysicsBody2D] or a " +"[TileMap] instance (while TileMaps are not physics body themselves, they " +"register their tiles with collision shapes as a virtual physics body)." +msgstr "" + +#: doc/classes/Area2D.xml:214 +msgid "" +"Emitted when a physics body exits, reporting which shapes were overlapping.\n" +"The [code]body[/code] argument can either be a [PhysicsBody2D] or a " +"[TileMap] instance (while TileMaps are not physics body themselves, they " +"register their tiles with collision shapes as a virtual physics body)." +msgstr "" + +#: doc/classes/Area2D.xml:221 doc/classes/Area3D.xml:232 +msgid "This area does not affect gravity/damping." +msgstr "" + +#: doc/classes/Area2D.xml:224 doc/classes/Area3D.xml:235 +msgid "" +"This area adds its gravity/damping values to whatever has been calculated so " +"far (in [member priority] order)." +msgstr "" + +#: doc/classes/Area2D.xml:227 doc/classes/Area3D.xml:238 +msgid "" +"This area adds its gravity/damping values to whatever has been calculated so " +"far (in [member priority] order), ignoring any lower priority areas." +msgstr "" + +#: doc/classes/Area2D.xml:230 doc/classes/Area3D.xml:241 +msgid "" +"This area replaces any gravity/damping, even the defaults, ignoring any " +"lower priority areas." +msgstr "" + +#: doc/classes/Area2D.xml:233 doc/classes/Area3D.xml:244 +msgid "" +"This area replaces any gravity/damping calculated so far (in [member " +"priority] order), but keeps calculating the rest of the areas." +msgstr "" + +#: doc/classes/Area3D.xml:4 +msgid "General-purpose area node for detection and 3D physics influence." +msgstr "" + +#: doc/classes/Area3D.xml:7 +msgid "" +"3D area that detects [CollisionObject3D] nodes overlapping, entering, or " +"exiting. Can also alter or override local physics parameters (gravity, " +"damping)." +msgstr "" + +#: doc/classes/Area3D.xml:18 +msgid "Returns an individual bit on the layer mask." +msgstr "" + +#: doc/classes/Area3D.xml:27 modules/csg/doc_classes/CSGShape3D.xml:18 +#: modules/csg/doc_classes/CSGShape3D.xml:27 doc/classes/RayCast2D.xml:70 +#: doc/classes/SoftBody3D.xml:35 doc/classes/SoftBody3D.xml:44 +msgid "Returns an individual bit on the collision mask." +msgstr "" + +#: doc/classes/Area3D.xml:34 +msgid "" +"Returns a list of intersecting [Area3D]s. For performance reasons " +"(collisions are all processed at the same time) this list is modified once " +"during the physics step, not immediately after objects are moved. Consider " +"using signals instead." +msgstr "" + +#: doc/classes/Area3D.xml:41 +msgid "" +"Returns a list of intersecting [PhysicsBody3D]s. For performance reasons " +"(collisions are all processed at the same time) this list is modified once " +"during the physics step, not immediately after objects are moved. Consider " +"using signals instead." +msgstr "" + +#: doc/classes/Area3D.xml:50 +msgid "" +"If [code]true[/code], the given area overlaps the Area3D.\n" +"[b]Note:[/b] The result of this test is not immediate after moving objects. " +"For performance, list of overlaps is updated once per frame and before the " +"physics step. Consider using signals instead." +msgstr "" + +#: doc/classes/Area3D.xml:60 +msgid "" +"If [code]true[/code], the given physics body overlaps the Area3D.\n" +"[b]Note:[/b] The result of this test is not immediate after moving objects. " +"For performance, list of overlaps is updated once per frame and before the " +"physics step. Consider using signals instead.\n" +"The [code]body[/code] argument can either be a [PhysicsBody3D] or a " +"[GridMap] instance (while GridMaps are not physics body themselves, they " +"register their tiles with collision shapes as a virtual physics body)." +msgstr "" + +#: doc/classes/Area3D.xml:73 +msgid "" +"Set/clear individual bits on the layer mask. This simplifies editing this " +"[Area3D]'s layers." +msgstr "" + +#: doc/classes/Area3D.xml:84 +msgid "" +"Set/clear individual bits on the collision mask. This simplifies editing " +"which [Area3D] layers this [Area3D] scans." +msgstr "" + +#: doc/classes/Area3D.xml:129 +msgid "" +"The degree to which this area applies reverb to its associated audio. Ranges " +"from [code]0[/code] to [code]1[/code] with [code]0.1[/code] precision." +msgstr "" + +#: doc/classes/Area3D.xml:132 +msgid "If [code]true[/code], the area applies reverb to its associated audio." +msgstr "" + +#: doc/classes/Area3D.xml:135 +msgid "The reverb bus name to use for this area's associated audio." +msgstr "" + +#: doc/classes/Area3D.xml:138 +msgid "" +"The degree to which this area's reverb is a uniform effect. Ranges from " +"[code]0[/code] to [code]1[/code] with [code]0.1[/code] precision." +msgstr "" + +#: doc/classes/Area3D.xml:169 +msgid "" +"Emitted when another area enters, reporting which areas overlapped. " +"[code]shape_owner_get_owner(shape_find_owner(shape))[/code] returns the " +"parent object of the owner of the [code]shape[/code]." +msgstr "" + +#: doc/classes/Area3D.xml:182 +msgid "" +"Emitted when another area exits, reporting which areas were overlapping." +msgstr "" + +#: doc/classes/Area3D.xml:189 +msgid "" +"Emitted when a physics body enters.\n" +"The [code]body[/code] argument can either be a [PhysicsBody3D] or a " +"[GridMap] instance (while GridMaps are not physics body themselves, they " +"register their tiles with collision shapes as a virtual physics body)." +msgstr "" + +#: doc/classes/Area3D.xml:197 +msgid "" +"Emitted when a physics body exits.\n" +"The [code]body[/code] argument can either be a [PhysicsBody3D] or a " +"[GridMap] instance (while GridMaps are not physics body themselves, they " +"register their tiles with collision shapes as a virtual physics body)." +msgstr "" + +#: doc/classes/Area3D.xml:211 +msgid "" +"Emitted when a physics body enters, reporting which shapes overlapped.\n" +"The [code]body[/code] argument can either be a [PhysicsBody3D] or a " +"[GridMap] instance (while GridMaps are not physics body themselves, they " +"register their tiles with collision shapes as a virtual physics body)." +msgstr "" + +#: doc/classes/Area3D.xml:225 +msgid "" +"Emitted when a physics body exits, reporting which shapes were overlapping.\n" +"The [code]body[/code] argument can either be a [PhysicsBody3D] or a " +"[GridMap] instance (while GridMaps are not physics body themselves, they " +"register their tiles with collision shapes as a virtual physics body)." +msgstr "" + +#: doc/classes/Array.xml:4 +msgid "Generic array datatype." +msgstr "" + +#: doc/classes/Array.xml:7 +msgid "" +"Generic array which can contain several elements of any type, accessible by " +"a numerical index starting at 0. Negative indices can be used to count from " +"the back, like in Python (-1 is the last element, -2 the second to last, " +"etc.).\n" +"[b]Example:[/b]\n" +"[codeblock]\n" +"var array = [\"One\", 2, 3, \"Four\"]\n" +"print(array[0]) # One.\n" +"print(array[2]) # 3.\n" +"print(array[-1]) # Four.\n" +"array[2] = \"Three\"\n" +"print(array[-2]) # Three.\n" +"[/codeblock]\n" +"Arrays can be concatenated using the [code]+[/code] operator:\n" +"[codeblock]\n" +"var array1 = [\"One\", 2]\n" +"var array2 = [3, \"Four\"]\n" +"print(array1 + array2) # [\"One\", 2, 3, \"Four\"]\n" +"[/codeblock]\n" +"Arrays are always passed by reference." +msgstr "" + +#: doc/classes/Array.xml:34 +msgid "Constructs an array from a [PackedColorArray]." +msgstr "" + +#: doc/classes/Array.xml:43 +msgid "Constructs an array from a [PackedVector3Array]." +msgstr "" + +#: doc/classes/Array.xml:52 +msgid "Constructs an array from a [PackedVector2Array]." +msgstr "" + +#: doc/classes/Array.xml:61 +msgid "Constructs an array from a [PackedStringArray]." +msgstr "" + +#: doc/classes/Array.xml:70 +msgid "Constructs an array from a [PackedFloat64Array]." +msgstr "" + +#: doc/classes/Array.xml:79 +msgid "Constructs an array from a [PackedFloat32Array]." +msgstr "" + +#: doc/classes/Array.xml:88 +msgid "Constructs an array from a [PackedInt64Array]." +msgstr "" + +#: doc/classes/Array.xml:97 +msgid "Constructs an array from a [PackedInt32Array]." +msgstr "" + +#: doc/classes/Array.xml:106 +msgid "Constructs an array from a [PackedByteArray]." +msgstr "" + +#: doc/classes/Array.xml:115 doc/classes/PackedByteArray.xml:28 +#: doc/classes/PackedColorArray.xml:28 doc/classes/PackedFloat32Array.xml:29 +#: doc/classes/PackedFloat64Array.xml:29 doc/classes/PackedInt32Array.xml:29 +#: doc/classes/PackedInt64Array.xml:29 doc/classes/PackedStringArray.xml:28 +#: doc/classes/PackedVector2Array.xml:28 doc/classes/PackedVector3Array.xml:28 +msgid "" +"Appends an element at the end of the array (alias of [method push_back])." +msgstr "" + +#: doc/classes/Array.xml:122 +msgid "" +"Returns the last element of the array, or [code]null[/code] if the array is " +"empty." +msgstr "" + +#: doc/classes/Array.xml:133 +msgid "" +"Finds the index of an existing value (or the insertion index that maintains " +"sorting order, if the value is not yet present in the array) using binary " +"search. Optionally, a [code]before[/code] specifier can be passed. If " +"[code]false[/code], the returned index comes after all existing entries of " +"the value in the array.\n" +"[b]Note:[/b] Calling [method bsearch] on an unsorted array results in " +"unexpected behavior." +msgstr "" + +#: doc/classes/Array.xml:149 +msgid "" +"Finds the index of an existing value (or the insertion index that maintains " +"sorting order, if the value is not yet present in the array) using binary " +"search and a custom comparison method. Optionally, a [code]before[/code] " +"specifier can be passed. If [code]false[/code], the returned index comes " +"after all existing entries of the value in the array. The custom method " +"receives two arguments (an element from the array and the value searched " +"for) and must return [code]true[/code] if the first argument is less than " +"the second, and return [code]false[/code] otherwise.\n" +"[b]Note:[/b] Calling [method bsearch] on an unsorted array results in " +"unexpected behavior." +msgstr "" + +#: doc/classes/Array.xml:157 +msgid "" +"Clears the array. This is equivalent to using [method resize] with a size of " +"[code]0[/code]." +msgstr "" + +#: doc/classes/Array.xml:166 +msgid "Returns the number of times an element is in the array." +msgstr "" + +#: doc/classes/Array.xml:175 +msgid "" +"Returns a copy of the array.\n" +"If [code]deep[/code] is [code]true[/code], a deep copy is performed: all " +"nested arrays and dictionaries are duplicated and will not be shared with " +"the original array. If [code]false[/code], a shallow copy is made and " +"references to the original nested arrays and dictionaries are kept, so that " +"modifying a sub-array or dictionary in the copy will also impact those " +"referenced in the source array." +msgstr "" + +#: doc/classes/Array.xml:183 doc/classes/PackedByteArray.xml:64 +#: doc/classes/PackedColorArray.xml:44 doc/classes/PackedFloat32Array.xml:45 +#: doc/classes/PackedFloat64Array.xml:45 doc/classes/PackedInt32Array.xml:45 +#: doc/classes/PackedInt64Array.xml:45 doc/classes/PackedStringArray.xml:44 +#: doc/classes/PackedVector2Array.xml:44 doc/classes/PackedVector3Array.xml:44 +msgid "Returns [code]true[/code] if the array is empty." +msgstr "" + +#: doc/classes/Array.xml:192 +msgid "Removes the first occurrence of a value from the array." +msgstr "" + +#: doc/classes/Array.xml:203 +msgid "" +"Searches the array for a value and returns its index or -1 if not found. " +"Optionally, the initial search index can be passed." +msgstr "" + +#: doc/classes/Array.xml:212 +msgid "" +"Searches the array in reverse order for a value and returns its index or -1 " +"if not found." +msgstr "" + +#: doc/classes/Array.xml:219 +msgid "" +"Returns the first element of the array, or [code]null[/code] if the array is " +"empty." +msgstr "" + +#: doc/classes/Array.xml:228 +msgid "" +"Returns [code]true[/code] if the array contains the given value.\n" +"[codeblock]\n" +"[\"inside\", 7].has(\"inside\") == true\n" +"[\"inside\", 7].has(\"outside\") == false\n" +"[\"inside\", 7].has(7) == true\n" +"[\"inside\", 7].has(\"7\") == false\n" +"[/codeblock]" +msgstr "" + +#: doc/classes/Array.xml:241 +msgid "Returns a hashed integer value representing the array contents." +msgstr "" + +#: doc/classes/Array.xml:252 +msgid "" +"Inserts a new element at a given position in the array. The position must be " +"valid, or at the end of the array ([code]pos == size()[/code])." +msgstr "" + +#: doc/classes/Array.xml:259 doc/classes/PackedByteArray.xml:107 +#: doc/classes/PackedColorArray.xml:62 doc/classes/PackedFloat32Array.xml:63 +#: doc/classes/PackedFloat64Array.xml:63 doc/classes/PackedInt32Array.xml:63 +#: doc/classes/PackedInt64Array.xml:63 doc/classes/PackedStringArray.xml:62 +#: doc/classes/PackedVector2Array.xml:62 doc/classes/PackedVector3Array.xml:62 +msgid "Reverses the order of the elements in the array." +msgstr "" + +#: doc/classes/Array.xml:266 +msgid "" +"Returns the maximum value contained in the array if all elements are of " +"comparable types. If the elements can't be compared, [code]null[/code] is " +"returned." +msgstr "" + +#: doc/classes/Array.xml:273 +msgid "" +"Returns the minimum value contained in the array if all elements are of " +"comparable types. If the elements can't be compared, [code]null[/code] is " +"returned." +msgstr "" + +#: doc/classes/Array.xml:280 +msgid "" +"Removes and returns the last element of the array. Returns [code]null[/code] " +"if the array is empty." +msgstr "" + +#: doc/classes/Array.xml:287 +msgid "" +"Removes and returns the first element of the array. Returns [code]null[/" +"code] if the array is empty." +msgstr "" + +#: doc/classes/Array.xml:296 doc/classes/PackedByteArray.xml:116 +#: doc/classes/PackedFloat32Array.xml:72 doc/classes/PackedFloat64Array.xml:72 +msgid "Appends an element at the end of the array." +msgstr "" + +#: doc/classes/Array.xml:305 +msgid "Adds an element at the beginning of the array." +msgstr "" + +#: doc/classes/Array.xml:314 doc/classes/PackedByteArray.xml:125 +#: doc/classes/PackedColorArray.xml:80 doc/classes/PackedFloat32Array.xml:81 +#: doc/classes/PackedFloat64Array.xml:81 doc/classes/PackedInt32Array.xml:81 +#: doc/classes/PackedInt64Array.xml:81 doc/classes/PackedStringArray.xml:80 +#: doc/classes/PackedVector2Array.xml:80 doc/classes/PackedVector3Array.xml:80 +msgid "Removes an element from the array by index." +msgstr "" + +#: doc/classes/Array.xml:323 +msgid "" +"Resizes the array to contain a different number of elements. If the array " +"size is smaller, elements are cleared, if bigger, new elements are " +"[code]null[/code]." +msgstr "" + +#: doc/classes/Array.xml:334 +msgid "" +"Searches the array in reverse order. Optionally, a start search index can be " +"passed. If negative, the start index is considered relative to the end of " +"the array." +msgstr "" + +#: doc/classes/Array.xml:341 +msgid "" +"Shuffles the array such that the items will have a random order. This method " +"uses the global random number generator common to methods such as [method " +"@GDScript.randi]. Call [method @GDScript.randomize] to ensure that a new " +"seed will be used each time if you want non-reproducible shuffling." +msgstr "" + +#: doc/classes/Array.xml:348 +msgid "Returns the number of elements in the array." +msgstr "" + +#: doc/classes/Array.xml:363 +msgid "" +"Duplicates the subset described in the function and returns it in an array, " +"deeply copying the array if [code]deep[/code] is [code]true[/code]. Lower " +"and upper index are inclusive, with the [code]step[/code] describing the " +"change between indices while slicing." +msgstr "" + +#: doc/classes/Array.xml:370 +msgid "" +"Sorts the array.\n" +"[b]Note:[/b] Strings are sorted in alphabetical order (as opposed to natural " +"order). This may lead to unexpected behavior when sorting an array of " +"strings ending with a sequence of numbers. Consider the following example:\n" +"[codeblock]\n" +"var strings = [\"string1\", \"string2\", \"string10\", \"string11\"]\n" +"strings.sort()\n" +"print(strings) # Prints [string1, string10, string11, string2]\n" +"[/codeblock]" +msgstr "" + +#: doc/classes/Array.xml:387 +msgid "" +"Sorts the array using a custom method. The arguments are an object that " +"holds the method and the name of such method. The custom method receives two " +"arguments (a pair of elements from the array) and must return either " +"[code]true[/code] or [code]false[/code].\n" +"[b]Note:[/b] you cannot randomize the return value as the heapsort algorithm " +"expects a deterministic result. Doing so will result in unexpected " +"behavior.\n" +"[codeblock]\n" +"class MyCustomSorter:\n" +" static func sort_ascending(a, b):\n" +" if a[0] < b[0]:\n" +" return true\n" +" return false\n" +"\n" +"var my_items = [[5, \"Potato\"], [9, \"Rice\"], [4, \"Tomato\"]]\n" +"my_items.sort_custom(MyCustomSorter, \"sort_ascending\")\n" +"print(my_items) # Prints [[4, Tomato], [5, Potato], [9, Rice]].\n" +"[/codeblock]" +msgstr "" + +#: doc/classes/ArrayMesh.xml:4 +msgid "" +"[Mesh] type that provides utility for constructing a surface from arrays." +msgstr "" + +#: doc/classes/ArrayMesh.xml:7 +msgid "" +"The [ArrayMesh] is used to construct a [Mesh] by specifying the attributes " +"as arrays.\n" +"The most basic example is the creation of a single triangle:\n" +"[codeblock]\n" +"var vertices = PackedVector3Array()\n" +"vertices.push_back(Vector3(0, 1, 0))\n" +"vertices.push_back(Vector3(1, 0, 0))\n" +"vertices.push_back(Vector3(0, 0, 1))\n" +"# Initialize the ArrayMesh.\n" +"var arr_mesh = ArrayMesh.new()\n" +"var arrays = []\n" +"arrays.resize(ArrayMesh.ARRAY_MAX)\n" +"arrays[ArrayMesh.ARRAY_VERTEX] = vertices\n" +"# Create the Mesh.\n" +"arr_mesh.add_surface_from_arrays(Mesh.PRIMITIVE_TRIANGLES, arrays)\n" +"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.\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:29 +msgid "" +"https://docs.godotengine.org/en/latest/tutorials/content/procedural_geometry/" +"arraymesh.html" +msgstr "" + +#: 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:57 +msgid "" +"Creates a new surface.\n" +"Surfaces are created to be rendered using a [code]primitive[/code], which " +"may be any of the types defined in [enum Mesh.PrimitiveType]. (As a note, " +"when using indices, it is recommended to only use points, lines or " +"triangles.) [method Mesh.get_surface_count] will become the [code]surf_idx[/" +"code] for this new surface.\n" +"The [code]arrays[/code] argument is an array of arrays. See [enum ArrayType] " +"for the values used in this array. For example, [code]arrays[0][/code] is " +"the array of vertices. That first vertex sub-array is always required; the " +"others are optional. 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 vertex order. All sub-arrays must have the same " +"length as the vertex array or be empty, except for [constant ARRAY_INDEX] if " +"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." +msgstr "" + +#: doc/classes/ArrayMesh.xml:67 +msgid "Removes all blend shapes from this [ArrayMesh]." +msgstr "" + +#: doc/classes/ArrayMesh.xml:74 +msgid "Removes all surfaces from this [ArrayMesh]." +msgstr "" + +#: doc/classes/ArrayMesh.xml:81 +msgid "Returns the number of blend shapes that the [ArrayMesh] holds." +msgstr "" + +#: doc/classes/ArrayMesh.xml:90 +msgid "Returns the name of the blend shape at this index." +msgstr "" + +#: 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:108 +msgid "Will regenerate normal maps for the [ArrayMesh]." +msgstr "" + +#: 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: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: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:144 +msgid "" +"Returns the format mask of the requested surface (see [method " +"add_surface_from_arrays])." +msgstr "" + +#: doc/classes/ArrayMesh.xml:153 +msgid "Gets the name assigned to this surface." +msgstr "" + +#: 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:173 +msgid "Sets a name for a given surface." +msgstr "" + +#: 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:193 +msgid "Sets the blend shape mode to one of [enum Mesh.BlendShapeMode]." +msgstr "" + +#: 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:201 +msgid "Default value used for index_array_len when no indices are present." +msgstr "" + +#: doc/classes/ArrayMesh.xml:204 +msgid "Amount of weights/bone indices per vertex (always 4)." +msgstr "" + +#: doc/classes/ArrayMesh.xml:207 +msgid "" +"[PackedVector3Array], [PackedVector2Array], or [Array] of vertex positions." +msgstr "" + +#: doc/classes/ArrayMesh.xml:210 +msgid "[PackedVector3Array] of vertex normals." +msgstr "" + +#: 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:216 +msgid "[PackedColorArray] of vertex colors." +msgstr "" + +#: doc/classes/ArrayMesh.xml:219 +msgid "[PackedVector2Array] for UV coordinates." +msgstr "" + +#: doc/classes/ArrayMesh.xml:222 +msgid "[PackedVector2Array] for second UV coordinates." +msgstr "" + +#: doc/classes/ArrayMesh.xml:225 +msgid "" +"[PackedFloat32Array] or [PackedInt32Array] of bone indices. Each element in " +"groups of 4 floats." +msgstr "" + +#: doc/classes/ArrayMesh.xml:228 +msgid "" +"[PackedFloat32Array] of bone weights. Each element in groups of 4 floats." +msgstr "" + +#: 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 " +"number of elements as the vertex array. No index can be beyond the vertex " +"array size. When this index array is present, it puts the function into " +"\"index mode,\" where the index selects the *i*'th vertex, normal, tangent, " +"color, UV, etc. This means if you want to have different normals or colors " +"along an edge, you have to duplicate the vertices.\n" +"For triangles, the index array is interpreted as triples, referring to the " +"vertices of each triangle. For lines, the index array is in pairs indicating " +"the start and end of each line." +msgstr "" + +#: 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:238 +msgid "Array format will include vertices (mandatory)." +msgstr "" + +#: doc/classes/ArrayMesh.xml:241 +msgid "Array format will include normals." +msgstr "" + +#: doc/classes/ArrayMesh.xml:244 +msgid "Array format will include tangents." +msgstr "" + +#: doc/classes/ArrayMesh.xml:247 +msgid "Array format will include a color array." +msgstr "" + +#: doc/classes/ArrayMesh.xml:250 +msgid "Array format will include UVs." +msgstr "" + +#: doc/classes/ArrayMesh.xml:253 +msgid "Array format will include another set of UVs." +msgstr "" + +#: doc/classes/ArrayMesh.xml:256 +msgid "Array format will include bone indices." +msgstr "" + +#: doc/classes/ArrayMesh.xml:259 +msgid "Array format will include bone weights." +msgstr "" + +#: doc/classes/ArrayMesh.xml:262 +msgid "Index array will be used." +msgstr "" + +#: doc/classes/AStar.xml:4 +msgid "" +"An implementation of A* to find shortest paths among connected points in " +"space." +msgstr "" + +#: doc/classes/AStar.xml:7 +msgid "" +"A* (A star) is a computer algorithm that is widely used in pathfinding and " +"graph traversal, the process of plotting short paths among vertices " +"(points), passing through a given set of edges (segments). It enjoys " +"widespread use due to its performance and accuracy. Godot's A* " +"implementation uses points in three-dimensional space and Euclidean " +"distances by default.\n" +"You must add points manually with [method add_point] and create segments " +"manually with [method connect_points]. Then you can test if there is a path " +"between two points with the [method are_points_connected] function, get a " +"path containing indices by [method get_id_path], or one containing actual " +"coordinates with [method get_point_path].\n" +"It is also possible to use non-Euclidean distances. To do so, create a class " +"that extends [code]AStar[/code] and override methods [method _compute_cost] " +"and [method _estimate_cost]. Both take two indices and return a length, as " +"is shown in the following example.\n" +"[codeblock]\n" +"class MyAStar:\n" +" extends AStar\n" +"\n" +" func _compute_cost(u, v):\n" +" return abs(u - v)\n" +"\n" +" func _estimate_cost(u, v):\n" +" return min(0, abs(u - v) - 1)\n" +"[/codeblock]\n" +"[method _estimate_cost] should return a lower bound of the distance, i.e. " +"[code]_estimate_cost(u, v) <= _compute_cost(u, v)[/code]. This serves as a " +"hint to the algorithm because the custom [code]_compute_cost[/code] might be " +"computation-heavy. If this is not the case, make [method _estimate_cost] " +"return the same value as [method _compute_cost] to provide the algorithm " +"with the most accurate information." +msgstr "" + +#: doc/classes/AStar.xml:33 +msgid "" +"Called when computing the cost between two connected points.\n" +"Note that this function is hidden in the default [code]AStar[/code] class." +msgstr "" + +#: doc/classes/AStar.xml:45 +msgid "" +"Called when estimating the cost between a point and the path's ending " +"point.\n" +"Note that this function is hidden in the default [code]AStar[/code] class." +msgstr "" + +#: doc/classes/AStar.xml:59 +msgid "" +"Adds a new point at the given position with the given identifier. The " +"algorithm prefers points with lower [code]weight_scale[/code] to form a " +"path. The [code]id[/code] must be 0 or larger, and the [code]weight_scale[/" +"code] must be 1 or larger.\n" +"[codeblock]\n" +"var astar = AStar.new()\n" +"astar.add_point(1, Vector3(1, 0, 0), 4) # Adds the point (1, 0, 0) with " +"weight_scale 4 and id 1\n" +"[/codeblock]\n" +"If there already exists a point for the given [code]id[/code], its position " +"and weight scale are updated to the given values." +msgstr "" + +#: doc/classes/AStar.xml:77 +msgid "" +"Returns whether the two given points are directly connected by a segment. If " +"[code]bidirectional[/code] is [code]false[/code], returns whether movement " +"from [code]id[/code] to [code]to_id[/code] is possible through this segment." +msgstr "" + +#: doc/classes/AStar.xml:84 doc/classes/AStar2D.xml:69 +msgid "Clears all the points and segments." +msgstr "" + +#: doc/classes/AStar.xml:97 +msgid "" +"Creates a segment between the given points. If [code]bidirectional[/code] is " +"[code]false[/code], only movement from [code]id[/code] to [code]to_id[/code] " +"is allowed, not the reverse direction.\n" +"[codeblock]\n" +"var astar = AStar.new()\n" +"astar.add_point(1, Vector3(1, 1, 0))\n" +"astar.add_point(2, Vector3(0, 5, 0))\n" +"astar.connect_points(1, 2, false)\n" +"[/codeblock]" +msgstr "" + +#: doc/classes/AStar.xml:116 +msgid "" +"Deletes the segment between the given points. If [code]bidirectional[/code] " +"is [code]false[/code], only movement from [code]id[/code] to [code]to_id[/" +"code] is prevented, and a unidirectional segment possibly remains." +msgstr "" + +#: doc/classes/AStar.xml:123 doc/classes/AStar2D.xml:106 +msgid "Returns the next available point ID with no point associated to it." +msgstr "" + +#: doc/classes/AStar.xml:134 doc/classes/AStar2D.xml:117 +msgid "" +"Returns the ID of the closest point to [code]to_position[/code], optionally " +"taking disabled points into account. Returns -1 if there are no points in " +"the points pool." +msgstr "" + +#: doc/classes/AStar.xml:143 +msgid "" +"Returns the closest position to [code]to_position[/code] that resides inside " +"a segment between two connected points.\n" +"[codeblock]\n" +"var astar = AStar.new()\n" +"astar.add_point(1, Vector3(0, 0, 0))\n" +"astar.add_point(2, Vector3(0, 5, 0))\n" +"astar.connect_points(1, 2)\n" +"var res = astar.get_closest_position_in_segment(Vector3(3, 3, 0)) # Returns " +"(0, 3, 0)\n" +"[/codeblock]\n" +"The result is in the segment that goes from [code]y = 0[/code] to [code]y = " +"5[/code]. It's the closest position in the segment to the given point." +msgstr "" + +#: doc/classes/AStar.xml:162 +msgid "" +"Returns an array with the IDs of the points that form the path found by " +"AStar between the given points. The array is ordered from the starting point " +"to the ending point of the path.\n" +"[codeblock]\n" +"var astar = AStar.new()\n" +"astar.add_point(1, Vector3(0, 0, 0))\n" +"astar.add_point(2, Vector3(0, 1, 0), 1) # Default weight is 1\n" +"astar.add_point(3, Vector3(1, 1, 0))\n" +"astar.add_point(4, Vector3(2, 0, 0))\n" +"\n" +"astar.connect_points(1, 2, false)\n" +"astar.connect_points(2, 3, false)\n" +"astar.connect_points(4, 3, false)\n" +"astar.connect_points(1, 4, false)\n" +"\n" +"var res = astar.get_id_path(1, 3) # Returns [1, 2, 3]\n" +"[/codeblock]\n" +"If you change the 2nd point's weight to 3, then the result will be [code][1, " +"4, 3][/code] instead, because now even though the distance is longer, it's " +"\"easier\" to get through point 4 than through point 2." +msgstr "" + +#: doc/classes/AStar.xml:184 doc/classes/AStar2D.xml:167 +msgid "" +"Returns the capacity of the structure backing the points, useful in " +"conjunction with [code]reserve_space[/code]." +msgstr "" + +#: doc/classes/AStar.xml:193 +msgid "" +"Returns an array with the IDs of the points that form the connection with " +"the given point.\n" +"[codeblock]\n" +"var astar = AStar.new()\n" +"astar.add_point(1, Vector3(0, 0, 0))\n" +"astar.add_point(2, Vector3(0, 1, 0))\n" +"astar.add_point(3, Vector3(1, 1, 0))\n" +"astar.add_point(4, Vector3(2, 0, 0))\n" +"\n" +"astar.connect_points(1, 2, true)\n" +"astar.connect_points(1, 3, true)\n" +"\n" +"var neighbors = astar.get_point_connections(1) # Returns [2, 3]\n" +"[/codeblock]" +msgstr "" + +#: doc/classes/AStar.xml:212 doc/classes/AStar2D.xml:195 +msgid "Returns the number of points currently in the points pool." +msgstr "" + +#: doc/classes/AStar.xml:223 +msgid "" +"Returns an array with the points that are in the path found by AStar between " +"the given points. The array is ordered from the starting point to the ending " +"point of the path." +msgstr "" + +#: doc/classes/AStar.xml:232 doc/classes/AStar2D.xml:215 +msgid "" +"Returns the position of the point associated with the given [code]id[/code]." +msgstr "" + +#: doc/classes/AStar.xml:241 doc/classes/AStar2D.xml:224 +msgid "" +"Returns the weight scale of the point associated with the given [code]id[/" +"code]." +msgstr "" + +#: doc/classes/AStar.xml:248 doc/classes/AStar2D.xml:231 +msgid "Returns an array of all points." +msgstr "" + +#: doc/classes/AStar.xml:257 doc/classes/AStar2D.xml:240 +msgid "" +"Returns whether a point associated with the given [code]id[/code] exists." +msgstr "" + +#: doc/classes/AStar.xml:266 doc/classes/AStar2D.xml:249 +msgid "" +"Returns whether a point is disabled or not for pathfinding. By default, all " +"points are enabled." +msgstr "" + +#: doc/classes/AStar.xml:275 doc/classes/AStar2D.xml:258 +msgid "" +"Removes the point associated with the given [code]id[/code] from the points " +"pool." +msgstr "" + +#: doc/classes/AStar.xml:284 doc/classes/AStar2D.xml:267 +msgid "" +"Reserves space internally for [code]num_nodes[/code] points, useful if " +"you're adding a known large number of points at once, for a grid for " +"instance. New capacity must be greater or equals to old capacity." +msgstr "" + +#: doc/classes/AStar.xml:295 doc/classes/AStar2D.xml:278 +msgid "" +"Disables or enables the specified point for pathfinding. Useful for making a " +"temporary obstacle." +msgstr "" + +#: doc/classes/AStar.xml:306 doc/classes/AStar2D.xml:289 +msgid "" +"Sets the [code]position[/code] for the point with the given [code]id[/code]." +msgstr "" + +#: doc/classes/AStar.xml:317 doc/classes/AStar2D.xml:300 +msgid "" +"Sets the [code]weight_scale[/code] for the point with the given [code]id[/" +"code]." +msgstr "" + +#: doc/classes/AStar2D.xml:4 +msgid "AStar class representation that uses 2D vectors as edges." +msgstr "" + +#: doc/classes/AStar2D.xml:7 +msgid "" +"This is a wrapper for the [AStar] class which uses 2D vectors instead of 3D " +"vectors." +msgstr "" + +#: doc/classes/AStar2D.xml:20 +msgid "" +"Called when computing the cost between two connected points.\n" +"Note that this function is hidden in the default [code]AStar2D[/code] class." +msgstr "" + +#: doc/classes/AStar2D.xml:32 +msgid "" +"Called when estimating the cost between a point and the path's ending " +"point.\n" +"Note that this function is hidden in the default [code]AStar2D[/code] class." +msgstr "" + +#: doc/classes/AStar2D.xml:46 +msgid "" +"Adds a new point at the given position with the given identifier. The " +"algorithm prefers points with lower [code]weight_scale[/code] to form a " +"path. The [code]id[/code] must be 0 or larger, and the [code]weight_scale[/" +"code] must be 1 or larger.\n" +"[codeblock]\n" +"var astar = AStar2D.new()\n" +"astar.add_point(1, Vector2(1, 0), 4) # Adds the point (1, 0) with " +"weight_scale 4 and id 1\n" +"[/codeblock]\n" +"If there already exists a point for the given [code]id[/code], its position " +"and weight scale are updated to the given values." +msgstr "" + +#: doc/classes/AStar2D.xml:62 +msgid "Returns whether there is a connection/segment between the given points." +msgstr "" + +#: doc/classes/AStar2D.xml:82 +msgid "" +"Creates a segment between the given points. If [code]bidirectional[/code] is " +"[code]false[/code], only movement from [code]id[/code] to [code]to_id[/code] " +"is allowed, not the reverse direction.\n" +"[codeblock]\n" +"var astar = AStar2D.new()\n" +"astar.add_point(1, Vector2(1, 1))\n" +"astar.add_point(2, Vector2(0, 5))\n" +"astar.connect_points(1, 2, false)\n" +"[/codeblock]" +msgstr "" + +#: doc/classes/AStar2D.xml:99 +msgid "Deletes the segment between the given points." +msgstr "" + +#: doc/classes/AStar2D.xml:126 +msgid "" +"Returns the closest position to [code]to_position[/code] that resides inside " +"a segment between two connected points.\n" +"[codeblock]\n" +"var astar = AStar2D.new()\n" +"astar.add_point(1, Vector2(0, 0))\n" +"astar.add_point(2, Vector2(0, 5))\n" +"astar.connect_points(1, 2)\n" +"var res = astar.get_closest_position_in_segment(Vector2(3, 3)) # Returns (0, " +"3)\n" +"[/codeblock]\n" +"The result is in the segment that goes from [code]y = 0[/code] to [code]y = " +"5[/code]. It's the closest position in the segment to the given point." +msgstr "" + +#: doc/classes/AStar2D.xml:145 +msgid "" +"Returns an array with the IDs of the points that form the path found by " +"AStar2D between the given points. The array is ordered from the starting " +"point to the ending point of the path.\n" +"[codeblock]\n" +"var astar = AStar2D.new()\n" +"astar.add_point(1, Vector2(0, 0))\n" +"astar.add_point(2, Vector2(0, 1), 1) # Default weight is 1\n" +"astar.add_point(3, Vector2(1, 1))\n" +"astar.add_point(4, Vector2(2, 0))\n" +"\n" +"astar.connect_points(1, 2, false)\n" +"astar.connect_points(2, 3, false)\n" +"astar.connect_points(4, 3, false)\n" +"astar.connect_points(1, 4, false)\n" +"\n" +"var res = astar.get_id_path(1, 3) # Returns [1, 2, 3]\n" +"[/codeblock]\n" +"If you change the 2nd point's weight to 3, then the result will be [code][1, " +"4, 3][/code] instead, because now even though the distance is longer, it's " +"\"easier\" to get through point 4 than through point 2." +msgstr "" + +#: doc/classes/AStar2D.xml:176 +msgid "" +"Returns an array with the IDs of the points that form the connection with " +"the given point.\n" +"[codeblock]\n" +"var astar = AStar2D.new()\n" +"astar.add_point(1, Vector2(0, 0))\n" +"astar.add_point(2, Vector2(0, 1))\n" +"astar.add_point(3, Vector2(1, 1))\n" +"astar.add_point(4, Vector2(2, 0))\n" +"\n" +"astar.connect_points(1, 2, true)\n" +"astar.connect_points(1, 3, true)\n" +"\n" +"var neighbors = astar.get_point_connections(1) # Returns [2, 3]\n" +"[/codeblock]" +msgstr "" + +#: doc/classes/AStar2D.xml:206 +msgid "" +"Returns an array with the points that are in the path found by AStar2D " +"between the given points. The array is ordered from the starting point to " +"the ending point of the path." +msgstr "" + +#: doc/classes/AtlasTexture.xml:4 +msgid "" +"Packs multiple small textures in a single, bigger one. Helps to optimize " +"video memory costs and render calls." +msgstr "" + +#: doc/classes/AtlasTexture.xml:7 +msgid "" +"[Texture2D] resource aimed at managing big textures files that pack multiple " +"smaller textures. Consists of a [Texture2D], a margin that defines the " +"border width, and a region that defines the actual area of the AtlasTexture." +msgstr "" + +#: doc/classes/AtlasTexture.xml:15 +msgid "The texture that contains the atlas. Can be any [Texture2D] subtype." +msgstr "" + +#: doc/classes/AtlasTexture.xml:18 +msgid "" +"If [code]true[/code], clips the area outside of the region to avoid bleeding " +"of the surrounding texture pixels." +msgstr "" + +#: doc/classes/AtlasTexture.xml:21 +msgid "" +"The margin around the region. The [Rect2]'s [member Rect2.size] parameter " +"(\"w\" and \"h\" in the editor) resizes the texture so it fits within the " +"margin." +msgstr "" + +#: doc/classes/AtlasTexture.xml:24 +msgid "The AtlasTexture's used region." +msgstr "" + +#: doc/classes/AudioBusLayout.xml:4 +msgid "Stores information about the audio buses." +msgstr "" + +#: doc/classes/AudioBusLayout.xml:7 +msgid "" +"Stores position, muting, solo, bypass, effects, effect position, volume, and " +"the connections between buses. See [AudioServer] for usage." +msgstr "" + +#: doc/classes/AudioEffect.xml:4 +msgid "Audio effect for audio." +msgstr "" + +#: doc/classes/AudioEffect.xml:7 +msgid "" +"Base resource for audio bus. Applies an audio effect on the bus that the " +"resource is applied on." +msgstr "" + +#: doc/classes/AudioEffectAmplify.xml:4 +msgid "" +"Adds an amplifying audio effect to an audio bus.\n" +"Increases or decreases the volume of the selected audio bus." +msgstr "" + +#: doc/classes/AudioEffectAmplify.xml:8 +msgid "Increases or decreases the volume being routed through the audio bus." +msgstr "" + +#: doc/classes/AudioEffectAmplify.xml:16 +msgid "" +"Amount of amplification in decibels. Positive values make the sound louder, " +"negative values make it quieter. Value can range from -80 to 24." +msgstr "" + +#: doc/classes/AudioEffectBandLimitFilter.xml:4 +msgid "Adds a band limit filter to the audio bus." +msgstr "" + +#: doc/classes/AudioEffectBandLimitFilter.xml:7 +msgid "" +"Limits the frequencies in a range around the [member AudioEffectFilter." +"cutoff_hz] and allows frequencies outside of this range to pass." +msgstr "" + +#: doc/classes/AudioEffectBandPassFilter.xml:4 +msgid "Adds a band pass filter to the audio bus." +msgstr "" + +#: doc/classes/AudioEffectBandPassFilter.xml:7 +msgid "" +"Attenuates the frequencies inside of a range around the [member " +"AudioEffectFilter.cutoff_hz] and cuts frequencies outside of this band." +msgstr "" + +#: doc/classes/AudioEffectChorus.xml:4 +msgid "Adds a chorus audio effect." +msgstr "" + +#: doc/classes/AudioEffectChorus.xml:7 +msgid "" +"Adds a chorus audio effect. The effect applies a filter with voices to " +"duplicate the audio source and manipulate it through the filter." +msgstr "" + +#: doc/classes/AudioEffectChorus.xml:123 +msgid "The effect's raw signal." +msgstr "" + +#: doc/classes/AudioEffectChorus.xml:126 doc/classes/AudioEffectChorus.xml:144 +#: doc/classes/AudioEffectChorus.xml:162 doc/classes/AudioEffectChorus.xml:180 +msgid "The voice's cutoff frequency." +msgstr "" + +#: doc/classes/AudioEffectChorus.xml:129 doc/classes/AudioEffectChorus.xml:147 +#: doc/classes/AudioEffectChorus.xml:165 doc/classes/AudioEffectChorus.xml:183 +msgid "The voice's signal delay." +msgstr "" + +#: doc/classes/AudioEffectChorus.xml:132 doc/classes/AudioEffectChorus.xml:150 +#: doc/classes/AudioEffectChorus.xml:168 doc/classes/AudioEffectChorus.xml:186 +msgid "The voice filter's depth." +msgstr "" + +#: doc/classes/AudioEffectChorus.xml:135 doc/classes/AudioEffectChorus.xml:153 +#: doc/classes/AudioEffectChorus.xml:171 doc/classes/AudioEffectChorus.xml:189 +msgid "The voice's volume." +msgstr "" + +#: doc/classes/AudioEffectChorus.xml:138 doc/classes/AudioEffectChorus.xml:156 +#: doc/classes/AudioEffectChorus.xml:174 doc/classes/AudioEffectChorus.xml:192 +msgid "The voice's pan level." +msgstr "" + +#: doc/classes/AudioEffectChorus.xml:141 doc/classes/AudioEffectChorus.xml:159 +#: doc/classes/AudioEffectChorus.xml:177 doc/classes/AudioEffectChorus.xml:195 +msgid "The voice's filter rate." +msgstr "" + +#: doc/classes/AudioEffectChorus.xml:198 +msgid "The amount of voices in the effect." +msgstr "" + +#: doc/classes/AudioEffectChorus.xml:201 +msgid "The effect's processed signal." +msgstr "" + +#: doc/classes/AudioEffectCompressor.xml:4 +msgid "" +"Adds a compressor audio effect to an audio bus.\n" +"Reduces sounds that exceed a certain threshold level, smooths out the " +"dynamics and increases the overall volume." +msgstr "" + +#: doc/classes/AudioEffectCompressor.xml:8 +msgid "" +"Dynamic range compressor reduces the level of the sound when the amplitude " +"goes over a certain threshold in Decibels. One of the main uses of a " +"compressor is to increase the dynamic range by clipping as little as " +"possible (when sound goes over 0dB).\n" +"Compressor has many uses in the mix:\n" +"- In the Master bus to compress the whole output (although an " +"[AudioEffectLimiter] is probably better).\n" +"- In voice channels to ensure they sound as balanced as possible.\n" +"- Sidechained. This can reduce the sound level sidechained with another " +"audio bus for threshold detection. This technique is common in video game " +"mixing to the level of music and SFX while voices are being heard.\n" +"- Accentuates transients by using a wider attack, making effects sound more " +"punchy." +msgstr "" + +#: doc/classes/AudioEffectCompressor.xml:21 +msgid "" +"Compressor's reaction time when the signal exceeds the threshold, in " +"microseconds. Value can range from 20 to 2000." +msgstr "" + +#: doc/classes/AudioEffectCompressor.xml:24 +msgid "Gain applied to the output signal." +msgstr "" + +#: doc/classes/AudioEffectCompressor.xml:27 +msgid "" +"Balance between original signal and effect signal. Value can range from 0 " +"(totally dry) to 1 (totally wet)." +msgstr "" + +#: doc/classes/AudioEffectCompressor.xml:30 +msgid "" +"Amount of compression applied to the audio once it passes the threshold " +"level. The higher the ratio, the more the loud parts of the audio will be " +"compressed. Value can range from 1 to 48." +msgstr "" + +#: doc/classes/AudioEffectCompressor.xml:33 +msgid "" +"Compressor's delay time to stop reducing the signal after the signal level " +"falls below the threshold, in milliseconds. Value can range from 20 to 2000." +msgstr "" + +#: doc/classes/AudioEffectCompressor.xml:36 +msgid "Reduce the sound level using another audio bus for threshold detection." +msgstr "" + +#: doc/classes/AudioEffectCompressor.xml:39 +msgid "" +"The level above which compression is applied to the audio. Value can range " +"from -60 to 0." +msgstr "" + +#: doc/classes/AudioEffectDelay.xml:4 +msgid "" +"Adds a delay audio effect to an audio bus. Plays input signal back after a " +"period of time.\n" +"Two tap delay and feedback options." +msgstr "" + +#: doc/classes/AudioEffectDelay.xml:8 +msgid "" +"Plays input signal back after a period of time. The delayed signal may be " +"played back multiple times to create the sound of a repeating, decaying " +"echo. Delay effects range from a subtle echo effect to a pronounced blending " +"of previous sounds with new sounds." +msgstr "" + +#: doc/classes/AudioEffectDelay.xml:16 +msgid "" +"Output percent of original sound. At 0, only delayed sounds are output. " +"Value can range from 0 to 1." +msgstr "" + +#: doc/classes/AudioEffectDelay.xml:19 +msgid "If [code]true[/code], feedback is enabled." +msgstr "" + +#: doc/classes/AudioEffectDelay.xml:22 +msgid "Feedback delay time in milliseconds." +msgstr "" + +#: doc/classes/AudioEffectDelay.xml:25 doc/classes/AudioEffectDelay.xml:37 +msgid "Sound level for [code]tap1[/code]." +msgstr "" + +#: doc/classes/AudioEffectDelay.xml:28 +msgid "" +"Low-pass filter for feedback, in Hz. Frequencies below this value are " +"filtered out of the source signal." +msgstr "" + +#: doc/classes/AudioEffectDelay.xml:31 +msgid "If [code]true[/code], [code]tap1[/code] will be enabled." +msgstr "" + +#: doc/classes/AudioEffectDelay.xml:34 +msgid "[code]tap1[/code] delay time in milliseconds." +msgstr "" + +#: doc/classes/AudioEffectDelay.xml:40 +msgid "" +"Pan position for [code]tap1[/code]. Value can range from -1 (fully left) to " +"1 (fully right)." +msgstr "" + +#: doc/classes/AudioEffectDelay.xml:43 +msgid "If [code]true[/code], [code]tap2[/code] will be enabled." +msgstr "" + +#: doc/classes/AudioEffectDelay.xml:46 +msgid "[b]Tap2[/b] delay time in milliseconds." +msgstr "" + +#: doc/classes/AudioEffectDelay.xml:49 +msgid "Sound level for [code]tap2[/code]." +msgstr "" + +#: doc/classes/AudioEffectDelay.xml:52 +msgid "" +"Pan position for [code]tap2[/code]. Value can range from -1 (fully left) to " +"1 (fully right)." +msgstr "" + +#: doc/classes/AudioEffectDistortion.xml:4 +msgid "" +"Adds a distortion audio effect to an Audio bus.\n" +"Modify the sound to make it dirty." +msgstr "" + +#: doc/classes/AudioEffectDistortion.xml:8 +msgid "" +"Modify the sound and make it dirty. Different types are available: clip, " +"tan, lo-fi (bit crushing), overdrive, or waveshape.\n" +"By distorting the waveform the frequency content change, which will often " +"make the sound \"crunchy\" or \"abrasive\". For games, it can simulate sound " +"coming from some saturated device or speaker very efficiently." +msgstr "" + +#: doc/classes/AudioEffectDistortion.xml:17 +msgid "Distortion power. Value can range from 0 to 1." +msgstr "" + +#: doc/classes/AudioEffectDistortion.xml:20 +msgid "" +"High-pass filter, in Hz. Frequencies higher than this value will not be " +"affected by the distortion. Value can range from 1 to 20000." +msgstr "" + +#: doc/classes/AudioEffectDistortion.xml:23 +msgid "Distortion type." +msgstr "" + +#: doc/classes/AudioEffectDistortion.xml:26 +msgid "" +"Increases or decreases the volume after the effect. Value can range from -80 " +"to 24." +msgstr "" + +#: doc/classes/AudioEffectDistortion.xml:29 +msgid "" +"Increases or decreases the volume before the effect. Value can range from " +"-60 to 60." +msgstr "" + +#: doc/classes/AudioEffectDistortion.xml:34 +msgid "" +"Digital distortion effect which cuts off peaks at the top and bottom of the " +"waveform." +msgstr "" + +#: doc/classes/AudioEffectDistortion.xml:39 +msgid "" +"Low-resolution digital distortion effect. You can use it to emulate the " +"sound of early digital audio devices." +msgstr "" + +#: doc/classes/AudioEffectDistortion.xml:42 +msgid "" +"Emulates the warm distortion produced by a field effect transistor, which is " +"commonly used in solid-state musical instrument amplifiers." +msgstr "" + +#: doc/classes/AudioEffectDistortion.xml:45 +msgid "" +"Waveshaper distortions are used mainly by electronic musicians to achieve an " +"extra-abrasive sound." +msgstr "" + +#: doc/classes/AudioEffectEQ.xml:4 +msgid "" +"Base class for audio equalizers. Gives you control over frequencies.\n" +"Use it to create a custom equalizer if [AudioEffectEQ6], [AudioEffectEQ10] " +"or [AudioEffectEQ21] don't fit your needs." +msgstr "" + +#: doc/classes/AudioEffectEQ.xml:8 +msgid "" +"AudioEffectEQ gives you control over frequencies. Use it to compensate for " +"existing deficiencies in audio. AudioEffectEQs are useful on the Master bus " +"to completely master a mix and give it more character. They are also useful " +"when a game is run on a mobile device, to adjust the mix to that kind of " +"speakers (it can be added but disabled when headphones are plugged)." +msgstr "" + +#: doc/classes/AudioEffectEQ.xml:17 +msgid "Returns the number of bands of the equalizer." +msgstr "" + +#: doc/classes/AudioEffectEQ.xml:26 +msgid "Returns the band's gain at the specified index, in dB." +msgstr "" + +#: doc/classes/AudioEffectEQ.xml:37 +msgid "Sets band's gain at the specified index, in dB." +msgstr "" + +#: doc/classes/AudioEffectEQ10.xml:4 +msgid "" +"Adds a 10-band equalizer audio effect to an Audio bus. Gives you control " +"over frequencies from 31 Hz to 16000 Hz.\n" +"Each frequency can be modulated between -60/+24 dB." +msgstr "" + +#: doc/classes/AudioEffectEQ10.xml:8 +msgid "" +"Frequency bands:\n" +"Band 1: 31 Hz\n" +"Band 2: 62 Hz\n" +"Band 3: 125 Hz\n" +"Band 4: 250 Hz\n" +"Band 5: 500 Hz\n" +"Band 6: 1000 Hz\n" +"Band 7: 2000 Hz\n" +"Band 8: 4000 Hz\n" +"Band 9: 8000 Hz\n" +"Band 10: 16000 Hz\n" +"See also [AudioEffectEQ], [AudioEffectEQ6], [AudioEffectEQ21]." +msgstr "" + +#: doc/classes/AudioEffectEQ21.xml:4 +msgid "" +"Adds a 21-band equalizer audio effect to an Audio bus. Gives you control " +"over frequencies from 22 Hz to 22000 Hz.\n" +"Each frequency can be modulated between -60/+24 dB." +msgstr "" + +#: doc/classes/AudioEffectEQ21.xml:8 +msgid "" +"Frequency bands:\n" +"Band 1: 22 Hz\n" +"Band 2: 32 Hz\n" +"Band 3: 44 Hz\n" +"Band 4: 63 Hz\n" +"Band 5: 90 Hz\n" +"Band 6: 125 Hz\n" +"Band 7: 175 Hz\n" +"Band 8: 250 Hz\n" +"Band 9: 350 Hz\n" +"Band 10: 500 Hz\n" +"Band 11: 700 Hz\n" +"Band 12: 1000 Hz\n" +"Band 13: 1400 Hz\n" +"Band 14: 2000 Hz\n" +"Band 15: 2800 Hz\n" +"Band 16: 4000 Hz\n" +"Band 17: 5600 Hz\n" +"Band 18: 8000 Hz\n" +"Band 19: 11000 Hz\n" +"Band 20: 16000 Hz\n" +"Band 21: 22000 Hz\n" +"See also [AudioEffectEQ], [AudioEffectEQ6], [AudioEffectEQ10]." +msgstr "" + +#: doc/classes/AudioEffectEQ6.xml:4 +msgid "" +"Adds a 6-band equalizer audio effect to an Audio bus. Gives you control over " +"frequencies from 32 Hz to 10000 Hz.\n" +"Each frequency can be modulated between -60/+24 dB." +msgstr "" + +#: doc/classes/AudioEffectEQ6.xml:8 +msgid "" +"Frequency bands:\n" +"Band 1: 32 Hz\n" +"Band 2: 100 Hz\n" +"Band 3: 320 Hz\n" +"Band 4: 1000 Hz\n" +"Band 5: 3200 Hz\n" +"Band 6: 10000 Hz\n" +"See also [AudioEffectEQ], [AudioEffectEQ10], [AudioEffectEQ21]." +msgstr "" + +#: doc/classes/AudioEffectFilter.xml:4 +msgid "Adds a filter to the audio bus." +msgstr "" + +#: doc/classes/AudioEffectFilter.xml:7 +msgid "Allows frequencies other than the [member cutoff_hz] to pass." +msgstr "" + +#: doc/classes/AudioEffectFilter.xml:15 +msgid "Threshold frequency for the filter, in Hz." +msgstr "" + +#: doc/classes/AudioEffectFilter.xml:20 +msgid "Gain amount of the frequencies after the filter." +msgstr "" + +#: doc/classes/AudioEffectFilter.xml:23 +msgid "Amount of boost in the overtones near the cutoff frequency." +msgstr "" + +#: doc/classes/AudioEffectHighPassFilter.xml:4 +msgid "Adds a high-pass filter to the Audio Bus." +msgstr "" + +#: doc/classes/AudioEffectHighPassFilter.xml:7 +msgid "" +"Cuts frequencies lower than the [member AudioEffectFilter.cutoff_hz] and " +"allows higher frequencies to pass." +msgstr "" + +#: doc/classes/AudioEffectLimiter.xml:4 +msgid "Adds a soft-clip limiter audio effect to an Audio bus." +msgstr "" + +#: doc/classes/AudioEffectLimiter.xml:7 +msgid "" +"A limiter is similar to a compressor, but it's less flexible and designed to " +"disallow sound going over a given dB threshold. Adding one in the Master bus " +"is always recommended to reduce the effects of clipping.\n" +"Soft clipping starts to reduce the peaks a little below the threshold level " +"and progressively increases its effect as the input level increases such " +"that the threshold is never exceeded." +msgstr "" + +#: doc/classes/AudioEffectLimiter.xml:16 +msgid "" +"The waveform's maximum allowed value, in decibels. Value can range from -20 " +"to -0.1." +msgstr "" + +#: doc/classes/AudioEffectLimiter.xml:19 +msgid "" +"Applies a gain to the limited waves, in decibels. Value can range from 0 to " +"6." +msgstr "" + +#: doc/classes/AudioEffectLimiter.xml:24 +msgid "" +"Threshold from which the limiter begins to be active, in decibels. Value can " +"range from -30 to 0." +msgstr "" + +#: doc/classes/AudioEffectLowPassFilter.xml:4 +msgid "Adds a low-pass filter to the Audio bus." +msgstr "" + +#: doc/classes/AudioEffectLowPassFilter.xml:7 +msgid "" +"Cuts frequencies higher than the [member AudioEffectFilter.cutoff_hz] and " +"allows lower frequencies to pass." +msgstr "" + +#: doc/classes/AudioEffectNotchFilter.xml:4 +msgid "Adds a notch filter to the Audio bus." +msgstr "" + +#: doc/classes/AudioEffectNotchFilter.xml:7 +msgid "" +"Attenuates frequencies in a narrow band around the [member AudioEffectFilter." +"cutoff_hz] and cuts frequencies outside of this range." +msgstr "" + +#: doc/classes/AudioEffectPanner.xml:4 +msgid "Adds a panner audio effect to an Audio bus. Pans sound left or right." +msgstr "" + +#: doc/classes/AudioEffectPanner.xml:7 +msgid "" +"Determines how much of an audio signal is sent to the left and right buses." +msgstr "" + +#: doc/classes/AudioEffectPanner.xml:15 +msgid "Pan position. Value can range from -1 (fully left) to 1 (fully right)." +msgstr "" + +#: doc/classes/AudioEffectPhaser.xml:4 +msgid "" +"Adds a phaser audio effect to an Audio bus.\n" +"Combines the original signal with a copy that is slightly out of phase with " +"the original." +msgstr "" + +#: doc/classes/AudioEffectPhaser.xml:8 +msgid "" +"Combines phase-shifted signals with the original signal. The movement of the " +"phase-shifted signals is controlled using a low-frequency oscillator." +msgstr "" + +#: doc/classes/AudioEffectPhaser.xml:16 +msgid "" +"Governs how high the filter frequencies sweep. Low value will primarily " +"affect bass frequencies. High value can sweep high into the treble. Value " +"can range from 0.1 to 4." +msgstr "" + +#: doc/classes/AudioEffectPhaser.xml:19 +msgid "Output percent of modified sound. Value can range from 0.1 to 0.9." +msgstr "" + +#: doc/classes/AudioEffectPhaser.xml:22 +msgid "" +"Determines the maximum frequency affected by the LFO modulations, in Hz. " +"Value can range from 10 to 10000." +msgstr "" + +#: doc/classes/AudioEffectPhaser.xml:25 +msgid "" +"Determines the minimum frequency affected by the LFO modulations, in Hz. " +"Value can range from 10 to 10000." +msgstr "" + +#: doc/classes/AudioEffectPhaser.xml:28 +msgid "" +"Adjusts the rate in Hz at which the effect sweeps up and down across the " +"frequency range." +msgstr "" + +#: doc/classes/AudioEffectPitchShift.xml:4 +msgid "" +"Adds a pitch-shifting audio effect to an Audio bus.\n" +"Raises or lowers the pitch of original sound." +msgstr "" + +#: doc/classes/AudioEffectPitchShift.xml:8 +msgid "" +"Allows modulation of pitch independently of tempo. All frequencies can be " +"increased/decreased with minimal effect on transients." +msgstr "" + +#: doc/classes/AudioEffectPitchShift.xml:20 +msgid "Pitch value. Can range from 0 (-1 octave) to 16 (+16 octaves)." +msgstr "" + +#: doc/classes/AudioEffectPitchShift.xml:35 +#: doc/classes/AudioEffectSpectrumAnalyzer.xml:31 +msgid "Represents the size of the [enum FFT_Size] enum." +msgstr "" + +#: doc/classes/AudioEffectRecord.xml:4 +msgid "Audio effect used for recording sound from a microphone." +msgstr "" + +#: doc/classes/AudioEffectRecord.xml:9 +msgid "" +"https://docs.godotengine.org/en/latest/tutorials/audio/" +"recording_with_microphone.html" +msgstr "" + +#: doc/classes/AudioEffectRecord.xml:16 +msgid "Returns the recorded sample." +msgstr "" + +#: doc/classes/AudioEffectRecord.xml:23 +msgid "Returns whether the recording is active or not." +msgstr "" + +#: doc/classes/AudioEffectRecord.xml:32 +msgid "" +"If [code]true[/code], the sound will be recorded. Note that restarting the " +"recording will remove the previously recorded sample." +msgstr "" + +#: doc/classes/AudioEffectRecord.xml:38 +msgid "" +"Specifies the format in which the sample will be recorded. See [enum " +"AudioStreamSample.Format] for available formats." +msgstr "" + +#: doc/classes/AudioEffectReverb.xml:4 +msgid "" +"Adds a reverberation audio effect to an Audio bus.\n" +"Simulates the sound of acoustic environments such as rooms, concert halls, " +"caverns, or an open spaces." +msgstr "" + +#: doc/classes/AudioEffectReverb.xml:8 +msgid "" +"Simulates rooms of different sizes. Its parameters can be adjusted to " +"simulate the sound of a specific room." +msgstr "" + +#: doc/classes/AudioEffectReverb.xml:16 +msgid "" +"Defines how reflective the imaginary room's walls are. Value can range from " +"0 to 1." +msgstr "" + +#: doc/classes/AudioEffectReverb.xml:19 +msgid "" +"Output percent of original sound. At 0, only modified sound is outputted. " +"Value can range from 0 to 1." +msgstr "" + +#: doc/classes/AudioEffectReverb.xml:22 +msgid "" +"High-pass filter passes signals with a frequency higher than a certain " +"cutoff frequency and attenuates signals with frequencies lower than the " +"cutoff frequency. Value can range from 0 to 1." +msgstr "" + +#: doc/classes/AudioEffectReverb.xml:25 +msgid "Output percent of predelay. Value can range from 0 to 1." +msgstr "" + +#: doc/classes/AudioEffectReverb.xml:28 +msgid "" +"Time between the original signal and the early reflections of the reverb " +"signal, in milliseconds." +msgstr "" + +#: doc/classes/AudioEffectReverb.xml:31 +msgid "" +"Dimensions of simulated room. Bigger means more echoes. Value can range from " +"0 to 1." +msgstr "" + +#: doc/classes/AudioEffectReverb.xml:34 +msgid "" +"Widens or narrows the stereo image of the reverb tail. 1 means fully widens. " +"Value can range from 0 to 1." +msgstr "" + +#: doc/classes/AudioEffectReverb.xml:37 +msgid "" +"Output percent of modified sound. At 0, only original sound is outputted. " +"Value can range from 0 to 1." +msgstr "" + +#: doc/classes/AudioEffectSpectrumAnalyzerInstance.xml:25 +msgid "Use the average value as magnitude." +msgstr "" + +#: doc/classes/AudioEffectSpectrumAnalyzerInstance.xml:28 +msgid "Use the maximum value as magnitude." +msgstr "" + +#: doc/classes/AudioServer.xml:4 +msgid "Server interface for low-level audio access." +msgstr "" + +#: doc/classes/AudioServer.xml:7 +msgid "" +"[AudioServer] is a low-level server interface for audio access. It is in " +"charge of creating sample data (playable audio) as well as its playback via " +"a voice interface." +msgstr "" + +#: doc/classes/AudioServer.xml:10 +msgid "https://docs.godotengine.org/en/latest/tutorials/audio/audio_buses.html" +msgstr "" + +#: doc/classes/AudioServer.xml:19 +msgid "Adds a bus at [code]at_position[/code]." +msgstr "" + +#: doc/classes/AudioServer.xml:32 +msgid "" +"Adds an [AudioEffect] effect to the bus [code]bus_idx[/code] at " +"[code]at_position[/code]." +msgstr "" + +#: doc/classes/AudioServer.xml:39 +msgid "" +"Name of the current device for audio input (see [method " +"capture_get_device_list])." +msgstr "" + +#: doc/classes/AudioServer.xml:46 +msgid "Returns the names of all audio input devices detected on the system." +msgstr "" + +#: doc/classes/AudioServer.xml:55 +msgid "Sets which audio input device is used for audio capture." +msgstr "" + +#: doc/classes/AudioServer.xml:62 +msgid "Generates an [AudioBusLayout] using the available buses and effects." +msgstr "" + +#: doc/classes/AudioServer.xml:71 +msgid "" +"Returns the amount of channels of the bus at index [code]bus_idx[/code]." +msgstr "" + +#: doc/classes/AudioServer.xml:82 +msgid "" +"Returns the [AudioEffect] at position [code]effect_idx[/code] in bus " +"[code]bus_idx[/code]." +msgstr "" + +#: doc/classes/AudioServer.xml:91 +msgid "Returns the number of effects on the bus at [code]bus_idx[/code]." +msgstr "" + +#: doc/classes/AudioServer.xml:104 +msgid "" +"Returns the [AudioEffectInstance] assigned to the given bus and effect " +"indices (and optionally channel)." +msgstr "" + +#: doc/classes/AudioServer.xml:113 +msgid "Returns the index of the bus with the name [code]bus_name[/code]." +msgstr "" + +#: doc/classes/AudioServer.xml:122 +msgid "Returns the name of the bus with the index [code]bus_idx[/code]." +msgstr "" + +#: doc/classes/AudioServer.xml:133 +msgid "" +"Returns the peak volume of the left speaker at bus index [code]bus_idx[/" +"code] and channel index [code]channel[/code]." +msgstr "" + +#: doc/classes/AudioServer.xml:144 +msgid "" +"Returns the peak volume of the right speaker at bus index [code]bus_idx[/" +"code] and channel index [code]channel[/code]." +msgstr "" + +#: doc/classes/AudioServer.xml:153 +msgid "" +"Returns the name of the bus that the bus at index [code]bus_idx[/code] sends " +"to." +msgstr "" + +#: doc/classes/AudioServer.xml:162 +msgid "Returns the volume of the bus at index [code]bus_idx[/code] in dB." +msgstr "" + +#: doc/classes/AudioServer.xml:169 +msgid "Returns the names of all audio devices detected on the system." +msgstr "" + +#: doc/classes/AudioServer.xml:176 +msgid "Returns the sample rate at the output of the [AudioServer]." +msgstr "" + +#: doc/classes/AudioServer.xml:183 +msgid "Returns the audio driver's output latency." +msgstr "" + +#: doc/classes/AudioServer.xml:190 +msgid "Returns the speaker configuration." +msgstr "" + +#: doc/classes/AudioServer.xml:197 +msgid "Returns the relative time since the last mix occurred." +msgstr "" + +#: doc/classes/AudioServer.xml:204 +msgid "Returns the relative time until the next mix occurs." +msgstr "" + +#: doc/classes/AudioServer.xml:213 doc/classes/AudioServer.xml:292 +msgid "" +"If [code]true[/code], the bus at index [code]bus_idx[/code] is bypassing " +"effects." +msgstr "" + +#: doc/classes/AudioServer.xml:224 doc/classes/AudioServer.xml:305 +msgid "" +"If [code]true[/code], the effect at index [code]effect_idx[/code] on the bus " +"at index [code]bus_idx[/code] is enabled." +msgstr "" + +#: doc/classes/AudioServer.xml:233 doc/classes/AudioServer.xml:325 +msgid "If [code]true[/code], the bus at index [code]bus_idx[/code] is muted." +msgstr "" + +#: doc/classes/AudioServer.xml:242 doc/classes/AudioServer.xml:358 +msgid "" +"If [code]true[/code], the bus at index [code]bus_idx[/code] is in solo mode." +msgstr "" + +#: doc/classes/AudioServer.xml:249 +msgid "" +"Locks the audio driver's main loop.\n" +"[b]Note:[/b] Remember to unlock it afterwards." +msgstr "" + +#: doc/classes/AudioServer.xml:261 +msgid "" +"Moves the bus from index [code]index[/code] to index [code]to_index[/code]." +msgstr "" + +#: doc/classes/AudioServer.xml:270 +msgid "Removes the bus at index [code]index[/code]." +msgstr "" + +#: doc/classes/AudioServer.xml:281 +msgid "" +"Removes the effect at index [code]effect_idx[/code] from the bus at index " +"[code]bus_idx[/code]." +msgstr "" + +#: doc/classes/AudioServer.xml:314 +msgid "Overwrites the currently used [AudioBusLayout]." +msgstr "" + +#: doc/classes/AudioServer.xml:336 +msgid "" +"Sets the name of the bus at index [code]bus_idx[/code] to [code]name[/code]." +msgstr "" + +#: doc/classes/AudioServer.xml:347 +msgid "" +"Connects the output of the bus at [code]bus_idx[/code] to the bus named " +"[code]send[/code]." +msgstr "" + +#: doc/classes/AudioServer.xml:369 +msgid "" +"Sets the volume of the bus at index [code]bus_idx[/code] to [code]volume_db[/" +"code]." +msgstr "" + +#: doc/classes/AudioServer.xml:382 +msgid "Swaps the position of two effects in bus [code]bus_idx[/code]." +msgstr "" + +#: doc/classes/AudioServer.xml:389 +msgid "" +"Unlocks the audio driver's main loop. (After locking it, you should always " +"unlock it.)" +msgstr "" + +#: doc/classes/AudioServer.xml:395 +msgid "Number of available audio buses." +msgstr "" + +#: doc/classes/AudioServer.xml:398 +msgid "" +"Name of the current device for audio output (see [method get_device_list])." +msgstr "" + +#: doc/classes/AudioServer.xml:401 +msgid "" +"Scales the rate at which audio is played (i.e. setting it to [code]0.5[/" +"code] will make the audio be played twice as fast)." +msgstr "" + +#: doc/classes/AudioServer.xml:407 +msgid "Emitted when the [AudioBusLayout] changes." +msgstr "" + +#: doc/classes/AudioServer.xml:413 +msgid "Two or fewer speakers were detected." +msgstr "" + +#: doc/classes/AudioServer.xml:416 +msgid "A 3.1 channel surround setup was detected." +msgstr "" + +#: doc/classes/AudioServer.xml:419 +msgid "A 5.1 channel surround setup was detected." +msgstr "" + +#: doc/classes/AudioServer.xml:422 +msgid "A 7.1 channel surround setup was detected." +msgstr "" + +#: doc/classes/AudioStream.xml:4 +msgid "Base class for audio streams." +msgstr "" + +#: doc/classes/AudioStream.xml:7 +msgid "" +"Base class for audio streams. Audio streams are used for sound effects and " +"music playback, and support WAV (via [AudioStreamSample]) and OGG (via " +"[AudioStreamOGGVorbis]) file formats." +msgstr "" + +#: doc/classes/AudioStream.xml:10 doc/classes/AudioStreamPlayer.xml:10 +#: doc/classes/AudioStreamPlayer2D.xml:10 +#: doc/classes/AudioStreamPlayer3D.xml:10 +msgid "" +"https://docs.godotengine.org/en/latest/tutorials/audio/audio_streams.html" +msgstr "" + +#: doc/classes/AudioStream.xml:17 +msgid "Returns the length of the audio stream in seconds." +msgstr "" + +#: doc/classes/AudioStreamGenerator.xml:8 +#: doc/classes/AudioStreamGeneratorPlayback.xml:8 +msgid "" +"https://github.com/godotengine/godot-demo-projects/tree/master/audio/" +"generator" +msgstr "" + +#: modules/stb_vorbis/doc_classes/AudioStreamOGGVorbis.xml:4 +#: modules/stb_vorbis/doc_classes/AudioStreamOGGVorbis.xml:7 +msgid "OGG Vorbis audio stream driver." +msgstr "" + +#: modules/stb_vorbis/doc_classes/AudioStreamOGGVorbis.xml:15 +msgid "Contains the audio data in bytes." +msgstr "" + +#: modules/stb_vorbis/doc_classes/AudioStreamOGGVorbis.xml:18 +msgid "" +"If [code]true[/code], the stream will automatically loop when it reaches the " +"end." +msgstr "" + +#: modules/stb_vorbis/doc_classes/AudioStreamOGGVorbis.xml:21 +msgid "Time in seconds at which the stream starts after being looped." +msgstr "" + +#: doc/classes/AudioStreamPlayback.xml:4 +msgid "Meta class for playing back audio." +msgstr "" + +#: doc/classes/AudioStreamPlayback.xml:7 +msgid "" +"Can play, loop, pause a scroll through audio. See [AudioStream] and " +"[AudioStreamOGGVorbis] for usage." +msgstr "" + +#: doc/classes/AudioStreamPlayer.xml:4 +msgid "Plays back audio non-positionally." +msgstr "" + +#: doc/classes/AudioStreamPlayer.xml:7 +msgid "Plays an audio stream non-positionally." +msgstr "" + +#: doc/classes/AudioStreamPlayer.xml:17 +msgid "Returns the position in the [AudioStream] in seconds." +msgstr "" + +#: doc/classes/AudioStreamPlayer.xml:24 +msgid "" +"Returns the [AudioStreamPlayback] object associated with this " +"[AudioStreamPlayer]." +msgstr "" + +#: doc/classes/AudioStreamPlayer.xml:33 +msgid "Plays the audio from the given [code]from_position[/code], in seconds." +msgstr "" + +#: doc/classes/AudioStreamPlayer.xml:42 doc/classes/AudioStreamPlayer2D.xml:42 +#: doc/classes/AudioStreamPlayer3D.xml:42 +msgid "Sets the position from which audio will be played, in seconds." +msgstr "" + +#: doc/classes/AudioStreamPlayer.xml:49 doc/classes/AudioStreamPlayer2D.xml:49 +#: doc/classes/AudioStreamPlayer3D.xml:49 +msgid "Stops the audio." +msgstr "" + +#: doc/classes/AudioStreamPlayer.xml:55 doc/classes/AudioStreamPlayer2D.xml:61 +#: doc/classes/AudioStreamPlayer3D.xml:67 +msgid "If [code]true[/code], audio plays when added to scene tree." +msgstr "" + +#: doc/classes/AudioStreamPlayer.xml:58 doc/classes/AudioStreamPlayer2D.xml:64 +#: doc/classes/AudioStreamPlayer3D.xml:70 +msgid "Bus on which this audio is playing." +msgstr "" + +#: doc/classes/AudioStreamPlayer.xml:61 +msgid "" +"If the audio configuration has more than two speakers, this sets the target " +"channels. See [enum MixTarget] constants." +msgstr "" + +#: doc/classes/AudioStreamPlayer.xml:64 doc/classes/AudioStreamPlayer2D.xml:70 +#: doc/classes/AudioStreamPlayer3D.xml:94 +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 +#: doc/classes/AudioStreamPlayer3D.xml:97 +msgid "If [code]true[/code], audio is playing." +msgstr "" + +#: doc/classes/AudioStreamPlayer.xml:70 doc/classes/AudioStreamPlayer2D.xml:76 +#: doc/classes/AudioStreamPlayer3D.xml:100 +msgid "The [AudioStream] object to be played." +msgstr "" + +#: doc/classes/AudioStreamPlayer.xml:73 doc/classes/AudioStreamPlayer2D.xml:79 +#: doc/classes/AudioStreamPlayer3D.xml:103 +msgid "" +"If [code]true[/code], the playback is paused. You can resume it by setting " +"[code]stream_paused[/code] to [code]false[/code]." +msgstr "" + +#: doc/classes/AudioStreamPlayer.xml:76 +msgid "Volume of sound, in dB." +msgstr "" + +#: doc/classes/AudioStreamPlayer.xml:82 doc/classes/AudioStreamPlayer2D.xml:88 +#: doc/classes/AudioStreamPlayer3D.xml:115 +msgid "Emitted when the audio stops playing." +msgstr "" + +#: doc/classes/AudioStreamPlayer.xml:88 +msgid "The audio will be played only on the first channel." +msgstr "" + +#: doc/classes/AudioStreamPlayer.xml:91 +msgid "The audio will be played on all surround channels." +msgstr "" + +#: doc/classes/AudioStreamPlayer.xml:94 +msgid "" +"The audio will be played on the second channel, which is usually the center." +msgstr "" + +#: doc/classes/AudioStreamPlayer2D.xml:4 +msgid "Plays audio in 2D." +msgstr "" + +#: doc/classes/AudioStreamPlayer2D.xml:7 +msgid "Plays audio that dampens with distance from screen center." +msgstr "" + +#: doc/classes/AudioStreamPlayer2D.xml:17 +#: doc/classes/AudioStreamPlayer3D.xml:17 +msgid "Returns the position in the [AudioStream]." +msgstr "" + +#: doc/classes/AudioStreamPlayer2D.xml:24 +msgid "" +"Returns the [AudioStreamPlayback] object associated with this " +"[AudioStreamPlayer2D]." +msgstr "" + +#: doc/classes/AudioStreamPlayer2D.xml:33 +#: doc/classes/AudioStreamPlayer3D.xml:33 +msgid "" +"Plays the audio from the given position [code]from_position[/code], in " +"seconds." +msgstr "" + +#: doc/classes/AudioStreamPlayer2D.xml:55 +#: doc/classes/AudioStreamPlayer3D.xml:55 +msgid "Areas in which this sound plays." +msgstr "" + +#: doc/classes/AudioStreamPlayer2D.xml:58 +msgid "Dampens audio over distance with this as an exponent." +msgstr "" + +#: doc/classes/AudioStreamPlayer2D.xml:67 +msgid "Maximum distance from which audio is still hearable." +msgstr "" + +#: doc/classes/AudioStreamPlayer2D.xml:82 +msgid "Base volume without dampening." +msgstr "" + +#: doc/classes/AudioStreamPlayer3D.xml:4 +msgid "Plays 3D sound in 3D space." +msgstr "" + +#: doc/classes/AudioStreamPlayer3D.xml:7 +msgid "" +"Plays a sound effect with directed sound effects, dampens with distance if " +"needed, generates effect of hearable position in space." +msgstr "" + +#: doc/classes/AudioStreamPlayer3D.xml:24 +msgid "" +"Returns the [AudioStreamPlayback] object associated with this " +"[AudioStreamPlayer3D]." +msgstr "" + +#: doc/classes/AudioStreamPlayer3D.xml:58 +msgid "Dampens audio above this frequency, in Hz." +msgstr "" + +#: doc/classes/AudioStreamPlayer3D.xml:61 +msgid "Amount how much the filter affects the loudness, in dB." +msgstr "" + +#: doc/classes/AudioStreamPlayer3D.xml:64 +msgid "" +"Decides if audio should get quieter with distance linearly, quadratically, " +"logarithmically, or not be affected by distance, effectively disabling " +"attenuation." +msgstr "" + +#: doc/classes/AudioStreamPlayer3D.xml:73 +msgid "Decides in which step the Doppler effect should be calculated." +msgstr "" + +#: doc/classes/AudioStreamPlayer3D.xml:76 +msgid "The angle in which the audio reaches cameras undampened." +msgstr "" + +#: doc/classes/AudioStreamPlayer3D.xml:79 +msgid "" +"If [code]true[/code], the audio should be dampened according to the " +"direction of the sound." +msgstr "" + +#: doc/classes/AudioStreamPlayer3D.xml:82 +msgid "" +"Dampens audio if camera is outside of [member emission_angle_degrees] and " +"[member emission_angle_enabled] is set by this factor, in dB." +msgstr "" + +#: doc/classes/AudioStreamPlayer3D.xml:85 +msgid "Sets the absolute maximum of the soundlevel, in dB." +msgstr "" + +#: doc/classes/AudioStreamPlayer3D.xml:88 +msgid "" +"Sets the distance from which the [member out_of_range_mode] takes effect. " +"Has no effect if set to 0." +msgstr "" + +#: doc/classes/AudioStreamPlayer3D.xml:91 +msgid "" +"Decides if audio should pause when source is outside of [member " +"max_distance] range." +msgstr "" + +#: doc/classes/AudioStreamPlayer3D.xml:106 +msgid "Base sound level unaffected by dampening, in dB." +msgstr "" + +#: doc/classes/AudioStreamPlayer3D.xml:109 +msgid "Factor for the attenuation effect." +msgstr "" + +#: doc/classes/AudioStreamPlayer3D.xml:121 +msgid "Linear dampening of loudness according to distance." +msgstr "" + +#: doc/classes/AudioStreamPlayer3D.xml:124 +msgid "Squared dampening of loudness according to distance." +msgstr "" + +#: doc/classes/AudioStreamPlayer3D.xml:127 +msgid "Logarithmic dampening of loudness according to distance." +msgstr "" + +#: doc/classes/AudioStreamPlayer3D.xml:130 +msgid "No dampening of loudness according to distance." +msgstr "" + +#: doc/classes/AudioStreamPlayer3D.xml:133 +msgid "Mix this audio in, even when it's out of range." +msgstr "" + +#: doc/classes/AudioStreamPlayer3D.xml:136 +msgid "Pause this audio when it gets out of range." +msgstr "" + +#: doc/classes/AudioStreamPlayer3D.xml:139 +msgid "Disables doppler tracking." +msgstr "" + +#: doc/classes/AudioStreamPlayer3D.xml:142 +msgid "Executes doppler tracking in idle step." +msgstr "" + +#: doc/classes/AudioStreamPlayer3D.xml:145 +msgid "Executes doppler tracking in physics step." +msgstr "" + +#: doc/classes/AudioStreamRandomPitch.xml:4 +msgid "Plays audio with random pitch shifting." +msgstr "" + +#: doc/classes/AudioStreamRandomPitch.xml:7 +msgid "Randomly varies pitch on each start." +msgstr "" + +#: doc/classes/AudioStreamRandomPitch.xml:15 +msgid "The current [AudioStream]." +msgstr "" + +#: doc/classes/AudioStreamRandomPitch.xml:18 +msgid "The intensity of random pitch variation." +msgstr "" + +#: doc/classes/AudioStreamSample.xml:4 +msgid "Stores audio data loaded from WAV files." +msgstr "" + +#: doc/classes/AudioStreamSample.xml:7 +msgid "" +"AudioStreamSample stores sound samples loaded from WAV files. To play the " +"stored sound, use an [AudioStreamPlayer] (for non-positional audio) or " +"[AudioStreamPlayer2D]/[AudioStreamPlayer3D] (for positional audio). The " +"sound can be looped.\n" +"This class can also be used to store dynamically-generated PCM audio data." +msgstr "" + +#: doc/classes/AudioStreamSample.xml:19 +msgid "" +"Saves the AudioStreamSample as a WAV file to [code]path[/code]. Samples with " +"IMA ADPCM format can't be saved.\n" +"[b]Note:[/b] A [code].wav[/code] extension is automatically appended to " +"[code]path[/code] if it is missing." +msgstr "" + +#: doc/classes/AudioStreamSample.xml:26 +msgid "" +"Contains the audio data in bytes.\n" +"[b]Note:[/b] This property expects signed PCM8 data. To convert unsigned " +"PCM8 to signed PCM8, subtract 128 from each byte." +msgstr "" + +#: doc/classes/AudioStreamSample.xml:30 +msgid "Audio format. See [enum Format] constants for values." +msgstr "" + +#: doc/classes/AudioStreamSample.xml:33 +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 "" +"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 "" +"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 +msgid "The sample rate for mixing this audio." +msgstr "" + +#: doc/classes/AudioStreamSample.xml:45 +msgid "If [code]true[/code], audio is stereo." +msgstr "" + +#: doc/classes/AudioStreamSample.xml:50 +msgid "8-bit audio codec." +msgstr "" + +#: doc/classes/AudioStreamSample.xml:53 +msgid "16-bit audio codec." +msgstr "" + +#: doc/classes/AudioStreamSample.xml:56 +msgid "Audio is compressed using IMA ADPCM." +msgstr "" + +#: doc/classes/AudioStreamSample.xml:59 +msgid "Audio does not loop." +msgstr "" + +#: doc/classes/AudioStreamSample.xml:62 +msgid "" +"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], " +"playing back and forth." +msgstr "" + +#: doc/classes/AudioStreamSample.xml:68 +msgid "" +"Audio loops the data between [member loop_begin] and [member loop_end], " +"playing backward only." +msgstr "" + +#: doc/classes/BackBufferCopy.xml:4 +msgid "" +"Copies a region of the screen (or the whole screen) to a buffer so it can be " +"accessed in your shader scripts through the " +"[code]texture(SCREEN_TEXTURE, ...)[/code] function." +msgstr "" + +#: doc/classes/BackBufferCopy.xml:7 +msgid "" +"Node for back-buffering the currently-displayed screen. The region defined " +"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.\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:16 +msgid "Buffer mode. See [enum CopyMode] constants." +msgstr "" + +#: 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: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:27 +msgid "BackBufferCopy buffers a rectangular region." +msgstr "" + +#: doc/classes/BackBufferCopy.xml:30 +msgid "BackBufferCopy buffers the entire screen." +msgstr "" + +#: doc/classes/BaseButton.xml:4 +msgid "Base class for different kinds of buttons." +msgstr "" + +#: doc/classes/BaseButton.xml:7 +msgid "" +"BaseButton is the abstract base class for buttons, so it shouldn't be used " +"directly (it doesn't display anything). Other types of buttons inherit from " +"it." +msgstr "" + +#: doc/classes/BaseButton.xml:16 +msgid "Called when the button is pressed." +msgstr "" + +#: doc/classes/BaseButton.xml:25 +msgid "" +"Called when the button is toggled (only if [member toggle_mode] is active)." +msgstr "" + +#: doc/classes/BaseButton.xml:32 +msgid "" +"Returns the visual state used to draw the button. This is useful mainly when " +"implementing your own draw code by either overriding _draw() or connecting " +"to \"draw\" signal. The visual state of the button is defined by the [enum " +"DrawMode] enum." +msgstr "" + +#: doc/classes/BaseButton.xml:39 +msgid "" +"Returns [code]true[/code] if the mouse has entered the button and has not " +"left it yet." +msgstr "" + +#: doc/classes/BaseButton.xml:45 +msgid "" +"Determines when the button is considered clicked, one of the [enum " +"ActionMode] constants." +msgstr "" + +#: doc/classes/BaseButton.xml:48 +msgid "" +"Binary mask to choose which mouse buttons this button will respond to.\n" +"To allow both left-click and right-click, use [code]BUTTON_MASK_LEFT | " +"BUTTON_MASK_RIGHT[/code]." +msgstr "" + +#: doc/classes/BaseButton.xml:52 +msgid "" +"If [code]true[/code], the button is in disabled state and can't be clicked " +"or toggled." +msgstr "" + +#: doc/classes/BaseButton.xml:55 +msgid "" +"Focus access mode to use when switching between enabled/disabled (see " +"[member Control.focus_mode] and [member disabled])." +msgstr "" + +#: doc/classes/BaseButton.xml:59 +msgid "[ButtonGroup] associated to the button." +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.\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: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:69 +msgid "[ShortCut] associated to the button." +msgstr "" + +#: 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: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:81 +msgid "Emitted when the button starts being held down." +msgstr "" + +#: doc/classes/BaseButton.xml:86 +msgid "Emitted when the button stops being held down." +msgstr "" + +#: 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: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:104 +msgid "" +"The normal state (i.e. not pressed, not hovered, not toggled and enabled) of " +"buttons." +msgstr "" + +#: doc/classes/BaseButton.xml:107 +msgid "The state of buttons are pressed." +msgstr "" + +#: doc/classes/BaseButton.xml:110 +msgid "The state of buttons are hovered." +msgstr "" + +#: doc/classes/BaseButton.xml:113 +msgid "The state of buttons are disabled." +msgstr "" + +#: doc/classes/BaseButton.xml:116 +msgid "The state of buttons are both hovered and pressed." +msgstr "" + +#: doc/classes/BaseButton.xml:119 +msgid "Require just a press to consider the button clicked." +msgstr "" + +#: doc/classes/BaseButton.xml:122 +msgid "" +"Require a press and a subsequent release before considering the button " +"clicked." +msgstr "" + +#: doc/classes/BaseMaterial3D.xml:4 +msgid "Default 3D rendering material." +msgstr "" + +#: doc/classes/BaseMaterial3D.xml:7 +msgid "" +"This provides a default material with a wide variety of rendering features " +"and properties without the need to write shader code. See the tutorial below " +"for details." +msgstr "" + +#: doc/classes/BaseMaterial3D.xml:10 +msgid "" +"https://docs.godotengine.org/en/latest/tutorials/3d/spatial_material.html" +msgstr "" + +#: doc/classes/BaseMaterial3D.xml:19 +msgid "Returns [code]true[/code], if the specified [enum Feature] is enabled." +msgstr "" + +#: doc/classes/BaseMaterial3D.xml:28 +msgid "" +"Returns [code]true[/code], if the specified flag is enabled. See [enum " +"Flags] enumerator for options." +msgstr "" + +#: doc/classes/BaseMaterial3D.xml:37 +msgid "" +"Returns the [Texture] associated with the specified [enum TextureParam]." +msgstr "" + +#: doc/classes/BaseMaterial3D.xml:48 +msgid "" +"If [code]true[/code], enables the specified [enum Feature]. Many features " +"that are available in [BaseMaterial3D]s need to be enabled before use. This " +"way the cost for using the feature is only incurred when specified. Features " +"can also be enabled by setting the corresponding member to [code]true[/code]." +msgstr "" + +#: doc/classes/BaseMaterial3D.xml:59 +msgid "" +"If [code]true[/code], enables the specified flag. Flags are optional " +"behavior that can be turned on and off. Only one flag can be enabled at a " +"time with this function, the flag enumerators cannot be bit-masked together " +"to enable or disable multiple flags at once. Flags can also be enabled by " +"setting the corresponding member to [code]true[/code]. See [enum Flags] " +"enumerator for options." +msgstr "" + +#: doc/classes/BaseMaterial3D.xml:70 +msgid "" +"Sets the texture for the slot specified by [code]param[/code]. See [enum " +"TextureParam] for available slots." +msgstr "" + +#: doc/classes/BaseMaterial3D.xml:76 +msgid "The material's base color." +msgstr "" + +#: doc/classes/BaseMaterial3D.xml:79 +msgid "" +"Forces a conversion of the [member albedo_texture] from sRGB space to linear " +"space." +msgstr "" + +#: doc/classes/BaseMaterial3D.xml:82 +msgid "" +"Texture to multiply by [member albedo_color]. Used for basic texturing of " +"objects." +msgstr "" + +#: doc/classes/BaseMaterial3D.xml:85 +msgid "Threshold at which the alpha scissor will discard values." +msgstr "" + +#: doc/classes/BaseMaterial3D.xml:88 +msgid "The strength of the anisotropy effect." +msgstr "" + +#: doc/classes/BaseMaterial3D.xml:91 +msgid "" +"If [code]true[/code], anisotropy is enabled. Changes the shape of the " +"specular blob and aligns it to tangent space. Mesh tangents are needed for " +"this to work. If the mesh does not contain tangents the anisotropy effect " +"will appear broken." +msgstr "" + +#: doc/classes/BaseMaterial3D.xml:94 +msgid "Texture that offsets the tangent map for anisotropy calculations." +msgstr "" + +#: doc/classes/BaseMaterial3D.xml:97 +msgid "" +"If [code]true[/code], ambient occlusion is enabled. Ambient occlusion " +"darkens areas based on the [member ao_texture]." +msgstr "" + +#: doc/classes/BaseMaterial3D.xml:100 +msgid "" +"Amount that ambient occlusion affects lighting from lights. If [code]0[/" +"code], ambient occlusion only affects ambient light. If [code]1[/code], " +"ambient occlusion affects lights just as much as it affects ambient light. " +"This can be used to impact the strength of the ambient occlusion effect, but " +"typically looks unrealistic." +msgstr "" + +#: doc/classes/BaseMaterial3D.xml:103 +msgid "" +"If [code]true[/code], use [code]UV2[/code] coordinates to look up from the " +"[member ao_texture]." +msgstr "" + +#: doc/classes/BaseMaterial3D.xml:106 +msgid "" +"Texture that defines the amount of ambient occlusion for a given point on " +"the object." +msgstr "" + +#: 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 " +"information for multiple effects in a single texture. For example if you " +"stored metallic in the red channel, roughness in the blue, and ambient " +"occlusion in the green you could reduce the number of textures you use." +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:124 +msgid "Controls how the object faces the camera. See [enum BillboardMode]." +msgstr "" + +#: 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: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:134 +msgid "" +"If [code]true[/code], clearcoat rendering is enabled. Adds a secondary " +"transparent pass to the lighting calculation resulting in an added specular " +"blob. This makes materials appear as if they have a clear layer on them that " +"can be either glossy or rough." +msgstr "" + +#: 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: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:143 +msgid "" +"Which side of the object is not drawn when backfaces are rendered. See [enum " +"CullMode]." +msgstr "" + +#: doc/classes/BaseMaterial3D.xml:146 +msgid "" +"Determines when depth rendering takes place. See [enum DepthDrawMode]. See " +"also [member transparency]." +msgstr "" + +#: doc/classes/BaseMaterial3D.xml:149 +msgid "Texture that specifies the color of the detail overlay." +msgstr "" + +#: 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: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 " +"detail_mask]. This can be used to add variation to objects, or to blend " +"between two different albedo/normal textures." +msgstr "" + +#: 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:161 +msgid "Texture that specifies the per-pixel normal of the detail overlay." +msgstr "" + +#: 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:167 +msgid "" +"The algorithm used for diffuse light scattering. See [enum DiffuseMode]." +msgstr "" + +#: doc/classes/BaseMaterial3D.xml:170 +msgid "If [code]true[/code], the object receives no ambient light." +msgstr "" + +#: 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:176 +msgid "Distance at which the object fades fully and is no longer visible." +msgstr "" + +#: 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:182 +msgid "" +"Specifies which type of fade to use. Can be any of the [enum " +"DistanceFadeMode]s." +msgstr "" + +#: doc/classes/BaseMaterial3D.xml:185 +msgid "The emitted light's color. See [member emission_enabled]." +msgstr "" + +#: 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:191 +msgid "The emitted light's strength. See [member emission_enabled]." +msgstr "" + +#: doc/classes/BaseMaterial3D.xml:194 +msgid "Use [code]UV2[/code] to read from the [member emission_texture]." +msgstr "" + +#: 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:200 +msgid "Texture that specifies how much surface emits light at a given point." +msgstr "" + +#: 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:206 +msgid "" +"If [code]true[/code], enables the vertex grow setting. See [member " +"grow_amount]." +msgstr "" + +#: doc/classes/BaseMaterial3D.xml:209 +msgid "Grows object vertices in the direction of their normals." +msgstr "" + +#: 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 " +"reflection. With non-metals, the reflection appears on top of the albedo " +"color. Metals use their albedo as a multiplier to the specular reflection " +"and set the diffuse color to black resulting in a tinted reflection. " +"Materials work better when fully metal or fully non-metal, values between " +"[code]0[/code] and [code]1[/code] should only be used for blending between " +"metal and non-metal sections. To alter the amount of reflection use [member " +"roughness]." +msgstr "" + +#: 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" +"[b]Note:[/b] unlike [member metallic], this is not energy-conserving, so it " +"should be left at [code]0.5[/code] in most cases. See also [member " +"roughness]." +msgstr "" + +#: 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: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 " +"multiple effects in a single texture. For example if you stored metallic in " +"the red channel, roughness in the blue, and ambient occlusion in the green " +"you could reduce the number of textures you use." +msgstr "" + +#: 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:246 +msgid "If [code]true[/code], normal mapping is enabled." +msgstr "" + +#: doc/classes/BaseMaterial3D.xml:249 +msgid "The strength of the normal map's effect." +msgstr "" + +#: 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 " +"read from [code]normal_texture[/code] is oriented around the surface normal " +"provided by the [Mesh]." +msgstr "" + +#: 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: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: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:266 +msgid "The point size in pixels. See [member use_point_size]." +msgstr "" + +#: 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: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: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:278 +msgid "The strength of the refraction effect." +msgstr "" + +#: 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:287 +msgid "Sets the strength of the rim lighting effect." +msgstr "" + +#: 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:293 +msgid "" +"Texture used to set the strength of the rim lighting effect per-pixel. " +"Multiplied by [member rim]." +msgstr "" + +#: 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: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:302 +msgid "" +"Texture used to control the roughness per-pixel. Multiplied by [member " +"roughness]." +msgstr "" + +#: 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 " +"areas are transparent. Useful for overlaying shadows onto a camera feed in " +"AR." +msgstr "" + +#: doc/classes/BaseMaterial3D.xml:314 +msgid "The method for rendering the specular blob. See [enum SpecularMode]." +msgstr "" + +#: 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: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: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:341 +msgid "Filter flags for the texture. See [enum TextureFilter] for options." +msgstr "" + +#: doc/classes/BaseMaterial3D.xml:344 +msgid "Repeat flags for the texture. See [enum TextureFilter] for options." +msgstr "" + +#: 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: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: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: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: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 " +"the orientation of the object's surface to blend between texture " +"coordinates. It reads from the source texture 3 times, once for each axis " +"and then blends between the results based on how closely the pixel aligns " +"with each axis. This is often used for natural features to get a realistic " +"blend of materials. Because triplanar texturing requires many more texture " +"reads per-pixel it is much slower than normal UV texturing. Additionally, " +"because it is blending the texture between the three axes, it is unsuitable " +"when you are trying to achieve crisp texturing." +msgstr "" + +#: 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: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: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: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: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 " +"the orientation of the object's surface to blend between texture " +"coordinates. It reads from the source texture 3 times, once for each axis " +"and then blends between the results based on how closely the pixel aligns " +"with each axis. This is often used for natural features to get a realistic " +"blend of materials. Because triplanar texturing requires many more texture " +"reads per-pixel it is much slower than normal UV texturing. Additionally, " +"because it is blending the texture between the three axes, it is unsuitable " +"when you are trying to achieve crisp texturing." +msgstr "" + +#: 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:384 +msgid "" +"If [code]true[/code], the model's vertex colors are processed as sRGB mode." +msgstr "" + +#: doc/classes/BaseMaterial3D.xml:387 +msgid "If [code]true[/code], the vertex color is used as albedo color." +msgstr "" + +#: doc/classes/BaseMaterial3D.xml:392 +msgid "Texture specifying per-pixel color." +msgstr "" + +#: doc/classes/BaseMaterial3D.xml:395 +msgid "Texture specifying per-pixel metallic value." +msgstr "" + +#: doc/classes/BaseMaterial3D.xml:398 +msgid "Texture specifying per-pixel roughness value." +msgstr "" + +#: doc/classes/BaseMaterial3D.xml:401 +msgid "Texture specifying per-pixel emission color." +msgstr "" + +#: doc/classes/BaseMaterial3D.xml:404 +msgid "Texture specifying per-pixel normal vector." +msgstr "" + +#: doc/classes/BaseMaterial3D.xml:407 +msgid "Texture specifying per-pixel rim value." +msgstr "" + +#: doc/classes/BaseMaterial3D.xml:410 +msgid "Texture specifying per-pixel clearcoat value." +msgstr "" + +#: doc/classes/BaseMaterial3D.xml:413 +msgid "" +"Texture specifying per-pixel flowmap direction for use with [member " +"anisotropy]." +msgstr "" + +#: doc/classes/BaseMaterial3D.xml:416 +msgid "Texture specifying per-pixel ambient occlusion value." +msgstr "" + +#: doc/classes/BaseMaterial3D.xml:419 +msgid "Texture specifying per-pixel height." +msgstr "" + +#: doc/classes/BaseMaterial3D.xml:422 +msgid "Texture specifying per-pixel subsurface scattering." +msgstr "" + +#: 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:431 +msgid "Texture specifying per-pixel refraction strength." +msgstr "" + +#: doc/classes/BaseMaterial3D.xml:434 +msgid "Texture specifying per-pixel detail mask blending value." +msgstr "" + +#: doc/classes/BaseMaterial3D.xml:437 +msgid "Texture specifying per-pixel detail color." +msgstr "" + +#: doc/classes/BaseMaterial3D.xml:440 +msgid "Texture specifying per-pixel detail normal." +msgstr "" + +#: 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: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:452 doc/classes/RenderingServer.xml:3777 +#: doc/classes/Viewport.xml:393 +msgid "" +"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: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:470 +msgid "Use [code]UV[/code] with the detail texture." +msgstr "" + +#: doc/classes/BaseMaterial3D.xml:473 +msgid "Use [code]UV2[/code] with the detail texture." +msgstr "" + +#: doc/classes/BaseMaterial3D.xml:476 +msgid "The material will not use transparency." +msgstr "" + +#: doc/classes/BaseMaterial3D.xml:479 +msgid "The material will use the texture's alpha values for transparency." +msgstr "" + +#: 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:491 +msgid "The object will not receive shadows." +msgstr "" + +#: doc/classes/BaseMaterial3D.xml:494 +msgid "" +"The object will be shaded per pixel. Useful for realistic shading effect." +msgstr "" + +#: 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:500 +msgid "Represents the size of the [enum ShadingMode] enum." +msgstr "" + +#: doc/classes/BaseMaterial3D.xml:503 +msgid "Constant for setting [member emission_enabled]." +msgstr "" + +#: doc/classes/BaseMaterial3D.xml:506 +msgid "Constant for setting [member normal_enabled]." +msgstr "" + +#: doc/classes/BaseMaterial3D.xml:509 +msgid "Constant for setting [member rim_enabled]." +msgstr "" + +#: doc/classes/BaseMaterial3D.xml:512 +msgid "Constant for setting [member clearcoat_enabled]." +msgstr "" + +#: doc/classes/BaseMaterial3D.xml:515 +msgid "Constant for setting [member anisotropy_enabled]." +msgstr "" + +#: doc/classes/BaseMaterial3D.xml:518 +msgid "Constant for setting [member ao_enabled]." +msgstr "" + +#: 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: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:533 +msgid "Constant for setting [member refraction_enabled]." +msgstr "" + +#: doc/classes/BaseMaterial3D.xml:536 +msgid "Constant for setting [member detail_enabled]." +msgstr "" + +#: doc/classes/BaseMaterial3D.xml:539 doc/classes/EditorFeatureProfile.xml:148 +msgid "Represents the size of the [enum Feature] enum." +msgstr "" + +#: 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:545 +msgid "The color of the object is added to the background." +msgstr "" + +#: doc/classes/BaseMaterial3D.xml:548 +msgid "The color of the object is subtracted from the background." +msgstr "" + +#: doc/classes/BaseMaterial3D.xml:551 +msgid "The color of the object is multiplied by the background." +msgstr "" + +#: doc/classes/BaseMaterial3D.xml:554 +msgid "Default depth draw mode. Depth is drawn only for opaque objects." +msgstr "" + +#: doc/classes/BaseMaterial3D.xml:557 +msgid "Depth draw is calculated for both opaque and transparent objects." +msgstr "" + +#: doc/classes/BaseMaterial3D.xml:560 +msgid "No depth draw." +msgstr "" + +#: doc/classes/BaseMaterial3D.xml:563 +msgid "Default cull mode. The back of the object is culled when not visible." +msgstr "" + +#: doc/classes/BaseMaterial3D.xml:566 +msgid "The front of the object is culled when not visible." +msgstr "" + +#: doc/classes/BaseMaterial3D.xml:569 +msgid "No culling is performed." +msgstr "" + +#: 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:575 +msgid "Set [code]ALBEDO[/code] to the per-vertex color specified in the mesh." +msgstr "" + +#: 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: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:584 +msgid "" +"Object is scaled by depth so that it always appears the same size on screen." +msgstr "" + +#: 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: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: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:602 +msgid "" +"Use [code]UV2[/code] coordinates to look up from the [member ao_texture]." +msgstr "" + +#: doc/classes/BaseMaterial3D.xml:605 +msgid "" +"Use [code]UV2[/code] coordinates to look up from the [member " +"emission_texture]." +msgstr "" + +#: doc/classes/BaseMaterial3D.xml:608 +msgid "Forces the shader to convert albedo from sRGB space to linear space." +msgstr "" + +#: doc/classes/BaseMaterial3D.xml:611 +msgid "Disables receiving shadows from other objects." +msgstr "" + +#: doc/classes/BaseMaterial3D.xml:614 +msgid "Disables receiving ambient light." +msgstr "" + +#: doc/classes/BaseMaterial3D.xml:617 +msgid "Enables the shadow to opacity feature." +msgstr "" + +#: 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: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:632 +msgid "Default diffuse scattering algorithm." +msgstr "" + +#: doc/classes/BaseMaterial3D.xml:635 +msgid "Diffuse scattering ignores roughness." +msgstr "" + +#: doc/classes/BaseMaterial3D.xml:638 +msgid "Extends Lambert to cover more than 90 degrees when roughness increases." +msgstr "" + +#: doc/classes/BaseMaterial3D.xml:641 +msgid "Attempts to use roughness to emulate microsurfacing." +msgstr "" + +#: doc/classes/BaseMaterial3D.xml:644 +msgid "Uses a hard cut for lighting, with smoothing affected by roughness." +msgstr "" + +#: doc/classes/BaseMaterial3D.xml:647 +msgid "Default specular blob." +msgstr "" + +#: doc/classes/BaseMaterial3D.xml:650 doc/classes/BaseMaterial3D.xml:653 +msgid "Older specular algorithm, included for compatibility." +msgstr "" + +#: doc/classes/BaseMaterial3D.xml:656 +msgid "Toon blob which changes size based on roughness." +msgstr "" + +#: doc/classes/BaseMaterial3D.xml:659 +msgid "No specular blob." +msgstr "" + +#: doc/classes/BaseMaterial3D.xml:662 +msgid "Billboard mode is disabled." +msgstr "" + +#: doc/classes/BaseMaterial3D.xml:665 +msgid "The object's Z axis will always face the camera." +msgstr "" + +#: doc/classes/BaseMaterial3D.xml:668 +msgid "The object's X axis will always face the camera." +msgstr "" + +#: doc/classes/BaseMaterial3D.xml:671 +msgid "" +"Used for particle systems when assigned to [GPUParticles3D] and " +"[CPUParticles3D] nodes. Enables [code]particles_anim_*[/code] properties.\n" +"The [member ParticlesMaterial.anim_speed] or [member CPUParticles3D." +"anim_speed] should also be set to a positive value for the animation to play." +msgstr "" + +#: doc/classes/BaseMaterial3D.xml:675 +msgid "Used to read from the red channel of a texture." +msgstr "" + +#: doc/classes/BaseMaterial3D.xml:678 +msgid "Used to read from the green channel of a texture." +msgstr "" + +#: doc/classes/BaseMaterial3D.xml:681 +msgid "Used to read from the blue channel of a texture." +msgstr "" + +#: doc/classes/BaseMaterial3D.xml:684 +msgid "Used to read from the alpha channel of a texture." +msgstr "" + +#: doc/classes/BaseMaterial3D.xml:687 +msgid "Currently unused." +msgstr "" + +#: doc/classes/BaseMaterial3D.xml:690 +msgid "Adds the emission color to the color from the emission texture." +msgstr "" + +#: doc/classes/BaseMaterial3D.xml:693 +msgid "Multiplies the emission color by the color from the emission texture." +msgstr "" + +#: doc/classes/BaseMaterial3D.xml:696 +msgid "Do not use distance fade." +msgstr "" + +#: 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: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 " +"smoothly fade without enabling transparency. On certain hardware this can be " +"faster than [constant DISTANCE_FADE_PIXEL_ALPHA]." +msgstr "" + +#: 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 " +"smoothly fade without enabling transparency. On certain hardware this can be " +"faster than [constant DISTANCE_FADE_PIXEL_ALPHA]." +msgstr "" + +#: doc/classes/Basis.xml:4 +msgid "3×3 matrix datatype." +msgstr "" + +#: doc/classes/Basis.xml:7 +msgid "" +"3×3 matrix used for 3D rotation and scale. Contains 3 vector fields X, Y and " +"Z as its columns, which can be interpreted as the local basis vectors of a " +"transformation. Can also be accessed as array of 3D vectors. These vectors " +"are orthogonal to each other, but are not necessarily normalized (due to " +"scaling). Almost always used as an orthogonal basis for a [Transform].\n" +"For such use, it is composed of a scaling and a rotation matrix, in that " +"order (M = R.S)." +msgstr "" + +#: doc/classes/Basis.xml:11 doc/classes/Transform.xml:11 +msgid "" +"https://docs.godotengine.org/en/latest/tutorials/3d/using_transforms.html" +msgstr "" + +#: doc/classes/Basis.xml:20 +msgid "Create a rotation matrix from the given quaternion." +msgstr "" + +#: doc/classes/Basis.xml:29 +msgid "" +"Create a rotation matrix (in the YXZ convention: first Z, then X, and Y " +"last) from the specified Euler angles, given in the vector format as (X " +"angle, Y angle, Z angle)." +msgstr "" + +#: doc/classes/Basis.xml:40 +msgid "" +"Create a rotation matrix which rotates around the given axis by the " +"specified angle, in radians. The axis must be a normalized vector." +msgstr "" + +#: doc/classes/Basis.xml:53 +msgid "Create a matrix from 3 axis vectors." +msgstr "" + +#: doc/classes/Basis.xml:60 +msgid "Returns the determinant of the matrix." +msgstr "" + +#: doc/classes/Basis.xml:67 +msgid "" +"Returns the basis's rotation in the form of Euler angles (in the YXZ " +"convention: first Z, then X, and Y last). The returned vector contains the " +"rotation angles in the format (X angle, Y angle, Z angle). See [method " +"get_rotation_quat] if you need a quaternion instead." +msgstr "" + +#: doc/classes/Basis.xml:74 +msgid "" +"This function considers a discretization of rotations into 24 points on unit " +"sphere, lying along the vectors (x,y,z) with each component being either -1, " +"0, or 1, and returns the index of the point best representing the " +"orientation of the object. It is mainly used by the grid map editor. For " +"further details, refer to the Godot source code." +msgstr "" + +#: doc/classes/Basis.xml:81 +msgid "" +"Returns the basis's rotation in the form of a quaternion. See [method " +"get_euler] if you need Euler angles, but keep in mind quaternions should " +"generally be preferred to Euler angles." +msgstr "" + +#: doc/classes/Basis.xml:88 +msgid "" +"Assuming that the matrix is the combination of a rotation and scaling, " +"return the absolute value of scaling factors along each axis." +msgstr "" + +#: doc/classes/Basis.xml:95 doc/classes/Transform2D.xml:49 +msgid "Returns the inverse of the matrix." +msgstr "" + +#: doc/classes/Basis.xml:106 +msgid "" +"Returns [code]true[/code] if this basis and [code]b[/code] are approximately " +"equal, by calling [code]is_equal_approx[/code] on each component." +msgstr "" + +#: doc/classes/Basis.xml:113 +msgid "" +"Returns the orthonormalized version of the matrix (useful to call from time " +"to time to avoid rounding error for orthogonal matrices). This performs a " +"Gram-Schmidt orthonormalization on the basis of the matrix." +msgstr "" + +#: doc/classes/Basis.xml:124 +msgid "" +"Introduce an additional rotation around the given axis by phi (radians). The " +"axis must be a normalized vector." +msgstr "" + +#: doc/classes/Basis.xml:133 +msgid "" +"Introduce an additional scaling specified by the given 3D scaling factor." +msgstr "" + +#: doc/classes/Basis.xml:144 +msgid "" +"Assuming that the matrix is a proper rotation matrix, slerp performs a " +"spherical-linear interpolation with another rotation matrix." +msgstr "" + +#: doc/classes/Basis.xml:153 +msgid "Transposed dot product with the X axis of the matrix." +msgstr "" + +#: doc/classes/Basis.xml:162 +msgid "Transposed dot product with the Y axis of the matrix." +msgstr "" + +#: doc/classes/Basis.xml:171 +msgid "Transposed dot product with the Z axis of the matrix." +msgstr "" + +#: doc/classes/Basis.xml:178 +msgid "Returns the transposed version of the matrix." +msgstr "" + +#: doc/classes/Basis.xml:187 +msgid "Returns a vector transformed (multiplied) by the matrix." +msgstr "" + +#: doc/classes/Basis.xml:196 +msgid "" +"Returns a vector transformed (multiplied) by the transposed matrix.\n" +"[b]Note:[/b] This results in a multiplication by the inverse of the matrix " +"only if it represents a rotation-reflection." +msgstr "" + +#: doc/classes/Basis.xml:203 +msgid "The basis matrix's X vector." +msgstr "" + +#: doc/classes/Basis.xml:206 +msgid "The basis matrix's Y vector." +msgstr "" + +#: doc/classes/Basis.xml:209 +msgid "The basis matrix's Z vector." +msgstr "" + +#: doc/classes/Basis.xml:214 +msgid "" +"The identity basis. This is identical to calling [code]Basis()[/code] " +"without any parameters. This constant can be used to make your code clearer." +msgstr "" + +#: doc/classes/Basis.xml:217 +msgid "" +"The basis that will flip something along the X axis when used in a " +"transformation." +msgstr "" + +#: doc/classes/Basis.xml:220 +msgid "" +"The basis that will flip something along the Y axis when used in a " +"transformation." +msgstr "" + +#: doc/classes/Basis.xml:223 +msgid "" +"The basis that will flip something along the Z axis when used in a " +"transformation." +msgstr "" + +#: doc/classes/BitMap.xml:4 +msgid "Boolean matrix." +msgstr "" + +#: doc/classes/BitMap.xml:7 +msgid "" +"A two-dimensional array of boolean values, can be used to efficiently store " +"a binary matrix (every matrix element takes only one bit) and query the " +"values using natural cartesian coordinates." +msgstr "" + +#: doc/classes/BitMap.xml:18 +msgid "" +"Creates a bitmap with the specified size, filled with [code]false[/code]." +msgstr "" + +#: doc/classes/BitMap.xml:29 +msgid "" +"Creates a bitmap that matches the given image dimensions, every element of " +"the bitmap is set to [code]false[/code] if the alpha value of the image at " +"that position is equal to [code]threshold[/code] or less, and [code]true[/" +"code] in other case." +msgstr "" + +#: doc/classes/BitMap.xml:38 +msgid "Returns bitmap's value at the specified position." +msgstr "" + +#: doc/classes/BitMap.xml:45 +msgid "Returns bitmap's dimensions." +msgstr "" + +#: doc/classes/BitMap.xml:52 +msgid "" +"Returns the amount of bitmap elements that are set to [code]true[/code]." +msgstr "" + +#: doc/classes/BitMap.xml:83 +msgid "" +"Sets the bitmap's element at the specified position, to the specified value." +msgstr "" + +#: doc/classes/BitMap.xml:94 +msgid "Sets a rectangular portion of the bitmap to the specified value." +msgstr "" + +#: doc/classes/BitmapFont.xml:4 +msgid "" +"Renders text using fonts under the [url=https://www.angelcode.com/products/" +"bmfont/]BMFont[/url] format.\n" +"Handles files with the [code].fnt[/code] extension." +msgstr "" + +#: doc/classes/BitmapFont.xml:8 +msgid "" +"Renders text using [code]*.fnt[/code] fonts containing texture atlases. " +"Supports distance fields. For using vector font files like TTF directly, see " +"[DynamicFont]." +msgstr "" + +#: doc/classes/BitmapFont.xml:27 +msgid "" +"Adds a character to the font, where [code]character[/code] is the Unicode " +"value, [code]texture[/code] is the texture index, [code]rect[/code] is the " +"region in the texture (in pixels!), [code]align[/code] is the (optional) " +"alignment for the character and [code]advance[/code] is the (optional) " +"advance." +msgstr "" + +#: doc/classes/BitmapFont.xml:40 +msgid "" +"Adds a kerning pair to the [BitmapFont] as a difference. Kerning pairs are " +"special cases where a typeface advance is determined by the next character." +msgstr "" + +#: doc/classes/BitmapFont.xml:49 +msgid "Adds a texture to the [BitmapFont]." +msgstr "" + +#: doc/classes/BitmapFont.xml:56 +msgid "Clears all the font data and settings." +msgstr "" + +#: doc/classes/BitmapFont.xml:65 +msgid "" +"Creates a BitmapFont from the [code]*.fnt[/code] file at [code]path[/code]." +msgstr "" + +#: doc/classes/BitmapFont.xml:76 +msgid "" +"Returns the size of a character, optionally taking kerning into account if " +"the next character is provided." +msgstr "" + +#: doc/classes/BitmapFont.xml:87 +msgid "Returns a kerning pair as a difference." +msgstr "" + +#: doc/classes/BitmapFont.xml:96 +msgid "Returns the font atlas texture at index [code]idx[/code]." +msgstr "" + +#: doc/classes/BitmapFont.xml:103 +msgid "Returns the number of textures in the BitmapFont atlas." +msgstr "" + +#: doc/classes/BitmapFont.xml:109 +msgid "Ascent (number of pixels above the baseline)." +msgstr "" + +#: doc/classes/BitmapFont.xml:112 +msgid "If [code]true[/code], distance field hint is enabled." +msgstr "" + +#: doc/classes/BitmapFont.xml:115 +msgid "The fallback font." +msgstr "" + +#: doc/classes/BitmapFont.xml:118 +msgid "Total font height (ascent plus descent) in pixels." +msgstr "" + +#: doc/classes/Bone2D.xml:4 +msgid "Joint used with [Skeleton2D] to control and animate other nodes." +msgstr "" + +#: doc/classes/Bone2D.xml:7 +msgid "" +"Use a hierarchy of [code]Bone2D[/code] bound to a [Skeleton2D] to control, " +"and animate other [Node2D] nodes.\n" +"You can use [code]Bone2D[/code] and [code]Skeleton2D[/code] nodes to animate " +"2D meshes created with the Polygon 2D UV editor.\n" +"Each bone has a [member rest] transform that you can reset to with [method " +"apply_rest]. These rest poses are relative to the bone's parent.\n" +"If in the editor, you can set the rest pose of an entire skeleton using a " +"menu option, from the code, you need to iterate over the bones to set their " +"individual rest poses." +msgstr "" + +#: doc/classes/Bone2D.xml:19 +msgid "Stores the node's current transforms in [member rest]." +msgstr "" + +#: doc/classes/Bone2D.xml:26 +msgid "" +"Returns the node's index as part of the entire skeleton. See [Skeleton2D]." +msgstr "" + +#: doc/classes/Bone2D.xml:33 +msgid "" +"Returns the node's [member rest] [code]Transform2D[/code] if it doesn't have " +"a parent, or its rest pose relative to its parent." +msgstr "" + +#: doc/classes/Bone2D.xml:39 +msgid "" +"Length of the bone's representation drawn in the editor's viewport in pixels." +msgstr "" + +#: doc/classes/Bone2D.xml:42 +msgid "" +"Rest transform of the bone. You can reset the node's transforms to this " +"value using [method apply_rest]." +msgstr "" + +#: doc/classes/BoneAttachment3D.xml:4 +msgid "A node that will attach to a bone." +msgstr "" + +#: doc/classes/BoneAttachment3D.xml:7 +msgid "" +"This node must be the child of a [Skeleton3D] node. You can then select a " +"bone for this node to attach to. The BoneAttachment3D node will copy the " +"transform of the selected bone." +msgstr "" + +#: doc/classes/BoneAttachment3D.xml:15 +msgid "The name of the attached bone." +msgstr "" + +#: doc/classes/bool.xml:4 +msgid "Boolean built-in type." +msgstr "" + +#: doc/classes/bool.xml:7 +msgid "" +"Boolean is a built-in type. It can represent any data type that is either a " +"true or false value. You can think of it as an switch with on or off (1 or " +"0) setting. It's often used as part of programming logic in condition " +"statements like [code]if[/code] statements.\n" +"[b]Note:[/b] In a code below [code]if can_shoot[/code] is equivalent of " +"[code]if can_shoot == true[/code]. It is good practice to follow the natural " +"spoken language structure when possible. Use [code]if can_shoot[/code] " +"rather than [code]if can_shoot == true[/code] and use [code]if not " +"can_shoot[/code] rather than [code]if can_shoot == false[/code].\n" +"[codeblock]\n" +"var can_shoot = true\n" +"\n" +"func shoot():\n" +" if can_shoot:\n" +" # Perform shooting actions here.\n" +"[/codeblock]\n" +"The following code will only create a bullet if both conditions are met: " +"action \"shoot\" is pressed and if [code]can_shoot[/code] is [code]true[/" +"code].\n" +"[b]Note:[/b] [code]Input.is_action_pressed(\"shoot\")[/code] is also a " +"boolean that is [code]true[/code] when \"shoot\" is pressed and [code]false[/" +"code] when \"shoot\" isn't pressed.\n" +"[codeblock]\n" +"var can_shoot = true\n" +"\n" +"func shoot():\n" +" if can_shoot and Input.is_action_pressed(\"shoot\"):\n" +" create_bullet()\n" +"[/codeblock]\n" +"The following code will set [code]can_shoot[/code] to [code]false[/code] and " +"start a timer. This will prevent player from shooting until the timer runs " +"out. Next [code]can_shoot[/code] will be set to [code]true[/code] again " +"allowing player to shoot once again.\n" +"[codeblock]\n" +"var can_shoot = true\n" +"onready var cool_down = $CoolDownTimer\n" +"\n" +"func shoot():\n" +" if can_shoot and Input.is_action_pressed(\"shoot\"):\n" +" create_bullet()\n" +" can_shoot = false\n" +" cool_down.start()\n" +"\n" +"func _on_CoolDownTimer_timeout():\n" +" can_shoot = true\n" +"[/codeblock]" +msgstr "" + +#: doc/classes/bool.xml:49 +msgid "" +"Cast an [int] value to a boolean value, this method will return [code]true[/" +"code] if called with an integer value different to 0 and [code]false[/code] " +"in other case." +msgstr "" + +#: doc/classes/bool.xml:58 +msgid "" +"Cast a [float] value to a boolean value, this method will return [code]true[/" +"code] if called with a floating-point value different to 0 and [code]false[/" +"code] in other case." +msgstr "" + +#: doc/classes/bool.xml:67 +msgid "" +"Cast a [String] value to a boolean value, this method will return " +"[code]true[/code] if called with a non-empty string and [code]false[/code] " +"in other case. Examples: [code]bool(\"False\")[/code] returns [code]true[/" +"code], [code]bool(\"\")[/code] returns [code]false[/code]." +msgstr "" + +#: doc/classes/BoxContainer.xml:4 +msgid "Base class for box containers." +msgstr "" + +#: doc/classes/BoxContainer.xml:7 +msgid "" +"Arranges child [Control] nodes vertically or horizontally, and rearranges " +"them automatically when their minimum size changes." +msgstr "" + +#: doc/classes/BoxContainer.xml:18 +msgid "" +"Adds a [Control] node to the box as a spacer. If [code]begin[/code] is " +"[code]true[/code], it will insert the [Control] node in front of all other " +"children." +msgstr "" + +#: doc/classes/BoxContainer.xml:24 +msgid "" +"The alignment of the container's children (must be one of [constant " +"ALIGN_BEGIN], [constant ALIGN_CENTER], or [constant ALIGN_END])." +msgstr "" + +#: doc/classes/BoxContainer.xml:29 +msgid "Aligns children with the beginning of the container." +msgstr "" + +#: doc/classes/BoxContainer.xml:32 +msgid "Aligns children with the center of the container." +msgstr "" + +#: doc/classes/BoxContainer.xml:35 +msgid "Aligns children with the end of the container." +msgstr "" + +#: doc/classes/BoxShape3D.xml:4 +msgid "Box shape resource." +msgstr "" + +#: doc/classes/BoxShape3D.xml:7 +msgid "3D box shape that can be a child of a [PhysicsBody3D] or [Area3D]." +msgstr "" + +#: doc/classes/BoxShape3D.xml:15 +msgid "" +"The box's half extents. The width, height and depth of this shape is twice " +"the half extents." +msgstr "" + +#: doc/classes/Button.xml:4 +msgid "Standard themed Button." +msgstr "" + +#: doc/classes/Button.xml:7 +msgid "" +"Button is the standard themed button. It can contain text and an icon, and " +"will display them according to the current [Theme]." +msgstr "" + +#: doc/classes/Button.xml:15 +msgid "" +"Text alignment policy for the button's text, use one of the [enum TextAlign] " +"constants." +msgstr "" + +#: doc/classes/Button.xml:18 +msgid "" +"When this property is enabled, text that is too large to fit the button is " +"clipped, when disabled the Button will always be wide enough to hold the " +"text." +msgstr "" + +#: doc/classes/Button.xml:21 +msgid "" +"When enabled, the button's icon will expand/shrink to fit the button's size " +"while keeping its aspect." +msgstr "" + +#: doc/classes/Button.xml:24 +msgid "Flat buttons don't display decoration." +msgstr "" + +#: doc/classes/Button.xml:27 +msgid "" +"Button's icon, if text is present the icon will be placed before the text." +msgstr "" + +#: doc/classes/Button.xml:30 doc/classes/LinkButton.xml:18 +msgid "The button's text that will be displayed inside the button's area." +msgstr "" + +#: doc/classes/Button.xml:35 +msgid "Align the text to the left." +msgstr "" + +#: doc/classes/Button.xml:38 +msgid "Align the text to the center." +msgstr "" + +#: doc/classes/Button.xml:41 +msgid "Align the text to the right." +msgstr "" + +#: doc/classes/Button.xml:46 +msgid "[StyleBox] used when the [Button] is disabled." +msgstr "" + +#: doc/classes/Button.xml:49 +msgid "" +"[StyleBox] used when the [Button] is focused. It is displayed over the " +"current [StyleBox], so using [StyleBoxEmpty] will just disable the focus " +"visual effect." +msgstr "" + +#: doc/classes/Button.xml:52 +msgid "[Font] of the [Button]'s text." +msgstr "" + +#: doc/classes/Button.xml:55 +msgid "Default text [Color] of the [Button]." +msgstr "" + +#: doc/classes/Button.xml:58 +msgid "Text [Color] used when the [Button] is disabled." +msgstr "" + +#: doc/classes/Button.xml:61 +msgid "Text [Color] used when the [Button] is being hovered." +msgstr "" + +#: doc/classes/Button.xml:64 +msgid "Text [Color] used when the [Button] is being pressed." +msgstr "" + +#: doc/classes/Button.xml:67 +msgid "[StyleBox] used when the [Button] is being hovered." +msgstr "" + +#: doc/classes/Button.xml:70 +msgid "The horizontal space between [Button]'s icon and text." +msgstr "" + +#: doc/classes/Button.xml:73 +msgid "Default [StyleBox] for the [Button]." +msgstr "" + +#: doc/classes/Button.xml:76 +msgid "[StyleBox] used when the [Button] is being pressed." +msgstr "" + +#: doc/classes/ButtonGroup.xml:4 +msgid "Group of Buttons." +msgstr "" + +#: doc/classes/ButtonGroup.xml:7 +msgid "" +"Group of [Button]. All direct and indirect children buttons become radios. " +"Only one allows being pressed.\n" +"[member BaseButton.toggle_mode] should be [code]true[/code]." +msgstr "" + +#: doc/classes/ButtonGroup.xml:17 +msgid "" +"Returns an [Array] of [Button]s who have this as their [ButtonGroup] (see " +"[member BaseButton.group])." +msgstr "" + +#: doc/classes/ButtonGroup.xml:24 +msgid "Returns the current pressed button." +msgstr "" + +#: doc/classes/Callable.xml:4 +msgid "An object representing a method in a certain object that can be called." +msgstr "" + +#: doc/classes/Callable.xml:7 +msgid "" +"[Callable] is a first class object which can be held in variables and passed " +"to functions. It represents a given method in an [Object], and is typically " +"used for signal callbacks.\n" +"[b]Example:[/b]\n" +"[codeblock]\n" +"var callable = Callable(self, \"print_args\")\n" +"func print_args(arg1, arg2, arg3 = \"\"):\n" +" prints(arg1, arg2, arg3)\n" +"func test():\n" +" callable.call(\"hello\", \"world\") # Prints \"hello world\".\n" +" callable.call(Vector2.UP, 42, callable) # Prints \"(0, -1) 42 Node(Node." +"gd)::print_args\".\n" +" callable.call(\"invalid\") # Invalid call, should have at least 2 " +"arguments.\n" +"[/codeblock]" +msgstr "" + +#: doc/classes/Callable.xml:30 +msgid "" +"Creates a new [Callable] for the method called [code]method_name[/code] in " +"the specified [code]object[/code]." +msgstr "" + +#: doc/classes/Callable.xml:37 +msgid "" +"Calls the method represented by this [Callable]. Arguments can be passed and " +"should match the method's signature." +msgstr "" + +#: doc/classes/Callable.xml:44 +msgid "" +"Calls the method represented by this [Callable] in deferred mode, i.e. " +"during the idle frame. Arguments can be passed and should match the method's " +"signature." +msgstr "" + +#: doc/classes/Callable.xml:51 +msgid "Returns the name of the method represented by this [Callable]." +msgstr "" + +#: doc/classes/Callable.xml:58 +msgid "Returns the object on which this [Callable] is called." +msgstr "" + +#: doc/classes/Callable.xml:65 +msgid "" +"Returns the ID of this [Callable]'s object (see [method Object." +"get_instance_id])." +msgstr "" + +#: doc/classes/Camera2D.xml:4 +msgid "Camera node for 2D scenes." +msgstr "" + +#: doc/classes/Camera2D.xml:7 +msgid "" +"Camera node for 2D scenes. It forces the screen (current layer) to scroll " +"following this node. This makes it easier (and faster) to program scrollable " +"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, 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:18 +msgid "Aligns the camera to the tracked node." +msgstr "" + +#: doc/classes/Camera2D.xml:25 +msgid "" +"Removes any [Camera2D] from the ancestor [Viewport]'s internal currently-" +"assigned camera." +msgstr "" + +#: doc/classes/Camera2D.xml:32 +msgid "Forces the camera to update scroll immediately." +msgstr "" + +#: doc/classes/Camera2D.xml:39 +msgid "Returns the camera position." +msgstr "" + +#: doc/classes/Camera2D.xml:46 +msgid "" +"Returns the location of the [Camera2D]'s screen-center, relative to the " +"origin." +msgstr "" + +#: 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: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: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: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: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: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:107 +msgid "The Camera2D's anchor point. See [enum AnchorMode] constants." +msgstr "" + +#: 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: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: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: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: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: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: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: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:134 +msgid "" +"If [code]true[/code], draws the camera's drag margin rectangle in the editor." +msgstr "" + +#: doc/classes/Camera2D.xml:137 +msgid "" +"If [code]true[/code], draws the camera's limits rectangle in the editor." +msgstr "" + +#: doc/classes/Camera2D.xml:140 +msgid "" +"If [code]true[/code], draws the camera's screen rectangle in the editor." +msgstr "" + +#: doc/classes/Camera2D.xml:143 +msgid "" +"Bottom scroll limit in pixels. The camera stops moving when reaching this " +"value." +msgstr "" + +#: doc/classes/Camera2D.xml:146 +msgid "" +"Left scroll limit in pixels. The camera stops moving when reaching this " +"value." +msgstr "" + +#: doc/classes/Camera2D.xml:149 +msgid "" +"Right scroll limit in pixels. The camera stops moving when reaching this " +"value." +msgstr "" + +#: doc/classes/Camera2D.xml:152 +msgid "" +"If [code]true[/code], the camera smoothly stops when reaches its limits." +msgstr "" + +#: doc/classes/Camera2D.xml:155 +msgid "" +"Top scroll limit in pixels. The camera stops moving when reaching this value." +msgstr "" + +#: doc/classes/Camera2D.xml:158 +msgid "" +"The camera's offset, useful for looking around or camera shake animations." +msgstr "" + +#: 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 " +"not updated in any way if drag margins are enabled and can be used to set " +"initial offset." +msgstr "" + +#: 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:169 +msgid "The camera's process callback. See [enum Camera2DProcessMode]." +msgstr "" + +#: doc/classes/Camera2D.xml:172 +msgid "If [code]true[/code], the camera rotates with the target." +msgstr "" + +#: 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: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: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 " +"example, use [code]Vector2(0.5, 0.5)[/code] for a 2× zoom-in, and " +"[code]Vector2(4, 4)[/code] for a 4× zoom-out." +msgstr "" + +#: 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:189 +msgid "" +"The camera's position takes into account vertical/horizontal offsets and the " +"screen size." +msgstr "" + +#: 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:195 doc/classes/ClippedCamera3D.xml:107 +msgid "The camera updates with the [code]_process[/code] callback." +msgstr "" + +#: doc/classes/Camera3D.xml:4 +msgid "Camera node, displays from a point of view." +msgstr "" + +#: doc/classes/Camera3D.xml:7 +msgid "" +"[Camera3D] is a special node that displays what is visible from its current " +"location. Cameras register themselves in the nearest [Viewport] node (when " +"ascending the tree). Only one camera can be active per viewport. If no " +"viewport is available ascending the tree, the camera will register in the " +"global viewport. In other words, a camera just provides 3D display " +"capabilities to a [Viewport], and, without one, a scene registered in that " +"[Viewport] (or higher viewports) can't be displayed." +msgstr "" + +#: doc/classes/Camera3D.xml:18 +msgid "" +"If this is the current camera, remove it from being current. If " +"[code]enable_next[/code] is [code]true[/code], request to make the next " +"camera current, if any." +msgstr "" + +#: doc/classes/Camera3D.xml:25 +msgid "Returns the camera's RID from the [RenderingServer]." +msgstr "" + +#: doc/classes/Camera3D.xml:32 +msgid "" +"Gets the camera transform. Subclassed cameras such as [ClippedCamera3D] may " +"provide different transforms than the [Node] transform." +msgstr "" + +#: doc/classes/Camera3D.xml:41 +msgid "" +"Returns [code]true[/code] if the given [code]layer[/code] in the [member " +"cull_mask] is enabled, [code]false[/code] otherwise." +msgstr "" + +#: doc/classes/Camera3D.xml:48 +msgid "" +"Returns the camera's frustum planes in world-space units as an array of " +"[Plane]s in the following order: near, far, left, top, right, bottom. Not to " +"be confused with [member frustum_offset]." +msgstr "" + +#: doc/classes/Camera3D.xml:57 +msgid "" +"Returns [code]true[/code] if the given position is behind the camera.\n" +"[b]Note:[/b] A position which returns [code]false[/code] may still be " +"outside the camera's field of view." +msgstr "" + +#: doc/classes/Camera3D.xml:65 +msgid "" +"Makes this camera the current camera for the [Viewport] (see class " +"description). If the camera node is outside the scene tree, it will attempt " +"to become current once it's added." +msgstr "" + +#: doc/classes/Camera3D.xml:74 +msgid "" +"Returns a normal vector from the screen point location directed along the " +"camera. Orthogonal cameras are normalized. Perspective cameras account for " +"perspective, screen width/height, etc." +msgstr "" + +#: doc/classes/Camera3D.xml:85 +msgid "" +"Returns the 3D point in worldspace that maps to the given 2D coordinate in " +"the [Viewport] rectangle on a plane that is the given [code]z_depth[/code] " +"distance into the scene away from the camera." +msgstr "" + +#: doc/classes/Camera3D.xml:94 +msgid "" +"Returns a normal vector in worldspace, that is the result of projecting a " +"point on the [Viewport] rectangle by the camera projection. This is useful " +"for casting rays in the form of (origin, normal) for object intersection or " +"picking." +msgstr "" + +#: doc/classes/Camera3D.xml:103 +msgid "" +"Returns a 3D position in worldspace, that is the result of projecting a " +"point on the [Viewport] rectangle by the camera projection. This is useful " +"for casting rays in the form of (origin, normal) for object intersection or " +"picking." +msgstr "" + +#: doc/classes/Camera3D.xml:114 +msgid "" +"Enables or disables the given [code]layer[/code] in the [member cull_mask]." +msgstr "" + +#: doc/classes/Camera3D.xml:129 +msgid "" +"Sets the camera projection to frustum mode (see [constant " +"PROJECTION_FRUSTUM]), by specifying a [code]size[/code], an [code]offset[/" +"code], and the [code]z_near[/code] and [code]z_far[/code] clip planes in " +"world-space units." +msgstr "" + +#: doc/classes/Camera3D.xml:142 +msgid "" +"Sets the camera projection to orthogonal mode (see [constant " +"PROJECTION_ORTHOGONAL]), by specifying a [code]size[/code], and the " +"[code]z_near[/code] and [code]z_far[/code] clip planes in world-space units. " +"(As a hint, 2D games often use this projection, with values specified in " +"pixels.)" +msgstr "" + +#: doc/classes/Camera3D.xml:155 +msgid "" +"Sets the camera projection to perspective mode (see [constant " +"PROJECTION_PERSPECTIVE]), by specifying a [code]fov[/code] (field of view) " +"angle in degrees, and the [code]z_near[/code] and [code]z_far[/code] clip " +"planes in world-space units." +msgstr "" + +#: doc/classes/Camera3D.xml:164 +msgid "" +"Returns the 2D coordinate in the [Viewport] rectangle that maps to the given " +"3D point in worldspace." +msgstr "" + +#: doc/classes/Camera3D.xml:170 +msgid "" +"The culling mask that describes which 3D render layers are rendered by this " +"camera." +msgstr "" + +#: doc/classes/Camera3D.xml:173 +msgid "" +"If [code]true[/code], the ancestor [Viewport] is currently using this camera." +msgstr "" + +#: doc/classes/Camera3D.xml:176 +msgid "" +"If not [constant DOPPLER_TRACKING_DISABLED], this camera will simulate the " +"[url=https://en.wikipedia.org/wiki/Doppler_effect]Doppler effect[/url] for " +"objects changed in particular [code]_process[/code] methods. See [enum " +"DopplerTracking] for possible values." +msgstr "" + +#: doc/classes/Camera3D.xml:181 +msgid "The [Environment] to use for this camera." +msgstr "" + +#: doc/classes/Camera3D.xml:184 +msgid "" +"The distance to the far culling boundary for this camera relative to its " +"local Z axis." +msgstr "" + +#: doc/classes/Camera3D.xml:187 +msgid "" +"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." +msgstr "" + +#: doc/classes/Camera3D.xml:190 +msgid "" +"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]." +msgstr "" + +#: doc/classes/Camera3D.xml:193 +msgid "The horizontal (X) offset of the camera viewport." +msgstr "" + +#: doc/classes/Camera3D.xml:196 +msgid "" +"The axis to lock during [member fov]/[member size] adjustments. Can be " +"either [constant KEEP_WIDTH] or [constant KEEP_HEIGHT]." +msgstr "" + +#: doc/classes/Camera3D.xml:199 +msgid "" +"The distance to the near culling boundary for this camera relative to its " +"local Z axis." +msgstr "" + +#: doc/classes/Camera3D.xml:202 +msgid "" +"The camera's projection mode. In [constant PROJECTION_PERSPECTIVE] mode, " +"objects' Z distance from the camera's local space scales their perceived " +"size." +msgstr "" + +#: doc/classes/Camera3D.xml:205 +msgid "" +"The camera's size measured as 1/2 the width or height. Only applicable in " +"orthogonal mode. Since [member keep_aspect] locks on axis, [code]size[/code] " +"sets the other axis' size length." +msgstr "" + +#: doc/classes/Camera3D.xml:208 +msgid "The vertical (Y) offset of the camera viewport." +msgstr "" + +#: doc/classes/Camera3D.xml:213 +msgid "" +"Perspective projection. Objects on the screen becomes smaller when they are " +"far away." +msgstr "" + +#: doc/classes/Camera3D.xml:216 +msgid "" +"Orthogonal projection, also known as orthographic projection. Objects remain " +"the same size on the screen no matter how far away they are." +msgstr "" + +#: doc/classes/Camera3D.xml:219 +msgid "" +"Frustum projection. This mode allows adjusting [member frustum_offset] to " +"create \"tilted frustum\" effects." +msgstr "" + +#: doc/classes/Camera3D.xml:222 +msgid "" +"Preserves the horizontal aspect ratio; also known as Vert- scaling. This is " +"usually the best option for projects running in portrait mode, as taller " +"aspect ratios will benefit from a wider vertical FOV." +msgstr "" + +#: doc/classes/Camera3D.xml:225 +msgid "" +"Preserves the vertical aspect ratio; also known as Hor+ scaling. This is " +"usually the best option for projects running in landscape mode, as wider " +"aspect ratios will automatically benefit from a wider horizontal FOV." +msgstr "" + +#: doc/classes/Camera3D.xml:228 +msgid "" +"Disables [url=https://en.wikipedia.org/wiki/Doppler_effect]Doppler effect[/" +"url] simulation (default)." +msgstr "" + +#: doc/classes/Camera3D.xml:231 +msgid "" +"Simulate [url=https://en.wikipedia.org/wiki/Doppler_effect]Doppler effect[/" +"url] by tracking positions of objects that are changed in [code]_process[/" +"code]. Changes in the relative velocity of this camera compared to those " +"objects affect how Audio is perceived (changing the Audio's [code]pitch " +"shift[/code])." +msgstr "" + +#: doc/classes/Camera3D.xml:234 +msgid "" +"Simulate [url=https://en.wikipedia.org/wiki/Doppler_effect]Doppler effect[/" +"url] by tracking positions of objects that are changed in " +"[code]_physics_process[/code]. Changes in the relative velocity of this " +"camera compared to those objects affect how Audio is perceived (changing the " +"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 " +"device." +msgstr "" + +#: doc/classes/CameraFeed.xml:7 +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. 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 " +"background." +msgstr "" + +#: doc/classes/CameraServer.xml:4 +msgid "Server keeping track of different cameras accessible in Godot." +msgstr "" + +#: doc/classes/CameraServer.xml:7 +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.\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:20 +msgid "Adds the camera [code]feed[/code] to the camera server." +msgstr "" + +#: doc/classes/CameraServer.xml:27 +msgid "Returns an array of [CameraFeed]s." +msgstr "" + +#: doc/classes/CameraServer.xml:36 +msgid "" +"Returns the [CameraFeed] corresponding to the camera with the given " +"[code]index[/code]." +msgstr "" + +#: doc/classes/CameraServer.xml:43 +msgid "Returns the number of [CameraFeed]s registered." +msgstr "" + +#: doc/classes/CameraServer.xml:52 +msgid "Removes the specified camera [code]feed[/code]." +msgstr "" + +#: doc/classes/CameraServer.xml:61 +msgid "Emitted when a [CameraFeed] is added (e.g. a webcam is plugged in)." +msgstr "" + +#: doc/classes/CameraServer.xml:68 +msgid "Emitted when a [CameraFeed] is removed (e.g. a webcam is unplugged)." +msgstr "" + +#: doc/classes/CameraServer.xml:74 +msgid "The RGBA camera image." +msgstr "" + +#: doc/classes/CameraServer.xml:77 +msgid "The [url=https://en.wikipedia.org/wiki/YCbCr]YCbCr[/url] camera image." +msgstr "" + +#: doc/classes/CameraServer.xml:80 +msgid "The Y component camera image." +msgstr "" + +#: doc/classes/CameraServer.xml:83 +msgid "The CbCr component camera image." +msgstr "" + +#: doc/classes/CameraTexture.xml:4 +msgid "Texture provided by a [CameraFeed]." +msgstr "" + +#: doc/classes/CameraTexture.xml:7 +msgid "" +"This texture gives access to the camera texture provided by a [CameraFeed].\n" +"[b]Note:[/b] Many cameras supply YCbCr images which need to be converted in " +"a shader." +msgstr "" + +#: doc/classes/CameraTexture.xml:16 +msgid "The ID of the [CameraFeed] for which we want to display the image." +msgstr "" + +#: doc/classes/CameraTexture.xml:19 +msgid "" +"Convenience property that gives access to the active property of the " +"[CameraFeed]." +msgstr "" + +#: doc/classes/CameraTexture.xml:22 +msgid "" +"Which image within the [CameraFeed] we want access to, important if the " +"camera image is split in a Y and CbCr component." +msgstr "" + +#: doc/classes/CanvasItem.xml:4 +msgid "Base class of anything 2D." +msgstr "" + +#: doc/classes/CanvasItem.xml:7 +msgid "" +"Base class of anything 2D. Canvas items are laid out in a tree; children " +"inherit and extend their parent's transform. [CanvasItem] is extended by " +"[Control] for anything GUI-related, and by [Node2D] for anything related to " +"the 2D engine.\n" +"Any [CanvasItem] can draw. For this, [method update] must be called, then " +"[constant NOTIFICATION_DRAW] will be received on idle time to request " +"redraw. Because of this, canvas items don't need to be redrawn on every " +"frame, improving the performance significantly. Several functions for " +"drawing on the [CanvasItem] are provided (see [code]draw_*[/code] " +"functions). However, they can only be used inside the [method Object." +"_notification], signal or [method _draw] virtual functions.\n" +"Canvas items are drawn in tree order. By default, children are on top of " +"their parents so a root [CanvasItem] will be drawn behind everything. This " +"behavior can be changed on a per-item basis.\n" +"A [CanvasItem] can also be hidden, which will also hide its children. It " +"provides many ways to change parameters such as modulation (for itself and " +"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.\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: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: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:23 +msgid "" +"Overridable function called by the engine (if defined) to draw the canvas " +"item." +msgstr "" + +#: 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: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:74 +msgid "Draws a colored circle." +msgstr "" + +#: doc/classes/CanvasItem.xml:99 +msgid "Draws a colored polygon of any amount of points, convex or concave." +msgstr "" + +#: 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:139 +msgid "" +"Draws a [Mesh] in 2D, using the provided texture. See [MeshInstance2D] for " +"related documentation." +msgstr "" + +#: doc/classes/CanvasItem.xml:152 +msgid "Draws multiple, parallel lines with a uniform [code]color[/code]." +msgstr "" + +#: 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:186 +msgid "" +"Draws a [MultiMesh] in 2D with the provided texture. See " +"[MultiMeshInstance2D] for related documentation." +msgstr "" + +#: doc/classes/CanvasItem.xml:211 +msgid "Draws a polygon of any amount of points, convex or concave." +msgstr "" + +#: 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: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: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: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 " +"[code]filled[/code] is [code]false[/code], the rectangle will be drawn as a " +"stroke with the [code]color[/code] and [code]width[/code] specified.\n" +"[b]Note:[/b] [code]width[/code] is only effective if [code]filled[/code] is " +"[code]false[/code]." +msgstr "" + +#: 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:302 +msgid "" +"Sets a custom transform for drawing via matrix. Anything drawn afterwards " +"will be transformed by this." +msgstr "" + +#: doc/classes/CanvasItem.xml:319 +msgid "Draws a string using a custom font." +msgstr "" + +#: doc/classes/CanvasItem.xml:330 +msgid "Draws a styled rectangle." +msgstr "" + +#: doc/classes/CanvasItem.xml:353 +msgid "Draws a texture at a given position." +msgstr "" + +#: 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: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: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:423 +msgid "Returns the [RID] of the [World2D] canvas where this item is in." +msgstr "" + +#: doc/classes/CanvasItem.xml:430 +msgid "Returns the canvas item RID used by [RenderingServer] for this item." +msgstr "" + +#: doc/classes/CanvasItem.xml:437 +msgid "Returns the transform matrix of this item's canvas." +msgstr "" + +#: doc/classes/CanvasItem.xml:444 +msgid "Returns the global position of the mouse." +msgstr "" + +#: doc/classes/CanvasItem.xml:451 +msgid "Returns the global transform matrix of this item." +msgstr "" + +#: doc/classes/CanvasItem.xml:458 +msgid "" +"Returns the global transform matrix of this item in relation to the canvas." +msgstr "" + +#: doc/classes/CanvasItem.xml:465 +msgid "Returns the mouse position relative to this item's position." +msgstr "" + +#: doc/classes/CanvasItem.xml:472 +msgid "Returns the transform matrix of this item." +msgstr "" + +#: doc/classes/CanvasItem.xml:479 +msgid "Returns the viewport's boundaries as a [Rect2]." +msgstr "" + +#: doc/classes/CanvasItem.xml:486 +msgid "Returns this item's transform in relation to the viewport." +msgstr "" + +#: doc/classes/CanvasItem.xml:493 +msgid "Returns the [World2D] where this item is in." +msgstr "" + +#: doc/classes/CanvasItem.xml:500 +msgid "Hide the [CanvasItem] if it's currently visible." +msgstr "" + +#: doc/classes/CanvasItem.xml:507 +msgid "" +"Returns [code]true[/code] if local transform notifications are communicated " +"to children." +msgstr "" + +#: 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:521 +msgid "" +"Returns [code]true[/code] if global transform notifications are communicated " +"to children." +msgstr "" + +#: 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:537 +msgid "Assigns [code]screen_point[/code] as this node's new local transform." +msgstr "" + +#: 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: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:564 +msgid "" +"If [code]enable[/code] is [code]true[/code], children will be updated with " +"local transform data." +msgstr "" + +#: 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: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:587 +msgid "" +"Queue the [CanvasItem] for update. [constant NOTIFICATION_DRAW] will be " +"called on idle time to request redraw." +msgstr "" + +#: doc/classes/CanvasItem.xml:593 +msgid "" +"The rendering layers in which this [CanvasItem] responds to [Light2D] nodes." +msgstr "" + +#: doc/classes/CanvasItem.xml:596 +msgid "The material applied to textures on this [CanvasItem]." +msgstr "" + +#: doc/classes/CanvasItem.xml:599 +msgid "The color applied to textures on this [CanvasItem]." +msgstr "" + +#: 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:605 +msgid "If [code]true[/code], the object draws behind its parent." +msgstr "" + +#: doc/classes/CanvasItem.xml:608 +msgid "If [code]true[/code], the object draws on top of its parent." +msgstr "" + +#: 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: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: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:629 +msgid "Emitted when becoming hidden." +msgstr "" + +#: doc/classes/CanvasItem.xml:634 +msgid "Emitted when the item rect has changed." +msgstr "" + +#: doc/classes/CanvasItem.xml:639 +msgid "Emitted when the visibility (hidden/visible) changes." +msgstr "" + +#: 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:648 +msgid "The [CanvasItem] is requested to draw." +msgstr "" + +#: doc/classes/CanvasItem.xml:651 +msgid "The [CanvasItem]'s visibility has changed." +msgstr "" + +#: doc/classes/CanvasItem.xml:654 +msgid "The [CanvasItem] has entered the canvas." +msgstr "" + +#: doc/classes/CanvasItem.xml:657 +msgid "The [CanvasItem] has exited the canvas." +msgstr "" + +#: 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: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: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:686 +msgid "Texture will repeat normally." +msgstr "" + +#: 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:692 +msgid "Represents the size of the [enum TextureRepeat] enum." +msgstr "" + +#: doc/classes/CanvasItemMaterial.xml:4 +msgid "A material for [CanvasItem]s." +msgstr "" + +#: doc/classes/CanvasItemMaterial.xml:7 +msgid "" +"[CanvasItemMaterial]s provide a means of modifying the textures associated " +"with a CanvasItem. They specialize in describing blend and lighting " +"behaviors for textures. Use a [ShaderMaterial] to more fully customize a " +"material's interactions with a [CanvasItem]." +msgstr "" + +#: doc/classes/CanvasItemMaterial.xml:15 +msgid "" +"The manner in which a material's rendering is applied to underlying textures." +msgstr "" + +#: doc/classes/CanvasItemMaterial.xml:18 +msgid "The manner in which material reacts to lighting." +msgstr "" + +#: doc/classes/CanvasItemMaterial.xml:21 +msgid "" +"The number of columns in the spritesheet assigned as [Texture2D] for a " +"[GPUParticles2D] or [CPUParticles2D].\n" +"[b]Note:[/b] This property is only used and visible in the editor if [member " +"particles_animation] is [code]true[/code]." +msgstr "" + +#: doc/classes/CanvasItemMaterial.xml:25 +msgid "" +"If [code]true[/code], the particles animation will loop.\n" +"[b]Note:[/b] This property is only used and visible in the editor if [member " +"particles_animation] is [code]true[/code]." +msgstr "" + +#: doc/classes/CanvasItemMaterial.xml:29 +msgid "" +"The number of rows in the spritesheet assigned as [Texture2D] for a " +"[GPUParticles2D] or [CPUParticles2D].\n" +"[b]Note:[/b] This property is only used and visible in the editor if [member " +"particles_animation] is [code]true[/code]." +msgstr "" + +#: doc/classes/CanvasItemMaterial.xml:33 +msgid "" +"If [code]true[/code], enable spritesheet-based animation features when " +"assigned to [GPUParticles2D] and [CPUParticles2D] nodes. The [member " +"ParticlesMaterial.anim_speed] or [member CPUParticles2D.anim_speed] should " +"also be set to a positive value for the animation to play.\n" +"This property (and other [code]particles_anim_*[/code] properties that " +"depend on it) has no effect on other types of nodes." +msgstr "" + +#: doc/classes/CanvasItemMaterial.xml:39 +msgid "" +"Mix blending mode. Colors are assumed to be independent of the alpha " +"(opacity) value." +msgstr "" + +#: doc/classes/CanvasItemMaterial.xml:42 +msgid "Additive blending mode." +msgstr "" + +#: doc/classes/CanvasItemMaterial.xml:45 +msgid "Subtractive blending mode." +msgstr "" + +#: doc/classes/CanvasItemMaterial.xml:48 +msgid "Multiplicative blending mode." +msgstr "" + +#: doc/classes/CanvasItemMaterial.xml:51 +msgid "" +"Mix blending mode. Colors are assumed to be premultiplied by the alpha " +"(opacity) value." +msgstr "" + +#: doc/classes/CanvasItemMaterial.xml:54 +msgid "" +"Render the material using both light and non-light sensitive material " +"properties." +msgstr "" + +#: doc/classes/CanvasItemMaterial.xml:57 +msgid "Render the material as if there were no light." +msgstr "" + +#: doc/classes/CanvasItemMaterial.xml:60 +msgid "Render the material as if there were only light." +msgstr "" + +#: doc/classes/CanvasLayer.xml:4 +msgid "Canvas drawing layer." +msgstr "" + +#: doc/classes/CanvasLayer.xml:7 +msgid "" +"Canvas drawing layer. [CanvasItem] nodes that are direct or indirect " +"children of a [CanvasLayer] will be drawn in that layer. The layer is a " +"numeric index that defines the draw order. The default 2D scene renders with " +"index 0, so a [CanvasLayer] with index -1 will be drawn below, and one with " +"index 1 will be drawn above. This is very useful for HUDs (in layer 1+ or " +"above), or backgrounds (in layer -1 or below)." +msgstr "" + +#: doc/classes/CanvasLayer.xml:11 +msgid "https://docs.godotengine.org/en/latest/tutorials/2d/canvas_layers.html" +msgstr "" + +#: doc/classes/CanvasLayer.xml:18 +msgid "Returns the RID of the canvas used by this layer." +msgstr "" + +#: doc/classes/CanvasLayer.xml:24 +msgid "" +"The custom [Viewport] node assigned to the [CanvasLayer]. If [code]null[/" +"code], uses the default viewport instead." +msgstr "" + +#: doc/classes/CanvasLayer.xml:27 +msgid "" +"Sets the layer to follow the viewport in order to simulate a pseudo 3D " +"effect." +msgstr "" + +#: doc/classes/CanvasLayer.xml:30 +msgid "" +"Scales the layer when using [member follow_viewport_enable]. Layers moving " +"into the foreground should have increasing scales, while layers moving into " +"the background should have decreasing scales." +msgstr "" + +#: doc/classes/CanvasLayer.xml:33 +msgid "Layer index for draw order. Lower values are drawn first." +msgstr "" + +#: doc/classes/CanvasLayer.xml:36 +msgid "The layer's base offset." +msgstr "" + +#: doc/classes/CanvasLayer.xml:39 +msgid "The layer's rotation in radians." +msgstr "" + +#: doc/classes/CanvasLayer.xml:42 +msgid "The layer's rotation in degrees." +msgstr "" + +#: doc/classes/CanvasLayer.xml:45 +msgid "The layer's scale." +msgstr "" + +#: doc/classes/CanvasLayer.xml:48 +msgid "The layer's transform." +msgstr "" + +#: doc/classes/CanvasModulate.xml:4 +msgid "Tint the entire canvas." +msgstr "" + +#: doc/classes/CanvasModulate.xml:7 +msgid "" +"[CanvasModulate] tints the canvas elements using its assigned [member color]." +msgstr "" + +#: doc/classes/CanvasModulate.xml:15 +msgid "The tint color to apply." +msgstr "" + +#: doc/classes/CapsuleMesh.xml:4 doc/classes/CapsuleMesh.xml:7 +msgid "Class representing a capsule-shaped [PrimitiveMesh]." +msgstr "" + +#: doc/classes/CapsuleMesh.xml:15 +msgid "Height of the capsule mesh from the center point." +msgstr "" + +#: doc/classes/CapsuleMesh.xml:18 +msgid "Number of radial segments on the capsule mesh." +msgstr "" + +#: doc/classes/CapsuleMesh.xml:21 +msgid "Radius of the capsule mesh." +msgstr "" + +#: doc/classes/CapsuleMesh.xml:24 +msgid "Number of rings along the height of the capsule." +msgstr "" + +#: doc/classes/CapsuleShape2D.xml:4 doc/classes/CapsuleShape2D.xml:7 +msgid "Capsule shape for 2D collisions." +msgstr "" + +#: doc/classes/CapsuleShape2D.xml:15 doc/classes/CapsuleShape3D.xml:15 +msgid "The capsule's height." +msgstr "" + +#: doc/classes/CapsuleShape2D.xml:18 doc/classes/CapsuleShape3D.xml:18 +msgid "The capsule's radius." +msgstr "" + +#: doc/classes/CapsuleShape3D.xml:4 doc/classes/CapsuleShape3D.xml:7 +msgid "Capsule shape for collisions." +msgstr "" + +#: doc/classes/CenterContainer.xml:4 +msgid "Keeps children controls centered." +msgstr "" + +#: doc/classes/CenterContainer.xml:7 +msgid "" +"CenterContainer keeps children controls centered. This container keeps all " +"children to their minimum size, in the center." +msgstr "" + +#: doc/classes/CenterContainer.xml:15 +msgid "" +"If [code]true[/code], centers children relative to the [CenterContainer]'s " +"top left corner." +msgstr "" + +#: doc/classes/CharFXTransform.xml:4 +msgid "" +"Controls how an individual character will be displayed in a [RichTextEffect]." +msgstr "" + +#: doc/classes/CharFXTransform.xml:7 +msgid "" +"By setting various properties on this object, you can control how individual " +"characters will be displayed in a [RichTextEffect]." +msgstr "" + +#: doc/classes/CharFXTransform.xml:10 doc/classes/RichTextEffect.xml:16 +#: doc/classes/RichTextLabel.xml:11 +msgid "" +"https://docs.godotengine.org/en/latest/tutorials/gui/bbcode_in_richtextlabel." +"html" +msgstr "" + +#: doc/classes/CharFXTransform.xml:11 doc/classes/RichTextEffect.xml:17 +msgid "" +"https://github.com/Eoin-ONeill-Yokai/Godot-Rich-Text-Effect-Test-Project" +msgstr "" + +#: doc/classes/CharFXTransform.xml:17 doc/classes/CharFXTransform.xml:45 +msgid "" +"The index of the current character (starting from 0). Setting this property " +"won't affect drawing." +msgstr "" + +#: doc/classes/CharFXTransform.xml:20 +msgid "" +"The Unicode codepoint the character will use. This only affects non-" +"whitespace characters. [method @GDScript.ord] can be useful here. For " +"example, the following will replace all characters with asterisks:\n" +"[codeblock]\n" +"# `char_fx` is the CharFXTransform parameter from `_process_custom_fx()`.\n" +"# See the RichTextEffect documentation for details.\n" +"char_fx.character = ord(\"*\")\n" +"[/codeblock]" +msgstr "" + +#: doc/classes/CharFXTransform.xml:28 +msgid "The color the character will be drawn with." +msgstr "" + +#: doc/classes/CharFXTransform.xml:31 +msgid "" +"The time elapsed since the [RichTextLabel] was added to the scene tree (in " +"seconds). Time stops when the project is paused, unless the " +"[RichTextLabel]'s [member Node.pause_mode] is set to [constant Node." +"PAUSE_MODE_PROCESS].\n" +"[b]Note:[/b] Time still passes while the [RichTextLabel] is hidden." +msgstr "" + +#: doc/classes/CharFXTransform.xml:35 +msgid "" +"Contains the arguments passed in the opening BBCode tag. By default, " +"arguments are strings; if their contents match a type such as [bool], [int] " +"or [float], they will be converted automatically. Color codes in the form " +"[code]#rrggbb[/code] or [code]#rgb[/code] will be converted to an opaque " +"[Color]. String arguments may not contain spaces, even if they're quoted. If " +"present, quotes will also be present in the final string.\n" +"For example, the opening BBCode tag [code][example foo=hello bar=true baz=42 " +"color=#ffffff][/code] will map to the following [Dictionary]:\n" +"[codeblock]\n" +"{\"foo\": \"hello\", \"bar\": true, \"baz\": 42, \"color\": Color(1, 1, 1, " +"1)}\n" +"[/codeblock]" +msgstr "" + +#: doc/classes/CharFXTransform.xml:42 +msgid "The position offset the character will be drawn with (in pixels)." +msgstr "" + +#: doc/classes/CharFXTransform.xml:48 +msgid "" +"If [code]true[/code], the character will be drawn. If [code]false[/code], " +"the character will be hidden. Characters around hidden characters will " +"reflow to take the space of hidden characters. If this is not desired, set " +"their [member color] to [code]Color(1, 1, 1, 0)[/code] instead." +msgstr "" + +#: doc/classes/CheckBox.xml:4 +msgid "Binary choice user interface widget. See also [CheckButton]." +msgstr "" + +#: doc/classes/CheckBox.xml:7 +msgid "" +"A checkbox allows the user to make a binary choice (choosing only one of two " +"possible options). It's similar to [CheckButton] in functionality, but it " +"has a different appearance. To follow established UX patterns, it's " +"recommended to use CheckBox when toggling it has [b]no[/b] immediate effect " +"on something. For instance, it should be used when toggling it will only do " +"something once a confirmation button is pressed." +msgstr "" + +#: doc/classes/CheckBox.xml:21 +msgid "The vertical offset used when rendering the check icons (in pixels)." +msgstr "" + +#: doc/classes/CheckBox.xml:24 +msgid "The check icon to display when the [CheckBox] is checked." +msgstr "" + +#: doc/classes/CheckBox.xml:27 +msgid "" +"The [StyleBox] to display as a background when the [CheckBox] is disabled." +msgstr "" + +#: doc/classes/CheckBox.xml:30 +msgid "" +"The [StyleBox] to display as a background when the [CheckBox] is focused." +msgstr "" + +#: doc/classes/CheckBox.xml:33 +msgid "The [Font] to use for the [CheckBox] text." +msgstr "" + +#: doc/classes/CheckBox.xml:36 +msgid "The [CheckBox] text's font color." +msgstr "" + +#: doc/classes/CheckBox.xml:39 +msgid "The [CheckBox] text's font color when it's disabled." +msgstr "" + +#: doc/classes/CheckBox.xml:42 +msgid "The [CheckBox] text's font color when it's hovered." +msgstr "" + +#: doc/classes/CheckBox.xml:45 +msgid "The [CheckBox] text's font color when it's hovered and pressed." +msgstr "" + +#: doc/classes/CheckBox.xml:48 +msgid "The [CheckBox] text's font color when it's pressed." +msgstr "" + +#: doc/classes/CheckBox.xml:51 +msgid "" +"The [StyleBox] to display as a background when the [CheckBox] is hovered." +msgstr "" + +#: doc/classes/CheckBox.xml:54 +msgid "" +"The [StyleBox] to display as a background when the [CheckBox] is hovered and " +"pressed." +msgstr "" + +#: doc/classes/CheckBox.xml:57 +msgid "The separation between the check icon and the text (in pixels)." +msgstr "" + +#: doc/classes/CheckBox.xml:60 doc/classes/CheckButton.xml:57 +msgid "The [StyleBox] to display as a background." +msgstr "" + +#: doc/classes/CheckBox.xml:63 +msgid "" +"The [StyleBox] to display as a background when the [CheckBox] is pressed." +msgstr "" + +#: doc/classes/CheckBox.xml:66 +msgid "" +"If the [CheckBox] is configured as a radio button, the icon to display when " +"the [CheckBox] is checked." +msgstr "" + +#: doc/classes/CheckBox.xml:69 +msgid "" +"If the [CheckBox] is configured as a radio button, the icon to display when " +"the [CheckBox] is unchecked." +msgstr "" + +#: doc/classes/CheckBox.xml:72 +msgid "The check icon to display when the [CheckBox] is unchecked." +msgstr "" + +#: doc/classes/CheckButton.xml:4 +msgid "Checkable button. See also [CheckBox]." +msgstr "" + +#: doc/classes/CheckButton.xml:7 +msgid "" +"CheckButton is a toggle button displayed as a check field. It's similar to " +"[CheckBox] in functionality, but it has a different appearance. To follow " +"established UX patterns, it's recommended to use CheckButton when toggling " +"it has an [b]immediate[/b] effect on something. For instance, it should be " +"used if toggling it enables/disables a setting without requiring the user to " +"press a confirmation button." +msgstr "" + +#: doc/classes/CheckButton.xml:21 +msgid "The vertical offset used when rendering the toggle icons (in pixels)." +msgstr "" + +#: doc/classes/CheckButton.xml:24 +msgid "" +"The [StyleBox] to display as a background when the [CheckButton] is disabled." +msgstr "" + +#: doc/classes/CheckButton.xml:27 +msgid "" +"The [StyleBox] to display as a background when the [CheckButton] is focused." +msgstr "" + +#: doc/classes/CheckButton.xml:30 +msgid "The [Font] to use for the [CheckButton] text." +msgstr "" + +#: doc/classes/CheckButton.xml:33 +msgid "The [CheckButton] text's font color." +msgstr "" + +#: doc/classes/CheckButton.xml:36 +msgid "The [CheckButton] text's font color when it's disabled." +msgstr "" + +#: doc/classes/CheckButton.xml:39 +msgid "The [CheckButton] text's font color when it's hovered." +msgstr "" + +#: doc/classes/CheckButton.xml:42 +msgid "The [CheckButton] text's font color when it's hovered and pressed." +msgstr "" + +#: doc/classes/CheckButton.xml:45 +msgid "The [CheckButton] text's font color when it's pressed." +msgstr "" + +#: doc/classes/CheckButton.xml:48 +msgid "" +"The [StyleBox] to display as a background when the [CheckButton] is hovered." +msgstr "" + +#: doc/classes/CheckButton.xml:51 +msgid "" +"The [StyleBox] to display as a background when the [CheckButton] is hovered " +"and pressed." +msgstr "" + +#: doc/classes/CheckButton.xml:54 +msgid "The separation between the toggle icon and the text (in pixels)." +msgstr "" + +#: doc/classes/CheckButton.xml:60 +msgid "The icon to display when the [CheckButton] is unchecked." +msgstr "" + +#: doc/classes/CheckButton.xml:63 +msgid "The icon to display when the [CheckButton] is unchecked and disabled." +msgstr "" + +#: doc/classes/CheckButton.xml:66 +msgid "The icon to display when the [CheckButton] is checked." +msgstr "" + +#: doc/classes/CheckButton.xml:69 +msgid "The icon to display when the [CheckButton] is checked and disabled." +msgstr "" + +#: doc/classes/CheckButton.xml:72 +msgid "" +"The [StyleBox] to display as a background when the [CheckButton] is pressed." +msgstr "" + +#: doc/classes/CircleShape2D.xml:4 +msgid "Circular shape for 2D collisions." +msgstr "" + +#: doc/classes/CircleShape2D.xml:7 +msgid "" +"Circular shape for 2D collisions. This shape is useful for modeling balls or " +"small characters and its collision detection with everything else is very " +"fast." +msgstr "" + +#: doc/classes/CircleShape2D.xml:15 +msgid "The circle's radius." +msgstr "" + +#: doc/classes/ClassDB.xml:4 +msgid "Class information repository." +msgstr "" + +#: doc/classes/ClassDB.xml:7 +msgid "Provides access to metadata stored for every available class." +msgstr "" + +#: doc/classes/ClassDB.xml:18 +msgid "" +"Returns [code]true[/code] if you can instance objects from the specified " +"[code]class[/code], [code]false[/code] in other case." +msgstr "" + +#: doc/classes/ClassDB.xml:27 +msgid "Returns whether the specified [code]class[/code] is available or not." +msgstr "" + +#: doc/classes/ClassDB.xml:36 +msgid "" +"Returns a category associated with the class for use in documentation and " +"the Asset Library. Debug mode required." +msgstr "" + +#: doc/classes/ClassDB.xml:47 +msgid "" +"Returns the value of the integer constant [code]name[/code] of [code]class[/" +"code] or its ancestry. Always returns 0 when the constant could not be found." +msgstr "" + +#: doc/classes/ClassDB.xml:58 +msgid "" +"Returns an array with the names all the integer constants of [code]class[/" +"code] or its ancestry." +msgstr "" + +#: doc/classes/ClassDB.xml:69 +msgid "" +"Returns an array with all the methods of [code]class[/code] or its ancestry " +"if [code]no_inheritance[/code] is [code]false[/code]. Every element of the " +"array is a [Dictionary] with the following keys: [code]args[/code], " +"[code]default_args[/code], [code]flags[/code], [code]id[/code], [code]name[/" +"code], [code]return: (class_name, hint, hint_string, name, type, usage)[/" +"code]." +msgstr "" + +#: doc/classes/ClassDB.xml:80 +msgid "" +"Returns the value of [code]property[/code] of [code]class[/code] or its " +"ancestry." +msgstr "" + +#: doc/classes/ClassDB.xml:91 +msgid "" +"Returns an array with all the properties of [code]class[/code] or its " +"ancestry if [code]no_inheritance[/code] is [code]false[/code]." +msgstr "" + +#: doc/classes/ClassDB.xml:102 +msgid "" +"Returns the [code]signal[/code] data of [code]class[/code] or its ancestry. " +"The returned value is a [Dictionary] with the following keys: [code]args[/" +"code], [code]default_args[/code], [code]flags[/code], [code]id[/code], " +"[code]name[/code], [code]return: (class_name, hint, hint_string, name, type, " +"usage)[/code]." +msgstr "" + +#: doc/classes/ClassDB.xml:113 +msgid "" +"Returns an array with all the signals of [code]class[/code] or its ancestry " +"if [code]no_inheritance[/code] is [code]false[/code]. Every element of the " +"array is a [Dictionary] as described in [method class_get_signal]." +msgstr "" + +#: doc/classes/ClassDB.xml:124 +msgid "" +"Returns whether [code]class[/code] or its ancestry has an integer constant " +"called [code]name[/code] or not." +msgstr "" + +#: doc/classes/ClassDB.xml:137 +msgid "" +"Returns whether [code]class[/code] (or its ancestry if [code]no_inheritance[/" +"code] is [code]false[/code]) has a method called [code]method[/code] or not." +msgstr "" + +#: doc/classes/ClassDB.xml:148 +msgid "" +"Returns whether [code]class[/code] or its ancestry has a signal called " +"[code]signal[/code] or not." +msgstr "" + +#: doc/classes/ClassDB.xml:161 +msgid "" +"Sets [code]property[/code] value of [code]class[/code] to [code]value[/code]." +msgstr "" + +#: doc/classes/ClassDB.xml:168 +msgid "Returns the names of all the classes available." +msgstr "" + +#: doc/classes/ClassDB.xml:177 +msgid "" +"Returns the names of all the classes that directly or indirectly inherit " +"from [code]class[/code]." +msgstr "" + +#: doc/classes/ClassDB.xml:186 +msgid "Returns the parent class of [code]class[/code]." +msgstr "" + +#: doc/classes/ClassDB.xml:195 +msgid "Creates an instance of [code]class[/code]." +msgstr "" + +#: doc/classes/ClassDB.xml:204 +msgid "Returns whether this [code]class[/code] is enabled or not." +msgstr "" + +#: doc/classes/ClassDB.xml:215 +msgid "" +"Returns whether [code]inherits[/code] is an ancestor of [code]class[/code] " +"or not." +msgstr "" + +#: doc/classes/ClippedCamera3D.xml:4 +msgid "A [Camera3D] that includes collision." +msgstr "" + +#: doc/classes/ClippedCamera3D.xml:7 +msgid "" +"This node extends [Camera3D] to add collisions with [Area3D] and/or " +"[PhysicsBody3D] nodes. The camera cannot move through colliding objects." +msgstr "" + +#: doc/classes/ClippedCamera3D.xml:18 +msgid "" +"Adds a collision exception so the camera does not collide with the specified " +"node." +msgstr "" + +#: doc/classes/ClippedCamera3D.xml:27 +msgid "" +"Adds a collision exception so the camera does not collide with the specified " +"[RID]." +msgstr "" + +#: doc/classes/ClippedCamera3D.xml:34 +msgid "Removes all collision exceptions." +msgstr "" + +#: doc/classes/ClippedCamera3D.xml:41 +msgid "Returns the distance the camera has been offset due to a collision." +msgstr "" + +#: doc/classes/ClippedCamera3D.xml:50 +msgid "" +"Returns [code]true[/code] if the specified bit index is on.\n" +"[b]Note:[/b] Bit indices range from 0-19." +msgstr "" + +#: doc/classes/ClippedCamera3D.xml:60 +msgid "Removes a collision exception with the specified node." +msgstr "" + +#: doc/classes/ClippedCamera3D.xml:69 +msgid "Removes a collision exception with the specified [RID]." +msgstr "" + +#: doc/classes/ClippedCamera3D.xml:80 +msgid "" +"Sets the specified bit index to the [code]value[/code].\n" +"[b]Note:[/b] Bit indices range from 0-19." +msgstr "" + +#: doc/classes/ClippedCamera3D.xml:87 +msgid "If [code]true[/code], the camera stops on contact with [Area3D]s." +msgstr "" + +#: doc/classes/ClippedCamera3D.xml:90 +msgid "" +"If [code]true[/code], the camera stops on contact with [PhysicsBody3D]s." +msgstr "" + +#: doc/classes/ClippedCamera3D.xml:93 +msgid "" +"The camera's collision mask. Only objects in at least one collision layer " +"matching the mask will be detected." +msgstr "" + +#: doc/classes/ClippedCamera3D.xml:96 +msgid "" +"The camera's collision margin. The camera can't get closer than this " +"distance to a colliding object." +msgstr "" + +#: doc/classes/ClippedCamera3D.xml:99 +msgid "The camera's process callback. See [enum ProcessMode]." +msgstr "" + +#: doc/classes/CollisionObject2D.xml:4 +msgid "Base node for 2D collision objects." +msgstr "" + +#: doc/classes/CollisionObject2D.xml:7 +msgid "" +"CollisionObject2D is the base class for 2D physics objects. It can hold any " +"number of 2D collision [Shape2D]s. Each shape must be assigned to a [i]shape " +"owner[/i]. The CollisionObject2D can have any number of shape owners. Shape " +"owners are not nodes and do not appear in the editor, but are accessible " +"through code using the [code]shape_owner_*[/code] methods." +msgstr "" + +#: doc/classes/CollisionObject2D.xml:22 +msgid "" +"Accepts unhandled [InputEvent]s. Requires [member input_pickable] to be " +"[code]true[/code]. [code]shape_idx[/code] is the child index of the clicked " +"[Shape2D]. Connect to the [code]input_event[/code] signal to easily pick up " +"these events." +msgstr "" + +#: doc/classes/CollisionObject2D.xml:31 doc/classes/CollisionObject3D.xml:35 +msgid "" +"Creates a new shape owner for the given object. Returns [code]owner_id[/" +"code] of the new owner for future reference." +msgstr "" + +#: doc/classes/CollisionObject2D.xml:38 doc/classes/CollisionObject3D.xml:42 +msgid "Returns the object's [RID]." +msgstr "" + +#: doc/classes/CollisionObject2D.xml:47 +msgid "" +"Returns the [code]one_way_collision_margin[/code] of the shape owner " +"identified by given [code]owner_id[/code]." +msgstr "" + +#: doc/classes/CollisionObject2D.xml:54 doc/classes/CollisionObject3D.xml:49 +msgid "" +"Returns an [Array] of [code]owner_id[/code] identifiers. You can use these " +"ids in other methods that take [code]owner_id[/code] as an argument." +msgstr "" + +#: doc/classes/CollisionObject2D.xml:63 doc/classes/CollisionObject3D.xml:58 +msgid "If [code]true[/code], the shape owner and its shapes are disabled." +msgstr "" + +#: doc/classes/CollisionObject2D.xml:72 +msgid "" +"Returns [code]true[/code] if collisions for the shape owner originating from " +"this [CollisionObject2D] will not be reported to collided with " +"[CollisionObject2D]s." +msgstr "" + +#: doc/classes/CollisionObject2D.xml:81 doc/classes/CollisionObject3D.xml:67 +msgid "Removes the given shape owner." +msgstr "" + +#: doc/classes/CollisionObject2D.xml:90 doc/classes/CollisionObject3D.xml:76 +msgid "Returns the [code]owner_id[/code] of the given shape." +msgstr "" + +#: doc/classes/CollisionObject2D.xml:101 +msgid "Adds a [Shape2D] to the shape owner." +msgstr "" + +#: doc/classes/CollisionObject2D.xml:110 doc/classes/CollisionObject3D.xml:96 +msgid "Removes all shapes from the shape owner." +msgstr "" + +#: doc/classes/CollisionObject2D.xml:119 doc/classes/CollisionObject3D.xml:105 +msgid "Returns the parent object of the given shape owner." +msgstr "" + +#: doc/classes/CollisionObject2D.xml:130 +msgid "Returns the [Shape2D] with the given id from the given shape owner." +msgstr "" + +#: doc/classes/CollisionObject2D.xml:139 doc/classes/CollisionObject3D.xml:125 +msgid "Returns the number of shapes the given shape owner contains." +msgstr "" + +#: doc/classes/CollisionObject2D.xml:150 +msgid "" +"Returns the child index of the [Shape2D] with the given id from the given " +"shape owner." +msgstr "" + +#: doc/classes/CollisionObject2D.xml:159 +msgid "Returns the shape owner's [Transform2D]." +msgstr "" + +#: doc/classes/CollisionObject2D.xml:170 doc/classes/CollisionObject3D.xml:156 +msgid "Removes a shape from the given shape owner." +msgstr "" + +#: doc/classes/CollisionObject2D.xml:181 doc/classes/CollisionObject3D.xml:167 +msgid "If [code]true[/code], disables the given shape owner." +msgstr "" + +#: doc/classes/CollisionObject2D.xml:192 +msgid "" +"If [code]enable[/code] is [code]true[/code], collisions for the shape owner " +"originating from this [CollisionObject2D] will not be reported to collided " +"with [CollisionObject2D]s." +msgstr "" + +#: doc/classes/CollisionObject2D.xml:203 +msgid "" +"Sets the [code]one_way_collision_margin[/code] of the shape owner identified " +"by given [code]owner_id[/code] to [code]margin[/code] pixels." +msgstr "" + +#: doc/classes/CollisionObject2D.xml:214 +msgid "Sets the [Transform2D] of the given shape owner." +msgstr "" + +#: doc/classes/CollisionObject2D.xml:220 +msgid "" +"If [code]true[/code], this object is pickable. A pickable object can detect " +"the mouse pointer entering/leaving, and if the mouse is inside it, report " +"input events. Requires at least one [code]collision_layer[/code] bit to be " +"set." +msgstr "" + +#: doc/classes/CollisionObject2D.xml:232 +msgid "" +"Emitted when an input event occurs. Requires [member input_pickable] to be " +"[code]true[/code] and at least one [code]collision_layer[/code] bit to be " +"set. See [method _input_event] for details." +msgstr "" + +#: doc/classes/CollisionObject2D.xml:237 +msgid "" +"Emitted when the mouse pointer enters any of this object's shapes. Requires " +"[member input_pickable] to be [code]true[/code] and at least one " +"[code]collision_layer[/code] bit to be set." +msgstr "" + +#: doc/classes/CollisionObject2D.xml:242 +msgid "" +"Emitted when the mouse pointer exits all this object's shapes. Requires " +"[member input_pickable] to be [code]true[/code] and at least one " +"[code]collision_layer[/code] bit to be set." +msgstr "" + +#: doc/classes/CollisionObject3D.xml:4 +msgid "Base node for collision objects." +msgstr "" + +#: doc/classes/CollisionObject3D.xml:7 +msgid "" +"CollisionObject3D is the base class for physics objects. It can hold any " +"number of collision [Shape3D]s. Each shape must be assigned to a [i]shape " +"owner[/i]. The CollisionObject3D can have any number of shape owners. Shape " +"owners are not nodes and do not appear in the editor, but are accessible " +"through code using the [code]shape_owner_*[/code] methods." +msgstr "" + +#: doc/classes/CollisionObject3D.xml:26 +msgid "" +"Accepts unhandled [InputEvent]s. [code]click_position[/code] is the clicked " +"location in world space and [code]click_normal[/code] is the normal vector " +"extending from the clicked surface of the [Shape3D] at [code]shape_idx[/" +"code]. Connect to the [code]input_event[/code] signal to easily pick up " +"these events." +msgstr "" + +#: doc/classes/CollisionObject3D.xml:87 +msgid "Adds a [Shape3D] to the shape owner." +msgstr "" + +#: doc/classes/CollisionObject3D.xml:116 +msgid "Returns the [Shape3D] with the given id from the given shape owner." +msgstr "" + +#: doc/classes/CollisionObject3D.xml:136 +msgid "" +"Returns the child index of the [Shape3D] with the given id from the given " +"shape owner." +msgstr "" + +#: doc/classes/CollisionObject3D.xml:145 +msgid "Returns the shape owner's [Transform]." +msgstr "" + +#: doc/classes/CollisionObject3D.xml:178 +msgid "Sets the [Transform] of the given shape owner." +msgstr "" + +#: doc/classes/CollisionObject3D.xml:184 +msgid "" +"If [code]true[/code], the [CollisionObject3D] will continue to receive input " +"events as the mouse is dragged across its shapes." +msgstr "" + +#: doc/classes/CollisionObject3D.xml:187 +msgid "" +"If [code]true[/code], the [CollisionObject3D]'s shapes will respond to " +"[RayCast3D]s." +msgstr "" + +#: doc/classes/CollisionObject3D.xml:203 +msgid "" +"Emitted when [method _input_event] receives an event. See its description " +"for details." +msgstr "" + +#: doc/classes/CollisionObject3D.xml:208 +msgid "Emitted when the mouse pointer enters any of this object's shapes." +msgstr "" + +#: doc/classes/CollisionObject3D.xml:213 +msgid "Emitted when the mouse pointer exits all this object's shapes." +msgstr "" + +#: doc/classes/CollisionPolygon2D.xml:4 +msgid "Defines a 2D collision polygon." +msgstr "" + +#: doc/classes/CollisionPolygon2D.xml:7 +msgid "" +"Provides a 2D collision polygon to a [CollisionObject2D] parent. Polygons " +"can be drawn in the editor or specified by a list of vertices." +msgstr "" + +#: doc/classes/CollisionPolygon2D.xml:15 +msgid "Collision build mode. Use one of the [enum BuildMode] constants." +msgstr "" + +#: doc/classes/CollisionPolygon2D.xml:18 +msgid "If [code]true[/code], no collisions will be detected." +msgstr "" + +#: doc/classes/CollisionPolygon2D.xml:21 +msgid "" +"If [code]true[/code], only edges that face up, relative to " +"[CollisionPolygon2D]'s rotation, will collide with other objects." +msgstr "" + +#: doc/classes/CollisionPolygon2D.xml:24 +msgid "" +"The margin used for one-way collision (in pixels). Higher values will make " +"the shape thicker, and work better for colliders that enter the polygon at a " +"high velocity." +msgstr "" + +#: doc/classes/CollisionPolygon2D.xml:27 +msgid "" +"The polygon's list of vertices. The final point will be connected to the " +"first. The returned value is a clone of the [PackedVector2Array], not a " +"reference." +msgstr "" + +#: doc/classes/CollisionPolygon2D.xml:32 +msgid "Collisions will include the polygon and its contained area." +msgstr "" + +#: doc/classes/CollisionPolygon2D.xml:35 +msgid "Collisions will only include the polygon edges." +msgstr "" + +#: doc/classes/CollisionPolygon3D.xml:4 +msgid "Editor-only class for defining a collision polygon in 3D space." +msgstr "" + +#: doc/classes/CollisionPolygon3D.xml:7 +msgid "" +"Allows editing a collision polygon's vertices on a selected plane. Can also " +"set a depth perpendicular to that plane. This class is only available in the " +"editor. It will not appear in the scene tree at run-time. Creates a " +"[Shape3D] for gameplay. Properties modified during gameplay will have no " +"effect." +msgstr "" + +#: doc/classes/CollisionPolygon3D.xml:15 +msgid "" +"Length that the resulting collision extends in either direction " +"perpendicular to its polygon." +msgstr "" + +#: doc/classes/CollisionPolygon3D.xml:18 +msgid "If [code]true[/code], no collision will be produced." +msgstr "" + +#: doc/classes/CollisionPolygon3D.xml:21 +msgid "" +"Array of vertices which define the polygon.\n" +"[b]Note:[/b] The returned value is a copy of the original. Methods which " +"mutate the size or properties of the return value will not impact the " +"original polygon. To change properties of the polygon, assign it to a " +"temporary variable and make changes before reassigning the [code]polygon[/" +"code] member." +msgstr "" + +#: doc/classes/CollisionShape2D.xml:4 +msgid "Node that represents collision shape data in 2D space." +msgstr "" + +#: doc/classes/CollisionShape2D.xml:7 +msgid "" +"Editor facility for creating and editing collision shapes in 2D space. You " +"can use this node to represent all sorts of collision shapes, for example, " +"add this to an [Area2D] to give it a detection shape, or add it to a " +"[PhysicsBody2D] to create a solid object. [b]IMPORTANT[/b]: this is an " +"Editor-only helper to create shapes, use [method CollisionObject2D." +"shape_owner_get_shape] to get the actual shape." +msgstr "" + +#: doc/classes/CollisionShape2D.xml:10 doc/classes/CollisionShape3D.xml:10 +#: doc/classes/PhysicsBody2D.xml:10 doc/classes/PhysicsBody3D.xml:10 +#: doc/classes/RigidBody3D.xml:13 doc/classes/Shape2D.xml:10 +#: doc/classes/Shape3D.xml:10 +msgid "" +"https://docs.godotengine.org/en/latest/tutorials/physics/" +"physics_introduction.html" +msgstr "" + +#: doc/classes/CollisionShape2D.xml:16 doc/classes/CollisionShape3D.xml:32 +msgid "A disabled collision shape has no effect in the world." +msgstr "" + +#: doc/classes/CollisionShape2D.xml:19 +msgid "" +"Sets whether this collision shape should only detect collision on one side " +"(top or bottom)." +msgstr "" + +#: doc/classes/CollisionShape2D.xml:22 +msgid "" +"The margin used for one-way collision (in pixels). Higher values will make " +"the shape thicker, and work better for colliders that enter the shape at a " +"high velocity." +msgstr "" + +#: doc/classes/CollisionShape2D.xml:25 doc/classes/CollisionShape3D.xml:35 +msgid "The actual shape owned by this collision shape." +msgstr "" + +#: doc/classes/CollisionShape3D.xml:4 +msgid "Node that represents collision shape data in 3D space." +msgstr "" + +#: doc/classes/CollisionShape3D.xml:7 +msgid "" +"Editor facility for creating and editing collision shapes in 3D space. You " +"can use this node to represent all sorts of collision shapes, for example, " +"add this to an [Area3D] to give it a detection shape, or add it to a " +"[PhysicsBody3D] to create a solid object. [b]IMPORTANT[/b]: this is an " +"Editor-only helper to create shapes, use [method CollisionObject3D." +"shape_owner_get_shape] to get the actual shape." +msgstr "" + +#: doc/classes/CollisionShape3D.xml:17 +msgid "" +"Sets the collision shape's shape to the addition of all its convexed " +"[MeshInstance3D] siblings geometry." +msgstr "" + +#: doc/classes/CollisionShape3D.xml:26 +msgid "" +"If this method exists within a script it will be called whenever the shape " +"resource has been modified." +msgstr "" + +#: doc/classes/Color.xml:4 +msgid "Color in RGBA format with some support for ARGB format." +msgstr "" + +#: doc/classes/Color.xml:7 +msgid "" +"A color is represented by red, green, and blue [code](r, g, b)[/code] " +"components. Additionally, [code]a[/code] represents the alpha component, " +"often used for transparency. Values are in floating-point and usually range " +"from 0 to 1. Some properties (such as [member CanvasItem.modulate]) may " +"accept values greater than 1.\n" +"You can also create a color from standardized color names by using [method " +"@GDScript.ColorN] or directly using the color constants defined here. The " +"standardized color set is based on the [url=https://en.wikipedia.org/wiki/" +"X11_color_names]X11 color names[/url]. \n" +"If you want to supply values in a range of 0 to 255, you should use [method " +"@GDScript.Color8]." +msgstr "" + +#: doc/classes/Color.xml:20 +msgid "" +"Constructs a color from an HTML hexadecimal color string in ARGB or RGB " +"format. See also [method @GDScript.ColorN].\n" +"[codeblock]\n" +"# Each of the following creates the same color RGBA(178, 217, 10, 255).\n" +"var c1 = Color(\"#ffb2d90a\") # ARGB format with \"#\".\n" +"var c2 = Color(\"ffb2d90a\") # ARGB format.\n" +"var c3 = Color(\"#b2d90a\") # RGB format with \"#\".\n" +"var c4 = Color(\"b2d90a\") # RGB format.\n" +"[/codeblock]" +msgstr "" + +#: doc/classes/Color.xml:36 +msgid "" +"Constructs a color from a 32-bit integer (each byte represents a component " +"of the RGBA profile).\n" +"[codeblock]\n" +"var c = Color(274) # Equivalent to RGBA(0, 0, 1, 18)\n" +"[/codeblock]" +msgstr "" + +#: doc/classes/Color.xml:52 +msgid "" +"Constructs a color from an RGB profile using values between 0 and 1. Alpha " +"will always be 1.\n" +"[codeblock]\n" +"var c = Color(0.2, 1.0, 0.7) # Equivalent to RGBA(51, 255, 178, 255)\n" +"[/codeblock]" +msgstr "" + +#: doc/classes/Color.xml:70 +msgid "" +"Constructs a color from an RGBA profile using values between 0 and 1.\n" +"[codeblock]\n" +"var c = Color(0.2, 1.0, 0.7, 0.8) # Equivalent to RGBA(51, 255, 178, 204)\n" +"[/codeblock]" +msgstr "" + +#: doc/classes/Color.xml:82 +msgid "" +"Returns a new color resulting from blending this color over another. If the " +"color is opaque, the result is also opaque. The second color may have a " +"range of alpha values.\n" +"[codeblock]\n" +"var bg = Color(0.0, 1.0, 0.0, 0.5) # Green with alpha of 50%\n" +"var fg = Color(1.0, 0.0, 0.0, 0.5) # Red with alpha of 50%\n" +"var blended_color = bg.blend(fg) # Brown with alpha of 75%\n" +"[/codeblock]" +msgstr "" + +#: doc/classes/Color.xml:94 +msgid "" +"Returns the most contrasting color.\n" +"[codeblock]\n" +"var c = Color(0.3, 0.4, 0.9)\n" +"var contrasted_color = c.contrasted() # Equivalent to RGBA(204, 229, 102, " +"255)\n" +"[/codeblock]" +msgstr "" + +#: doc/classes/Color.xml:107 +msgid "" +"Returns a new color resulting from making this color darker by the specified " +"percentage (ratio from 0 to 1).\n" +"[codeblock]\n" +"var green = Color(0.0, 1.0, 0.0)\n" +"var darkgreen = green.darkened(0.2) # 20% darker than regular green\n" +"[/codeblock]" +msgstr "" + +#: doc/classes/Color.xml:126 +msgid "" +"Constructs a color from an HSV profile. [code]h[/code], [code]s[/code], and " +"[code]v[/code] are values between 0 and 1.\n" +"[codeblock]\n" +"var c = Color.from_hsv(0.58, 0.5, 0.79, 0.8) # Equivalent to HSV(210, 50, " +"79, 0.8) or Color8(100, 151, 201, 0.8)\n" +"[/codeblock]" +msgstr "" + +#: doc/classes/Color.xml:136 +msgid "" +"Returns the inverted color [code](1 - r, 1 - g, 1 - b, a)[/code].\n" +"[codeblock]\n" +"var c = Color(0.3, 0.4, 0.9)\n" +"var inverted_color = c.inverted() # A color of an RGBA(178, 153, 26, 255)\n" +"[/codeblock]" +msgstr "" + +#: doc/classes/Color.xml:149 +msgid "" +"Returns [code]true[/code] if this color and [code]color[/code] are " +"approximately equal, by running [method @GDScript.is_equal_approx] on each " +"component." +msgstr "" + +#: doc/classes/Color.xml:160 +msgid "" +"Returns the linear interpolation with another color. The interpolation " +"factor [code]t[/code] is between 0 and 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.lerp(c2, 0.5) # A color of an RGBA(128, 128, 0, 255)\n" +"[/codeblock]" +msgstr "" + +#: doc/classes/Color.xml:174 +msgid "" +"Returns a new color resulting from making this color lighter by the " +"specified percentage (ratio from 0 to 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" +"[/codeblock]" +msgstr "" + +#: doc/classes/Color.xml:185 +msgid "" +"Returns the color's 32-bit integer in ABGR format (each byte represents a " +"component of the ABGR profile). ABGR is the reversed version of the default " +"format.\n" +"[codeblock]\n" +"var c = Color(1, 0.5, 0.2)\n" +"print(c.to_abgr32()) # Prints 4281565439\n" +"[/codeblock]" +msgstr "" + +#: doc/classes/Color.xml:196 +msgid "" +"Returns the color's 64-bit integer in ABGR format (each word represents a " +"component of the ABGR profile). ABGR is the reversed version of the default " +"format.\n" +"[codeblock]\n" +"var c = Color(1, 0.5, 0.2)\n" +"print(c.to_abgr64()) # Prints -225178692812801\n" +"[/codeblock]" +msgstr "" + +#: doc/classes/Color.xml:207 +msgid "" +"Returns the color's 32-bit integer in ARGB format (each byte represents a " +"component of the ARGB profile). ARGB is more compatible with DirectX.\n" +"[codeblock]\n" +"var c = Color(1, 0.5, 0.2)\n" +"print(c.to_argb32()) # Prints 4294934323\n" +"[/codeblock]" +msgstr "" + +#: doc/classes/Color.xml:218 +msgid "" +"Returns the color's 64-bit integer in ARGB format (each word represents a " +"component of the ARGB profile). ARGB is more compatible with DirectX.\n" +"[codeblock]\n" +"var c = Color(1, 0.5, 0.2)\n" +"print(c.to_argb64()) # Prints -2147470541\n" +"[/codeblock]" +msgstr "" + +#: doc/classes/Color.xml:231 +msgid "" +"Returns the color's HTML hexadecimal color string in ARGB format (ex: " +"[code]ff34f822[/code]).\n" +"Setting [code]with_alpha[/code] to [code]false[/code] excludes alpha from " +"the hexadecimal string.\n" +"[codeblock]\n" +"var c = Color(1, 1, 1, 0.5)\n" +"var s1 = c.to_html() # Returns \"7fffffff\"\n" +"var s2 = c.to_html(false) # Returns \"ffffff\"\n" +"[/codeblock]" +msgstr "" + +#: doc/classes/Color.xml:244 +msgid "" +"Returns the color's 32-bit integer in RGBA format (each byte represents a " +"component of the RGBA profile). RGBA is Godot's default format.\n" +"[codeblock]\n" +"var c = Color(1, 0.5, 0.2)\n" +"print(c.to_rgba32()) # Prints 4286526463\n" +"[/codeblock]" +msgstr "" + +#: doc/classes/Color.xml:255 +msgid "" +"Returns the color's 64-bit integer in RGBA format (each word represents a " +"component of the RGBA profile). RGBA is Godot's default format.\n" +"[codeblock]\n" +"var c = Color(1, 0.5, 0.2)\n" +"print(c.to_rgba64()) # Prints -140736629309441\n" +"[/codeblock]" +msgstr "" + +#: doc/classes/Color.xml:265 +msgid "Alpha value (range 0 to 1)." +msgstr "" + +#: doc/classes/Color.xml:268 +msgid "Alpha value (range 0 to 255)." +msgstr "" + +#: doc/classes/Color.xml:271 +msgid "Blue value (range 0 to 1)." +msgstr "" + +#: doc/classes/Color.xml:274 +msgid "Blue value (range 0 to 255)." +msgstr "" + +#: doc/classes/Color.xml:277 +msgid "Green value (range 0 to 1)." +msgstr "" + +#: doc/classes/Color.xml:280 +msgid "Green value (range 0 to 255)." +msgstr "" + +#: doc/classes/Color.xml:283 +msgid "HSV hue value (range 0 to 1)." +msgstr "" + +#: doc/classes/Color.xml:286 +msgid "Red value (range 0 to 1)." +msgstr "" + +#: doc/classes/Color.xml:289 +msgid "Red value (range 0 to 255)." +msgstr "" + +#: doc/classes/Color.xml:292 +msgid "HSV saturation value (range 0 to 1)." +msgstr "" + +#: doc/classes/Color.xml:295 +msgid "HSV value (range 0 to 1)." +msgstr "" + +#: doc/classes/Color.xml:300 +msgid "Alice blue color." +msgstr "" + +#: doc/classes/Color.xml:303 +msgid "Antique white color." +msgstr "" + +#: doc/classes/Color.xml:306 +msgid "Aqua color." +msgstr "" + +#: doc/classes/Color.xml:309 +msgid "Aquamarine color." +msgstr "" + +#: doc/classes/Color.xml:312 +msgid "Azure color." +msgstr "" + +#: doc/classes/Color.xml:315 +msgid "Beige color." +msgstr "" + +#: doc/classes/Color.xml:318 +msgid "Bisque color." +msgstr "" + +#: doc/classes/Color.xml:321 +msgid "Black color." +msgstr "" + +#: doc/classes/Color.xml:324 +msgid "Blanche almond color." +msgstr "" + +#: doc/classes/Color.xml:327 +msgid "Blue color." +msgstr "" + +#: doc/classes/Color.xml:330 +msgid "Blue violet color." +msgstr "" + +#: doc/classes/Color.xml:333 +msgid "Brown color." +msgstr "" + +#: doc/classes/Color.xml:336 +msgid "Burly wood color." +msgstr "" + +#: doc/classes/Color.xml:339 +msgid "Cadet blue color." +msgstr "" + +#: doc/classes/Color.xml:342 +msgid "Chartreuse color." +msgstr "" + +#: doc/classes/Color.xml:345 +msgid "Chocolate color." +msgstr "" + +#: doc/classes/Color.xml:348 +msgid "Coral color." +msgstr "" + +#: doc/classes/Color.xml:351 +msgid "Cornflower color." +msgstr "" + +#: doc/classes/Color.xml:354 +msgid "Corn silk color." +msgstr "" + +#: doc/classes/Color.xml:357 +msgid "Crimson color." +msgstr "" + +#: doc/classes/Color.xml:360 +msgid "Cyan color." +msgstr "" + +#: doc/classes/Color.xml:363 +msgid "Dark blue color." +msgstr "" + +#: doc/classes/Color.xml:366 +msgid "Dark cyan color." +msgstr "" + +#: doc/classes/Color.xml:369 +msgid "Dark goldenrod color." +msgstr "" + +#: doc/classes/Color.xml:372 +msgid "Dark gray color." +msgstr "" + +#: doc/classes/Color.xml:375 +msgid "Dark green color." +msgstr "" + +#: doc/classes/Color.xml:378 +msgid "Dark khaki color." +msgstr "" + +#: doc/classes/Color.xml:381 +msgid "Dark magenta color." +msgstr "" + +#: doc/classes/Color.xml:384 +msgid "Dark olive green color." +msgstr "" + +#: doc/classes/Color.xml:387 +msgid "Dark orange color." +msgstr "" + +#: doc/classes/Color.xml:390 +msgid "Dark orchid color." +msgstr "" + +#: doc/classes/Color.xml:393 +msgid "Dark red color." +msgstr "" + +#: doc/classes/Color.xml:396 +msgid "Dark salmon color." +msgstr "" + +#: doc/classes/Color.xml:399 +msgid "Dark sea green color." +msgstr "" + +#: doc/classes/Color.xml:402 +msgid "Dark slate blue color." +msgstr "" + +#: doc/classes/Color.xml:405 +msgid "Dark slate gray color." +msgstr "" + +#: doc/classes/Color.xml:408 +msgid "Dark turquoise color." +msgstr "" + +#: doc/classes/Color.xml:411 +msgid "Dark violet color." +msgstr "" + +#: doc/classes/Color.xml:414 +msgid "Deep pink color." +msgstr "" + +#: doc/classes/Color.xml:417 +msgid "Deep sky blue color." +msgstr "" + +#: doc/classes/Color.xml:420 +msgid "Dim gray color." +msgstr "" + +#: doc/classes/Color.xml:423 +msgid "Dodger blue color." +msgstr "" + +#: doc/classes/Color.xml:426 +msgid "Firebrick color." +msgstr "" + +#: doc/classes/Color.xml:429 +msgid "Floral white color." +msgstr "" + +#: doc/classes/Color.xml:432 +msgid "Forest green color." +msgstr "" + +#: doc/classes/Color.xml:435 +msgid "Fuchsia color." +msgstr "" + +#: doc/classes/Color.xml:438 +msgid "Gainsboro color." +msgstr "" + +#: doc/classes/Color.xml:441 +msgid "Ghost white color." +msgstr "" + +#: doc/classes/Color.xml:444 +msgid "Gold color." +msgstr "" + +#: doc/classes/Color.xml:447 +msgid "Goldenrod color." +msgstr "" + +#: doc/classes/Color.xml:450 +msgid "Gray color." +msgstr "" + +#: doc/classes/Color.xml:453 +msgid "Green color." +msgstr "" + +#: doc/classes/Color.xml:456 +msgid "Green yellow color." +msgstr "" + +#: doc/classes/Color.xml:459 +msgid "Honeydew color." +msgstr "" + +#: doc/classes/Color.xml:462 +msgid "Hot pink color." +msgstr "" + +#: doc/classes/Color.xml:465 +msgid "Indian red color." +msgstr "" + +#: doc/classes/Color.xml:468 +msgid "Indigo color." +msgstr "" + +#: doc/classes/Color.xml:471 +msgid "Ivory color." +msgstr "" + +#: doc/classes/Color.xml:474 +msgid "Khaki color." +msgstr "" + +#: doc/classes/Color.xml:477 +msgid "Lavender color." +msgstr "" + +#: doc/classes/Color.xml:480 +msgid "Lavender blush color." +msgstr "" + +#: doc/classes/Color.xml:483 +msgid "Lawn green color." +msgstr "" + +#: doc/classes/Color.xml:486 +msgid "Lemon chiffon color." +msgstr "" + +#: doc/classes/Color.xml:489 +msgid "Light blue color." +msgstr "" + +#: doc/classes/Color.xml:492 +msgid "Light coral color." +msgstr "" + +#: doc/classes/Color.xml:495 +msgid "Light cyan color." +msgstr "" + +#: doc/classes/Color.xml:498 +msgid "Light goldenrod color." +msgstr "" + +#: doc/classes/Color.xml:501 +msgid "Light gray color." +msgstr "" + +#: doc/classes/Color.xml:504 +msgid "Light green color." +msgstr "" + +#: doc/classes/Color.xml:507 +msgid "Light pink color." +msgstr "" + +#: doc/classes/Color.xml:510 +msgid "Light salmon color." +msgstr "" + +#: doc/classes/Color.xml:513 +msgid "Light sea green color." +msgstr "" + +#: doc/classes/Color.xml:516 +msgid "Light sky blue color." +msgstr "" + +#: doc/classes/Color.xml:519 +msgid "Light slate gray color." +msgstr "" + +#: doc/classes/Color.xml:522 +msgid "Light steel blue color." +msgstr "" + +#: doc/classes/Color.xml:525 +msgid "Light yellow color." +msgstr "" + +#: doc/classes/Color.xml:528 +msgid "Lime color." +msgstr "" + +#: doc/classes/Color.xml:531 +msgid "Lime green color." +msgstr "" + +#: doc/classes/Color.xml:534 +msgid "Linen color." +msgstr "" + +#: doc/classes/Color.xml:537 +msgid "Magenta color." +msgstr "" + +#: doc/classes/Color.xml:540 +msgid "Maroon color." +msgstr "" + +#: doc/classes/Color.xml:543 +msgid "Medium aquamarine color." +msgstr "" + +#: doc/classes/Color.xml:546 +msgid "Medium blue color." +msgstr "" + +#: doc/classes/Color.xml:549 +msgid "Medium orchid color." +msgstr "" + +#: doc/classes/Color.xml:552 +msgid "Medium purple color." +msgstr "" + +#: doc/classes/Color.xml:555 +msgid "Medium sea green color." +msgstr "" + +#: doc/classes/Color.xml:558 +msgid "Medium slate blue color." +msgstr "" + +#: doc/classes/Color.xml:561 +msgid "Medium spring green color." +msgstr "" + +#: doc/classes/Color.xml:564 +msgid "Medium turquoise color." +msgstr "" + +#: doc/classes/Color.xml:567 +msgid "Medium violet red color." +msgstr "" + +#: doc/classes/Color.xml:570 +msgid "Midnight blue color." +msgstr "" + +#: doc/classes/Color.xml:573 +msgid "Mint cream color." +msgstr "" + +#: doc/classes/Color.xml:576 +msgid "Misty rose color." +msgstr "" + +#: doc/classes/Color.xml:579 +msgid "Moccasin color." +msgstr "" + +#: doc/classes/Color.xml:582 +msgid "Navajo white color." +msgstr "" + +#: doc/classes/Color.xml:585 +msgid "Navy blue color." +msgstr "" + +#: doc/classes/Color.xml:588 +msgid "Old lace color." +msgstr "" + +#: doc/classes/Color.xml:591 +msgid "Olive color." +msgstr "" + +#: doc/classes/Color.xml:594 +msgid "Olive drab color." +msgstr "" + +#: doc/classes/Color.xml:597 +msgid "Orange color." +msgstr "" + +#: doc/classes/Color.xml:600 +msgid "Orange red color." +msgstr "" + +#: doc/classes/Color.xml:603 +msgid "Orchid color." +msgstr "" + +#: doc/classes/Color.xml:606 +msgid "Pale goldenrod color." +msgstr "" + +#: doc/classes/Color.xml:609 +msgid "Pale green color." +msgstr "" + +#: doc/classes/Color.xml:612 +msgid "Pale turquoise color." +msgstr "" + +#: doc/classes/Color.xml:615 +msgid "Pale violet red color." +msgstr "" + +#: doc/classes/Color.xml:618 +msgid "Papaya whip color." +msgstr "" + +#: doc/classes/Color.xml:621 +msgid "Peach puff color." +msgstr "" + +#: doc/classes/Color.xml:624 +msgid "Peru color." +msgstr "" + +#: doc/classes/Color.xml:627 +msgid "Pink color." +msgstr "" + +#: doc/classes/Color.xml:630 +msgid "Plum color." +msgstr "" + +#: doc/classes/Color.xml:633 +msgid "Powder blue color." +msgstr "" + +#: doc/classes/Color.xml:636 +msgid "Purple color." +msgstr "" + +#: doc/classes/Color.xml:639 +msgid "Rebecca purple color." +msgstr "" + +#: doc/classes/Color.xml:642 +msgid "Red color." +msgstr "" + +#: doc/classes/Color.xml:645 +msgid "Rosy brown color." +msgstr "" + +#: doc/classes/Color.xml:648 +msgid "Royal blue color." +msgstr "" + +#: doc/classes/Color.xml:651 +msgid "Saddle brown color." +msgstr "" + +#: doc/classes/Color.xml:654 +msgid "Salmon color." +msgstr "" + +#: doc/classes/Color.xml:657 +msgid "Sandy brown color." +msgstr "" + +#: doc/classes/Color.xml:660 +msgid "Sea green color." +msgstr "" + +#: doc/classes/Color.xml:663 +msgid "Seashell color." +msgstr "" + +#: doc/classes/Color.xml:666 +msgid "Sienna color." +msgstr "" + +#: doc/classes/Color.xml:669 +msgid "Silver color." +msgstr "" + +#: doc/classes/Color.xml:672 +msgid "Sky blue color." +msgstr "" + +#: doc/classes/Color.xml:675 +msgid "Slate blue color." +msgstr "" + +#: doc/classes/Color.xml:678 +msgid "Slate gray color." +msgstr "" + +#: doc/classes/Color.xml:681 +msgid "Snow color." +msgstr "" + +#: doc/classes/Color.xml:684 +msgid "Spring green color." +msgstr "" + +#: doc/classes/Color.xml:687 +msgid "Steel blue color." +msgstr "" + +#: doc/classes/Color.xml:690 +msgid "Tan color." +msgstr "" + +#: doc/classes/Color.xml:693 +msgid "Teal color." +msgstr "" + +#: doc/classes/Color.xml:696 +msgid "Thistle color." +msgstr "" + +#: doc/classes/Color.xml:699 +msgid "Tomato color." +msgstr "" + +#: doc/classes/Color.xml:702 +msgid "Transparent color (white with no alpha)." +msgstr "" + +#: doc/classes/Color.xml:705 +msgid "Turquoise color." +msgstr "" + +#: doc/classes/Color.xml:708 +msgid "Violet color." +msgstr "" + +#: doc/classes/Color.xml:711 +msgid "Web gray color." +msgstr "" + +#: doc/classes/Color.xml:714 +msgid "Web green color." +msgstr "" + +#: doc/classes/Color.xml:717 +msgid "Web maroon color." +msgstr "" + +#: doc/classes/Color.xml:720 +msgid "Web purple color." +msgstr "" + +#: doc/classes/Color.xml:723 +msgid "Wheat color." +msgstr "" + +#: doc/classes/Color.xml:726 +msgid "White color." +msgstr "" + +#: doc/classes/Color.xml:729 +msgid "White smoke color." +msgstr "" + +#: doc/classes/Color.xml:732 +msgid "Yellow color." +msgstr "" + +#: doc/classes/Color.xml:735 +msgid "Yellow green color." +msgstr "" + +#: doc/classes/ColorPicker.xml:4 +msgid "Color picker control." +msgstr "" + +#: doc/classes/ColorPicker.xml:7 +msgid "" +"Displays a color picker widget. Useful for selecting a color from an RGB/" +"RGBA colorspace." +msgstr "" + +#: doc/classes/ColorPicker.xml:18 +msgid "" +"Adds the given color to a list of color presets. The presets are displayed " +"in the color picker and the user will be able to select them.\n" +"[b]Note:[/b] the presets list is only for [i]this[/i] color picker." +msgstr "" + +#: doc/classes/ColorPicker.xml:28 +msgid "" +"Removes the given color from the list of color presets of this color picker." +msgstr "" + +#: doc/classes/ColorPicker.xml:35 +msgid "Returns the list of colors in the presets of the color picker." +msgstr "" + +#: doc/classes/ColorPicker.xml:41 doc/classes/ColorPickerButton.xml:29 +msgid "The currently selected color." +msgstr "" + +#: doc/classes/ColorPicker.xml:44 +msgid "" +"If [code]true[/code], the color will apply only after the user releases the " +"mouse button, otherwise it will apply immediately even in mouse motion event " +"(which can cause performance issues)." +msgstr "" + +#: doc/classes/ColorPicker.xml:47 +msgid "If [code]true[/code], shows an alpha channel slider (transparency)." +msgstr "" + +#: doc/classes/ColorPicker.xml:50 +msgid "" +"If [code]true[/code], allows editing the color with Hue/Saturation/Value " +"sliders.\n" +"[b]Note:[/b] Cannot be enabled if raw mode is on." +msgstr "" + +#: doc/classes/ColorPicker.xml:54 +msgid "If [code]true[/code], the \"add preset\" button is enabled." +msgstr "" + +#: doc/classes/ColorPicker.xml:57 +msgid "If [code]true[/code], saved color presets are visible." +msgstr "" + +#: doc/classes/ColorPicker.xml:60 +msgid "" +"If [code]true[/code], allows the color R, G, B component values to go beyond " +"1.0, which can be used for certain special operations that require it (like " +"tinting without darkening or rendering sprites in HDR).\n" +"[b]Note:[/b] Cannot be enabled if HSV mode is on." +msgstr "" + +#: doc/classes/ColorPicker.xml:69 +msgid "Emitted when the color is changed." +msgstr "" + +#: doc/classes/ColorPicker.xml:76 +msgid "Emitted when a preset is added." +msgstr "" + +#: doc/classes/ColorPicker.xml:83 +msgid "Emitted when a preset is removed." +msgstr "" + +#: doc/classes/ColorPicker.xml:91 +msgid "The icon for the \"Add Preset\" button." +msgstr "" + +#: doc/classes/ColorPicker.xml:94 +msgid "Custom texture for the hue selection slider on the right." +msgstr "" + +#: doc/classes/ColorPicker.xml:99 +msgid "The width of the hue selection slider." +msgstr "" + +#: doc/classes/ColorPicker.xml:104 +msgid "The margin around the [ColorPicker]." +msgstr "" + +#: doc/classes/ColorPicker.xml:107 +msgid "" +"The indicator used to signalize that the color value is outside the 0-1 " +"range." +msgstr "" + +#: doc/classes/ColorPicker.xml:112 +msgid "The icon for the screen color picker button." +msgstr "" + +#: doc/classes/ColorPicker.xml:115 +msgid "The height of the saturation-value selection box." +msgstr "" + +#: doc/classes/ColorPicker.xml:118 +msgid "The width of the saturation-value selection box." +msgstr "" + +#: doc/classes/ColorPickerButton.xml:4 +msgid "Button that pops out a [ColorPicker]." +msgstr "" + +#: doc/classes/ColorPickerButton.xml:7 +msgid "" +"Encapsulates a [ColorPicker] making it accessible by pressing a button. " +"Pressing the button will toggle the [ColorPicker] visibility." +msgstr "" + +#: doc/classes/ColorPickerButton.xml:16 +msgid "Returns the [ColorPicker] that this node toggles." +msgstr "" + +#: doc/classes/ColorPickerButton.xml:23 +msgid "" +"Returns the control's [PopupPanel] which allows you to connect to popup " +"signals. This allows you to handle events when the ColorPicker is shown or " +"hidden." +msgstr "" + +#: doc/classes/ColorPickerButton.xml:32 +msgid "" +"If [code]true[/code], the alpha channel in the displayed [ColorPicker] will " +"be visible." +msgstr "" + +#: doc/classes/ColorPickerButton.xml:41 +msgid "Emitted when the color changes." +msgstr "" + +#: doc/classes/ColorPickerButton.xml:46 +msgid "" +"Emitted when the [ColorPicker] is created (the button is pressed for the " +"first time)." +msgstr "" + +#: doc/classes/ColorPickerButton.xml:51 +msgid "Emitted when the [ColorPicker] is closed." +msgstr "" + +#: doc/classes/ColorPickerButton.xml:59 +msgid "The background of the color preview rect on the button." +msgstr "" + +#: doc/classes/ColorPickerButton.xml:62 +msgid "[StyleBox] used when the [ColorPickerButton] is disabled." +msgstr "" + +#: doc/classes/ColorPickerButton.xml:65 +msgid "" +"[StyleBox] used when the [ColorPickerButton] is focused. It is displayed " +"over the current [StyleBox], so using [StyleBoxEmpty] will just disable the " +"focus visual effect." +msgstr "" + +#: doc/classes/ColorPickerButton.xml:68 +msgid "[Font] of the [ColorPickerButton]'s text." +msgstr "" + +#: doc/classes/ColorPickerButton.xml:71 +msgid "Default text [Color] of the [ColorPickerButton]." +msgstr "" + +#: doc/classes/ColorPickerButton.xml:74 +msgid "Text [Color] used when the [ColorPickerButton] is disabled." +msgstr "" + +#: doc/classes/ColorPickerButton.xml:77 +msgid "Text [Color] used when the [ColorPickerButton] is being hovered." +msgstr "" + +#: doc/classes/ColorPickerButton.xml:80 +msgid "Text [Color] used when the [ColorPickerButton] is being pressed." +msgstr "" + +#: doc/classes/ColorPickerButton.xml:83 +msgid "[StyleBox] used when the [ColorPickerButton] is being hovered." +msgstr "" + +#: doc/classes/ColorPickerButton.xml:86 +msgid "The horizontal space between [ColorPickerButton]'s icon and text." +msgstr "" + +#: doc/classes/ColorPickerButton.xml:89 +msgid "Default [StyleBox] for the [ColorPickerButton]." +msgstr "" + +#: doc/classes/ColorPickerButton.xml:92 +msgid "[StyleBox] used when the [ColorPickerButton] is being pressed." +msgstr "" + +#: doc/classes/ColorRect.xml:4 +msgid "Colored rectangle." +msgstr "" + +#: doc/classes/ColorRect.xml:7 +msgid "Displays a colored rectangle." +msgstr "" + +#: doc/classes/ColorRect.xml:15 +msgid "" +"The fill color.\n" +"[codeblock]\n" +"$ColorRect.color = Color(1, 0, 0, 1) # Set ColorRect's color to red.\n" +"[/codeblock]" +msgstr "" + +#: doc/classes/ConcavePolygonShape2D.xml:4 +msgid "Concave polygon 2D shape resource for physics." +msgstr "" + +#: doc/classes/ConcavePolygonShape2D.xml:7 +msgid "" +"Concave polygon 2D shape resource for physics. It is made out of segments " +"and is optimal for complex polygonal concave collisions. However, it is not " +"advised to use for [RigidBody2D] nodes. A CollisionPolygon2D in convex " +"decomposition mode (solids) or several convex objects are advised for that " +"instead. Otherwise, a concave polygon 2D shape is better for static " +"collisions.\n" +"The main difference between a [ConvexPolygonShape2D] and a " +"[ConcavePolygonShape2D] is that a concave polygon assumes it is concave and " +"uses a more complex method of collision detection, and a convex one forces " +"itself to be convex in order to speed up collision detection." +msgstr "" + +#: doc/classes/ConcavePolygonShape2D.xml:16 +msgid "" +"The array of points that make up the [ConcavePolygonShape2D]'s line segments." +msgstr "" + +#: doc/classes/ConcavePolygonShape3D.xml:4 +msgid "Concave polygon shape." +msgstr "" + +#: doc/classes/ConcavePolygonShape3D.xml:7 +msgid "" +"Concave polygon shape resource, which can be set into a [PhysicsBody3D] or " +"area. This shape is created by feeding a list of triangles.\n" +"Note: when used for collision, [ConcavePolygonShape3D] is intended to work " +"with static [PhysicsBody3D] nodes like [StaticBody3D] and will not work with " +"[KinematicBody3D] or [RigidBody3D] with a mode other than Static." +msgstr "" + +#: doc/classes/ConcavePolygonShape3D.xml:17 +msgid "Returns the faces (an array of triangles)." +msgstr "" + +#: doc/classes/ConcavePolygonShape3D.xml:26 +msgid "Sets the faces (an array of triangles)." +msgstr "" + +#: doc/classes/ConeTwistJoint3D.xml:4 +msgid "A twist joint between two 3D bodies." +msgstr "" + +#: doc/classes/ConeTwistJoint3D.xml:7 +msgid "" +"The joint can rotate the bodies across an axis defined by the local x-axes " +"of the [Joint3D].\n" +"The twist axis is initiated as the X axis of the [Joint3D].\n" +"Once the Bodies swing, the twist axis is calculated as the middle of the x-" +"axes of the Joint3D in the local space of the two Bodies." +msgstr "" + +#: doc/classes/ConeTwistJoint3D.xml:35 doc/classes/ConeTwistJoint3D.xml:67 +#: doc/classes/PhysicsServer3D.xml:1400 +msgid "" +"The speed with which the swing or twist will take place.\n" +"The higher, the faster." +msgstr "" + +#: doc/classes/ConeTwistJoint3D.xml:39 doc/classes/ConeTwistJoint3D.xml:74 +#: doc/classes/PhysicsServer3D.xml:1407 +msgid "" +"Defines, how fast the swing- and twist-speed-difference on both sides gets " +"synced." +msgstr "" + +#: doc/classes/ConeTwistJoint3D.xml:42 doc/classes/ConeTwistJoint3D.xml:71 +msgid "" +"The ease with which the joint starts to twist. If it's too low, it takes " +"more force to start twisting the joint." +msgstr "" + +#: doc/classes/ConeTwistJoint3D.xml:45 doc/classes/ConeTwistJoint3D.xml:57 +#: doc/classes/PhysicsServer3D.xml:1390 +msgid "" +"Swing is rotation from side to side, around the axis perpendicular to the " +"twist axis.\n" +"The swing span defines, how much rotation will not get corrected along the " +"swing axis.\n" +"Could be defined as looseness in the [ConeTwistJoint3D].\n" +"If below 0.05, this behavior is locked." +msgstr "" + +#: doc/classes/ConeTwistJoint3D.xml:51 doc/classes/ConeTwistJoint3D.xml:63 +#: doc/classes/PhysicsServer3D.xml:1396 +msgid "" +"Twist is the rotation around the twist axis, this value defined how far the " +"joint can twist.\n" +"Twist is locked if below 0.05." +msgstr "" + +#: doc/classes/ConeTwistJoint3D.xml:77 doc/classes/Generic6DOFJoint3D.xml:404 +#: 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 "" + +#: doc/classes/ConfigFile.xml:4 +msgid "Helper class to handle INI-style files." +msgstr "" + +#: doc/classes/ConfigFile.xml:7 +msgid "" +"This helper class can be used to store [Variant] values on the filesystem " +"using INI-style formatting. The stored values are identified by a section " +"and a key:\n" +"[codeblock]\n" +"[section]\n" +"some_key=42\n" +"string_example=\"Hello World3D!\"\n" +"a_vector=Vector3( 1, 0, 2 )\n" +"[/codeblock]\n" +"The stored data can be saved to or parsed from a file, though ConfigFile " +"objects can also be used directly without accessing the filesystem.\n" +"The following example shows how to parse an INI-style file from the system, " +"read its contents and store new values in it:\n" +"[codeblock]\n" +"var config = ConfigFile.new()\n" +"var err = config.load(\"user://settings.cfg\")\n" +"if err == OK: # If not, something went wrong with the file loading\n" +" # Look for the display/width pair, and default to 1024 if missing\n" +" var screen_width = config.get_value(\"display\", \"width\", 1024)\n" +" # Store a variable if and only if it hasn't been defined yet\n" +" if not config.has_section_key(\"audio\", \"mute\"):\n" +" config.set_value(\"audio\", \"mute\", false)\n" +" # Save the changes by overwriting the previous file\n" +" config.save(\"user://settings.cfg\")\n" +"[/codeblock]\n" +"Keep in mind that section and property names can't contain spaces. Anything " +"after a space will be ignored on save and on load.\n" +"ConfigFiles can also contain manually written comment lines starting with a " +"semicolon ([code];[/code]). Those lines will be ignored when parsing the " +"file. Note that comments will be lost when saving the ConfigFile. This can " +"still be useful for dedicated server configuration files, which are " +"typically never overwritten without explicit user action." +msgstr "" + +#: doc/classes/ConfigFile.xml:40 +msgid "" +"Deletes the specified section along with all the key-value pairs inside. " +"Raises an error if the section does not exist." +msgstr "" + +#: doc/classes/ConfigFile.xml:51 +msgid "" +"Deletes the specified key in a section. Raises an error if either the " +"section or the key do not exist." +msgstr "" + +#: doc/classes/ConfigFile.xml:60 +msgid "" +"Returns an array of all defined key identifiers in the specified section. " +"Raises an error and returns an empty array if the section does not exist." +msgstr "" + +#: doc/classes/ConfigFile.xml:67 +msgid "Returns an array of all defined section identifiers." +msgstr "" + +#: doc/classes/ConfigFile.xml:80 +msgid "" +"Returns the current value for the specified section and key. If either the " +"section or the key do not exist, the method returns the fallback " +"[code]default[/code] value. If [code]default[/code] is not specified or set " +"to [code]null[/code], an error is also raised." +msgstr "" + +#: doc/classes/ConfigFile.xml:89 +msgid "Returns [code]true[/code] if the specified section exists." +msgstr "" + +#: doc/classes/ConfigFile.xml:100 +msgid "Returns [code]true[/code] if the specified section-key pair exists." +msgstr "" + +#: doc/classes/ConfigFile.xml:109 +msgid "" +"Loads the config file specified as a parameter. The file's contents are " +"parsed and loaded in the [ConfigFile] object which the method was called " +"on.\n" +"Returns one of the [enum Error] code constants ([code]OK[/code] on success)." +msgstr "" + +#: doc/classes/ConfigFile.xml:121 +msgid "" +"Loads the encrypted config file specified as a parameter, using the provided " +"[code]key[/code] to decrypt it. The file's contents are parsed and loaded in " +"the [ConfigFile] object which the method was called on.\n" +"Returns one of the [enum Error] code constants ([code]OK[/code] on success)." +msgstr "" + +#: doc/classes/ConfigFile.xml:133 +msgid "" +"Loads the encrypted config file specified as a parameter, using the provided " +"[code]password[/code] to decrypt it. The file's contents are parsed and " +"loaded in the [ConfigFile] object which the method was called on.\n" +"Returns one of the [enum Error] code constants ([code]OK[/code] on success)." +msgstr "" + +#: doc/classes/ConfigFile.xml:143 +msgid "" +"Parses the the passed string as the contents of a config file. The string is " +"parsed and loaded in the ConfigFile object which the method was called on.\n" +"Returns one of the [enum Error] code constants ([code]OK[/code] on success)." +msgstr "" + +#: doc/classes/ConfigFile.xml:153 +msgid "" +"Saves the contents of the [ConfigFile] object to the file specified as a " +"parameter. The output file uses an INI-style structure.\n" +"Returns one of the [enum Error] code constants ([code]OK[/code] on success)." +msgstr "" + +#: doc/classes/ConfigFile.xml:165 +msgid "" +"Saves the contents of the [ConfigFile] object to the AES-256 encrypted file " +"specified as a parameter, using the provided [code]key[/code] to encrypt it. " +"The output file uses an INI-style structure.\n" +"Returns one of the [enum Error] code constants ([code]OK[/code] on success)." +msgstr "" + +#: doc/classes/ConfigFile.xml:177 +msgid "" +"Saves the contents of the [ConfigFile] object to the AES-256 encrypted file " +"specified as a parameter, using the provided [code]password[/code] to " +"encrypt it. The output file uses an INI-style structure.\n" +"Returns one of the [enum Error] code constants ([code]OK[/code] on success)." +msgstr "" + +#: doc/classes/ConfigFile.xml:191 +msgid "" +"Assigns a value to the specified key of the specified section. If either the " +"section or the key do not exist, they are created. Passing a [code]null[/" +"code] value deletes the specified key if it exists, and deletes the section " +"if it ends up empty once the key has been removed." +msgstr "" + +#: doc/classes/ConfirmationDialog.xml:4 +msgid "Dialog for confirmation of actions." +msgstr "" + +#: doc/classes/ConfirmationDialog.xml:7 +msgid "" +"Dialog for confirmation of actions. This dialog inherits from " +"[AcceptDialog], but has by default an OK and Cancel button (in host OS " +"order).\n" +"To get cancel action, you can use:\n" +"[codeblock]\n" +"get_cancel().connect(\"pressed\", self, \"cancelled\")\n" +"[/codeblock]." +msgstr "" + +#: doc/classes/ConfirmationDialog.xml:20 +msgid "Returns the cancel button." +msgstr "" + +#: doc/classes/Container.xml:4 +msgid "Base node for containers." +msgstr "" + +#: doc/classes/Container.xml:7 +msgid "" +"Base node for containers. A [Container] contains other controls and " +"automatically arranges them in a certain way.\n" +"A Control can inherit this to create custom container classes." +msgstr "" + +#: doc/classes/Container.xml:21 +msgid "" +"Fit a child control in a given rect. This is mainly a helper for creating " +"custom container classes." +msgstr "" + +#: doc/classes/Container.xml:28 +msgid "" +"Queue resort of the contained children. This is called automatically anyway, " +"but can be called upon request." +msgstr "" + +#: doc/classes/Container.xml:38 +msgid "Emitted when sorting the children is needed." +msgstr "" + +#: doc/classes/Container.xml:44 +msgid "" +"Notification for when sorting the children, it must be obeyed immediately." +msgstr "" + +#: doc/classes/Control.xml:4 +msgid "" +"All user interface nodes inherit from Control. A control's anchors and " +"margins adapt its position and size relative to its parent." +msgstr "" + +#: doc/classes/Control.xml:7 +msgid "" +"Base class for all UI-related nodes. [Control] features a bounding rectangle " +"that defines its extents, an anchor position relative to its parent control " +"or the current viewport, and margins that represent an offset to the anchor. " +"The margins update automatically when the node, any of its parents, or the " +"screen size change.\n" +"For more information on Godot's UI system, anchors, margins, and containers, " +"see the related tutorials in the manual. To build flexible UIs, you'll need " +"a mix of UI elements that inherit from [Control] and [Container] nodes.\n" +"[b]User Interface nodes and input[/b]\n" +"Godot sends input events to the scene's root node first, by calling [method " +"Node._input]. [method Node._input] forwards the event down the node tree to " +"the nodes under the mouse cursor, or on keyboard focus. To do so, it calls " +"[code]MainLoop._input_event[/code].\n" +"[b]FIXME:[/b] No longer valid after DisplayServer split and Input " +"refactoring.\n" +"Call [method accept_event] so no other node receives the event. Once you " +"accepted an input, it becomes handled so [method Node._unhandled_input] will " +"not process it.\n" +"Only one [Control] node can be in keyboard focus. Only the node in focus " +"will receive keyboard events. To get the focus, call [method grab_focus]. " +"[Control] nodes lose focus when another node grabs it, or if you hide the " +"node in focus.\n" +"Sets [member mouse_filter] to [constant MOUSE_FILTER_IGNORE] to tell a " +"[Control] node to ignore mouse or touch events. You'll need it if you place " +"an icon on top of a button.\n" +"[Theme] resources change the Control's appearance. If you change the [Theme] " +"on a [Control] node, it affects all of its children. To override some of the " +"theme's parameters, call one of the [code]add_theme_*_override[/code] " +"methods, like [method add_theme_font_override]. You can override the theme " +"with the inspector." +msgstr "" + +#: doc/classes/Control.xml:18 +msgid "https://docs.godotengine.org/en/latest/tutorials/gui/index.html" +msgstr "" + +#: doc/classes/Control.xml:26 +msgid "" +"Virtual method to be implemented by the user. Returns whether [method " +"_gui_input] should not be called for children controls outside this " +"control's rectangle. Input will be clipped to the Rect of this [Control]. " +"Similar to [member rect_clip_content], but doesn't affect visibility.\n" +"If not overridden, defaults to [code]false[/code]." +msgstr "" + +#: doc/classes/Control.xml:34 +msgid "" +"Virtual method to be implemented by the user. Returns the minimum size for " +"this control. Alternative to [member rect_min_size] for controlling minimum " +"size via code. The actual minimum size will be the max value of these two " +"(in each axis separately).\n" +"If not overridden, defaults to [constant Vector2.ZERO]." +msgstr "" + +#: doc/classes/Control.xml:44 +msgid "" +"Virtual method to be implemented by the user. Use this method to process and " +"accept inputs on UI elements. See [method accept_event].\n" +"Example: clicking a control.\n" +"[codeblock]\n" +"func _gui_input(event):\n" +" if event is InputEventMouseButton:\n" +" if event.button_index == BUTTON_LEFT and event.pressed:\n" +" print(\"I've been clicked D:\")\n" +"[/codeblock]\n" +"The event won't trigger if:\n" +"* clicking outside the control (see [method has_point]);\n" +"* control has [member mouse_filter] set to [constant MOUSE_FILTER_IGNORE];\n" +"* control is obstructed by another [Control] on top of it, which doesn't " +"have [member mouse_filter] set to [constant MOUSE_FILTER_IGNORE];\n" +"* control's parent has [member mouse_filter] set to [constant " +"MOUSE_FILTER_STOP] or has accepted the event;\n" +"* it happens outside parent's rectangle and the parent has either [member " +"rect_clip_content] or [method _clips_input] enabled." +msgstr "" + +#: doc/classes/Control.xml:66 +msgid "" +"Virtual method to be implemented by the user. Returns a [Control] node that " +"should be used as a tooltip instead of the default one. Use [code]for_text[/" +"code] parameter to determine what text the tooltip should contain (likely " +"the contents of [member hint_tooltip]).\n" +"The returned node must be of type [Control] or Control-derieved. It can have " +"child nodes of any type. It is freed when the tooltip disappears, so make " +"sure you always provide a new instance, not e.g. a node from scene. When " +"[code]null[/code] or non-Control node is returned, the default tooltip will " +"be used instead.\n" +"[b]Note:[/b] The tooltip is shrunk to minimal size. If you want to ensure " +"it's fully visible, you might want to set its [member rect_min_size] to some " +"non-zero value.\n" +"Example of usage with custom-constructed node:\n" +"[codeblock]\n" +"func _make_custom_tooltip(for_text):\n" +" var label = Label.new()\n" +" label.text = for_text\n" +" return label\n" +"[/codeblock]\n" +"Example of usage with custom scene instance:\n" +"[codeblock]\n" +"func _make_custom_tooltip(for_text):\n" +" var tooltip = preload(\"SomeTooltipScene.tscn\").instance()\n" +" tooltip.get_node(\"Label\").text = for_text\n" +" return tooltip\n" +"[/codeblock]" +msgstr "" + +#: doc/classes/Control.xml:89 +msgid "" +"Marks an input event as handled. Once you accept an input event, it stops " +"propagating, even to nodes listening to [method Node._unhandled_input] or " +"[method Node._unhandled_key_input]." +msgstr "" + +#: doc/classes/Control.xml:100 +msgid "" +"Overrides the [Color] with given [code]name[/code] in the [member theme] " +"resource the control uses. If the [code]color[/code] is empty or invalid, " +"the override is cleared and the color from assigned [Theme] is used." +msgstr "" + +#: doc/classes/Control.xml:111 +msgid "" +"Overrides an integer constant with given [code]name[/code] in the [member " +"theme] resource the control uses. If the [code]constant[/code] is empty or " +"invalid, the override is cleared and the constant from assigned [Theme] is " +"used." +msgstr "" + +#: doc/classes/Control.xml:122 +msgid "" +"Overrides the font with given [code]name[/code] in the [member theme] " +"resource the control uses. If [code]font[/code] is empty or invalid, the " +"override is cleared and the font from assigned [Theme] is used." +msgstr "" + +#: doc/classes/Control.xml:133 +msgid "" +"Overrides the icon with given [code]name[/code] in the [member theme] " +"resource the control uses. If [code]icon[/code] is empty or invalid, the " +"override is cleared and the icon from assigned [Theme] is used." +msgstr "" + +#: doc/classes/Control.xml:144 +msgid "" +"Overrides the [Shader] with given [code]name[/code] in the [member theme] " +"resource the control uses. If [code]shader[/code] is empty or invalid, the " +"override is cleared and the shader from assigned [Theme] is used." +msgstr "" + +#: doc/classes/Control.xml:155 +msgid "" +"Overrides the [StyleBox] with given [code]name[/code] in the [member theme] " +"resource the control uses. If [code]stylebox[/code] is empty or invalid, the " +"override is cleared and the [StyleBox] from assigned [Theme] is used." +msgstr "" + +#: doc/classes/Control.xml:166 +msgid "" +"Godot calls this method to test if [code]data[/code] from a control's " +"[method get_drag_data] can be dropped at [code]position[/code]. " +"[code]position[/code] is local to this control.\n" +"This method should only be used to test the data. Process the data in " +"[method drop_data].\n" +"[codeblock]\n" +"func can_drop_data(position, data):\n" +" # Check position if it is relevant to you\n" +" # Otherwise, just check data\n" +" return typeof(data) == TYPE_DICTIONARY and data.has(\"expected\")\n" +"[/codeblock]" +msgstr "" + +#: doc/classes/Control.xml:184 +msgid "" +"Godot calls this method to pass you the [code]data[/code] from a control's " +"[method get_drag_data] result. Godot first calls [method can_drop_data] to " +"test if [code]data[/code] is allowed to drop at [code]position[/code] where " +"[code]position[/code] is local to this control.\n" +"[codeblock]\n" +"func can_drop_data(position, data):\n" +" return typeof(data) == TYPE_DICTIONARY and data.has(\"color\")\n" +"\n" +"func drop_data(position, data):\n" +" color = data[\"color\"]\n" +"[/codeblock]" +msgstr "" + +#: doc/classes/Control.xml:202 +msgid "" +"Forces drag and bypasses [method get_drag_data] and [method " +"set_drag_preview] by passing [code]data[/code] and [code]preview[/code]. " +"Drag will start even if the mouse is neither over nor pressed on this " +"control.\n" +"The methods [method can_drop_data] and [method drop_data] must be " +"implemented on controls that want to receive drop data." +msgstr "" + +#: doc/classes/Control.xml:212 +msgid "" +"Returns the anchor identified by [code]margin[/code] constant from [enum " +"Margin] enum. A getter method for [member anchor_bottom], [member " +"anchor_left], [member anchor_right] and [member anchor_top]." +msgstr "" + +#: doc/classes/Control.xml:219 +msgid "" +"Returns [member margin_left] and [member margin_top]. See also [member " +"rect_position]." +msgstr "" + +#: doc/classes/Control.xml:226 +msgid "" +"Returns combined minimum size from [member rect_min_size] and [method " +"get_minimum_size]." +msgstr "" + +#: doc/classes/Control.xml:235 +msgid "" +"Returns the mouse cursor shape the control displays on mouse hover. See " +"[enum CursorShape]." +msgstr "" + +#: doc/classes/Control.xml:244 +msgid "" +"Godot calls this method to get data that can be dragged and dropped onto " +"controls that expect drop data. Returns [code]null[/code] if there is no " +"data to drag. Controls that want to receive drop data should implement " +"[method can_drop_data] and [method drop_data]. [code]position[/code] is " +"local to this control. Drag may be forced with [method force_drag].\n" +"A preview that will follow the mouse that should represent the data can be " +"set with [method set_drag_preview]. A good time to set the preview is in " +"this method.\n" +"[codeblock]\n" +"func get_drag_data(position):\n" +" var mydata = make_data()\n" +" set_drag_preview(make_preview(mydata))\n" +" return mydata\n" +"[/codeblock]" +msgstr "" + +#: doc/classes/Control.xml:258 +msgid "Returns [member margin_right] and [member margin_bottom]." +msgstr "" + +#: doc/classes/Control.xml:267 +msgid "" +"Returns the focus neighbour identified by [code]margin[/code] constant from " +"[enum Margin] enum. A getter method for [member focus_neighbour_bottom], " +"[member focus_neighbour_left], [member focus_neighbour_right] and [member " +"focus_neighbour_top]." +msgstr "" + +#: doc/classes/Control.xml:274 +msgid "" +"Returns the control that has the keyboard focus or [code]null[/code] if none." +msgstr "" + +#: doc/classes/Control.xml:281 +msgid "" +"Returns the position and size of the control relative to the top-left corner " +"of the screen. See [member rect_position] and [member rect_size]." +msgstr "" + +#: doc/classes/Control.xml:290 +msgid "" +"Returns the anchor identified by [code]margin[/code] constant from [enum " +"Margin] enum. A getter method for [member margin_bottom], [member " +"margin_left], [member margin_right] and [member margin_top]." +msgstr "" + +#: doc/classes/Control.xml:297 +msgid "Returns the minimum size for this control. See [member rect_min_size]." +msgstr "" + +#: doc/classes/Control.xml:304 +msgid "Returns the width/height occupied in the parent control." +msgstr "" + +#: doc/classes/Control.xml:311 +msgid "Returns the parent control node." +msgstr "" + +#: doc/classes/Control.xml:318 +msgid "" +"Returns the position and size of the control relative to the top-left corner " +"of the parent Control. See [member rect_position] and [member rect_size]." +msgstr "" + +#: doc/classes/Control.xml:325 +msgid "Returns the rotation (in radians)." +msgstr "" + +#: doc/classes/Control.xml:336 +msgid "" +"Returns a color from assigned [Theme] with given [code]name[/code] and " +"associated with [Control] of given [code]type[/code].\n" +"[codeblock]\n" +"func _ready():\n" +" modulate = get_theme_color(\"font_color\", \"Button\") #get the color " +"defined for button fonts\n" +"[/codeblock]" +msgstr "" + +#: doc/classes/Control.xml:351 +msgid "" +"Returns a constant from assigned [Theme] with given [code]name[/code] and " +"associated with [Control] of given [code]type[/code]." +msgstr "" + +#: doc/classes/Control.xml:362 +msgid "" +"Returns a font from assigned [Theme] with given [code]name[/code] and " +"associated with [Control] of given [code]type[/code]." +msgstr "" + +#: doc/classes/Control.xml:373 +msgid "" +"Returns an icon from assigned [Theme] with given [code]name[/code] and " +"associated with [Control] of given [code]type[/code]." +msgstr "" + +#: doc/classes/Control.xml:384 +msgid "" +"Returns a [StyleBox] from assigned [Theme] with given [code]name[/code] and " +"associated with [Control] of given [code]type[/code]." +msgstr "" + +#: doc/classes/Control.xml:393 +msgid "" +"Returns the tooltip, which will appear when the cursor is resting over this " +"control. See [member hint_tooltip]." +msgstr "" + +#: doc/classes/Control.xml:400 +msgid "" +"Creates an [InputEventMouseButton] that attempts to click the control. If " +"the event is received, the control acquires focus.\n" +"[codeblock]\n" +"func _process(delta):\n" +" grab_click_focus() #when clicking another Control node, this node will " +"be clicked instead\n" +"[/codeblock]" +msgstr "" + +#: doc/classes/Control.xml:411 +msgid "" +"Steal the focus from another control and become the focused control (see " +"[member focus_mode])." +msgstr "" + +#: doc/classes/Control.xml:418 +msgid "" +"Returns [code]true[/code] if this is the current focused control. See " +"[member focus_mode]." +msgstr "" + +#: doc/classes/Control.xml:427 +msgid "" +"Virtual method to be implemented by the user. Returns whether the given " +"[code]point[/code] is inside this control.\n" +"If not overridden, default behavior is checking if the point is within " +"control's Rect.\n" +"[b]Note:[/b] If you want to check if a point is inside the control, you can " +"use [code]get_rect().has_point(point)[/code]." +msgstr "" + +#: doc/classes/Control.xml:440 +msgid "" +"Returns [code]true[/code] if [Color] with given [code]name[/code] and " +"associated with [Control] of given [code]type[/code] exists in assigned " +"[Theme]." +msgstr "" + +#: doc/classes/Control.xml:449 +msgid "" +"Returns [code]true[/code] if [Color] with given [code]name[/code] has a " +"valid override in this [Control] node." +msgstr "" + +#: doc/classes/Control.xml:460 +msgid "" +"Returns [code]true[/code] if constant with given [code]name[/code] and " +"associated with [Control] of given [code]type[/code] exists in assigned " +"[Theme]." +msgstr "" + +#: doc/classes/Control.xml:469 +msgid "" +"Returns [code]true[/code] if constant with given [code]name[/code] has a " +"valid override in this [Control] node." +msgstr "" + +#: doc/classes/Control.xml:480 +msgid "" +"Returns [code]true[/code] if font with given [code]name[/code] and " +"associated with [Control] of given [code]type[/code] exists in assigned " +"[Theme]." +msgstr "" + +#: doc/classes/Control.xml:489 +msgid "" +"Returns [code]true[/code] if font with given [code]name[/code] has a valid " +"override in this [Control] node." +msgstr "" + +#: doc/classes/Control.xml:500 +msgid "" +"Returns [code]true[/code] if icon with given [code]name[/code] and " +"associated with [Control] of given [code]type[/code] exists in assigned " +"[Theme]." +msgstr "" + +#: doc/classes/Control.xml:509 +msgid "" +"Returns [code]true[/code] if icon with given [code]name[/code] has a valid " +"override in this [Control] node." +msgstr "" + +#: doc/classes/Control.xml:518 +msgid "" +"Returns [code]true[/code] if [Shader] with given [code]name[/code] has a " +"valid override in this [Control] node." +msgstr "" + +#: doc/classes/Control.xml:529 +msgid "" +"Returns [code]true[/code] if [StyleBox] with given [code]name[/code] and " +"associated with [Control] of given [code]type[/code] exists in assigned " +"[Theme]." +msgstr "" + +#: doc/classes/Control.xml:538 +msgid "" +"Returns [code]true[/code] if [StyleBox] with given [code]name[/code] has a " +"valid override in this [Control] node." +msgstr "" + +#: doc/classes/Control.xml:545 +msgid "" +"Invalidates the size cache in this node and in parent nodes up to toplevel. " +"Intended to be used with [method get_minimum_size] when the return value is " +"changed. Setting [member rect_min_size] directly calls this method " +"automatically." +msgstr "" + +#: doc/classes/Control.xml:552 +msgid "" +"Give up the focus. No other control will be able to receive keyboard input." +msgstr "" + +#: doc/classes/Control.xml:567 +msgid "" +"Sets the anchor identified by [code]margin[/code] constant from [enum " +"Margin] enum to value [code]anchor[/code]. A setter method for [member " +"anchor_bottom], [member anchor_left], [member anchor_right] and [member " +"anchor_top].\n" +"If [code]keep_margin[/code] is [code]true[/code], margins aren't updated " +"after this operation.\n" +"If [code]push_opposite_anchor[/code] is [code]true[/code] and the opposite " +"anchor overlaps this anchor, the opposite one will have its value " +"overridden. For example, when setting left anchor to 1 and the right anchor " +"has value of 0.5, the right anchor will also get value of 1. If " +"[code]push_opposite_anchor[/code] was [code]false[/code], the left anchor " +"would get value 0.5." +msgstr "" + +#: doc/classes/Control.xml:584 +msgid "" +"Works the same as [method set_anchor], but instead of [code]keep_margin[/" +"code] argument and automatic update of margin, it allows to set the margin " +"offset yourself (see [method set_margin])." +msgstr "" + +#: doc/classes/Control.xml:597 +msgid "" +"Sets both anchor preset and margin preset. See [method set_anchors_preset] " +"and [method set_margins_preset]." +msgstr "" + +#: doc/classes/Control.xml:608 +msgid "" +"Sets the anchors to a [code]preset[/code] from [enum Control.LayoutPreset] " +"enum. This is code equivalent of using the Layout menu in 2D editor.\n" +"If [code]keep_margins[/code] is [code]true[/code], control's position will " +"also be updated." +msgstr "" + +#: doc/classes/Control.xml:618 +msgid "" +"Sets [member margin_left] and [member margin_top] at the same time. " +"Equivalent of changing [member rect_position]." +msgstr "" + +#: doc/classes/Control.xml:627 +msgid "" +"Forwards the handling of this control's drag and drop to [code]target[/code] " +"control.\n" +"Forwarding can be implemented in the target control similar to the methods " +"[method get_drag_data], [method can_drop_data], and [method drop_data] but " +"with two differences:\n" +"1. The function name must be suffixed with [b]_fw[/b]\n" +"2. The function must take an extra argument that is the control doing the " +"forwarding\n" +"[codeblock]\n" +"# ThisControl.gd\n" +"extends Control\n" +"func _ready():\n" +" set_drag_forwarding(target_control)\n" +"\n" +"# TargetControl.gd\n" +"extends Control\n" +"func can_drop_data_fw(position, data, from_control):\n" +" return true\n" +"\n" +"func drop_data_fw(position, data, from_control):\n" +" my_handle_data(data)\n" +"\n" +"func get_drag_data_fw(position, from_control):\n" +" set_drag_preview(my_preview)\n" +" return my_data()\n" +"[/codeblock]" +msgstr "" + +#: doc/classes/Control.xml:657 +msgid "" +"Shows the given control at the mouse pointer. A good time to call this " +"method is in [method get_drag_data]. The control must not be in the scene " +"tree.\n" +"[codeblock]\n" +"export (Color, RGBA) var color = Color(1, 0, 0, 1)\n" +"\n" +"func get_drag_data(position):\n" +" # Use a control that is not in the tree\n" +" var cpb = ColorPickerButton.new()\n" +" cpb.color = color\n" +" cpb.rect_size = Vector2(50, 50)\n" +" set_drag_preview(cpb)\n" +" return color\n" +"[/codeblock]" +msgstr "" + +#: doc/classes/Control.xml:677 +msgid "Sets [member margin_right] and [member margin_bottom] at the same time." +msgstr "" + +#: doc/classes/Control.xml:688 +msgid "" +"Sets the anchor identified by [code]margin[/code] constant from [enum " +"Margin] enum to [Control] at [code]neighbor[/code] node path. A setter " +"method for [member focus_neighbour_bottom], [member focus_neighbour_left], " +"[member focus_neighbour_right] and [member focus_neighbour_top]." +msgstr "" + +#: doc/classes/Control.xml:699 +msgid "" +"Sets the [member rect_global_position] to given [code]position[/code].\n" +"If [code]keep_margins[/code] is [code]true[/code], control's anchors will be " +"updated instead of margins." +msgstr "" + +#: doc/classes/Control.xml:711 +msgid "" +"Sets the margin identified by [code]margin[/code] constant from [enum " +"Margin] enum to given [code]offset[/code]. A setter method for [member " +"margin_bottom], [member margin_left], [member margin_right] and [member " +"margin_top]." +msgstr "" + +#: doc/classes/Control.xml:724 +msgid "" +"Sets the margins to a [code]preset[/code] from [enum Control.LayoutPreset] " +"enum. This is code equivalent of using the Layout menu in 2D editor.\n" +"Use parameter [code]resize_mode[/code] with constants from [enum Control." +"LayoutPresetMode] to better determine the resulting size of the [Control]. " +"Constant size will be ignored if used with presets that change size, e.g. " +"[code]PRESET_LEFT_WIDE[/code].\n" +"Use parameter [code]margin[/code] to determine the gap between the [Control] " +"and the edges." +msgstr "" + +#: doc/classes/Control.xml:737 +msgid "" +"Sets the [member rect_position] to given [code]position[/code].\n" +"If [code]keep_margins[/code] is [code]true[/code], control's anchors will be " +"updated instead of margins." +msgstr "" + +#: doc/classes/Control.xml:747 +msgid "Sets the rotation (in radians)." +msgstr "" + +#: doc/classes/Control.xml:758 +msgid "" +"Sets the size (see [member rect_size]).\n" +"If [code]keep_margins[/code] is [code]true[/code], control's anchors will be " +"updated instead of margins." +msgstr "" + +#: doc/classes/Control.xml:768 +msgid "" +"Moves the mouse cursor to [code]to_position[/code], relative to [member " +"rect_position] of this [Control]." +msgstr "" + +#: doc/classes/Control.xml:774 +msgid "" +"Anchors the bottom edge of the node to the origin, the center, or the end of " +"its parent control. It changes how the bottom margin updates when the node " +"moves or changes size. You can use one of the [enum Anchor] constants for " +"convenience." +msgstr "" + +#: doc/classes/Control.xml:777 +msgid "" +"Anchors the left edge of the node to the origin, the center or the end of " +"its parent control. It changes how the left margin updates when the node " +"moves or changes size. You can use one of the [enum Anchor] constants for " +"convenience." +msgstr "" + +#: doc/classes/Control.xml:780 +msgid "" +"Anchors the right edge of the node to the origin, the center or the end of " +"its parent control. It changes how the right margin updates when the node " +"moves or changes size. You can use one of the [enum Anchor] constants for " +"convenience." +msgstr "" + +#: doc/classes/Control.xml:783 +msgid "" +"Anchors the top edge of the node to the origin, the center or the end of its " +"parent control. It changes how the top margin updates when the node moves or " +"changes size. You can use one of the [enum Anchor] constants for " +"convenience." +msgstr "" + +#: doc/classes/Control.xml:786 +msgid "" +"The focus access mode for the control (None, Click or All). Only one Control " +"can be focused at the same time, and it will receive keyboard signals." +msgstr "" + +#: doc/classes/Control.xml:789 +msgid "" +"Tells Godot which node it should give keyboard focus to if the user presses " +"the down arrow on the keyboard or down on a gamepad by default. You can " +"change the key by editing the [code]ui_down[/code] input action. The node " +"must be a [Control]. If this property is not set, Godot will give focus to " +"the closest [Control] to the bottom of this one." +msgstr "" + +#: doc/classes/Control.xml:792 +msgid "" +"Tells Godot which node it should give keyboard focus to if the user presses " +"the left arrow on the keyboard or left on a gamepad by default. You can " +"change the key by editing the [code]ui_left[/code] input action. The node " +"must be a [Control]. If this property is not set, Godot will give focus to " +"the closest [Control] to the left of this one." +msgstr "" + +#: doc/classes/Control.xml:795 +msgid "" +"Tells Godot which node it should give keyboard focus to if the user presses " +"the right arrow on the keyboard or right on a gamepad by default. You can " +"change the key by editing the [code]ui_right[/code] input action. The node " +"must be a [Control]. If this property is not set, Godot will give focus to " +"the closest [Control] to the bottom of this one." +msgstr "" + +#: doc/classes/Control.xml:798 +msgid "" +"Tells Godot which node it should give keyboard focus to if the user presses " +"the top arrow on the keyboard or top on a gamepad by default. You can change " +"the key by editing the [code]ui_top[/code] input action. The node must be a " +"[Control]. If this property is not set, Godot will give focus to the closest " +"[Control] to the bottom of this one." +msgstr "" + +#: doc/classes/Control.xml:801 +msgid "" +"Tells Godot which node it should give keyboard focus to if the user presses " +"[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 "" + +#: doc/classes/Control.xml:805 +msgid "" +"Tells Godot which node it should give keyboard focus to if the user presses " +"[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 "" + +#: doc/classes/Control.xml:809 +msgid "" +"Controls the direction on the horizontal axis in which the control should " +"grow if its horizontal minimum size is changed to be greater than its " +"current size, as the control always has to be at least the minimum size." +msgstr "" + +#: doc/classes/Control.xml:812 +msgid "" +"Controls the direction on the vertical axis in which the control should grow " +"if its vertical minimum size is changed to be greater than its current size, " +"as the control always has to be at least the minimum size." +msgstr "" + +#: doc/classes/Control.xml:815 +msgid "" +"Changes the tooltip text. The tooltip appears when the user's mouse cursor " +"stays idle over this control for a few moments, provided that the [member " +"mouse_filter] property is not [constant MOUSE_FILTER_IGNORE]. You can change " +"the time required for the tooltip to appear with [code]gui/timers/" +"tooltip_delay_sec[/code] option in Project Settings." +msgstr "" + +#: doc/classes/Control.xml:818 +msgid "" +"Distance between the node's bottom edge and its parent control, based on " +"[member anchor_bottom].\n" +"Margins are often controlled by one or multiple parent [Container] nodes, so " +"you should not modify them manually if your node is a direct child of a " +"[Container]. Margins update automatically when you move or resize the node." +msgstr "" + +#: doc/classes/Control.xml:822 +msgid "" +"Distance between the node's left edge and its parent control, based on " +"[member anchor_left].\n" +"Margins are often controlled by one or multiple parent [Container] nodes, so " +"you should not modify them manually if your node is a direct child of a " +"[Container]. Margins update automatically when you move or resize the node." +msgstr "" + +#: doc/classes/Control.xml:826 +msgid "" +"Distance between the node's right edge and its parent control, based on " +"[member anchor_right].\n" +"Margins are often controlled by one or multiple parent [Container] nodes, so " +"you should not modify them manually if your node is a direct child of a " +"[Container]. Margins update automatically when you move or resize the node." +msgstr "" + +#: doc/classes/Control.xml:830 +msgid "" +"Distance between the node's top edge and its parent control, based on " +"[member anchor_top].\n" +"Margins are often controlled by one or multiple parent [Container] nodes, so " +"you should not modify them manually if your node is a direct child of a " +"[Container]. Margins update automatically when you move or resize the node." +msgstr "" + +#: doc/classes/Control.xml:834 +msgid "" +"The default cursor shape for this control. Useful for Godot plugins and " +"applications or games that use the system's mouse cursors.\n" +"[b]Note:[/b] On Linux, shapes may vary depending on the cursor theme of the " +"system." +msgstr "" + +#: doc/classes/Control.xml:838 +msgid "" +"Controls whether the control will be able to receive mouse button input " +"events through [method _gui_input] and how these events should be handled. " +"Also controls whether the control can receive the [signal mouse_entered], " +"and [signal mouse_exited] signals. See the constants to learn what each does." +msgstr "" + +#: doc/classes/Control.xml:841 +msgid "" +"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 +msgid "" +"The node's global position, relative to the world (usually to the top-left " +"corner of the window)." +msgstr "" + +#: doc/classes/Control.xml:847 +msgid "" +"The minimum size of the node's bounding rectangle. If you set it to a value " +"greater than (0, 0), the node's bounding rectangle will always have at least " +"this size, even if its content is smaller. If it's set to (0, 0), the node " +"sizes automatically to fit its content, be it a texture or child nodes." +msgstr "" + +#: doc/classes/Control.xml:850 +msgid "" +"By default, the node's pivot is its top-left corner. When you change its " +"[member rect_scale], it will scale around this pivot. Set this property to " +"[member rect_size] / 2 to center the pivot in the node's rectangle." +msgstr "" + +#: doc/classes/Control.xml:853 +msgid "" +"The node's position, relative to its parent. It corresponds to the " +"rectangle's top-left corner. The property is not affected by [member " +"rect_pivot_offset]." +msgstr "" + +#: doc/classes/Control.xml:856 +msgid "" +"The node's rotation around its pivot, in degrees. See [member " +"rect_pivot_offset] to change the pivot's position." +msgstr "" + +#: doc/classes/Control.xml:859 +msgid "" +"The node's scale, relative to its [member rect_size]. Change this property " +"to scale the node around its [member rect_pivot_offset]." +msgstr "" + +#: doc/classes/Control.xml:862 +msgid "" +"The size of the node's bounding rectangle, in pixels. [Container] nodes " +"update this property automatically." +msgstr "" + +#: doc/classes/Control.xml:865 +msgid "" +"Tells the parent [Container] nodes how they should resize and place the node " +"on the X axis. Use one of the [enum SizeFlags] constants to change the " +"flags. See the constants to learn what each does." +msgstr "" + +#: doc/classes/Control.xml:868 +msgid "" +"If the node and at least one of its neighbours uses the [constant " +"SIZE_EXPAND] size flag, the parent [Container] will let it take more or less " +"space depending on this property. If this node has a stretch ratio of 2 and " +"its neighbour a ratio of 1, this node will take two thirds of the available " +"space." +msgstr "" + +#: doc/classes/Control.xml:871 +msgid "" +"Tells the parent [Container] nodes how they should resize and place the node " +"on the Y axis. Use one of the [enum SizeFlags] constants to change the " +"flags. See the constants to learn what each does." +msgstr "" + +#: doc/classes/Control.xml:874 +msgid "" +"Changing this property replaces the current [Theme] resource this node and " +"all its [Control] children use." +msgstr "" + +#: doc/classes/Control.xml:880 +msgid "Emitted when the node gains keyboard focus." +msgstr "" + +#: doc/classes/Control.xml:885 +msgid "Emitted when the node loses keyboard focus." +msgstr "" + +#: doc/classes/Control.xml:892 +msgid "Emitted when the node receives an [InputEvent]." +msgstr "" + +#: doc/classes/Control.xml:897 +msgid "Emitted when the node's minimum size changes." +msgstr "" + +#: doc/classes/Control.xml:902 +msgid "" +"Emitted when the mouse enters the control's [code]Rect[/code] area, provided " +"its [member mouse_filter] lets the event reach it." +msgstr "" + +#: doc/classes/Control.xml:907 +msgid "" +"Emitted when the mouse leaves the control's [code]Rect[/code] area, provided " +"its [member mouse_filter] lets the event reach it." +msgstr "" + +#: doc/classes/Control.xml:912 +msgid "Emitted when the control changes size." +msgstr "" + +#: doc/classes/Control.xml:917 +msgid "" +"Emitted when one of the size flags changes. See [member " +"size_flags_horizontal] and [member size_flags_vertical]." +msgstr "" + +#: doc/classes/Control.xml:927 +msgid "The node cannot grab focus. Use with [member focus_mode]." +msgstr "" + +#: doc/classes/Control.xml:930 +msgid "" +"The node can only grab focus on mouse clicks. Use with [member focus_mode]." +msgstr "" + +#: doc/classes/Control.xml:933 +msgid "" +"The node can grab focus on mouse click or using the arrows and the Tab keys " +"on the keyboard. Use with [member focus_mode]." +msgstr "" + +#: doc/classes/Control.xml:936 +msgid "" +"Sent when the node changes size. Use [member rect_size] to get the new size." +msgstr "" + +#: doc/classes/Control.xml:939 +msgid "Sent when the mouse pointer enters the node." +msgstr "" + +#: doc/classes/Control.xml:942 +msgid "Sent when the mouse pointer exits the node." +msgstr "" + +#: doc/classes/Control.xml:945 +msgid "Sent when the node grabs focus." +msgstr "" + +#: doc/classes/Control.xml:948 +msgid "Sent when the node loses focus." +msgstr "" + +#: doc/classes/Control.xml:951 +msgid "" +"Sent when the node's [member theme] changes, right before Godot redraws the " +"control. Happens when you call one of the [code]add_theme_*_override[/code] " +"methods." +msgstr "" + +#: doc/classes/Control.xml:954 +msgid "" +"Sent when this node is inside a [ScrollContainer] which has begun being " +"scrolled." +msgstr "" + +#: doc/classes/Control.xml:957 +msgid "" +"Sent when this node is inside a [ScrollContainer] which has stopped being " +"scrolled." +msgstr "" + +#: doc/classes/Control.xml:960 +msgid "" +"Show the system's arrow mouse cursor when the user hovers the node. Use with " +"[member mouse_default_cursor_shape]." +msgstr "" + +#: doc/classes/Control.xml:963 +msgid "" +"Show the system's I-beam mouse cursor when the user hovers the node. The I-" +"beam pointer has a shape similar to \"I\". It tells the user they can " +"highlight or insert text." +msgstr "" + +#: doc/classes/Control.xml:966 +msgid "" +"Show the system's pointing hand mouse cursor when the user hovers the node." +msgstr "" + +#: doc/classes/Control.xml:969 +msgid "Show the system's cross mouse cursor when the user hovers the node." +msgstr "" + +#: doc/classes/Control.xml:972 +msgid "" +"Show the system's wait mouse cursor, often an hourglass, when the user " +"hovers the node." +msgstr "" + +#: doc/classes/Control.xml:975 +msgid "" +"Show the system's busy mouse cursor when the user hovers the node. Often an " +"hourglass." +msgstr "" + +#: doc/classes/Control.xml:978 +msgid "" +"Show the system's drag mouse cursor, often a closed fist or a cross symbol, " +"when the user hovers the node. It tells the user they're currently dragging " +"an item, like a node in the Scene dock." +msgstr "" + +#: doc/classes/Control.xml:981 +msgid "" +"Show the system's drop mouse cursor when the user hovers the node. It can be " +"an open hand. It tells the user they can drop an item they're currently " +"grabbing, like a node in the Scene dock." +msgstr "" + +#: doc/classes/Control.xml:984 +msgid "" +"Show the system's forbidden mouse cursor when the user hovers the node. " +"Often a crossed circle." +msgstr "" + +#: doc/classes/Control.xml:987 +msgid "" +"Show the system's vertical resize mouse cursor when the user hovers the " +"node. A double-headed vertical arrow. It tells the user they can resize the " +"window or the panel vertically." +msgstr "" + +#: doc/classes/Control.xml:990 +msgid "" +"Show the system's horizontal resize mouse cursor when the user hovers the " +"node. A double-headed horizontal arrow. It tells the user they can resize " +"the window or the panel horizontally." +msgstr "" + +#: doc/classes/Control.xml:993 +msgid "" +"Show the system's window resize mouse cursor when the user hovers the node. " +"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/Control.xml:996 +msgid "" +"Show the system's window resize mouse cursor when the user hovers the node. " +"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/Control.xml:999 +msgid "" +"Show the system's move mouse cursor when the user hovers the node. It shows " +"2 double-headed arrows at a 90 degree angle. It tells the user they can move " +"a UI element freely." +msgstr "" + +#: doc/classes/Control.xml:1002 +msgid "" +"Show the system's vertical split mouse cursor when the user hovers the node. " +"On Windows, it's the same as [constant CURSOR_VSIZE]." +msgstr "" + +#: doc/classes/Control.xml:1005 +msgid "" +"Show the system's horizontal split mouse cursor when the user hovers the " +"node. On Windows, it's the same as [constant CURSOR_HSIZE]." +msgstr "" + +#: doc/classes/Control.xml:1008 +msgid "" +"Show the system's help mouse cursor when the user hovers the node, a " +"question mark." +msgstr "" + +#: doc/classes/Control.xml:1011 +msgid "" +"Snap all 4 anchors to the top-left of the parent control's bounds. Use with " +"[method set_anchors_preset]." +msgstr "" + +#: doc/classes/Control.xml:1014 +msgid "" +"Snap all 4 anchors to the top-right of the parent control's bounds. Use with " +"[method set_anchors_preset]." +msgstr "" + +#: doc/classes/Control.xml:1017 +msgid "" +"Snap all 4 anchors to the bottom-left of the parent control's bounds. Use " +"with [method set_anchors_preset]." +msgstr "" + +#: doc/classes/Control.xml:1020 +msgid "" +"Snap all 4 anchors to the bottom-right of the parent control's bounds. Use " +"with [method set_anchors_preset]." +msgstr "" + +#: doc/classes/Control.xml:1023 +msgid "" +"Snap all 4 anchors to the center of the left edge of the parent control's " +"bounds. Use with [method set_anchors_preset]." +msgstr "" + +#: doc/classes/Control.xml:1026 +msgid "" +"Snap all 4 anchors to the center of the top edge of the parent control's " +"bounds. Use with [method set_anchors_preset]." +msgstr "" + +#: doc/classes/Control.xml:1029 +msgid "" +"Snap all 4 anchors to the center of the right edge of the parent control's " +"bounds. Use with [method set_anchors_preset]." +msgstr "" + +#: doc/classes/Control.xml:1032 +msgid "" +"Snap all 4 anchors to the center of the bottom edge of the parent control's " +"bounds. Use with [method set_anchors_preset]." +msgstr "" + +#: doc/classes/Control.xml:1035 +msgid "" +"Snap all 4 anchors to the center of the parent control's bounds. Use with " +"[method set_anchors_preset]." +msgstr "" + +#: doc/classes/Control.xml:1038 +msgid "" +"Snap all 4 anchors to the left edge of the parent control. The left margin " +"becomes relative to the left edge and the top margin relative to the top " +"left corner of the node's parent. Use with [method set_anchors_preset]." +msgstr "" + +#: doc/classes/Control.xml:1041 +msgid "" +"Snap all 4 anchors to the top edge of the parent control. The left margin " +"becomes relative to the top left corner, the top margin relative to the top " +"edge, and the right margin relative to the top right corner of the node's " +"parent. Use with [method set_anchors_preset]." +msgstr "" + +#: doc/classes/Control.xml:1044 +msgid "" +"Snap all 4 anchors to the right edge of the parent control. The right margin " +"becomes relative to the right edge and the top margin relative to the top " +"right corner of the node's parent. Use with [method set_anchors_preset]." +msgstr "" + +#: doc/classes/Control.xml:1047 +msgid "" +"Snap all 4 anchors to the bottom edge of the parent control. The left margin " +"becomes relative to the bottom left corner, the bottom margin relative to " +"the bottom edge, and the right margin relative to the bottom right corner of " +"the node's parent. Use with [method set_anchors_preset]." +msgstr "" + +#: doc/classes/Control.xml:1050 +msgid "" +"Snap all 4 anchors to a vertical line that cuts the parent control in half. " +"Use with [method set_anchors_preset]." +msgstr "" + +#: doc/classes/Control.xml:1053 +msgid "" +"Snap all 4 anchors to a horizontal line that cuts the parent control in " +"half. Use with [method set_anchors_preset]." +msgstr "" + +#: doc/classes/Control.xml:1056 +msgid "" +"Snap all 4 anchors to the respective corners of the parent control. Set all " +"4 margins to 0 after you applied this preset and the [Control] will fit its " +"parent control. This is equivalent to the \"Full Rect\" layout option in the " +"editor. Use with [method set_anchors_preset]." +msgstr "" + +#: doc/classes/Control.xml:1059 +msgid "The control will be resized to its minimum size." +msgstr "" + +#: doc/classes/Control.xml:1062 +msgid "The control's width will not change." +msgstr "" + +#: doc/classes/Control.xml:1065 +msgid "The control's height will not change." +msgstr "" + +#: doc/classes/Control.xml:1068 +msgid "The control's size will not change." +msgstr "" + +#: doc/classes/Control.xml:1071 +msgid "" +"Tells the parent [Container] to expand the bounds of this node to fill all " +"the available space without pushing any other node. Use with [member " +"size_flags_horizontal] and [member size_flags_vertical]." +msgstr "" + +#: doc/classes/Control.xml:1074 +msgid "" +"Tells the parent [Container] to let this node take all the available space " +"on the axis you flag. If multiple neighboring nodes are set to expand, " +"they'll share the space based on their stretch ratio. See [member " +"size_flags_stretch_ratio]. Use with [member size_flags_horizontal] and " +"[member size_flags_vertical]." +msgstr "" + +#: doc/classes/Control.xml:1077 +msgid "" +"Sets the node's size flags to both fill and expand. See the 2 constants " +"above for more information." +msgstr "" + +#: doc/classes/Control.xml:1080 +msgid "" +"Tells the parent [Container] to center the node in itself. It centers the " +"control based on its bounding box, so it doesn't work with the fill or " +"expand size flags. Use with [member size_flags_horizontal] and [member " +"size_flags_vertical]." +msgstr "" + +#: doc/classes/Control.xml:1083 +msgid "" +"Tells the parent [Container] to align the node with its end, either the " +"bottom or the right edge. It doesn't work with the fill or expand size " +"flags. Use with [member size_flags_horizontal] and [member " +"size_flags_vertical]." +msgstr "" + +#: doc/classes/Control.xml:1086 +msgid "" +"The control will receive mouse button input events through [method " +"_gui_input] if clicked on. And the control will receive the [signal " +"mouse_entered] and [signal mouse_exited] signals. These events are " +"automatically marked as handled, and they will not propagate further to " +"other controls. This also results in blocking signals in other controls." +msgstr "" + +#: doc/classes/Control.xml:1089 +msgid "" +"The control will receive mouse button input events through [method " +"_gui_input] if clicked on. And the control will receive the [signal " +"mouse_entered] and [signal mouse_exited] signals. If this control does not " +"handle the event, the parent control (if any) will be considered, and so on " +"until there is no more parent control to potentially handle it. This also " +"allows signals to fire in other controls. Even if no control handled it at " +"all, the event will still be handled automatically, so unhandled input will " +"not be fired." +msgstr "" + +#: doc/classes/Control.xml:1092 +msgid "" +"The control will not receive mouse button input events through [method " +"_gui_input]. The control will also not receive the [signal mouse_entered] " +"nor [signal mouse_exited] signals. This will not block other controls from " +"receiving these events or firing the signals. Ignored events will not be " +"handled automatically." +msgstr "" + +#: doc/classes/Control.xml:1095 +msgid "" +"The control will grow to the left or top to make up if its minimum size is " +"changed to be greater than its current size on the respective axis." +msgstr "" + +#: doc/classes/Control.xml:1098 +msgid "" +"The control will grow to the right or bottom to make up if its minimum size " +"is changed to be greater than its current size on the respective axis." +msgstr "" + +#: doc/classes/Control.xml:1101 +msgid "" +"The control will grow in both directions equally to make up if its minimum " +"size is changed to be greater than its current size." +msgstr "" + +#: doc/classes/Control.xml:1104 +msgid "" +"Snaps one of the 4 anchor's sides to the origin of the node's [code]Rect[/" +"code], in the top left. Use it with one of the [code]anchor_*[/code] member " +"variables, like [member anchor_left]. To change all 4 anchors at once, use " +"[method set_anchors_preset]." +msgstr "" + +#: doc/classes/Control.xml:1107 +msgid "" +"Snaps one of the 4 anchor's sides to the end of the node's [code]Rect[/" +"code], in the bottom right. Use it with one of the [code]anchor_*[/code] " +"member variables, like [member anchor_left]. To change all 4 anchors at " +"once, use [method set_anchors_preset]." +msgstr "" + +#: doc/classes/ConvexPolygonShape2D.xml:4 +msgid "Convex polygon shape for 2D physics." +msgstr "" + +#: doc/classes/ConvexPolygonShape2D.xml:7 +msgid "" +"Convex polygon shape for 2D physics. A convex polygon, whatever its shape, " +"is internally decomposed into as many convex polygons as needed to ensure " +"all collision checks against it are always done on convex polygons (which " +"are faster to check).\n" +"The main difference between a [ConvexPolygonShape2D] and a " +"[ConcavePolygonShape2D] is that a concave polygon assumes it is concave and " +"uses a more complex method of collision detection, and a convex one forces " +"itself to be convex in order to speed up collision detection." +msgstr "" + +#: doc/classes/ConvexPolygonShape2D.xml:19 +msgid "" +"Based on the set of points provided, this creates and assigns the [member " +"points] property using the convex hull algorithm. Removing all unneeded " +"points. See [method Geometry.convex_hull_2d] for details." +msgstr "" + +#: doc/classes/ConvexPolygonShape2D.xml:25 +msgid "" +"The polygon's list of vertices. Can be in either clockwise or " +"counterclockwise order." +msgstr "" + +#: doc/classes/ConvexPolygonShape3D.xml:4 +msgid "Convex polygon shape for 3D physics." +msgstr "" + +#: doc/classes/ConvexPolygonShape3D.xml:7 +msgid "" +"Convex polygon shape resource, which can be added to a [PhysicsBody3D] or " +"area." +msgstr "" + +#: doc/classes/ConvexPolygonShape3D.xml:15 +msgid "The list of 3D points forming the convex polygon shape." +msgstr "" + +#: doc/classes/CPUParticles2D.xml:4 +msgid "CPU-based 2D particle emitter." +msgstr "" + +#: doc/classes/CPUParticles2D.xml:7 +msgid "" +"CPU-based 2D particle node used to create a variety of particle systems and " +"effects.\n" +"See also [GPUParticles2D], which provides the same functionality with " +"hardware acceleration, but may not run on older devices." +msgstr "" + +#: doc/classes/CPUParticles2D.xml:11 doc/classes/GPUParticles2D.xml:11 +msgid "" +"https://docs.godotengine.org/en/latest/tutorials/2d/particle_systems_2d.html" +msgstr "" + +#: doc/classes/CPUParticles2D.xml:20 +msgid "" +"Sets this node's properties to match a given [GPUParticles2D] node with an " +"assigned [ParticlesMaterial]." +msgstr "" + +#: doc/classes/CPUParticles2D.xml:29 doc/classes/CPUParticles3D.xml:28 +msgid "Returns the base value of the parameter specified by [enum Parameter]." +msgstr "" + +#: doc/classes/CPUParticles2D.xml:38 doc/classes/CPUParticles3D.xml:37 +msgid "Returns the [Curve] of the parameter specified by [enum Parameter]." +msgstr "" + +#: doc/classes/CPUParticles2D.xml:47 doc/classes/CPUParticles3D.xml:46 +msgid "" +"Returns the randomness factor of the parameter specified by [enum Parameter]." +msgstr "" + +#: doc/classes/CPUParticles2D.xml:56 doc/classes/CPUParticles3D.xml:55 +msgid "" +"Returns the enabled state of the given flag (see [enum Flags] for options)." +msgstr "" + +#: doc/classes/CPUParticles2D.xml:63 doc/classes/CPUParticles3D.xml:62 +msgid "Restarts the particle emitter." +msgstr "" + +#: doc/classes/CPUParticles2D.xml:74 doc/classes/CPUParticles3D.xml:73 +msgid "Sets the base value of the parameter specified by [enum Parameter]." +msgstr "" + +#: doc/classes/CPUParticles2D.xml:85 doc/classes/CPUParticles3D.xml:84 +msgid "Sets the [Curve] of the parameter specified by [enum Parameter]." +msgstr "" + +#: doc/classes/CPUParticles2D.xml:96 doc/classes/CPUParticles3D.xml:95 +msgid "" +"Sets the randomness factor of the parameter specified by [enum Parameter]." +msgstr "" + +#: doc/classes/CPUParticles2D.xml:107 doc/classes/CPUParticles3D.xml:106 +msgid "Enables or disables the given flag (see [enum Flags] for options)." +msgstr "" + +#: doc/classes/CPUParticles2D.xml:113 doc/classes/CPUParticles3D.xml:112 +#: doc/classes/GPUParticles2D.xml:31 +msgid "Number of particles emitted in one emission cycle." +msgstr "" + +#: doc/classes/CPUParticles2D.xml:116 doc/classes/CPUParticles3D.xml:115 +msgid "Initial rotation applied to each particle, in degrees." +msgstr "" + +#: doc/classes/CPUParticles2D.xml:119 doc/classes/CPUParticles3D.xml:118 +msgid "Each particle's rotation will be animated along this [Curve]." +msgstr "" + +#: doc/classes/CPUParticles2D.xml:122 doc/classes/CPUParticles3D.xml:121 +#: doc/classes/ParticlesMaterial.xml:104 +msgid "Rotation randomness ratio." +msgstr "" + +#: doc/classes/CPUParticles2D.xml:125 doc/classes/CPUParticles3D.xml:124 +msgid "" +"Initial angular velocity applied to each particle. Sets the speed of " +"rotation of the particle." +msgstr "" + +#: doc/classes/CPUParticles2D.xml:128 doc/classes/CPUParticles3D.xml:127 +msgid "Each particle's angular velocity will vary along this [Curve]." +msgstr "" + +#: doc/classes/CPUParticles2D.xml:131 doc/classes/CPUParticles3D.xml:130 +#: doc/classes/ParticlesMaterial.xml:114 +msgid "Angular velocity randomness ratio." +msgstr "" + +#: doc/classes/CPUParticles2D.xml:134 doc/classes/CPUParticles3D.xml:133 +#: doc/classes/ParticlesMaterial.xml:117 +msgid "Particle animation offset." +msgstr "" + +#: doc/classes/CPUParticles2D.xml:137 doc/classes/CPUParticles3D.xml:136 +msgid "Each particle's animation offset will vary along this [Curve]." +msgstr "" + +#: doc/classes/CPUParticles2D.xml:140 doc/classes/CPUParticles3D.xml:139 +#: doc/classes/ParticlesMaterial.xml:123 +msgid "Animation offset randomness ratio." +msgstr "" + +#: doc/classes/CPUParticles2D.xml:143 doc/classes/CPUParticles3D.xml:142 +#: doc/classes/ParticlesMaterial.xml:126 +msgid "Particle animation speed." +msgstr "" + +#: doc/classes/CPUParticles2D.xml:146 doc/classes/CPUParticles3D.xml:145 +msgid "Each particle's animation speed will vary along this [Curve]." +msgstr "" + +#: doc/classes/CPUParticles2D.xml:149 doc/classes/CPUParticles3D.xml:148 +#: doc/classes/ParticlesMaterial.xml:132 +msgid "Animation speed randomness ratio." +msgstr "" + +#: doc/classes/CPUParticles2D.xml:152 +msgid "" +"Each particle's initial color. If [member texture] is defined, it will be " +"multiplied by this color." +msgstr "" + +#: doc/classes/CPUParticles2D.xml:155 +msgid "Each particle's color will vary along this [Gradient]." +msgstr "" + +#: doc/classes/CPUParticles2D.xml:158 doc/classes/CPUParticles3D.xml:157 +#: doc/classes/ParticlesMaterial.xml:141 +msgid "The rate at which particles lose velocity." +msgstr "" + +#: doc/classes/CPUParticles2D.xml:161 doc/classes/CPUParticles3D.xml:160 +msgid "Damping will vary along this [Curve]." +msgstr "" + +#: doc/classes/CPUParticles2D.xml:164 doc/classes/CPUParticles3D.xml:163 +#: doc/classes/ParticlesMaterial.xml:147 +msgid "Damping randomness ratio." +msgstr "" + +#: doc/classes/CPUParticles2D.xml:167 doc/classes/CPUParticles3D.xml:166 +#: doc/classes/ParticlesMaterial.xml:150 +msgid "Unit vector specifying the particles' emission direction." +msgstr "" + +#: doc/classes/CPUParticles2D.xml:170 doc/classes/CPUParticles3D.xml:169 +#: doc/classes/GPUParticles2D.xml:34 doc/classes/GPUParticles3D.xml:54 +msgid "Particle draw order. Uses [enum DrawOrder] values." +msgstr "" + +#: doc/classes/CPUParticles2D.xml:173 doc/classes/CPUParticles3D.xml:175 +msgid "" +"Sets the [Color]s to modulate particles by when using [constant " +"EMISSION_SHAPE_POINTS] or [constant EMISSION_SHAPE_DIRECTED_POINTS]." +msgstr "" + +#: doc/classes/CPUParticles2D.xml:176 doc/classes/CPUParticles3D.xml:178 +msgid "" +"Sets the direction the particles will be emitted in when using [constant " +"EMISSION_SHAPE_DIRECTED_POINTS]." +msgstr "" + +#: doc/classes/CPUParticles2D.xml:179 doc/classes/CPUParticles3D.xml:181 +msgid "" +"Sets the initial positions to spawn particles when using [constant " +"EMISSION_SHAPE_POINTS] or [constant EMISSION_SHAPE_DIRECTED_POINTS]." +msgstr "" + +#: doc/classes/CPUParticles2D.xml:182 +msgid "" +"The rectangle's extents if [member emission_shape] is set to [constant " +"EMISSION_SHAPE_RECTANGLE]." +msgstr "" + +#: doc/classes/CPUParticles2D.xml:185 doc/classes/CPUParticles3D.xml:184 +msgid "" +"Particles will be emitted inside this region. See [enum EmissionShape] for " +"possible values." +msgstr "" + +#: doc/classes/CPUParticles2D.xml:188 +msgid "" +"The sphere's radius if [member emission_shape] is set to [constant " +"EMISSION_SHAPE_SPHERE]." +msgstr "" + +#: doc/classes/CPUParticles2D.xml:191 doc/classes/CPUParticles3D.xml:190 +#: doc/classes/GPUParticles2D.xml:37 doc/classes/GPUParticles3D.xml:72 +msgid "If [code]true[/code], particles are being emitted." +msgstr "" + +#: doc/classes/CPUParticles2D.xml:194 doc/classes/CPUParticles3D.xml:193 +#: doc/classes/GPUParticles2D.xml:40 +msgid "" +"How rapidly particles in an emission cycle are emitted. If greater than " +"[code]0[/code], there will be a gap in emissions before the next cycle " +"begins." +msgstr "" + +#: doc/classes/CPUParticles2D.xml:197 doc/classes/GPUParticles2D.xml:43 +#: doc/classes/GPUParticles3D.xml:78 +msgid "" +"The particle system's frame rate is fixed to a value. For instance, changing " +"the value to 2 will make the particles render at 2 frames per second. Note " +"this does not slow down the simulation of the particle system itself." +msgstr "" + +#: doc/classes/CPUParticles2D.xml:200 doc/classes/CPUParticles3D.xml:199 +#: doc/classes/ParticlesMaterial.xml:174 +msgid "Align Y axis of particle with the direction of its velocity." +msgstr "" + +#: doc/classes/CPUParticles2D.xml:203 doc/classes/CPUParticles3D.xml:211 +#: doc/classes/GPUParticles2D.xml:46 doc/classes/GPUParticles3D.xml:81 +msgid "" +"If [code]true[/code], results in fractional delta calculation which has a " +"smoother particles display effect." +msgstr "" + +#: doc/classes/CPUParticles2D.xml:206 doc/classes/CPUParticles3D.xml:214 +#: doc/classes/ParticlesMaterial.xml:186 +msgid "Gravity applied to every particle." +msgstr "" + +#: doc/classes/CPUParticles2D.xml:209 doc/classes/CPUParticles3D.xml:217 +#: doc/classes/ParticlesMaterial.xml:189 +msgid "Initial hue variation applied to each particle." +msgstr "" + +#: doc/classes/CPUParticles2D.xml:212 doc/classes/CPUParticles3D.xml:220 +msgid "Each particle's hue will vary along this [Curve]." +msgstr "" + +#: doc/classes/CPUParticles2D.xml:215 doc/classes/CPUParticles3D.xml:223 +#: doc/classes/ParticlesMaterial.xml:195 +msgid "Hue variation randomness ratio." +msgstr "" + +#: doc/classes/CPUParticles2D.xml:218 doc/classes/CPUParticles3D.xml:226 +#: doc/classes/ParticlesMaterial.xml:198 +msgid "" +"Initial velocity magnitude for each particle. Direction comes from [member " +"spread] and the node's orientation." +msgstr "" + +#: doc/classes/CPUParticles2D.xml:221 doc/classes/CPUParticles3D.xml:229 +#: doc/classes/ParticlesMaterial.xml:201 +msgid "Initial velocity randomness ratio." +msgstr "" + +#: doc/classes/CPUParticles2D.xml:224 doc/classes/CPUParticles3D.xml:232 +#: doc/classes/GPUParticles2D.xml:49 doc/classes/GPUParticles3D.xml:84 +msgid "Amount of time each particle will exist." +msgstr "" + +#: doc/classes/CPUParticles2D.xml:227 doc/classes/CPUParticles3D.xml:235 +#: doc/classes/ParticlesMaterial.xml:204 +msgid "Particle lifetime randomness ratio." +msgstr "" + +#: doc/classes/CPUParticles2D.xml:230 doc/classes/CPUParticles3D.xml:238 +#: doc/classes/ParticlesMaterial.xml:207 +msgid "" +"Linear acceleration applied to each particle in the direction of motion." +msgstr "" + +#: doc/classes/CPUParticles2D.xml:233 doc/classes/CPUParticles3D.xml:241 +msgid "Each particle's linear acceleration will vary along this [Curve]." +msgstr "" + +#: doc/classes/CPUParticles2D.xml:236 doc/classes/CPUParticles3D.xml:244 +#: doc/classes/ParticlesMaterial.xml:213 +msgid "Linear acceleration randomness ratio." +msgstr "" + +#: doc/classes/CPUParticles2D.xml:239 doc/classes/CPUParticles3D.xml:247 +#: doc/classes/GPUParticles2D.xml:52 doc/classes/GPUParticles3D.xml:87 +msgid "" +"If [code]true[/code], particles use the parent node's coordinate space. If " +"[code]false[/code], they use global coordinates." +msgstr "" + +#: doc/classes/CPUParticles2D.xml:242 doc/classes/GPUParticles2D.xml:55 +msgid "Normal map to be used for the [member texture] property." +msgstr "" + +#: doc/classes/CPUParticles2D.xml:245 doc/classes/CPUParticles3D.xml:253 +#: doc/classes/GPUParticles2D.xml:58 +msgid "" +"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." +msgstr "" + +#: doc/classes/CPUParticles2D.xml:248 +msgid "" +"Orbital velocity applied to each particle. Makes the particles circle around " +"origin. Specified in number of full rotations around origin per second." +msgstr "" + +#: doc/classes/CPUParticles2D.xml:251 doc/classes/CPUParticles3D.xml:260 +msgid "Each particle's orbital velocity will vary along this [Curve]." +msgstr "" + +#: doc/classes/CPUParticles2D.xml:254 doc/classes/CPUParticles3D.xml:263 +#: doc/classes/ParticlesMaterial.xml:223 +msgid "Orbital velocity randomness ratio." +msgstr "" + +#: doc/classes/CPUParticles2D.xml:257 doc/classes/CPUParticles3D.xml:266 +#: doc/classes/GPUParticles2D.xml:61 +msgid "Particle system starts as if it had already run for this many seconds." +msgstr "" + +#: doc/classes/CPUParticles2D.xml:260 doc/classes/CPUParticles3D.xml:269 +#: doc/classes/ParticlesMaterial.xml:226 +msgid "" +"Radial acceleration applied to each particle. Makes particle accelerate away " +"from origin." +msgstr "" + +#: doc/classes/CPUParticles2D.xml:263 doc/classes/CPUParticles3D.xml:272 +msgid "Each particle's radial acceleration will vary along this [Curve]." +msgstr "" + +#: doc/classes/CPUParticles2D.xml:266 doc/classes/CPUParticles3D.xml:275 +#: doc/classes/ParticlesMaterial.xml:232 +msgid "Radial acceleration randomness ratio." +msgstr "" + +#: doc/classes/CPUParticles2D.xml:269 doc/classes/CPUParticles3D.xml:278 +#: doc/classes/GPUParticles2D.xml:67 +msgid "Emission lifetime randomness ratio." +msgstr "" + +#: doc/classes/CPUParticles2D.xml:272 doc/classes/CPUParticles3D.xml:281 +#: doc/classes/ParticlesMaterial.xml:235 +msgid "Initial scale applied to each particle." +msgstr "" + +#: doc/classes/CPUParticles2D.xml:275 doc/classes/CPUParticles3D.xml:284 +msgid "Each particle's scale will vary along this [Curve]." +msgstr "" + +#: doc/classes/CPUParticles2D.xml:278 doc/classes/CPUParticles3D.xml:287 +#: doc/classes/ParticlesMaterial.xml:241 +msgid "Scale randomness ratio." +msgstr "" + +#: doc/classes/CPUParticles2D.xml:281 doc/classes/CPUParticles3D.xml:290 +#: doc/classes/GPUParticles2D.xml:70 +msgid "" +"Particle system's running speed scaling ratio. A value of [code]0[/code] can " +"be used to pause the particles." +msgstr "" + +#: doc/classes/CPUParticles2D.xml:284 +msgid "" +"Each particle's initial direction range from [code]+spread[/code] to [code]-" +"spread[/code] degrees." +msgstr "" + +#: doc/classes/CPUParticles2D.xml:287 doc/classes/CPUParticles3D.xml:296 +#: doc/classes/ParticlesMaterial.xml:247 +msgid "" +"Tangential acceleration applied to each particle. Tangential acceleration is " +"perpendicular to the particle's velocity giving the particles a swirling " +"motion." +msgstr "" + +#: doc/classes/CPUParticles2D.xml:290 doc/classes/CPUParticles3D.xml:299 +msgid "Each particle's tangential acceleration will vary along this [Curve]." +msgstr "" + +#: doc/classes/CPUParticles2D.xml:293 doc/classes/CPUParticles3D.xml:302 +#: doc/classes/ParticlesMaterial.xml:253 +msgid "Tangential acceleration randomness ratio." +msgstr "" + +#: doc/classes/CPUParticles2D.xml:296 doc/classes/GPUParticles2D.xml:73 +msgid "Particle texture. If [code]null[/code], particles will be squares." +msgstr "" + +#: doc/classes/CPUParticles2D.xml:301 doc/classes/CPUParticles3D.xml:307 +#: doc/classes/GPUParticles2D.xml:81 doc/classes/GPUParticles3D.xml:110 +msgid "Particles are drawn in the order emitted." +msgstr "" + +#: doc/classes/CPUParticles2D.xml:304 doc/classes/CPUParticles3D.xml:310 +#: doc/classes/GPUParticles2D.xml:84 doc/classes/GPUParticles3D.xml:113 +msgid "Particles are drawn in order of remaining lifetime." +msgstr "" + +#: doc/classes/CPUParticles2D.xml:307 doc/classes/CPUParticles3D.xml:316 +msgid "" +"Use with [method set_param], [method set_param_randomness], and [method " +"set_param_curve] to set initial velocity properties." +msgstr "" + +#: doc/classes/CPUParticles2D.xml:310 doc/classes/CPUParticles3D.xml:319 +msgid "" +"Use with [method set_param], [method set_param_randomness], and [method " +"set_param_curve] to set angular velocity properties." +msgstr "" + +#: doc/classes/CPUParticles2D.xml:313 doc/classes/CPUParticles3D.xml:322 +msgid "" +"Use with [method set_param], [method set_param_randomness], and [method " +"set_param_curve] to set orbital velocity properties." +msgstr "" + +#: doc/classes/CPUParticles2D.xml:316 doc/classes/CPUParticles3D.xml:325 +msgid "" +"Use with [method set_param], [method set_param_randomness], and [method " +"set_param_curve] to set linear acceleration properties." +msgstr "" + +#: doc/classes/CPUParticles2D.xml:319 doc/classes/CPUParticles3D.xml:328 +msgid "" +"Use with [method set_param], [method set_param_randomness], and [method " +"set_param_curve] to set radial acceleration properties." +msgstr "" + +#: doc/classes/CPUParticles2D.xml:322 doc/classes/CPUParticles3D.xml:331 +msgid "" +"Use with [method set_param], [method set_param_randomness], and [method " +"set_param_curve] to set tangential acceleration properties." +msgstr "" + +#: doc/classes/CPUParticles2D.xml:325 doc/classes/CPUParticles3D.xml:334 +msgid "" +"Use with [method set_param], [method set_param_randomness], and [method " +"set_param_curve] to set damping properties." +msgstr "" + +#: doc/classes/CPUParticles2D.xml:328 doc/classes/CPUParticles3D.xml:337 +msgid "" +"Use with [method set_param], [method set_param_randomness], and [method " +"set_param_curve] to set angle properties." +msgstr "" + +#: doc/classes/CPUParticles2D.xml:331 doc/classes/CPUParticles3D.xml:340 +msgid "" +"Use with [method set_param], [method set_param_randomness], and [method " +"set_param_curve] to set scale properties." +msgstr "" + +#: doc/classes/CPUParticles2D.xml:334 doc/classes/CPUParticles3D.xml:343 +msgid "" +"Use with [method set_param], [method set_param_randomness], and [method " +"set_param_curve] to set hue variation properties." +msgstr "" + +#: doc/classes/CPUParticles2D.xml:337 doc/classes/CPUParticles3D.xml:346 +msgid "" +"Use with [method set_param], [method set_param_randomness], and [method " +"set_param_curve] to set animation speed properties." +msgstr "" + +#: doc/classes/CPUParticles2D.xml:340 doc/classes/CPUParticles3D.xml:349 +msgid "" +"Use with [method set_param], [method set_param_randomness], and [method " +"set_param_curve] to set animation offset properties." +msgstr "" + +#: doc/classes/CPUParticles2D.xml:343 doc/classes/CPUParticles3D.xml:352 +#: doc/classes/ParticlesMaterial.xml:303 +msgid "Represents the size of the [enum Parameter] enum." +msgstr "" + +#: doc/classes/CPUParticles2D.xml:346 doc/classes/CPUParticles3D.xml:355 +msgid "Use with [method set_particle_flag] to set [member flag_align_y]." +msgstr "" + +#: doc/classes/CPUParticles2D.xml:349 doc/classes/CPUParticles2D.xml:352 +msgid "Present for consistency with 3D particle nodes, not used in 2D." +msgstr "" + +#: doc/classes/CPUParticles2D.xml:358 doc/classes/CPUParticles3D.xml:367 +#: doc/classes/ParticlesMaterial.xml:318 +msgid "All particles will be emitted from a single point." +msgstr "" + +#: doc/classes/CPUParticles2D.xml:361 +msgid "" +"Particles will be emitted on the surface of a sphere flattened to two " +"dimensions." +msgstr "" + +#: doc/classes/CPUParticles2D.xml:364 +msgid "Particles will be emitted in the area of a rectangle." +msgstr "" + +#: doc/classes/CPUParticles2D.xml:367 doc/classes/CPUParticles3D.xml:376 +msgid "" +"Particles will be emitted at a position chosen randomly among [member " +"emission_points]. Particle color will be modulated by [member " +"emission_colors]." +msgstr "" + +#: doc/classes/CPUParticles2D.xml:370 doc/classes/CPUParticles3D.xml:379 +msgid "" +"Particles will be emitted at a position chosen randomly among [member " +"emission_points]. Particle velocity and rotation will be set based on " +"[member emission_normals]. Particle color will be modulated by [member " +"emission_colors]." +msgstr "" + +#: doc/classes/CPUParticles2D.xml:373 doc/classes/CPUParticles3D.xml:382 +#: doc/classes/ParticlesMaterial.xml:333 +msgid "Represents the size of the [enum EmissionShape] enum." +msgstr "" + +#: doc/classes/CPUParticles3D.xml:4 +msgid "CPU-based 3D particle emitter." +msgstr "" + +#: doc/classes/CPUParticles3D.xml:7 +msgid "" +"CPU-based 3D particle node used to create a variety of particle systems and " +"effects.\n" +"See also [GPUParticles3D], which provides the same functionality with " +"hardware acceleration, but may not run on older devices." +msgstr "" + +#: doc/classes/CPUParticles3D.xml:19 +msgid "" +"Sets this node's properties to match a given [GPUParticles3D] node with an " +"assigned [ParticlesMaterial]." +msgstr "" + +#: doc/classes/CPUParticles3D.xml:151 doc/classes/CPUParticles3D.xml:154 +msgid "Unused for 3D particles." +msgstr "" + +#: doc/classes/CPUParticles3D.xml:172 +msgid "" +"The rectangle's extents if [member emission_shape] is set to [constant " +"EMISSION_SHAPE_BOX]." +msgstr "" + +#: doc/classes/CPUParticles3D.xml:187 +msgid "" +"The sphere's radius if [enum EmissionShape] is set to [constant " +"EMISSION_SHAPE_SPHERE]." +msgstr "" + +#: doc/classes/CPUParticles3D.xml:196 +msgid "" +"The particle system's frame rate is fixed to a value. For instance, changing " +"the value to 2 will make the particles render at 2 frames per second. Note " +"this does not slow down the particle system itself." +msgstr "" + +#: doc/classes/CPUParticles3D.xml:202 doc/classes/ParticlesMaterial.xml:177 +msgid "If [code]true[/code], particles will not move on the z axis." +msgstr "" + +#: doc/classes/CPUParticles3D.xml:205 doc/classes/ParticlesMaterial.xml:180 +msgid "If [code]true[/code], particles rotate around Y axis by [member angle]." +msgstr "" + +#: doc/classes/CPUParticles3D.xml:208 doc/classes/ParticlesMaterial.xml:183 +msgid "" +"Amount of [member spread] in Y/Z plane. A value of [code]1[/code] restricts " +"particles to X/Z plane." +msgstr "" + +#: doc/classes/CPUParticles3D.xml:250 +msgid "" +"The [Mesh] used for each particle. If [code]null[/code], particles will be " +"spheres." +msgstr "" + +#: doc/classes/CPUParticles3D.xml:256 +msgid "" +"Orbital velocity applied to each particle. Makes the particles circle around " +"origin in the local XY plane. Specified in number of full rotations around " +"origin per second.\n" +"This property is only available when [member flag_disable_z] is [code]true[/" +"code]." +msgstr "" + +#: doc/classes/CPUParticles3D.xml:293 doc/classes/ParticlesMaterial.xml:244 +msgid "" +"Each particle's initial direction range from [code]+spread[/code] to [code]-" +"spread[/code] degrees. Applied to X/Z plane and Y/Z planes." +msgstr "" + +#: doc/classes/CPUParticles3D.xml:313 doc/classes/GPUParticles3D.xml:116 +msgid "Particles are drawn in order of depth." +msgstr "" + +#: doc/classes/CPUParticles3D.xml:358 +msgid "Use with [method set_particle_flag] to set [member flag_rotate_y]." +msgstr "" + +#: doc/classes/CPUParticles3D.xml:361 +msgid "Use with [method set_particle_flag] to set [member flag_disable_z]." +msgstr "" + +#: doc/classes/CPUParticles3D.xml:370 doc/classes/ParticlesMaterial.xml:321 +msgid "Particles will be emitted in the volume of a sphere." +msgstr "" + +#: doc/classes/CPUParticles3D.xml:373 doc/classes/ParticlesMaterial.xml:324 +msgid "Particles will be emitted in the volume of a box." +msgstr "" + +#: doc/classes/Crypto.xml:4 +msgid "Access to advanced cryptographic functionalities." +msgstr "" + +#: doc/classes/Crypto.xml:7 +msgid "" +"The Crypto class allows you to access some more advanced cryptographic " +"functionalities in Godot.\n" +"For now, this includes generating cryptographically secure random bytes, and " +"RSA keys and self-signed X509 certificates generation. More functionalities " +"are planned for future releases.\n" +"[codeblock]\n" +"extends Node\n" +"\n" +"var crypto = Crypto.new()\n" +"var key = CryptoKey.new()\n" +"var cert = X509Certificate.new()\n" +"\n" +"func _ready():\n" +" # Generate new RSA key.\n" +" key = crypto.generate_rsa(4096)\n" +" # Generate new self-signed certificate with the given key.\n" +" cert = crypto.generate_self_signed_certificate(key, \"CN=mydomain.com," +"O=My Game Company,C=IT\")\n" +" # Save key and certificate in the user folder.\n" +" key.save(\"user://generated.key\")\n" +" cert.save(\"user://generated.crt\")\n" +"[/codeblock]\n" +"[b]Note:[/b] Not available in HTML5 exports." +msgstr "" + +#: doc/classes/Crypto.xml:36 +msgid "" +"Generates a [PackedByteArray] of cryptographically secure random bytes with " +"given [code]size[/code]." +msgstr "" + +#: doc/classes/Crypto.xml:45 +msgid "" +"Generates an RSA [CryptoKey] that can be used for creating self-signed " +"certificates and passed to [method StreamPeerSSL.accept_stream]." +msgstr "" + +#: doc/classes/Crypto.xml:60 +msgid "" +"Generates a self-signed [X509Certificate] from the given [CryptoKey] and " +"[code]issuer_name[/code]. The certificate validity will be defined by " +"[code]not_before[/code] and [code]not_after[/code] (first valid date and " +"last valid date). The [code]issuer_name[/code] must contain at least \"CN=" +"\" (common name, i.e. the domain name), \"O=\" (organization, i.e. your " +"company name), \"C=\" (country, i.e. 2 lettered ISO-3166 code of the country " +"the organization is based in).\n" +"A small example to generate an RSA key and a X509 self-signed certificate.\n" +"[codeblock]\n" +"var crypto = Crypto.new()\n" +"# Generate 4096 bits RSA key.\n" +"var key = crypto.generate_rsa(4096)\n" +"# Generate self-signed certificate using the given key.\n" +"var cert = crypto.generate_self_signed_certificate(key, \"CN=example.com,O=A " +"Game Company,C=IT\")\n" +"[/codeblock]" +msgstr "" + +#: doc/classes/CryptoKey.xml:4 +msgid "A cryptographic key (RSA)." +msgstr "" + +#: doc/classes/CryptoKey.xml:7 +msgid "" +"The CryptoKey class represents a cryptographic key. Keys can be loaded and " +"saved like any other [Resource].\n" +"They can be used to generate a self-signed [X509Certificate] via [method " +"Crypto.generate_self_signed_certificate] and as private key in [method " +"StreamPeerSSL.accept_stream] along with the appropriate certificate.\n" +"[b]Note:[/b] Not available in HTML5 exports." +msgstr "" + +#: doc/classes/CryptoKey.xml:20 +msgid "Loads a key from [code]path[/code] (\"*.key\" file)." +msgstr "" + +#: doc/classes/CryptoKey.xml:29 +msgid "" +"Saves a key to the given [code]path[/code] (should be a \"*.key\" file)." +msgstr "" + +#: modules/csg/doc_classes/CSGBox3D.xml:4 +msgid "A CSG Box shape." +msgstr "" + +#: modules/csg/doc_classes/CSGBox3D.xml:7 +msgid "This node allows you to create a box for use with the CSG system." +msgstr "" + +#: modules/csg/doc_classes/CSGBox3D.xml:15 +msgid "Depth of the box measured from the center of the box." +msgstr "" + +#: modules/csg/doc_classes/CSGBox3D.xml:18 +msgid "Height of the box measured from the center of the box." +msgstr "" + +#: modules/csg/doc_classes/CSGBox3D.xml:21 +msgid "The material used to render the box." +msgstr "" + +#: modules/csg/doc_classes/CSGBox3D.xml:24 +msgid "Width of the box measured from the center of the box." +msgstr "" + +#: modules/csg/doc_classes/CSGCombiner3D.xml:4 +msgid "A CSG node that allows you to combine other CSG modifiers." +msgstr "" + +#: modules/csg/doc_classes/CSGCombiner3D.xml:7 +msgid "" +"For complex arrangements of shapes, it is sometimes needed to add structure " +"to your CSG nodes. The CSGCombiner3D node allows you to create this " +"structure. The node encapsulates the result of the CSG operations of its " +"children. In this way, it is possible to do operations on one set of shapes " +"that are children of one CSGCombiner3D node, and a set of separate " +"operations on a second set of shapes that are children of a second " +"CSGCombiner3D node, and then do an operation that takes the two end results " +"as its input to create the final shape." +msgstr "" + +#: modules/csg/doc_classes/CSGCylinder3D.xml:4 +msgid "A CSG Cylinder shape." +msgstr "" + +#: modules/csg/doc_classes/CSGCylinder3D.xml:7 +msgid "" +"This node allows you to create a cylinder (or cone) for use with the CSG " +"system." +msgstr "" + +#: modules/csg/doc_classes/CSGCylinder3D.xml:15 +msgid "" +"If [code]true[/code] a cone is created, the [member radius] will only apply " +"to one side." +msgstr "" + +#: modules/csg/doc_classes/CSGCylinder3D.xml:18 +msgid "The height of the cylinder." +msgstr "" + +#: modules/csg/doc_classes/CSGCylinder3D.xml:21 +msgid "The material used to render the cylinder." +msgstr "" + +#: modules/csg/doc_classes/CSGCylinder3D.xml:24 +msgid "The radius of the cylinder." +msgstr "" + +#: modules/csg/doc_classes/CSGCylinder3D.xml:27 +msgid "" +"The number of sides of the cylinder, the higher this number the more detail " +"there will be in the cylinder." +msgstr "" + +#: modules/csg/doc_classes/CSGCylinder3D.xml:30 +msgid "" +"If [code]true[/code] the normals of the cylinder are set to give a smooth " +"effect making the cylinder seem rounded. If [code]false[/code] the cylinder " +"will have a flat shaded look." +msgstr "" + +#: modules/csg/doc_classes/CSGMesh3D.xml:4 +msgid "A CSG Mesh shape that uses a mesh resource." +msgstr "" + +#: modules/csg/doc_classes/CSGMesh3D.xml:7 +msgid "" +"This CSG node allows you to use any mesh resource as a CSG shape, provided " +"it is closed, does not self-intersect, does not contain internal faces and " +"has no edges that connect to more then two faces." +msgstr "" + +#: modules/csg/doc_classes/CSGMesh3D.xml:15 +msgid "The [Material] used in drawing the CSG shape." +msgstr "" + +#: modules/csg/doc_classes/CSGMesh3D.xml:18 +msgid "The [Mesh] resource to use as a CSG shape." +msgstr "" + +#: modules/csg/doc_classes/CSGPolygon3D.xml:4 +msgid "Extrudes a 2D polygon shape to create a 3D mesh." +msgstr "" + +#: modules/csg/doc_classes/CSGPolygon3D.xml:7 +msgid "This node takes a 2D polygon shape and extrudes it to create a 3D mesh." +msgstr "" + +#: modules/csg/doc_classes/CSGPolygon3D.xml:15 +msgid "Extrusion depth when [member mode] is [constant MODE_DEPTH]." +msgstr "" + +#: modules/csg/doc_classes/CSGPolygon3D.xml:18 +msgid "Material to use for the resulting mesh." +msgstr "" + +#: modules/csg/doc_classes/CSGPolygon3D.xml:21 +msgid "Extrusion mode." +msgstr "" + +#: modules/csg/doc_classes/CSGPolygon3D.xml:24 +msgid "" +"If [code]true[/code] the u component of our uv will continuously increase in " +"unison with the distance traveled along our path when [member mode] is " +"[constant MODE_PATH]." +msgstr "" + +#: modules/csg/doc_classes/CSGPolygon3D.xml:27 +msgid "" +"Interval at which a new extrusion slice is added along the path when [member " +"mode] is [constant MODE_PATH]." +msgstr "" + +#: modules/csg/doc_classes/CSGPolygon3D.xml:30 +msgid "" +"If [code]true[/code] the start and end of our path are joined together " +"ensuring there is no seam when [member mode] is [constant MODE_PATH]." +msgstr "" + +#: modules/csg/doc_classes/CSGPolygon3D.xml:33 +msgid "" +"If [code]false[/code] we extrude centered on our path, if [code]true[/code] " +"we extrude in relation to the position of our CSGPolygon3D when [member " +"mode] is [constant MODE_PATH]." +msgstr "" + +#: modules/csg/doc_classes/CSGPolygon3D.xml:36 +msgid "" +"The [Shape3D] object containing the path along which we extrude when [member " +"mode] is [constant MODE_PATH]." +msgstr "" + +#: modules/csg/doc_classes/CSGPolygon3D.xml:39 +msgid "" +"The method by which each slice is rotated along the path when [member mode] " +"is [constant MODE_PATH]." +msgstr "" + +#: modules/csg/doc_classes/CSGPolygon3D.xml:42 +msgid "Point array that defines the shape that we'll extrude." +msgstr "" + +#: modules/csg/doc_classes/CSGPolygon3D.xml:45 +msgid "Generates smooth normals so smooth shading is applied to our mesh." +msgstr "" + +#: modules/csg/doc_classes/CSGPolygon3D.xml:48 +msgid "" +"Degrees to rotate our extrusion for each slice when [member mode] is " +"[constant MODE_SPIN]." +msgstr "" + +#: modules/csg/doc_classes/CSGPolygon3D.xml:51 +msgid "Number of extrusion when [member mode] is [constant MODE_SPIN]." +msgstr "" + +#: modules/csg/doc_classes/CSGPolygon3D.xml:56 +msgid "Shape3D is extruded to [member depth]." +msgstr "" + +#: modules/csg/doc_classes/CSGPolygon3D.xml:59 +msgid "Shape3D is extruded by rotating it around an axis." +msgstr "" + +#: modules/csg/doc_classes/CSGPolygon3D.xml:62 +msgid "" +"Shape3D is extruded along a path set by a [Shape3D] set in [member " +"path_node]." +msgstr "" + +#: modules/csg/doc_classes/CSGPolygon3D.xml:65 +msgid "Slice is not rotated." +msgstr "" + +#: modules/csg/doc_classes/CSGPolygon3D.xml:68 +msgid "Slice is rotated around the up vector of the path." +msgstr "" + +#: modules/csg/doc_classes/CSGPolygon3D.xml:71 +msgid "Slice is rotate to match the path exactly." +msgstr "" + +#: modules/csg/doc_classes/CSGPrimitive3D.xml:4 +msgid "Base class for CSG primitives." +msgstr "" + +#: modules/csg/doc_classes/CSGPrimitive3D.xml:7 +msgid "" +"Parent class for various CSG primitives. It contains code and functionality " +"that is common between them. It cannot be used directly. Instead use one of " +"the various classes that inherit from it." +msgstr "" + +#: modules/csg/doc_classes/CSGPrimitive3D.xml:15 +msgid "Invert the faces of the mesh." +msgstr "" + +#: modules/csg/doc_classes/CSGShape3D.xml:4 +msgid "The CSG base class." +msgstr "" + +#: modules/csg/doc_classes/CSGShape3D.xml:7 +msgid "" +"This is the CSG base class that provides CSG operation support to the " +"various CSG nodes in Godot." +msgstr "" + +#: modules/csg/doc_classes/CSGShape3D.xml:34 +msgid "" +"Returns an [Array] with two elements, the first is the [Transform] of this " +"node and the second is the root [Mesh] of this node. Only works when this " +"node is the root shape." +msgstr "" + +#: modules/csg/doc_classes/CSGShape3D.xml:41 +msgid "" +"Returns [code]true[/code] if this is a root shape and is thus the object " +"that is rendered." +msgstr "" + +#: modules/csg/doc_classes/CSGShape3D.xml:52 doc/classes/SoftBody3D.xml:64 +msgid "" +"Sets individual bits on the layer mask. Use this if you only need to change " +"one layer's value." +msgstr "" + +#: modules/csg/doc_classes/CSGShape3D.xml:63 doc/classes/SoftBody3D.xml:75 +msgid "" +"Sets individual bits on the collision mask. Use this if you only need to " +"change one layer's value." +msgstr "" + +#: modules/csg/doc_classes/CSGShape3D.xml:69 +msgid "" +"Calculate tangents for the CSG shape which allows the use of normal maps. " +"This is only applied on the root shape, this setting is ignored on any child." +msgstr "" + +#: modules/csg/doc_classes/CSGShape3D.xml:72 +msgid "" +"The physics layers this area is in.\n" +"Collidable objects can exist in any of 32 different layers. These layers " +"work like a tagging system, and are not visual. A collidable can use these " +"layers to select with which objects it can collide, using the collision_mask " +"property.\n" +"A contact is detected if object A is in any of the layers that object B " +"scans, or object B is in any layer scanned by object A." +msgstr "" + +#: modules/csg/doc_classes/CSGShape3D.xml:77 +msgid "The physics layers this CSG shape scans for collisions." +msgstr "" + +#: modules/csg/doc_classes/CSGShape3D.xml:80 +msgid "" +"The operation that is performed on this shape. This is ignored for the first " +"CSG child node as the operation is between this node and the previous child " +"of this nodes parent." +msgstr "" + +#: modules/csg/doc_classes/CSGShape3D.xml:83 +msgid "" +"Snap makes the mesh snap to a given distance so that the faces of two meshes " +"can be perfectly aligned. A lower value results in greater precision but may " +"be harder to adjust." +msgstr "" + +#: modules/csg/doc_classes/CSGShape3D.xml:86 +msgid "" +"Adds a collision shape to the physics engine for our CSG shape. This will " +"always act like a static body. Note that the collision shape is still active " +"even if the CSG shape itself is hidden." +msgstr "" + +#: modules/csg/doc_classes/CSGShape3D.xml:91 +msgid "" +"Geometry of both primitives is merged, intersecting geometry is removed." +msgstr "" + +#: modules/csg/doc_classes/CSGShape3D.xml:94 +msgid "Only intersecting geometry remains, the rest is removed." +msgstr "" + +#: modules/csg/doc_classes/CSGShape3D.xml:97 +msgid "" +"The second shape is subtracted from the first, leaving a dent with its shape." +msgstr "" + +#: modules/csg/doc_classes/CSGSphere3D.xml:4 +msgid "A CSG Sphere shape." +msgstr "" + +#: modules/csg/doc_classes/CSGSphere3D.xml:7 +msgid "This node allows you to create a sphere for use with the CSG system." +msgstr "" + +#: modules/csg/doc_classes/CSGSphere3D.xml:15 +msgid "The material used to render the sphere." +msgstr "" + +#: modules/csg/doc_classes/CSGSphere3D.xml:18 +msgid "Number of vertical slices for the sphere." +msgstr "" + +#: modules/csg/doc_classes/CSGSphere3D.xml:21 +msgid "Radius of the sphere." +msgstr "" + +#: modules/csg/doc_classes/CSGSphere3D.xml:24 +msgid "Number of horizontal slices for the sphere." +msgstr "" + +#: modules/csg/doc_classes/CSGSphere3D.xml:27 +msgid "" +"If [code]true[/code] the normals of the sphere are set to give a smooth " +"effect making the sphere seem rounded. If [code]false[/code] the sphere will " +"have a flat shaded look." +msgstr "" + +#: modules/csg/doc_classes/CSGTorus3D.xml:4 +msgid "A CSG Torus shape." +msgstr "" + +#: modules/csg/doc_classes/CSGTorus3D.xml:7 +msgid "This node allows you to create a torus for use with the CSG system." +msgstr "" + +#: modules/csg/doc_classes/CSGTorus3D.xml:15 +msgid "The inner radius of the torus." +msgstr "" + +#: modules/csg/doc_classes/CSGTorus3D.xml:18 +msgid "The material used to render the torus." +msgstr "" + +#: modules/csg/doc_classes/CSGTorus3D.xml:21 +msgid "The outer radius of the torus." +msgstr "" + +#: modules/csg/doc_classes/CSGTorus3D.xml:24 +msgid "The number of edges each ring of the torus is constructed of." +msgstr "" + +#: modules/csg/doc_classes/CSGTorus3D.xml:27 +msgid "The number of slices the torus is constructed of." +msgstr "" + +#: modules/csg/doc_classes/CSGTorus3D.xml:30 +msgid "" +"If [code]true[/code] the normals of the torus are set to give a smooth " +"effect making the torus seem rounded. If [code]false[/code] the torus will " +"have a flat shaded look." +msgstr "" + +#: doc/classes/CubeMesh.xml:4 +msgid "Generate an axis-aligned cuboid [PrimitiveMesh]." +msgstr "" + +#: doc/classes/CubeMesh.xml:7 +msgid "" +"Generate an axis-aligned cuboid [PrimitiveMesh].\n" +"The cube's UV layout is arranged in a 3×2 layout that allows texturing each " +"face individually. To apply the same texture on all faces, change the " +"material's UV property to [code]Vector3(3, 2, 1)[/code]." +msgstr "" + +#: doc/classes/CubeMesh.xml:16 +msgid "Size of the cuboid mesh." +msgstr "" + +#: doc/classes/CubeMesh.xml:19 +msgid "Number of extra edge loops inserted along the Z axis." +msgstr "" + +#: doc/classes/CubeMesh.xml:22 +msgid "Number of extra edge loops inserted along the Y axis." +msgstr "" + +#: doc/classes/CubeMesh.xml:25 +msgid "Number of extra edge loops inserted along the X axis." +msgstr "" + +#: doc/classes/Curve.xml:4 +msgid "A mathematic curve." +msgstr "" + +#: doc/classes/Curve.xml:7 +msgid "" +"A curve that can be saved and re-used for other objects. By default, it " +"ranges between [code]0[/code] and [code]1[/code] on the Y axis and positions " +"points relative to the [code]0.5[/code] Y position." +msgstr "" + +#: doc/classes/Curve.xml:26 +msgid "" +"Adds a point to the curve. For each side, if the [code]*_mode[/code] is " +"[constant TANGENT_LINEAR], the [code]*_tangent[/code] angle (in degrees) " +"uses the slope of the curve halfway to the adjacent point. Allows custom " +"assignments to the [code]*_tangent[/code] angle if [code]*_mode[/code] is " +"set to [constant TANGENT_FREE]." +msgstr "" + +#: doc/classes/Curve.xml:33 +msgid "Recomputes the baked cache of points for the curve." +msgstr "" + +#: doc/classes/Curve.xml:40 +msgid "" +"Removes points that are closer than [code]CMP_EPSILON[/code] (0.00001) units " +"to their neighbor on the curve." +msgstr "" + +#: doc/classes/Curve.xml:47 doc/classes/Curve2D.xml:33 +#: doc/classes/Curve3D.xml:33 +msgid "Removes all points from the curve." +msgstr "" + +#: doc/classes/Curve.xml:54 doc/classes/Curve2D.xml:74 +#: doc/classes/Curve3D.xml:89 +msgid "Returns the number of points describing the curve." +msgstr "" + +#: doc/classes/Curve.xml:63 +msgid "" +"Returns the left [enum TangentMode] for the point at [code]index[/code]." +msgstr "" + +#: doc/classes/Curve.xml:72 +msgid "" +"Returns the left tangent angle (in degrees) for the point at [code]index[/" +"code]." +msgstr "" + +#: doc/classes/Curve.xml:81 +msgid "Returns the curve coordinates for the point at [code]index[/code]." +msgstr "" + +#: doc/classes/Curve.xml:90 +msgid "" +"Returns the right [enum TangentMode] for the point at [code]index[/code]." +msgstr "" + +#: doc/classes/Curve.xml:99 +msgid "" +"Returns the right tangent angle (in degrees) for the point at [code]index[/" +"code]." +msgstr "" + +#: doc/classes/Curve.xml:108 +msgid "" +"Returns the Y value for the point that would exist at the X position " +"[code]offset[/code] along the curve." +msgstr "" + +#: doc/classes/Curve.xml:117 +msgid "" +"Returns the Y value for the point that would exist at the X position " +"[code]offset[/code] along the curve using the baked cache. Bakes the curve's " +"points if not already baked." +msgstr "" + +#: doc/classes/Curve.xml:126 +msgid "Removes the point at [code]index[/code] from the curve." +msgstr "" + +#: doc/classes/Curve.xml:137 +msgid "" +"Sets the left [enum TangentMode] for the point at [code]index[/code] to " +"[code]mode[/code]." +msgstr "" + +#: doc/classes/Curve.xml:148 +msgid "" +"Sets the left tangent angle for the point at [code]index[/code] to " +"[code]tangent[/code]." +msgstr "" + +#: doc/classes/Curve.xml:159 +msgid "Sets the offset from [code]0.5[/code]." +msgstr "" + +#: doc/classes/Curve.xml:170 +msgid "" +"Sets the right [enum TangentMode] for the point at [code]index[/code] to " +"[code]mode[/code]." +msgstr "" + +#: doc/classes/Curve.xml:181 +msgid "" +"Sets the right tangent angle for the point at [code]index[/code] to " +"[code]tangent[/code]." +msgstr "" + +#: doc/classes/Curve.xml:192 +msgid "" +"Assigns the vertical position [code]y[/code] to the point at [code]index[/" +"code]." +msgstr "" + +#: doc/classes/Curve.xml:198 +msgid "The number of points to include in the baked (i.e. cached) curve data." +msgstr "" + +#: doc/classes/Curve.xml:201 +msgid "The maximum value the curve can reach." +msgstr "" + +#: doc/classes/Curve.xml:204 +msgid "The minimum value the curve can reach." +msgstr "" + +#: doc/classes/Curve.xml:210 +msgid "Emitted when [member max_value] or [member min_value] is changed." +msgstr "" + +#: doc/classes/Curve.xml:216 +msgid "The tangent on this side of the point is user-defined." +msgstr "" + +#: doc/classes/Curve.xml:219 +msgid "" +"The curve calculates the tangent on this side of the point as the slope " +"halfway towards the adjacent point." +msgstr "" + +#: doc/classes/Curve.xml:222 +msgid "The total number of available tangent modes." +msgstr "" + +#: doc/classes/Curve2D.xml:4 +msgid "Describes a Bézier curve in 2D space." +msgstr "" + +#: doc/classes/Curve2D.xml:7 +msgid "" +"This class describes a Bézier curve in 2D space. It is mainly used to give a " +"shape to a [Path2D], but can be manually sampled for other purposes.\n" +"It keeps a cache of precalculated points along the curve, to speed up " +"further calculations." +msgstr "" + +#: doc/classes/Curve2D.xml:25 doc/classes/Curve3D.xml:25 +msgid "" +"Adds a point to a curve at [code]position[/code], with control points " +"[code]in[/code] and [code]out[/code].\n" +"If [code]at_position[/code] is given, the point is inserted before the point " +"number [code]at_position[/code], moving that point (and every point after) " +"after the inserted point. If [code]at_position[/code] is not given, or is an " +"illegal value ([code]at_position <0[/code] or [code]at_position >= [method " +"get_point_count][/code]), the point will be appended at the end of the point " +"list." +msgstr "" + +#: doc/classes/Curve2D.xml:40 doc/classes/Curve3D.xml:40 +msgid "" +"Returns the total length of the curve, based on the cached points. Given " +"enough density (see [member bake_interval]), it should be approximate enough." +msgstr "" + +#: doc/classes/Curve2D.xml:47 +msgid "Returns the cache of points as a [PackedVector2Array]." +msgstr "" + +#: doc/classes/Curve2D.xml:56 +msgid "" +"Returns the closest offset to [code]to_point[/code]. This offset is meant to " +"be used in [method interpolate_baked].\n" +"[code]to_point[/code] must be in this curve's local space." +msgstr "" + +#: doc/classes/Curve2D.xml:66 doc/classes/Curve3D.xml:81 +msgid "" +"Returns the closest point (in curve's local space) to [code]to_point[/" +"code].\n" +"[code]to_point[/code] must be in this curve's local space." +msgstr "" + +#: doc/classes/Curve2D.xml:83 +msgid "" +"Returns the position of the control point leading to the vertex [code]idx[/" +"code]. If the index is out of bounds, the function sends an error to the " +"console, and returns [code](0, 0)[/code]." +msgstr "" + +#: doc/classes/Curve2D.xml:92 +msgid "" +"Returns the position of the control point leading out of the vertex " +"[code]idx[/code]. If the index is out of bounds, the function sends an error " +"to the console, and returns [code](0, 0)[/code]." +msgstr "" + +#: doc/classes/Curve2D.xml:101 +msgid "" +"Returns the position of the vertex [code]idx[/code]. If the index is out of " +"bounds, the function sends an error to the console, and returns [code](0, 0)" +"[/code]." +msgstr "" + +#: doc/classes/Curve2D.xml:112 +msgid "" +"Returns the position between the vertex [code]idx[/code] and the vertex " +"[code]idx + 1[/code], where [code]t[/code] controls if the point is the " +"first vertex ([code]t = 0.0[/code]), the last vertex ([code]t = 1.0[/code]), " +"or in between. Values of [code]t[/code] outside the range ([code]0.0 >= t " +"<=1[/code]) give strange, but predictable results.\n" +"If [code]idx[/code] is out of bounds it is truncated to the first or last " +"vertex, and [code]t[/code] is ignored. If the curve has no points, the " +"function sends an error to the console, and returns [code](0, 0)[/code]." +msgstr "" + +#: doc/classes/Curve2D.xml:124 doc/classes/Curve3D.xml:148 +msgid "" +"Returns a point within the curve at position [code]offset[/code], where " +"[code]offset[/code] is measured as a pixel distance along the curve.\n" +"To do that, it finds the two cached points where the [code]offset[/code] " +"lies between, then interpolates the values. This interpolation is cubic if " +"[code]cubic[/code] is set to [code]true[/code], or linear if set to " +"[code]false[/code].\n" +"Cubic interpolation tends to follow the curves better, but linear is faster " +"(and often, precise enough)." +msgstr "" + +#: doc/classes/Curve2D.xml:135 doc/classes/Curve3D.xml:172 +msgid "" +"Returns the position at the vertex [code]fofs[/code]. It calls [method " +"interpolate] using the integer part of [code]fofs[/code] as [code]idx[/" +"code], and its fractional part as [code]t[/code]." +msgstr "" + +#: doc/classes/Curve2D.xml:144 doc/classes/Curve3D.xml:181 +msgid "" +"Deletes the point [code]idx[/code] from the curve. Sends an error to the " +"console if [code]idx[/code] is out of bounds." +msgstr "" + +#: doc/classes/Curve2D.xml:155 doc/classes/Curve3D.xml:192 +msgid "" +"Sets the position of the control point leading to the vertex [code]idx[/" +"code]. If the index is out of bounds, the function sends an error to the " +"console." +msgstr "" + +#: doc/classes/Curve2D.xml:166 doc/classes/Curve3D.xml:203 +msgid "" +"Sets the position of the control point leading out of the vertex [code]idx[/" +"code]. If the index is out of bounds, the function sends an error to the " +"console." +msgstr "" + +#: doc/classes/Curve2D.xml:177 doc/classes/Curve3D.xml:214 +msgid "" +"Sets the position for the vertex [code]idx[/code]. If the index is out of " +"bounds, the function sends an error to the console." +msgstr "" + +#: doc/classes/Curve2D.xml:188 doc/classes/Curve3D.xml:237 +msgid "" +"Returns a list of points along the curve, with a curvature controlled point " +"density. That is, the curvier parts will have more points than the " +"straighter parts.\n" +"This approximation makes straight segments between each point, then " +"subdivides those segments until the resulting shape is similar enough.\n" +"[code]max_stages[/code] controls how many subdivisions a curve segment may " +"face before it is considered approximate enough. Each subdivision splits the " +"segment in half, so the default 5 stages may mean up to 32 subdivisions per " +"curve segment. Increase with care!\n" +"[code]tolerance_degrees[/code] controls how many degrees the midpoint of a " +"segment may deviate from the real curve, before the segment has to be " +"subdivided." +msgstr "" + +#: doc/classes/Curve2D.xml:197 +msgid "" +"The distance in pixels between two adjacent cached points. Changing it " +"forces the cache to be recomputed the next time the [method " +"get_baked_points] or [method get_baked_length] function is called. The " +"smaller the distance, the more points in the cache and the more memory it " +"will consume, so use with care." +msgstr "" + +#: doc/classes/Curve3D.xml:4 +msgid "Describes a Bézier curve in 3D space." +msgstr "" + +#: doc/classes/Curve3D.xml:7 +msgid "" +"This class describes a Bézier curve in 3D space. It is mainly used to give a " +"shape to a [Path3D], but can be manually sampled for other purposes.\n" +"It keeps a cache of precalculated points along the curve, to speed up " +"further calculations." +msgstr "" + +#: doc/classes/Curve3D.xml:47 +msgid "Returns the cache of points as a [PackedVector3Array]." +msgstr "" + +#: doc/classes/Curve3D.xml:54 +msgid "Returns the cache of tilts as a [PackedFloat32Array]." +msgstr "" + +#: doc/classes/Curve3D.xml:61 +msgid "" +"Returns the cache of up vectors as a [PackedVector3Array].\n" +"If [member up_vector_enabled] is [code]false[/code], the cache will be empty." +msgstr "" + +#: doc/classes/Curve3D.xml:71 +msgid "" +"Returns the closest offset to [code]to_point[/code]. This offset is meant to " +"be used in [method interpolate_baked] or [method " +"interpolate_baked_up_vector].\n" +"[code]to_point[/code] must be in this curve's local space." +msgstr "" + +#: doc/classes/Curve3D.xml:98 +msgid "" +"Returns the position of the control point leading to the vertex [code]idx[/" +"code]. If the index is out of bounds, the function sends an error to the " +"console, and returns [code](0, 0, 0)[/code]." +msgstr "" + +#: doc/classes/Curve3D.xml:107 +msgid "" +"Returns the position of the control point leading out of the vertex " +"[code]idx[/code]. If the index is out of bounds, the function sends an error " +"to the console, and returns [code](0, 0, 0)[/code]." +msgstr "" + +#: doc/classes/Curve3D.xml:116 +msgid "" +"Returns the position of the vertex [code]idx[/code]. If the index is out of " +"bounds, the function sends an error to the console, and returns [code](0, 0, " +"0)[/code]." +msgstr "" + +#: doc/classes/Curve3D.xml:125 +msgid "" +"Returns the tilt angle in radians for the point [code]idx[/code]. If the " +"index is out of bounds, the function sends an error to the console, and " +"returns [code]0[/code]." +msgstr "" + +#: doc/classes/Curve3D.xml:136 +msgid "" +"Returns the position between the vertex [code]idx[/code] and the vertex " +"[code]idx + 1[/code], where [code]t[/code] controls if the point is the " +"first vertex ([code]t = 0.0[/code]), the last vertex ([code]t = 1.0[/code]), " +"or in between. Values of [code]t[/code] outside the range ([code]0.0 >= t " +"<=1[/code]) give strange, but predictable results.\n" +"If [code]idx[/code] is out of bounds it is truncated to the first or last " +"vertex, and [code]t[/code] is ignored. If the curve has no points, the " +"function sends an error to the console, and returns [code](0, 0, 0)[/code]." +msgstr "" + +#: doc/classes/Curve3D.xml:161 +msgid "" +"Returns an up vector within the curve at position [code]offset[/code], where " +"[code]offset[/code] is measured as a distance in 3D units along the curve.\n" +"To do that, it finds the two cached up vectors where the [code]offset[/code] " +"lies between, then interpolates the values. If [code]apply_tilt[/code] is " +"[code]true[/code], an interpolated tilt is applied to the interpolated up " +"vector.\n" +"If the curve has no up vectors, the function sends an error to the console, " +"and returns [code](0, 1, 0)[/code]." +msgstr "" + +#: doc/classes/Curve3D.xml:225 +msgid "" +"Sets the tilt angle in radians for the point [code]idx[/code]. If the index " +"is out of bounds, the function sends an error to the console.\n" +"The tilt controls the rotation along the look-at axis an object traveling " +"the path would have. In the case of a curve controlling a [PathFollow3D], " +"this tilt is an offset over the natural tilt the [PathFollow3D] calculates." +msgstr "" + +#: doc/classes/Curve3D.xml:246 +msgid "" +"The distance in meters between two adjacent cached points. Changing it " +"forces the cache to be recomputed the next time the [method " +"get_baked_points] or [method get_baked_length] function is called. The " +"smaller the distance, the more points in the cache and the more memory it " +"will consume, so use with care." +msgstr "" + +#: doc/classes/Curve3D.xml:249 +msgid "" +"If [code]true[/code], the curve will bake up vectors used for orientation. " +"This is used when [member PathFollow3D.rotation_mode] is set to [constant " +"PathFollow3D.ROTATION_ORIENTED]. Changing it forces the cache to be " +"recomputed." +msgstr "" + +#: doc/classes/CurveTexture.xml:4 +msgid "A texture that shows a curve." +msgstr "" + +#: doc/classes/CurveTexture.xml:7 +msgid "" +"Renders a given [Curve] provided to it. Simplifies the task of drawing " +"curves and/or saving them as image files." +msgstr "" + +#: doc/classes/CurveTexture.xml:15 +msgid "The [code]curve[/code] rendered onto the texture." +msgstr "" + +#: doc/classes/CurveTexture.xml:18 +msgid "The width of the texture." +msgstr "" + +#: doc/classes/CylinderMesh.xml:4 +msgid "Class representing a cylindrical [PrimitiveMesh]." +msgstr "" + +#: doc/classes/CylinderMesh.xml:7 +msgid "" +"Class representing a cylindrical [PrimitiveMesh]. This class can be used to " +"create cones by setting either the [member top_radius] or [member " +"bottom_radius] properties to 0.0." +msgstr "" + +#: doc/classes/CylinderMesh.xml:15 +msgid "Bottom radius of the cylinder." +msgstr "" + +#: doc/classes/CylinderMesh.xml:18 +msgid "Full height of the cylinder." +msgstr "" + +#: doc/classes/CylinderMesh.xml:21 +msgid "Number of radial segments on the cylinder." +msgstr "" + +#: doc/classes/CylinderMesh.xml:24 +msgid "Number of edge rings along the height of the cylinder." +msgstr "" + +#: doc/classes/CylinderMesh.xml:27 +msgid "Top radius of the cylinder." +msgstr "" + +#: doc/classes/CylinderShape3D.xml:4 doc/classes/CylinderShape3D.xml:7 +msgid "Cylinder shape for collisions." +msgstr "" + +#: doc/classes/CylinderShape3D.xml:15 +msgid "The cylinder's height." +msgstr "" + +#: doc/classes/CylinderShape3D.xml:18 +msgid "The cylinder's radius." +msgstr "" + +#: doc/classes/DampedSpringJoint2D.xml:4 +msgid "Damped spring constraint for 2D physics." +msgstr "" + +#: doc/classes/DampedSpringJoint2D.xml:7 +msgid "" +"Damped spring constraint for 2D physics. This resembles a spring joint that " +"always wants to go back to a given length." +msgstr "" + +#: doc/classes/DampedSpringJoint2D.xml:15 +msgid "" +"The spring joint's damping ratio. A value between [code]0[/code] and " +"[code]1[/code]. When the two bodies move into different directions the " +"system tries to align them to the spring axis again. A high [code]damping[/" +"code] value forces the attached bodies to align faster." +msgstr "" + +#: doc/classes/DampedSpringJoint2D.xml:18 +msgid "" +"The spring joint's maximum length. The two attached bodies cannot stretch it " +"past this value." +msgstr "" + +#: doc/classes/DampedSpringJoint2D.xml:21 +msgid "" +"When the bodies attached to the spring joint move they stretch or squash it. " +"The joint always tries to resize towards this length." +msgstr "" + +#: doc/classes/DampedSpringJoint2D.xml:24 +msgid "" +"The higher the value, the less the bodies attached to the joint will deform " +"it. The joint applies an opposing force to the bodies, the product of the " +"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 "" + +#: doc/classes/Dictionary.xml:7 +msgid "" +"Dictionary type. Associative container which contains values referenced by " +"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 another_dir = {\n" +" key1: value1,\n" +" key2: value2,\n" +" key3: value3,\n" +"}\n" +"[/codeblock]\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 " +"paired with the appropriate color selected in [code]my_color[/code].\n" +"Dictionaries can contain more complex data:\n" +"[codeblock]\n" +"my_dir = {\"First Array\": [1, 2, 3, 4]} # Assigns an Array to a String " +"key.\n" +"[/codeblock]\n" +"To add a key to an existing dictionary, access it like an existing key and " +"assign to it:\n" +"[codeblock]\n" +"var points_dir = {\"White\": 50, \"Yellow\": 75, \"Orange\": 100}\n" +"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" +"# 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" +"[codeblock]\n" +"array1 = [1, 2, 3]\n" +"array2 = [1, 2, 3]\n" +"\n" +"func compare_arrays():\n" +" print(array1 == array2) # Will print true.\n" +"\n" +"dir1 = {\"a\": 1, \"b\": 2, \"c\": 3}\n" +"dir2 = {\"a\": 1, \"b\": 2, \"c\": 3}\n" +"\n" +"func compare_dictionaries():\n" +" print(dir1 == dir2) # Will NOT print true.\n" +"[/codeblock]\n" +"You need to first calculate the dictionary's hash with [method hash] before " +"you can compare them:\n" +"[codeblock]\n" +"dir1 = {\"a\": 1, \"b\": 2, \"c\": 3}\n" +"dir2 = {\"a\": 1, \"b\": 2, \"c\": 3}\n" +"\n" +"func compare_dictionaries():\n" +" print(dir1.hash() == dir2.hash()) # Will print true.\n" +"[/codeblock]" +msgstr "" + +#: 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:82 +msgid "Clear the dictionary, removing all key/value pairs." +msgstr "" + +#: 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:98 +msgid "Returns [code]true[/code] if the dictionary is empty." +msgstr "" + +#: 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: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:127 +msgid "Returns [code]true[/code] if the dictionary has a given key." +msgstr "" + +#: 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:143 +msgid "" +"Returns a hashed integer value representing the dictionary contents. This " +"can be used to compare dictionaries by value:\n" +"[codeblock]\n" +"var dict1 = {0: 10}\n" +"var dict2 = {0: 10}\n" +"# The line below prints `true`, whereas it would have printed `false` if " +"both variables were compared directly.\n" +"print(dict1.hash() == dict2.hash())\n" +"[/codeblock]" +msgstr "" + +#: doc/classes/Dictionary.xml:156 +msgid "Returns the list of keys in the [Dictionary]." +msgstr "" + +#: doc/classes/Dictionary.xml:163 +msgid "Returns the size of the dictionary (in pairs)." +msgstr "" + +#: doc/classes/Dictionary.xml:170 +msgid "Returns the list of values in the [Dictionary]." +msgstr "" + +#: doc/classes/DirectionalLight3D.xml:4 +msgid "Directional light from a distance, as from the Sun." +msgstr "" + +#: doc/classes/DirectionalLight3D.xml:7 +msgid "" +"A directional light is a type of [Light3D] node that models an infinite " +"number of parallel rays covering the entire scene. It is used for lights " +"with strong intensity that are located far away from the scene to model " +"sunlight or moonlight. The worldspace location of the DirectionalLight3D " +"transform (origin) is ignored. Only the basis is used to determine light " +"direction." +msgstr "" + +#: doc/classes/DirectionalLight3D.xml:10 doc/classes/Light3D.xml:10 +#: doc/classes/OmniLight3D.xml:10 doc/classes/SpotLight3D.xml:10 +msgid "" +"https://docs.godotengine.org/en/latest/tutorials/3d/lights_and_shadows.html" +msgstr "" + +#: doc/classes/DirectionalLight3D.xml:16 +msgid "" +"If [code]true[/code], shadow detail is sacrificed in exchange for smoother " +"transitions between splits." +msgstr "" + +#: doc/classes/DirectionalLight3D.xml:19 +msgid "" +"Optimizes shadow rendering for detail versus movement. See [enum " +"ShadowDepthRange]." +msgstr "" + +#: doc/classes/DirectionalLight3D.xml:22 +msgid "" +"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:25 +msgid "The maximum distance for shadow splits." +msgstr "" + +#: doc/classes/DirectionalLight3D.xml:28 +msgid "The light's shadow rendering algorithm. See [enum ShadowMode]." +msgstr "" + +#: doc/classes/DirectionalLight3D.xml:31 doc/classes/RenderingServer.xml:3371 +msgid "" +"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:34 +msgid "" +"The distance from camera to shadow split 1. Relative to [member " +"directional_shadow_max_distance]. Only used when [member " +"directional_shadow_mode] is [code]SHADOW_PARALLEL_2_SPLITS[/code] or " +"[code]SHADOW_PARALLEL_4_SPLITS[/code]." +msgstr "" + +#: 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 " +"directional_shadow_mode] is [code]SHADOW_PARALLEL_2_SPLITS[/code] or " +"[code]SHADOW_PARALLEL_4_SPLITS[/code]." +msgstr "" + +#: 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: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:48 +msgid "Splits the view frustum in 2 areas, each with its own shadow map." +msgstr "" + +#: doc/classes/DirectionalLight3D.xml:51 +msgid "Splits the view frustum in 4 areas, each with its own shadow map." +msgstr "" + +#: 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:57 +msgid "" +"Tries to achieve maximum shadow resolution. May result in saw effect on " +"shadow edges." +msgstr "" + +#: doc/classes/Directory.xml:4 +msgid "Type used to handle the filesystem." +msgstr "" + +#: doc/classes/Directory.xml:7 +msgid "" +"Directory type. It is used to manage directories and their content (not " +"restricted to the project folder).\n" +"When creating a new [Directory], its default opened directory will be " +"[code]res://[/code]. This may change in the future, so it is advised to " +"always use [method open] to initialize your [Directory] where you want to " +"operate, with explicit error checking.\n" +"Here is an example on how to iterate through the files of a directory:\n" +"[codeblock]\n" +"func dir_contents(path):\n" +" var dir = Directory.new()\n" +" if dir.open(path) == OK:\n" +" dir.list_dir_begin()\n" +" var file_name = dir.get_next()\n" +" while file_name != \"\":\n" +" if dir.current_is_dir():\n" +" print(\"Found directory: \" + file_name)\n" +" else:\n" +" print(\"Found file: \" + file_name)\n" +" file_name = dir.get_next()\n" +" else:\n" +" print(\"An error occurred when trying to access the path.\")\n" +"[/codeblock]" +msgstr "" + +#: doc/classes/Directory.xml:27 doc/classes/File.xml:25 +msgid "" +"https://docs.godotengine.org/en/latest/getting_started/step_by_step/" +"filesystem.html" +msgstr "" + +#: doc/classes/Directory.xml:36 +msgid "" +"Changes the currently opened directory to the one passed as an argument. The " +"argument can be relative to the current directory (e.g. [code]newdir[/code] " +"or [code]../newdir[/code]), or an absolute path (e.g. [code]/tmp/newdir[/" +"code] or [code]res://somedir/newdir[/code]).\n" +"Returns one of the [enum Error] code constants ([code]OK[/code] on success)." +msgstr "" + +#: doc/classes/Directory.xml:48 +msgid "" +"Copies the [code]from[/code] file to the [code]to[/code] destination. Both " +"arguments should be paths to files, either relative or absolute. If the " +"destination file exists and is not access-protected, it will be " +"overwritten.\n" +"Returns one of the [enum Error] code constants ([code]OK[/code] on success)." +msgstr "" + +#: doc/classes/Directory.xml:56 +msgid "" +"Returns whether the current item processed with the last [method get_next] " +"call is a directory ([code].[/code] and [code]..[/code] are considered " +"directories)." +msgstr "" + +#: doc/classes/Directory.xml:65 +msgid "" +"Returns whether the target directory exists. The argument can be relative to " +"the current directory, or an absolute path." +msgstr "" + +#: doc/classes/Directory.xml:74 +msgid "" +"Returns whether the target file exists. The argument can be relative to the " +"current directory, or an absolute path." +msgstr "" + +#: doc/classes/Directory.xml:81 +msgid "" +"Returns the absolute path to the currently opened directory (e.g. " +"[code]res://folder[/code] or [code]C:\\tmp\\folder[/code])." +msgstr "" + +#: doc/classes/Directory.xml:88 +msgid "" +"Returns the currently opened directory's drive index. See [method get_drive] " +"to convert returned index to the name of the drive." +msgstr "" + +#: doc/classes/Directory.xml:97 +msgid "" +"On Windows, returns the name of the drive (partition) passed as an argument " +"(e.g. [code]C:[/code]). On other platforms, or if the requested drive does " +"not existed, the method returns an empty String." +msgstr "" + +#: doc/classes/Directory.xml:104 +msgid "" +"On Windows, returns the number of drives (partitions) mounted on the current " +"filesystem. On other platforms, the method returns 0." +msgstr "" + +#: doc/classes/Directory.xml:111 +msgid "" +"Returns the next element (file or directory) in the current directory " +"(including [code].[/code] and [code]..[/code], unless " +"[code]skip_navigational[/code] was given to [method list_dir_begin]).\n" +"The name of the file or directory is returned (and not its full path). Once " +"the stream has been fully processed, the method returns an empty String and " +"closes the stream automatically (i.e. [method list_dir_end] would not be " +"mandatory in such a case)." +msgstr "" + +#: doc/classes/Directory.xml:119 +msgid "" +"On UNIX desktop systems, returns the available space on the current " +"directory's disk. On other platforms, this information is not available and " +"the method returns 0 or -1." +msgstr "" + +#: doc/classes/Directory.xml:130 +msgid "" +"Initializes the stream used to list all files and directories using the " +"[method get_next] function, closing the current opened stream if needed. " +"Once the stream has been processed, it should typically be closed with " +"[method list_dir_end].\n" +"If [code]skip_navigational[/code] is [code]true[/code], [code].[/code] and " +"[code]..[/code] are filtered out.\n" +"If [code]skip_hidden[/code] is [code]true[/code], hidden files are filtered " +"out." +msgstr "" + +#: doc/classes/Directory.xml:139 +msgid "" +"Closes the current stream opened with [method list_dir_begin] (whether it " +"has been fully processed with [method get_next] or not does not matter)." +msgstr "" + +#: doc/classes/Directory.xml:148 +msgid "" +"Creates a directory. The argument can be relative to the current directory, " +"or an absolute path. The target directory should be placed in an already " +"existing directory (to create the full path recursively, see [method " +"make_dir_recursive]).\n" +"Returns one of the [enum Error] code constants ([code]OK[/code] on success)." +msgstr "" + +#: doc/classes/Directory.xml:158 +msgid "" +"Creates a target directory and all necessary intermediate directories in its " +"path, by calling [method make_dir] recursively. The argument can be relative " +"to the current directory, or an absolute path.\n" +"Returns one of the [enum Error] code constants ([code]OK[/code] on success)." +msgstr "" + +#: doc/classes/Directory.xml:168 +msgid "" +"Opens an existing directory of the filesystem. The [code]path[/code] " +"argument can be within the project tree ([code]res://folder[/code]), the " +"user directory ([code]user://folder[/code]) or an absolute path of the user " +"filesystem (e.g. [code]/tmp/folder[/code] or [code]C:\\tmp\\folder[/code]).\n" +"Returns one of the [enum Error] code constants ([code]OK[/code] on success)." +msgstr "" + +#: doc/classes/Directory.xml:178 +msgid "" +"Deletes the target file or an empty directory. The argument can be relative " +"to the current directory, or an absolute path. If the target directory is " +"not empty, the operation will fail.\n" +"Returns one of the [enum Error] code constants ([code]OK[/code] on success)." +msgstr "" + +#: doc/classes/Directory.xml:190 +msgid "" +"Renames (move) the [code]from[/code] file to the [code]to[/code] " +"destination. Both arguments should be paths to files, either relative or " +"absolute. If the destination file exists and is not access-protected, it " +"will be overwritten.\n" +"Returns one of the [enum Error] code constants ([code]OK[/code] on success)." +msgstr "" + +#: doc/classes/DTLSServer.xml:4 +msgid "Helper class to implement a DTLS server." +msgstr "" + +#: doc/classes/DTLSServer.xml:7 +msgid "" +"This class is used to store the state of a DTLS server. Upon [method setup] " +"it converts connected [PacketPeerUDP] to [PacketPeerDTLS] accepting them via " +"[method take_connection] as DTLS clients. Under the hood, this class is used " +"to store the DTLS state and cookies of the server. The reason of why the " +"state and cookies are needed is outside of the scope of this documentation.\n" +"Below a small example of how to use it:\n" +"[codeblock]\n" +"# server.gd\n" +"extends Node\n" +"\n" +"var dtls := DTLSServer.new()\n" +"var server := UDPServer.new()\n" +"var peers = []\n" +"\n" +"func _ready():\n" +" server.listen(4242)\n" +" var key = load(\"key.key\") # Your private key.\n" +" var cert = load(\"cert.crt\") # Your X509 certificate.\n" +" dtls.setup(key, cert)\n" +"\n" +"func _process(delta):\n" +" while server.is_connection_available():\n" +" var peer : PacketPeerUDP = server.take_connection()\n" +" var dtls_peer : PacketPeerDTLS = dtls.take_connection(peer)\n" +" if dtls_peer.get_status() != PacketPeerDTLS.STATUS_HANDSHAKING:\n" +" continue # It is normal that 50% of the connections fails due to " +"cookie exchange.\n" +" print(\"Peer connected!\")\n" +" peers.append(dtls_peer)\n" +" for p in peers:\n" +" p.poll() # Must poll to update the state.\n" +" if p.get_status() == PacketPeerDTLS.STATUS_CONNECTED:\n" +" while p.get_available_packet_count() > 0:\n" +" print(\"Received message from client: %s\" % p.get_packet()." +"get_string_from_utf8())\n" +" p.put_packet(\"Hello DTLS client\".to_utf8())\n" +"[/codeblock]\n" +"[codeblock]\n" +"# client.gd\n" +"extends Node\n" +"\n" +"var dtls := PacketPeerDTLS.new()\n" +"var udp := PacketPeerUDP.new()\n" +"var connected = false\n" +"\n" +"func _ready():\n" +" udp.connect_to_host(\"127.0.0.1\", 4242)\n" +" dtls.connect_to_peer(udp, false) # Use true in production for " +"certificate validation!\n" +"\n" +"func _process(delta):\n" +" dtls.poll()\n" +" if dtls.get_status() == PacketPeerDTLS.STATUS_CONNECTED:\n" +" if !connected:\n" +" # Try to contact server\n" +" dtls.put_packet(\"The answer is... 42!\".to_utf8())\n" +" while dtls.get_available_packet_count() > 0:\n" +" print(\"Connected: %s\" % dtls.get_packet()." +"get_string_from_utf8())\n" +" connected = true\n" +"[/codeblock]" +msgstr "" + +#: doc/classes/DTLSServer.xml:74 +msgid "" +"Setup the DTLS server to use the given [code]private_key[/code] and provide " +"the given [code]certificate[/code] to clients. You can pass the optional " +"[code]chain[/code] parameter to provide additional CA chain information " +"along with the certificate." +msgstr "" + +#: doc/classes/DTLSServer.xml:83 +msgid "" +"Try to initiate the DTLS handshake with the given [code]udp_peer[/code] " +"which must be already connected (see [method PacketPeerUDP." +"connect_to_host]).\n" +"[b]Note[/b]: You must check that the state of the return PacketPeerUDP is " +"[constant PacketPeerDTLS.STATUS_HANDSHAKING], as it is normal that 50% of " +"the new connections will be invalid due to cookie exchange." +msgstr "" + +#: doc/classes/DynamicFont.xml:4 +msgid "DynamicFont renders vector font files at runtime." +msgstr "" + +#: doc/classes/DynamicFont.xml:7 +msgid "" +"DynamicFont renders vector font files (such as TTF or OTF) dynamically at " +"runtime instead of using a prerendered texture atlas like [BitmapFont]. This " +"trades the faster loading time of [BitmapFont]s for the ability to change " +"font parameters like size and spacing during runtime. [DynamicFontData] is " +"used for referencing the font file paths. DynamicFont also supports defining " +"one or more fallbacks fonts, which will be used when displaying a character " +"not supported by the main font.\n" +"DynamicFont uses the [url=https://www.freetype.org/]FreeType[/url] library " +"for rasterization.\n" +"[codeblock]\n" +"var dynamic_font = DynamicFont.new()\n" +"dynamic_font.font_data = load(\"res://BarlowCondensed-Bold.ttf\")\n" +"dynamic_font.size = 64\n" +"$\"Label\".set(\"custom_fonts/font\", dynamic_font)\n" +"[/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:26 +msgid "Adds a fallback font." +msgstr "" + +#: doc/classes/DynamicFont.xml:35 +msgid "Returns the fallback font at index [code]idx[/code]." +msgstr "" + +#: doc/classes/DynamicFont.xml:42 +msgid "Returns the number of fallback fonts." +msgstr "" + +#: doc/classes/DynamicFont.xml:51 +msgid "" +"Returns the spacing for the given [code]type[/code] (see [enum SpacingType])." +msgstr "" + +#: doc/classes/DynamicFont.xml:60 +msgid "Removes the fallback font at index [code]idx[/code]." +msgstr "" + +#: doc/classes/DynamicFont.xml:71 +msgid "Sets the fallback font at index [code]idx[/code]." +msgstr "" + +#: 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:88 +msgid "Extra spacing at the bottom in pixels." +msgstr "" + +#: doc/classes/DynamicFont.xml:91 +msgid "Extra character spacing in pixels." +msgstr "" + +#: doc/classes/DynamicFont.xml:94 +msgid "Extra space spacing in pixels." +msgstr "" + +#: doc/classes/DynamicFont.xml:97 +msgid "Extra spacing at the top in pixels." +msgstr "" + +#: doc/classes/DynamicFont.xml:100 +msgid "The font data." +msgstr "" + +#: 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 " +"can adjust it in individual controls. For example, if the outline is made " +"black here, it won't be possible to change its color using a Label's font " +"outline modulate theme item." +msgstr "" + +#: doc/classes/DynamicFont.xml:107 +msgid "The font outline's thickness in pixels (not relative to the font size)." +msgstr "" + +#: doc/classes/DynamicFont.xml:110 +msgid "The font size in pixels." +msgstr "" + +#: doc/classes/DynamicFont.xml:115 +msgid "Spacing at the top." +msgstr "" + +#: doc/classes/DynamicFont.xml:118 +msgid "Spacing at the bottom." +msgstr "" + +#: doc/classes/DynamicFont.xml:121 +msgid "Character spacing." +msgstr "" + +#: doc/classes/DynamicFont.xml:124 +msgid "Space spacing." +msgstr "" + +#: doc/classes/DynamicFontData.xml:4 +msgid "Used with [DynamicFont] to describe the location of a font file." +msgstr "" + +#: doc/classes/DynamicFontData.xml:7 +msgid "" +"Used with [DynamicFont] to describe the location of a vector font file for " +"dynamic rendering at runtime." +msgstr "" + +#: doc/classes/DynamicFontData.xml:15 +msgid "If [code]true[/code], the font is rendered with anti-aliasing." +msgstr "" + +#: doc/classes/DynamicFontData.xml:18 +msgid "The path to the vector font file." +msgstr "" + +#: doc/classes/DynamicFontData.xml:21 +msgid "The font hinting mode used by FreeType. See [enum Hinting] for options." +msgstr "" + +#: doc/classes/DynamicFontData.xml:26 +msgid "Disables font hinting (smoother but less crisp)." +msgstr "" + +#: doc/classes/DynamicFontData.xml:29 +msgid "Use the light font hinting mode." +msgstr "" + +#: doc/classes/DynamicFontData.xml:32 +msgid "Use the default font hinting mode (crisper but less smooth)." +msgstr "" + +#: doc/classes/EditorExportPlugin.xml:4 +msgid "A script that is executed when exporting projects." +msgstr "" + +#: doc/classes/EditorExportPlugin.xml:23 +msgid "" +"Virtual method to be overridden by the user. It is called when the export " +"starts and provides all information about the export." +msgstr "" + +#: doc/classes/EditorExportPlugin.xml:30 +msgid "" +"Virtual method to be overridden by the user. Called when the export is " +"finished." +msgstr "" + +#: doc/classes/EditorFeatureProfile.xml:4 +msgid "" +"An editor feature profile which can be used to disable specific features." +msgstr "" + +#: doc/classes/EditorFeatureProfile.xml:7 +msgid "" +"An editor feature profile can be used to disable specific features of the " +"Godot editor. When disabled, the features won't appear in the editor, which " +"makes the editor less cluttered. This is useful in education settings to " +"reduce confusion or when working in a team. For example, artists and level " +"designers could use a feature profile that disables the script editor to " +"avoid accidentally making changes to files they aren't supposed to edit.\n" +"To manage editor feature profiles visually, use [b]Editor > Manage Feature " +"Profiles...[/b] at the top of the editor window." +msgstr "" + +#: doc/classes/EditorFeatureProfile.xml:19 +msgid "Returns the specified [code]feature[/code]'s human-readable name." +msgstr "" + +#: doc/classes/EditorFeatureProfile.xml:28 +msgid "" +"Returns [code]true[/code] if the class specified by [code]class_name[/code] " +"is disabled. When disabled, the class won't appear in the Create New Node " +"dialog." +msgstr "" + +#: doc/classes/EditorFeatureProfile.xml:37 +msgid "" +"Returns [code]true[/code] if editing for the class specified by " +"[code]class_name[/code] is disabled. When disabled, the class will still " +"appear in the Create New Node dialog but the inspector will be read-only " +"when selecting a node that extends the class." +msgstr "" + +#: doc/classes/EditorFeatureProfile.xml:48 +msgid "" +"Returns [code]true[/code] if [code]property[/code] is disabled in the class " +"specified by [code]class_name[/code]. When a property is disabled, it won't " +"appear in the inspector when selecting a node that extends the class " +"specified by [code]class_name[/code]." +msgstr "" + +#: doc/classes/EditorFeatureProfile.xml:57 +msgid "" +"Returns [code]true[/code] if the [code]feature[/code] is disabled. When a " +"feature is disabled, it will disappear from the editor entirely." +msgstr "" + +#: doc/classes/EditorFeatureProfile.xml:66 +msgid "" +"Loads an editor feature profile from a file. The file must follow the JSON " +"format obtained by using the feature profile manager's [b]Export[/b] button " +"or the [method save_to_file] method." +msgstr "" + +#: doc/classes/EditorFeatureProfile.xml:75 +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." +msgstr "" + +#: doc/classes/EditorFeatureProfile.xml:86 +msgid "" +"If [code]disable[/code] is [code]true[/code], disables the class specified " +"by [code]class_name[/code]. When disabled, the class won't appear in the " +"Create New Node dialog." +msgstr "" + +#: doc/classes/EditorFeatureProfile.xml:97 +msgid "" +"If [code]disable[/code] is [code]true[/code], disables editing for the class " +"specified by [code]class_name[/code]. When disabled, the class will still " +"appear in the Create New Node dialog but the inspector will be read-only " +"when selecting a node that extends the class." +msgstr "" + +#: doc/classes/EditorFeatureProfile.xml:110 +msgid "" +"If [code]disable[/code] is [code]true[/code], disables editing for " +"[code]property[/code] in the class specified by [code]class_name[/code]. " +"When a property is disabled, it won't appear in the inspector when selecting " +"a node that extends the class specified by [code]class_name[/code]." +msgstr "" + +#: doc/classes/EditorFeatureProfile.xml:121 +msgid "" +"If [code]disable[/code] is [code]true[/code], disables the editor feature " +"specified in [code]feature[/code]. When a feature is disabled, it will " +"disappear from the editor entirely." +msgstr "" + +#: doc/classes/EditorFeatureProfile.xml:127 +msgid "" +"The 3D editor. If this feature is disabled, the 3D editor won't display but " +"3D nodes will still display in the Create New Node dialog." +msgstr "" + +#: doc/classes/EditorFeatureProfile.xml:130 +msgid "" +"The Script tab, which contains the script editor and class reference " +"browser. If this feature is disabled, the Script tab won't display." +msgstr "" + +#: doc/classes/EditorFeatureProfile.xml:133 +msgid "" +"The AssetLib tab. If this feature is disabled, the AssetLib tab won't " +"display." +msgstr "" + +#: doc/classes/EditorFeatureProfile.xml:136 +msgid "" +"Scene tree editing. If this feature is disabled, the Scene tree dock will " +"still be visible but will be read-only." +msgstr "" + +#: doc/classes/EditorFeatureProfile.xml:139 +msgid "" +"The Import dock. If this feature is disabled, the Import dock won't be " +"visible." +msgstr "" + +#: doc/classes/EditorFeatureProfile.xml:142 +msgid "" +"The Node dock. If this feature is disabled, signals and groups won't be " +"visible and modifiable from the editor." +msgstr "" + +#: doc/classes/EditorFeatureProfile.xml:145 +msgid "" +"The FileSystem dock. If this feature is disabled, the FileSystem dock won't " +"be visible." +msgstr "" + +#: doc/classes/EditorFileDialog.xml:4 +msgid "A modified version of [FileDialog] used by the editor." +msgstr "" + +#: doc/classes/EditorFileDialog.xml:17 +msgid "" +"Adds a comma-delimited file extension filter option to the " +"[EditorFileDialog] with an optional semi-colon-delimited label.\n" +"For example, [code]\"*.tscn, *.scn; Scenes\"[/code] results in filter text " +"\"Scenes (*.tscn, *.scn)\"." +msgstr "" + +#: doc/classes/EditorFileDialog.xml:25 +msgid "Removes all filters except for \"All Files (*)\"." +msgstr "" + +#: doc/classes/EditorFileDialog.xml:32 +msgid "Returns the [code]VBoxContainer[/code] used to display the file system." +msgstr "" + +#: doc/classes/EditorFileDialog.xml:39 +msgid "" +"Notify the [EditorFileDialog] that its view of the data is no longer " +"accurate. Updates the view contents on next view update." +msgstr "" + +#: doc/classes/EditorFileDialog.xml:45 +msgid "" +"The location from which the user may select a file, including [code]res://[/" +"code], [code]user://[/code], and the local file system." +msgstr "" + +#: doc/classes/EditorFileDialog.xml:48 +msgid "The currently occupied directory." +msgstr "" + +#: doc/classes/EditorFileDialog.xml:51 +msgid "The currently selected file." +msgstr "" + +#: doc/classes/EditorFileDialog.xml:54 +msgid "The file system path in the address bar." +msgstr "" + +#: doc/classes/EditorFileDialog.xml:58 +msgid "" +"If [code]true[/code], the [EditorFileDialog] will not warn the user before " +"overwriting files." +msgstr "" + +#: doc/classes/EditorFileDialog.xml:61 +msgid "" +"The view format in which the [EditorFileDialog] displays resources to the " +"user." +msgstr "" + +#: doc/classes/EditorFileDialog.xml:64 +msgid "" +"The dialog's open or save mode, which affects the selection behavior. See " +"[enum FileMode]" +msgstr "" + +#: doc/classes/EditorFileDialog.xml:67 +msgid "" +"If [code]true[/code], hidden files and directories will be visible in the " +"[EditorFileDialog]." +msgstr "" + +#: doc/classes/EditorFileDialog.xml:76 +msgid "Emitted when a directory is selected." +msgstr "" + +#: doc/classes/EditorFileDialog.xml:83 +msgid "Emitted when a file is selected." +msgstr "" + +#: doc/classes/EditorFileDialog.xml:90 +msgid "Emitted when multiple files are selected." +msgstr "" + +#: doc/classes/EditorFileDialog.xml:96 +msgid "" +"The [EditorFileDialog] can select only one file. Accepting the window will " +"open the file." +msgstr "" + +#: doc/classes/EditorFileDialog.xml:99 +msgid "" +"The [EditorFileDialog] can select multiple files. Accepting the window will " +"open all files." +msgstr "" + +#: doc/classes/EditorFileDialog.xml:102 +msgid "" +"The [EditorFileDialog] can select only one directory. Accepting the window " +"will open the directory." +msgstr "" + +#: doc/classes/EditorFileDialog.xml:105 +msgid "" +"The [EditorFileDialog] can select a file or directory. Accepting the window " +"will open it." +msgstr "" + +#: doc/classes/EditorFileDialog.xml:108 +msgid "" +"The [EditorFileDialog] can select only one file. Accepting the window will " +"save the file." +msgstr "" + +#: doc/classes/EditorFileDialog.xml:111 +msgid "" +"The [EditorFileDialog] can only view [code]res://[/code] directory contents." +msgstr "" + +#: doc/classes/EditorFileDialog.xml:114 +msgid "" +"The [EditorFileDialog] can only view [code]user://[/code] directory contents." +msgstr "" + +#: doc/classes/EditorFileDialog.xml:117 +msgid "The [EditorFileDialog] can view the entire local file system." +msgstr "" + +#: doc/classes/EditorFileDialog.xml:120 +msgid "The [EditorFileDialog] displays resources as thumbnails." +msgstr "" + +#: doc/classes/EditorFileDialog.xml:123 +msgid "The [EditorFileDialog] displays resources as a list of filenames." +msgstr "" + +#: doc/classes/EditorFileSystem.xml:4 +msgid "Resource filesystem, as the editor sees it." +msgstr "" + +#: doc/classes/EditorFileSystem.xml:7 +msgid "" +"This object holds information of all resources in the filesystem, their " +"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:19 +msgid "Gets the type of the file, given the full path." +msgstr "" + +#: doc/classes/EditorFileSystem.xml:26 +msgid "Gets the root directory object." +msgstr "" + +#: doc/classes/EditorFileSystem.xml:35 +msgid "Returns a view into the filesystem at [code]path[/code]." +msgstr "" + +#: 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:49 +msgid "Returns [code]true[/code] of the filesystem is being scanned." +msgstr "" + +#: doc/classes/EditorFileSystem.xml:56 +msgid "Scan the filesystem for changes." +msgstr "" + +#: doc/classes/EditorFileSystem.xml:63 +msgid "Check if the source of any imported resource changed." +msgstr "" + +#: 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:79 +msgid "Scans the script files and updates the list of custom class names." +msgstr "" + +#: doc/classes/EditorFileSystem.xml:86 +msgid "Emitted if the filesystem changed." +msgstr "" + +#: doc/classes/EditorFileSystem.xml:93 +msgid "Remitted if a resource is reimported." +msgstr "" + +#: doc/classes/EditorFileSystem.xml:106 +msgid "Emitted if the source of any imported file changed." +msgstr "" + +#: doc/classes/EditorFileSystemDirectory.xml:4 +msgid "A directory for the resource filesystem." +msgstr "" + +#: doc/classes/EditorFileSystemDirectory.xml:7 +msgid "A more generalized, low-level variation of the directory concept." +msgstr "" + +#: doc/classes/EditorFileSystemDirectory.xml:18 +msgid "" +"Returns the index of the directory with name [code]name[/code] or [code]-1[/" +"code] if not found." +msgstr "" + +#: doc/classes/EditorFileSystemDirectory.xml:27 +msgid "" +"Returns the index of the file with name [code]name[/code] or [code]-1[/code] " +"if not found." +msgstr "" + +#: doc/classes/EditorFileSystemDirectory.xml:36 +msgid "Returns the name of the file at index [code]idx[/code]." +msgstr "" + +#: doc/classes/EditorFileSystemDirectory.xml:43 +msgid "Returns the number of files in this directory." +msgstr "" + +#: doc/classes/EditorFileSystemDirectory.xml:52 +msgid "" +"Returns [code]true[/code] if the file at index [code]idx[/code] imported " +"properly." +msgstr "" + +#: doc/classes/EditorFileSystemDirectory.xml:61 +msgid "Returns the path to the file at index [code]idx[/code]." +msgstr "" + +#: doc/classes/EditorFileSystemDirectory.xml:86 +msgid "Returns the file extension of the file at index [code]idx[/code]." +msgstr "" + +#: doc/classes/EditorFileSystemDirectory.xml:93 +msgid "Returns the name of this directory." +msgstr "" + +#: doc/classes/EditorFileSystemDirectory.xml:100 +msgid "" +"Returns the parent directory for this directory or [code]null[/code] if " +"called on a directory at [code]res://[/code] or [code]user://[/code]." +msgstr "" + +#: doc/classes/EditorFileSystemDirectory.xml:107 +msgid "Returns the path to this directory." +msgstr "" + +#: doc/classes/EditorFileSystemDirectory.xml:116 +msgid "Returns the subdirectory at index [code]idx[/code]." +msgstr "" + +#: doc/classes/EditorFileSystemDirectory.xml:123 +msgid "Returns the number of subdirectories in this directory." +msgstr "" + +#: doc/classes/EditorImportPlugin.xml:4 +msgid "" +"Registers a custom resource importer in the editor. Use the class to parse " +"any file and import it as a new resource type." +msgstr "" + +#: doc/classes/EditorImportPlugin.xml:7 +msgid "" +"EditorImportPlugins provide a way to extend the editor's resource import " +"functionality. Use them to import resources from custom files or to provide " +"alternatives to the editor's existing importers. Register your " +"[EditorPlugin] with [method EditorPlugin.add_import_plugin].\n" +"EditorImportPlugins work by associating with specific file extensions and a " +"resource type. See [method get_recognized_extensions] and [method " +"get_resource_type]. They may optionally specify some import presets that " +"affect the import process. EditorImportPlugins are responsible for creating " +"the resources and saving them in the [code].import[/code] directory.\n" +"Below is an example EditorImportPlugin that imports a [Mesh] from a file " +"with the extension \".special\" or \".spec\":\n" +"[codeblock]\n" +"tool\n" +"extends EditorImportPlugin\n" +"\n" +"func get_importer_name():\n" +" return \"my.special.plugin\"\n" +"\n" +"func get_visible_name():\n" +" return \"Special Mesh Importer\"\n" +"\n" +"func get_recognized_extensions():\n" +" return [\"special\", \"spec\"]\n" +"\n" +"func get_save_extension():\n" +" return \"mesh\"\n" +"\n" +"func get_resource_type():\n" +" return \"Mesh\"\n" +"\n" +"func get_preset_count():\n" +" return 1\n" +"\n" +"func get_preset_name(i):\n" +" return \"Default\"\n" +"\n" +"func get_import_options(i):\n" +" return [{\"name\": \"my_option\", \"default_value\": false}]\n" +"\n" +"func import(source_file, save_path, options, platform_variants, gen_files):\n" +" var file = File.new()\n" +" if file.open(source_file, File.READ) != OK:\n" +" return FAILED\n" +"\n" +" var mesh = Mesh.new()\n" +" # Fill the Mesh with data read in \"file\", left as an exercise to the " +"reader\n" +"\n" +" var filename = save_path + \".\" + get_save_extension()\n" +" ResourceSaver.save(filename, mesh)\n" +" return OK\n" +"[/codeblock]" +msgstr "" + +#: doc/classes/EditorImportPlugin.xml:52 +msgid "" +"https://docs.godotengine.org/en/latest/tutorials/plugins/editor/" +"import_plugins.html" +msgstr "" + +#: doc/classes/EditorImportPlugin.xml:61 +msgid "" +"Gets the options and default values for the preset at this index. Returns an " +"Array of Dictionaries with the following keys: [code]name[/code], " +"[code]default_value[/code], [code]property_hint[/code] (optional), " +"[code]hint_string[/code] (optional), [code]usage[/code] (optional)." +msgstr "" + +#: doc/classes/EditorImportPlugin.xml:68 +msgid "" +"Gets the order of this importer to be run when importing resources. Higher " +"values will be called later. Use this to ensure the importer runs after the " +"dependencies are already imported." +msgstr "" + +#: doc/classes/EditorImportPlugin.xml:75 +msgid "Gets the unique name of the importer." +msgstr "" + +#: doc/classes/EditorImportPlugin.xml:92 +msgid "" +"Gets the number of initial presets defined by the plugin. Use [method " +"get_import_options] to get the default options for the preset and [method " +"get_preset_name] to get the name of the preset." +msgstr "" + +#: doc/classes/EditorImportPlugin.xml:101 +msgid "Gets the name of the options preset at this index." +msgstr "" + +#: doc/classes/EditorImportPlugin.xml:108 +msgid "" +"Gets the priority of this plugin for the recognized extension. Higher " +"priority plugins will be preferred. The default priority is [code]1.0[/code]." +msgstr "" + +#: doc/classes/EditorImportPlugin.xml:115 +msgid "" +"Gets the list of file extensions to associate with this loader (case-" +"insensitive). e.g. [code][\"obj\"][/code]." +msgstr "" + +#: doc/classes/EditorImportPlugin.xml:122 +msgid "" +"Gets the Godot resource type associated with this loader. e.g. [code]\"Mesh" +"\"[/code] or [code]\"Animation\"[/code]." +msgstr "" + +#: doc/classes/EditorImportPlugin.xml:129 +msgid "" +"Gets the extension used to save this resource in the [code].import[/code] " +"directory." +msgstr "" + +#: doc/classes/EditorImportPlugin.xml:136 +msgid "Gets the name to display in the import window." +msgstr "" + +#: doc/classes/EditorInspector.xml:4 +msgid "A tab used to edit properties of the selected node." +msgstr "" + +#: doc/classes/EditorInspector.xml:7 +msgid "" +"The editor inspector is by default located on the right-hand side of the " +"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.\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 +msgid "Plugin for adding custom property editors on inspector." +msgstr "" + +#: doc/classes/EditorInspectorPlugin.xml:7 +msgid "" +"This plugins allows adding custom property editors to [EditorInspector].\n" +"Plugins are registered via [method EditorPlugin.add_inspector_plugin].\n" +"When an object is edited, the [method can_handle] function is called and " +"must return [code]true[/code] if the object type is supported.\n" +"If supported, the function [method parse_begin] will be called, allowing to " +"place custom controls at the beginning of the class.\n" +"Subsequently, the [method parse_category] and [method parse_property] are " +"called for every category and property. They offer the ability to add custom " +"controls to the inspector too.\n" +"Finally [method parse_end] will be called.\n" +"On each of these calls, the \"add\" functions can be called." +msgstr "" + +#: doc/classes/EditorInspectorPlugin.xml:24 +msgid "Adds a custom control, not necessarily a property editor." +msgstr "" + +#: doc/classes/EditorInspectorPlugin.xml:35 +msgid "Adds a property editor, this must inherit [EditorProperty]." +msgstr "" + +#: doc/classes/EditorInspectorPlugin.xml:48 +msgid "" +"Adds an editor that allows modifying multiple properties, this must inherit " +"[EditorProperty]." +msgstr "" + +#: doc/classes/EditorInspectorPlugin.xml:57 +msgid "Returns [code]true[/code] if this object can be handled by this plugin." +msgstr "" + +#: doc/classes/EditorInspectorPlugin.xml:66 +msgid "Called to allow adding controls at the beginning of the list." +msgstr "" + +#: doc/classes/EditorInspectorPlugin.xml:77 +msgid "Called to allow adding controls at the beginning of the category." +msgstr "" + +#: doc/classes/EditorInspectorPlugin.xml:84 +msgid "Called to allow adding controls at the end of the list." +msgstr "" + +#: doc/classes/EditorInspectorPlugin.xml:103 +msgid "" +"Called to allow adding property specific editors to the inspector. Usually " +"these inherit [EditorProperty]. Returning [code]true[/code] removes the " +"built-in editor for this property, otherwise allows to insert a custom " +"editor before the built-in one." +msgstr "" + +#: doc/classes/EditorInterface.xml:4 +msgid "Godot editor's interface." +msgstr "" + +#: doc/classes/EditorInterface.xml:7 +msgid "" +"EditorInterface gives you control over Godot editor's window. It allows " +"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.\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:19 +msgid "Edits the given [Resource]." +msgstr "" + +#: 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:39 +msgid "Returns the edited (current) scene's root [Node]." +msgstr "" + +#: doc/classes/EditorInterface.xml:46 +msgid "Returns the [EditorSettings]." +msgstr "" + +#: doc/classes/EditorInterface.xml:53 +msgid "Returns the editor [Viewport]." +msgstr "" + +#: doc/classes/EditorInterface.xml:72 +msgid "Returns an [Array] with the file paths of the currently opened scenes." +msgstr "" + +#: doc/classes/EditorInterface.xml:79 +msgid "Returns the [EditorFileSystem]." +msgstr "" + +#: doc/classes/EditorInterface.xml:86 +msgid "Returns the [EditorResourcePreview]." +msgstr "" + +#: doc/classes/EditorInterface.xml:93 +msgid "Returns the [ScriptEditor]." +msgstr "" + +#: doc/classes/EditorInterface.xml:106 +msgid "Returns the [EditorSelection]." +msgstr "" + +#: 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:126 +msgid "" +"Returns the enabled status of a plugin. The plugin name is the same as its " +"directory name." +msgstr "" + +#: 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:146 +msgid "Opens the scene at the given path." +msgstr "" + +#: doc/classes/EditorInterface.xml:155 +msgid "Reloads the scene at the given path." +msgstr "" + +#: 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:173 +msgid "Saves the scene as a file at [code]path[/code]." +msgstr "" + +#: 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:209 +msgid "" +"Sets the enabled status of a plugin. The plugin name is the same as its " +"directory name." +msgstr "" + +#: doc/classes/EditorNode3DGizmo.xml:4 +msgid "Custom gizmo for editing Node3D objects." +msgstr "" + +#: doc/classes/EditorNode3DGizmo.xml:7 +msgid "" +"Custom gizmo that is used for providing custom visualization and editing " +"(handles) for Node3D objects. See [EditorNode3DGizmoPlugin] for more " +"information." +msgstr "" + +#: doc/classes/EditorNode3DGizmo.xml:26 +msgid "" +"Adds collision triangles to the gizmo for picking. A [TriangleMesh] can be " +"generated from a regular [Mesh] too. Call this function during [method " +"redraw]." +msgstr "" + +#: doc/classes/EditorNode3DGizmo.xml:41 +msgid "" +"Adds a list of handles (points) which can be used to deform the object being " +"edited.\n" +"There are virtual functions which will be called upon editing of these " +"handles. Call this function during [method redraw]." +msgstr "" + +#: doc/classes/EditorNode3DGizmo.xml:57 +msgid "" +"Adds lines to the gizmo (as sets of 2 points), with a given material. The " +"lines are used for visualizing the gizmo. Call this function during [method " +"redraw]." +msgstr "" + +#: doc/classes/EditorNode3DGizmo.xml:84 +msgid "" +"Adds an unscaled billboard for visualization. Call this function during " +"[method redraw]." +msgstr "" + +#: doc/classes/EditorNode3DGizmo.xml:103 +msgid "" +"Commit a handle being edited (handles must have been previously added by " +"[method add_handles]).\n" +"If the [code]cancel[/code] parameter is [code]true[/code], an option to " +"restore the edited value to the original is provided." +msgstr "" + +#: doc/classes/EditorNode3DGizmo.xml:113 +msgid "" +"Gets the name of an edited handle (handles must have been previously added " +"by [method add_handles]).\n" +"Handles can be named for reference to the user when editing." +msgstr "" + +#: doc/classes/EditorNode3DGizmo.xml:123 +msgid "" +"Gets actual value of a handle. This value can be anything and used for " +"eventually undoing the motion when calling [method commit_handle]." +msgstr "" + +#: doc/classes/EditorNode3DGizmo.xml:130 +msgid "" +"Returns the [EditorNode3DGizmoPlugin] that owns this gizmo. It's useful to " +"retrieve materials using [method EditorNode3DGizmoPlugin.get_material]." +msgstr "" + +#: doc/classes/EditorNode3DGizmo.xml:137 +msgid "Returns the Node3D node associated with this gizmo." +msgstr "" + +#: doc/classes/EditorNode3DGizmo.xml:146 +msgid "Gets whether a handle is highlighted or not." +msgstr "" + +#: doc/classes/EditorNode3DGizmo.xml:153 +msgid "" +"This function is called when the Node3D this gizmo refers to changes (the " +"[method Node3D.update_gizmo] is called)." +msgstr "" + +#: doc/classes/EditorNode3DGizmo.xml:166 +msgid "" +"This function is used when the user drags a gizmo handle (previously added " +"with [method add_handles]) in screen coordinates.\n" +"The [Camera3D] is also provided so screen coordinates can be converted to " +"raycasts." +msgstr "" + +#: doc/classes/EditorNode3DGizmoPlugin.xml:4 +msgid "Used by the editor to define Node3D gizmo types." +msgstr "" + +#: doc/classes/EditorNode3DGizmoPlugin.xml:7 +msgid "" +"EditorNode3DGizmoPlugin allows you to define a new type of Gizmo. There are " +"two main ways to do so: extending [EditorNode3DGizmoPlugin] for the simpler " +"gizmos, or creating a new [EditorNode3DGizmo] type. See the tutorial in the " +"documentation for more info." +msgstr "" + +#: doc/classes/EditorNode3DGizmoPlugin.xml:10 +msgid "" +"https://docs.godotengine.org/en/latest/tutorials/plugins/editor/" +"spatial_gizmos.html" +msgstr "" + +#: doc/classes/EditorNode3DGizmoPlugin.xml:21 +msgid "" +"Adds a new material to the internal material list for the plugin. It can " +"then be accessed with [method get_material]. Should not be overridden." +msgstr "" + +#: doc/classes/EditorNode3DGizmoPlugin.xml:28 +msgid "" +"Override this method to define whether the gizmo can be hidden or not. " +"Returns [code]true[/code] if not overridden." +msgstr "" + +#: doc/classes/EditorNode3DGizmoPlugin.xml:43 +msgid "" +"Override this method to commit gizmo handles. Called for this plugin's " +"active gizmos." +msgstr "" + +#: doc/classes/EditorNode3DGizmoPlugin.xml:52 +msgid "" +"Override this method to return a custom [EditorNode3DGizmo] for the spatial " +"nodes of your choice, return [code]null[/code] for the rest of nodes. See " +"also [method has_gizmo]." +msgstr "" + +#: doc/classes/EditorNode3DGizmoPlugin.xml:63 +msgid "" +"Creates a handle material with its variants (selected and/or editable) and " +"adds them to the internal material list. They can then be accessed with " +"[method get_material] and used in [method EditorNode3DGizmo.add_handles]. " +"Should not be overridden." +msgstr "" + +#: doc/classes/EditorNode3DGizmoPlugin.xml:78 +msgid "" +"Creates an icon material with its variants (selected and/or editable) and " +"adds them to the internal material list. They can then be accessed with " +"[method get_material] and used in [method EditorNode3DGizmo." +"add_unscaled_billboard]. Should not be overridden." +msgstr "" + +#: doc/classes/EditorNode3DGizmoPlugin.xml:95 +msgid "" +"Creates an unshaded material with its variants (selected and/or editable) " +"and adds them to the internal material list. They can then be accessed with " +"[method get_material] and used in [method EditorNode3DGizmo.add_mesh] and " +"[method EditorNode3DGizmo.add_lines]. Should not be overridden." +msgstr "" + +#: doc/classes/EditorNode3DGizmoPlugin.xml:106 +msgid "" +"Override this method to provide gizmo's handle names. Called for this " +"plugin's active gizmos." +msgstr "" + +#: doc/classes/EditorNode3DGizmoPlugin.xml:117 +msgid "" +"Gets actual value of a handle from gizmo. Called for this plugin's active " +"gizmos." +msgstr "" + +#: doc/classes/EditorNode3DGizmoPlugin.xml:128 +msgid "" +"Gets material from the internal list of materials. If an [EditorNode3DGizmo] " +"is provided, it will try to get the corresponding variant (selected and/or " +"editable)." +msgstr "" + +#: doc/classes/EditorNode3DGizmoPlugin.xml:135 +msgid "" +"Override this method to provide the name that will appear in the gizmo " +"visibility menu." +msgstr "" + +#: doc/classes/EditorNode3DGizmoPlugin.xml:150 +msgid "" +"Override this method to define which Node3D nodes have a gizmo from this " +"plugin. Whenever a [Node3D] node is added to a scene this method is called, " +"if it returns [code]true[/code] the node gets a generic [EditorNode3DGizmo] " +"assigned and is added to this plugin's list of active gizmos." +msgstr "" + +#: doc/classes/EditorNode3DGizmoPlugin.xml:161 +msgid "" +"Gets whether a handle is highlighted or not. Called for this plugin's active " +"gizmos." +msgstr "" + +#: doc/classes/EditorNode3DGizmoPlugin.xml:168 +msgid "" +"Override this method to define whether Node3D with this gizmo should be " +"selecteble even when the gizmo is hidden." +msgstr "" + +#: doc/classes/EditorNode3DGizmoPlugin.xml:177 +msgid "" +"Callback to redraw the provided gizmo. Called for this plugin's active " +"gizmos." +msgstr "" + +#: doc/classes/EditorNode3DGizmoPlugin.xml:192 +msgid "" +"Update the value of a handle after it has been updated. Called for this " +"plugin's active gizmos." +msgstr "" + +#: doc/classes/EditorPlugin.xml:4 +msgid "Used by the editor to extend its functionality." +msgstr "" + +#: doc/classes/EditorPlugin.xml:7 +msgid "" +"Plugins are used by the editor to extend functionality. The most common " +"types of plugins are those which edit a given node or resource type, import " +"plugins and export plugins. See also [EditorScript] to add functions to the " +"editor." +msgstr "" + +#: doc/classes/EditorPlugin.xml:10 +msgid "" +"https://docs.godotengine.org/en/latest/tutorials/plugins/editor/index.html" +msgstr "" + +#: doc/classes/EditorPlugin.xml:21 +msgid "" +"Adds a script at [code]path[/code] to the Autoload list as [code]name[/code]." +msgstr "" + +#: doc/classes/EditorPlugin.xml:32 +msgid "" +"Adds a control to the bottom panel (together with Output, Debug, Animation, " +"etc). Returns a reference to the button added. It's up to you to hide/show " +"the button when needed. When your plugin is deactivated, make sure to remove " +"your custom control with [method remove_control_from_bottom_panel] and free " +"it with [method Node.queue_free]." +msgstr "" + +#: doc/classes/EditorPlugin.xml:43 +msgid "" +"Adds a custom control to a container (see [enum CustomControlContainer]). " +"There are many locations where custom controls can be added in the editor " +"UI.\n" +"Please remember that you have to manage the visibility of your custom " +"controls yourself (and likely hide it after adding it).\n" +"When your plugin is deactivated, make sure to remove your custom control " +"with [method remove_control_from_container] and free it with [method Node." +"queue_free]." +msgstr "" + +#: doc/classes/EditorPlugin.xml:56 +msgid "" +"Adds the control to a specific dock slot (see [enum DockSlot] for options).\n" +"If the dock is repositioned and as long as the plugin is active, the editor " +"will save the dock position on further sessions.\n" +"When your plugin is deactivated, make sure to remove your custom control " +"with [method remove_control_from_docks] and free it with [method Node." +"queue_free]." +msgstr "" + +#: doc/classes/EditorPlugin.xml:73 +msgid "" +"Adds a custom type, which will appear in the list of nodes or resources. An " +"icon can be optionally passed.\n" +"When given node or resource is selected, the base type will be instanced (e." +"g. \"Node3D\", \"Control\", \"Resource\"), then the script will be loaded " +"and set to this object.\n" +"You can use the virtual method [method handles] to check if your custom " +"object is being edited by checking the script or using the [code]is[/code] " +"keyword.\n" +"During run-time, this will be a simple object with a script so this function " +"does not need to be called then." +msgstr "" + +#: doc/classes/EditorPlugin.xml:131 +msgid "" +"Adds a custom menu item to [b]Project > Tools[/b] as [code]name[/code] that " +"calls [code]callback[/code] on an instance of [code]handler[/code] with a " +"parameter [code]ud[/code] when user activates it." +msgstr "" + +#: doc/classes/EditorPlugin.xml:142 +msgid "" +"Adds a custom submenu under [b]Project > Tools >[/b] [code]name[/code]. " +"[code]submenu[/code] should be an object of class [PopupMenu]. This submenu " +"should be cleaned up using [code]remove_tool_menu_item(name)[/code]." +msgstr "" + +#: doc/classes/EditorPlugin.xml:149 +msgid "" +"This method is called when the editor is about to save the project, switch " +"to another tab, etc. It asks the plugin to apply any pending state changes " +"to ensure consistency.\n" +"This is used, for example, in shader editors to let the plugin know that it " +"must apply the shader code being written by the user to the object." +msgstr "" + +#: doc/classes/EditorPlugin.xml:163 +msgid "" +"Clear all the state and reset the object being edited to zero. This ensures " +"your plugin does not keep editing a currently existing node, or a node from " +"the wrong scene." +msgstr "" + +#: doc/classes/EditorPlugin.xml:170 +msgid "" +"Called by the engine when the user disables the [EditorPlugin] in the Plugin " +"tab of the project settings window." +msgstr "" + +#: doc/classes/EditorPlugin.xml:179 +msgid "" +"This function is used for plugins that edit specific object types (nodes or " +"resources). It requests the editor to edit the given object." +msgstr "" + +#: doc/classes/EditorPlugin.xml:186 +msgid "" +"Called by the engine when the user enables the [EditorPlugin] in the Plugin " +"tab of the project settings window." +msgstr "" + +#: doc/classes/EditorPlugin.xml:211 +msgid "" +"Called when there is a root node in the current edited scene, [method " +"handles] is implemented and an [InputEvent] happens in the 2D viewport. " +"Intercepts the [InputEvent], if [code]return true[/code] [EditorPlugin] " +"consumes the [code]event[/code], otherwise forwards [code]event[/code] to " +"other Editor classes. Example:\n" +"[codeblock]\n" +"# Prevents the InputEvent to reach other Editor classes\n" +"func forward_canvas_gui_input(event):\n" +" var forward = true\n" +" return forward\n" +"[/codeblock]\n" +"Must [code]return false[/code] in order to forward the [InputEvent] to other " +"Editor classes. Example:\n" +"[codeblock]\n" +"# Consumes InputEventMouseMotion and forwards other InputEvent types\n" +"func forward_canvas_gui_input(event):\n" +" var forward = false\n" +" if event is InputEventMouseMotion:\n" +" forward = true\n" +" return forward\n" +"[/codeblock]" +msgstr "" + +#: doc/classes/EditorPlugin.xml:237 +msgid "" +"Called when there is a root node in the current edited scene, [method " +"handles] is implemented and an [InputEvent] happens in the 3D viewport. " +"Intercepts the [InputEvent], if [code]return true[/code] [EditorPlugin] " +"consumes the [code]event[/code], otherwise forwards [code]event[/code] to " +"other Editor classes. Example:\n" +"[codeblock]\n" +"# Prevents the InputEvent to reach other Editor classes\n" +"func forward_spatial_gui_input(camera, event):\n" +" var forward = true\n" +" return forward\n" +"[/codeblock]\n" +"Must [code]return false[/code] in order to forward the [InputEvent] to other " +"Editor classes. Example:\n" +"[codeblock]\n" +"# Consumes InputEventMouseMotion and forwards other InputEvent types\n" +"func forward_spatial_gui_input(camera, event):\n" +" var forward = false\n" +" if event is InputEventMouseMotion:\n" +" forward = true\n" +" return forward\n" +"[/codeblock]" +msgstr "" + +#: doc/classes/EditorPlugin.xml:259 +msgid "" +"This is for editors that edit script-based objects. You can return a list of " +"breakpoints in the format ([code]script:line[/code]), for example: " +"[code]res://path_to_script.gd:25[/code]." +msgstr "" + +#: doc/classes/EditorPlugin.xml:266 +msgid "" +"Returns the [EditorInterface] object that gives you control over Godot " +"editor's window and its functionalities." +msgstr "" + +#: doc/classes/EditorPlugin.xml:273 +msgid "" +"Override this method in your plugin to return a [Texture2D] in order to give " +"it an icon.\n" +"For main screen plugins, this appears at the top of the screen, to the right " +"of the \"2D\", \"3D\", \"Script\", and \"AssetLib\" buttons.\n" +"Ideally, the plugin icon should be white with a transparent background and " +"16x16 pixels in size.\n" +"[codeblock]\n" +"func get_plugin_icon():\n" +" # You can use a custom icon:\n" +" return preload(\"res://addons/my_plugin/my_plugin_icon.svg\")\n" +" # Or use a built-in icon:\n" +" return get_editor_interface().get_base_control().get_icon(\"Node\", " +"\"EditorIcons\")\n" +"[/codeblock]" +msgstr "" + +#: doc/classes/EditorPlugin.xml:289 +msgid "" +"Override this method in your plugin to provide the name of the plugin when " +"displayed in the Godot editor.\n" +"For main screen plugins, this appears at the top of the screen, to the right " +"of the \"2D\", \"3D\", \"Script\", and \"AssetLib\" buttons." +msgstr "" + +#: doc/classes/EditorPlugin.xml:297 +msgid "" +"Gets the Editor's dialogue used for making scripts.\n" +"[b]Note:[/b] Users can configure it before use." +msgstr "" + +#: doc/classes/EditorPlugin.xml:305 +msgid "" +"Gets the state of your plugin editor. This is used when saving the scene (so " +"state is kept when opening it again) and for switching tabs (so state can be " +"restored when the tab returns)." +msgstr "" + +#: doc/classes/EditorPlugin.xml:312 +msgid "" +"Gets the undo/redo object. Most actions in the editor can be undoable, so " +"use this object to make sure this happens when it's worth it." +msgstr "" + +#: doc/classes/EditorPlugin.xml:321 +msgid "" +"Gets the GUI layout of the plugin. This is used to save the project's editor " +"layout when [method queue_save_layout] is called or the editor layout was " +"changed(For example changing the position of a dock)." +msgstr "" + +#: doc/classes/EditorPlugin.xml:330 +msgid "" +"Implement this function if your plugin edits a specific type of object " +"(Resource or Node). If you return [code]true[/code], then you will get the " +"functions [method edit] and [method make_visible] called when the editor " +"requests them. If you have declared the methods [method " +"forward_canvas_gui_input] and [method forward_spatial_gui_input] these will " +"be called too." +msgstr "" + +#: doc/classes/EditorPlugin.xml:337 +msgid "" +"Returns [code]true[/code] if this is a main screen editor plugin (it goes in " +"the workspace selector together with [b]2D[/b], [b]3D[/b], [b]Script[/b] and " +"[b]AssetLib[/b])." +msgstr "" + +#: doc/classes/EditorPlugin.xml:360 +msgid "" +"This function will be called when the editor is requested to become visible. " +"It is used for plugins that edit a specific object type.\n" +"Remember that you have to manage the visibility of all your editor controls " +"manually." +msgstr "" + +#: doc/classes/EditorPlugin.xml:368 +msgid "Queue save the project's editor layout." +msgstr "" + +#: doc/classes/EditorPlugin.xml:377 +msgid "Removes an Autoload [code]name[/code] from the list." +msgstr "" + +#: doc/classes/EditorPlugin.xml:386 +msgid "" +"Removes the control from the bottom panel. You have to manually [method Node." +"queue_free] the control." +msgstr "" + +#: doc/classes/EditorPlugin.xml:397 +msgid "" +"Removes the control from the specified container. You have to manually " +"[method Node.queue_free] the control." +msgstr "" + +#: doc/classes/EditorPlugin.xml:406 +msgid "" +"Removes the control from the dock. You have to manually [method Node." +"queue_free] the control." +msgstr "" + +#: doc/classes/EditorPlugin.xml:415 +msgid "Removes a custom type added by [method add_custom_type]." +msgstr "" + +#: doc/classes/EditorPlugin.xml:464 +msgid "Removes a menu [code]name[/code] from [b]Project > Tools[/b]." +msgstr "" + +#: doc/classes/EditorPlugin.xml:471 +msgid "" +"This method is called after the editor saves the project or when it's " +"closed. It asks the plugin to save edited external scenes/resources." +msgstr "" + +#: doc/classes/EditorPlugin.xml:484 +msgid "" +"Use this method if you always want to receive inputs from 3D view screen " +"inside [method forward_spatial_gui_input]. It might be especially usable if " +"your plugin will want to use raycast in the scene." +msgstr "" + +#: doc/classes/EditorPlugin.xml:493 +msgid "Restore the state saved by [method get_state]." +msgstr "" + +#: doc/classes/EditorPlugin.xml:502 +msgid "Restore the plugin GUI layout saved by [method get_window_layout]." +msgstr "" + +#: doc/classes/EditorPlugin.xml:509 +msgid "Updates the overlays of the editor (2D/3D) viewport." +msgstr "" + +#: doc/classes/EditorPlugin.xml:518 +msgid "" +"Emitted when user changes the workspace ([b]2D[/b], [b]3D[/b], [b]Script[/" +"b], [b]AssetLib[/b]). Also works with custom screens defined by plugins." +msgstr "" + +#: doc/classes/EditorPlugin.xml:531 +msgid "" +"Emitted when the scene is changed in the editor. The argument will return " +"the root node of the scene that has just become active. If this scene is new " +"and empty, the argument will be [code]null[/code]." +msgstr "" + +#: doc/classes/EditorPlugin.xml:538 +msgid "" +"Emitted when user closes a scene. The argument is file path to a closed " +"scene." +msgstr "" + +#: doc/classes/EditorPlugin.xml:584 +msgid "Represents the size of the [enum DockSlot] enum." +msgstr "" + +#: doc/classes/EditorProperty.xml:4 +msgid "Custom control to edit properties for adding into the inspector." +msgstr "" + +#: doc/classes/EditorProperty.xml:7 +msgid "" +"This control allows property editing for one or multiple properties into " +"[EditorInspector]. It is added via [EditorInspectorPlugin]." +msgstr "" + +#: doc/classes/EditorProperty.xml:18 +msgid "" +"If any of the controls added can gain keyboard focus, add it here. This " +"ensures that focus will be restored if the inspector is refreshed." +msgstr "" + +#: doc/classes/EditorProperty.xml:33 +msgid "" +"If one or several properties have changed, this must be called. [code]field[/" +"code] is used in case your editor can modify fields separately (as an " +"example, Vector3.x). The [code]changing[/code] argument avoids the editor " +"requesting this property to be refreshed (leave as [code]false[/code] if " +"unsure)." +msgstr "" + +#: doc/classes/EditorProperty.xml:40 +msgid "Gets the edited object." +msgstr "" + +#: doc/classes/EditorProperty.xml:47 +msgid "" +"Gets the edited property. If your editor is for a single property (added via " +"[method EditorInspectorPlugin.parse_property]), then this will return the " +"property." +msgstr "" + +#: doc/classes/EditorProperty.xml:54 +msgid "Override if you want to allow a custom tooltip over your property." +msgstr "" + +#: doc/classes/EditorProperty.xml:63 +msgid "" +"Adds controls with this function if you want them on the bottom (below the " +"label)." +msgstr "" + +#: doc/classes/EditorProperty.xml:70 +msgid "When this virtual function is called, you must update your editor." +msgstr "" + +#: doc/classes/EditorProperty.xml:76 +msgid "Used by the inspector, set when property is checkable." +msgstr "" + +#: doc/classes/EditorProperty.xml:79 +msgid "Used by the inspector, when the property is checked." +msgstr "" + +#: doc/classes/EditorProperty.xml:84 +msgid "Used by the inspector, when the property must draw with error color." +msgstr "" + +#: doc/classes/EditorProperty.xml:87 +msgid "Used by the inspector, when the property can add keys for animation." +msgstr "" + +#: doc/classes/EditorProperty.xml:90 +msgid "Sets this property to change the label (if you want to show one)." +msgstr "" + +#: doc/classes/EditorProperty.xml:93 +msgid "Used by the inspector, when the property is read-only." +msgstr "" + +#: 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:112 +msgid "Used by sub-inspectors. Emit it if what was selected was an Object ID." +msgstr "" + +#: doc/classes/EditorProperty.xml:121 +msgid "" +"Do not emit this manually, use the [method emit_changed] method instead." +msgstr "" + +#: doc/classes/EditorProperty.xml:130 +msgid "Emitted when a property was checked. Used internally." +msgstr "" + +#: 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:152 +msgid "Emit it if you want to key a property with a single value." +msgstr "" + +#: 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:170 +msgid "Emitted when selected. Used internally." +msgstr "" + +#: doc/classes/EditorResourcePreview.xml:4 +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.\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:19 +msgid "Create an own, custom preview generator." +msgstr "" + +#: 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: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 " +"containing the preview texture or an empty texture (if no preview was " +"possible). Callback must have the format: (path,texture,userdata). Userdata " +"can be anything." +msgstr "" + +#: 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 " +"texture or an empty texture (if no preview was possible). Callback must have " +"the format: (path,texture,userdata). Userdata can be anything." +msgstr "" + +#: doc/classes/EditorResourcePreview.xml:67 +msgid "Removes a custom preview generator." +msgstr "" + +#: doc/classes/EditorResourcePreview.xml:76 +msgid "" +"Emitted if a preview was invalidated (changed). [code]path[/code] " +"corresponds to the path of the preview." +msgstr "" + +#: doc/classes/EditorResourcePreviewGenerator.xml:4 +msgid "Custom generator of previews." +msgstr "" + +#: doc/classes/EditorResourcePreviewGenerator.xml:7 +msgid "" +"Custom code to generate previews. Please check [code]file_dialog/" +"thumbnail_size[/code] in [EditorSettings] to find out the right size to do " +"previews at." +msgstr "" + +#: doc/classes/EditorResourcePreviewGenerator.xml:16 +msgid "" +"If this function returns [code]true[/code], the generator will call [method " +"generate] or [method generate_from_path] for small previews as well.\n" +"By default, it returns [code]false[/code]." +msgstr "" + +#: doc/classes/EditorResourcePreviewGenerator.xml:28 +msgid "" +"Generate a preview from a given resource with the specified size. This must " +"always be implemented.\n" +"Returning an empty texture is an OK way to fail and let another generator " +"take care.\n" +"Care must be taken because this function is always called from a thread (not " +"the main thread)." +msgstr "" + +#: doc/classes/EditorResourcePreviewGenerator.xml:41 +msgid "" +"Generate a preview directly from a path with the specified size. " +"Implementing this is optional, as default code will load and call [method " +"generate].\n" +"Returning an empty texture is an OK way to fail and let another generator " +"take care.\n" +"Care must be taken because this function is always called from a thread (not " +"the main thread)." +msgstr "" + +#: doc/classes/EditorResourcePreviewGenerator.xml:50 +msgid "" +"If this function returns [code]true[/code], the generator will automatically " +"generate the small previews from the normal preview texture generated by the " +"methods [method generate] or [method generate_from_path].\n" +"By default, it returns [code]false[/code]." +msgstr "" + +#: doc/classes/EditorResourcePreviewGenerator.xml:60 +msgid "" +"Returns [code]true[/code] if your generator supports the resource of type " +"[code]type[/code]." +msgstr "" + +#: doc/classes/EditorSceneImporter.xml:4 +msgid "Imports scenes from third-parties' 3D files." +msgstr "" + +#: doc/classes/EditorSceneImporterAssimp.xml:4 +msgid "FBX 3D asset importer based on [url=http://assimp.org/]Assimp[/url]." +msgstr "" + +#: doc/classes/EditorSceneImporterAssimp.xml:7 +msgid "" +"This is an FBX 3D asset importer based on [url=http://assimp.org/]Assimp[/" +"url]. It currently has many known limitations and works best with static " +"meshes. Most animated meshes won't import correctly.\n" +"If exporting a FBX scene from Autodesk Maya, use these FBX export settings:\n" +"[codeblock]\n" +"- Smoothing Groups\n" +"- Smooth Mesh\n" +"- Triangluate (for meshes with blend shapes)\n" +"- Bake Animation\n" +"- Resample All\n" +"- Deformed Models\n" +"- Skins\n" +"- Blend Shapes\n" +"- Curve Filters\n" +"- Constant Key Reducer\n" +"- Auto Tangents Only\n" +"- *Do not check* Constraints (as it will break the file)\n" +"- Can check Embed Media (embeds textures into the exported FBX file)\n" +" - Note that when importing embedded media, the texture and mesh will be a " +"single immutable file.\n" +" - You will have to re-export then re-import the FBX if the texture has " +"changed.\n" +"- Units: Centimeters\n" +"- Up Axis: Y\n" +"- Binary format in FBX 2017\n" +"[/codeblock]" +msgstr "" + +#: doc/classes/EditorScenePostImport.xml:4 +msgid "Post-processes scenes after import." +msgstr "" + +#: doc/classes/EditorScenePostImport.xml:7 +msgid "" +"Imported scenes can be automatically modified right after import by setting " +"their [b]Custom Script[/b] Import property to a [code]tool[/code] script " +"that inherits from this class.\n" +"The [method post_import] callback receives the imported scene's root node " +"and returns the modified version of the scene. Usage example:\n" +"[codeblock]\n" +"tool # Needed so it runs in editor\n" +"extends EditorScenePostImport\n" +"\n" +"# This sample changes all node names\n" +"\n" +"# Called right after the scene is imported and gets the root node\n" +"func post_import(scene):\n" +" # Change all node names to \"modified_[oldnodename]\"\n" +" iterate(scene)\n" +" return scene # Remember to return the imported scene\n" +"\n" +"func iterate(node):\n" +" if node != null:\n" +" node.name = \"modified_\" + node.name\n" +" for child in node.get_children():\n" +" iterate(child)\n" +"[/codeblock]" +msgstr "" + +#: doc/classes/EditorScenePostImport.xml:29 +msgid "" +"https://docs.godotengine.org/en/latest/getting_started/workflow/assets/" +"importing_scenes.html#custom-script" +msgstr "" + +#: doc/classes/EditorScenePostImport.xml:36 +msgid "" +"Returns the source file path which got imported (e.g. [code]res://scene.dae[/" +"code])." +msgstr "" + +#: doc/classes/EditorScenePostImport.xml:43 +msgid "Returns the resource folder the imported scene file is located in." +msgstr "" + +#: doc/classes/EditorScenePostImport.xml:52 +msgid "" +"Called after the scene was imported. This method must return the modified " +"version of the scene." +msgstr "" + +#: doc/classes/EditorScript.xml:4 +msgid "Base script that can be used to add extension functions to the editor." +msgstr "" + +#: doc/classes/EditorScript.xml:7 +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 [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" +"[b]Example script:[/b]\n" +"[codeblock]\n" +"tool\n" +"extends EditorScript\n" +"\n" +"func _run():\n" +" print(\"Hello from the Godot Editor!\")\n" +"[/codeblock]\n" +"[b]Note:[/b] The script is run in the Editor context, which means the output " +"is visible in the console window started with the Editor (stdout) instead of " +"the usual Godot [b]Output[/b] dock." +msgstr "" + +#: doc/classes/EditorScript.xml:26 +msgid "This method is executed by the Editor when [b]File > Run[/b] is used." +msgstr "" + +#: doc/classes/EditorScript.xml:35 +msgid "" +"Adds [code]node[/code] as a child of the root node in the editor context.\n" +"[b]Warning:[/b] The implementation of this method is currently disabled." +msgstr "" + +#: doc/classes/EditorScript.xml:43 +msgid "Returns the [EditorInterface] singleton instance." +msgstr "" + +#: doc/classes/EditorScript.xml:50 +msgid "Returns the Editor's currently active scene." +msgstr "" + +#: doc/classes/EditorSelection.xml:4 +msgid "Manages the SceneTree selection in the editor." +msgstr "" + +#: doc/classes/EditorSelection.xml:7 +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:19 +msgid "Adds a node to the selection." +msgstr "" + +#: doc/classes/EditorSelection.xml:26 +msgid "Clear the selection." +msgstr "" + +#: doc/classes/EditorSelection.xml:33 +msgid "Gets the list of selected nodes." +msgstr "" + +#: 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:49 +msgid "Removes a node from the selection." +msgstr "" + +#: doc/classes/EditorSelection.xml:56 +msgid "Emitted when the selection changes." +msgstr "" + +#: doc/classes/EditorSettings.xml:4 +msgid "Object that holds the project-independent editor settings." +msgstr "" + +#: doc/classes/EditorSettings.xml:7 +msgid "" +"Object that holds the project-independent editor settings. These settings " +"are generally visible in the [b]Editor > Editor Settings[/b] menu.\n" +"Accessing the settings is done by using the regular [Object] API, such as:\n" +"[codeblock]\n" +"settings.set(prop,value)\n" +"settings.get(prop)\n" +"list_of_settings = settings.get_property_list()\n" +"[/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: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" +"- [code]type[/code]: [int] (see [enum Variant.Type])\n" +"- optionally [code]hint[/code]: [int] (see [enum PropertyHint]) and " +"[code]hint_string[/code]: [String]\n" +"[b]Example:[/b]\n" +"[codeblock]\n" +"editor_settings.set(\"category/property_name\", 0)\n" +"\n" +"var property_info = {\n" +" \"name\": \"category/property_name\",\n" +" \"type\": TYPE_INT,\n" +" \"hint\": PROPERTY_HINT_ENUM,\n" +" \"hint_string\": \"one,two,three\"\n" +"}\n" +"\n" +"editor_settings.add_property_info(property_info)\n" +"[/codeblock]" +msgstr "" + +#: doc/classes/EditorSettings.xml:50 +msgid "Erase a given setting (pass full property path)." +msgstr "" + +#: doc/classes/EditorSettings.xml:57 +msgid "Gets the list of favorite files and directories for this project." +msgstr "" + +#: 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:83 +msgid "" +"Gets the list of recently visited folders in the file dialog for this " +"project." +msgstr "" + +#: 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" +"[code]settings/tmp[/code] - Used for temporary storage of files\n" +"[code]settings/templates[/code] - Where export templates are located" +msgstr "" + +#: doc/classes/EditorSettings.xml:133 +msgid "Sets the list of favorite files and directories for this project." +msgstr "" + +#: 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:183 +msgid "Emitted when editor settings change." +msgstr "" + +#: 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." +msgstr "" + +#: doc/classes/EditorVCSInterface.xml:4 +msgid "" +"Version Control System (VCS) interface which reads and writes to the local " +"VCS in use." +msgstr "" + +#: doc/classes/EditorVCSInterface.xml:7 +msgid "" +"Used by the editor to display VCS extracted information in the editor. The " +"implementation of this API is included in VCS addons, which are essentially " +"GDNative plugins that need to be put into the project folder. These VCS " +"addons are scripts which are attached (on demand) to the object instance of " +"[code]EditorVCSInterface[/code]. All the functions listed below, instead of " +"performing the task themselves, they call the internally defined functions " +"in the VCS addons to provide a plug-n-play experience." +msgstr "" + +#: doc/classes/EditorVCSInterface.xml:18 +msgid "" +"Creates a version commit if the addon is initialized, else returns without " +"doing anything. Uses the files which have been staged previously, with the " +"commit message set to a value as provided as in the argument." +msgstr "" + +#: doc/classes/EditorVCSInterface.xml:27 +msgid "" +"Returns an [Array] of [Dictionary] objects containing the diff output from " +"the VCS in use, if a VCS addon is initialized, else returns an empty [Array] " +"object. The diff contents also consist of some contextual lines which " +"provide context to the observed line change in the file.\n" +"Each [Dictionary] object has the line diff contents under the keys:\n" +"- [code]\"content\"[/code] to store a [String] containing the line contents\n" +"- [code]\"status\"[/code] to store a [String] which contains [code]\"+\"[/" +"code] in case the content is a line addition but it stores a [code]\"-\"[/" +"code] in case of deletion and an empty string in the case the line content " +"is neither an addition nor a deletion.\n" +"- [code]\"new_line_number\"[/code] to store an integer containing the new " +"line number of the line content.\n" +"- [code]\"line_count\"[/code] to store an integer containing the number of " +"lines in the line content.\n" +"- [code]\"old_line_number\"[/code] to store an integer containing the old " +"line number of the line content.\n" +"- [code]\"offset\"[/code] to store the offset of the line change since the " +"first contextual line content." +msgstr "" + +#: doc/classes/EditorVCSInterface.xml:41 +msgid "" +"Returns a [Dictionary] containing the path of the detected file change " +"mapped to an integer signifying what kind of a change the corresponding file " +"has experienced.\n" +"The following integer values are being used to signify that the detected " +"file is:\n" +"- [code]0[/code]: New to the VCS working directory\n" +"- [code]1[/code]: Modified\n" +"- [code]2[/code]: Renamed\n" +"- [code]3[/code]: Deleted\n" +"- [code]4[/code]: Typechanged" +msgstr "" + +#: doc/classes/EditorVCSInterface.xml:54 +msgid "Returns the project name of the VCS working directory." +msgstr "" + +#: doc/classes/EditorVCSInterface.xml:61 +msgid "" +"Returns the name of the VCS if the VCS has been initialized, else return an " +"empty string." +msgstr "" + +#: doc/classes/EditorVCSInterface.xml:70 +msgid "" +"Initializes the VCS addon if not already. Uses the argument value as the " +"path to the working directory of the project. Creates the initial commit if " +"required. Returns [code]true[/code] if no failure occurs, else returns " +"[code]false[/code]." +msgstr "" + +#: doc/classes/EditorVCSInterface.xml:77 +msgid "" +"Returns [code]true[/code] if the addon is ready to respond to function " +"calls, else returns [code]false[/code]." +msgstr "" + +#: doc/classes/EditorVCSInterface.xml:84 +msgid "" +"Returns [code]true[/code] if the VCS addon has been initialized, else " +"returns [code]false[/code]." +msgstr "" + +#: doc/classes/EditorVCSInterface.xml:91 +msgid "" +"Shuts down the VCS addon to allow cleanup code to run on call. Returns " +"[code]true[/code] is no failure occurs, else returns [code]false[/code]." +msgstr "" + +#: doc/classes/EditorVCSInterface.xml:100 +msgid "" +"Stages the file which should be committed when [method EditorVCSInterface." +"commit] is called. Argument should contain the absolute path." +msgstr "" + +#: doc/classes/EditorVCSInterface.xml:109 +msgid "" +"Unstages the file which was staged previously to be committed, so that it is " +"no longer committed when [method EditorVCSInterface.commit] is called. " +"Argument should contain the absolute path." +msgstr "" + +#: doc/classes/EncodedObjectAsID.xml:4 +msgid "Holds a reference to an [Object]'s instance ID." +msgstr "" + +#: doc/classes/EncodedObjectAsID.xml:7 +msgid "" +"Utility class which holds a reference to the internal identifier of an " +"[Object] instance, as given by [method Object.get_instance_id]. This ID can " +"then be used to retrieve the object instance with [method @GDScript." +"instance_from_id].\n" +"This class is used internally by the editor inspector and script debugger, " +"but can also be used in plugins to pass and display objects as their IDs." +msgstr "" + +#: doc/classes/EncodedObjectAsID.xml:16 +msgid "" +"The [Object] identifier stored in this [EncodedObjectAsID] instance. The " +"object instance can be retrieved with [method @GDScript.instance_from_id]." +msgstr "" + +#: doc/classes/Engine.xml:4 +msgid "Access to basic engine properties." +msgstr "" + +#: doc/classes/Engine.xml:7 +msgid "" +"The [Engine] class allows you to query and modify the project's run-time " +"parameters, such as frames per second, time scale, and others." +msgstr "" + +#: doc/classes/Engine.xml:16 +msgid "" +"Returns engine author information in a Dictionary.\n" +"[code]lead_developers[/code] - Array of Strings, lead developer names\n" +"[code]founders[/code] - Array of Strings, founder names\n" +"[code]project_managers[/code] - Array of Strings, project manager names\n" +"[code]developers[/code] - Array of Strings, developer names" +msgstr "" + +#: doc/classes/Engine.xml:27 +msgid "" +"Returns an Array of copyright information Dictionaries.\n" +"[code]name[/code] - String, component name\n" +"[code]parts[/code] - Array of Dictionaries {[code]files[/code], " +"[code]copyright[/code], [code]license[/code]} describing subsections of the " +"component" +msgstr "" + +#: doc/classes/Engine.xml:36 +msgid "" +"Returns a Dictionary of Arrays of donor names.\n" +"{[code]platinum_sponsors[/code], [code]gold_sponsors[/code], " +"[code]mini_sponsors[/code], [code]gold_donors[/code], [code]silver_donors[/" +"code], [code]bronze_donors[/code]}" +msgstr "" + +#: doc/classes/Engine.xml:44 +msgid "" +"Returns the total number of frames drawn. If the render loop is disabled " +"with [code]--disable-render-loop[/code] via command line, this returns " +"[code]0[/code]. See also [method get_idle_frames]." +msgstr "" + +#: doc/classes/Engine.xml:51 +msgid "Returns the frames per second of the running game." +msgstr "" + +#: doc/classes/Engine.xml:58 +msgid "" +"Returns the total number of frames passed since engine initialization which " +"is advanced on each [b]idle frame[/b], regardless of whether the render loop " +"is enabled. See also [method get_frames_drawn]." +msgstr "" + +#: doc/classes/Engine.xml:65 +msgid "" +"Returns Dictionary of licenses used by Godot and included third party " +"components." +msgstr "" + +#: doc/classes/Engine.xml:72 +msgid "Returns Godot license text." +msgstr "" + +#: doc/classes/Engine.xml:79 +msgid "Returns the main loop object (see [MainLoop] and [SceneTree])." +msgstr "" + +#: doc/classes/Engine.xml:86 +msgid "" +"Returns the total number of frames passed since engine initialization which " +"is advanced on each [b]physics frame[/b]." +msgstr "" + +#: doc/classes/Engine.xml:93 +msgid "" +"Returns the fraction through the current physics tick we are at the time of " +"rendering the frame. This can be used to implement fixed timestep " +"interpolation." +msgstr "" + +#: doc/classes/Engine.xml:102 +msgid "" +"Returns a global singleton with given [code]name[/code]. Often used for " +"plugins, e.g. GodotPayments." +msgstr "" + +#: doc/classes/Engine.xml:109 +msgid "" +"Returns the current engine version information in a Dictionary.\n" +"[code]major[/code] - Holds the major version number as an int\n" +"[code]minor[/code] - Holds the minor version number as an int\n" +"[code]patch[/code] - Holds the patch version number as an int\n" +"[code]hex[/code] - Holds the full version number encoded as a " +"hexadecimal int with one byte (2 places) per number (see example below)\n" +"[code]status[/code] - Holds the status (e.g. \"beta\", \"rc1\", " +"\"rc2\", ... \"stable\") as a String\n" +"[code]build[/code] - Holds the build name (e.g. \"custom_build\") as a " +"String\n" +"[code]hash[/code] - Holds the full Git commit hash as a String\n" +"[code]year[/code] - Holds the year the version was released in as an " +"int\n" +"[code]string[/code] - [code]major[/code] + [code]minor[/code] + " +"[code]patch[/code] + [code]status[/code] + [code]build[/code] in a single " +"String\n" +"The [code]hex[/code] value is encoded as follows, from left to right: one " +"byte for the major, one byte for the minor, one byte for the patch version. " +"For example, \"3.1.12\" would be [code]0x03010C[/code]. [b]Note:[/b] It's " +"still an int internally, and printing it will give you its decimal " +"representation, which is not particularly meaningful. Use hexadecimal " +"literals for easy version comparisons from code:\n" +"[codeblock]\n" +"if Engine.get_version_info().hex >= 0x030200:\n" +" # Do things specific to version 3.2 or later\n" +"else:\n" +" # Do things specific to versions before 3.2\n" +"[/codeblock]" +msgstr "" + +#: doc/classes/Engine.xml:134 +msgid "" +"Returns [code]true[/code] if a singleton with given [code]name[/code] exists " +"in global scope." +msgstr "" + +#: doc/classes/Engine.xml:141 +msgid "" +"Returns [code]true[/code] if the game is inside the fixed process and " +"physics phase of the game loop." +msgstr "" + +#: doc/classes/Engine.xml:147 +msgid "" +"If [code]true[/code], it is running inside the editor. Useful for tool " +"scripts." +msgstr "" + +#: doc/classes/Engine.xml:150 +msgid "" +"The number of fixed iterations per second. This controls how often physics " +"simulation and [method Node._physics_process] methods are run. This value " +"should generally always be set to [code]60[/code] or above, as Godot doesn't " +"interpolate the physics step. As a result, values lower than [code]60[/code] " +"will look stuttery. This value can be increased to make input more reactive " +"or work around tunneling issues, but keep in mind doing so will increase CPU " +"usage." +msgstr "" + +#: doc/classes/Engine.xml:153 +msgid "" +"Controls how much physics ticks are synchronized with real time. For 0 or " +"less, the ticks are synchronized. Such values are recommended for network " +"games, where clock synchronization matters. Higher values cause higher " +"deviation of in-game clock and real clock, but allows to smooth out " +"framerate jitters. The default value of 0.5 should be fine for most; values " +"above 2 could cause the game to react to dropped frames with a noticeable " +"delay and are not recommended." +msgstr "" + +#: doc/classes/Engine.xml:156 +msgid "" +"The desired frames per second. If the hardware cannot keep up, this setting " +"may not be respected. A value of 0 means no limit." +msgstr "" + +#: doc/classes/Engine.xml:159 +msgid "" +"Controls how fast or slow the in-game clock ticks versus the real life one. " +"It defaults to 1.0. A value of 2.0 means the game moves twice as fast as " +"real life, whilst a value of 0.5 means the game moves at half the regular " +"speed." +msgstr "" + +#: doc/classes/Environment.xml:4 +msgid "" +"Resource for environment nodes (like [WorldEnvironment]) that define " +"multiple rendering options." +msgstr "" + +#: doc/classes/Environment.xml:7 +msgid "" +"Resource for environment nodes (like [WorldEnvironment]) that define " +"multiple environment operations (such as background [Sky] or [Color], " +"ambient light, fog, depth-of-field...). These parameters affect the final " +"render of the scene. The order of these operations is:\n" +"- Depth of Field Blur\n" +"- Glow\n" +"- Tonemap (Auto Exposure)\n" +"- Adjustments" +msgstr "" + +#: doc/classes/Environment.xml:14 doc/classes/WorldEnvironment.xml:12 +msgid "" +"https://docs.godotengine.org/en/latest/tutorials/3d/" +"environment_and_post_processing.html" +msgstr "" + +#: doc/classes/Environment.xml:15 +msgid "" +"https://docs.godotengine.org/en/latest/tutorials/3d/high_dynamic_range.html" +msgstr "" + +#: doc/classes/Environment.xml:24 +msgid "" +"Returns [code]true[/code] if the glow level [code]idx[/code] is specified, " +"[code]false[/code] otherwise." +msgstr "" + +#: doc/classes/Environment.xml:35 +msgid "" +"Enables or disables the glow level at index [code]idx[/code]. Each level " +"relies on the previous level. This means that enabling higher glow levels " +"will slow down the glow effect rendering, even if previous levels aren't " +"enabled." +msgstr "" + +#: doc/classes/Environment.xml:41 +msgid "" +"The global brightness value of the rendered scene. Effective only if " +"[code]adjustment_enabled[/code] is [code]true[/code]." +msgstr "" + +#: doc/classes/Environment.xml:44 +msgid "" +"Applies the provided [Texture2D] resource to affect the global color aspect " +"of the rendered scene. Effective only if [code]adjustment_enabled[/code] is " +"[code]true[/code]." +msgstr "" + +#: doc/classes/Environment.xml:47 +msgid "" +"The global contrast value of the rendered scene (default value is 1). " +"Effective only if [code]adjustment_enabled[/code] is [code]true[/code]." +msgstr "" + +#: doc/classes/Environment.xml:50 +msgid "" +"If [code]true[/code], enables the [code]adjustment_*[/code] properties " +"provided by this resource. If [code]false[/code], modifications to the " +"[code]adjustment_*[/code] properties will have no effect on the rendered " +"scene." +msgstr "" + +#: doc/classes/Environment.xml:53 +msgid "" +"The global color saturation value of the rendered scene (default value is " +"1). Effective only if [code]adjustment_enabled[/code] is [code]true[/code]." +msgstr "" + +#: doc/classes/Environment.xml:56 +msgid "The ambient light's [Color]." +msgstr "" + +#: doc/classes/Environment.xml:59 +msgid "" +"The ambient light's energy. The higher the value, the stronger the light." +msgstr "" + +#: doc/classes/Environment.xml:64 +msgid "" +"Defines the amount of light that the sky brings on the scene. A value of 0 " +"means that the sky's light emission has no effect on the scene illumination, " +"thus all ambient illumination is provided by the ambient light. On the " +"contrary, a value of 1 means that all the light that affects the scene is " +"provided by the sky, thus the ambient light parameter has no effect on the " +"scene." +msgstr "" + +#: doc/classes/Environment.xml:69 +msgid "" +"If [code]true[/code], enables the tonemapping auto exposure mode of the " +"scene renderer. If [code]true[/code], the renderer will automatically " +"determine the exposure setting to adapt to the scene's illumination and the " +"observed light." +msgstr "" + +#: doc/classes/Environment.xml:72 +msgid "The maximum luminance value for the auto exposure." +msgstr "" + +#: doc/classes/Environment.xml:75 +msgid "The minimum luminance value for the auto exposure." +msgstr "" + +#: doc/classes/Environment.xml:78 +msgid "" +"The scale of the auto exposure effect. Affects the intensity of auto " +"exposure." +msgstr "" + +#: doc/classes/Environment.xml:81 +msgid "" +"The speed of the auto exposure effect. Affects the time needed for the " +"camera to perform auto exposure." +msgstr "" + +#: doc/classes/Environment.xml:84 +msgid "The ID of the camera feed to show in the background." +msgstr "" + +#: doc/classes/Environment.xml:87 +msgid "" +"The maximum layer ID to display. Only effective when using the [constant " +"BG_CANVAS] background mode." +msgstr "" + +#: doc/classes/Environment.xml:90 +msgid "" +"The [Color] displayed for clear areas of the scene. Only effective when " +"using the [constant BG_COLOR] background mode." +msgstr "" + +#: doc/classes/Environment.xml:93 +msgid "The power of the light emitted by the background." +msgstr "" + +#: doc/classes/Environment.xml:96 +msgid "The background mode. See [enum BGMode] for possible values." +msgstr "" + +#: doc/classes/Environment.xml:99 +msgid "The fog's [Color]." +msgstr "" + +#: doc/classes/Environment.xml:102 +msgid "The fog's depth starting distance from the camera." +msgstr "" + +#: doc/classes/Environment.xml:105 +msgid "" +"The fog depth's intensity curve. A number of presets are available in the " +"[b]Inspector[/b] by right-clicking the curve." +msgstr "" + +#: doc/classes/Environment.xml:108 +msgid "" +"If [code]true[/code], the depth fog effect is enabled. When enabled, fog " +"will appear in the distance (relative to the camera)." +msgstr "" + +#: doc/classes/Environment.xml:111 +msgid "" +"The fog's depth end distance from the camera. If this value is set to 0, it " +"will be equal to the current camera's [member Camera3D.far] value." +msgstr "" + +#: doc/classes/Environment.xml:114 +msgid "" +"If [code]true[/code], fog effects are enabled. [member fog_height_enabled] " +"and/or [member fog_depth_enabled] must be set to [code]true[/code] to " +"actually display fog." +msgstr "" + +#: doc/classes/Environment.xml:117 +msgid "" +"The height fog's intensity. A number of presets are available in the " +"[b]Inspector[/b] by right-clicking the curve." +msgstr "" + +#: doc/classes/Environment.xml:120 +msgid "" +"If [code]true[/code], the height fog effect is enabled. When enabled, fog " +"will appear in a defined height range, regardless of the distance from the " +"camera. This can be used to simulate \"deep water\" effects with a lower " +"performance cost compared to a dedicated shader." +msgstr "" + +#: doc/classes/Environment.xml:123 +msgid "" +"The Y coordinate where the height fog will be the most intense. If this " +"value is greater than [member fog_height_min], fog will be displayed from " +"bottom to top. Otherwise, it will be displayed from top to bottom." +msgstr "" + +#: doc/classes/Environment.xml:126 +msgid "" +"The Y coordinate where the height fog will be the least intense. If this " +"value is greater than [member fog_height_max], fog will be displayed from " +"top to bottom. Otherwise, it will be displayed from bottom to top." +msgstr "" + +#: doc/classes/Environment.xml:129 +msgid "" +"The intensity of the depth fog color transition when looking towards the " +"sun. The sun's direction is determined automatically using the " +"DirectionalLight3D node in the scene." +msgstr "" + +#: doc/classes/Environment.xml:132 +msgid "The depth fog's [Color] when looking towards the sun." +msgstr "" + +#: doc/classes/Environment.xml:135 +msgid "" +"The intensity of the fog light transmittance effect. Amount of light that " +"the fog transmits." +msgstr "" + +#: doc/classes/Environment.xml:138 +msgid "" +"Enables fog's light transmission effect. If [code]true[/code], light will be " +"more visible in the fog to simulate light scattering as in real life." +msgstr "" + +#: doc/classes/Environment.xml:141 +msgid "The glow blending mode." +msgstr "" + +#: doc/classes/Environment.xml:144 +msgid "" +"The bloom's intensity. If set to a value higher than [code]0[/code], this " +"will make glow visible in areas darker than the [member glow_hdr_threshold]." +msgstr "" + +#: doc/classes/Environment.xml:147 +msgid "If [code]true[/code], the glow effect is enabled." +msgstr "" + +#: doc/classes/Environment.xml:150 +msgid "" +"The higher threshold of the HDR glow. Areas brighter than this threshold " +"will be clamped for the purposes of the glow effect." +msgstr "" + +#: doc/classes/Environment.xml:153 +msgid "The bleed scale of the HDR glow." +msgstr "" + +#: doc/classes/Environment.xml:156 +msgid "" +"The lower threshold of the HDR glow. When using the GLES2 renderer (which " +"doesn't support HDR), this needs to be below [code]1.0[/code] for glow to be " +"visible. A value of [code]0.9[/code] works well in this case." +msgstr "" + +#: doc/classes/Environment.xml:159 +msgid "" +"The glow intensity. When using the GLES2 renderer, this should be increased " +"to 1.5 to compensate for the lack of HDR rendering." +msgstr "" + +#: doc/classes/Environment.xml:162 +msgid "" +"If [code]true[/code], the 1st level of glow is enabled. This is the most " +"\"local\" level (least blurry)." +msgstr "" + +#: doc/classes/Environment.xml:165 +msgid "If [code]true[/code], the 2th level of glow is enabled." +msgstr "" + +#: doc/classes/Environment.xml:168 +msgid "If [code]true[/code], the 3th level of glow is enabled." +msgstr "" + +#: doc/classes/Environment.xml:171 +msgid "If [code]true[/code], the 4th level of glow is enabled." +msgstr "" + +#: doc/classes/Environment.xml:174 +msgid "If [code]true[/code], the 5th level of glow is enabled." +msgstr "" + +#: doc/classes/Environment.xml:177 +msgid "If [code]true[/code], the 6th level of glow is enabled." +msgstr "" + +#: doc/classes/Environment.xml:180 +msgid "" +"If [code]true[/code], the 7th level of glow is enabled. This is the most " +"\"global\" level (blurriest)." +msgstr "" + +#: doc/classes/Environment.xml:185 +msgid "" +"The glow strength. When using the GLES2 renderer, this should be increased " +"to 1.3 to compensate for the lack of HDR rendering." +msgstr "" + +#: doc/classes/Environment.xml:190 +msgid "The [Sky] resource used for this [Environment]." +msgstr "" + +#: doc/classes/Environment.xml:197 +msgid "The depth tolerance for screen-space reflections." +msgstr "" + +#: doc/classes/Environment.xml:200 +msgid "" +"If [code]true[/code], screen-space reflections are enabled. Screen-space " +"reflections are more accurate than reflections from [GIProbe]s or " +"[ReflectionProbe]s, but are slower and can't reflect surfaces occluded by " +"others." +msgstr "" + +#: doc/classes/Environment.xml:203 +msgid "" +"The fade-in distance for screen-space reflections. Affects the area from the " +"reflected material to the screen-space reflection)." +msgstr "" + +#: doc/classes/Environment.xml:206 +msgid "" +"The fade-out distance for screen-space reflections. Affects the area from " +"the screen-space reflection to the \"global\" reflection." +msgstr "" + +#: doc/classes/Environment.xml:209 +msgid "" +"The maximum number of steps for screen-space reflections. Higher values are " +"slower." +msgstr "" + +#: doc/classes/Environment.xml:212 +msgid "" +"The screen-space ambient occlusion intensity on materials that have an AO " +"texture defined. Values higher than [code]0[/code] will make the SSAO effect " +"visible in areas darkened by AO textures." +msgstr "" + +#: doc/classes/Environment.xml:215 +msgid "" +"The screen-space ambient occlusion bias. This should be kept high enough to " +"prevent \"smooth\" curves from being affected by ambient occlusion." +msgstr "" + +#: doc/classes/Environment.xml:218 +msgid "" +"The screen-space ambient occlusion blur quality. See [enum SSAOBlur] for " +"possible values." +msgstr "" + +#: doc/classes/Environment.xml:221 +msgid "The screen-space ambient occlusion edge sharpness." +msgstr "" + +#: doc/classes/Environment.xml:224 +msgid "" +"If [code]true[/code], the screen-space ambient occlusion effect is enabled. " +"This darkens objects' corners and cavities to simulate ambient light not " +"reaching the entire object as in real life. This works well for small, " +"dynamic objects, but baked lighting or ambient occlusion textures will do a " +"better job at displaying ambient occlusion on large static objects. This is " +"a costly effect and should be disabled first when running into performance " +"issues." +msgstr "" + +#: doc/classes/Environment.xml:227 +msgid "" +"The primary screen-space ambient occlusion intensity. See also [member " +"ssao_radius]." +msgstr "" + +#: doc/classes/Environment.xml:230 +msgid "" +"The screen-space ambient occlusion intensity in direct light. In real life, " +"ambient occlusion only applies to indirect light, which means its effects " +"can't be seen in direct light. Values higher than [code]0[/code] will make " +"the SSAO effect visible in direct light." +msgstr "" + +#: doc/classes/Environment.xml:233 +msgid "The primary screen-space ambient occlusion radius." +msgstr "" + +#: doc/classes/Environment.xml:236 +msgid "The default exposure used for tonemapping." +msgstr "" + +#: doc/classes/Environment.xml:239 +msgid "" +"The tonemapping mode to use. Tonemapping is the process that \"converts\" " +"HDR values to be suitable for rendering on a LDR display. (Godot doesn't " +"support rendering on HDR displays yet.)" +msgstr "" + +#: doc/classes/Environment.xml:242 +msgid "" +"The white reference value for tonemapping. Only effective if the [member " +"tonemap_mode] isn't set to [constant TONE_MAPPER_LINEAR]." +msgstr "" + +#: doc/classes/Environment.xml:247 +msgid "" +"Clears the background using the clear color defined in [member " +"ProjectSettings.rendering/environment/default_clear_color]." +msgstr "" + +#: doc/classes/Environment.xml:250 +msgid "Clears the background using a custom clear color." +msgstr "" + +#: doc/classes/Environment.xml:253 +msgid "Displays a user-defined sky in the background." +msgstr "" + +#: doc/classes/Environment.xml:256 +msgid "Displays a [CanvasLayer] in the background." +msgstr "" + +#: doc/classes/Environment.xml:259 +msgid "" +"Keeps on screen every pixel drawn in the background. This is the fastest " +"background mode, but it can only be safely used in fully-interior scenes (no " +"visible sky or sky reflections). If enabled in a scene where the background " +"is visible, \"ghost trail\" artifacts will be visible when moving the camera." +msgstr "" + +#: doc/classes/Environment.xml:262 doc/classes/RenderingServer.xml:3563 +msgid "Displays a camera feed in the background." +msgstr "" + +#: doc/classes/Environment.xml:265 +msgid "Represents the size of the [enum BGMode] enum." +msgstr "" + +#: 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:292 doc/classes/RenderingServer.xml:3593 +msgid "" +"Screen glow blending mode. Increases brightness, used frequently with bloom." +msgstr "" + +#: 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: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: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: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:310 +msgid "Filmic tonemapper operator." +msgstr "" + +#: doc/classes/Environment.xml:313 +msgid "Academy Color Encoding System tonemapper operator." +msgstr "" + +#: doc/classes/Environment.xml:316 +msgid "No blur for the screen-space ambient occlusion effect (fastest)." +msgstr "" + +#: doc/classes/Environment.xml:319 +msgid "1×1 blur for the screen-space ambient occlusion effect." +msgstr "" + +#: doc/classes/Environment.xml:322 +msgid "2×2 blur for the screen-space ambient occlusion effect." +msgstr "" + +#: 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 +msgid "A class that stores an expression you can execute." +msgstr "" + +#: doc/classes/Expression.xml:7 +msgid "" +"An expression can be made of any arithmetic operation, built-in math " +"function call, method call of a passed instance, or built-in type " +"construction call.\n" +"An example expression text using the built-in math functions could be " +"[code]sqrt(pow(3,2) + pow(4,2))[/code].\n" +"In the following example we use a [LineEdit] node to write our expression " +"and show the result.\n" +"[codeblock]\n" +"onready var expression = Expression.new()\n" +"\n" +"func _ready():\n" +" $LineEdit.connect(\"text_entered\", self, \"_on_text_entered\")\n" +"\n" +"func _on_text_entered(command):\n" +" var error = expression.parse(command, [])\n" +" if error != OK:\n" +" print(expression.get_error_text())\n" +" return\n" +" var result = expression.execute([], null, true)\n" +" if not expression.has_execute_failed():\n" +" $LineEdit.text = str(result)\n" +"[/codeblock]" +msgstr "" + +#: doc/classes/Expression.xml:39 +msgid "" +"Executes the expression that was previously parsed by [method parse] and " +"returns the result. Before you use the returned object, you should check if " +"the method failed by calling [method has_execute_failed].\n" +"If you defined input variables in [method parse], you can specify their " +"values in the inputs array, in the same order." +msgstr "" + +#: doc/classes/Expression.xml:47 +msgid "Returns the error text if [method parse] has failed." +msgstr "" + +#: doc/classes/Expression.xml:54 +msgid "Returns [code]true[/code] if [method execute] has failed." +msgstr "" + +#: doc/classes/Expression.xml:65 +msgid "" +"Parses the expression and returns an [enum Error] code.\n" +"You can optionally specify names of variables that may appear in the " +"expression with [code]input_names[/code], so that you can bind them when it " +"gets executed." +msgstr "" + +#: doc/classes/File.xml:4 +msgid "Type to handle file reading and writing operations." +msgstr "" + +#: doc/classes/File.xml:7 +msgid "" +"File type. This is used to permanently store data into the user device's " +"file system and to read from it. This can be used to store game save data or " +"player configuration files, for example.\n" +"Here's a sample on how to write and read from a file:\n" +"[codeblock]\n" +"func save(content):\n" +" var file = File.new()\n" +" file.open(\"user://save_game.dat\", File.WRITE)\n" +" file.store_string(content)\n" +" file.close()\n" +"\n" +"func load():\n" +" var file = File.new()\n" +" file.open(\"user://save_game.dat\", File.READ)\n" +" var content = file.get_as_text()\n" +" file.close()\n" +" return content\n" +"[/codeblock]" +msgstr "" + +#: doc/classes/File.xml:32 +msgid "Closes the currently opened file." +msgstr "" + +#: doc/classes/File.xml:39 +msgid "" +"Returns [code]true[/code] if the file cursor has read past the end of the " +"file.\n" +"[b]Note:[/b] This function will still return [code]false[/code] while at the " +"end of the file and only activates when reading past it. This can be " +"confusing but it conforms to how low-level file access works in all " +"operating systems. There is always [method get_len] and [method " +"get_position] to implement a custom logic." +msgstr "" + +#: doc/classes/File.xml:49 +msgid "" +"Returns [code]true[/code] if the file exists in the given path.\n" +"[b]Note:[/b] Many resources types are imported (e.g. textures or sound " +"files), and that their source asset will not be included in the exported " +"game, as only the imported version is used (in the [code]res://.import[/" +"code] folder). To check for the existence of such resources while taking " +"into account the remapping to their imported location, use [method " +"ResourceLoader.exists]. Typically, using [code]File.file_exists[/code] on an " +"imported resource would work while you are developing in the editor (the " +"source asset is present in [code]res://[/code], but fail when exported)." +msgstr "" + +#: doc/classes/File.xml:57 +msgid "Returns the next 16 bits from the file as an integer." +msgstr "" + +#: doc/classes/File.xml:64 +msgid "Returns the next 32 bits from the file as an integer." +msgstr "" + +#: doc/classes/File.xml:71 +msgid "Returns the next 64 bits from the file as an integer." +msgstr "" + +#: doc/classes/File.xml:78 +msgid "Returns the next 8 bits from the file as an integer." +msgstr "" + +#: doc/classes/File.xml:85 +msgid "" +"Returns the whole file as a [String].\n" +"Text is interpreted as being UTF-8 encoded." +msgstr "" + +#: doc/classes/File.xml:95 +msgid "Returns next [code]len[/code] bytes of the file as a [PackedByteArray]." +msgstr "" + +#: doc/classes/File.xml:104 +msgid "" +"Returns the next value of the file in CSV (Comma-Separated Values) format. " +"You can pass a different delimiter [code]delim[/code] to use other than the " +"default [code]\",\"[/code] (comma). This delimiter must be one-character " +"long.\n" +"Text is interpreted as being UTF-8 encoded." +msgstr "" + +#: doc/classes/File.xml:112 +msgid "Returns the next 64 bits from the file as a floating-point number." +msgstr "" + +#: doc/classes/File.xml:119 +msgid "" +"Returns the last error that happened when trying to perform operations. " +"Compare with the [code]ERR_FILE_*[/code] constants from [enum Error]." +msgstr "" + +#: doc/classes/File.xml:126 +msgid "Returns the next 32 bits from the file as a floating-point number." +msgstr "" + +#: doc/classes/File.xml:133 +msgid "Returns the size of the file in bytes." +msgstr "" + +#: doc/classes/File.xml:140 +msgid "" +"Returns the next line of the file as a [String].\n" +"Text is interpreted as being UTF-8 encoded." +msgstr "" + +#: doc/classes/File.xml:150 +msgid "" +"Returns an MD5 String representing the file at the given path or an empty " +"[String] on failure." +msgstr "" + +#: doc/classes/File.xml:159 +msgid "" +"Returns the last time the [code]file[/code] was modified in unix timestamp " +"format or returns a [String] \"ERROR IN [code]file[/code]\". This unix " +"timestamp can be converted to datetime by using [method OS." +"get_datetime_from_unix_time]." +msgstr "" + +#: doc/classes/File.xml:166 +msgid "" +"Returns a [String] saved in Pascal format from the file.\n" +"Text is interpreted as being UTF-8 encoded." +msgstr "" + +#: doc/classes/File.xml:174 +msgid "Returns the path as a [String] for the current open file." +msgstr "" + +#: doc/classes/File.xml:181 +msgid "Returns the absolute path as a [String] for the current open file." +msgstr "" + +#: doc/classes/File.xml:188 +msgid "Returns the file cursor's position." +msgstr "" + +#: doc/classes/File.xml:195 +msgid "Returns the next bits from the file as a floating-point number." +msgstr "" + +#: doc/classes/File.xml:204 +msgid "" +"Returns a SHA-256 [String] representing the file at the given path or an " +"empty [String] on failure." +msgstr "" + +#: doc/classes/File.xml:213 +msgid "" +"Returns the next [Variant] value from the file. If [code]allow_objects[/" +"code] is [code]true[/code], decoding objects is allowed.\n" +"[b]Warning:[/b] Deserialized objects can contain code which gets executed. " +"Do not use this option if the serialized object comes from untrusted sources " +"to avoid potential security threats such as remote code execution." +msgstr "" + +#: doc/classes/File.xml:221 +msgid "Returns [code]true[/code] if the file is currently opened." +msgstr "" + +#: doc/classes/File.xml:232 +msgid "Opens the file for writing or reading, depending on the flags." +msgstr "" + +#: doc/classes/File.xml:245 +msgid "Opens a compressed file for reading or writing." +msgstr "" + +#: doc/classes/File.xml:258 +msgid "" +"Opens an encrypted file in write or read mode. You need to pass a binary key " +"to encrypt/decrypt it." +msgstr "" + +#: doc/classes/File.xml:271 +msgid "" +"Opens an encrypted file in write or read mode. You need to pass a password " +"to encrypt/decrypt it." +msgstr "" + +#: doc/classes/File.xml:280 +msgid "" +"Changes the file reading/writing cursor to the specified position (in bytes " +"from the beginning of the file)." +msgstr "" + +#: doc/classes/File.xml:289 +msgid "" +"Changes the file reading/writing cursor to the specified position (in bytes " +"from the end of the file).\n" +"[b]Note:[/b] This is an offset, so you should use negative numbers or the " +"cursor will be at the end of the file." +msgstr "" + +#: doc/classes/File.xml:299 +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: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: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: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:339 +msgid "Stores the given array of bytes in the file." +msgstr "" + +#: 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 " +"[code]delim[/code] to use other than the default [code]\",\"[/code] (comma). " +"This delimiter must be one-character long.\n" +"Text will be encoded as UTF-8." +msgstr "" + +#: doc/classes/File.xml:360 +msgid "Stores a floating-point number as 64 bits in the file." +msgstr "" + +#: doc/classes/File.xml:369 +msgid "Stores a floating-point number as 32 bits in the file." +msgstr "" + +#: 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: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:398 +msgid "Stores a floating-point number in the file." +msgstr "" + +#: 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: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: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" +"[b]Note:[/b] This is about the file format, not CPU type. This is always " +"reset to [code]false[/code] whenever you open the file." +msgstr "" + +#: doc/classes/File.xml:431 +msgid "Opens the file for read operations." +msgstr "" + +#: 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:437 +msgid "" +"Opens the file for read and write operations. Does not truncate the file." +msgstr "" + +#: 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:443 +msgid "Uses the [url=http://fastlz.org/]FastLZ[/url] compression method." +msgstr "" + +#: doc/classes/File.xml:446 +msgid "" +"Uses the [url=https://en.wikipedia.org/wiki/DEFLATE]DEFLATE[/url] " +"compression method." +msgstr "" + +#: doc/classes/File.xml:449 +msgid "" +"Uses the [url=https://facebook.github.io/zstd/]Zstandard[/url] compression " +"method." +msgstr "" + +#: doc/classes/File.xml:452 +msgid "Uses the [url=https://www.gzip.org/]gzip[/url] compression method." +msgstr "" + +#: doc/classes/FileDialog.xml:4 +msgid "Dialog for selecting files or directories in the filesystem." +msgstr "" + +#: doc/classes/FileDialog.xml:7 +msgid "" +"FileDialog is a preset dialog used to choose files and directories in the " +"filesystem. It supports filter masks." +msgstr "" + +#: doc/classes/FileDialog.xml:18 +msgid "" +"Adds [code]filter[/code] as a custom filter; [code]filter[/code] should be " +"of the form [code]\"filename.extension ; Description\"[/code]. For example, " +"[code]\"*.png ; PNG Images\"[/code]." +msgstr "" + +#: doc/classes/FileDialog.xml:25 +msgid "Clear all the added filters in the dialog." +msgstr "" + +#: doc/classes/FileDialog.xml:32 +msgid "Clear currently selected items in the dialog." +msgstr "" + +#: doc/classes/FileDialog.xml:39 +msgid "Returns the LineEdit for the selected file." +msgstr "" + +#: doc/classes/FileDialog.xml:46 +msgid "" +"Returns the vertical box container of the dialog, custom controls can be " +"added to it." +msgstr "" + +#: doc/classes/FileDialog.xml:53 +msgid "Invalidate and update the current dialog content list." +msgstr "" + +#: doc/classes/FileDialog.xml:59 +msgid "The file system access scope. See enum [code]Access[/code] constants." +msgstr "" + +#: doc/classes/FileDialog.xml:62 +msgid "The current working directory of the file dialog." +msgstr "" + +#: doc/classes/FileDialog.xml:65 +msgid "The currently selected file of the file dialog." +msgstr "" + +#: doc/classes/FileDialog.xml:68 +msgid "The currently selected file path of the file dialog." +msgstr "" + +#: doc/classes/FileDialog.xml:72 +msgid "" +"The dialog's open or save mode, which affects the selection behavior. See " +"[enum FileMode]." +msgstr "" + +#: doc/classes/FileDialog.xml:75 +msgid "" +"The available file type filters. For example, this shows only [code].png[/" +"code] and [code].gd[/code] files: [code]set_filters(PackedStringArray([\"*." +"png ; PNG Images\",\"*.gd ; GDScript Files\"]))[/code]." +msgstr "" + +#: doc/classes/FileDialog.xml:78 +msgid "" +"If [code]true[/code], changing the [code]Mode[/code] property will set the " +"window title accordingly (e.g. setting mode to [constant " +"FILE_MODE_OPEN_FILE] will change the window title to \"Open a File\")." +msgstr "" + +#: doc/classes/FileDialog.xml:81 +msgid "If [code]true[/code], the dialog will show hidden files." +msgstr "" + +#: doc/classes/FileDialog.xml:90 +msgid "Emitted when the user selects a directory." +msgstr "" + +#: doc/classes/FileDialog.xml:97 +msgid "" +"Emitted when the user selects a file by double-clicking it or pressing the " +"[b]OK[/b] button." +msgstr "" + +#: doc/classes/FileDialog.xml:104 +msgid "Emitted when the user selects multiple files." +msgstr "" + +#: doc/classes/FileDialog.xml:110 +msgid "The dialog allows selecting one, and only one file." +msgstr "" + +#: doc/classes/FileDialog.xml:113 +msgid "The dialog allows selecting multiple files." +msgstr "" + +#: doc/classes/FileDialog.xml:116 +msgid "" +"The dialog only allows selecting a directory, disallowing the selection of " +"any file." +msgstr "" + +#: doc/classes/FileDialog.xml:119 +msgid "The dialog allows selecting one file or directory." +msgstr "" + +#: doc/classes/FileDialog.xml:122 +msgid "The dialog will warn when a file exists." +msgstr "" + +#: doc/classes/FileDialog.xml:125 +msgid "" +"The dialog only allows accessing files under the [Resource] path " +"([code]res://[/code])." +msgstr "" + +#: doc/classes/FileDialog.xml:128 +msgid "" +"The dialog only allows accessing files under user data path ([code]user://[/" +"code])." +msgstr "" + +#: doc/classes/FileDialog.xml:131 +msgid "The dialog allows accessing files on the whole file system." +msgstr "" + +#: doc/classes/FileDialog.xml:136 +msgid "" +"The color tint for disabled files (when the [FileDialog] is used in open " +"folder mode)." +msgstr "" + +#: doc/classes/FileDialog.xml:139 +msgid "Custom icon for folders." +msgstr "" + +#: doc/classes/FileDialog.xml:142 +msgid "The color modulation applied to the folder icon." +msgstr "" + +#: doc/classes/FileDialog.xml:145 +msgid "Custom icon for the parent folder arrow." +msgstr "" + +#: doc/classes/FileDialog.xml:148 +msgid "Custom icon for the reload button." +msgstr "" + +#: doc/classes/FileDialog.xml:151 +msgid "Custom icon for the toggle hidden button." +msgstr "" + +#: doc/classes/float.xml:4 doc/classes/float.xml:7 +msgid "Float built-in type." +msgstr "" + +#: doc/classes/float.xml:18 +msgid "" +"Cast a [bool] value to a floating-point value, [code]float(true)[/code] will " +"be equal to 1.0 and [code]float(false)[/code] will be equal to 0.0." +msgstr "" + +#: doc/classes/float.xml:27 +msgid "" +"Cast an [int] value to a floating-point value, [code]float(1)[/code] will be " +"equal to 1.0." +msgstr "" + +#: doc/classes/float.xml:36 +msgid "" +"Cast a [String] value to a floating-point value. This method accepts float " +"value strings like [code]\"1.23\"[/code] and exponential notation strings " +"for its parameter so calling [code]float(\"1e3\")[/code] will return 1000.0 " +"and calling [code]float(\"1e-3\")[/code] will return 0.001. Calling this " +"method with an invalid float string will return 0. This method stops parsing " +"at the first invalid character and will return the parsed result so far, so " +"calling [code]float(\"1a3\")[/code] will return 1 while calling " +"[code]float(\"1e3a2\")[/code] will return 1000.0." +msgstr "" + +#: doc/classes/Font.xml:4 +msgid "Internationalized font and text drawing support." +msgstr "" + +#: doc/classes/Font.xml:7 +msgid "" +"Font contains a Unicode-compatible character set, as well as the ability to " +"draw it with variable width, ascent, descent and kerning. For creating fonts " +"from TTF files (or other font formats), see the editor support for fonts." +msgstr "" + +#: doc/classes/Font.xml:28 +msgid "" +"Draw [code]string[/code] into a canvas item using the font at a given " +"position, with [code]modulate[/code] color, and optionally clipping the " +"width. [code]position[/code] specifies the baseline, not the top. To draw " +"from the top, [i]ascent[/i] must be added to the Y axis." +msgstr "" + +#: doc/classes/Font.xml:47 +msgid "" +"Draw character [code]char[/code] into a canvas item using the font at a " +"given position, with [code]modulate[/code] color, and optionally kerning if " +"[code]next[/code] is passed. clipping the width. [code]position[/code] " +"specifies the baseline, not the top. To draw from the top, [i]ascent[/i] " +"must be added to the Y axis. The width used by the character is returned, " +"making this function useful for drawing strings character by character." +msgstr "" + +#: doc/classes/Font.xml:54 +msgid "Returns the font ascent (number of pixels above the baseline)." +msgstr "" + +#: doc/classes/Font.xml:61 +msgid "Returns the font descent (number of pixels below the baseline)." +msgstr "" + +#: doc/classes/Font.xml:68 +msgid "Returns the total font height (ascent plus descent) in pixels." +msgstr "" + +#: doc/classes/Font.xml:77 +msgid "Returns the size of a string, taking kerning and advance into account." +msgstr "" + +#: doc/classes/Font.xml:88 +msgid "" +"Returns the size that the string would have with word wrapping enabled with " +"a fixed [code]width[/code]." +msgstr "" + +#: doc/classes/Font.xml:95 +msgid "Returns [code]true[/code] if the font has an outline." +msgstr "" + +#: doc/classes/Font.xml:108 +msgid "" +"After editing a font (changing size, ascent, char rects, etc.). Call this " +"function to propagate changes to controls that might use it." +msgstr "" + +#: doc/classes/FuncRef.xml:4 +msgid "Reference to a function in an object." +msgstr "" + +#: doc/classes/FuncRef.xml:7 +msgid "" +"In GDScript, functions are not [i]first-class objects[/i]. This means it is " +"impossible to store them directly as variables, return them from another " +"function, or pass them as arguments.\n" +"However, by creating a [FuncRef] using the [method @GDScript.funcref] " +"function, a reference to a function in a given object can be created, passed " +"around and called." +msgstr "" + +#: doc/classes/FuncRef.xml:17 +msgid "" +"Calls the referenced function previously set by [method set_function] or " +"[method @GDScript.funcref]." +msgstr "" + +#: doc/classes/FuncRef.xml:26 +msgid "" +"Calls the referenced function previously set by [method set_function] or " +"[method @GDScript.funcref]. Contrarily to [method call_func], this method " +"does not support a variable number of arguments but expects all parameters " +"to be passed via a single [Array]." +msgstr "" + +#: doc/classes/FuncRef.xml:33 +msgid "Returns whether the object still exists and has the function assigned." +msgstr "" + +#: doc/classes/FuncRef.xml:42 +msgid "" +"The name of the referenced function to call on the object, without " +"parentheses or any parameters." +msgstr "" + +#: doc/classes/FuncRef.xml:51 +msgid "" +"The object containing the referenced function. This object must be of a type " +"actually inheriting from [Object], not a built-in type such as [int], " +"[Vector2] or [Dictionary]." +msgstr "" + +#: modules/gdnative/doc_classes/GDNativeLibrary.xml:4 +msgid "" +"An external library containing functions or script classes to use in Godot." +msgstr "" + +#: modules/gdnative/doc_classes/GDNativeLibrary.xml:7 +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 [XRInterfaceGDNative]. The library must be compiled for each " +"platform and architecture that the project will run on." +msgstr "" + +#: modules/gdnative/doc_classes/GDNativeLibrary.xml:10 +msgid "" +"https://docs.godotengine.org/en/latest/tutorials/plugins/gdnative/gdnative-c-" +"example.html" +msgstr "" + +#: modules/gdnative/doc_classes/GDNativeLibrary.xml:11 +msgid "" +"https://docs.godotengine.org/en/latest/tutorials/plugins/gdnative/gdnative-" +"cpp-example.html" +msgstr "" + +#: modules/gdnative/doc_classes/GDNativeLibrary.xml:18 +msgid "" +"Returns paths to all dependency libraries for the current platform and " +"architecture." +msgstr "" + +#: modules/gdnative/doc_classes/GDNativeLibrary.xml:25 +msgid "" +"Returns the path to the dynamic library file for the current platform and " +"architecture." +msgstr "" + +#: modules/gdnative/doc_classes/GDNativeLibrary.xml:31 +msgid "" +"This resource in INI-style [ConfigFile] format, as in [code].gdnlib[/code] " +"files." +msgstr "" + +#: modules/gdnative/doc_classes/GDNativeLibrary.xml:34 +msgid "" +"If [code]true[/code], Godot loads only one copy of the library and each " +"script that references the library will share static data like static or " +"global variables.\n" +"If [code]false[/code], Godot loads a separate copy of the library into " +"memory for each script that references it." +msgstr "" + +#: modules/gdnative/doc_classes/GDNativeLibrary.xml:38 +msgid "" +"If [code]true[/code], the editor will temporarily unload the library " +"whenever the user switches away from the editor window, allowing the user to " +"recompile the library without restarting Godot.\n" +"[b]Note:[/b] If the library defines tool scripts that run inside the editor, " +"[code]reloadable[/code] must be [code]false[/code]. Otherwise, the editor " +"will attempt to unload the tool scripts while they're in use and crash." +msgstr "" + +#: modules/gdnative/doc_classes/GDNativeLibrary.xml:42 +msgid "" +"If [code]true[/code], Godot loads the library at startup rather than the " +"first time a script uses the library, calling [code]{prefix}" +"gdnative_singleton[/code] after initializing the library (where [code]" +"{prefix}[/code] is the value of [member symbol_prefix]). The library remains " +"loaded as long as Godot is running.\n" +"[b]Note:[/b] A singleton library cannot be [member reloadable]." +msgstr "" + +#: modules/gdnative/doc_classes/GDNativeLibrary.xml:46 +msgid "" +"The prefix this library's entry point functions begin with. For example, a " +"GDNativeLibrary would declare its [code]gdnative_init[/code] function as " +"[code]godot_gdnative_init[/code] by default.\n" +"On platforms that require statically linking libraries (currently only iOS), " +"each library must have a different [code]symbol_prefix[/code]." +msgstr "" + +#: modules/gdscript/doc_classes/GDScript.xml:4 +msgid "A script implemented in the GDScript programming language." +msgstr "" + +#: modules/gdscript/doc_classes/GDScript.xml:7 +msgid "" +"A script implemented in the GDScript programming language. The script " +"extends the functionality of all objects that instance it.\n" +"[method new] creates a new instance of the script. [method Object." +"set_script] extends an existing object, if that object's class matches one " +"of the script's base classes." +msgstr "" + +#: modules/gdscript/doc_classes/GDScript.xml:11 +msgid "" +"https://docs.godotengine.org/en/latest/getting_started/scripting/gdscript/" +"index.html" +msgstr "" + +#: modules/gdscript/doc_classes/GDScript.xml:18 +msgid "Returns byte code for the script source code." +msgstr "" + +#: modules/gdscript/doc_classes/GDScript.xml:25 +msgid "" +"Returns a new instance of the script.\n" +"For example:\n" +"[codeblock]\n" +"var MyClass = load(\"myclass.gd\")\n" +"var instance = MyClass.new()\n" +"assert(instance.get_script() == MyClass)\n" +"[/codeblock]" +msgstr "" + +#: modules/gdscript/doc_classes/GDScriptFunctionState.xml:4 +msgid "State of a function call after yielding." +msgstr "" + +#: modules/gdscript/doc_classes/GDScriptFunctionState.xml:7 +msgid "" +"Calling [method @GDScript.yield] within a function will cause that function " +"to yield and return its current state as an object of this type. The yielded " +"function call can then be resumed later by calling [method resume] on this " +"state object." +msgstr "" + +#: modules/gdscript/doc_classes/GDScriptFunctionState.xml:18 +msgid "" +"Check whether the function call may be resumed. This is not the case if the " +"function state was already resumed.\n" +"If [code]extended_check[/code] is enabled, it also checks if the associated " +"script and object still exist. The extended check is done in debug mode as " +"part of [method GDScriptFunctionState.resume], but you can use this if you " +"know you may be trying to resume without knowing for sure the object and/or " +"script have survived up to that point." +msgstr "" + +#: modules/gdscript/doc_classes/GDScriptFunctionState.xml:28 +msgid "" +"Resume execution of the yielded function call.\n" +"If handed an argument, return the argument from the [method @GDScript.yield] " +"call in the yielded function call. You can pass e.g. an [Array] to hand " +"multiple arguments.\n" +"This function returns what the resumed function call returns, possibly " +"another function state if yielded again." +msgstr "" + +#: doc/classes/Generic6DOFJoint3D.xml:4 +msgid "" +"The generic 6-degrees-of-freedom joint can implement a variety of joint " +"types by locking certain axes' rotation or translation." +msgstr "" + +#: doc/classes/Generic6DOFJoint3D.xml:7 +msgid "" +"The first 3 DOF axes are linear axes, which represent translation of Bodies, " +"and the latter 3 DOF axes represent the angular motion. Each axis can be " +"either locked, or limited." +msgstr "" + +#: doc/classes/Generic6DOFJoint3D.xml:123 +msgid "" +"The amount of rotational damping across the X axis.\n" +"The lower, the longer an impulse from one side takes to travel to the other " +"side." +msgstr "" + +#: doc/classes/Generic6DOFJoint3D.xml:127 +msgid "If [code]true[/code], rotation across the X axis is limited." +msgstr "" + +#: doc/classes/Generic6DOFJoint3D.xml:130 +msgid "" +"When rotating across the X axis, this error tolerance factor defines how " +"much the correction gets slowed down. The lower, the slower." +msgstr "" + +#: doc/classes/Generic6DOFJoint3D.xml:133 +msgid "" +"The maximum amount of force that can occur, when rotating around the X axis." +msgstr "" + +#: doc/classes/Generic6DOFJoint3D.xml:136 +msgid "" +"The minimum rotation in negative direction to break loose and rotate around " +"the X axis." +msgstr "" + +#: doc/classes/Generic6DOFJoint3D.xml:139 +msgid "" +"The amount of rotational restitution across the X axis. The lower, the more " +"restitution occurs." +msgstr "" + +#: doc/classes/Generic6DOFJoint3D.xml:142 +msgid "The speed of all rotations across the X axis." +msgstr "" + +#: doc/classes/Generic6DOFJoint3D.xml:145 +msgid "" +"The minimum rotation in positive direction to break loose and rotate around " +"the X axis." +msgstr "" + +#: doc/classes/Generic6DOFJoint3D.xml:148 +msgid "" +"The amount of rotational damping across the Y axis. The lower, the more " +"dampening occurs." +msgstr "" + +#: doc/classes/Generic6DOFJoint3D.xml:151 +msgid "If [code]true[/code], rotation across the Y axis is limited." +msgstr "" + +#: doc/classes/Generic6DOFJoint3D.xml:154 +msgid "" +"When rotating across the Y axis, this error tolerance factor defines how " +"much the correction gets slowed down. The lower, the slower." +msgstr "" + +#: doc/classes/Generic6DOFJoint3D.xml:157 +msgid "" +"The maximum amount of force that can occur, when rotating around the Y axis." +msgstr "" + +#: doc/classes/Generic6DOFJoint3D.xml:160 +msgid "" +"The minimum rotation in negative direction to break loose and rotate around " +"the Y axis." +msgstr "" + +#: doc/classes/Generic6DOFJoint3D.xml:163 +msgid "" +"The amount of rotational restitution across the Y axis. The lower, the more " +"restitution occurs." +msgstr "" + +#: doc/classes/Generic6DOFJoint3D.xml:166 +msgid "The speed of all rotations across the Y axis." +msgstr "" + +#: doc/classes/Generic6DOFJoint3D.xml:169 +msgid "" +"The minimum rotation in positive direction to break loose and rotate around " +"the Y axis." +msgstr "" + +#: doc/classes/Generic6DOFJoint3D.xml:172 +msgid "" +"The amount of rotational damping across the Z axis. The lower, the more " +"dampening occurs." +msgstr "" + +#: doc/classes/Generic6DOFJoint3D.xml:175 +msgid "If [code]true[/code], rotation across the Z axis is limited." +msgstr "" + +#: doc/classes/Generic6DOFJoint3D.xml:178 +msgid "" +"When rotating across the Z axis, this error tolerance factor defines how " +"much the correction gets slowed down. The lower, the slower." +msgstr "" + +#: doc/classes/Generic6DOFJoint3D.xml:181 +msgid "" +"The maximum amount of force that can occur, when rotating around the Z axis." +msgstr "" + +#: doc/classes/Generic6DOFJoint3D.xml:184 +msgid "" +"The minimum rotation in negative direction to break loose and rotate around " +"the Z axis." +msgstr "" + +#: doc/classes/Generic6DOFJoint3D.xml:187 +msgid "" +"The amount of rotational restitution across the Z axis. The lower, the more " +"restitution occurs." +msgstr "" + +#: doc/classes/Generic6DOFJoint3D.xml:190 +msgid "The speed of all rotations across the Z axis." +msgstr "" + +#: doc/classes/Generic6DOFJoint3D.xml:193 +msgid "" +"The minimum rotation in positive direction to break loose and rotate around " +"the Z axis." +msgstr "" + +#: doc/classes/Generic6DOFJoint3D.xml:196 +msgid "If [code]true[/code], a rotating motor at the X axis is enabled." +msgstr "" + +#: doc/classes/Generic6DOFJoint3D.xml:199 +msgid "Maximum acceleration for the motor at the X axis." +msgstr "" + +#: doc/classes/Generic6DOFJoint3D.xml:202 +msgid "Target speed for the motor at the X axis." +msgstr "" + +#: doc/classes/Generic6DOFJoint3D.xml:205 +msgid "If [code]true[/code], a rotating motor at the Y axis is enabled." +msgstr "" + +#: doc/classes/Generic6DOFJoint3D.xml:208 +msgid "Maximum acceleration for the motor at the Y axis." +msgstr "" + +#: doc/classes/Generic6DOFJoint3D.xml:211 +msgid "Target speed for the motor at the Y axis." +msgstr "" + +#: doc/classes/Generic6DOFJoint3D.xml:214 +msgid "If [code]true[/code], a rotating motor at the Z axis is enabled." +msgstr "" + +#: doc/classes/Generic6DOFJoint3D.xml:217 +msgid "Maximum acceleration for the motor at the Z axis." +msgstr "" + +#: doc/classes/Generic6DOFJoint3D.xml:220 +msgid "Target speed for the motor at the Z axis." +msgstr "" + +#: doc/classes/Generic6DOFJoint3D.xml:247 +msgid "The amount of damping that happens at the X motion." +msgstr "" + +#: doc/classes/Generic6DOFJoint3D.xml:250 +msgid "If [code]true[/code], the linear motion across the X axis is limited." +msgstr "" + +#: doc/classes/Generic6DOFJoint3D.xml:253 +msgid "The minimum difference between the pivot points' X axis." +msgstr "" + +#: doc/classes/Generic6DOFJoint3D.xml:256 +msgid "" +"The amount of restitution on the X axis movement. The lower, the more " +"momentum gets lost." +msgstr "" + +#: doc/classes/Generic6DOFJoint3D.xml:259 +msgid "" +"A factor applied to the movement across the X axis. The lower, the slower " +"the movement." +msgstr "" + +#: doc/classes/Generic6DOFJoint3D.xml:262 +msgid "The maximum difference between the pivot points' X axis." +msgstr "" + +#: doc/classes/Generic6DOFJoint3D.xml:265 +msgid "The amount of damping that happens at the Y motion." +msgstr "" + +#: doc/classes/Generic6DOFJoint3D.xml:268 +msgid "If [code]true[/code], the linear motion across the Y axis is limited." +msgstr "" + +#: doc/classes/Generic6DOFJoint3D.xml:271 +msgid "The minimum difference between the pivot points' Y axis." +msgstr "" + +#: doc/classes/Generic6DOFJoint3D.xml:274 +msgid "" +"The amount of restitution on the Y axis movement. The lower, the more " +"momentum gets lost." +msgstr "" + +#: doc/classes/Generic6DOFJoint3D.xml:277 +msgid "" +"A factor applied to the movement across the Y axis. The lower, the slower " +"the movement." +msgstr "" + +#: doc/classes/Generic6DOFJoint3D.xml:280 +msgid "The maximum difference between the pivot points' Y axis." +msgstr "" + +#: doc/classes/Generic6DOFJoint3D.xml:283 +msgid "The amount of damping that happens at the Z motion." +msgstr "" + +#: doc/classes/Generic6DOFJoint3D.xml:286 +msgid "If [code]true[/code], the linear motion across the Z axis is limited." +msgstr "" + +#: doc/classes/Generic6DOFJoint3D.xml:289 +msgid "The minimum difference between the pivot points' Z axis." +msgstr "" + +#: doc/classes/Generic6DOFJoint3D.xml:292 +msgid "" +"The amount of restitution on the Z axis movement. The lower, the more " +"momentum gets lost." +msgstr "" + +#: doc/classes/Generic6DOFJoint3D.xml:295 +msgid "" +"A factor applied to the movement across the Z axis. The lower, the slower " +"the movement." +msgstr "" + +#: doc/classes/Generic6DOFJoint3D.xml:298 +msgid "The maximum difference between the pivot points' Z axis." +msgstr "" + +#: doc/classes/Generic6DOFJoint3D.xml:301 +msgid "" +"If [code]true[/code], then there is a linear motor on the X axis. It will " +"attempt to reach the target velocity while staying within the force limits." +msgstr "" + +#: doc/classes/Generic6DOFJoint3D.xml:304 +msgid "" +"The maximum force the linear motor can apply on the X axis while trying to " +"reach the target velocity." +msgstr "" + +#: doc/classes/Generic6DOFJoint3D.xml:307 +msgid "The speed that the linear motor will attempt to reach on the X axis." +msgstr "" + +#: doc/classes/Generic6DOFJoint3D.xml:310 +msgid "" +"If [code]true[/code], then there is a linear motor on the Y axis. It will " +"attempt to reach the target velocity while staying within the force limits." +msgstr "" + +#: doc/classes/Generic6DOFJoint3D.xml:313 +msgid "" +"The maximum force the linear motor can apply on the Y axis while trying to " +"reach the target velocity." +msgstr "" + +#: doc/classes/Generic6DOFJoint3D.xml:316 +msgid "The speed that the linear motor will attempt to reach on the Y axis." +msgstr "" + +#: doc/classes/Generic6DOFJoint3D.xml:319 +msgid "" +"If [code]true[/code], then there is a linear motor on the Z axis. It will " +"attempt to reach the target velocity while staying within the force limits." +msgstr "" + +#: doc/classes/Generic6DOFJoint3D.xml:322 +msgid "" +"The maximum force the linear motor can apply on the Z axis while trying to " +"reach the target velocity." +msgstr "" + +#: doc/classes/Generic6DOFJoint3D.xml:325 +msgid "The speed that the linear motor will attempt to reach on the Z axis." +msgstr "" + +#: doc/classes/Generic6DOFJoint3D.xml:356 doc/classes/PhysicsServer3D.xml:1410 +msgid "The minimum difference between the pivot points' axes." +msgstr "" + +#: doc/classes/Generic6DOFJoint3D.xml:359 doc/classes/PhysicsServer3D.xml:1413 +msgid "The maximum difference between the pivot points' axes." +msgstr "" + +#: doc/classes/Generic6DOFJoint3D.xml:362 +msgid "" +"A factor applied to the movement across the axes. The lower, the slower the " +"movement." +msgstr "" + +#: doc/classes/Generic6DOFJoint3D.xml:365 +msgid "" +"The amount of restitution on the axes' movement. The lower, the more " +"momentum gets lost." +msgstr "" + +#: doc/classes/Generic6DOFJoint3D.xml:368 doc/classes/PhysicsServer3D.xml:1422 +msgid "" +"The amount of damping that happens at the linear motion across the axes." +msgstr "" + +#: doc/classes/Generic6DOFJoint3D.xml:371 +msgid "The velocity the linear motor will try to reach." +msgstr "" + +#: doc/classes/Generic6DOFJoint3D.xml:374 +msgid "" +"The maximum force the linear motor will apply while trying to reach the " +"velocity target." +msgstr "" + +#: doc/classes/Generic6DOFJoint3D.xml:377 doc/classes/PhysicsServer3D.xml:1431 +msgid "" +"The minimum rotation in negative direction to break loose and rotate around " +"the axes." +msgstr "" + +#: doc/classes/Generic6DOFJoint3D.xml:380 doc/classes/PhysicsServer3D.xml:1434 +msgid "" +"The minimum rotation in positive direction to break loose and rotate around " +"the axes." +msgstr "" + +#: doc/classes/Generic6DOFJoint3D.xml:383 +msgid "The speed of all rotations across the axes." +msgstr "" + +#: doc/classes/Generic6DOFJoint3D.xml:386 doc/classes/PhysicsServer3D.xml:1440 +msgid "" +"The amount of rotational damping across the axes. The lower, the more " +"dampening occurs." +msgstr "" + +#: doc/classes/Generic6DOFJoint3D.xml:389 doc/classes/PhysicsServer3D.xml:1443 +msgid "" +"The amount of rotational restitution across the axes. The lower, the more " +"restitution occurs." +msgstr "" + +#: doc/classes/Generic6DOFJoint3D.xml:392 doc/classes/PhysicsServer3D.xml:1446 +msgid "" +"The maximum amount of force that can occur, when rotating around the axes." +msgstr "" + +#: doc/classes/Generic6DOFJoint3D.xml:395 +msgid "" +"When rotating across the axes, this error tolerance factor defines how much " +"the correction gets slowed down. The lower, the slower." +msgstr "" + +#: doc/classes/Generic6DOFJoint3D.xml:398 doc/classes/PhysicsServer3D.xml:1452 +msgid "Target speed for the motor at the axes." +msgstr "" + +#: doc/classes/Generic6DOFJoint3D.xml:401 doc/classes/PhysicsServer3D.xml:1455 +msgid "Maximum acceleration for the motor at the axes." +msgstr "" + +#: doc/classes/Generic6DOFJoint3D.xml:407 +msgid "If enabled, linear motion is possible within the given limits." +msgstr "" + +#: doc/classes/Generic6DOFJoint3D.xml:410 +msgid "If enabled, rotational motion is possible within the given limits." +msgstr "" + +#: doc/classes/Generic6DOFJoint3D.xml:417 +msgid "If enabled, there is a rotational motor across these axes." +msgstr "" + +#: doc/classes/Generic6DOFJoint3D.xml:420 +msgid "If enabled, there is a linear motor across these axes." +msgstr "" + +#: doc/classes/Generic6DOFJoint3D.xml:423 doc/classes/HingeJoint3D.xml:118 +msgid "Represents the size of the [enum Flag] enum." +msgstr "" + +#: doc/classes/Geometry.xml:4 +msgid "Helper node to calculate generic geometry operations." +msgstr "" + +#: doc/classes/Geometry.xml:7 +msgid "" +"Geometry provides users with a set of helper functions to create geometric " +"shapes, compute intersections between shapes, and process various other " +"geometric operations." +msgstr "" + +#: doc/classes/Geometry.xml:18 +msgid "" +"Returns an array with 6 [Plane]s that describe the sides of a box centered " +"at the origin. The box size is defined by [code]extents[/code], which " +"represents one (positive) corner of the box (i.e. half its actual size)." +msgstr "" + +#: doc/classes/Geometry.xml:35 +msgid "" +"Returns an array of [Plane]s closely bounding a faceted capsule centered at " +"the origin with radius [code]radius[/code] and height [code]height[/code]. " +"The parameter [code]sides[/code] defines how many planes will be generated " +"for the side part of the capsule, whereas [code]lats[/code] gives the number " +"of latitudinal steps at the bottom and top of the capsule. The parameter " +"[code]axis[/code] describes the axis along which the capsule is oriented (0 " +"for X, 1 for Y, 2 for Z)." +msgstr "" + +#: doc/classes/Geometry.xml:50 +msgid "" +"Returns an array of [Plane]s closely bounding a faceted cylinder centered at " +"the origin with radius [code]radius[/code] and height [code]height[/code]. " +"The parameter [code]sides[/code] defines how many planes will be generated " +"for the round part of the cylinder. The parameter [code]axis[/code] " +"describes the axis along which the cylinder is oriented (0 for X, 1 for Y, 2 " +"for Z)." +msgstr "" + +#: doc/classes/Geometry.xml:61 +msgid "" +"Clips the polygon defined by the points in [code]points[/code] against the " +"[code]plane[/code] and returns the points of the clipped polygon." +msgstr "" + +#: doc/classes/Geometry.xml:72 +msgid "" +"Clips [code]polygon_a[/code] against [code]polygon_b[/code] and returns an " +"array of clipped polygons. This performs [constant OPERATION_DIFFERENCE] " +"between polygons. Returns an empty array if [code]polygon_b[/code] " +"completely overlaps [code]polygon_a[/code].\n" +"If [code]polygon_b[/code] is enclosed by [code]polygon_a[/code], returns an " +"outer polygon (boundary) and inner polygon (hole) which could be " +"distinguished by calling [method is_polygon_clockwise]." +msgstr "" + +#: doc/classes/Geometry.xml:84 +msgid "" +"Clips [code]polyline[/code] against [code]polygon[/code] and returns an " +"array of clipped polylines. This performs [constant OPERATION_DIFFERENCE] " +"between the polyline and the polygon. This operation can be thought of as " +"cutting a line with a closed shape." +msgstr "" + +#: doc/classes/Geometry.xml:93 +msgid "" +"Given an array of [Vector2]s, returns the convex hull as a list of points in " +"counterclockwise order. The last point is the same as the first one." +msgstr "" + +#: doc/classes/Geometry.xml:104 +msgid "" +"Mutually excludes common area defined by intersection of [code]polygon_a[/" +"code] and [code]polygon_b[/code] (see [method intersect_polygons_2d]) and " +"returns an array of excluded polygons. This performs [constant " +"OPERATION_XOR] between polygons. In other words, returns all but common area " +"between polygons.\n" +"The operation may result in an outer polygon (boundary) and inner polygon " +"(hole) produced which could be distinguished by calling [method " +"is_polygon_clockwise]." +msgstr "" + +#: doc/classes/Geometry.xml:118 +msgid "" +"Returns the 3D point on the 3D segment ([code]s1[/code], [code]s2[/code]) " +"that is closest to [code]point[/code]. The returned point will always be " +"inside the specified segment." +msgstr "" + +#: doc/classes/Geometry.xml:131 +msgid "" +"Returns the 2D point on the 2D segment ([code]s1[/code], [code]s2[/code]) " +"that is closest to [code]point[/code]. The returned point will always be " +"inside the specified segment." +msgstr "" + +#: doc/classes/Geometry.xml:144 +msgid "" +"Returns the 3D point on the 3D line defined by ([code]s1[/code], [code]s2[/" +"code]) that is closest to [code]point[/code]. The returned point can be " +"inside the segment ([code]s1[/code], [code]s2[/code]) or outside of it, i.e. " +"somewhere on the line extending from the segment." +msgstr "" + +#: doc/classes/Geometry.xml:157 +msgid "" +"Returns the 2D point on the 2D line defined by ([code]s1[/code], [code]s2[/" +"code]) that is closest to [code]point[/code]. The returned point can be " +"inside the segment ([code]s1[/code], [code]s2[/code]) or outside of it, i.e. " +"somewhere on the line extending from the segment." +msgstr "" + +#: doc/classes/Geometry.xml:172 +msgid "" +"Given the two 3D segments ([code]p1[/code], [code]p2[/code]) and ([code]q1[/" +"code], [code]q2[/code]), finds those two points on the two segments that are " +"closest to each other. Returns a [PackedVector3Array] that contains this " +"point on ([code]p1[/code], [code]p2[/code]) as well the accompanying point " +"on ([code]q1[/code], [code]q2[/code])." +msgstr "" + +#: doc/classes/Geometry.xml:187 +msgid "" +"Given the two 2D segments ([code]p1[/code], [code]p2[/code]) and ([code]q1[/" +"code], [code]q2[/code]), finds those two points on the two segments that are " +"closest to each other. Returns a [PackedVector2Array] that contains this " +"point on ([code]p1[/code], [code]p2[/code]) as well the accompanying point " +"on ([code]q1[/code], [code]q2[/code])." +msgstr "" + +#: doc/classes/Geometry.xml:196 +msgid "Used internally by the engine." +msgstr "" + +#: doc/classes/Geometry.xml:207 +msgid "" +"Intersects [code]polygon_a[/code] with [code]polygon_b[/code] and returns an " +"array of intersected polygons. This performs [constant " +"OPERATION_INTERSECTION] between polygons. In other words, returns common " +"area shared by polygons. Returns an empty array if no intersection occurs.\n" +"The operation may result in an outer polygon (boundary) and inner polygon " +"(hole) produced which could be distinguished by calling [method " +"is_polygon_clockwise]." +msgstr "" + +#: doc/classes/Geometry.xml:219 +msgid "" +"Intersects [code]polyline[/code] with [code]polygon[/code] and returns an " +"array of intersected polylines. This performs [constant " +"OPERATION_INTERSECTION] between the polyline and the polygon. This operation " +"can be thought of as chopping a line with a closed shape." +msgstr "" + +#: doc/classes/Geometry.xml:232 +msgid "" +"Returns [code]true[/code] if [code]point[/code] is inside the circle or if " +"it's located exactly [i]on[/i] the circle's boundary, otherwise returns " +"[code]false[/code]." +msgstr "" + +#: doc/classes/Geometry.xml:243 +msgid "" +"Returns [code]true[/code] if [code]point[/code] is inside [code]polygon[/" +"code] or if it's located exactly [i]on[/i] polygon's boundary, otherwise " +"returns [code]false[/code]." +msgstr "" + +#: doc/classes/Geometry.xml:252 +msgid "" +"Returns [code]true[/code] if [code]polygon[/code]'s vertices are ordered in " +"clockwise order, otherwise returns [code]false[/code]." +msgstr "" + +#: doc/classes/Geometry.xml:267 +msgid "" +"Checks if the two lines ([code]from_a[/code], [code]dir_a[/code]) and " +"([code]from_b[/code], [code]dir_b[/code]) intersect. If yes, return the " +"point of intersection as [Vector2]. If no intersection takes place, returns " +"an empty [Variant].\n" +"[b]Note:[/b] The lines are specified using direction vectors, not end points." +msgstr "" + +#: doc/classes/Geometry.xml:277 +msgid "" +"Given an array of [Vector2]s representing tiles, builds an atlas. The " +"returned dictionary has two keys: [code]points[/code] is a vector of " +"[Vector2] that specifies the positions of each tile, [code]size[/code] " +"contains the overall size of the whole atlas as [Vector2]." +msgstr "" + +#: doc/classes/Geometry.xml:288 +msgid "" +"Merges (combines) [code]polygon_a[/code] and [code]polygon_b[/code] and " +"returns an array of merged polygons. This performs [constant " +"OPERATION_UNION] between polygons.\n" +"The operation may result in an outer polygon (boundary) and inner polygon " +"(hole) produced which could be distinguished by calling [method " +"is_polygon_clockwise]." +msgstr "" + +#: doc/classes/Geometry.xml:302 +msgid "" +"Inflates or deflates [code]polygon[/code] by [code]delta[/code] units " +"(pixels). If [code]delta[/code] is positive, makes the polygon grow outward. " +"If [code]delta[/code] is negative, shrinks the polygon inward. Returns an " +"array of polygons because inflating/deflating may result in multiple " +"discrete polygons. Returns an empty array if [code]delta[/code] is negative " +"and the absolute value of it approximately exceeds the minimum bounding " +"rectangle dimensions of the polygon.\n" +"Each polygon's vertices will be rounded as determined by [code]join_type[/" +"code], see [enum PolyJoinType].\n" +"The operation may result in an outer polygon (boundary) and inner polygon " +"(hole) produced which could be distinguished by calling [method " +"is_polygon_clockwise]." +msgstr "" + +#: doc/classes/Geometry.xml:319 +msgid "" +"Inflates or deflates [code]polyline[/code] by [code]delta[/code] units " +"(pixels), producing polygons. If [code]delta[/code] is positive, makes the " +"polyline grow outward. Returns an array of polygons because inflating/" +"deflating may result in multiple discrete polygons. If [code]delta[/code] is " +"negative, returns an empty array.\n" +"Each polygon's vertices will be rounded as determined by [code]join_type[/" +"code], see [enum PolyJoinType].\n" +"Each polygon's endpoints will be rounded as determined by [code]end_type[/" +"code], see [enum PolyEndType].\n" +"The operation may result in an outer polygon (boundary) and inner polygon " +"(hole) produced which could be distinguished by calling [method " +"is_polygon_clockwise]." +msgstr "" + +#: doc/classes/Geometry.xml:337 +msgid "" +"Returns if [code]point[/code] is inside the triangle specified by [code]a[/" +"code], [code]b[/code] and [code]c[/code]." +msgstr "" + +#: doc/classes/Geometry.xml:354 +msgid "" +"Tests if the 3D ray starting at [code]from[/code] with the direction of " +"[code]dir[/code] intersects the triangle specified by [code]a[/code], " +"[code]b[/code] and [code]c[/code]. If yes, returns the point of intersection " +"as [Vector3]. If no intersection takes place, an empty [Variant] is returned." +msgstr "" + +#: doc/classes/Geometry.xml:369 +msgid "" +"Given the 2D segment ([code]segment_from[/code], [code]segment_to[/code]), " +"returns the position on the segment (as a number between 0 and 1) at which " +"the segment hits the circle that is located at position " +"[code]circle_position[/code] and has radius [code]circle_radius[/code]. If " +"the segment does not intersect the circle, -1 is returned (this is also the " +"case if the line extending the segment would intersect the circle, but the " +"segment does not)." +msgstr "" + +#: doc/classes/Geometry.xml:382 +msgid "" +"Given a convex hull defined though the [Plane]s in the array [code]planes[/" +"code], tests if the segment ([code]from[/code], [code]to[/code]) intersects " +"with that hull. If an intersection is found, returns a [PackedVector3Array] " +"containing the point the intersection and the hull's normal. If no " +"intersecion is found, an the returned array is empty." +msgstr "" + +#: doc/classes/Geometry.xml:397 +msgid "" +"Checks if the segment ([code]from[/code], [code]to[/code]) intersects the " +"cylinder with height [code]height[/code] that is centered at the origin and " +"has radius [code]radius[/code]. If no, returns an empty " +"[PackedVector3Array]. If an intersection takes place, the returned array " +"contains the point of intersection and the cylinder's normal at the point of " +"intersection." +msgstr "" + +#: doc/classes/Geometry.xml:412 +msgid "" +"Checks if the two segments ([code]from_a[/code], [code]to_a[/code]) and " +"([code]from_b[/code], [code]to_b[/code]) intersect. If yes, return the point " +"of intersection as [Vector2]. If no intersection takes place, returns an " +"empty [Variant]." +msgstr "" + +#: doc/classes/Geometry.xml:427 +msgid "" +"Checks if the segment ([code]from[/code], [code]to[/code]) intersects the " +"sphere that is located at [code]sphere_position[/code] and has radius " +"[code]sphere_radius[/code]. If no, returns an empty [PackedVector3Array]. If " +"yes, returns a [PackedVector3Array] containing the point of intersection and " +"the sphere's normal at the point of intersection." +msgstr "" + +#: doc/classes/Geometry.xml:444 +msgid "" +"Tests if the segment ([code]from[/code], [code]to[/code]) intersects the " +"triangle [code]a[/code], [code]b[/code], [code]c[/code]. If yes, returns the " +"point of intersection as [Vector3]. If no intersection takes place, an empty " +"[Variant] is returned." +msgstr "" + +#: doc/classes/Geometry.xml:453 +msgid "" +"Triangulates the area specified by discrete set of [code]points[/code] such " +"that no point is inside the circumcircle of any resulting triangle. Returns " +"a [PackedInt32Array] where each triangle consists of three consecutive point " +"indices into [code]points[/code] (i.e. the returned array will have [code]n " +"* 3[/code] elements, with [code]n[/code] being the number of found " +"triangles). If the triangulation did not succeed, an empty " +"[PackedInt32Array] is returned." +msgstr "" + +#: doc/classes/Geometry.xml:462 +msgid "" +"Triangulates the polygon specified by the points in [code]polygon[/code]. " +"Returns a [PackedInt32Array] where each triangle consists of three " +"consecutive point indices into [code]polygon[/code] (i.e. the returned array " +"will have [code]n * 3[/code] elements, with [code]n[/code] being the number " +"of found triangles). If the triangulation did not succeed, an empty " +"[PackedInt32Array] is returned." +msgstr "" + +#: doc/classes/Geometry.xml:468 +msgid "" +"Create regions where either subject or clip polygons (or both) are filled." +msgstr "" + +#: doc/classes/Geometry.xml:471 +msgid "" +"Create regions where subject polygons are filled except where clip polygons " +"are filled." +msgstr "" + +#: doc/classes/Geometry.xml:474 +msgid "Create regions where both subject and clip polygons are filled." +msgstr "" + +#: doc/classes/Geometry.xml:477 +msgid "" +"Create regions where either subject or clip polygons are filled but not " +"where both are filled." +msgstr "" + +#: doc/classes/Geometry.xml:480 +msgid "" +"Squaring is applied uniformally at all convex edge joins at [code]1 * delta[/" +"code]." +msgstr "" + +#: doc/classes/Geometry.xml:483 +msgid "" +"While flattened paths can never perfectly trace an arc, they are " +"approximated by a series of arc chords." +msgstr "" + +#: doc/classes/Geometry.xml:486 +msgid "" +"There's a necessary limit to mitered joins since offsetting edges that join " +"at very acute angles will produce excessively long and narrow \"spikes\". " +"For any given edge join, when miter offsetting would exceed that maximum " +"distance, \"square\" joining is applied." +msgstr "" + +#: doc/classes/Geometry.xml:489 +msgid "" +"Endpoints are joined using the [enum PolyJoinType] value and the path filled " +"as a polygon." +msgstr "" + +#: doc/classes/Geometry.xml:492 +msgid "" +"Endpoints are joined using the [enum PolyJoinType] value and the path filled " +"as a polyline." +msgstr "" + +#: doc/classes/Geometry.xml:495 +msgid "Endpoints are squared off with no extension." +msgstr "" + +#: doc/classes/Geometry.xml:498 +msgid "Endpoints are squared off and extended by [code]delta[/code] units." +msgstr "" + +#: doc/classes/Geometry.xml:501 +msgid "Endpoints are rounded off and extended by [code]delta[/code] units." +msgstr "" + +#: doc/classes/GeometryInstance3D.xml:4 +msgid "Base node for geometry-based visual instances." +msgstr "" + +#: doc/classes/GeometryInstance3D.xml:7 +msgid "" +"Base node for geometry-based visual instances. Shares some common " +"functionality like visibility and custom materials." +msgstr "" + +#: doc/classes/GeometryInstance3D.xml:18 +msgid "" +"Returns the [enum GeometryInstance3D.Flags] that have been set for this " +"object." +msgstr "" + +#: 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:46 +msgid "" +"Sets the [enum GeometryInstance3D.Flags] specified. See [enum " +"GeometryInstance3D.Flags] for options." +msgstr "" + +#: doc/classes/GeometryInstance3D.xml:62 +msgid "" +"The selected shadow casting flag. See [enum ShadowCastingSetting] for " +"possible values." +msgstr "" + +#: 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:68 +msgid "" +"The GeometryInstance3D's max LOD distance.\n" +"[b]Note:[/b] This property currently has no effect." +msgstr "" + +#: 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:76 +msgid "" +"The GeometryInstance3D's min LOD distance.\n" +"[b]Note:[/b] This property currently has no effect." +msgstr "" + +#: 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: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:90 +msgid "" +"If [code]true[/code], this GeometryInstance3D will be used when baking " +"lights using a [GIProbe]." +msgstr "" + +#: doc/classes/GeometryInstance3D.xml:95 +msgid "Will not cast any shadows." +msgstr "" + +#: 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: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: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:110 +msgid "" +"Will allow the GeometryInstance3D to be used when baking lights using a " +"[GIProbe]." +msgstr "" + +#: doc/classes/GeometryInstance3D.xml:115 +msgid "" +"Unused in this class, exposed for consistency with [enum RenderingServer." +"InstanceFlags]." +msgstr "" + +#: doc/classes/GIProbe.xml:4 +msgid "Real-time global illumination (GI) probe." +msgstr "" + +#: doc/classes/GIProbe.xml:7 +msgid "" +"[GIProbe]s are used to provide high-quality real-time indirect light to " +"scenes. They precompute the effect of objects that emit light and the effect " +"of static geometry to simulate the behavior of complex light in real-time. " +"[GIProbe]s need to be baked before using, however, once baked, dynamic " +"objects will receive light from them. Further, lights can be fully dynamic " +"or baked.\n" +"Having [GIProbe]s in a scene can be expensive, the quality of the probe can " +"be turned down in exchange for better performance in the [ProjectSettings] " +"using [member ProjectSettings.rendering/quality/gi_probes/quality]." +msgstr "" + +#: doc/classes/GIProbe.xml:11 +msgid "https://docs.godotengine.org/en/latest/tutorials/3d/gi_probes.html" +msgstr "" + +#: doc/classes/GIProbe.xml:22 +msgid "" +"Bakes the effect from all [GeometryInstance3D]s marked with [member " +"GeometryInstance3D.use_in_baked_light] and [Light3D]s marked with either " +"[constant Light3D.BAKE_INDIRECT] or [constant Light3D.BAKE_ALL]. If " +"[code]create_visual_debug[/code] is [code]true[/code], after baking the " +"light, this will generate a [MultiMesh] that has a cube representing each " +"solid cell with each cube colored to the cell's albedo color. This can be " +"used to visualize the [GIProbe]'s data and debug any issues that may be " +"occurring." +msgstr "" + +#: doc/classes/GIProbe.xml:29 +msgid "Calls [method bake] with [code]create_visual_debug[/code] enabled." +msgstr "" + +#: doc/classes/GIProbe.xml:35 +msgid "The [GIProbeData] resource that holds the data for this [GIProbe]." +msgstr "" + +#: doc/classes/GIProbe.xml:38 +msgid "" +"The size of the area covered by the [GIProbe]. If you make the extents " +"larger without increasing the subdivisions with [member subdiv], the size of " +"each cell will increase and result in lower detailed lighting." +msgstr "" + +#: doc/classes/GIProbe.xml:41 +msgid "" +"Number of times to subdivide the grid that the [GIProbe] operates on. A " +"higher number results in finer detail and thus higher visual quality, while " +"lower numbers result in better performance." +msgstr "" + +#: doc/classes/GIProbe.xml:46 +msgid "" +"Use 64 subdivisions. This is the lowest quality setting, but the fastest. " +"Use it if you can, but especially use it on lower-end hardware." +msgstr "" + +#: doc/classes/GIProbe.xml:49 +msgid "Use 128 subdivisions. This is the default quality setting." +msgstr "" + +#: doc/classes/GIProbe.xml:52 +msgid "Use 256 subdivisions." +msgstr "" + +#: doc/classes/GIProbe.xml:55 +msgid "" +"Use 512 subdivisions. This is the highest quality setting, but the slowest. " +"On lower-end hardware this could cause the GPU to stall." +msgstr "" + +#: doc/classes/GIProbe.xml:58 +msgid "Represents the size of the [enum Subdiv] enum." +msgstr "" + +#: modules/mono/doc_classes/GodotSharp.xml:14 +msgid "Attaches the current thread to the mono runtime." +msgstr "" + +#: modules/mono/doc_classes/GodotSharp.xml:21 +msgid "Detaches the current thread from the mono runtime." +msgstr "" + +#: modules/mono/doc_classes/GodotSharp.xml:42 +msgid "Returns whether the domain is being finalized." +msgstr "" + +#: modules/mono/doc_classes/GodotSharp.xml:61 +msgid "Returns whether the scripts domain is loaded." +msgstr "" + +#: doc/classes/GPUParticles2D.xml:4 +msgid "2D particle emitter." +msgstr "" + +#: doc/classes/GPUParticles2D.xml:7 +msgid "" +"2D particle node used to create a variety of particle systems and effects. " +"[GPUParticles2D] features an emitter that generates some number of particles " +"at a given rate.\n" +"Use the [code]process_material[/code] property to add a [ParticlesMaterial] " +"to configure particle appearance and behavior. Alternatively, you can add a " +"[ShaderMaterial] which will be applied to all particles." +msgstr "" + +#: doc/classes/GPUParticles2D.xml:18 +msgid "Returns a rectangle containing the positions of all existing particles." +msgstr "" + +#: doc/classes/GPUParticles2D.xml:25 +msgid "Restarts all the existing particles." +msgstr "" + +#: doc/classes/GPUParticles2D.xml:64 doc/classes/GPUParticles3D.xml:96 +msgid "" +"[Material] for processing particles. Can be a [ParticlesMaterial] or a " +"[ShaderMaterial]." +msgstr "" + +#: doc/classes/GPUParticles2D.xml:76 +msgid "Editor visibility helper." +msgstr "" + +#: doc/classes/GPUParticles3D.xml:4 +msgid "3D particle emitter." +msgstr "" + +#: doc/classes/GPUParticles3D.xml:7 +msgid "" +"3D particle node used to create a variety of particle systems and effects. " +"[GPUParticles3D] features an emitter that generates some number of particles " +"at a given rate.\n" +"Use the [code]process_material[/code] property to add a [ParticlesMaterial] " +"to configure particle appearance and behavior. Alternatively, you can add a " +"[ShaderMaterial] which will be applied to all particles." +msgstr "" + +#: doc/classes/GPUParticles3D.xml:11 +msgid "" +"https://docs.godotengine.org/en/latest/tutorials/3d/vertex_animation/" +"controlling_thousands_of_fish.html" +msgstr "" + +#: doc/classes/GPUParticles3D.xml:18 +msgid "" +"Returns the axis-aligned bounding box that contains all the particles that " +"are active in the current frame." +msgstr "" + +#: doc/classes/GPUParticles3D.xml:27 +msgid "Returns the [Mesh] that is drawn at index [code]pass[/code]." +msgstr "" + +#: doc/classes/GPUParticles3D.xml:34 +msgid "Restarts the particle emission, clearing existing particles." +msgstr "" + +#: doc/classes/GPUParticles3D.xml:45 +msgid "Sets the [Mesh] that is drawn at index [code]pass[/code]." +msgstr "" + +#: doc/classes/GPUParticles3D.xml:51 +msgid "Number of particles to emit." +msgstr "" + +#: doc/classes/GPUParticles3D.xml:57 +msgid "[Mesh] that is drawn for the first draw pass." +msgstr "" + +#: doc/classes/GPUParticles3D.xml:60 +msgid "[Mesh] that is drawn for the second draw pass." +msgstr "" + +#: doc/classes/GPUParticles3D.xml:63 +msgid "[Mesh] that is drawn for the third draw pass." +msgstr "" + +#: doc/classes/GPUParticles3D.xml:66 +msgid "[Mesh] that is drawn for the fourth draw pass." +msgstr "" + +#: doc/classes/GPUParticles3D.xml:69 +msgid "The number of draw passes when rendering particles." +msgstr "" + +#: doc/classes/GPUParticles3D.xml:75 +msgid "" +"Time ratio between each emission. If [code]0[/code], particles are emitted " +"continuously. If [code]1[/code], all particles are emitted simultaneously." +msgstr "" + +#: doc/classes/GPUParticles3D.xml:90 +msgid "" +"If [code]true[/code], only [code]amount[/code] particles will be emitted." +msgstr "" + +#: doc/classes/GPUParticles3D.xml:93 +msgid "" +"Amount of time to preprocess the particles before animation starts. Lets you " +"start the animation some time after particles have started emitting." +msgstr "" + +#: doc/classes/GPUParticles3D.xml:99 +msgid "Emission randomness ratio." +msgstr "" + +#: doc/classes/GPUParticles3D.xml:102 +msgid "" +"Speed scaling ratio. A value of [code]0[/code] can be used to pause the " +"particles." +msgstr "" + +#: doc/classes/GPUParticles3D.xml:105 +msgid "" +"The [AABB] that determines the area of the world part of which needs to be " +"visible on screen for the particle system to be active." +msgstr "" + +#: doc/classes/GPUParticles3D.xml:119 +msgid "Maximum number of draw passes supported." +msgstr "" + +#: doc/classes/Gradient.xml:4 +msgid "" +"A color interpolator resource which can be used to generate colors between " +"user-defined color points." +msgstr "" + +#: doc/classes/Gradient.xml:7 +msgid "" +"Given a set of colors, this resource will interpolate them in order. This " +"means that if you have color 1, color 2 and color 3, the ramp will " +"interpolate from color 1 to color 2 and from color 2 to color 3. The ramp " +"will initially have 2 colors (black and white), one (black) at ramp lower " +"offset 0 and the other (white) at the ramp higher offset 1." +msgstr "" + +#: doc/classes/Gradient.xml:20 +msgid "" +"Adds the specified color to the end of the ramp, with the specified offset." +msgstr "" + +#: doc/classes/Gradient.xml:29 +msgid "Returns the color of the ramp color at index [code]point[/code]." +msgstr "" + +#: doc/classes/Gradient.xml:38 +msgid "Returns the offset of the ramp color at index [code]point[/code]." +msgstr "" + +#: doc/classes/Gradient.xml:45 +msgid "Returns the number of colors in the ramp." +msgstr "" + +#: doc/classes/Gradient.xml:54 +msgid "Returns the interpolated color specified by [code]offset[/code]." +msgstr "" + +#: doc/classes/Gradient.xml:63 +msgid "Removes the color at the index [code]offset[/code]." +msgstr "" + +#: doc/classes/Gradient.xml:74 +msgid "Sets the color of the ramp color at index [code]point[/code]." +msgstr "" + +#: doc/classes/Gradient.xml:85 +msgid "Sets the offset for the ramp color at index [code]point[/code]." +msgstr "" + +#: doc/classes/Gradient.xml:91 +msgid "Gradient's colors returned as a [PackedColorArray]." +msgstr "" + +#: doc/classes/Gradient.xml:94 +msgid "Gradient's offsets returned as a [PackedFloat32Array]." +msgstr "" + +#: doc/classes/GradientTexture.xml:4 +msgid "Gradient-filled texture." +msgstr "" + +#: doc/classes/GradientTexture.xml:7 +msgid "" +"GradientTexture uses a [Gradient] to fill the texture data. The gradient " +"will be filled from left to right using colors obtained from the gradient. " +"This means the texture does not necessarily represent an exact copy of the " +"gradient, but instead an interpolation of samples obtained from the gradient " +"at fixed steps (see [member width])." +msgstr "" + +#: doc/classes/GradientTexture.xml:15 +msgid "The [Gradient] that will be used to fill the texture." +msgstr "" + +#: doc/classes/GradientTexture.xml:18 +msgid "The number of color samples that will be obtained from the [Gradient]." +msgstr "" + +#: doc/classes/GraphEdit.xml:4 +msgid "" +"GraphEdit is an area capable of showing various GraphNodes. It manages " +"connection events between them." +msgstr "" + +#: doc/classes/GraphEdit.xml:7 +msgid "" +"GraphEdit manages the showing of GraphNodes it contains, as well as " +"connections and disconnections between them. Signals are sent for each of " +"these two events. Disconnection between GraphNode slots is disabled by " +"default.\n" +"It is greatly advised to enable low-processor usage mode (see [member OS." +"low_processor_usage_mode]) when using GraphEdits." +msgstr "" + +#: doc/classes/GraphEdit.xml:21 +msgid "" +"Makes possible the connection between two different slot types. The type is " +"defined with the [method GraphNode.set_slot] method." +msgstr "" + +#: doc/classes/GraphEdit.xml:30 +msgid "" +"Makes possible to disconnect nodes when dragging from the slot at the left " +"if it has the specified type." +msgstr "" + +#: doc/classes/GraphEdit.xml:39 +msgid "" +"Makes possible to disconnect nodes when dragging from the slot at the right " +"if it has the specified type." +msgstr "" + +#: doc/classes/GraphEdit.xml:46 +msgid "Removes all connections between nodes." +msgstr "" + +#: doc/classes/GraphEdit.xml:61 +msgid "" +"Create a connection between the [code]from_port[/code] slot of the " +"[code]from[/code] GraphNode and the [code]to_port[/code] slot of the " +"[code]to[/code] GraphNode. If the connection already exists, no connection " +"is created." +msgstr "" + +#: doc/classes/GraphEdit.xml:76 +msgid "" +"Removes the connection between the [code]from_port[/code] slot of the " +"[code]from[/code] GraphNode and the [code]to_port[/code] slot of the " +"[code]to[/code] GraphNode. If the connection does not exist, no connection " +"is removed." +msgstr "" + +#: doc/classes/GraphEdit.xml:83 +msgid "" +"Returns an Array containing the list of connections. A connection consists " +"in a structure of the form [code]{ from_port: 0, from: \"GraphNode name 0\", " +"to_port: 1, to: \"GraphNode name 1\" }[/code]." +msgstr "" + +#: doc/classes/GraphEdit.xml:90 +msgid "" +"Gets the [HBoxContainer] that contains the zooming and grid snap controls in " +"the top left of the graph.\n" +"Warning: The intended usage of this function is to allow you to reposition " +"or add your own custom controls to the container. This is an internal " +"control and as such should not be freed. If you wish to hide this or any of " +"it's children use their [member CanvasItem.visible] property instead." +msgstr "" + +#: doc/classes/GraphEdit.xml:106 +msgid "" +"Returns [code]true[/code] if the [code]from_port[/code] slot of the " +"[code]from[/code] GraphNode is connected to the [code]to_port[/code] slot of " +"the [code]to[/code] GraphNode." +msgstr "" + +#: doc/classes/GraphEdit.xml:117 +msgid "Returns whether it's possible to connect slots of the specified types." +msgstr "" + +#: doc/classes/GraphEdit.xml:128 +msgid "" +"Makes it not possible to connect between two different slot types. The type " +"is defined with the [method GraphNode.set_slot] method." +msgstr "" + +#: doc/classes/GraphEdit.xml:137 +msgid "" +"Removes the possibility to disconnect nodes when dragging from the slot at " +"the left if it has the specified type." +msgstr "" + +#: doc/classes/GraphEdit.xml:146 +msgid "" +"Removes the possibility to disconnect nodes when dragging from the slot at " +"the right if it has the specified type." +msgstr "" + +#: doc/classes/GraphEdit.xml:163 +msgid "" +"Sets the coloration of the connection between [code]from[/code]'s " +"[code]from_port[/code] and [code]to[/code]'s [code]to_port[/code] with the " +"color provided in the [code]activity[/code] theme property." +msgstr "" + +#: doc/classes/GraphEdit.xml:172 +msgid "Sets the specified [code]node[/code] as the one selected." +msgstr "" + +#: doc/classes/GraphEdit.xml:180 +msgid "" +"If [code]true[/code], enables disconnection of existing connections in the " +"GraphEdit by dragging the right end." +msgstr "" + +#: doc/classes/GraphEdit.xml:183 +msgid "The scroll offset." +msgstr "" + +#: doc/classes/GraphEdit.xml:186 +msgid "The snapping distance in pixels." +msgstr "" + +#: doc/classes/GraphEdit.xml:189 +msgid "If [code]true[/code], enables snapping." +msgstr "" + +#: doc/classes/GraphEdit.xml:192 +msgid "The current zoom value." +msgstr "" + +#: doc/classes/GraphEdit.xml:198 +msgid "Emitted at the beginning of a GraphNode movement." +msgstr "" + +#: doc/classes/GraphEdit.xml:203 +msgid "Emitted at the end of a GraphNode movement." +msgstr "" + +#: doc/classes/GraphEdit.xml:214 +msgid "" +"Emitted when user dragging connection from input port into empty space of " +"the graph." +msgstr "" + +#: doc/classes/GraphEdit.xml:227 +msgid "" +"Emitted to the GraphEdit when the connection between the [code]from_slot[/" +"code] slot of the [code]from[/code] GraphNode and the [code]to_slot[/code] " +"slot of the [code]to[/code] GraphNode is attempted to be created." +msgstr "" + +#: doc/classes/GraphEdit.xml:238 +msgid "" +"Emitted when user dragging connection from output port into empty space of " +"the graph." +msgstr "" + +#: doc/classes/GraphEdit.xml:243 +msgid "Emitted when the user presses [kbd]Ctrl + C[/kbd]." +msgstr "" + +#: doc/classes/GraphEdit.xml:248 +msgid "Emitted when a GraphNode is attempted to be removed from the GraphEdit." +msgstr "" + +#: doc/classes/GraphEdit.xml:261 +msgid "" +"Emitted to the GraphEdit when the connection between [code]from_slot[/code] " +"slot of [code]from[/code] GraphNode and [code]to_slot[/code] slot of " +"[code]to[/code] GraphNode is attempted to be removed." +msgstr "" + +#: doc/classes/GraphEdit.xml:266 +msgid "" +"Emitted when a GraphNode is attempted to be duplicated in the GraphEdit." +msgstr "" + +#: doc/classes/GraphEdit.xml:273 +msgid "Emitted when a GraphNode is selected." +msgstr "" + +#: doc/classes/GraphEdit.xml:284 +msgid "Emitted when the user presses [kbd]Ctrl + V[/kbd]." +msgstr "" + +#: 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: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:312 +msgid "The background drawn under the grid." +msgstr "" + +#: doc/classes/GraphEdit.xml:315 +msgid "Color of major grid lines." +msgstr "" + +#: doc/classes/GraphEdit.xml:318 +msgid "Color of minor grid lines." +msgstr "" + +#: doc/classes/GraphEdit.xml:321 +msgid "The icon for the zoom out button." +msgstr "" + +#: doc/classes/GraphEdit.xml:324 +msgid "The icon for the zoom in button." +msgstr "" + +#: doc/classes/GraphEdit.xml:327 +msgid "" +"The horizontal range within which a port can be grabbed (on both sides)." +msgstr "" + +#: doc/classes/GraphEdit.xml:330 +msgid "The vertical range within which a port can be grabbed (on both sides)." +msgstr "" + +#: doc/classes/GraphEdit.xml:333 +msgid "The icon for the zoom reset button." +msgstr "" + +#: doc/classes/GraphEdit.xml:336 +msgid "The fill color of the selection rectangle." +msgstr "" + +#: doc/classes/GraphEdit.xml:339 +msgid "The outline color of the selection rectangle." +msgstr "" + +#: doc/classes/GraphEdit.xml:342 +msgid "The icon for the snap toggle button." +msgstr "" + +#: doc/classes/GraphNode.xml:4 +msgid "" +"A GraphNode is a container with potentially several input and output slots " +"allowing connections between GraphNodes. Slots can have different, " +"incompatible types." +msgstr "" + +#: doc/classes/GraphNode.xml:7 +msgid "" +"A GraphNode is a container. Each GraphNode can have several input and output " +"slots, sometimes referred to as ports, allowing connections between " +"GraphNodes. To add a slot to GraphNode, add any [Control]-derived child node " +"to it.\n" +"After adding at least one child to GraphNode new sections will be " +"automatically created in the Inspector called 'Slot'. When 'Slot' is " +"expanded you will see list with index number for each slot. You can click on " +"each of them to expand further.\n" +"In the Inspector you can enable (show) or disable (hide) slots. By default " +"all slots are disabled so you may not see any slots on your GraphNode " +"initially. You can assign a type to each slot. Only slots of the same type " +"will be able to connect to each other. You can also assign colors to slots. " +"A tuple of input and output slots is defined for each GUI element included " +"in the GraphNode. Input connections are on the left and output connections " +"are on the right side of GraphNode. Only enabled slots are counted as " +"connections." +msgstr "" + +#: doc/classes/GraphNode.xml:18 +msgid "Disables all input and output slots of the GraphNode." +msgstr "" + +#: doc/classes/GraphNode.xml:27 +msgid "Disables input and output slot whose index is [code]idx[/code]." +msgstr "" + +#: doc/classes/GraphNode.xml:36 +msgid "Returns the color of the input connection [code]idx[/code]." +msgstr "" + +#: doc/classes/GraphNode.xml:43 +msgid "" +"Returns the number of enabled input slots (connections) to the GraphNode." +msgstr "" + +#: doc/classes/GraphNode.xml:52 +msgid "Returns the position of the input connection [code]idx[/code]." +msgstr "" + +#: doc/classes/GraphNode.xml:61 +msgid "Returns the type of the input connection [code]idx[/code]." +msgstr "" + +#: doc/classes/GraphNode.xml:70 +msgid "Returns the color of the output connection [code]idx[/code]." +msgstr "" + +#: doc/classes/GraphNode.xml:77 +msgid "" +"Returns the number of enabled output slots (connections) of the GraphNode." +msgstr "" + +#: doc/classes/GraphNode.xml:86 +msgid "Returns the position of the output connection [code]idx[/code]." +msgstr "" + +#: doc/classes/GraphNode.xml:95 +msgid "Returns the type of the output connection [code]idx[/code]." +msgstr "" + +#: doc/classes/GraphNode.xml:104 +msgid "Returns the color set to [code]idx[/code] left (input) slot." +msgstr "" + +#: doc/classes/GraphNode.xml:113 +msgid "Returns the color set to [code]idx[/code] right (output) slot." +msgstr "" + +#: doc/classes/GraphNode.xml:122 +msgid "Returns the (integer) type of left (input) [code]idx[/code] slot." +msgstr "" + +#: doc/classes/GraphNode.xml:131 +msgid "Returns the (integer) type of right (output) [code]idx[/code] slot." +msgstr "" + +#: doc/classes/GraphNode.xml:140 +msgid "" +"Returns [code]true[/code] if left (input) slot [code]idx[/code] is enabled, " +"[code]false[/code] otherwise." +msgstr "" + +#: doc/classes/GraphNode.xml:149 +msgid "" +"Returns [code]true[/code] if right (output) slot [code]idx[/code] is " +"enabled, [code]false[/code] otherwise." +msgstr "" + +#: doc/classes/GraphNode.xml:174 +msgid "" +"Sets properties of the slot with ID [code]idx[/code].\n" +"If [code]enable_left[/code]/[code]right[/code], a port will appear and the " +"slot will be able to be connected from this side.\n" +"[code]type_left[/code]/[code]right[/code] is an arbitrary type of the port. " +"Only ports with the same type values can be connected.\n" +"[code]color_left[/code]/[code]right[/code] is the tint of the port's icon on " +"this side.\n" +"[code]custom_left[/code]/[code]right[/code] is a custom texture for this " +"side's port.\n" +"[b]Note:[/b] This method only sets properties of the slot. To create the " +"slot, add a [Control]-derived child to the GraphNode." +msgstr "" + +#: doc/classes/GraphNode.xml:185 +msgid "If [code]true[/code], the GraphNode is a comment node." +msgstr "" + +#: doc/classes/GraphNode.xml:189 +msgid "" +"The offset of the GraphNode, relative to the scroll offset of the " +"[GraphEdit].\n" +"[b]Note:[/b] You cannot use position directly, as [GraphEdit] is a " +"[Container]." +msgstr "" + +#: doc/classes/GraphNode.xml:193 +msgid "Sets the overlay shown above the GraphNode. See [enum Overlay]." +msgstr "" + +#: doc/classes/GraphNode.xml:196 +msgid "" +"If [code]true[/code], the user can resize the GraphNode.\n" +"[b]Note:[/b] Dragging the handle will only emit the [signal resize_request] " +"signal, the GraphNode needs to be resized manually." +msgstr "" + +#: doc/classes/GraphNode.xml:200 +msgid "If [code]true[/code], the GraphNode is selected." +msgstr "" + +#: doc/classes/GraphNode.xml:203 +msgid "" +"If [code]true[/code], the close button will be visible.\n" +"[b]Note:[/b] Pressing it will only emit the [signal close_request] signal, " +"the GraphNode needs to be removed manually." +msgstr "" + +#: doc/classes/GraphNode.xml:207 +msgid "The text displayed in the GraphNode's title bar." +msgstr "" + +#: doc/classes/GraphNode.xml:213 +msgid "" +"Emitted when the GraphNode is requested to be closed. Happens on clicking " +"the close button (see [member show_close])." +msgstr "" + +#: doc/classes/GraphNode.xml:222 +msgid "Emitted when the GraphNode is dragged." +msgstr "" + +#: doc/classes/GraphNode.xml:227 +msgid "Emitted when the GraphNode is moved." +msgstr "" + +#: doc/classes/GraphNode.xml:232 +msgid "" +"Emitted when the GraphNode is requested to be displayed over other ones. " +"Happens on focusing (clicking into) the GraphNode." +msgstr "" + +#: doc/classes/GraphNode.xml:239 +msgid "" +"Emitted when the GraphNode is requested to be resized. Happens on dragging " +"the resizer handle (see [member resizable])." +msgstr "" + +#: doc/classes/GraphNode.xml:245 +msgid "No overlay is shown." +msgstr "" + +#: doc/classes/GraphNode.xml:248 +msgid "Show overlay set in the [code]breakpoint[/code] theme property." +msgstr "" + +#: doc/classes/GraphNode.xml:251 +msgid "Show overlay set in the [code]position[/code] theme property." +msgstr "" + +#: doc/classes/GraphNode.xml:256 +msgid "" +"The background used when [member overlay] is set to [constant " +"OVERLAY_BREAKPOINT]." +msgstr "" + +#: doc/classes/GraphNode.xml:259 +msgid "" +"The icon for the close button, visible when [member show_close] is enabled." +msgstr "" + +#: doc/classes/GraphNode.xml:262 +msgid "The color modulation applied to the close button icon." +msgstr "" + +#: doc/classes/GraphNode.xml:265 +msgid "The vertical offset of the close button." +msgstr "" + +#: doc/classes/GraphNode.xml:268 +msgid "The [StyleBox] used when [member comment] is enabled." +msgstr "" + +#: doc/classes/GraphNode.xml:271 +msgid "" +"The [StyleBox] used when [member comment] is enabled and the [GraphNode] is " +"focused." +msgstr "" + +#: doc/classes/GraphNode.xml:278 +msgid "The default background for [GraphNode]." +msgstr "" + +#: doc/classes/GraphNode.xml:281 +msgid "The icon used for representing ports." +msgstr "" + +#: doc/classes/GraphNode.xml:284 +msgid "Horizontal offset for the ports." +msgstr "" + +#: doc/classes/GraphNode.xml:287 +msgid "" +"The background used when [member overlay] is set to [constant " +"OVERLAY_POSITION]." +msgstr "" + +#: doc/classes/GraphNode.xml:290 +msgid "The icon used for resizer, visible when [member resizable] is enabled." +msgstr "" + +#: doc/classes/GraphNode.xml:293 +msgid "The color modulation applied to the resizer icon." +msgstr "" + +#: doc/classes/GraphNode.xml:296 +msgid "The background used when the [GraphNode] is selected." +msgstr "" + +#: doc/classes/GraphNode.xml:299 +msgid "The vertical distance between ports." +msgstr "" + +#: doc/classes/GraphNode.xml:302 +msgid "Color of the title text." +msgstr "" + +#: doc/classes/GraphNode.xml:305 +msgid "Font used for the title text." +msgstr "" + +#: doc/classes/GraphNode.xml:308 +msgid "Vertical offset of the title text." +msgstr "" + +#: doc/classes/GridContainer.xml:4 +msgid "Grid container used to arrange elements in a grid like layout." +msgstr "" + +#: doc/classes/GridContainer.xml:7 +msgid "" +"Grid container will arrange its children in a grid like structure, the grid " +"columns are specified using the [member columns] property and the number of " +"rows will be equal to the number of children in the container divided by the " +"number of columns. For example, if the container has 5 children, and 2 " +"columns, there will be 3 rows in the container.\n" +"Notice that grid layout will preserve the columns and rows for every size of " +"the container, and that empty columns will be expanded automatically." +msgstr "" + +#: doc/classes/GridContainer.xml:16 +msgid "" +"The number of columns in the [GridContainer]. If modified, [GridContainer] " +"reorders its children to accommodate the new layout." +msgstr "" + +#: doc/classes/GridContainer.xml:23 +msgid "The horizontal separation of children nodes." +msgstr "" + +#: doc/classes/GridContainer.xml:26 +msgid "The vertical separation of children nodes." +msgstr "" + +#: modules/gridmap/doc_classes/GridMap.xml:4 +msgid "Node for 3D tile-based maps." +msgstr "" + +#: modules/gridmap/doc_classes/GridMap.xml:7 +msgid "" +"GridMap lets you place meshes on a grid interactively. It works both from " +"the editor and from scripts, which can help you create in-game level " +"editors.\n" +"GridMaps use a [MeshLibrary] which contains a list of tiles. Each tile is a " +"mesh with materials plus optional collision and navigation shapes.\n" +"A GridMap contains a collection of cells. Each grid cell refers to a tile in " +"the [MeshLibrary]. All cells in the map have the same dimensions.\n" +"Internally, a GridMap is split into a sparse collection of octants for " +"efficient rendering and physics processing. Every octant has the same " +"dimensions and can contain several cells." +msgstr "" + +#: modules/gridmap/doc_classes/GridMap.xml:13 +msgid "https://docs.godotengine.org/en/latest/tutorials/3d/using_gridmaps.html" +msgstr "" + +#: modules/gridmap/doc_classes/GridMap.xml:20 +msgid "Clear all cells." +msgstr "" + +#: modules/gridmap/doc_classes/GridMap.xml:53 +msgid "" +"The [MeshLibrary] item index located at the grid-based X, Y and Z " +"coordinates. If the cell is empty, [constant INVALID_CELL_ITEM] will be " +"returned." +msgstr "" + +#: modules/gridmap/doc_classes/GridMap.xml:66 +msgid "" +"The orientation of the cell at the grid-based X, Y and Z coordinates. -1 is " +"returned if the cell is empty." +msgstr "" + +#: modules/gridmap/doc_classes/GridMap.xml:75 doc/classes/PhysicsBody2D.xml:35 +#: doc/classes/PhysicsBody3D.xml:35 +msgid "Returns an individual bit on the [member collision_layer]." +msgstr "" + +#: modules/gridmap/doc_classes/GridMap.xml:84 doc/classes/PhysicsBody2D.xml:44 +#: doc/classes/PhysicsBody3D.xml:44 +msgid "Returns an individual bit on the [member collision_mask]." +msgstr "" + +#: modules/gridmap/doc_classes/GridMap.xml:91 +msgid "" +"Returns an array of [Transform] and [Mesh] references corresponding to the " +"non-empty cells in the grid. The transforms are specified in world space." +msgstr "" + +#: modules/gridmap/doc_classes/GridMap.xml:98 +msgid "" +"Returns an array of [Vector3] with the non-empty cell coordinates in the " +"grid map." +msgstr "" + +#: modules/gridmap/doc_classes/GridMap.xml:121 +msgid "" +"Returns the position of a grid cell in the GridMap's local coordinate space." +msgstr "" + +#: modules/gridmap/doc_classes/GridMap.xml:146 +msgid "" +"Sets the mesh index for the cell referenced by its grid-based X, Y and Z " +"coordinates.\n" +"A negative item index such as [constant INVALID_CELL_ITEM] will clear the " +"cell.\n" +"Optionally, the item's orientation can be passed. For valid orientation " +"values, see [method Basis.get_orthogonal_index]." +msgstr "" + +#: modules/gridmap/doc_classes/GridMap.xml:173 +msgid "Sets an individual bit on the [member collision_layer]." +msgstr "" + +#: modules/gridmap/doc_classes/GridMap.xml:184 +msgid "Sets an individual bit on the [member collision_mask]." +msgstr "" + +#: modules/gridmap/doc_classes/GridMap.xml:193 +msgid "" +"Returns the coordinates of the grid cell containing the given point.\n" +"[code]pos[/code] should be in the GridMap's local coordinate space." +msgstr "" + +#: modules/gridmap/doc_classes/GridMap.xml:200 +msgid "If [code]true[/code], grid items are centered on the X axis." +msgstr "" + +#: modules/gridmap/doc_classes/GridMap.xml:203 +msgid "If [code]true[/code], grid items are centered on the Y axis." +msgstr "" + +#: modules/gridmap/doc_classes/GridMap.xml:206 +msgid "If [code]true[/code], grid items are centered on the Z axis." +msgstr "" + +#: modules/gridmap/doc_classes/GridMap.xml:209 +msgid "" +"The size of each octant measured in number of cells. This applies to all " +"three axis." +msgstr "" + +#: modules/gridmap/doc_classes/GridMap.xml:212 +msgid "" +"The scale of the cell items.\n" +"This does not affect the size of the grid cells themselves, only the items " +"in them. This can be used to make cell items overlap their neighbors." +msgstr "" + +#: modules/gridmap/doc_classes/GridMap.xml:216 +msgid "" +"The dimensions of the grid's cells.\n" +"This does not affect the size of the meshes. See [member cell_scale]." +msgstr "" + +#: modules/gridmap/doc_classes/GridMap.xml:220 +msgid "" +"The physics layers this GridMap is in.\n" +"GridMaps act as static bodies, meaning they aren't affected by gravity or " +"other forces. They only affect other physics bodies that collide with them." +msgstr "" + +#: modules/gridmap/doc_classes/GridMap.xml:224 +msgid "The physics layers this GridMap detects collisions in." +msgstr "" + +#: modules/gridmap/doc_classes/GridMap.xml:227 +msgid "The assigned [MeshLibrary]." +msgstr "" + +#: modules/gridmap/doc_classes/GridMap.xml:235 +msgid "Emitted when [member cell_size] changes." +msgstr "" + +#: modules/gridmap/doc_classes/GridMap.xml:241 +msgid "" +"Invalid cell item that can be used in [method set_cell_item] to clear cells " +"(or represent an empty cell in [method get_cell_item])." +msgstr "" + +#: doc/classes/GrooveJoint2D.xml:4 +msgid "Groove constraint for 2D physics." +msgstr "" + +#: doc/classes/GrooveJoint2D.xml:7 +msgid "" +"Groove constraint for 2D physics. This is useful for making a body \"slide\" " +"through a segment placed in another." +msgstr "" + +#: doc/classes/GrooveJoint2D.xml:15 +msgid "" +"The body B's initial anchor position defined by the joint's origin and a " +"local offset [member initial_offset] along the joint's Y axis (along the " +"groove)." +msgstr "" + +#: doc/classes/GrooveJoint2D.xml:18 +msgid "" +"The groove's length. The groove is from the joint's origin towards [member " +"length] along the joint's local Y axis." +msgstr "" + +#: doc/classes/HashingContext.xml:4 +msgid "Context to compute cryptographic hashes over multiple iterations." +msgstr "" + +#: doc/classes/HashingContext.xml:7 +msgid "" +"The HashingContext class provides an interface for computing cryptographic " +"hashes over multiple iterations. This is useful for example when computing " +"hashes of big files (so you don't have to load them all in memory), network " +"streams, and data streams in general (so you don't have to hold buffers).\n" +"The [enum HashType] enum shows the supported hashing algorithms.\n" +"[codeblock]\n" +"const CHUNK_SIZE = 1024\n" +"\n" +"func hash_file(path):\n" +" var ctx = HashingContext.new()\n" +" var file = File.new()\n" +" # Start a SHA-256 context.\n" +" ctx.start(HashingContext.HASH_SHA256)\n" +" # Check that file exists.\n" +" if not file.file_exists(path):\n" +" return\n" +" # Open the file to hash.\n" +" file.open(path, File.READ)\n" +" # Update the context after reading each chunk.\n" +" while not file.eof_reached():\n" +" ctx.update(file.get_buffer(CHUNK_SIZE))\n" +" # Get the computed hash.\n" +" var res = ctx.finish()\n" +" # Print the result as hex string and array.\n" +" printt(res.hex_encode(), Array(res))\n" +"[/codeblock]\n" +"[b]Note:[/b] Not available in HTML5 exports." +msgstr "" + +#: doc/classes/HashingContext.xml:39 +msgid "Closes the current context, and return the computed hash." +msgstr "" + +#: doc/classes/HashingContext.xml:48 +msgid "" +"Starts a new hash computation of the given [code]type[/code] (e.g. [constant " +"HASH_SHA256] to start computation of a SHA-256)." +msgstr "" + +#: doc/classes/HashingContext.xml:57 +msgid "Updates the computation with the given [code]chunk[/code] of data." +msgstr "" + +#: doc/classes/HashingContext.xml:63 +msgid "Hashing algorithm: MD5." +msgstr "" + +#: doc/classes/HashingContext.xml:66 +msgid "Hashing algorithm: SHA-1." +msgstr "" + +#: doc/classes/HashingContext.xml:69 +msgid "Hashing algorithm: SHA-256." +msgstr "" + +#: doc/classes/HBoxContainer.xml:4 +msgid "Horizontal box container." +msgstr "" + +#: doc/classes/HBoxContainer.xml:7 +msgid "Horizontal box container. See [BoxContainer]." +msgstr "" + +#: doc/classes/HBoxContainer.xml:17 +msgid "The horizontal space between the [HBoxContainer]'s elements." +msgstr "" + +#: doc/classes/HeightMapShape3D.xml:4 +msgid "Height map shape for 3D physics (Bullet only)." +msgstr "" + +#: doc/classes/HeightMapShape3D.xml:7 +msgid "" +"Height map shape resource, which can be added to a [PhysicsBody3D] or " +"[Area3D]." +msgstr "" + +#: doc/classes/HeightMapShape3D.xml:15 +msgid "" +"Height map data, pool array must be of [member map_width] * [member " +"map_depth] size." +msgstr "" + +#: doc/classes/HeightMapShape3D.xml:18 +msgid "" +"Depth of the height map data. Changing this will resize the [member " +"map_data]." +msgstr "" + +#: doc/classes/HeightMapShape3D.xml:21 +msgid "" +"Width of the height map data. Changing this will resize the [member " +"map_data]." +msgstr "" + +#: doc/classes/HingeJoint3D.xml:4 +msgid "A hinge between two 3D bodies." +msgstr "" + +#: doc/classes/HingeJoint3D.xml:7 +msgid "" +"A HingeJoint3D normally uses the Z axis of body A as the hinge axis, another " +"axis can be specified when adding it manually though." +msgstr "" + +#: doc/classes/HingeJoint3D.xml:18 doc/classes/SpriteBase3D.xml:24 +msgid "Returns the value of the specified flag." +msgstr "" + +#: doc/classes/HingeJoint3D.xml:27 doc/classes/ParticlesMaterial.xml:29 +#: doc/classes/PinJoint3D.xml:18 +msgid "Returns the value of the specified parameter." +msgstr "" + +#: doc/classes/HingeJoint3D.xml:38 +msgid "If [code]true[/code], enables the specified flag." +msgstr "" + +#: doc/classes/HingeJoint3D.xml:49 doc/classes/PinJoint3D.xml:29 +msgid "Sets the value of the specified parameter." +msgstr "" + +#: doc/classes/HingeJoint3D.xml:55 doc/classes/HingeJoint3D.xml:95 +#: doc/classes/PhysicsServer3D.xml:1301 +msgid "" +"The speed with which the rotation across the axis perpendicular to the hinge " +"gets corrected." +msgstr "" + +#: doc/classes/HingeJoint3D.xml:58 doc/classes/HingeJoint3D.xml:112 +msgid "" +"If [code]true[/code], the hinges maximum and minimum rotation, defined by " +"[member angular_limit/lower] and [member angular_limit/upper] has effects." +msgstr "" + +#: doc/classes/HingeJoint3D.xml:61 doc/classes/HingeJoint3D.xml:92 +msgid "" +"The minimum rotation. Only active if [member angular_limit/enable] is " +"[code]true[/code]." +msgstr "" + +#: doc/classes/HingeJoint3D.xml:64 doc/classes/HingeJoint3D.xml:100 +#: doc/classes/PhysicsServer3D.xml:1306 +msgid "The lower this value, the more the rotation gets slowed down." +msgstr "" + +#: doc/classes/HingeJoint3D.xml:69 doc/classes/HingeJoint3D.xml:89 +msgid "" +"The maximum rotation. Only active if [member angular_limit/enable] is " +"[code]true[/code]." +msgstr "" + +#: doc/classes/HingeJoint3D.xml:72 doc/classes/HingeJoint3D.xml:115 +msgid "When activated, a motor turns the hinge." +msgstr "" + +#: doc/classes/HingeJoint3D.xml:75 doc/classes/HingeJoint3D.xml:106 +#: doc/classes/PhysicsServer3D.xml:1312 +msgid "Maximum acceleration for the motor." +msgstr "" + +#: doc/classes/HingeJoint3D.xml:78 doc/classes/HingeJoint3D.xml:103 +#: doc/classes/PhysicsServer3D.xml:1309 +msgid "Target speed for the motor." +msgstr "" + +#: doc/classes/HingeJoint3D.xml:81 doc/classes/HingeJoint3D.xml:86 +#: doc/classes/PhysicsServer3D.xml:1292 +msgid "" +"The speed with which the two bodies get pulled together when they move in " +"different directions." +msgstr "" + +#: doc/classes/HScrollBar.xml:4 +msgid "Horizontal scroll bar." +msgstr "" + +#: doc/classes/HScrollBar.xml:7 +msgid "" +"Horizontal version of [ScrollBar], which goes from left (min) to right (max)." +msgstr "" + +#: doc/classes/HScrollBar.xml:17 +msgid "" +"Icon used as a button to scroll the [ScrollBar] left. Supports custom step " +"using the [member ScrollBar.custom_step] property." +msgstr "" + +#: doc/classes/HScrollBar.xml:20 doc/classes/VScrollBar.xml:24 +msgid "Displayed when the mouse cursor hovers over the decrement button." +msgstr "" + +#: doc/classes/HScrollBar.xml:23 doc/classes/VScrollBar.xml:27 +msgid "" +"Used as texture for the grabber, the draggable element representing current " +"scroll." +msgstr "" + +#: doc/classes/HScrollBar.xml:26 doc/classes/VScrollBar.xml:30 +msgid "Used when the mouse hovers over the grabber." +msgstr "" + +#: doc/classes/HScrollBar.xml:29 doc/classes/VScrollBar.xml:33 +msgid "Used when the grabber is being dragged." +msgstr "" + +#: doc/classes/HScrollBar.xml:32 +msgid "" +"Icon used as a button to scroll the [ScrollBar] right. Supports custom step " +"using the [member ScrollBar.custom_step] property." +msgstr "" + +#: doc/classes/HScrollBar.xml:35 doc/classes/VScrollBar.xml:39 +msgid "Displayed when the mouse cursor hovers over the increment button." +msgstr "" + +#: doc/classes/HScrollBar.xml:38 doc/classes/VScrollBar.xml:42 +msgid "Used as background of this [ScrollBar]." +msgstr "" + +#: doc/classes/HScrollBar.xml:41 doc/classes/VScrollBar.xml:45 +msgid "Used as background when the [ScrollBar] has the GUI focus." +msgstr "" + +#: doc/classes/HSeparator.xml:4 +msgid "Horizontal separator." +msgstr "" + +#: doc/classes/HSeparator.xml:7 +msgid "" +"Horizontal separator. See [Separator]. Even though it looks horizontal, it " +"is used to separate objects vertically." +msgstr "" + +#: doc/classes/HSeparator.xml:17 +msgid "" +"The height of the area covered by the separator. Effectively works like a " +"minimum height." +msgstr "" + +#: doc/classes/HSeparator.xml:20 +msgid "The style for the separator line. Works best with [StyleBoxLine]." +msgstr "" + +#: doc/classes/HSlider.xml:4 +msgid "Horizontal slider." +msgstr "" + +#: doc/classes/HSlider.xml:7 +msgid "" +"Horizontal slider. See [Slider]. This one goes from left (min) to right " +"(max)." +msgstr "" + +#: doc/classes/HSlider.xml:17 doc/classes/VSlider.xml:21 +msgid "The texture for the grabber (the draggable element)." +msgstr "" + +#: doc/classes/HSlider.xml:20 +msgid "The background of the area to the left of the grabber." +msgstr "" + +#: 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:28 doc/classes/VSlider.xml:32 +msgid "The texture for the grabber when it's focused." +msgstr "" + +#: 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:34 doc/classes/VSlider.xml:38 +msgid "" +"The texture for the ticks, visible when [member Slider.tick_count] is " +"greater than 0." +msgstr "" + +#: doc/classes/HSplitContainer.xml:4 +msgid "Horizontal split container." +msgstr "" + +#: doc/classes/HSplitContainer.xml:7 +msgid "" +"Horizontal split container. See [SplitContainer]. This goes from left to " +"right." +msgstr "" + +#: doc/classes/HSplitContainer.xml:17 doc/classes/VSplitContainer.xml:17 +msgid "" +"Boolean value. If 1 ([code]true[/code]), the grabber will hide automatically " +"when it isn't under the cursor. If 0 ([code]false[/code]), it's always " +"visible." +msgstr "" + +#: doc/classes/HSplitContainer.xml:22 doc/classes/VSplitContainer.xml:22 +msgid "The icon used for the grabber drawn in the middle area." +msgstr "" + +#: doc/classes/HSplitContainer.xml:25 doc/classes/VSplitContainer.xml:25 +msgid "The space between sides of the container." +msgstr "" + +#: doc/classes/HTTPClient.xml:4 +msgid "Hyper-text transfer protocol client." +msgstr "" + +#: doc/classes/HTTPClient.xml:7 +msgid "" +"Hyper-text transfer protocol client (sometimes called \"User Agent\"). Used " +"to make HTTP requests to download web content, upload files and other data " +"or to communicate with various services, among other use cases. See " +"[HTTPRequest] for an higher-level alternative.\n" +"[b]Note:[/b] This client only needs to connect to a host once (see [method " +"connect_to_host]) to send multiple requests. Because of this, methods that " +"take URLs usually take just the part after the host instead of the full URL, " +"as the client is already connected to a host. See [method request] for a " +"full example and to get started.\n" +"A [HTTPClient] should be reused between multiple requests or to connect to " +"different hosts instead of creating one client per request. Supports SSL and " +"SSL server certificate verification. HTTP status codes in the 2xx range " +"indicate success, 3xx redirection (i.e. \"try again, but over here\"), 4xx " +"something was wrong with the request, and 5xx something went wrong on the " +"server's side.\n" +"For more information on HTTP, see https://developer.mozilla.org/en-US/docs/" +"Web/HTTP (or read RFC 2616 to get it straight from the source: https://tools." +"ietf.org/html/rfc2616)." +msgstr "" + +#: doc/classes/HTTPClient.xml:13 +msgid "" +"https://docs.godotengine.org/en/latest/tutorials/networking/" +"http_client_class.html" +msgstr "" + +#: doc/classes/HTTPClient.xml:14 doc/classes/HTTPRequest.xml:62 +#: doc/classes/StreamPeerSSL.xml:10 +msgid "" +"https://docs.godotengine.org/en/latest/tutorials/networking/ssl_certificates." +"html" +msgstr "" + +#: doc/classes/HTTPClient.xml:21 +msgid "Closes the current connection, allowing reuse of this [HTTPClient]." +msgstr "" + +#: doc/classes/HTTPClient.xml:36 +msgid "" +"Connects to a host. This needs to be done before any requests are sent.\n" +"The host should not have http:// prepended but will strip the protocol " +"identifier if provided.\n" +"If no [code]port[/code] is specified (or [code]-1[/code] is used), it is " +"automatically set to 80 for HTTP and 443 for HTTPS (if [code]use_ssl[/code] " +"is enabled).\n" +"[code]verify_host[/code] will check the SSL identity of the host if set to " +"[code]true[/code]." +msgstr "" + +#: doc/classes/HTTPClient.xml:46 +msgid "" +"Returns the response's body length.\n" +"[b]Note:[/b] Some Web servers may not send a body length. In this case, the " +"value returned will be [code]-1[/code]. If using chunked transfer encoding, " +"the body length will also be [code]-1[/code]." +msgstr "" + +#: doc/classes/HTTPClient.xml:54 +msgid "Returns the response's HTTP status code." +msgstr "" + +#: doc/classes/HTTPClient.xml:61 +msgid "Returns the response headers." +msgstr "" + +#: doc/classes/HTTPClient.xml:68 +msgid "" +"Returns all response headers as a Dictionary of structure [code]{ \"key\": " +"\"value1; value2\" }[/code] where the case-sensitivity of the keys and " +"values is kept like the server delivers it. A value is a simple String, this " +"string can have more than one value where \"; \" is used as separator.\n" +"[b]Example:[/b]\n" +"[codeblock]\n" +"{\n" +" \"content-length\": 12,\n" +" \"Content-Type\": \"application/json; charset=UTF-8\",\n" +"}\n" +"[/codeblock]" +msgstr "" + +#: doc/classes/HTTPClient.xml:82 +msgid "" +"Returns a [enum Status] constant. Need to call [method poll] in order to get " +"status updates." +msgstr "" + +#: doc/classes/HTTPClient.xml:89 +msgid "If [code]true[/code], this [HTTPClient] has a response available." +msgstr "" + +#: doc/classes/HTTPClient.xml:96 +msgid "If [code]true[/code], this [HTTPClient] has a response that is chunked." +msgstr "" + +#: doc/classes/HTTPClient.xml:103 +msgid "" +"This needs to be called in order to have any request processed. Check " +"results with [method get_status]." +msgstr "" + +#: doc/classes/HTTPClient.xml:112 +msgid "" +"Generates a GET/POST application/x-www-form-urlencoded style query string " +"from a provided dictionary, e.g.:\n" +"[codeblock]\n" +"var fields = {\"username\": \"user\", \"password\": \"pass\"}\n" +"var query_string = http_client.query_string_from_dict(fields)\n" +"# Returns \"username=user&password=pass\"\n" +"[/codeblock]\n" +"Furthermore, if a key has a [code]null[/code] value, only the key itself is " +"added, without equal sign and value. If the value is an array, for each " +"value in it a pair with the same key is added.\n" +"[codeblock]\n" +"var fields = {\"single\": 123, \"not_valued\": null, \"multiple\": [22, 33, " +"44]}\n" +"var query_string = http_client.query_string_from_dict(fields)\n" +"# Returns \"single=123¬_valued&multiple=22&multiple=33&multiple=44\"\n" +"[/codeblock]" +msgstr "" + +#: doc/classes/HTTPClient.xml:130 +msgid "Reads one chunk from the response." +msgstr "" + +#: doc/classes/HTTPClient.xml:145 +msgid "" +"Sends a request to the connected host. The URL parameter is just the part " +"after the host, so for [code]http://somehost.com/index.php[/code], it is " +"[code]index.php[/code].\n" +"Headers are HTTP request headers. For available HTTP methods, see [enum " +"Method].\n" +"To create a POST request with query strings to push to the server, do:\n" +"[codeblock]\n" +"var fields = {\"username\" : \"user\", \"password\" : \"pass\"}\n" +"var query_string = http_client.query_string_from_dict(fields)\n" +"var headers = [\"Content-Type: application/x-www-form-urlencoded\", " +"\"Content-Length: \" + str(query_string.length())]\n" +"var result = http_client.request(http_client.METHOD_POST, \"index.php\", " +"headers, query_string)\n" +"[/codeblock]" +msgstr "" + +#: doc/classes/HTTPClient.xml:168 +msgid "" +"Sends a raw request to the connected host. The URL parameter is just the " +"part after the host, so for [code]http://somehost.com/index.php[/code], it " +"is [code]index.php[/code].\n" +"Headers are HTTP request headers. For available HTTP methods, see [enum " +"Method].\n" +"Sends the body data raw, as a byte array and does not encode it in any way." +msgstr "" + +#: doc/classes/HTTPClient.xml:176 +msgid "" +"If [code]true[/code], execution will block until all data is read from the " +"response." +msgstr "" + +#: doc/classes/HTTPClient.xml:179 +msgid "The connection to use for this client." +msgstr "" + +#: doc/classes/HTTPClient.xml:182 +msgid "" +"The size of the buffer used and maximum bytes to read per iteration. See " +"[method read_response_body_chunk]." +msgstr "" + +#: doc/classes/HTTPClient.xml:187 +msgid "" +"HTTP GET method. The GET method requests a representation of the specified " +"resource. Requests using GET should only retrieve data." +msgstr "" + +#: doc/classes/HTTPClient.xml:190 +msgid "" +"HTTP HEAD method. The HEAD method asks for a response identical to that of a " +"GET request, but without the response body. This is useful to request " +"metadata like HTTP headers or to check if a resource exists." +msgstr "" + +#: doc/classes/HTTPClient.xml:193 +msgid "" +"HTTP POST method. The POST method is used to submit an entity to the " +"specified resource, often causing a change in state or side effects on the " +"server. This is often used for forms and submitting data or uploading files." +msgstr "" + +#: doc/classes/HTTPClient.xml:196 +msgid "" +"HTTP PUT method. The PUT method asks to replace all current representations " +"of the target resource with the request payload. (You can think of POST as " +"\"create or update\" and PUT as \"update\", although many services tend to " +"not make a clear distinction or change their meaning)." +msgstr "" + +#: doc/classes/HTTPClient.xml:199 +msgid "" +"HTTP DELETE method. The DELETE method requests to delete the specified " +"resource." +msgstr "" + +#: doc/classes/HTTPClient.xml:202 +msgid "" +"HTTP OPTIONS method. The OPTIONS method asks for a description of the " +"communication options for the target resource. Rarely used." +msgstr "" + +#: doc/classes/HTTPClient.xml:205 +msgid "" +"HTTP TRACE method. The TRACE method performs a message loop-back test along " +"the path to the target resource. Returns the entire HTTP request received in " +"the response body. Rarely used." +msgstr "" + +#: doc/classes/HTTPClient.xml:208 +msgid "" +"HTTP CONNECT method. The CONNECT method establishes a tunnel to the server " +"identified by the target resource. Rarely used." +msgstr "" + +#: doc/classes/HTTPClient.xml:211 +msgid "" +"HTTP PATCH method. The PATCH method is used to apply partial modifications " +"to a resource." +msgstr "" + +#: doc/classes/HTTPClient.xml:214 +msgid "Represents the size of the [enum Method] enum." +msgstr "" + +#: doc/classes/HTTPClient.xml:217 +msgid "Status: Disconnected from the server." +msgstr "" + +#: doc/classes/HTTPClient.xml:220 +msgid "Status: Currently resolving the hostname for the given URL into an IP." +msgstr "" + +#: doc/classes/HTTPClient.xml:223 +msgid "Status: DNS failure: Can't resolve the hostname for the given URL." +msgstr "" + +#: doc/classes/HTTPClient.xml:226 +msgid "Status: Currently connecting to server." +msgstr "" + +#: doc/classes/HTTPClient.xml:229 +msgid "Status: Can't connect to the server." +msgstr "" + +#: doc/classes/HTTPClient.xml:232 +msgid "Status: Connection established." +msgstr "" + +#: doc/classes/HTTPClient.xml:235 +msgid "Status: Currently sending request." +msgstr "" + +#: doc/classes/HTTPClient.xml:238 +msgid "Status: HTTP body received." +msgstr "" + +#: doc/classes/HTTPClient.xml:241 +msgid "Status: Error in HTTP connection." +msgstr "" + +#: doc/classes/HTTPClient.xml:244 +msgid "Status: Error in SSL handshake." +msgstr "" + +#: doc/classes/HTTPClient.xml:247 +msgid "" +"HTTP status code [code]100 Continue[/code]. Interim response that indicates " +"everything so far is OK and that the client should continue with the request " +"(or ignore this status if already finished)." +msgstr "" + +#: doc/classes/HTTPClient.xml:250 +msgid "" +"HTTP status code [code]101 Switching Protocol[/code]. Sent in response to an " +"[code]Upgrade[/code] request header by the client. Indicates the protocol " +"the server is switching to." +msgstr "" + +#: doc/classes/HTTPClient.xml:253 +msgid "" +"HTTP status code [code]102 Processing[/code] (WebDAV). Indicates that the " +"server has received and is processing the request, but no response is " +"available yet." +msgstr "" + +#: doc/classes/HTTPClient.xml:256 +msgid "" +"HTTP status code [code]200 OK[/code]. The request has succeeded. Default " +"response for successful requests. Meaning varies depending on the request. " +"GET: The resource has been fetched and is transmitted in the message body. " +"HEAD: The entity headers are in the message body. POST: The resource " +"describing the result of the action is transmitted in the message body. " +"TRACE: The message body contains the request message as received by the " +"server." +msgstr "" + +#: doc/classes/HTTPClient.xml:259 +msgid "" +"HTTP status code [code]201 Created[/code]. The request has succeeded and a " +"new resource has been created as a result of it. This is typically the " +"response sent after a PUT request." +msgstr "" + +#: doc/classes/HTTPClient.xml:262 +msgid "" +"HTTP status code [code]202 Accepted[/code]. The request has been received " +"but not yet acted upon. It is non-committal, meaning that there is no way in " +"HTTP to later send an asynchronous response indicating the outcome of " +"processing the request. It is intended for cases where another process or " +"server handles the request, or for batch processing." +msgstr "" + +#: doc/classes/HTTPClient.xml:265 +msgid "" +"HTTP status code [code]203 Non-Authoritative Information[/code]. This " +"response code means returned meta-information set is not exact set as " +"available from the origin server, but collected from a local or a third " +"party copy. Except this condition, 200 OK response should be preferred " +"instead of this response." +msgstr "" + +#: doc/classes/HTTPClient.xml:268 +msgid "" +"HTTP status code [code]204 No Content[/code]. There is no content to send " +"for this request, but the headers may be useful. The user-agent may update " +"its cached headers for this resource with the new ones." +msgstr "" + +#: doc/classes/HTTPClient.xml:271 +msgid "" +"HTTP status code [code]205 Reset Content[/code]. The server has fulfilled " +"the request and desires that the client resets the \"document view\" that " +"caused the request to be sent to its original state as received from the " +"origin server." +msgstr "" + +#: doc/classes/HTTPClient.xml:274 +msgid "" +"HTTP status code [code]206 Partial Content[/code]. This response code is " +"used because of a range header sent by the client to separate download into " +"multiple streams." +msgstr "" + +#: doc/classes/HTTPClient.xml:277 +msgid "" +"HTTP status code [code]207 Multi-Status[/code] (WebDAV). A Multi-Status " +"response conveys information about multiple resources in situations where " +"multiple status codes might be appropriate." +msgstr "" + +#: doc/classes/HTTPClient.xml:280 +msgid "" +"HTTP status code [code]208 Already Reported[/code] (WebDAV). Used inside a " +"DAV: propstat response element to avoid enumerating the internal members of " +"multiple bindings to the same collection repeatedly." +msgstr "" + +#: doc/classes/HTTPClient.xml:283 +msgid "" +"HTTP status code [code]226 IM Used[/code] (WebDAV). The server has fulfilled " +"a GET request for the resource, and the response is a representation of the " +"result of one or more instance-manipulations applied to the current instance." +msgstr "" + +#: doc/classes/HTTPClient.xml:286 +msgid "" +"HTTP status code [code]300 Multiple Choice[/code]. The request has more than " +"one possible responses and there is no standardized way to choose one of the " +"responses. User-agent or user should choose one of them." +msgstr "" + +#: doc/classes/HTTPClient.xml:289 +msgid "" +"HTTP status code [code]301 Moved Permanently[/code]. Redirection. This " +"response code means the URI of requested resource has been changed. The new " +"URI is usually included in the response." +msgstr "" + +#: doc/classes/HTTPClient.xml:292 +msgid "" +"HTTP status code [code]302 Found[/code]. Temporary redirection. This " +"response code means the URI of requested resource has been changed " +"temporarily. New changes in the URI might be made in the future. Therefore, " +"this same URI should be used by the client in future requests." +msgstr "" + +#: doc/classes/HTTPClient.xml:295 +msgid "" +"HTTP status code [code]303 See Other[/code]. The server is redirecting the " +"user agent to a different resource, as indicated by a URI in the Location " +"header field, which is intended to provide an indirect response to the " +"original request." +msgstr "" + +#: doc/classes/HTTPClient.xml:298 +msgid "" +"HTTP status code [code]304 Not Modified[/code]. A conditional GET or HEAD " +"request has been received and would have resulted in a 200 OK response if it " +"were not for the fact that the condition evaluated to [code]false[/code]." +msgstr "" + +#: doc/classes/HTTPClient.xml:301 +msgid "" +"HTTP status code [code]305 Use Proxy[/code]. [i]Deprecated. Do not use.[/i]" +msgstr "" + +#: doc/classes/HTTPClient.xml:304 +msgid "" +"HTTP status code [code]306 Switch Proxy[/code]. [i]Deprecated. Do not use.[/" +"i]" +msgstr "" + +#: doc/classes/HTTPClient.xml:307 +msgid "" +"HTTP status code [code]307 Temporary Redirect[/code]. The target resource " +"resides temporarily under a different URI and the user agent MUST NOT change " +"the request method if it performs an automatic redirection to that URI." +msgstr "" + +#: doc/classes/HTTPClient.xml:310 +msgid "" +"HTTP status code [code]308 Permanent Redirect[/code]. The target resource " +"has been assigned a new permanent URI and any future references to this " +"resource ought to use one of the enclosed URIs." +msgstr "" + +#: doc/classes/HTTPClient.xml:313 +msgid "" +"HTTP status code [code]400 Bad Request[/code]. The request was invalid. The " +"server cannot or will not process the request due to something that is " +"perceived to be a client error (e.g., malformed request syntax, invalid " +"request message framing, invalid request contents, or deceptive request " +"routing)." +msgstr "" + +#: doc/classes/HTTPClient.xml:316 +msgid "" +"HTTP status code [code]401 Unauthorized[/code]. Credentials required. The " +"request has not been applied because it lacks valid authentication " +"credentials for the target resource." +msgstr "" + +#: doc/classes/HTTPClient.xml:319 +msgid "" +"HTTP status code [code]402 Payment Required[/code]. This response code is " +"reserved for future use. Initial aim for creating this code was using it for " +"digital payment systems, however this is not currently used." +msgstr "" + +#: doc/classes/HTTPClient.xml:322 +msgid "" +"HTTP status code [code]403 Forbidden[/code]. The client does not have access " +"rights to the content, i.e. they are unauthorized, so server is rejecting to " +"give proper response. Unlike [code]401[/code], the client's identity is " +"known to the server." +msgstr "" + +#: doc/classes/HTTPClient.xml:325 +msgid "" +"HTTP status code [code]404 Not Found[/code]. The server can not find " +"requested resource. Either the URL is not recognized or the endpoint is " +"valid but the resource itself does not exist. May also be sent instead of " +"403 to hide existence of a resource if the client is not authorized." +msgstr "" + +#: doc/classes/HTTPClient.xml:328 +msgid "" +"HTTP status code [code]405 Method Not Allowed[/code]. The request's HTTP " +"method is known by the server but has been disabled and cannot be used. For " +"example, an API may forbid DELETE-ing a resource. The two mandatory methods, " +"GET and HEAD, must never be disabled and should not return this error code." +msgstr "" + +#: doc/classes/HTTPClient.xml:331 +msgid "" +"HTTP status code [code]406 Not Acceptable[/code]. The target resource does " +"not have a current representation that would be acceptable to the user " +"agent, according to the proactive negotiation header fields received in the " +"request. Used when negotiation content." +msgstr "" + +#: doc/classes/HTTPClient.xml:334 +msgid "" +"HTTP status code [code]407 Proxy Authentication Required[/code]. Similar to " +"401 Unauthorized, but it indicates that the client needs to authenticate " +"itself in order to use a proxy." +msgstr "" + +#: doc/classes/HTTPClient.xml:337 +msgid "" +"HTTP status code [code]408 Request Timeout[/code]. The server did not " +"receive a complete request message within the time that it was prepared to " +"wait." +msgstr "" + +#: doc/classes/HTTPClient.xml:340 +msgid "" +"HTTP status code [code]409 Conflict[/code]. The request could not be " +"completed due to a conflict with the current state of the target resource. " +"This code is used in situations where the user might be able to resolve the " +"conflict and resubmit the request." +msgstr "" + +#: doc/classes/HTTPClient.xml:343 +msgid "" +"HTTP status code [code]410 Gone[/code]. The target resource is no longer " +"available at the origin server and this condition is likely permanent." +msgstr "" + +#: doc/classes/HTTPClient.xml:346 +msgid "" +"HTTP status code [code]411 Length Required[/code]. The server refuses to " +"accept the request without a defined Content-Length header." +msgstr "" + +#: doc/classes/HTTPClient.xml:349 +msgid "" +"HTTP status code [code]412 Precondition Failed[/code]. One or more " +"conditions given in the request header fields evaluated to [code]false[/" +"code] when tested on the server." +msgstr "" + +#: doc/classes/HTTPClient.xml:352 +msgid "" +"HTTP status code [code]413 Entity Too Large[/code]. The server is refusing " +"to process a request because the request payload is larger than the server " +"is willing or able to process." +msgstr "" + +#: doc/classes/HTTPClient.xml:355 +msgid "" +"HTTP status code [code]414 Request-URI Too Long[/code]. The server is " +"refusing to service the request because the request-target is longer than " +"the server is willing to interpret." +msgstr "" + +#: doc/classes/HTTPClient.xml:358 +msgid "" +"HTTP status code [code]415 Unsupported Media Type[/code]. The origin server " +"is refusing to service the request because the payload is in a format not " +"supported by this method on the target resource." +msgstr "" + +#: doc/classes/HTTPClient.xml:361 +msgid "" +"HTTP status code [code]416 Requested Range Not Satisfiable[/code]. None of " +"the ranges in the request's Range header field overlap the current extent of " +"the selected resource or the set of ranges requested has been rejected due " +"to invalid ranges or an excessive request of small or overlapping ranges." +msgstr "" + +#: doc/classes/HTTPClient.xml:364 +msgid "" +"HTTP status code [code]417 Expectation Failed[/code]. The expectation given " +"in the request's Expect header field could not be met by at least one of the " +"inbound servers." +msgstr "" + +#: doc/classes/HTTPClient.xml:367 +msgid "" +"HTTP status code [code]418 I'm A Teapot[/code]. Any attempt to brew coffee " +"with a teapot should result in the error code \"418 I'm a teapot\". The " +"resulting entity body MAY be short and stout." +msgstr "" + +#: doc/classes/HTTPClient.xml:370 +msgid "" +"HTTP status code [code]421 Misdirected Request[/code]. The request was " +"directed at a server that is not able to produce a response. This can be " +"sent by a server that is not configured to produce responses for the " +"combination of scheme and authority that are included in the request URI." +msgstr "" + +#: doc/classes/HTTPClient.xml:373 +msgid "" +"HTTP status code [code]422 Unprocessable Entity[/code] (WebDAV). The server " +"understands the content type of the request entity (hence a 415 Unsupported " +"Media Type status code is inappropriate), and the syntax of the request " +"entity is correct (thus a 400 Bad Request status code is inappropriate) but " +"was unable to process the contained instructions." +msgstr "" + +#: doc/classes/HTTPClient.xml:376 +msgid "" +"HTTP status code [code]423 Locked[/code] (WebDAV). The source or destination " +"resource of a method is locked." +msgstr "" + +#: doc/classes/HTTPClient.xml:379 +msgid "" +"HTTP status code [code]424 Failed Dependency[/code] (WebDAV). The method " +"could not be performed on the resource because the requested action depended " +"on another action and that action failed." +msgstr "" + +#: doc/classes/HTTPClient.xml:382 +msgid "" +"HTTP status code [code]426 Upgrade Required[/code]. The server refuses to " +"perform the request using the current protocol but might be willing to do so " +"after the client upgrades to a different protocol." +msgstr "" + +#: doc/classes/HTTPClient.xml:385 +msgid "" +"HTTP status code [code]428 Precondition Required[/code]. The origin server " +"requires the request to be conditional." +msgstr "" + +#: doc/classes/HTTPClient.xml:388 +msgid "" +"HTTP status code [code]429 Too Many Requests[/code]. The user has sent too " +"many requests in a given amount of time (see \"rate limiting\"). Back off " +"and increase time between requests or try again later." +msgstr "" + +#: doc/classes/HTTPClient.xml:391 +msgid "" +"HTTP status code [code]431 Request Header Fields Too Large[/code]. The " +"server is unwilling to process the request because its header fields are too " +"large. The request MAY be resubmitted after reducing the size of the request " +"header fields." +msgstr "" + +#: doc/classes/HTTPClient.xml:394 +msgid "" +"HTTP status code [code]451 Response Unavailable For Legal Reasons[/code]. " +"The server is denying access to the resource as a consequence of a legal " +"demand." +msgstr "" + +#: doc/classes/HTTPClient.xml:397 +msgid "" +"HTTP status code [code]500 Internal Server Error[/code]. The server " +"encountered an unexpected condition that prevented it from fulfilling the " +"request." +msgstr "" + +#: doc/classes/HTTPClient.xml:400 +msgid "" +"HTTP status code [code]501 Not Implemented[/code]. The server does not " +"support the functionality required to fulfill the request." +msgstr "" + +#: doc/classes/HTTPClient.xml:403 +msgid "" +"HTTP status code [code]502 Bad Gateway[/code]. The server, while acting as a " +"gateway or proxy, received an invalid response from an inbound server it " +"accessed while attempting to fulfill the request. Usually returned by load " +"balancers or proxies." +msgstr "" + +#: doc/classes/HTTPClient.xml:406 +msgid "" +"HTTP status code [code]503 Service Unavailable[/code]. The server is " +"currently unable to handle the request due to a temporary overload or " +"scheduled maintenance, which will likely be alleviated after some delay. Try " +"again later." +msgstr "" + +#: doc/classes/HTTPClient.xml:409 +msgid "" +"HTTP status code [code]504 Gateway Timeout[/code]. The server, while acting " +"as a gateway or proxy, did not receive a timely response from an upstream " +"server it needed to access in order to complete the request. Usually " +"returned by load balancers or proxies." +msgstr "" + +#: doc/classes/HTTPClient.xml:412 +msgid "" +"HTTP status code [code]505 HTTP Version Not Supported[/code]. The server " +"does not support, or refuses to support, the major version of HTTP that was " +"used in the request message." +msgstr "" + +#: doc/classes/HTTPClient.xml:415 +msgid "" +"HTTP status code [code]506 Variant Also Negotiates[/code]. The server has an " +"internal configuration error: the chosen variant resource is configured to " +"engage in transparent content negotiation itself, and is therefore not a " +"proper end point in the negotiation process." +msgstr "" + +#: doc/classes/HTTPClient.xml:418 +msgid "" +"HTTP status code [code]507 Insufficient Storage[/code]. The method could not " +"be performed on the resource because the server is unable to store the " +"representation needed to successfully complete the request." +msgstr "" + +#: doc/classes/HTTPClient.xml:421 +msgid "" +"HTTP status code [code]508 Loop Detected[/code]. The server terminated an " +"operation because it encountered an infinite loop while processing a request " +"with \"Depth: infinity\". This status indicates that the entire operation " +"failed." +msgstr "" + +#: doc/classes/HTTPClient.xml:424 +msgid "" +"HTTP status code [code]510 Not Extended[/code]. The policy for accessing the " +"resource has not been met in the request. The server should send back all " +"the information necessary for the client to issue an extended request." +msgstr "" + +#: doc/classes/HTTPClient.xml:427 +msgid "" +"HTTP status code [code]511 Network Authentication Required[/code]. The " +"client needs to authenticate to gain network access." +msgstr "" + +#: doc/classes/HTTPRequest.xml:4 +msgid "A node with the ability to send HTTP(S) requests." +msgstr "" + +#: doc/classes/HTTPRequest.xml:7 +msgid "" +"A node with the ability to send HTTP requests. Uses [HTTPClient] " +"internally.\n" +"Can be used to make HTTP requests, i.e. download or upload files or web " +"content via HTTP.\n" +"[b]Example of contacting a REST API and printing one of its returned fields:" +"[/b]\n" +"[codeblock]\n" +"func _ready():\n" +" # Create an HTTP request node and connect its completion signal.\n" +" var http_request = HTTPRequest.new()\n" +" add_child(http_request)\n" +" http_request.connect(\"request_completed\", self, " +"\"_http_request_completed\")\n" +"\n" +" # Perform the HTTP request. The URL below returns some JSON as of " +"writing.\n" +" var error = http_request.request(\"https://httpbin.org/get\")\n" +" if error != OK:\n" +" push_error(\"An error occurred in the HTTP request.\")\n" +"\n" +"\n" +"# Called when the HTTP request is completed.\n" +"func _http_request_completed(result, response_code, headers, body):\n" +" var response = parse_json(body.get_string_from_utf8())\n" +"\n" +" # Will print the user agent string used by the HTTPRequest node (as " +"recognized by httpbin.org).\n" +" print(response.headers[\"User-Agent\"])\n" +"[/codeblock]\n" +"[b]Example of loading and displaying an image using HTTPRequest:[/b]\n" +"[codeblock]\n" +"func _ready():\n" +" # Create an HTTP request node and connect its completion signal.\n" +" var http_request = HTTPRequest.new()\n" +" add_child(http_request)\n" +" http_request.connect(\"request_completed\", self, " +"\"_http_request_completed\")\n" +"\n" +" # Perform the HTTP request. The URL below returns a PNG image as of " +"writing.\n" +" var error = http_request.request(\"https://via.placeholder.com/512\")\n" +" if error != OK:\n" +" push_error(\"An error occurred in the HTTP request.\")\n" +"\n" +"\n" +"# Called when the HTTP request is completed.\n" +"func _http_request_completed(result, response_code, headers, body):\n" +" var image = Image.new()\n" +" var error = image.load_png_from_buffer(body)\n" +" if error != OK:\n" +" push_error(\"Couldn't load the image.\")\n" +"\n" +" var texture = ImageTexture.new()\n" +" texture.create_from_image(image)\n" +"\n" +" # Display the image in a TextureRect node.\n" +" var texture_rect = TextureRect.new()\n" +" add_child(texture_rect)\n" +" texture_rect.texture = texture\n" +"[/codeblock]" +msgstr "" + +#: doc/classes/HTTPRequest.xml:61 +msgid "" +"https://docs.godotengine.org/en/latest/tutorials/networking/" +"http_request_class.html" +msgstr "" + +#: doc/classes/HTTPRequest.xml:69 +msgid "Cancels the current request." +msgstr "" + +#: doc/classes/HTTPRequest.xml:76 +msgid "" +"Returns the response body length.\n" +"[b]Note:[/b] Some Web servers may not send a body length. In this case, the " +"value returned will be [code]-1[/code]. If using chunked transfer encoding, " +"the body length will also be [code]-1[/code]." +msgstr "" + +#: doc/classes/HTTPRequest.xml:84 +msgid "Returns the amount of bytes this HTTPRequest downloaded." +msgstr "" + +#: doc/classes/HTTPRequest.xml:91 +msgid "" +"Returns the current status of the underlying [HTTPClient]. See [enum " +"HTTPClient.Status]." +msgstr "" + +#: doc/classes/HTTPRequest.xml:108 +msgid "" +"Creates request on the underlying [HTTPClient]. If there is no configuration " +"errors, it tries to connect using [method HTTPClient.connect_to_host] and " +"passes parameters onto [method HTTPClient.request].\n" +"Returns [constant OK] if request is successfully created. (Does not imply " +"that the server has responded), [constant ERR_UNCONFIGURED] if not in the " +"tree, [constant ERR_BUSY] if still processing previous request, [constant " +"ERR_INVALID_PARAMETER] if given string is not a valid URL format, or " +"[constant ERR_CANT_CONNECT] if not using thread and the [HTTPClient] cannot " +"connect to host." +msgstr "" + +#: doc/classes/HTTPRequest.xml:115 +msgid "Maximum allowed size for response bodies." +msgstr "" + +#: doc/classes/HTTPRequest.xml:118 +msgid "" +"The size of the buffer used and maximum bytes to read per iteration. See " +"[member HTTPClient.read_chunk_size].\n" +"Set this to a higher value (e.g. 65536 for 64 KiB) when downloading large " +"files to achieve better speeds at the cost of memory." +msgstr "" + +#: doc/classes/HTTPRequest.xml:122 +msgid "The file to download into. Will output any received file into it." +msgstr "" + +#: doc/classes/HTTPRequest.xml:125 +msgid "Maximum number of allowed redirects." +msgstr "" + +#: doc/classes/HTTPRequest.xml:130 +msgid "If [code]true[/code], multithreading is used to improve performance." +msgstr "" + +#: doc/classes/HTTPRequest.xml:144 +msgid "Emitted when a request is completed." +msgstr "" + +#: doc/classes/HTTPRequest.xml:150 +msgid "Request successful." +msgstr "" + +#: doc/classes/HTTPRequest.xml:155 +msgid "Request failed while connecting." +msgstr "" + +#: doc/classes/HTTPRequest.xml:158 +msgid "Request failed while resolving." +msgstr "" + +#: doc/classes/HTTPRequest.xml:161 +msgid "Request failed due to connection (read/write) error." +msgstr "" + +#: doc/classes/HTTPRequest.xml:164 +msgid "Request failed on SSL handshake." +msgstr "" + +#: doc/classes/HTTPRequest.xml:167 +msgid "Request does not have a response (yet)." +msgstr "" + +#: doc/classes/HTTPRequest.xml:170 +msgid "Request exceeded its maximum size limit, see [member body_size_limit]." +msgstr "" + +#: doc/classes/HTTPRequest.xml:173 +msgid "Request failed (currently unused)." +msgstr "" + +#: doc/classes/HTTPRequest.xml:176 +msgid "HTTPRequest couldn't open the download file." +msgstr "" + +#: doc/classes/HTTPRequest.xml:179 +msgid "HTTPRequest couldn't write to the download file." +msgstr "" + +#: doc/classes/HTTPRequest.xml:182 +msgid "Request reached its maximum redirect limit, see [member max_redirects]." +msgstr "" + +#: doc/classes/Image.xml:4 +msgid "Image datatype." +msgstr "" + +#: doc/classes/Image.xml:7 +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].\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: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: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 " +"channels are required for both [code]src[/code] and [code]mask[/code]. " +"[code]dst[/code] pixels and [code]src[/code] pixels will blend if the " +"corresponding mask pixel's alpha value is not 0. [code]src[/code] image and " +"[code]mask[/code] image [b]must[/b] have the same size (width and height) " +"but they can have different formats." +msgstr "" + +#: 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: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 " +"copied onto [code]dst[/code] if the corresponding [code]mask[/code] pixel's " +"alpha value is not 0. [code]src[/code] image and [code]mask[/code] image " +"[b]must[/b] have the same size (width and height) but they can have " +"different formats." +msgstr "" + +#: 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:82 +msgid "Removes the image's mipmaps." +msgstr "" + +#: 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 " +"is not available. See [enum CompressMode] and [enum CompressSource] " +"constants." +msgstr "" + +#: doc/classes/Image.xml:116 +msgid "Converts the image's format. See [enum Format] constants." +msgstr "" + +#: doc/classes/Image.xml:125 +msgid "Copies [code]src[/code] image to this image." +msgstr "" + +#: 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: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 " +"[code]true[/code] then generate mipmaps for this image. See the [method " +"generate_mipmaps]." +msgstr "" + +#: 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:175 +msgid "" +"Decompresses the image if it is compressed. Returns an error if decompress " +"function is not available." +msgstr "" + +#: 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:197 +msgid "" +"Stretches the image and enlarges it by a factor of 2. No interpolation is " +"done." +msgstr "" + +#: doc/classes/Image.xml:206 +msgid "Fills the image with a given [Color]." +msgstr "" + +#: doc/classes/Image.xml:213 +msgid "Blends low-alpha pixels with nearby pixels." +msgstr "" + +#: doc/classes/Image.xml:220 +msgid "Flips the image horizontally." +msgstr "" + +#: doc/classes/Image.xml:227 +msgid "Flips the image vertically." +msgstr "" + +#: 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 " +"needs to be scaled down when rendered. This improves image quality and the " +"performance of the rendering. Returns an error if the image is compressed, " +"in a custom format or if the image's width/height is 0." +msgstr "" + +#: doc/classes/Image.xml:243 +msgid "Returns the image's raw data." +msgstr "" + +#: doc/classes/Image.xml:250 +msgid "Returns the image's format. See [enum Format] constants." +msgstr "" + +#: doc/classes/Image.xml:257 +msgid "Returns the image's height." +msgstr "" + +#: 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: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: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: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:302 +msgid "Returns the image's size (width and height)." +msgstr "" + +#: 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:316 +msgid "Returns the image's width." +msgstr "" + +#: doc/classes/Image.xml:323 +msgid "Returns [code]true[/code] if the image has generated mipmaps." +msgstr "" + +#: doc/classes/Image.xml:330 +msgid "Returns [code]true[/code] if the image is compressed." +msgstr "" + +#: doc/classes/Image.xml:337 +msgid "Returns [code]true[/code] if the image has no data." +msgstr "" + +#: 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: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:362 +msgid "Loads an image from the binary contents of a JPEG file." +msgstr "" + +#: doc/classes/Image.xml:371 +msgid "Loads an image from the binary contents of a PNG file." +msgstr "" + +#: doc/classes/Image.xml:380 +msgid "Loads an image from the binary contents of a WebP file." +msgstr "" + +#: 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: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: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: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:423 +msgid "" +"Converts a standard RGBE (Red Green Blue Exponent) image to an sRGB image." +msgstr "" + +#: 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 " +"saved explicitly as monochrome rather than one red channel. This function " +"will return [constant ERR_UNAVAILABLE] if Godot was compiled without the " +"TinyEXR module." +msgstr "" + +#: doc/classes/Image.xml:443 +msgid "Saves the image as a PNG file to [code]path[/code]." +msgstr "" + +#: doc/classes/Image.xml:456 +msgid "" +"Sets the [Color] of the pixel at [code](x, y)[/code]. Example:\n" +"[codeblock]\n" +"var img = Image.new()\n" +"img.create(img_width, img_height, false, Image.FORMAT_RGBA8)\n" +"img.set_pixel(x, y, color)\n" +"[/codeblock]" +msgstr "" + +#: 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" +"[codeblock]\n" +"var img = Image.new()\n" +"img.create(img_width, img_height, false, Image.FORMAT_RGBA8)\n" +"img.set_pixelv(Vector2(x, y), color)\n" +"[/codeblock]" +msgstr "" + +#: doc/classes/Image.xml:484 +msgid "Shrinks the image by a factor of 2." +msgstr "" + +#: doc/classes/Image.xml:491 +msgid "Converts the raw data from the sRGB colorspace to a linear scale." +msgstr "" + +#: 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:502 +msgid "The maximal width allowed for [Image] resources." +msgstr "" + +#: doc/classes/Image.xml:505 +msgid "The maximal height allowed for [Image] resources." +msgstr "" + +#: doc/classes/Image.xml:508 +msgid "Texture format with a single 8-bit depth representing luminance." +msgstr "" + +#: 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:514 +msgid "" +"OpenGL texture format [code]RED[/code] with a single component and a " +"bitdepth of 8." +msgstr "" + +#: 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:520 +msgid "" +"OpenGL texture format [code]RGB[/code] with three components, each with a " +"bitdepth of 8.\n" +"[b]Note:[/b] When creating an [ImageTexture], an sRGB to linear color space " +"conversion is performed." +msgstr "" + +#: doc/classes/Image.xml:524 +msgid "" +"OpenGL texture format [code]RGBA[/code] with four components, each with a " +"bitdepth of 8.\n" +"[b]Note:[/b] When creating an [ImageTexture], an sRGB to linear color space " +"conversion is performed." +msgstr "" + +#: 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: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: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: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: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: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: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: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: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: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: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 " +"of S3TC, only providing 1 bit of alpha and color data being premultiplied " +"with alpha.\n" +"[b]Note:[/b] When creating an [ImageTexture], an sRGB to linear color space " +"conversion is performed." +msgstr "" + +#: 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 " +"as not having been premultiplied by alpha. Well suited for images with sharp " +"alpha transitions between translucent and opaque areas.\n" +"[b]Note:[/b] When creating an [ImageTexture], an sRGB to linear color space " +"conversion is performed." +msgstr "" + +#: 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 " +"bits of alpha channel data followed by 64 bits of DXT1-encoded color data. " +"Color data is not premultiplied by alpha, same as DXT3. DXT5 generally " +"produces superior results for transparent gradients compared to DXT3.\n" +"[b]Note:[/b] When creating an [ImageTexture], an sRGB to linear color space " +"conversion is performed." +msgstr "" + +#: 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], " +"normalizing the red channel data using the same compression algorithm that " +"DXT5 uses for the alpha channel." +msgstr "" + +#: 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], " +"normalizing the red and green channel data using the same compression " +"algorithm that DXT5 uses for the alpha channel." +msgstr "" + +#: 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 " +"RGBA components.\n" +"[b]Note:[/b] When creating an [ImageTexture], an sRGB to linear color space " +"conversion is performed." +msgstr "" + +#: 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: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: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." +"org/wiki/PVRTC]here[/url].\n" +"[b]Note:[/b] When creating an [ImageTexture], an sRGB to linear color space " +"conversion is performed." +msgstr "" + +#: 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: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:598 +msgid "" +"Same as [url=https://en.wikipedia.org/wiki/PVRTC]PVRTC4[/url], but with an " +"alpha component." +msgstr "" + +#: doc/classes/Image.xml:601 +msgid "" +"[url=https://en.wikipedia.org/wiki/" +"Ericsson_Texture_Compression#ETC1]Ericsson Texture Compression format 1[/" +"url], also referred to as \"ETC1\", and is part of the OpenGL ES graphics " +"standard. This format cannot store an alpha channel." +msgstr "" + +#: doc/classes/Image.xml:604 +msgid "" +"[url=https://en.wikipedia.org/wiki/" +"Ericsson_Texture_Compression#ETC2_and_EAC]Ericsson Texture Compression " +"format 2[/url] ([code]R11_EAC[/code] variant), which provides one channel of " +"unsigned data." +msgstr "" + +#: doc/classes/Image.xml:607 +msgid "" +"[url=https://en.wikipedia.org/wiki/" +"Ericsson_Texture_Compression#ETC2_and_EAC]Ericsson Texture Compression " +"format 2[/url] ([code]SIGNED_R11_EAC[/code] variant), which provides one " +"channel of signed data." +msgstr "" + +#: doc/classes/Image.xml:610 +msgid "" +"[url=https://en.wikipedia.org/wiki/" +"Ericsson_Texture_Compression#ETC2_and_EAC]Ericsson Texture Compression " +"format 2[/url] ([code]RG11_EAC[/code] variant), which provides two channels " +"of unsigned data." +msgstr "" + +#: doc/classes/Image.xml:613 +msgid "" +"[url=https://en.wikipedia.org/wiki/" +"Ericsson_Texture_Compression#ETC2_and_EAC]Ericsson Texture Compression " +"format 2[/url] ([code]SIGNED_RG11_EAC[/code] variant), which provides two " +"channels of signed data." +msgstr "" + +#: doc/classes/Image.xml:616 +msgid "" +"[url=https://en.wikipedia.org/wiki/" +"Ericsson_Texture_Compression#ETC2_and_EAC]Ericsson Texture Compression " +"format 2[/url] ([code]RGB8[/code] variant), which is a follow-up of ETC1 and " +"compresses RGB888 data.\n" +"[b]Note:[/b] When creating an [ImageTexture], an sRGB to linear color space " +"conversion is performed." +msgstr "" + +#: doc/classes/Image.xml:620 +msgid "" +"[url=https://en.wikipedia.org/wiki/" +"Ericsson_Texture_Compression#ETC2_and_EAC]Ericsson Texture Compression " +"format 2[/url] ([code]RGBA8[/code]variant), which compresses RGBA8888 data " +"with full alpha support.\n" +"[b]Note:[/b] When creating an [ImageTexture], an sRGB to linear color space " +"conversion is performed." +msgstr "" + +#: doc/classes/Image.xml:624 +msgid "" +"[url=https://en.wikipedia.org/wiki/" +"Ericsson_Texture_Compression#ETC2_and_EAC]Ericsson Texture Compression " +"format 2[/url] ([code]RGB8_PUNCHTHROUGH_ALPHA1[/code] variant), which " +"compresses RGBA data to make alpha either fully transparent or fully " +"opaque.\n" +"[b]Note:[/b] When creating an [ImageTexture], an sRGB to linear color space " +"conversion is performed." +msgstr "" + +#: doc/classes/Image.xml:632 +msgid "Represents the size of the [enum Format] enum." +msgstr "" + +#: doc/classes/Image.xml:635 +msgid "" +"Performs nearest-neighbor interpolation. If the image is resized, it will be " +"pixelated." +msgstr "" + +#: 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: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:644 +msgid "" +"Performs bilinear separately on the two most-suited mipmap levels, then " +"linearly interpolates between them.\n" +"It's slower than [constant INTERPOLATE_BILINEAR], but produces higher-" +"quality results with much less aliasing artifacts.\n" +"If the image does not have mipmaps, they will be generated and used " +"internally, but no mipmaps will be generated on the resulting image.\n" +"[b]Note:[/b] If you intend to scale multiple copies of the original image, " +"it's better to call [method generate_mipmaps]] on it in advance, to avoid " +"wasting processing power in generating them again and again.\n" +"On the other hand, if the image already has mipmaps, they will be used, and " +"a new set will be generated for the resulting image." +msgstr "" + +#: 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:654 +msgid "Image does not have alpha." +msgstr "" + +#: doc/classes/Image.xml:657 +msgid "Image stores alpha in a single bit." +msgstr "" + +#: doc/classes/Image.xml:660 +msgid "Image uses alpha." +msgstr "" + +#: doc/classes/Image.xml:663 +msgid "Use S3TC compression." +msgstr "" + +#: doc/classes/Image.xml:666 +msgid "Use PVRTC2 compression." +msgstr "" + +#: doc/classes/Image.xml:669 +msgid "Use PVRTC4 compression." +msgstr "" + +#: doc/classes/Image.xml:672 +msgid "Use ETC compression." +msgstr "" + +#: doc/classes/Image.xml:675 +msgid "Use ETC2 compression." +msgstr "" + +#: doc/classes/Image.xml:690 +msgid "" +"Source texture (before compression) is a regular texture. Default for all " +"textures." +msgstr "" + +#: doc/classes/Image.xml:693 +msgid "Source texture (before compression) is in sRGB space." +msgstr "" + +#: doc/classes/Image.xml:696 +msgid "" +"Source texture (before compression) is a normal texture (e.g. it can be " +"compressed into two channels)." +msgstr "" + +#: doc/classes/ImageTexture.xml:4 +msgid "A [Texture2D] based on an [Image]." +msgstr "" + +#: doc/classes/ImageTexture.xml:7 +msgid "" +"A [Texture2D] based on an [Image]. Can be created from an [Image] with " +"[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:19 +msgid "Create a new [ImageTexture] from an [Image]." +msgstr "" + +#: doc/classes/ImageTexture.xml:26 +msgid "Returns the format of the [ImageTexture], one of [enum Image.Format]." +msgstr "" + +#: doc/classes/ImageTexture.xml:35 +msgid "Resizes the [ImageTexture] to the specified dimensions." +msgstr "" + +#: 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 " +"after the call." +msgstr "" + +#: doc/classes/ImmediateGeometry3D.xml:4 +msgid "Draws simple geometry from code." +msgstr "" + +#: doc/classes/ImmediateGeometry3D.xml:7 +msgid "" +"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:27 +msgid "" +"Simple helper to draw an UV sphere with given latitude, longitude and radius." +msgstr "" + +#: 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:47 +msgid "" +"Begin drawing (and optionally pass a texture override). When done call " +"[method end]. For more information on how this works, search for " +"[code]glBegin()[/code] and [code]glEnd()[/code] references.\n" +"For the type of primitive, see the [enum Mesh.PrimitiveType] enum." +msgstr "" + +#: doc/classes/ImmediateGeometry3D.xml:55 +msgid "Clears everything that was drawn using begin/end." +msgstr "" + +#: doc/classes/ImmediateGeometry3D.xml:62 +msgid "Ends a drawing context and displays the results." +msgstr "" + +#: doc/classes/ImmediateGeometry3D.xml:71 +msgid "The current drawing color." +msgstr "" + +#: doc/classes/ImmediateGeometry3D.xml:80 +msgid "The next vertex's normal." +msgstr "" + +#: doc/classes/ImmediateGeometry3D.xml:89 +msgid "The next vertex's tangent (and binormal facing)." +msgstr "" + +#: doc/classes/ImmediateGeometry3D.xml:98 +msgid "The next vertex's UV." +msgstr "" + +#: 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 "" + +#: doc/classes/InputEvent.xml:7 +msgid "Base class of all sort of input event. See [method Node._input]." +msgstr "" + +#: doc/classes/InputEvent.xml:10 doc/classes/InputEventJoypadButton.xml:10 +#: doc/classes/InputEventJoypadMotion.xml:10 doc/classes/InputEventKey.xml:10 +#: doc/classes/InputEventMouse.xml:10 doc/classes/InputEventScreenDrag.xml:10 +#: doc/classes/InputEventScreenTouch.xml:11 +#: doc/classes/InputEventWithModifiers.xml:10 +msgid "https://docs.godotengine.org/en/latest/tutorials/inputs/inputevent.html" +msgstr "" + +#: doc/classes/InputEvent.xml:20 +msgid "" +"Returns [code]true[/code] if the given input event and this input event can " +"be added together (only for events of type [InputEventMouseMotion]).\n" +"The given input event's position, global position and speed will be copied. " +"The resulting [code]relative[/code] is a sum of both events. Both events' " +"modifiers have to be identical." +msgstr "" + +#: doc/classes/InputEvent.xml:28 +msgid "Returns a [String] representation of the event." +msgstr "" + +#: doc/classes/InputEvent.xml:37 +msgid "" +"Returns a value between 0.0 and 1.0 depending on the given actions' state. " +"Useful for getting the value of events of type [InputEventJoypadMotion]." +msgstr "" + +#: doc/classes/InputEvent.xml:46 +msgid "" +"Returns [code]true[/code] if this input event matches a pre-defined action " +"of any type." +msgstr "" + +#: doc/classes/InputEvent.xml:57 +msgid "" +"Returns [code]true[/code] if the given action is being pressed (and is not " +"an echo event for [InputEventKey] events, unless [code]allow_echo[/code] is " +"[code]true[/code]). Not relevant for events of type [InputEventMouseMotion] " +"or [InputEventScreenDrag]." +msgstr "" + +#: doc/classes/InputEvent.xml:66 +msgid "" +"Returns [code]true[/code] if the given action is released (i.e. not " +"pressed). Not relevant for events of type [InputEventMouseMotion] or " +"[InputEventScreenDrag]." +msgstr "" + +#: doc/classes/InputEvent.xml:73 +msgid "" +"Returns [code]true[/code] if this input event's type is one that can be " +"assigned to an input action." +msgstr "" + +#: doc/classes/InputEvent.xml:80 +msgid "" +"Returns [code]true[/code] if this input event is an echo event (only for " +"events of type [InputEventKey])." +msgstr "" + +#: doc/classes/InputEvent.xml:87 +msgid "" +"Returns [code]true[/code] if this input event is pressed. Not relevant for " +"events of type [InputEventMouseMotion] or [InputEventScreenDrag]." +msgstr "" + +#: doc/classes/InputEvent.xml:96 +msgid "" +"Returns [code]true[/code] if the given input event is checking for the same " +"key ([InputEventKey]), button ([InputEventJoypadButton]) or action " +"([InputEventAction])." +msgstr "" + +#: doc/classes/InputEvent.xml:107 +msgid "" +"Returns a copy of the given input event which has been offset by " +"[code]local_ofs[/code] and transformed by [code]xform[/code]. Relevant for " +"events of type [InputEventMouseButton], [InputEventMouseMotion], " +"[InputEventScreenTouch], [InputEventScreenDrag], [InputEventMagnifyGesture] " +"and [InputEventPanGesture]." +msgstr "" + +#: doc/classes/InputEvent.xml:113 +msgid "" +"The event's device ID.\n" +"[b]Note:[/b] This device ID will always be [code]-1[/code] for emulated " +"mouse input from a touchscreen. This can be used to distinguish emulated " +"mouse input from physical mouse input." +msgstr "" + +#: doc/classes/InputEventAction.xml:4 +msgid "Input event type for actions." +msgstr "" + +#: doc/classes/InputEventAction.xml:7 +msgid "" +"Contains a generic action which can be targeted from several types of " +"inputs. Actions can be created from the [b]Input Map[/b] tab in the " +"[b]Project > Project Settings[/b] menu. See [method Node._input]." +msgstr "" + +#: doc/classes/InputEventAction.xml:10 +msgid "" +"https://docs.godotengine.org/en/latest/tutorials/inputs/inputevent." +"html#actions" +msgstr "" + +#: doc/classes/InputEventAction.xml:16 +msgid "The action's name. Actions are accessed via this [String]." +msgstr "" + +#: doc/classes/InputEventAction.xml:19 +msgid "" +"If [code]true[/code], the action's state is pressed. If [code]false[/code], " +"the action's state is released." +msgstr "" + +#: doc/classes/InputEventAction.xml:22 +msgid "" +"The action's strength between 0 and 1. This value is considered as equal to " +"0 if pressed is [code]false[/code]. The event strength allows faking analog " +"joypad motion events, by precising how strongly is the joypad axis bent or " +"pressed." +msgstr "" + +#: doc/classes/InputEventGesture.xml:4 +msgid "Base class for touch control gestures." +msgstr "" + +#: doc/classes/InputEventGesture.xml:14 +msgid "" +"The local gesture position relative to the [Viewport]. If used in [method " +"Control._gui_input], the position is relative to the current [Control] that " +"received this gesture." +msgstr "" + +#: doc/classes/InputEventJoypadButton.xml:4 +msgid "Input event for gamepad buttons." +msgstr "" + +#: doc/classes/InputEventJoypadButton.xml:7 +msgid "" +"Input event type for gamepad buttons. For gamepad analog sticks and " +"joysticks, see [InputEventJoypadMotion]." +msgstr "" + +#: doc/classes/InputEventJoypadButton.xml:16 +msgid "Button identifier. One of the [enum JoystickList] button constants." +msgstr "" + +#: doc/classes/InputEventJoypadButton.xml:19 +msgid "" +"If [code]true[/code], the button's state is pressed. If [code]false[/code], " +"the button's state is released." +msgstr "" + +#: doc/classes/InputEventJoypadButton.xml:22 +msgid "" +"Represents the pressure the user puts on the button with his finger, if the " +"controller supports it. Ranges from [code]0[/code] to [code]1[/code]." +msgstr "" + +#: doc/classes/InputEventJoypadMotion.xml:4 +msgid "" +"Input event type for gamepad joysticks and other motions. For buttons, see " +"[code]InputEventJoypadButton[/code]." +msgstr "" + +#: doc/classes/InputEventJoypadMotion.xml:7 +msgid "" +"Stores information about joystick motions. One [InputEventJoypadMotion] " +"represents one axis at a time." +msgstr "" + +#: doc/classes/InputEventJoypadMotion.xml:16 +msgid "Axis identifier. Use one of the [enum JoystickList] axis constants." +msgstr "" + +#: doc/classes/InputEventJoypadMotion.xml:19 +msgid "" +"Current position of the joystick on the given axis. The value ranges from " +"[code]-1.0[/code] to [code]1.0[/code]. A value of [code]0[/code] means the " +"axis is in its resting position." +msgstr "" + +#: doc/classes/InputEventKey.xml:4 +msgid "Input event type for keyboard events." +msgstr "" + +#: doc/classes/InputEventKey.xml:7 +msgid "" +"Stores key presses on the keyboard. Supports key presses, key releases and " +"[member echo] events." +msgstr "" + +#: doc/classes/InputEventKey.xml:17 +msgid "" +"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 " +"[InputEventKey]." +msgstr "" + +#: doc/classes/InputEventKey.xml:25 +msgid "" +"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 " +"the [InputEventKey]." +msgstr "" + +#: doc/classes/InputEventKey.xml:32 +msgid "" +"If [code]true[/code], the key was already pressed before this event. It " +"means the user is holding the key down." +msgstr "" + +#: doc/classes/InputEventKey.xml:35 +msgid "" +"The key keycode, which corresponds to one of the [enum KeyList] constants. " +"Represent key in the current keyboard layout.\n" +"To get a human-readable representation of the [InputEventKey], use [code]OS." +"get_keycode_string(event.keycode)[/code] where [code]event[/code] is the " +"[InputEventKey]." +msgstr "" + +#: doc/classes/InputEventKey.xml:39 +msgid "" +"Key physical keycode, which corresponds to one of the [enum KeyList] " +"constants. Represent the physical location of a key on the 101/102-key US " +"QWERTY keyboard.\n" +"To get a human-readable representation of the [InputEventKey], use [code]OS." +"get_keycode_string(event.keycode)[/code] where [code]event[/code] is the " +"[InputEventKey]." +msgstr "" + +#: doc/classes/InputEventKey.xml:43 +msgid "" +"If [code]true[/code], the key's state is pressed. If [code]false[/code], the " +"key's state is released." +msgstr "" + +#: doc/classes/InputEventKey.xml:46 +msgid "" +"The key Unicode identifier (when relevant). Unicode identifiers for the " +"composite characters and complex scripts may not be available unless IME " +"input mode is active. See [method Window.set_ime_active] for more " +"information." +msgstr "" + +#: doc/classes/InputEventMouse.xml:4 +msgid "Base input event type for mouse events." +msgstr "" + +#: doc/classes/InputEventMouse.xml:7 +msgid "Stores general mouse events information." +msgstr "" + +#: doc/classes/InputEventMouse.xml:16 +msgid "" +"The mouse button mask identifier, one of or a bitwise combination of the " +"[enum ButtonList] button masks." +msgstr "" + +#: doc/classes/InputEventMouse.xml:19 +msgid "" +"The global mouse position relative to the current [Viewport] when used in " +"[method Control._gui_input], otherwise is at 0,0." +msgstr "" + +#: doc/classes/InputEventMouse.xml:22 +msgid "" +"The local mouse position relative to the [Viewport]. If used in [method " +"Control._gui_input], the position is relative to the current [Control] which " +"is under the mouse." +msgstr "" + +#: doc/classes/InputEventMouseButton.xml:4 +msgid "Input event type for mouse button events." +msgstr "" + +#: doc/classes/InputEventMouseButton.xml:7 +msgid "Contains mouse click information. See [method Node._input]." +msgstr "" + +#: doc/classes/InputEventMouseButton.xml:10 +#: doc/classes/InputEventMouseMotion.xml:10 +msgid "" +"https://docs.godotengine.org/en/latest/tutorials/inputs/" +"mouse_and_input_coordinates.html" +msgstr "" + +#: doc/classes/InputEventMouseButton.xml:16 +msgid "" +"The mouse button identifier, one of the [enum ButtonList] button or button " +"wheel constants." +msgstr "" + +#: doc/classes/InputEventMouseButton.xml:19 +msgid "If [code]true[/code], the mouse button's state is a double-click." +msgstr "" + +#: doc/classes/InputEventMouseButton.xml:22 +msgid "" +"The amount (or delta) of the event. When used for high-precision scroll " +"events, this indicates the scroll amount (vertical or horizontal). This is " +"only supported on some platforms; the reported sensitivity varies depending " +"on the platform. May be [code]0[/code] if not supported." +msgstr "" + +#: doc/classes/InputEventMouseButton.xml:25 +msgid "" +"If [code]true[/code], the mouse button's state is pressed. If [code]false[/" +"code], the mouse button's state is released." +msgstr "" + +#: doc/classes/InputEventMouseMotion.xml:4 +msgid "Input event type for mouse motion events." +msgstr "" + +#: doc/classes/InputEventMouseMotion.xml:7 +msgid "" +"Contains mouse and pen motion information. Supports relative, absolute " +"positions and speed. See [method Node._input]." +msgstr "" + +#: doc/classes/InputEventMouseMotion.xml:16 +msgid "" +"Represents the pressure the user puts on the pen. Ranges from [code]0.0[/" +"code] to [code]1.0[/code]." +msgstr "" + +#: doc/classes/InputEventMouseMotion.xml:19 +msgid "" +"The mouse position relative to the previous position (position at the last " +"frame). \n" +"[b]Note:[/b] Since [InputEventMouseMotion] is only emitted when the mouse " +"moves, the last event won't have a relative position of [code]Vector2(0, 0)[/" +"code] when the user stops moving the mouse." +msgstr "" + +#: doc/classes/InputEventMouseMotion.xml:23 +msgid "The mouse speed in pixels per second." +msgstr "" + +#: doc/classes/InputEventMouseMotion.xml:26 +msgid "" +"Represents the angles of tilt of the pen. Positive X-coordinate value " +"indicates a tilt to the right. Positive Y-coordinate value indicates a tilt " +"toward the user. Ranges from [code]-1.0[/code] to [code]1.0[/code] for both " +"axes." +msgstr "" + +#: doc/classes/InputEventScreenDrag.xml:4 +msgid "" +"Input event type for screen drag events. Only available on mobile devices." +msgstr "" + +#: doc/classes/InputEventScreenDrag.xml:7 +msgid "Contains screen drag information. See [method Node._input]." +msgstr "" + +#: doc/classes/InputEventScreenDrag.xml:16 +msgid "The drag event index in the case of a multi-drag event." +msgstr "" + +#: doc/classes/InputEventScreenDrag.xml:19 +msgid "The drag position." +msgstr "" + +#: doc/classes/InputEventScreenDrag.xml:22 +msgid "The drag position relative to its start position." +msgstr "" + +#: doc/classes/InputEventScreenDrag.xml:25 +msgid "The drag speed." +msgstr "" + +#: doc/classes/InputEventScreenTouch.xml:4 +msgid "" +"Input event type for screen touch events.\n" +"(only available on mobile devices)" +msgstr "" + +#: doc/classes/InputEventScreenTouch.xml:8 +msgid "" +"Stores multi-touch press/release information. Supports touch press, touch " +"release and [member index] for multi-touch count and order." +msgstr "" + +#: doc/classes/InputEventScreenTouch.xml:17 +msgid "" +"The touch index in the case of a multi-touch event. One index = one finger." +msgstr "" + +#: doc/classes/InputEventScreenTouch.xml:20 +msgid "The touch position." +msgstr "" + +#: doc/classes/InputEventScreenTouch.xml:23 +msgid "" +"If [code]true[/code], the touch's state is pressed. If [code]false[/code], " +"the touch's state is released." +msgstr "" + +#: doc/classes/InputEventWithModifiers.xml:4 +msgid "Base class for keys events with modifiers." +msgstr "" + +#: doc/classes/InputEventWithModifiers.xml:7 +msgid "" +"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 [kbd]Alt[/kbd] modifier." +msgstr "" + +#: doc/classes/InputEventWithModifiers.xml:19 +msgid "State of the [kbd]Cmd[/kbd] modifier." +msgstr "" + +#: doc/classes/InputEventWithModifiers.xml:22 +msgid "State of the [kbd]Ctrl[/kbd] modifier." +msgstr "" + +#: doc/classes/InputEventWithModifiers.xml:25 +msgid "State of the [kbd]Meta[/kbd] modifier." +msgstr "" + +#: doc/classes/InputEventWithModifiers.xml:28 +msgid "State of the [kbd]Shift[/kbd] modifier." +msgstr "" + +#: doc/classes/InputMap.xml:4 +msgid "Singleton that manages [InputEventAction]." +msgstr "" + +#: doc/classes/InputMap.xml:7 +msgid "" +"Manages all [InputEventAction] which can be created/modified from the " +"project settings menu [b]Project > Project Settings > Input Map[/b] or in " +"code with [method add_action] and [method action_add_event]. See [method " +"Node._input]." +msgstr "" + +#: doc/classes/InputMap.xml:10 +msgid "" +"https://docs.godotengine.org/en/latest/tutorials/inputs/inputevent." +"html#inputmap" +msgstr "" + +#: doc/classes/InputMap.xml:21 +msgid "" +"Adds an [InputEvent] to an action. This [InputEvent] will trigger the action." +msgstr "" + +#: doc/classes/InputMap.xml:32 +msgid "Removes an [InputEvent] from an action." +msgstr "" + +#: doc/classes/InputMap.xml:41 +msgid "Removes all events from an action." +msgstr "" + +#: doc/classes/InputMap.xml:52 +msgid "" +"Returns [code]true[/code] if the action has the given [InputEvent] " +"associated with it." +msgstr "" + +#: doc/classes/InputMap.xml:63 +msgid "Sets a deadzone value for the action." +msgstr "" + +#: doc/classes/InputMap.xml:74 +msgid "" +"Adds an empty action to the [InputMap] with a configurable [code]deadzone[/" +"code].\n" +"An [InputEvent] can then be added to this action with [method " +"action_add_event]." +msgstr "" + +#: doc/classes/InputMap.xml:84 +msgid "Removes an action from the [InputMap]." +msgstr "" + +#: doc/classes/InputMap.xml:95 +msgid "" +"Returns [code]true[/code] if the given event is part of an existing action. " +"This method ignores keyboard modifiers if the given [InputEvent] is not " +"pressed (for proper release detection). See [method action_has_event] if you " +"don't want this behavior." +msgstr "" + +#: doc/classes/InputMap.xml:104 +msgid "Returns an array of [InputEvent]s associated with a given action." +msgstr "" + +#: doc/classes/InputMap.xml:111 +msgid "Returns an array of all actions in the [InputMap]." +msgstr "" + +#: doc/classes/InputMap.xml:120 +msgid "" +"Returns [code]true[/code] if the [InputMap] has a registered action with the " +"given name." +msgstr "" + +#: doc/classes/InputMap.xml:127 +msgid "" +"Clears all [InputEventAction] in the [InputMap] and load it anew from " +"[ProjectSettings]." +msgstr "" + +#: doc/classes/InstancePlaceholder.xml:4 +msgid "Placeholder for the root [Node] of a [PackedScene]." +msgstr "" + +#: doc/classes/InstancePlaceholder.xml:7 +msgid "" +"Turning on the option [b]Load As Placeholder[/b] for an instanced scene in " +"the editor causes it to be replaced by an [InstancePlaceholder] when running " +"the game. This makes it possible to delay actually loading the scene until " +"calling [method create_instance]. This is useful to avoid loading large " +"scenes all at once by loading parts of it selectively.\n" +"The [InstancePlaceholder] does not have a transform. This causes any child " +"nodes to be positioned relatively to the [Viewport] from point (0,0), rather " +"than their parent as displayed in the editor. Replacing the placeholder with " +"a scene with a transform will transform children relatively to their parent " +"again." +msgstr "" + +#: doc/classes/InstancePlaceholder.xml:27 +msgid "" +"Gets the path to the [PackedScene] resource file that is loaded by default " +"when calling [method create_instance]." +msgstr "" + +#: doc/classes/int.xml:4 +msgid "Integer built-in type." +msgstr "" + +#: doc/classes/int.xml:7 +msgid "" +"Signed 64-bit integer type.\n" +"It can take values in the interval [code][-2^63, 2^63 - 1][/code], i.e. " +"[code][-9223372036854775808, 9223372036854775807][/code]. Exceeding those " +"bounds will wrap around.\n" +"[int] is a [Variant] type, and will thus be used when assigning an integer " +"value to a [Variant]. It can also be enforced with the [code]: int[/code] " +"type hint.\n" +"[codeblock]\n" +"var my_variant = 0 # int, value 0.\n" +"my_variant += 4.2 # float, value 4.2.\n" +"var my_int: int = 1 # int, value 1.\n" +"my_int = 4.2 # int, value 4, the right value is implicitly cast to int.\n" +"my_int = int(\"6.7\") # int, value 6, the String is explicitly cast with " +"int.\n" +"\n" +"var max_int = 9223372036854775807\n" +"print(max_int) # 9223372036854775807, OK.\n" +"max_int += 1\n" +"print(max_int) # -9223372036854775808, we overflowed and wrapped around.\n" +"[/codeblock]" +msgstr "" + +#: doc/classes/int.xml:32 +msgid "" +"Cast a [bool] value to an integer value, [code]int(true)[/code] will be " +"equals to 1 and [code]int(false)[/code] will be equals to 0." +msgstr "" + +#: doc/classes/int.xml:41 +msgid "" +"Cast a float value to an integer value, this method simply removes the " +"number fractions, so for example [code]int(2.7)[/code] will be equals to 2, " +"[code]int(.1)[/code] will be equals to 0 and [code]int(-2.7)[/code] will be " +"equals to -2." +msgstr "" + +#: doc/classes/int.xml:50 +msgid "" +"Cast a [String] value to an integer value, this method is an integer parser " +"from a string, so calling this method with an invalid integer string will " +"return 0, a valid string will be something like [code]'1.7'[/code]. This " +"method will ignore all non-number characters, so calling [code]int('1e3')[/" +"code] will return 13." +msgstr "" + +#: doc/classes/IP.xml:4 +msgid "Internet protocol (IP) support functions such as DNS resolution." +msgstr "" + +#: doc/classes/IP.xml:7 +msgid "" +"IP contains support functions for the Internet Protocol (IP). TCP/IP support " +"is in different classes (see [StreamPeerTCP] and [TCP_Server]). IP provides " +"DNS hostname resolution support, both blocking and threaded." +msgstr "" + +#: doc/classes/IP.xml:18 +msgid "" +"Removes all of a [code]hostname[/code]'s cached references. If no " +"[code]hostname[/code] is given, all cached IP addresses are removed." +msgstr "" + +#: doc/classes/IP.xml:27 +msgid "" +"Removes a given item [code]id[/code] from the queue. This should be used to " +"free a queue after it has completed to enable more queries to happen." +msgstr "" + +#: doc/classes/IP.xml:34 +msgid "Returns all of the user's current IPv4 and IPv6 addresses as an array." +msgstr "" + +#: doc/classes/IP.xml:41 +msgid "" +"Returns all network adapters as an array.\n" +"Each adapter is a dictionary of the form:\n" +"[codeblock]\n" +"{\n" +" \"index\": \"1\", # Interface index.\n" +" \"name\": \"eth0\", # Interface name.\n" +" \"friendly\": \"Ethernet One\", # A friendly name (might be empty).\n" +" \"addresses\": [\"192.168.1.101\"], # An array of IP addresses " +"associated to this interface.\n" +"}\n" +"[/codeblock]" +msgstr "" + +#: doc/classes/IP.xml:59 +msgid "" +"Returns a queued hostname's IP address, given its queue [code]id[/code]. " +"Returns an empty string on error or if resolution hasn't happened yet (see " +"[method get_resolve_item_status])." +msgstr "" + +#: doc/classes/IP.xml:68 +msgid "" +"Returns a queued hostname's status as a [enum ResolverStatus] constant, " +"given its queue [code]id[/code]." +msgstr "" + +#: doc/classes/IP.xml:79 +msgid "" +"Returns a given hostname's IPv4 or IPv6 address when resolved (blocking-type " +"method). The address type returned depends on the [enum Type] constant given " +"as [code]ip_type[/code]." +msgstr "" + +#: doc/classes/IP.xml:90 +msgid "" +"Creates a queue item to resolve a hostname to an IPv4 or IPv6 address " +"depending on the [enum Type] constant given as [code]ip_type[/code]. Returns " +"the queue ID if successful, or [constant RESOLVER_INVALID_ID] on error." +msgstr "" + +#: doc/classes/IP.xml:96 +msgid "DNS hostname resolver status: No status." +msgstr "" + +#: doc/classes/IP.xml:99 +msgid "DNS hostname resolver status: Waiting." +msgstr "" + +#: doc/classes/IP.xml:102 +msgid "DNS hostname resolver status: Done." +msgstr "" + +#: doc/classes/IP.xml:105 +msgid "DNS hostname resolver status: Error." +msgstr "" + +#: doc/classes/IP.xml:108 +msgid "" +"Maximum number of concurrent DNS resolver queries allowed, [constant " +"RESOLVER_INVALID_ID] is returned if exceeded." +msgstr "" + +#: doc/classes/IP.xml:111 +msgid "" +"Invalid ID constant. Returned if [constant RESOLVER_MAX_QUERIES] is exceeded." +msgstr "" + +#: doc/classes/IP.xml:114 +msgid "Address type: None." +msgstr "" + +#: doc/classes/IP.xml:117 +msgid "Address type: Internet protocol version 4 (IPv4)." +msgstr "" + +#: doc/classes/IP.xml:120 +msgid "Address type: Internet protocol version 6 (IPv6)." +msgstr "" + +#: doc/classes/IP.xml:123 +msgid "Address type: Any." +msgstr "" + +#: doc/classes/ItemList.xml:4 +msgid "" +"Control that provides a list of selectable items (and/or icons) in a single " +"column, or optionally in multiple columns." +msgstr "" + +#: doc/classes/ItemList.xml:7 +msgid "" +"This control provides a selectable list of items that may be in a single (or " +"multiple columns) with option of text, icons, or both text and icon. " +"Tooltips are supported and may be different for every item in the list.\n" +"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 [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 " +"fully fit its content by default. You need to set [member " +"fixed_column_width] greater than zero to wrap the text." +msgstr "" + +#: doc/classes/ItemList.xml:22 +msgid "Adds an item to the item list with no text, only an icon." +msgstr "" + +#: doc/classes/ItemList.xml:35 +msgid "" +"Adds an item to the item list with specified text. Specify an [code]icon[/" +"code], or use [code]null[/code] as the [code]icon[/code] for a list item " +"with no icon.\n" +"If selectable is [code]true[/code], the list item will be selectable." +msgstr "" + +#: doc/classes/ItemList.xml:43 +msgid "Removes all items from the list." +msgstr "" + +#: doc/classes/ItemList.xml:50 +msgid "" +"Ensure current selection is visible, adjusting the scroll position as " +"necessary." +msgstr "" + +#: doc/classes/ItemList.xml:61 +msgid "" +"Returns the item index at the given [code]position[/code].\n" +"When there is no item at that point, -1 will be returned if [code]exact[/" +"code] is [code]true[/code], and the closest item index will be returned " +"otherwise." +msgstr "" + +#: doc/classes/ItemList.xml:69 +msgid "Returns the number of items currently in the list." +msgstr "" + +#: doc/classes/ItemList.xml:78 +msgid "" +"Returns the custom background color of the item specified by [code]idx[/" +"code] index." +msgstr "" + +#: doc/classes/ItemList.xml:87 +msgid "" +"Returns the custom foreground color of the item specified by [code]idx[/" +"code] index." +msgstr "" + +#: doc/classes/ItemList.xml:96 +msgid "Returns the icon associated with the specified index." +msgstr "" + +#: doc/classes/ItemList.xml:105 +msgid "Returns a [Color] modulating item's icon at the specified index." +msgstr "" + +#: doc/classes/ItemList.xml:114 +msgid "" +"Returns the region of item's icon used. The whole icon will be used if the " +"region has no area." +msgstr "" + +#: doc/classes/ItemList.xml:123 +msgid "Returns the metadata value of the specified index." +msgstr "" + +#: doc/classes/ItemList.xml:132 +msgid "Returns the text associated with the specified index." +msgstr "" + +#: doc/classes/ItemList.xml:141 +msgid "Returns the tooltip hint associated with the specified index." +msgstr "" + +#: doc/classes/ItemList.xml:148 +msgid "Returns an array with the indexes of the selected items." +msgstr "" + +#: doc/classes/ItemList.xml:155 +msgid "Returns the [Object] ID associated with the list." +msgstr "" + +#: doc/classes/ItemList.xml:162 +msgid "Returns [code]true[/code] if one or more items are selected." +msgstr "" + +#: doc/classes/ItemList.xml:171 +msgid "" +"Returns [code]true[/code] if the item at the specified index is disabled." +msgstr "" + +#: doc/classes/ItemList.xml:180 +msgid "" +"Returns [code]true[/code] if the item icon will be drawn transposed, i.e. " +"the X and Y axes are swapped." +msgstr "" + +#: doc/classes/ItemList.xml:189 +msgid "" +"Returns [code]true[/code] if the item at the specified index is selectable." +msgstr "" + +#: doc/classes/ItemList.xml:198 +msgid "" +"Returns [code]true[/code] if the tooltip is enabled for specified item index." +msgstr "" + +#: doc/classes/ItemList.xml:207 +msgid "" +"Returns [code]true[/code] if the item at the specified index is currently " +"selected." +msgstr "" + +#: doc/classes/ItemList.xml:218 +msgid "Moves item from index [code]from_idx[/code] to [code]to_idx[/code]." +msgstr "" + +#: doc/classes/ItemList.xml:227 +msgid "Removes the item specified by [code]idx[/code] index from the list." +msgstr "" + +#: doc/classes/ItemList.xml:238 +msgid "" +"Select the item at the specified index.\n" +"[b]Note:[/b] This method does not trigger the item selection signal." +msgstr "" + +#: doc/classes/ItemList.xml:250 +msgid "" +"Sets the background color of the item specified by [code]idx[/code] index to " +"the specified [Color].\n" +"[codeblock]\n" +"var some_string = \"Some text\"\n" +"some_string.set_item_custom_bg_color(0,Color(1, 0, 0, 1) # This will set the " +"background color of the first item of the control to red.\n" +"[/codeblock]" +msgstr "" + +#: doc/classes/ItemList.xml:265 +msgid "" +"Sets the foreground color of the item specified by [code]idx[/code] index to " +"the specified [Color].\n" +"[codeblock]\n" +"var some_string = \"Some text\"\n" +"some_string.set_item_custom_fg_color(0,Color(1, 0, 0, 1) # This will set the " +"foreground color of the first item of the control to red.\n" +"[/codeblock]" +msgstr "" + +#: doc/classes/ItemList.xml:280 +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 [kbd]Enter[/kbd])." +msgstr "" + +#: doc/classes/ItemList.xml:292 +msgid "" +"Sets (or replaces) the icon's [Texture2D] associated with the specified " +"index." +msgstr "" + +#: doc/classes/ItemList.xml:303 +msgid "" +"Sets a modulating [Color] of the item associated with the specified index." +msgstr "" + +#: doc/classes/ItemList.xml:314 +msgid "" +"Sets the region of item's icon used. The whole icon will be used if the " +"region has no area." +msgstr "" + +#: doc/classes/ItemList.xml:325 +msgid "Sets whether the item icon will be drawn transposed." +msgstr "" + +#: doc/classes/ItemList.xml:336 +msgid "" +"Sets a value (of any type) to be stored with the item associated with the " +"specified index." +msgstr "" + +#: doc/classes/ItemList.xml:347 +msgid "" +"Allows or disallows selection of the item associated with the specified " +"index." +msgstr "" + +#: doc/classes/ItemList.xml:358 +msgid "Sets text of the item associated with the specified index." +msgstr "" + +#: doc/classes/ItemList.xml:369 +msgid "Sets the tooltip hint for the item associated with the specified index." +msgstr "" + +#: doc/classes/ItemList.xml:380 +msgid "Sets whether the tooltip hint is enabled for specified item index." +msgstr "" + +#: doc/classes/ItemList.xml:387 +msgid "Sorts items in the list by their text." +msgstr "" + +#: doc/classes/ItemList.xml:396 +msgid "Ensures the item associated with the specified index is not selected." +msgstr "" + +#: doc/classes/ItemList.xml:403 +msgid "Ensures there are no items selected." +msgstr "" + +#: doc/classes/ItemList.xml:409 +msgid "" +"If [code]true[/code], the currently selected item can be selected again." +msgstr "" + +#: doc/classes/ItemList.xml:412 +msgid "If [code]true[/code], right mouse button click can select items." +msgstr "" + +#: doc/classes/ItemList.xml:415 +msgid "" +"If [code]true[/code], the control will automatically resize the height to " +"fit its content." +msgstr "" + +#: doc/classes/ItemList.xml:418 +msgid "" +"The width all columns will be adjusted to.\n" +"A value of zero disables the adjustment, each item will have a width equal " +"to the width of its content and the columns will have an uneven width." +msgstr "" + +#: doc/classes/ItemList.xml:422 +msgid "" +"The size all icons will be adjusted to.\n" +"If either X or Y component is not greater than zero, icon size won't be " +"affected." +msgstr "" + +#: doc/classes/ItemList.xml:427 +msgid "" +"The icon position, whether above or to the left of the text. See the [enum " +"IconMode] constants." +msgstr "" + +#: doc/classes/ItemList.xml:430 +msgid "" +"The scale of icon applied after [member fixed_icon_size] and transposing " +"takes effect." +msgstr "" + +#: doc/classes/ItemList.xml:433 +msgid "" +"Maximum columns the list will have.\n" +"If greater than zero, the content will be split among the specified " +"columns.\n" +"A value of zero means unlimited columns, i.e. all items will be put in the " +"same row." +msgstr "" + +#: doc/classes/ItemList.xml:438 +msgid "" +"Maximum lines of text allowed in each item. Space will be reserved even when " +"there is not enough lines of text to display.\n" +"[b]Note:[/b] This property takes effect only when [member icon_mode] is " +"[constant ICON_MODE_TOP]. To make the text wrap, [member fixed_column_width] " +"should be greater than zero." +msgstr "" + +#: doc/classes/ItemList.xml:443 +msgid "" +"Whether all columns will have the same width.\n" +"If [code]true[/code], the width is equal to the largest column width of all " +"columns." +msgstr "" + +#: doc/classes/ItemList.xml:447 +msgid "" +"Allows single or multiple item selection. See the [enum SelectMode] " +"constants." +msgstr "" + +#: doc/classes/ItemList.xml:455 +msgid "" +"Triggered when specified list item is activated via double-clicking or by " +"pressing [kbd]Enter[/kbd]." +msgstr "" + +#: doc/classes/ItemList.xml:464 +msgid "" +"Triggered when specified list item has been selected via right mouse " +"clicking.\n" +"The click position is also provided to allow appropriate popup of context " +"menus at the correct location.\n" +"[member allow_rmb_select] must be enabled." +msgstr "" + +#: doc/classes/ItemList.xml:473 +msgid "" +"Triggered when specified item has been selected.\n" +"[member allow_reselect] must be enabled to reselect an item." +msgstr "" + +#: doc/classes/ItemList.xml:483 +msgid "" +"Triggered when a multiple selection is altered on a list allowing multiple " +"selection." +msgstr "" + +#: doc/classes/ItemList.xml:488 +msgid "" +"Triggered when a left mouse click is issued within the rect of the list but " +"on empty space." +msgstr "" + +#: doc/classes/ItemList.xml:495 +msgid "" +"Triggered when a right mouse click is issued within the rect of the list but " +"on empty space.\n" +"[member allow_rmb_select] must be enabled." +msgstr "" + +#: doc/classes/ItemList.xml:502 +msgid "Icon is drawn above the text." +msgstr "" + +#: doc/classes/ItemList.xml:505 +msgid "Icon is drawn to the left of the text." +msgstr "" + +#: doc/classes/ItemList.xml:508 +msgid "Only allow selecting a single item." +msgstr "" + +#: doc/classes/ItemList.xml:511 +msgid "" +"Allows selecting multiple items by holding [kbd]Ctrl[/kbd] or [kbd]Shift[/" +"kbd]." +msgstr "" + +#: doc/classes/ItemList.xml:516 +msgid "" +"Default [StyleBox] for the [ItemList], i.e. used when the control is not " +"being focused." +msgstr "" + +#: doc/classes/ItemList.xml:519 +msgid "[StyleBox] used when the [ItemList] is being focused." +msgstr "" + +#: doc/classes/ItemList.xml:522 +msgid "[StyleBox] used for the cursor, when the [ItemList] is being focused." +msgstr "" + +#: doc/classes/ItemList.xml:525 +msgid "" +"[StyleBox] used for the cursor, when the [ItemList] is not being focused." +msgstr "" + +#: doc/classes/ItemList.xml:528 doc/classes/Tree.xml:439 +msgid "[Font] of the item's text." +msgstr "" + +#: doc/classes/ItemList.xml:531 doc/classes/Tree.xml:442 +msgid "Default text [Color] of the item." +msgstr "" + +#: doc/classes/ItemList.xml:534 doc/classes/Tree.xml:445 +msgid "Text [Color] used when the item is selected." +msgstr "" + +#: doc/classes/ItemList.xml:537 +msgid "" +"[Color] of the guideline. The guideline is a line drawn between each row of " +"items." +msgstr "" + +#: doc/classes/ItemList.xml:540 +msgid "The horizontal spacing between items." +msgstr "" + +#: doc/classes/ItemList.xml:543 +msgid "The spacing between item's icon and text." +msgstr "" + +#: doc/classes/ItemList.xml:546 +msgid "The vertical spacing between each line of text." +msgstr "" + +#: doc/classes/ItemList.xml:549 +msgid "" +"[StyleBox] for the selected items, used when the [ItemList] is not being " +"focused." +msgstr "" + +#: doc/classes/ItemList.xml:552 +msgid "" +"[StyleBox] for the selected items, used when the [ItemList] is being focused." +msgstr "" + +#: doc/classes/ItemList.xml:555 +msgid "The vertical spacing between items." +msgstr "" + +#: doc/classes/JavaScript.xml:4 +msgid "" +"Singleton that connects the engine with the browser's JavaScript context in " +"HTML5 export." +msgstr "" + +#: doc/classes/JavaScript.xml:7 +msgid "" +"The JavaScript singleton is implemented only in the HTML5 export. It's used " +"to access the browser's JavaScript context. This allows interaction with " +"embedding pages or calling third-party JavaScript APIs." +msgstr "" + +#: doc/classes/JavaScript.xml:10 +msgid "" +"https://docs.godotengine.org/en/latest/getting_started/workflow/export/" +"exporting_for_web.html#calling-javascript-from-script" +msgstr "" + +#: doc/classes/JavaScript.xml:21 +msgid "" +"Execute the string [code]code[/code] as JavaScript code within the browser " +"window. This is a call to the actual global JavaScript function [code]eval()" +"[/code].\n" +"If [code]use_global_execution_context[/code] is [code]true[/code], the code " +"will be evaluated in the global execution context. Otherwise, it is " +"evaluated in the execution context of a function within the engine's runtime " +"environment." +msgstr "" + +#: doc/classes/Joint2D.xml:4 +msgid "Base node for all joint constraints in 2D physics." +msgstr "" + +#: doc/classes/Joint2D.xml:7 +msgid "" +"Base node for all joint constraints in 2D physics. Joints take 2 bodies and " +"apply a custom constraint." +msgstr "" + +#: doc/classes/Joint2D.xml:15 +msgid "" +"When [member node_a] and [member node_b] move in different directions the " +"[code]bias[/code] controls how fast the joint pulls them back to their " +"original position. The lower the [code]bias[/code] the more the two bodies " +"can pull on the joint." +msgstr "" + +#: doc/classes/Joint2D.xml:18 +msgid "If [code]true[/code], [member node_a] and [member node_b] can collide." +msgstr "" + +#: doc/classes/Joint2D.xml:21 +msgid "The first body attached to the joint. Must derive from [PhysicsBody2D]." +msgstr "" + +#: doc/classes/Joint2D.xml:24 +msgid "" +"The second body attached to the joint. Must derive from [PhysicsBody2D]." +msgstr "" + +#: doc/classes/Joint3D.xml:4 +msgid "Base class for all 3D joints." +msgstr "" + +#: doc/classes/Joint3D.xml:7 +msgid "" +"Joints are used to bind together two physics bodies. They have a solver " +"priority and can define if the bodies of the two attached nodes should be " +"able to collide with each other." +msgstr "" + +#: doc/classes/Joint3D.xml:15 +msgid "" +"If [code]true[/code], the two bodies of the nodes are not able to collide " +"with each other." +msgstr "" + +#: doc/classes/Joint3D.xml:18 +msgid "The node attached to the first side (A) of the joint." +msgstr "" + +#: doc/classes/Joint3D.xml:21 +msgid "The node attached to the second side (B) of the joint." +msgstr "" + +#: doc/classes/Joint3D.xml:24 +msgid "" +"The priority used to define which solver is executed first for multiple " +"joints. The lower the value, the higher the priority." +msgstr "" + +#: doc/classes/JSON.xml:4 +msgid "Helper class for parsing JSON data." +msgstr "" + +#: doc/classes/JSON.xml:7 +msgid "" +"Helper class for parsing JSON data. For usage example and other important " +"hints, see [JSONParseResult]." +msgstr "" + +#: doc/classes/JSON.xml:18 +msgid "" +"Parses a JSON encoded string and returns a [JSONParseResult] containing the " +"result." +msgstr "" + +#: doc/classes/JSON.xml:31 +msgid "" +"Converts a [Variant] var to JSON text and returns the result. Useful for " +"serializing data to store or send over the network." +msgstr "" + +#: doc/classes/JSONParseResult.xml:4 +msgid "Data class wrapper for decoded JSON." +msgstr "" + +#: doc/classes/JSONParseResult.xml:7 +msgid "" +"Returned by [method JSON.parse], [JSONParseResult] contains the decoded JSON " +"or error information if the JSON source wasn't successfully parsed. You can " +"check if the JSON source was successfully parsed with [code]if json_result." +"error == OK[/code]." +msgstr "" + +#: doc/classes/JSONParseResult.xml:15 +msgid "" +"The error type if the JSON source was not successfully parsed. See the [enum " +"Error] constants." +msgstr "" + +#: doc/classes/JSONParseResult.xml:18 +msgid "" +"The line number where the error occurred if JSON source was not successfully " +"parsed." +msgstr "" + +#: doc/classes/JSONParseResult.xml:21 +msgid "" +"The error message if JSON source was not successfully parsed. See the [enum " +"Error] constants." +msgstr "" + +#: doc/classes/JSONParseResult.xml:24 +msgid "" +"A [Variant] containing the parsed JSON. Use [method @GDScript.typeof] or the " +"[code]is[/code] keyword to check if it is what you expect. For example, if " +"the JSON source starts with curly braces ([code]{}[/code]), a [Dictionary] " +"will be returned. If the JSON source starts with braces ([code][][/code]), " +"an [Array] will be returned.\n" +"[b]Note:[/b] The JSON specification does not define integer or float types, " +"but only a number type. Therefore, parsing a JSON text will convert all " +"numerical values to float types.\n" +"[b]Note:[/b] JSON objects do not preserve key order like Godot dictionaries, " +"thus, you should not rely on keys being in a certain order if a dictionary " +"is constructed from JSON. In contrast, JSON arrays retain the order of their " +"elements:\n" +"[codeblock]\n" +"var p = JSON.parse('[\"hello\", \"world\", \"!\"]')\n" +"if typeof(p.result) == TYPE_ARRAY:\n" +" print(p.result[0]) # Prints \"hello\"\n" +"else:\n" +" print(\"unexpected results\")\n" +"[/codeblock]" +msgstr "" + +#: doc/classes/KinematicBody2D.xml:4 +msgid "Kinematic body 2D node." +msgstr "" + +#: doc/classes/KinematicBody2D.xml:7 +msgid "" +"Kinematic bodies are special types of bodies that are meant to be user-" +"controlled. They are not affected by physics at all; to other types of " +"bodies, such as a character or a rigid body, these are the same as a static " +"body. However, they have two main uses:\n" +"[b]Simulated motion:[/b] When these bodies are moved manually, either from " +"code or from an [AnimationPlayer] (with [member AnimationPlayer." +"playback_process_mode] set to \"physics\"), the physics will automatically " +"compute an estimate of their linear and angular velocity. This makes them " +"very useful for moving platforms or other AnimationPlayer-controlled objects " +"(like a door, a bridge that opens, etc).\n" +"[b]Kinematic characters:[/b] KinematicBody2D also has an API for moving " +"objects (the [method move_and_collide] and [method move_and_slide] methods) " +"while performing collision tests. This makes them really useful to implement " +"characters that collide against a world, but that don't require advanced " +"physics." +msgstr "" + +#: doc/classes/KinematicBody2D.xml:12 doc/classes/KinematicBody3D.xml:12 +msgid "" +"https://docs.godotengine.org/en/latest/tutorials/physics/" +"kinematic_character_2d.html" +msgstr "" + +#: doc/classes/KinematicBody2D.xml:13 +msgid "" +"https://docs.godotengine.org/en/latest/tutorials/physics/" +"using_kinematic_body_2d.html" +msgstr "" + +#: doc/classes/KinematicBody2D.xml:20 doc/classes/KinematicBody3D.xml:28 +msgid "" +"Returns the surface normal of the floor at the last collision point. Only " +"valid after calling [method move_and_slide] or [method " +"move_and_slide_with_snap] and when [method is_on_floor] returns [code]true[/" +"code]." +msgstr "" + +#: doc/classes/KinematicBody2D.xml:27 doc/classes/KinematicBody3D.xml:35 +msgid "" +"Returns the linear velocity of the floor at the last collision point. Only " +"valid after calling [method move_and_slide] or [method " +"move_and_slide_with_snap] and when [method is_on_floor] returns [code]true[/" +"code]." +msgstr "" + +#: doc/classes/KinematicBody2D.xml:36 +msgid "" +"Returns a [KinematicCollision2D], which contains information about a " +"collision that occurred during the last [method move_and_slide] call. Since " +"the body can collide several times in a single call to [method " +"move_and_slide], you must specify the index of the collision in the range 0 " +"to ([method get_slide_count] - 1).\n" +"[b]Example usage:[/b]\n" +"[codeblock]\n" +"for i in get_slide_count():\n" +" var collision = get_slide_collision(i)\n" +" print(\"Collided with: \", collision.collider.name)\n" +"[/codeblock]" +msgstr "" + +#: doc/classes/KinematicBody2D.xml:49 doc/classes/KinematicBody3D.xml:51 +msgid "" +"Returns the number of times the body collided and changed direction during " +"the last call to [method move_and_slide]." +msgstr "" + +#: doc/classes/KinematicBody2D.xml:56 doc/classes/KinematicBody3D.xml:58 +msgid "" +"Returns [code]true[/code] if the body is on the ceiling. Only updates when " +"calling [method move_and_slide]." +msgstr "" + +#: doc/classes/KinematicBody2D.xml:63 doc/classes/KinematicBody3D.xml:65 +msgid "" +"Returns [code]true[/code] if the body is on the floor. Only updates when " +"calling [method move_and_slide]." +msgstr "" + +#: doc/classes/KinematicBody2D.xml:70 doc/classes/KinematicBody3D.xml:72 +msgid "" +"Returns [code]true[/code] if the body is on a wall. Only updates when " +"calling [method move_and_slide]." +msgstr "" + +#: doc/classes/KinematicBody2D.xml:85 +msgid "" +"Moves the body along the vector [code]rel_vec[/code]. The body will stop if " +"it collides. Returns a [KinematicCollision2D], which contains information " +"about the collision.\n" +"If [code]test_only[/code] is [code]true[/code], the body does not move but " +"the would-be collision information is given." +msgstr "" + +#: doc/classes/KinematicBody2D.xml:105 +msgid "" +"Moves the body along a vector. If the body collides with another, it will " +"slide along the other body rather than stop immediately. If the other body " +"is a [KinematicBody2D] or [RigidBody2D], it will also be affected by the " +"motion of the other body. You can use this to make moving or rotating " +"platforms, or to make nodes push other nodes.\n" +"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.\n" +"[code]linear_velocity[/code] is the velocity vector in pixels 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. \n" +"[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]Vector2(0, 0)[/code], everything is considered a wall. This is useful " +"for topdown games.\n" +"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.\n" +"If the body collides, it will change direction a maximum of " +"[code]max_slides[/code] times before it stops.\n" +"[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.\n" +"If [code]infinite_inertia[/code] is [code]true[/code], body will be able to " +"push [RigidBody2D] nodes, but it won't also detect any collisions with them. " +"If [code]false[/code], it will interact with [RigidBody2D] nodes like with " +"[StaticBody2D].\n" +"Returns the [code]linear_velocity[/code] vector, rotated and/or scaled if a " +"slide collision occurred. To get detailed information about collisions that " +"occurred, use [method get_slide_collision]." +msgstr "" + +#: doc/classes/KinematicBody2D.xml:134 +msgid "" +"Moves the body while keeping it attached to slopes. Similar to [method " +"move_and_slide].\n" +"As long as the [code]snap[/code] vector is in contact with the ground, the " +"body will remain attached to the surface. This means you must disable snap " +"in order to jump, for example. You can do this by setting [code]snap[/code] " +"to [code](0, 0)[/code] or by using [method move_and_slide] instead." +msgstr "" + +#: doc/classes/KinematicBody2D.xml:148 +msgid "" +"Checks for collisions without moving the body. Virtually sets the node's " +"position, scale and rotation to that of the given [Transform2D], then tries " +"to move the body along the vector [code]rel_vec[/code]. Returns [code]true[/" +"code] if a collision would occur." +msgstr "" + +#: doc/classes/KinematicBody2D.xml:154 doc/classes/KinematicBody3D.xml:167 +msgid "" +"If the body is at least this close to another body, this body will consider " +"them to be colliding." +msgstr "" + +#: doc/classes/KinematicBody2D.xml:157 +msgid "" +"If [code]true[/code], the body's movement will be synchronized to the " +"physics frame. This is useful when animating movement via [AnimationPlayer], " +"for example on moving platforms. Do [b]not[/b] use together with [method " +"move_and_slide] or [method move_and_collide] functions." +msgstr "" + +#: doc/classes/KinematicBody3D.xml:4 +msgid "Kinematic body 3D node." +msgstr "" + +#: doc/classes/KinematicBody3D.xml:7 +msgid "" +"Kinematic bodies are special types of bodies that are meant to be user-" +"controlled. They are not affected by physics at all; to other types of " +"bodies, such as a character or a rigid body, these are the same as a static " +"body. However, they have two main uses:\n" +"[b]Simulated motion:[/b] When these bodies are moved manually, either from " +"code or from an [AnimationPlayer] (with [member AnimationPlayer." +"playback_process_mode] set to \"physics\"), the physics will automatically " +"compute an estimate of their linear and angular velocity. This makes them " +"very useful for moving platforms or other AnimationPlayer-controlled objects " +"(like a door, a bridge that opens, etc).\n" +"[b]Kinematic characters:[/b] KinematicBody3D also has an API for moving " +"objects (the [method move_and_collide] and [method move_and_slide] methods) " +"while performing collision tests. This makes them really useful to implement " +"characters that collide against a world, but that don't require advanced " +"physics." +msgstr "" + +#: doc/classes/KinematicBody3D.xml:21 +msgid "" +"Returns [code]true[/code] if the specified [code]axis[/code] is locked. See " +"also [member move_lock_x], [member move_lock_y] and [member move_lock_z]." +msgstr "" + +#: doc/classes/KinematicBody3D.xml:44 +msgid "" +"Returns a [KinematicCollision3D], which contains information about a " +"collision that occurred during the last [method move_and_slide] call. Since " +"the body can collide several times in a single call to [method " +"move_and_slide], you must specify the index of the collision in the range 0 " +"to ([method get_slide_count] - 1)." +msgstr "" + +#: doc/classes/KinematicBody3D.xml:87 +msgid "" +"Moves the body along the vector [code]rel_vec[/code]. The body will stop if " +"it collides. Returns a [KinematicCollision3D], which contains information " +"about the collision.\n" +"If [code]test_only[/code] is [code]true[/code], the body does not move but " +"the would-be collision information is given." +msgstr "" + +#: doc/classes/KinematicBody3D.xml:107 +msgid "" +"Moves the body along a vector. If the body collides with another, it will " +"slide along the other body rather than stop immediately. If the other body " +"is a [KinematicBody3D] or [RigidBody3D], it will also be affected by the " +"motion of the other body. You can use this to make moving or rotating " +"platforms, or to make nodes push other nodes.\n" +"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.\n" +"[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. \n" +"[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.\n" +"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].\n" +"If the body collides, it will change direction a maximum of " +"[code]max_slides[/code] times before it stops.\n" +"[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.\n" +"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].\n" +"Returns the [code]linear_velocity[/code] vector, rotated and/or scaled if a " +"slide collision occurred. To get detailed information about collisions that " +"occurred, use [method get_slide_collision]." +msgstr "" + +#: doc/classes/KinematicBody3D.xml:136 +msgid "" +"Moves the body while keeping it attached to slopes. Similar to [method " +"move_and_slide].\n" +"As long as the [code]snap[/code] vector is in contact with the ground, the " +"body will remain attached to the surface. This means you must disable snap " +"in order to jump, for example. You can do this by setting [code]snap[/code] " +"to [code](0, 0, 0)[/code] or by using [method move_and_slide] instead." +msgstr "" + +#: doc/classes/KinematicBody3D.xml:148 +msgid "" +"Locks or unlocks the specified [code]axis[/code] depending on the value of " +"[code]lock[/code]. See also [member move_lock_x], [member move_lock_y] and " +"[member move_lock_z]." +msgstr "" + +#: doc/classes/KinematicBody3D.xml:161 +msgid "" +"Checks for collisions without moving the body. Virtually sets the node's " +"position, scale and rotation to that of the given [Transform], then tries to " +"move the body along the vector [code]rel_vec[/code]. Returns [code]true[/" +"code] if a collision would occur." +msgstr "" + +#: doc/classes/KinematicBody3D.xml:170 +msgid "Lock the body's X axis movement." +msgstr "" + +#: doc/classes/KinematicBody3D.xml:173 +msgid "Lock the body's Y axis movement." +msgstr "" + +#: doc/classes/KinematicBody3D.xml:176 +msgid "Lock the body's Z axis movement." +msgstr "" + +#: doc/classes/KinematicCollision2D.xml:4 +msgid "Collision data for [KinematicBody2D] collisions." +msgstr "" + +#: doc/classes/KinematicCollision2D.xml:7 +msgid "" +"Contains collision data for [KinematicBody2D] collisions. When a " +"[KinematicBody2D] is moved using [method KinematicBody2D.move_and_collide], " +"it stops if it detects a collision with another body. If a collision is " +"detected, a KinematicCollision2D object is returned.\n" +"This object contains information about the collision, including the " +"colliding object, the remaining motion, and the collision position. This " +"information can be used to calculate a collision response." +msgstr "" + +#: doc/classes/KinematicCollision2D.xml:16 +#: doc/classes/KinematicCollision3D.xml:16 +msgid "The colliding body." +msgstr "" + +#: doc/classes/KinematicCollision2D.xml:19 +#: doc/classes/KinematicCollision3D.xml:19 +msgid "" +"The colliding body's unique instance ID. See [method Object.get_instance_id]." +msgstr "" + +#: doc/classes/KinematicCollision2D.xml:22 +#: doc/classes/KinematicCollision3D.xml:22 +msgid "The colliding body's metadata. See [Object]." +msgstr "" + +#: doc/classes/KinematicCollision2D.xml:25 +#: doc/classes/KinematicCollision3D.xml:25 +msgid "The colliding body's shape." +msgstr "" + +#: doc/classes/KinematicCollision2D.xml:28 +msgid "The colliding shape's index. See [CollisionObject2D]." +msgstr "" + +#: doc/classes/KinematicCollision2D.xml:31 +#: doc/classes/KinematicCollision3D.xml:31 +msgid "The colliding object's velocity." +msgstr "" + +#: doc/classes/KinematicCollision2D.xml:34 +#: doc/classes/KinematicCollision3D.xml:34 +msgid "The moving object's colliding shape." +msgstr "" + +#: doc/classes/KinematicCollision2D.xml:37 +#: doc/classes/KinematicCollision3D.xml:37 +msgid "The colliding body's shape's normal at the point of collision." +msgstr "" + +#: doc/classes/KinematicCollision2D.xml:40 +#: doc/classes/KinematicCollision3D.xml:40 +msgid "The point of collision, in global coordinates." +msgstr "" + +#: doc/classes/KinematicCollision2D.xml:43 +#: doc/classes/KinematicCollision3D.xml:43 +msgid "The moving object's remaining movement vector." +msgstr "" + +#: doc/classes/KinematicCollision2D.xml:46 +#: doc/classes/KinematicCollision3D.xml:46 +msgid "The distance the moving object traveled before collision." +msgstr "" + +#: doc/classes/KinematicCollision3D.xml:4 +msgid "Collision data for [KinematicBody3D] collisions." +msgstr "" + +#: doc/classes/KinematicCollision3D.xml:7 +msgid "" +"Contains collision data for [KinematicBody3D] collisions. When a " +"[KinematicBody3D] is moved using [method KinematicBody3D.move_and_collide], " +"it stops if it detects a collision with another body. If a collision is " +"detected, a KinematicCollision3D object is returned.\n" +"This object contains information about the collision, including the " +"colliding object, the remaining motion, and the collision position. This " +"information can be used to calculate a collision response." +msgstr "" + +#: doc/classes/KinematicCollision3D.xml:28 +msgid "The colliding shape's index. See [CollisionObject3D]." +msgstr "" + +#: doc/classes/Label.xml:4 +msgid "" +"Displays plain text in a line or wrapped inside a rectangle. For formatted " +"text, use [RichTextLabel]." +msgstr "" + +#: doc/classes/Label.xml:7 +msgid "" +"Label displays plain text on the screen. It gives you control over the " +"horizontal and vertical alignment, and can wrap the text inside the node's " +"bounding rectangle. It doesn't support bold, italics or other formatting. " +"For that, use [RichTextLabel] instead.\n" +"[b]Note:[/b] Contrarily to most other [Control]s, Label's [member Control." +"mouse_filter] defaults to [constant Control.MOUSE_FILTER_IGNORE] (i.e. it " +"doesn't react to mouse input events). This implies that a label won't " +"display any configured [member Control.hint_tooltip], unless you change its " +"mouse filter." +msgstr "" + +#: doc/classes/Label.xml:17 +msgid "Returns the amount of lines of text the Label has." +msgstr "" + +#: doc/classes/Label.xml:24 +msgid "Returns the font size in pixels." +msgstr "" + +#: doc/classes/Label.xml:31 +msgid "" +"Returns the total number of printable characters in the text (excluding " +"spaces and newlines)." +msgstr "" + +#: doc/classes/Label.xml:38 +msgid "" +"Returns the number of lines shown. Useful if the [Label]'s height cannot " +"currently display all lines." +msgstr "" + +#: doc/classes/Label.xml:44 +msgid "" +"Controls the text's horizontal align. Supports left, center, right, and " +"fill, or justify. Set it to one of the [enum Align] constants." +msgstr "" + +#: doc/classes/Label.xml:47 +msgid "" +"If [code]true[/code], wraps the text inside the node's bounding rectangle. " +"If you resize the node, it will change its height automatically to show all " +"the text." +msgstr "" + +#: doc/classes/Label.xml:50 +msgid "" +"If [code]true[/code], the Label only shows the text that fits inside its " +"bounding rectangle. It also lets you scale the node down freely." +msgstr "" + +#: doc/classes/Label.xml:53 +msgid "" +"The node ignores the first [code]lines_skipped[/code] lines before it starts " +"to display text." +msgstr "" + +#: doc/classes/Label.xml:56 +msgid "Limits the lines of text the node shows on screen." +msgstr "" + +#: doc/classes/Label.xml:60 +msgid "" +"Limits the count of visible characters. If you set [code]percent_visible[/" +"code] to 50, only up to half of the text's characters will display on " +"screen. Useful to animate the text in a dialog box." +msgstr "" + +#: doc/classes/Label.xml:64 +msgid "The text to display on screen." +msgstr "" + +#: doc/classes/Label.xml:67 +msgid "If [code]true[/code], all the text displays as UPPERCASE." +msgstr "" + +#: doc/classes/Label.xml:70 +msgid "" +"Controls the text's vertical align. Supports top, center, bottom, and fill. " +"Set it to one of the [enum VAlign] constants." +msgstr "" + +#: doc/classes/Label.xml:73 +msgid "Restricts the number of characters to display. Set to -1 to disable." +msgstr "" + +#: doc/classes/Label.xml:78 +msgid "Align rows to the left (default)." +msgstr "" + +#: doc/classes/Label.xml:81 +msgid "Align rows centered." +msgstr "" + +#: doc/classes/Label.xml:84 +msgid "Align rows to the right." +msgstr "" + +#: doc/classes/Label.xml:87 +msgid "Expand row whitespaces to fit the width." +msgstr "" + +#: doc/classes/Label.xml:90 +msgid "Align the whole text to the top." +msgstr "" + +#: doc/classes/Label.xml:93 +msgid "Align the whole text to the center." +msgstr "" + +#: doc/classes/Label.xml:96 +msgid "Align the whole text to the bottom." +msgstr "" + +#: doc/classes/Label.xml:99 +msgid "Align the whole text by spreading the rows." +msgstr "" + +#: doc/classes/Label.xml:104 +msgid "[Font] used for the [Label]'s text." +msgstr "" + +#: doc/classes/Label.xml:107 +msgid "Default text [Color] of the [Label]." +msgstr "" + +#: doc/classes/Label.xml:110 +msgid "[Color] of the text's shadow effect." +msgstr "" + +#: doc/classes/Label.xml:113 +msgid "The tint of [Font]'s outline. See [member DynamicFont.outline_color]." +msgstr "" + +#: doc/classes/Label.xml:116 +msgid "Vertical space between lines in multiline [Label]." +msgstr "" + +#: doc/classes/Label.xml:119 +msgid "Background [StyleBox] for the [Label]." +msgstr "" + +#: doc/classes/Label.xml:122 +msgid "" +"Boolean value. If set to 1 ([code]true[/code]), the shadow will be displayed " +"around the whole text as an outline." +msgstr "" + +#: doc/classes/Label.xml:125 +msgid "The horizontal offset of the text's shadow." +msgstr "" + +#: doc/classes/Label.xml:128 +msgid "The vertical offset of the text's shadow." +msgstr "" + +#: doc/classes/LargeTexture.xml:4 +msgid "A [Texture2D] capable of storing many smaller textures with offsets." +msgstr "" + +#: doc/classes/LargeTexture.xml:7 +msgid "" +"A [Texture2D] capable of storing many smaller textures with offsets.\n" +"You can dynamically add pieces ([Texture2D]s) to this [LargeTexture] using " +"different offsets." +msgstr "" + +#: doc/classes/LargeTexture.xml:21 +msgid "" +"Adds [code]texture[/code] to this [LargeTexture], starting on offset " +"[code]ofs[/code]." +msgstr "" + +#: doc/classes/LargeTexture.xml:28 +msgid "Clears the [LargeTexture]." +msgstr "" + +#: doc/classes/LargeTexture.xml:35 +msgid "Returns the number of pieces currently in this [LargeTexture]." +msgstr "" + +#: doc/classes/LargeTexture.xml:44 +msgid "Returns the offset of the piece with the index [code]idx[/code]." +msgstr "" + +#: doc/classes/LargeTexture.xml:53 +msgid "Returns the [Texture2D] of the piece with the index [code]idx[/code]." +msgstr "" + +#: doc/classes/LargeTexture.xml:64 +msgid "" +"Sets the offset of the piece with the index [code]idx[/code] to [code]ofs[/" +"code]." +msgstr "" + +#: doc/classes/LargeTexture.xml:75 +msgid "" +"Sets the [Texture2D] of the piece with index [code]idx[/code] to " +"[code]texture[/code]." +msgstr "" + +#: doc/classes/LargeTexture.xml:84 +msgid "Sets the size of this [LargeTexture]." +msgstr "" + +#: doc/classes/Light2D.xml:4 +msgid "Casts light in a 2D environment." +msgstr "" + +#: doc/classes/Light2D.xml:7 +msgid "" +"Casts light in a 2D environment. Light is defined by a (usually grayscale) " +"texture, a color, an energy value, a mode (see constants), and various other " +"parameters (range and shadows-related).\n" +"[b]Note:[/b] Light2D can also be used as a mask." +msgstr "" + +#: doc/classes/Light2D.xml:11 doc/classes/LightOccluder2D.xml:10 +msgid "" +"https://docs.godotengine.org/en/latest/tutorials/2d/2d_lights_and_shadows." +"html" +msgstr "" + +#: doc/classes/Light2D.xml:17 +msgid "The Light2D's [Color]." +msgstr "" + +#: doc/classes/Light2D.xml:20 +msgid "If [code]true[/code], Light2D will only appear when editing the scene." +msgstr "" + +#: doc/classes/Light2D.xml:23 +msgid "If [code]true[/code], Light2D will emit light." +msgstr "" + +#: doc/classes/Light2D.xml:26 +msgid "" +"The Light2D's energy value. The larger the value, the stronger the light." +msgstr "" + +#: doc/classes/Light2D.xml:29 +msgid "The Light2D's mode. See [enum Mode] constants for values." +msgstr "" + +#: doc/classes/Light2D.xml:32 +msgid "The offset of the Light2D's [code]texture[/code]." +msgstr "" + +#: doc/classes/Light2D.xml:35 +msgid "The height of the Light2D. Used with 2D normal mapping." +msgstr "" + +#: doc/classes/Light2D.xml:38 +msgid "" +"The layer mask. Only objects with a matching mask will be affected by the " +"Light2D." +msgstr "" + +#: doc/classes/Light2D.xml:41 +msgid "Maximum layer value of objects that are affected by the Light2D." +msgstr "" + +#: doc/classes/Light2D.xml:44 +msgid "Minimum layer value of objects that are affected by the Light2D." +msgstr "" + +#: doc/classes/Light2D.xml:47 +msgid "" +"Maximum [code]z[/code] value of objects that are affected by the Light2D." +msgstr "" + +#: doc/classes/Light2D.xml:50 +msgid "" +"Minimum [code]z[/code] value of objects that are affected by the Light2D." +msgstr "" + +#: doc/classes/Light2D.xml:53 +msgid "Shadow buffer size." +msgstr "" + +#: doc/classes/Light2D.xml:56 +msgid "[Color] of shadows cast by the Light2D." +msgstr "" + +#: doc/classes/Light2D.xml:59 +msgid "If [code]true[/code], the Light2D will cast shadows." +msgstr "" + +#: doc/classes/Light2D.xml:62 +msgid "Shadow filter type. See [enum ShadowFilter] for possible values." +msgstr "" + +#: doc/classes/Light2D.xml:65 +msgid "Smoothing value for shadows." +msgstr "" + +#: doc/classes/Light2D.xml:68 +msgid "" +"The shadow mask. Used with [LightOccluder2D] to cast shadows. Only occluders " +"with a matching light mask will cast shadows." +msgstr "" + +#: doc/classes/Light2D.xml:71 +msgid "[Texture2D] used for the Light2D's appearance." +msgstr "" + +#: doc/classes/Light2D.xml:74 +msgid "The [code]texture[/code]'s scale factor." +msgstr "" + +#: doc/classes/Light2D.xml:79 +msgid "" +"Adds the value of pixels corresponding to the Light2D to the values of " +"pixels under it. This is the common behavior of a light." +msgstr "" + +#: doc/classes/Light2D.xml:82 +msgid "" +"Subtracts the value of pixels corresponding to the Light2D to the values of " +"pixels under it, resulting in inversed light effect." +msgstr "" + +#: doc/classes/Light2D.xml:85 +msgid "" +"Mix the value of pixels corresponding to the Light2D to the values of pixels " +"under it by linear interpolation." +msgstr "" + +#: doc/classes/Light2D.xml:88 +msgid "" +"The light texture of the Light2D is used as a mask, hiding or revealing " +"parts of the screen underneath depending on the value of each pixel of the " +"light (mask) texture." +msgstr "" + +#: doc/classes/Light2D.xml:91 +msgid "No filter applies to the shadow map. See [member shadow_filter]." +msgstr "" + +#: doc/classes/Light2D.xml:94 +msgid "" +"Percentage closer filtering (5 samples) applies to the shadow map. See " +"[member shadow_filter]." +msgstr "" + +#: doc/classes/Light2D.xml:97 +msgid "" +"Percentage closer filtering (13 samples) applies to the shadow map. See " +"[member shadow_filter]." +msgstr "" + +#: doc/classes/Light3D.xml:4 +msgid "Provides a base class for different kinds of light nodes." +msgstr "" + +#: doc/classes/Light3D.xml:7 +msgid "" +"Light3D is the abstract base class for light nodes, so it shouldn't be used " +"directly (it can't be instanced). Other types of light nodes inherit from " +"it. Light3D contains the common variables and parameters used for lighting." +msgstr "" + +#: doc/classes/Light3D.xml:19 +msgid "Returns the value of the specified [enum Light3D.Param] parameter." +msgstr "" + +#: doc/classes/Light3D.xml:30 +msgid "Sets the value of the specified [enum Light3D.Param] parameter." +msgstr "" + +#: doc/classes/Light3D.xml:36 +msgid "" +"If [code]true[/code], the light only appears in the editor and will not be " +"visible at runtime." +msgstr "" + +#: doc/classes/Light3D.xml:39 +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 bake mode. See [enum BakeMode]." +msgstr "" + +#: doc/classes/Light3D.xml:45 +msgid "The light's color." +msgstr "" + +#: doc/classes/Light3D.xml:48 +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:57 +msgid "" +"If [code]true[/code], the light's effect is reversed, darkening areas and " +"casting bright shadows." +msgstr "" + +#: 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: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: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:75 +msgid "The color of shadows cast by this light." +msgstr "" + +#: doc/classes/Light3D.xml:78 +msgid "If [code]true[/code], the light will cast shadows." +msgstr "" + +#: 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 " +"cast a shadow on both sides of the mesh, set the mesh to use double-sided " +"shadows with [constant GeometryInstance3D." +"SHADOW_CASTING_SETTING_DOUBLE_SIDED]." +msgstr "" + +#: doc/classes/Light3D.xml:91 +msgid "Constant for accessing [member light_energy]." +msgstr "" + +#: doc/classes/Light3D.xml:94 +msgid "Constant for accessing [member light_indirect_energy]." +msgstr "" + +#: doc/classes/Light3D.xml:97 +msgid "Constant for accessing [member light_specular]." +msgstr "" + +#: doc/classes/Light3D.xml:100 +msgid "" +"Constant for accessing [member OmniLight3D.omni_range] or [member " +"SpotLight3D.spot_range]." +msgstr "" + +#: 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:109 +msgid "Constant for accessing [member SpotLight3D.spot_angle]." +msgstr "" + +#: doc/classes/Light3D.xml:112 +msgid "Constant for accessing [member SpotLight3D.spot_angle_attenuation]." +msgstr "" + +#: doc/classes/Light3D.xml:115 +msgid "" +"Constant for accessing [member DirectionalLight3D." +"directional_shadow_max_distance]." +msgstr "" + +#: doc/classes/Light3D.xml:118 +msgid "" +"Constant for accessing [member DirectionalLight3D." +"directional_shadow_split_1]." +msgstr "" + +#: doc/classes/Light3D.xml:121 +msgid "" +"Constant for accessing [member DirectionalLight3D." +"directional_shadow_split_2]." +msgstr "" + +#: doc/classes/Light3D.xml:124 +msgid "" +"Constant for accessing [member DirectionalLight3D." +"directional_shadow_split_3]." +msgstr "" + +#: doc/classes/Light3D.xml:127 +msgid "" +"Constant for accessing [member DirectionalLight3D." +"directional_shadow_fade_start]." +msgstr "" + +#: 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:136 +msgid "" +"Constant for accessing [member DirectionalLight3D." +"directional_shadow_pancake_size]." +msgstr "" + +#: 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:152 +msgid "Only indirect lighting will be baked (default)." +msgstr "" + +#: 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 " +"(dynamic and baked)." +msgstr "" + +#: doc/classes/LightOccluder2D.xml:4 +msgid "Occludes light cast by a Light2D, casting shadows." +msgstr "" + +#: doc/classes/LightOccluder2D.xml:7 +msgid "" +"Occludes light cast by a Light2D, casting shadows. The LightOccluder2D must " +"be provided with an [OccluderPolygon2D] in order for the shadow to be " +"computed." +msgstr "" + +#: doc/classes/LightOccluder2D.xml:16 +msgid "" +"The LightOccluder2D's light mask. The LightOccluder2D will cast shadows only " +"from Light2D(s) that have the same light mask(s)." +msgstr "" + +#: doc/classes/LightOccluder2D.xml:19 +msgid "The [OccluderPolygon2D] used to compute the shadow." +msgstr "" + +#: doc/classes/Line2D.xml:4 +msgid "A 2D line." +msgstr "" + +#: doc/classes/Line2D.xml:7 +msgid "A line through several points in 2D space." +msgstr "" + +#: doc/classes/Line2D.xml:20 +msgid "" +"Adds a point at the [code]position[/code]. Appends the point at the end of " +"the line.\n" +"If [code]at_position[/code] is given, the point is inserted before the point " +"number [code]at_position[/code], moving that point (and every point after) " +"after the inserted point. If [code]at_position[/code] is not given, or is an " +"illegal value ([code]at_position < 0[/code] or [code]at_position >= [method " +"get_point_count][/code]), the point will be appended at the end of the point " +"list." +msgstr "" + +#: doc/classes/Line2D.xml:28 +msgid "Removes all points from the line." +msgstr "" + +#: doc/classes/Line2D.xml:35 +msgid "Returns the Line2D's amount of points." +msgstr "" + +#: doc/classes/Line2D.xml:44 +msgid "Returns point [code]i[/code]'s position." +msgstr "" + +#: doc/classes/Line2D.xml:53 +msgid "Removes the point at index [code]i[/code] from the line." +msgstr "" + +#: doc/classes/Line2D.xml:64 +msgid "" +"Overwrites the position in point [code]i[/code] with the supplied " +"[code]position[/code]." +msgstr "" + +#: doc/classes/Line2D.xml:70 +msgid "If [code]true[/code], the line's border will be anti-aliased." +msgstr "" + +#: doc/classes/Line2D.xml:73 +msgid "" +"Controls the style of the line's first point. Use [enum LineCapMode] " +"constants." +msgstr "" + +#: doc/classes/Line2D.xml:76 +msgid "The line's color. Will not be used if a gradient is set." +msgstr "" + +#: doc/classes/Line2D.xml:79 +msgid "" +"Controls the style of the line's last point. Use [enum LineCapMode] " +"constants." +msgstr "" + +#: doc/classes/Line2D.xml:82 +msgid "" +"The gradient is drawn through the whole line from start to finish. The " +"default color will not be used if a gradient is set." +msgstr "" + +#: doc/classes/Line2D.xml:85 +msgid "The style for the points between the start and the end." +msgstr "" + +#: doc/classes/Line2D.xml:88 +msgid "" +"The points that form the lines. The line is drawn between every point set in " +"this array." +msgstr "" + +#: doc/classes/Line2D.xml:91 +msgid "" +"The smoothness of the rounded joints and caps. This is only used if a cap or " +"joint is set as round." +msgstr "" + +#: doc/classes/Line2D.xml:94 +msgid "" +"The direction difference in radians between vector points. This value is " +"only used if [code]joint mode[/code] is set to [constant LINE_JOINT_SHARP]." +msgstr "" + +#: doc/classes/Line2D.xml:97 +msgid "" +"The texture used for the line's texture. Uses [code]texture_mode[/code] for " +"drawing style." +msgstr "" + +#: doc/classes/Line2D.xml:100 +msgid "" +"The style to render the [code]texture[/code] on the line. Use [enum " +"LineTextureMode] constants." +msgstr "" + +#: doc/classes/Line2D.xml:103 +msgid "The line's width." +msgstr "" + +#: doc/classes/Line2D.xml:106 +msgid "" +"The line's width varies with the curve. The original width is simply " +"multiply by the value of the Curve." +msgstr "" + +#: doc/classes/Line2D.xml:111 +msgid "" +"The line's joints will be pointy. If [code]sharp_limit[/code] is greater " +"than the rotation of a joint, it becomes a bevel joint instead." +msgstr "" + +#: doc/classes/Line2D.xml:114 +msgid "The line's joints will be bevelled/chamfered." +msgstr "" + +#: doc/classes/Line2D.xml:117 +msgid "The line's joints will be rounded." +msgstr "" + +#: doc/classes/Line2D.xml:120 +msgid "Don't draw a line cap." +msgstr "" + +#: doc/classes/Line2D.xml:123 +msgid "Draws the line cap as a box." +msgstr "" + +#: doc/classes/Line2D.xml:126 +msgid "Draws the line cap as a circle." +msgstr "" + +#: doc/classes/Line2D.xml:129 +msgid "" +"Takes the left pixels of the texture and renders it over the whole line." +msgstr "" + +#: doc/classes/Line2D.xml:132 +msgid "" +"Tiles the texture over the line. The texture must be imported with " +"[b]Repeat[/b] enabled for it to work properly." +msgstr "" + +#: doc/classes/Line2D.xml:135 +msgid "" +"Stretches the texture across the line. Import the texture with [b]Repeat[/b] " +"disabled for best results." +msgstr "" + +#: doc/classes/LineEdit.xml:4 +msgid "Control that provides single-line string editing." +msgstr "" + +#: doc/classes/LineEdit.xml:7 +msgid "" +"LineEdit provides a single-line string editor, used for text fields.\n" +"It features many built-in shortcuts which will always be available " +"([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" +"- [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 +msgid "" +"Adds [code]text[/code] after the cursor. If the resulting value is longer " +"than [member max_length], nothing happens." +msgstr "" + +#: doc/classes/LineEdit.xml:46 +msgid "Erases the [LineEdit] text." +msgstr "" + +#: doc/classes/LineEdit.xml:53 +msgid "Clears the current selection." +msgstr "" + +#: doc/classes/LineEdit.xml:60 +msgid "" +"Returns the [PopupMenu] of this [LineEdit]. By default, this menu is " +"displayed when right-clicking on the [LineEdit]." +msgstr "" + +#: doc/classes/LineEdit.xml:69 +msgid "Executes a given action as defined in the [enum MenuItems] enum." +msgstr "" + +#: doc/classes/LineEdit.xml:80 +msgid "" +"Selects characters inside [LineEdit] between [code]from[/code] and [code]to[/" +"code]. By default, [code]from[/code] is at the beginning and [code]to[/code] " +"at the end.\n" +"[codeblock]\n" +"text = \"Welcome\"\n" +"select() # Will select \"Welcome\".\n" +"select(4) # Will select \"ome\".\n" +"select(2, 5) # Will select \"lco\".\n" +"[/codeblock]" +msgstr "" + +#: doc/classes/LineEdit.xml:93 +msgid "Selects the whole [String]." +msgstr "" + +#: doc/classes/LineEdit.xml:99 +msgid "Text alignment as defined in the [enum Align] enum." +msgstr "" + +#: doc/classes/LineEdit.xml:102 doc/classes/TextEdit.xml:395 +msgid "If [code]true[/code], the caret (visual cursor) blinks." +msgstr "" + +#: doc/classes/LineEdit.xml:105 doc/classes/TextEdit.xml:398 +msgid "Duration (in seconds) of a caret's blinking cycle." +msgstr "" + +#: doc/classes/LineEdit.xml:108 +msgid "" +"The cursor's position inside the [LineEdit]. When set, the text may scroll " +"to accommodate it." +msgstr "" + +#: doc/classes/LineEdit.xml:111 +msgid "" +"If [code]true[/code], the [LineEdit] will show a clear button if [code]text[/" +"code] is not empty, which can be used to clear the text quickly." +msgstr "" + +#: doc/classes/LineEdit.xml:114 +msgid "If [code]true[/code], the context menu will appear when right-clicked." +msgstr "" + +#: doc/classes/LineEdit.xml:117 +msgid "" +"If [code]false[/code], existing text cannot be modified and new text cannot " +"be added." +msgstr "" + +#: doc/classes/LineEdit.xml:120 +msgid "" +"If [code]true[/code], the [LineEdit] width will increase to stay longer than " +"the [member text]. It will [b]not[/b] compress if the [member text] is " +"shortened." +msgstr "" + +#: doc/classes/LineEdit.xml:124 +msgid "" +"Maximum amount of characters that can be entered inside the [LineEdit]. If " +"[code]0[/code], there is no limit." +msgstr "" + +#: doc/classes/LineEdit.xml:128 +msgid "" +"Opacity of the [member placeholder_text]. From [code]0[/code] to [code]1[/" +"code]." +msgstr "" + +#: doc/classes/LineEdit.xml:131 +msgid "" +"Text shown when the [LineEdit] is empty. It is [b]not[/b] the [LineEdit]'s " +"default value (see [member text])." +msgstr "" + +#: doc/classes/LineEdit.xml:134 +msgid "" +"Sets the icon that will appear in the right end of the [LineEdit] if there's " +"no [member text], or always, if [member clear_button_enabled] is set to " +"[code]false[/code]." +msgstr "" + +#: doc/classes/LineEdit.xml:137 +msgid "" +"If [code]true[/code], every character is replaced with the secret character " +"(see [member secret_character])." +msgstr "" + +#: doc/classes/LineEdit.xml:140 +msgid "" +"The character to use to mask secret input (defaults to \"*\"). Only a single " +"character can be used as the secret character." +msgstr "" + +#: doc/classes/LineEdit.xml:143 +msgid "" +"If [code]false[/code], it's impossible to select the text using mouse nor " +"keyboard." +msgstr "" + +#: doc/classes/LineEdit.xml:146 +msgid "If [code]false[/code], using shortcuts will be disabled." +msgstr "" + +#: doc/classes/LineEdit.xml:149 +msgid "" +"String value of the [LineEdit].\n" +"[b]Note:[/b] Changing text using this property won't emit the [signal " +"text_changed] signal." +msgstr "" + +#: doc/classes/LineEdit.xml:156 +msgid "" +"Emitted when trying to append text that would overflow the [member " +"max_length]." +msgstr "" + +#: doc/classes/LineEdit.xml:163 doc/classes/TextEdit.xml:514 +msgid "Emitted when the text changes." +msgstr "" + +#: doc/classes/LineEdit.xml:170 +msgid "Emitted when the user presses [constant KEY_ENTER] on the [LineEdit]." +msgstr "" + +#: doc/classes/LineEdit.xml:176 +msgid "Aligns the text on the left-hand side of the [LineEdit]." +msgstr "" + +#: doc/classes/LineEdit.xml:179 +msgid "Centers the text in the middle of the [LineEdit]." +msgstr "" + +#: doc/classes/LineEdit.xml:182 +msgid "Aligns the text on the right-hand side of the [LineEdit]." +msgstr "" + +#: doc/classes/LineEdit.xml:185 +msgid "Stretches whitespaces to fit the [LineEdit]'s width." +msgstr "" + +#: 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:538 +msgid "Copies the selected text." +msgstr "" + +#: doc/classes/LineEdit.xml:194 +msgid "" +"Pastes the clipboard text over the selected text (or at the cursor's " +"position).\n" +"Non-printable escape characters are automatically stripped from the OS " +"clipboard via [method String.strip_escapes]." +msgstr "" + +#: doc/classes/LineEdit.xml:198 +msgid "Erases the whole [LineEdit] text." +msgstr "" + +#: doc/classes/LineEdit.xml:201 +msgid "Selects the whole [LineEdit] text." +msgstr "" + +#: doc/classes/LineEdit.xml:204 doc/classes/TextEdit.xml:550 +msgid "Undoes the previous action." +msgstr "" + +#: doc/classes/LineEdit.xml:207 +msgid "Reverse the last undo action." +msgstr "" + +#: doc/classes/LineEdit.xml:210 doc/classes/TextEdit.xml:556 +msgid "Represents the size of the [enum MenuItems] enum." +msgstr "" + +#: doc/classes/LineEdit.xml:215 +msgid "Texture for the clear button. See [member clear_button_enabled]." +msgstr "" + +#: doc/classes/LineEdit.xml:218 +msgid "Color used as default tint for the clear button." +msgstr "" + +#: doc/classes/LineEdit.xml:221 +msgid "Color used for the clear button when it's pressed." +msgstr "" + +#: doc/classes/LineEdit.xml:224 +msgid "Color of the [LineEdit]'s visual cursor (caret)." +msgstr "" + +#: doc/classes/LineEdit.xml:227 +msgid "Background used when [LineEdit] has GUI focus." +msgstr "" + +#: doc/classes/LineEdit.xml:230 +msgid "Font used for the text." +msgstr "" + +#: doc/classes/LineEdit.xml:233 +msgid "Default font color." +msgstr "" + +#: doc/classes/LineEdit.xml:236 +msgid "Font color for selected text (inside the selection rectangle)." +msgstr "" + +#: doc/classes/LineEdit.xml:239 +msgid "Font color when editing is disabled." +msgstr "" + +#: doc/classes/LineEdit.xml:242 +msgid "" +"Minimum horizontal space for the text (not counting the clear button and " +"content margins). This value is measured in count of space characters (i.e. " +"this amount of space characters can be displayed without scrolling)." +msgstr "" + +#: doc/classes/LineEdit.xml:245 +msgid "Default background for the [LineEdit]." +msgstr "" + +#: doc/classes/LineEdit.xml:248 +msgid "" +"Background used when [LineEdit] is in read-only mode ([member editable] is " +"set to [code]false[/code])." +msgstr "" + +#: doc/classes/LineEdit.xml:251 +msgid "Color of the selection rectangle." +msgstr "" + +#: doc/classes/LineShape2D.xml:4 +msgid "Line shape for 2D collisions." +msgstr "" + +#: doc/classes/LineShape2D.xml:7 +msgid "" +"Line shape for 2D collisions. It works like a 2D plane and will not allow " +"any physics body to go to the negative side. Not recommended for rigid " +"bodies, and usually not recommended for static bodies either because it " +"forces checks against it on every frame." +msgstr "" + +#: doc/classes/LineShape2D.xml:15 +msgid "The line's distance from the origin." +msgstr "" + +#: doc/classes/LineShape2D.xml:18 +msgid "The line's normal." +msgstr "" + +#: doc/classes/LinkButton.xml:4 +msgid "Simple button used to represent a link to some resource." +msgstr "" + +#: doc/classes/LinkButton.xml:7 +msgid "" +"This kind of button is primarily used when the interaction with the button " +"causes a context change (like linking to a web page)." +msgstr "" + +#: doc/classes/LinkButton.xml:21 +msgid "" +"Determines when to show the underline. See [enum UnderlineMode] for options." +msgstr "" + +#: doc/classes/LinkButton.xml:26 +msgid "The LinkButton will always show an underline at the bottom of its text." +msgstr "" + +#: doc/classes/LinkButton.xml:29 +msgid "" +"The LinkButton will show an underline at the bottom of its text when the " +"mouse cursor is over it." +msgstr "" + +#: doc/classes/LinkButton.xml:32 +msgid "The LinkButton will never show an underline at the bottom of its text." +msgstr "" + +#: doc/classes/LinkButton.xml:37 +msgid "" +"[StyleBox] used when the [LinkButton] is focused. It is displayed over the " +"current [StyleBox], so using [StyleBoxEmpty] will just disable the focus " +"visual effect." +msgstr "" + +#: doc/classes/LinkButton.xml:40 +msgid "[Font] of the [LinkButton]'s text." +msgstr "" + +#: doc/classes/LinkButton.xml:43 +msgid "Default text [Color] of the [LinkButton]." +msgstr "" + +#: doc/classes/LinkButton.xml:46 +msgid "Text [Color] used when the [LinkButton] is being hovered." +msgstr "" + +#: doc/classes/LinkButton.xml:49 +msgid "Text [Color] used when the [LinkButton] is being pressed." +msgstr "" + +#: doc/classes/LinkButton.xml:52 +msgid "The vertical space between the baseline of text and the underline." +msgstr "" + +#: doc/classes/Listener3D.xml:4 +msgid "Overrides the location sounds are heard from." +msgstr "" + +#: doc/classes/Listener3D.xml:7 +msgid "" +"Once added to the scene tree and enabled using [method make_current], this " +"node will override the location sounds are heard from. This can be used to " +"listen from a location different from the [Camera3D].\n" +"[b]Note:[/b] There is no 2D equivalent for this node yet." +msgstr "" + +#: doc/classes/Listener3D.xml:17 +msgid "Disables the listener to use the current camera's listener instead." +msgstr "" + +#: doc/classes/Listener3D.xml:24 +msgid "Returns the listener's global orthonormalized [Transform]." +msgstr "" + +#: doc/classes/Listener3D.xml:31 +msgid "" +"Returns [code]true[/code] if the listener was made current using [method " +"make_current], [code]false[/code] otherwise.\n" +"[b]Note:[/b] There may be more than one Listener3D marked as \"current\" in " +"the scene tree, but only the one that was made current last will be used." +msgstr "" + +#: doc/classes/Listener3D.xml:39 +msgid "Enables the listener. This will override the current camera's listener." +msgstr "" + +#: doc/classes/MainLoop.xml:4 +msgid "Abstract base class for the game's main loop." +msgstr "" + +#: doc/classes/MainLoop.xml:7 +msgid "" +"[MainLoop] is the abstract base class for a Godot project's game loop. It is " +"inherited by [SceneTree], which is the default game loop implementation used " +"in Godot projects, though it is also possible to write and use one's own " +"[MainLoop] subclass instead of the scene tree.\n" +"Upon the application start, a [MainLoop] implementation must be provided to " +"the OS; otherwise, the application will exit. This happens automatically " +"(and a [SceneTree] is created) unless a main [Script] is provided from the " +"command line (with e.g. [code]godot -s my_loop.gd[/code], which should then " +"be a [MainLoop] implementation.\n" +"Here is an example script implementing a simple [MainLoop]:\n" +"[b]FIXME:[/b] No longer valid after DisplayServer split and Input " +"refactoring.\n" +"[codeblock]\n" +"extends MainLoop\n" +"\n" +"var time_elapsed = 0\n" +"var keys_typed = []\n" +"var quit = false\n" +"\n" +"func _initialize():\n" +" print(\"Initialized:\")\n" +" print(\" Starting time: %s\" % str(time_elapsed))\n" +"\n" +"func _idle(delta):\n" +" time_elapsed += delta\n" +" # Return true to end the main loop.\n" +" return quit\n" +"\n" +"func _input_event(event):\n" +" # Record keys.\n" +" if event is InputEventKey and event.pressed and !event.echo:\n" +" keys_typed.append(OS.get_keycode_string(event.keycode))\n" +" # Quit on Escape press.\n" +" if event.keycode == KEY_ESCAPE:\n" +" quit = true\n" +" # Quit on any mouse click.\n" +" if event is InputEventMouseButton:\n" +" quit = true\n" +"\n" +"func _finalize():\n" +" print(\"Finalized:\")\n" +" print(\" End time: %s\" % str(time_elapsed))\n" +" print(\" Keys typed: %s\" % var2str(keys_typed))\n" +"[/codeblock]" +msgstr "" + +#: doc/classes/MainLoop.xml:51 +msgid "Called before the program exits." +msgstr "" + +#: doc/classes/MainLoop.xml:60 +msgid "" +"Called each idle frame with the time since the last idle frame as argument " +"(in seconds). Equivalent to [method Node._process].\n" +"If implemented, the method must return a boolean value. [code]true[/code] " +"ends the main loop, while [code]false[/code] lets it proceed to the next " +"frame." +msgstr "" + +#: doc/classes/MainLoop.xml:68 +msgid "Called once during initialization." +msgstr "" + +#: doc/classes/MainLoop.xml:77 +msgid "" +"Called each physics frame with the time since the last physics frame as " +"argument (in seconds). Equivalent to [method Node._physics_process].\n" +"If implemented, the method must return a boolean value. [code]true[/code] " +"ends the main loop, while [code]false[/code] lets it proceed to the next " +"frame." +msgstr "" + +#: doc/classes/MainLoop.xml:85 +msgid "" +"Should not be called manually, override [method _finalize] instead. Will be " +"removed in Godot 4.0." +msgstr "" + +#: doc/classes/MainLoop.xml:94 +msgid "" +"Should not be called manually, override [method _idle] instead. Will be " +"removed in Godot 4.0." +msgstr "" + +#: doc/classes/MainLoop.xml:101 +msgid "" +"Should not be called manually, override [method _initialize] instead. Will " +"be removed in Godot 4.0." +msgstr "" + +#: doc/classes/MainLoop.xml:110 +msgid "" +"Should not be called manually, override [method _iteration] instead. Will be " +"removed in Godot 4.0." +msgstr "" + +#: doc/classes/MainLoop.xml:121 +msgid "Emitted when a user responds to a permission request." +msgstr "" + +#: doc/classes/MainLoop.xml:127 doc/classes/Node.xml:945 +msgid "" +"Notification received from the OS when the application is exceeding its " +"allocated memory.\n" +"Specific to the iOS platform." +msgstr "" + +#: doc/classes/MainLoop.xml:131 doc/classes/Node.xml:949 +msgid "" +"Notification received when translations may have changed. Can be triggered " +"by the user changing the locale. Can be used to respond to language changes, " +"for example to change the UI strings on the fly. Useful when working with " +"the built-in translation support, like [method Object.tr]." +msgstr "" + +#: doc/classes/MainLoop.xml:134 doc/classes/Node.xml:952 +msgid "" +"Notification received from the OS when a request for \"About\" information " +"is sent.\n" +"Specific to the macOS platform." +msgstr "" + +#: doc/classes/MainLoop.xml:138 doc/classes/Node.xml:956 +msgid "" +"Notification received from Godot's crash handler when the engine is about to " +"crash.\n" +"Implemented on desktop platforms if the crash handler is enabled." +msgstr "" + +#: doc/classes/MainLoop.xml:142 doc/classes/Node.xml:960 +msgid "" +"Notification received from the OS when an update of the Input Method Engine " +"occurs (e.g. change of IME cursor position or composition string).\n" +"Specific to the macOS platform." +msgstr "" + +#: doc/classes/MainLoop.xml:146 doc/classes/Node.xml:964 +msgid "" +"Notification received from the OS when the app is resumed.\n" +"Specific to the Android platform." +msgstr "" + +#: doc/classes/MainLoop.xml:150 doc/classes/Node.xml:968 +msgid "" +"Notification received from the OS when the app is paused.\n" +"Specific to the Android platform." +msgstr "" + +#: doc/classes/MarginContainer.xml:4 +msgid "Simple margin container." +msgstr "" + +#: doc/classes/MarginContainer.xml:7 +msgid "" +"Adds a top, left, bottom, and right margin to all [Control] nodes that are " +"direct children of the container. To control the [MarginContainer]'s margin, " +"use the [code]margin_*[/code] theme properties listed below.\n" +"[b]Note:[/b] Be careful, [Control] margin values are different than the " +"constant margin values. If you want to change the custom margin values of " +"the [MarginContainer] by code, you should use the following examples:\n" +"[codeblock]\n" +"var margin_value = 100\n" +"set(\"custom_constants/margin_top\", margin_value)\n" +"set(\"custom_constants/margin_left\", margin_value)\n" +"set(\"custom_constants/margin_bottom\", margin_value)\n" +"set(\"custom_constants/margin_right\", margin_value)\n" +"[/codeblock]" +msgstr "" + +#: doc/classes/MarginContainer.xml:25 +msgid "" +"All direct children of [MarginContainer] will have a bottom margin of " +"[code]margin_bottom[/code] pixels." +msgstr "" + +#: doc/classes/MarginContainer.xml:28 +msgid "" +"All direct children of [MarginContainer] will have a left margin of " +"[code]margin_left[/code] pixels." +msgstr "" + +#: doc/classes/MarginContainer.xml:31 +msgid "" +"All direct children of [MarginContainer] will have a right margin of " +"[code]margin_right[/code] pixels." +msgstr "" + +#: doc/classes/MarginContainer.xml:34 +msgid "" +"All direct children of [MarginContainer] will have a top margin of " +"[code]margin_top[/code] pixels." +msgstr "" + +#: doc/classes/Marshalls.xml:4 +msgid "Data transformation (marshalling) and encoding helpers." +msgstr "" + +#: doc/classes/Marshalls.xml:7 +msgid "Provides data transformation and encoding utility functions." +msgstr "" + +#: doc/classes/Marshalls.xml:18 +msgid "" +"Returns a decoded [PackedByteArray] corresponding to the Base64-encoded " +"string [code]base64_str[/code]." +msgstr "" + +#: doc/classes/Marshalls.xml:27 +msgid "" +"Returns a decoded string corresponding to the Base64-encoded string " +"[code]base64_str[/code]." +msgstr "" + +#: doc/classes/Marshalls.xml:38 +msgid "" +"Returns a decoded [Variant] corresponding to the Base64-encoded string " +"[code]base64_str[/code]. If [code]allow_objects[/code] is [code]true[/code], " +"decoding objects is allowed.\n" +"[b]Warning:[/b] Deserialized objects can contain code which gets executed. " +"Do not use this option if the serialized object comes from untrusted sources " +"to avoid potential security threats such as remote code execution." +msgstr "" + +#: doc/classes/Marshalls.xml:48 +msgid "Returns a Base64-encoded string of a given [PackedByteArray]." +msgstr "" + +#: doc/classes/Marshalls.xml:57 +msgid "" +"Returns a Base64-encoded string of the UTF-8 string [code]utf8_str[/code]." +msgstr "" + +#: doc/classes/Marshalls.xml:68 +msgid "" +"Returns a Base64-encoded string of the [Variant] [code]variant[/code]. If " +"[code]full_objects[/code] is [code]true[/code], encoding objects is allowed " +"(and can potentially include code)." +msgstr "" + +#: doc/classes/Material.xml:4 +msgid "Abstract base [Resource] for coloring and shading geometry." +msgstr "" + +#: doc/classes/Material.xml:7 +msgid "" +"Material is a base [Resource] used for coloring and shading geometry. All " +"materials inherit from it and almost all [VisualInstance3D] derived nodes " +"carry a Material. A few flags and parameters are shared between all material " +"types and are configured here." +msgstr "" + +#: doc/classes/Material.xml:15 +msgid "" +"Sets the [Material] to be used for the next pass. This renders the object " +"again using a different material.\n" +"[b]Note:[/b] only applies to [StandardMaterial3D]s and [ShaderMaterial]s " +"with type \"Spatial\"." +msgstr "" + +#: doc/classes/Material.xml:19 +msgid "" +"Sets the render priority for transparent objects in 3D scenes. Higher " +"priority objects will be sorted in front of lower priority objects.\n" +"[b]Note:[/b] this only applies to sorting of transparent objects. This will " +"not impact how transparent objects are sorted relative to opaque objects. " +"This is because opaque objects are sorted based on depth, while transparent " +"objects are sorted from back to front (subject to priority)." +msgstr "" + +#: doc/classes/Material.xml:25 +msgid "Maximum value for the [member render_priority] parameter." +msgstr "" + +#: doc/classes/Material.xml:28 +msgid "Minimum value for the [member render_priority] parameter." +msgstr "" + +#: doc/classes/MenuButton.xml:4 +msgid "Special button that brings up a [PopupMenu] when clicked." +msgstr "" + +#: doc/classes/MenuButton.xml:7 +msgid "" +"Special button that brings up a [PopupMenu] when clicked.\n" +"New items can be created inside this [PopupMenu] using [code]get_popup()." +"add_item(\"My Item Name\")[/code]. You can also create them directly from " +"the editor. To do so, select the [MenuButton] node, then in the toolbar at " +"the top of the 2D editor, click [b]Items[/b] then click [b]Add[/b] in the " +"popup. You will be able to give each items new properties." +msgstr "" + +#: doc/classes/MenuButton.xml:17 doc/classes/OptionButton.xml:106 +msgid "Returns the [PopupMenu] contained in this button." +msgstr "" + +#: doc/classes/MenuButton.xml:26 +msgid "" +"If [code]true[/code], shortcuts are disabled and cannot be used to trigger " +"the button." +msgstr "" + +#: doc/classes/MenuButton.xml:36 +msgid "" +"If [code]true[/code], when the cursor hovers above another [MenuButton] " +"within the same parent which also has [code]switch_on_hover[/code] enabled, " +"it will close the current [MenuButton] and open the other one." +msgstr "" + +#: doc/classes/MenuButton.xml:43 +msgid "Emitted when the [PopupMenu] of this MenuButton is about to show." +msgstr "" + +#: doc/classes/MenuButton.xml:51 +msgid "[StyleBox] used when the [MenuButton] is disabled." +msgstr "" + +#: doc/classes/MenuButton.xml:54 +msgid "" +"[StyleBox] used when the [MenuButton] is focused. It is displayed over the " +"current [StyleBox], so using [StyleBoxEmpty] will just disable the focus " +"visual effect." +msgstr "" + +#: doc/classes/MenuButton.xml:57 +msgid "[Font] of the [MenuButton]'s text." +msgstr "" + +#: doc/classes/MenuButton.xml:60 +msgid "Default text [Color] of the [MenuButton]." +msgstr "" + +#: doc/classes/MenuButton.xml:63 +msgid "Text [Color] used when the [MenuButton] is disabled." +msgstr "" + +#: doc/classes/MenuButton.xml:66 +msgid "Text [Color] used when the [MenuButton] is being hovered." +msgstr "" + +#: doc/classes/MenuButton.xml:69 +msgid "Text [Color] used when the [MenuButton] is being pressed." +msgstr "" + +#: doc/classes/MenuButton.xml:72 +msgid "[StyleBox] used when the [MenuButton] is being hovered." +msgstr "" + +#: doc/classes/MenuButton.xml:75 +msgid "The horizontal space between [MenuButton]'s icon and text." +msgstr "" + +#: doc/classes/MenuButton.xml:78 +msgid "Default [StyleBox] for the [MenuButton]." +msgstr "" + +#: doc/classes/MenuButton.xml:81 +msgid "[StyleBox] used when the [MenuButton] is being pressed." +msgstr "" + +#: doc/classes/Mesh.xml:4 +msgid "A [Resource] that contains vertex array-based geometry." +msgstr "" + +#: doc/classes/Mesh.xml:7 +msgid "" +"Mesh is a type of [Resource] that contains vertex array-based geometry, " +"divided in [i]surfaces[/i]. Each surface contains a completely separate " +"array and a material used to draw it. Design wise, a mesh with multiple " +"surfaces is preferred to a single surface, because objects created in 3D " +"editing software commonly contain multiple materials." +msgstr "" + +#: doc/classes/Mesh.xml:16 +msgid "Calculate a [ConvexPolygonShape3D] from the mesh." +msgstr "" + +#: doc/classes/Mesh.xml:25 +msgid "" +"Calculate an outline mesh at a defined offset (margin) from the original " +"mesh.\n" +"[b]Note:[/b] This method typically returns the vertices in reverse order (e." +"g. clockwise to counterclockwise)." +msgstr "" + +#: doc/classes/Mesh.xml:33 +msgid "Calculate a [ConcavePolygonShape3D] from the mesh." +msgstr "" + +#: doc/classes/Mesh.xml:40 +msgid "Generate a [TriangleMesh] from the mesh." +msgstr "" + +#: doc/classes/Mesh.xml:47 +msgid "" +"Returns the smallest [AABB] enclosing this mesh. Not affected by " +"[code]custom_aabb[/code].\n" +"[b]Note:[/b] This is only implemented for [ArrayMesh] and [PrimitiveMesh]." +msgstr "" + +#: doc/classes/Mesh.xml:55 +msgid "" +"Returns all the vertices that make up the faces of the mesh. Each three " +"vertices represent one triangle." +msgstr "" + +#: doc/classes/Mesh.xml:62 +msgid "Returns the amount of surfaces that the [Mesh] holds." +msgstr "" + +#: doc/classes/Mesh.xml:71 +msgid "" +"Returns the arrays for the vertices, normals, uvs, etc. that make up the " +"requested surface (see [method ArrayMesh.add_surface_from_arrays])." +msgstr "" + +#: doc/classes/Mesh.xml:80 +msgid "Returns the blend shape arrays for the requested surface." +msgstr "" + +#: doc/classes/Mesh.xml:89 +msgid "" +"Returns a [Material] in a given surface. Surface is rendered using this " +"material." +msgstr "" + +#: doc/classes/Mesh.xml:100 +msgid "" +"Sets a [Material] for a given surface. Surface will be rendered using this " +"material." +msgstr "" + +#: doc/classes/Mesh.xml:106 +msgid "Sets a hint to be used for lightmap resolution." +msgstr "" + +#: doc/classes/Mesh.xml:111 +msgid "Render array as points (one vertex equals one point)." +msgstr "" + +#: doc/classes/Mesh.xml:114 +msgid "Render array as lines (every two vertices a line is created)." +msgstr "" + +#: doc/classes/Mesh.xml:117 +msgid "Render array as line strip." +msgstr "" + +#: doc/classes/Mesh.xml:120 +msgid "Render array as triangles (every three vertices a triangle is created)." +msgstr "" + +#: doc/classes/Mesh.xml:123 +msgid "Render array as triangle strips." +msgstr "" + +#: 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:3309 +msgid "Blend shapes are relative to base weight." +msgstr "" + +#: doc/classes/Mesh.xml:132 +msgid "" +"Mesh array contains vertices. All meshes require a vertex array so this " +"should always be present." +msgstr "" + +#: doc/classes/Mesh.xml:135 +msgid "Mesh array contains normals." +msgstr "" + +#: doc/classes/Mesh.xml:138 +msgid "Mesh array contains tangents." +msgstr "" + +#: doc/classes/Mesh.xml:141 +msgid "Mesh array contains colors." +msgstr "" + +#: doc/classes/Mesh.xml:144 +msgid "Mesh array contains UVs." +msgstr "" + +#: doc/classes/Mesh.xml:147 +msgid "Mesh array contains second UV." +msgstr "" + +#: doc/classes/Mesh.xml:150 +msgid "Mesh array contains bones." +msgstr "" + +#: doc/classes/Mesh.xml:153 +msgid "Mesh array contains bone weights." +msgstr "" + +#: doc/classes/Mesh.xml:156 +msgid "Mesh array uses indices." +msgstr "" + +#: 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:3265 +msgid "Flag used to mark a compressed (half float) tangent array." +msgstr "" + +#: 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:3271 +msgid "Flag used to mark a compressed (half float) UV coordinates array." +msgstr "" + +#: 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:3277 +msgid "Flag used to mark a compressed index array." +msgstr "" + +#: 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:3280 +msgid "" +"Used to set flags [constant ARRAY_COMPRESS_NORMAL], [constant " +"ARRAY_COMPRESS_TANGENT], [constant ARRAY_COMPRESS_COLOR], [constant " +"ARRAY_COMPRESS_TEX_UV] and [constant ARRAY_COMPRESS_TEX_UV2] quickly." +msgstr "" + +#: doc/classes/Mesh.xml:183 +msgid "Array of vertices." +msgstr "" + +#: doc/classes/Mesh.xml:186 +msgid "Array of normals." +msgstr "" + +#: doc/classes/Mesh.xml:189 +msgid "Array of tangents as an array of floats, 4 floats per tangent." +msgstr "" + +#: doc/classes/Mesh.xml:192 +msgid "Array of colors." +msgstr "" + +#: doc/classes/Mesh.xml:195 +msgid "Array of UV coordinates." +msgstr "" + +#: doc/classes/Mesh.xml:198 +msgid "Array of second set of UV coordinates." +msgstr "" + +#: doc/classes/Mesh.xml:201 +msgid "Array of bone data." +msgstr "" + +#: doc/classes/Mesh.xml:204 +msgid "Array of weights." +msgstr "" + +#: doc/classes/Mesh.xml:207 +msgid "Array of indices." +msgstr "" + +#: doc/classes/MeshDataTool.xml:4 +msgid "Helper tool to access and edit [Mesh] data." +msgstr "" + +#: doc/classes/MeshDataTool.xml:7 +msgid "" +"MeshDataTool provides access to individual vertices in a [Mesh]. It allows " +"users to read and edit vertex data of meshes. It also creates an array of " +"faces and edges.\n" +"To use MeshDataTool, load a mesh with [method create_from_surface]. When you " +"are finished editing the data commit the data to a mesh with [method " +"commit_to_surface].\n" +"Below is an example of how MeshDataTool may be used.\n" +"[codeblock]\n" +"var mdt = MeshDataTool.new()\n" +"mdt.create_from_surface(mesh, 0)\n" +"for i in range(mdt.get_vertex_count()):\n" +" var vertex = mdt.get_vertex(i)\n" +" ...\n" +" mdt.set_vertex(i, vertex)\n" +"mesh.surface_remove(0)\n" +"mdt.commit_to_surface(mesh)\n" +"[/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:30 +msgid "Clears all data currently in MeshDataTool." +msgstr "" + +#: doc/classes/MeshDataTool.xml:39 +msgid "Adds a new surface to specified [Mesh] with edited data." +msgstr "" + +#: 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:58 +msgid "Returns the number of edges in this [Mesh]." +msgstr "" + +#: doc/classes/MeshDataTool.xml:67 +msgid "Returns array of faces that touch given edge." +msgstr "" + +#: doc/classes/MeshDataTool.xml:76 +msgid "Returns meta information assigned to given edge." +msgstr "" + +#: 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:95 +msgid "Returns the number of faces in this [Mesh]." +msgstr "" + +#: 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:116 +msgid "Returns the metadata associated with the given face." +msgstr "" + +#: doc/classes/MeshDataTool.xml:125 +msgid "Calculates and returns the face normal of the given face." +msgstr "" + +#: 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: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 " +"normals would return a format of [code]3[/code] because [constant ArrayMesh." +"ARRAY_FORMAT_VERTEX] is [code]1[/code] and [constant ArrayMesh." +"ARRAY_FORMAT_NORMAL] is [code]2[/code].\n" +"See [enum ArrayMesh.ArrayFormat] for a list of format flags." +msgstr "" + +#: doc/classes/MeshDataTool.xml:152 +msgid "Returns the material assigned to the [Mesh]." +msgstr "" + +#: doc/classes/MeshDataTool.xml:161 +msgid "Returns the vertex at given index." +msgstr "" + +#: doc/classes/MeshDataTool.xml:170 +msgid "Returns the bones of the given vertex." +msgstr "" + +#: doc/classes/MeshDataTool.xml:179 +msgid "Returns the color of the given vertex." +msgstr "" + +#: doc/classes/MeshDataTool.xml:186 +msgid "Returns the total number of vertices in [Mesh]." +msgstr "" + +#: doc/classes/MeshDataTool.xml:195 +msgid "Returns an array of edges that share the given vertex." +msgstr "" + +#: doc/classes/MeshDataTool.xml:204 +msgid "Returns an array of faces that share the given vertex." +msgstr "" + +#: doc/classes/MeshDataTool.xml:213 +msgid "Returns the metadata associated with the given vertex." +msgstr "" + +#: doc/classes/MeshDataTool.xml:222 +msgid "Returns the normal of the given vertex." +msgstr "" + +#: doc/classes/MeshDataTool.xml:231 +msgid "Returns the tangent of the given vertex." +msgstr "" + +#: doc/classes/MeshDataTool.xml:240 +msgid "Returns the UV of the given vertex." +msgstr "" + +#: doc/classes/MeshDataTool.xml:249 +msgid "Returns the UV2 of the given vertex." +msgstr "" + +#: doc/classes/MeshDataTool.xml:258 +msgid "Returns bone weights of the given vertex." +msgstr "" + +#: doc/classes/MeshDataTool.xml:269 +msgid "Sets the metadata of the given edge." +msgstr "" + +#: doc/classes/MeshDataTool.xml:280 +msgid "Sets the metadata of the given face." +msgstr "" + +#: doc/classes/MeshDataTool.xml:289 +msgid "Sets the material to be used by newly-constructed [Mesh]." +msgstr "" + +#: doc/classes/MeshDataTool.xml:300 +msgid "Sets the position of the given vertex." +msgstr "" + +#: doc/classes/MeshDataTool.xml:311 +msgid "Sets the bones of the given vertex." +msgstr "" + +#: doc/classes/MeshDataTool.xml:322 +msgid "Sets the color of the given vertex." +msgstr "" + +#: doc/classes/MeshDataTool.xml:333 +msgid "Sets the metadata associated with the given vertex." +msgstr "" + +#: doc/classes/MeshDataTool.xml:344 +msgid "Sets the normal of the given vertex." +msgstr "" + +#: doc/classes/MeshDataTool.xml:355 +msgid "Sets the tangent of the given vertex." +msgstr "" + +#: doc/classes/MeshDataTool.xml:366 +msgid "Sets the UV of the given vertex." +msgstr "" + +#: doc/classes/MeshDataTool.xml:377 +msgid "Sets the UV2 of the given vertex." +msgstr "" + +#: doc/classes/MeshDataTool.xml:388 +msgid "Sets the bone weights of the given vertex." +msgstr "" + +#: doc/classes/MeshInstance2D.xml:4 +msgid "Node used for displaying a [Mesh] in 2D." +msgstr "" + +#: doc/classes/MeshInstance2D.xml:7 +msgid "" +"Node used for displaying a [Mesh] in 2D. Can be constructed from an existing " +"[Sprite2D] via a tool in the editor toolbar. Select \"Sprite2D\" then " +"\"Convert to Mesh2D\", select settings in popup and press \"Create Mesh2D\"." +msgstr "" + +#: doc/classes/MeshInstance2D.xml:10 +msgid "https://docs.godotengine.org/en/latest/tutorials/2d/2d_meshes.html" +msgstr "" + +#: doc/classes/MeshInstance2D.xml:16 +msgid "The [Mesh] that will be drawn by the [MeshInstance2D]." +msgstr "" + +#: doc/classes/MeshInstance2D.xml:19 doc/classes/MultiMeshInstance2D.xml:19 +msgid "" +"The normal map that will be used if using the default [CanvasItemMaterial]." +msgstr "" + +#: doc/classes/MeshInstance2D.xml:22 doc/classes/MultiMeshInstance2D.xml:22 +msgid "" +"The [Texture2D] that will be used if using the default [CanvasItemMaterial]. " +"Can be accessed as [code]TEXTURE[/code] in CanvasItem shader." +msgstr "" + +#: doc/classes/MeshInstance2D.xml:28 doc/classes/MultiMeshInstance2D.xml:28 +msgid "Emitted when the [member texture] is changed." +msgstr "" + +#: doc/classes/MeshInstance3D.xml:4 +msgid "Node that instances meshes into a scenario." +msgstr "" + +#: doc/classes/MeshInstance3D.xml:7 +msgid "" +"MeshInstance3D is a node that takes a [Mesh] resource and adds it to the " +"current scenario by creating an instance of it. This is the class most often " +"used render 3D geometry and can be used to instance a single [Mesh] in many " +"places. This allows reuse of geometry which can save on resources. When a " +"[Mesh] has to be instanced more than thousands of times at close proximity, " +"consider using a [MultiMesh] in a [MultiMeshInstance3D] instead." +msgstr "" + +#: doc/classes/MeshInstance3D.xml:16 +msgid "" +"This helper creates a [StaticBody3D] child node with a " +"[ConvexPolygonShape3D] collision shape calculated from the mesh geometry. " +"It's mainly used for testing." +msgstr "" + +#: doc/classes/MeshInstance3D.xml:23 +msgid "" +"This helper creates a [MeshInstance3D] child node with gizmos at every " +"vertex calculated from the mesh geometry. It's mainly used for testing." +msgstr "" + +#: doc/classes/MeshInstance3D.xml:30 +msgid "" +"This helper creates a [StaticBody3D] child node with a " +"[ConcavePolygonShape3D] collision shape calculated from the mesh geometry. " +"It's mainly used for testing." +msgstr "" + +#: doc/classes/MeshInstance3D.xml:39 +msgid "" +"Returns the [Material] that will be used by the [Mesh] when drawing. This " +"can return the [member GeometryInstance3D.material_override], the surface " +"override [Material] defined in this [MeshInstance3D], or the surface " +"[Material] defined in the [Mesh]. For example, if [member GeometryInstance3D." +"material_override] is used, all surfaces will return the override material." +msgstr "" + +#: doc/classes/MeshInstance3D.xml:48 +msgid "" +"Returns the override [Material] for the specified surface of the [Mesh] " +"resource." +msgstr "" + +#: doc/classes/MeshInstance3D.xml:55 +msgid "Returns the number of surface materials." +msgstr "" + +#: doc/classes/MeshInstance3D.xml:66 +msgid "" +"Sets the override [Material] for the specified surface of the [Mesh] " +"resource. This material is associated with this [MeshInstance3D] rather than " +"with the [Mesh] resource." +msgstr "" + +#: doc/classes/MeshInstance3D.xml:72 +msgid "The [Mesh] resource for the instance." +msgstr "" + +#: doc/classes/MeshInstance3D.xml:75 +msgid "[NodePath] to the [Skeleton3D] associated with the instance." +msgstr "" + +#: doc/classes/MeshInstance3D.xml:78 +msgid "Sets the skin to be used by this instance." +msgstr "" + +#: doc/classes/MeshLibrary.xml:4 +msgid "Library of meshes." +msgstr "" + +#: doc/classes/MeshLibrary.xml:7 +msgid "" +"A library of meshes. Contains a list of [Mesh] resources, each with a name " +"and ID. Each item can also include collision and navigation shapes. This " +"resource is used in [GridMap]." +msgstr "" + +#: doc/classes/MeshLibrary.xml:16 +msgid "Clears the library." +msgstr "" + +#: doc/classes/MeshLibrary.xml:25 +msgid "" +"Creates a new item in the library with the given ID.\n" +"You can get an unused ID from [method get_last_unused_item_id]." +msgstr "" + +#: doc/classes/MeshLibrary.xml:35 +msgid "Returns the first item with the given name." +msgstr "" + +#: doc/classes/MeshLibrary.xml:42 +msgid "Returns the list of item IDs in use." +msgstr "" + +#: doc/classes/MeshLibrary.xml:51 +msgid "Returns the item's mesh." +msgstr "" + +#: doc/classes/MeshLibrary.xml:60 +msgid "Returns the item's name." +msgstr "" + +#: doc/classes/MeshLibrary.xml:69 +msgid "Returns the item's navigation mesh." +msgstr "" + +#: doc/classes/MeshLibrary.xml:78 +msgid "Returns the transform applied to the item's navigation mesh." +msgstr "" + +#: doc/classes/MeshLibrary.xml:87 +msgid "" +"When running in the editor, returns a generated item preview (a 3D rendering " +"in isometric perspective). When used in a running project, returns the " +"manually-defined item preview which can be set using [method " +"set_item_preview]. Returns an empty [Texture2D] if no preview was manually " +"set in a running project." +msgstr "" + +#: doc/classes/MeshLibrary.xml:96 +msgid "" +"Returns an item's collision shapes.\n" +"The array consists of each [Shape3D] followed by its [Transform]." +msgstr "" + +#: doc/classes/MeshLibrary.xml:104 +msgid "Gets an unused ID for a new item." +msgstr "" + +#: doc/classes/MeshLibrary.xml:113 +msgid "Removes the item." +msgstr "" + +#: doc/classes/MeshLibrary.xml:124 +msgid "Sets the item's mesh." +msgstr "" + +#: doc/classes/MeshLibrary.xml:135 +msgid "" +"Sets the item's name.\n" +"This name is shown in the editor. It can also be used to look up the item " +"later using [method find_item_by_name]." +msgstr "" + +#: doc/classes/MeshLibrary.xml:147 +msgid "Sets the item's navigation mesh." +msgstr "" + +#: doc/classes/MeshLibrary.xml:158 +msgid "Sets the transform to apply to the item's navigation mesh." +msgstr "" + +#: doc/classes/MeshLibrary.xml:169 +msgid "Sets a texture to use as the item's preview icon in the editor." +msgstr "" + +#: doc/classes/MeshLibrary.xml:180 +msgid "" +"Sets an item's collision shapes.\n" +"The array should consist of [Shape3D] objects, each followed by a " +"[Transform] that will be applied to it. For shapes that should not have a " +"transform, use [constant Transform.IDENTITY]." +msgstr "" + +#: doc/classes/MeshTexture.xml:4 +msgid "Simple texture that uses a mesh to draw itself." +msgstr "" + +#: doc/classes/MeshTexture.xml:7 +msgid "" +"Simple texture that uses a mesh to draw itself. It's limited because flags " +"can't be changed and region drawing is not supported." +msgstr "" + +#: doc/classes/MeshTexture.xml:15 +msgid "Sets the base texture that the Mesh will use to draw." +msgstr "" + +#: doc/classes/MeshTexture.xml:18 +msgid "Sets the size of the image, needed for reference." +msgstr "" + +#: doc/classes/MeshTexture.xml:21 +msgid "Sets the mesh used to draw. It must be a mesh using 2D vertices." +msgstr "" + +#: modules/mobile_vr/doc_classes/MobileVRInterface.xml:4 +msgid "Generic mobile VR implementation." +msgstr "" + +#: modules/mobile_vr/doc_classes/MobileVRInterface.xml:7 +msgid "" +"This is a generic mobile VR implementation where you need to provide details " +"about the phone and HMD used. It does not rely on any existing framework. " +"This is the most basic interface we have. For the best effect, you need a " +"mobile phone with a gyroscope and accelerometer.\n" +"Note that even though there is no positional tracking, the camera will " +"assume the headset is at a height of 1.85 meters. You can change this by " +"setting [member eye_height].\n" +"You can initialise this interface as follows:\n" +"[codeblock]\n" +"var interface = XRServer.find_interface(\"Native mobile\")\n" +"if interface and interface.initialize():\n" +" get_viewport().xr = true\n" +"[/codeblock]" +msgstr "" + +#: modules/mobile_vr/doc_classes/MobileVRInterface.xml:22 +msgid "" +"The distance between the display and the lenses inside of the device in " +"centimeters." +msgstr "" + +#: modules/mobile_vr/doc_classes/MobileVRInterface.xml:25 +msgid "The width of the display in centimeters." +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. " +"[XROrigin3D] node)." +msgstr "" + +#: modules/mobile_vr/doc_classes/MobileVRInterface.xml:31 +msgid "" +"The interocular distance, also known as the interpupillary distance. The " +"distance between the pupils of the left and right eye." +msgstr "" + +#: modules/mobile_vr/doc_classes/MobileVRInterface.xml:34 +msgid "" +"The k1 lens factor is one of the two constants that define the strength of " +"the lens used and directly influences the lens distortion effect." +msgstr "" + +#: modules/mobile_vr/doc_classes/MobileVRInterface.xml:37 +msgid "The k2 lens factor, see k1." +msgstr "" + +#: modules/mobile_vr/doc_classes/MobileVRInterface.xml:40 +msgid "" +"The oversample setting. Because of the lens distortion we have to render our " +"buffers at a higher resolution then the screen can natively handle. A value " +"between 1.5 and 2.0 often provides good results but at the cost of " +"performance." +msgstr "" + +#: doc/classes/MultiMesh.xml:4 +msgid "Provides high-performance mesh instancing." +msgstr "" + +#: doc/classes/MultiMesh.xml:7 +msgid "" +"MultiMesh provides low-level mesh instancing. Drawing thousands of " +"[MeshInstance3D] nodes can be slow, since each object is submitted to the " +"GPU then drawn individually.\n" +"MultiMesh is much faster as it can draw thousands of instances with a single " +"draw call, resulting in less API overhead.\n" +"As a drawback, if the instances are too far away of each other, performance " +"may be reduced as every single instance will always rendered (they are " +"spatially indexed as one, for the whole object).\n" +"Since instances may have any behavior, the AABB used for visibility must be " +"provided by the user." +msgstr "" + +#: doc/classes/MultiMesh.xml:13 doc/classes/MultiMeshInstance3D.xml:11 +msgid "" +"https://docs.godotengine.org/en/latest/tutorials/3d/vertex_animation/" +"animating_thousands_of_fish.html" +msgstr "" + +#: doc/classes/MultiMesh.xml:14 doc/classes/MultiMeshInstance3D.xml:13 +msgid "" +"https://docs.godotengine.org/en/latest/tutorials/optimization/" +"using_multimesh.html" +msgstr "" + +#: doc/classes/MultiMesh.xml:21 +msgid "Returns the visibility axis-aligned bounding box." +msgstr "" + +#: doc/classes/MultiMesh.xml:30 +msgid "Gets a specific instance's color." +msgstr "" + +#: doc/classes/MultiMesh.xml:39 +msgid "Returns the custom data that has been set for a specific instance." +msgstr "" + +#: doc/classes/MultiMesh.xml:48 +msgid "Returns the [Transform] of a specific instance." +msgstr "" + +#: doc/classes/MultiMesh.xml:57 +msgid "Returns the [Transform2D] of a specific instance." +msgstr "" + +#: doc/classes/MultiMesh.xml:68 +msgid "" +"Sets the color of a specific instance.\n" +"For the color to take effect, ensure that [member use_colors] is [code]true[/" +"code] on the [MultiMesh] and [member BaseMaterial3D." +"vertex_color_use_as_albedo] is [code]true[/code] on the material." +msgstr "" + +#: doc/classes/MultiMesh.xml:80 +msgid "" +"Sets custom data for a specific instance. Although [Color] is used, it is " +"just a container for 4 floating point numbers.\n" +"For the custom data to be used, ensure that [member use_custom_data] is " +"[code]true[/code]." +msgstr "" + +#: doc/classes/MultiMesh.xml:92 +msgid "Sets the [Transform] for a specific instance." +msgstr "" + +#: doc/classes/MultiMesh.xml:103 +msgid "Sets the [Transform2D] for a specific instance." +msgstr "" + +#: doc/classes/MultiMesh.xml:115 +msgid "" +"Number of instances that will get drawn. This clears and (re)sizes the " +"buffers. By default, all instances are drawn but you can limit this with " +"[member visible_instance_count]." +msgstr "" + +#: doc/classes/MultiMesh.xml:118 +msgid "Mesh to be drawn." +msgstr "" + +#: doc/classes/MultiMesh.xml:125 +msgid "Format of transform used to transform mesh, either 2D or 3D." +msgstr "" + +#: doc/classes/MultiMesh.xml:128 +msgid "" +"If [code]true[/code], the [MultiMesh] will use color data (see [member " +"color_array])." +msgstr "" + +#: doc/classes/MultiMesh.xml:131 +msgid "" +"If [code]true[/code], the [MultiMesh] will use custom data (see [member " +"custom_data_array])." +msgstr "" + +#: doc/classes/MultiMesh.xml:134 +msgid "" +"Limits the number of instances drawn, -1 draws all instances. Changing this " +"does not change the sizes of the buffers." +msgstr "" + +#: doc/classes/MultiMesh.xml:139 +msgid "Use this when using 2D transforms." +msgstr "" + +#: doc/classes/MultiMesh.xml:142 +msgid "Use this when using 3D transforms." +msgstr "" + +#: doc/classes/MultiMeshInstance2D.xml:4 +msgid "Node that instances a [MultiMesh] in 2D." +msgstr "" + +#: doc/classes/MultiMeshInstance2D.xml:7 +msgid "" +"[MultiMeshInstance2D] is a specialized node to instance a [MultiMesh] " +"resource in 2D.\n" +"Usage is the same as [MultiMeshInstance3D]." +msgstr "" + +#: doc/classes/MultiMeshInstance2D.xml:16 +msgid "The [MultiMesh] that will be drawn by the [MultiMeshInstance2D]." +msgstr "" + +#: doc/classes/MultiMeshInstance3D.xml:4 +msgid "Node that instances a [MultiMesh]." +msgstr "" + +#: doc/classes/MultiMeshInstance3D.xml:7 +msgid "" +"[MultiMeshInstance3D] is a specialized node to instance " +"[GeometryInstance3D]s based on a [MultiMesh] resource.\n" +"This is useful to optimize the rendering of a high amount of instances of a " +"given mesh (for example trees in a forest or grass strands)." +msgstr "" + +#: doc/classes/MultiMeshInstance3D.xml:12 +msgid "" +"https://docs.godotengine.org/en/latest/tutorials/3d/" +"using_multi_mesh_instance.html" +msgstr "" + +#: doc/classes/MultiMeshInstance3D.xml:19 +msgid "" +"The [MultiMesh] resource that will be used and shared among all instances of " +"the [MultiMeshInstance3D]." +msgstr "" + +#: doc/classes/MultiplayerAPI.xml:4 +msgid "High-level multiplayer API." +msgstr "" + +#: doc/classes/MultiplayerAPI.xml:7 +msgid "" +"This class implements most of the logic behind the high-level multiplayer " +"API.\n" +"By default, [SceneTree] has a reference to this class that is used to " +"provide multiplayer capabilities (i.e. RPC/RSET) across the whole scene.\n" +"It is possible to override the MultiplayerAPI instance used by specific " +"Nodes by setting the [member Node.custom_multiplayer] property, effectively " +"allowing to run both client and server in the same scene." +msgstr "" + +#: doc/classes/MultiplayerAPI.xml:18 +msgid "" +"Clears the current MultiplayerAPI network state (you shouldn't call this " +"unless you know what you are doing)." +msgstr "" + +#: doc/classes/MultiplayerAPI.xml:25 +msgid "" +"Returns the peer IDs of all connected peers of this MultiplayerAPI's [member " +"network_peer]." +msgstr "" + +#: doc/classes/MultiplayerAPI.xml:32 +msgid "" +"Returns the unique peer ID of this MultiplayerAPI's [member network_peer]." +msgstr "" + +#: doc/classes/MultiplayerAPI.xml:39 +msgid "" +"Returns the sender's peer ID for the RPC currently being executed.\n" +"[b]Note:[/b] If not inside an RPC this method will return 0." +msgstr "" + +#: doc/classes/MultiplayerAPI.xml:47 doc/classes/SceneTree.xml:135 +msgid "Returns [code]true[/code] if there is a [member network_peer] set." +msgstr "" + +#: doc/classes/MultiplayerAPI.xml:54 +msgid "" +"Returns [code]true[/code] if this MultiplayerAPI's [member network_peer] is " +"in server mode (listening for connections)." +msgstr "" + +#: doc/classes/MultiplayerAPI.xml:61 +msgid "" +"Method used for polling the MultiplayerAPI. You only need to worry about " +"this if you are using [member Node.custom_multiplayer] override or you set " +"[member SceneTree.multiplayer_poll] to [code]false[/code]. By default, " +"[SceneTree] will poll its MultiplayerAPI for you.\n" +"[b]Note:[/b] This method results in RPCs and RSETs being called, so they " +"will be executed in the same context of this function (e.g. [code]_process[/" +"code], [code]physics[/code], [Thread])." +msgstr "" + +#: doc/classes/MultiplayerAPI.xml:75 +msgid "" +"Sends the given raw [code]bytes[/code] to a specific peer identified by " +"[code]id[/code] (see [method NetworkedMultiplayerPeer.set_target_peer]). " +"Default ID is [code]0[/code], i.e. broadcast to all peers." +msgstr "" + +#: doc/classes/MultiplayerAPI.xml:84 +msgid "" +"Sets the base root node to use for RPCs. Instead of an absolute path, a " +"relative path will be used to find the node upon which the RPC should be " +"executed.\n" +"This effectively allows to have different branches of the scene tree to be " +"managed by different MultiplayerAPI, allowing for example to run both client " +"and server in the same scene." +msgstr "" + +#: doc/classes/MultiplayerAPI.xml:91 +msgid "" +"If [code]true[/code], the MultiplayerAPI will allow encoding and decoding of " +"object during RPCs/RSETs.\n" +"[b]Warning:[/b] Deserialized objects can contain code which gets executed. " +"Do not use this option if the serialized object comes from untrusted sources " +"to avoid potential security threats such as remote code execution." +msgstr "" + +#: doc/classes/MultiplayerAPI.xml:95 +msgid "" +"The peer object to handle the RPC system (effectively enabling networking " +"when set). Depending on the peer itself, the MultiplayerAPI will become a " +"network server (check with [method is_network_server]) and will set root " +"node's network mode to master, or it will become a regular peer with root " +"node set to puppet. All child nodes are set to inherit the network mode by " +"default. Handling of networking-related events (connection, disconnection, " +"new clients) is done by connecting to MultiplayerAPI's signals." +msgstr "" + +#: doc/classes/MultiplayerAPI.xml:98 +msgid "" +"If [code]true[/code], the MultiplayerAPI's [member network_peer] refuses new " +"incoming connections." +msgstr "" + +#: doc/classes/MultiplayerAPI.xml:104 +msgid "" +"Emitted when this MultiplayerAPI's [member network_peer] successfully " +"connected to a server. Only emitted on clients." +msgstr "" + +#: doc/classes/MultiplayerAPI.xml:109 +msgid "" +"Emitted when this MultiplayerAPI's [member network_peer] fails to establish " +"a connection to a server. Only emitted on clients." +msgstr "" + +#: doc/classes/MultiplayerAPI.xml:116 +msgid "" +"Emitted when this MultiplayerAPI's [member network_peer] connects with a new " +"peer. ID is the peer ID of the new peer. Clients get notified when other " +"clients connect to the same server. Upon connecting to a server, a client " +"also receives this signal for the server (with ID being 1)." +msgstr "" + +#: doc/classes/MultiplayerAPI.xml:123 +msgid "" +"Emitted when this MultiplayerAPI's [member network_peer] disconnects from a " +"peer. Clients get notified when other clients disconnect from the same " +"server." +msgstr "" + +#: doc/classes/MultiplayerAPI.xml:132 +msgid "" +"Emitted when this MultiplayerAPI's [member network_peer] receive a " +"[code]packet[/code] with custom data (see [method send_bytes]). ID is the " +"peer ID of the peer that sent the packet." +msgstr "" + +#: doc/classes/MultiplayerAPI.xml:137 +msgid "" +"Emitted when this MultiplayerAPI's [member network_peer] disconnects from " +"server. Only emitted on clients." +msgstr "" + +#: doc/classes/MultiplayerAPI.xml:143 +msgid "" +"Used with [method Node.rpc_config] or [method Node.rset_config] to disable a " +"method or property for all RPC calls, making it unavailable. Default for all " +"methods." +msgstr "" + +#: doc/classes/MultiplayerAPI.xml:146 +msgid "" +"Used with [method Node.rpc_config] or [method Node.rset_config] to set a " +"method to be called or a property to be changed only on the remote end, not " +"locally. Analogous to the [code]remote[/code] keyword. Calls and property " +"changes are accepted from all remote peers, no matter if they are node's " +"master or puppets." +msgstr "" + +#: doc/classes/MultiplayerAPI.xml:149 +msgid "" +"Used with [method Node.rpc_config] or [method Node.rset_config] to set a " +"method to be called or a property to be changed only on the network master " +"for this node. Analogous to the [code]master[/code] keyword. Only accepts " +"calls or property changes from the node's network puppets, see [method Node." +"set_network_master]." +msgstr "" + +#: doc/classes/MultiplayerAPI.xml:152 +msgid "" +"Used with [method Node.rpc_config] or [method Node.rset_config] to set a " +"method to be called or a property to be changed only on puppets for this " +"node. Analogous to the [code]puppet[/code] keyword. Only accepts calls or " +"property changes from the node's network master, see [method Node." +"set_network_master]." +msgstr "" + +#: doc/classes/MultiplayerAPI.xml:155 +msgid "" +"Behave like [constant RPC_MODE_REMOTE] but also make the call or property " +"change locally. Analogous to the [code]remotesync[/code] keyword." +msgstr "" + +#: doc/classes/MultiplayerAPI.xml:158 +msgid "" +"Behave like [constant RPC_MODE_MASTER] but also make the call or property " +"change locally. Analogous to the [code]mastersync[/code] keyword." +msgstr "" + +#: doc/classes/MultiplayerAPI.xml:161 +msgid "" +"Behave like [constant RPC_MODE_PUPPET] but also make the call or property " +"change locally. Analogous to the [code]puppetsync[/code] keyword." +msgstr "" + +#: doc/classes/Mutex.xml:4 +msgid "A synchronization mutex (mutual exclusion)." +msgstr "" + +#: doc/classes/Mutex.xml:7 +msgid "" +"A synchronization mutex (mutual exclusion). This is used to synchronize " +"multiple [Thread]s, and is equivalent to a binary [Semaphore]. It guarantees " +"that only one thread can ever acquire the lock at a time. A mutex can be " +"used to protect a critical section; however, be careful to avoid deadlocks." +msgstr "" + +#: doc/classes/Mutex.xml:10 doc/classes/Semaphore.xml:10 +#: doc/classes/Thread.xml:10 +msgid "" +"https://docs.godotengine.org/en/latest/tutorials/threads/" +"using_multiple_threads.html" +msgstr "" + +#: doc/classes/Mutex.xml:17 +msgid "Locks this [Mutex], blocks until it is unlocked by the current owner." +msgstr "" + +#: doc/classes/Mutex.xml:24 +msgid "" +"Tries locking this [Mutex], but does not block. Returns [constant OK] on " +"success, [constant ERR_BUSY] otherwise." +msgstr "" + +#: doc/classes/Mutex.xml:31 +msgid "Unlocks this [Mutex], leaving it to other threads." +msgstr "" + +#: modules/gdnative/doc_classes/NativeScript.xml:14 +msgid "" +"Returns the documentation string that was previously set with " +"[code]godot_nativescript_set_class_documentation[/code]." +msgstr "" + +#: modules/gdnative/doc_classes/NativeScript.xml:23 +msgid "" +"Returns the documentation string that was previously set with " +"[code]godot_nativescript_set_method_documentation[/code]." +msgstr "" + +#: modules/gdnative/doc_classes/NativeScript.xml:32 +msgid "" +"Returns the documentation string that was previously set with " +"[code]godot_nativescript_set_property_documentation[/code]." +msgstr "" + +#: modules/gdnative/doc_classes/NativeScript.xml:41 +msgid "" +"Returns the documentation string that was previously set with " +"[code]godot_nativescript_set_signal_documentation[/code]." +msgstr "" + +#: modules/gdnative/doc_classes/NativeScript.xml:48 +msgid "" +"Constructs a new object of the base type with a script of this type already " +"attached.\n" +"[i]Note[/i]: Any arguments passed to this function will be ignored and not " +"passed to the native constructor function. This will change with in a future " +"API extension." +msgstr "" + +#: doc/classes/Navigation2D.xml:4 +msgid "2D navigation and pathfinding node." +msgstr "" + +#: doc/classes/Navigation2D.xml:7 +msgid "" +"Navigation2D provides navigation and pathfinding within a 2D area, specified " +"as a collection of [NavigationPolygon] resources. These are automatically " +"collected from child [NavigationRegion2D] nodes." +msgstr "" + +#: doc/classes/Navigation2D.xml:18 doc/classes/Navigation3D.xml:18 +#: doc/classes/NavigationServer2D.xml:175 +msgid "" +"Returns the point closest to the provided [code]to_point[/code] on the " +"navigation mesh surface." +msgstr "" + +#: doc/classes/Navigation2D.xml:27 doc/classes/Navigation3D.xml:36 +msgid "" +"Returns the owner region RID for the point returned by [method " +"get_closest_point]." +msgstr "" + +#: doc/classes/Navigation2D.xml:46 +msgid "" +"Returns the path between two given points. Points are in local coordinate " +"space. If [code]optimize[/code] is [code]true[/code] (the default), the path " +"is smoothed by merging path segments where possible." +msgstr "" + +#: doc/classes/Navigation3D.xml:4 +msgid "Mesh-based navigation and pathfinding node." +msgstr "" + +#: doc/classes/Navigation3D.xml:7 +msgid "" +"Provides navigation and pathfinding within a collection of " +"[NavigationMesh]es. These will be automatically collected from child " +"[NavigationRegion3D] nodes. In addition to basic pathfinding, this class " +"also assists with aligning navigation agents with the meshes they are " +"navigating on." +msgstr "" + +#: doc/classes/Navigation3D.xml:27 +msgid "" +"Returns the normal for the point returned by [method get_closest_point]." +msgstr "" + +#: doc/classes/Navigation3D.xml:49 doc/classes/NavigationServer3D.xml:212 +msgid "" +"Returns the closest point between the navigation surface and the segment." +msgstr "" + +#: doc/classes/Navigation3D.xml:68 +msgid "" +"Returns the path between two given points. Points are in local coordinate " +"space. If [code]optimize[/code] is [code]true[/code] (the default), the " +"agent properties associated with each [NavigationMesh] (radius, height, " +"etc.) are considered in the path calculation, otherwise they are ignored." +msgstr "" + +#: doc/classes/Navigation3D.xml:78 +msgid "" +"Defines which direction is up. By default, this is [code](0, 1, 0)[/code], " +"which is the world's \"up\" direction." +msgstr "" + +#: doc/classes/NavigationAgent2D.xml:4 +msgid "2D Agent used in navigation for collision avoidance." +msgstr "" + +#: doc/classes/NavigationAgent2D.xml:7 +msgid "" +"2D Agent that is used in navigation to reach a location while avoiding " +"static and dynamic obstacles. The dynamic obstacles are avoided using RVO " +"collision avoidance. The agent needs navigation data to work correctly. This " +"can be done by having the agent as a child of a [Navigation2D] node, or " +"using [method set_navigation]. [NavigationAgent2D] is physics safe." +msgstr "" + +#: doc/classes/NavigationAgent2D.xml:16 doc/classes/NavigationAgent3D.xml:16 +msgid "" +"Returns the distance to the target location, using the agent's global " +"position. The user must set the target location with [method " +"set_target_location] in order for this to be accurate." +msgstr "" + +#: doc/classes/NavigationAgent2D.xml:23 +msgid "" +"Returns the reachable final location in global coordinates. This can change " +"if the navigation path is altered in any way." +msgstr "" + +#: doc/classes/NavigationAgent2D.xml:30 doc/classes/NavigationAgent3D.xml:30 +msgid "Returns the path from start to finish in global coordinates." +msgstr "" + +#: doc/classes/NavigationAgent2D.xml:37 +msgid "" +"Returns which index the agent is currently on in the navigation path's " +"[PackedVector2Array]." +msgstr "" + +#: doc/classes/NavigationAgent2D.xml:44 +msgid "" +"Returns the [Navigation2D] node that the agent is using for its navigation " +"system." +msgstr "" + +#: doc/classes/NavigationAgent2D.xml:51 +msgid "" +"Returns a [Vector2] in global coordinates, that can be moved to, making sure " +"that there are no static objects in the way. If the agent does not have a " +"navigation path, it will return the position of the agent's parent." +msgstr "" + +#: doc/classes/NavigationAgent2D.xml:58 +msgid "Returns the user defined [Vector2] after setting the target location." +msgstr "" + +#: doc/classes/NavigationAgent2D.xml:65 doc/classes/NavigationAgent3D.xml:65 +msgid "Returns true if the navigation path's final location has been reached." +msgstr "" + +#: doc/classes/NavigationAgent2D.xml:72 doc/classes/NavigationAgent3D.xml:72 +msgid "" +"Returns true if the target location is reachable. The target location is set " +"using [method set_target_location]." +msgstr "" + +#: doc/classes/NavigationAgent2D.xml:79 doc/classes/NavigationAgent3D.xml:79 +msgid "" +"Returns true if the target location is reached. The target location is set " +"using [method set_target_location]. It may not always be possible to reach " +"the target location. It should always be possible to reach the final " +"location though. See [method get_final_location]." +msgstr "" + +#: doc/classes/NavigationAgent2D.xml:88 +msgid "" +"Sets the [Navigation2D] node used by the agent. Useful when you don't want " +"to make the agent a child of a [Navigation2D] node." +msgstr "" + +#: doc/classes/NavigationAgent2D.xml:97 doc/classes/NavigationAgent3D.xml:97 +msgid "" +"Sets the user desired final location. This will clear the current navigation " +"path." +msgstr "" + +#: doc/classes/NavigationAgent2D.xml:106 doc/classes/NavigationAgent3D.xml:106 +msgid "" +"Sends the passed in velocity to the collision avoidance algorithm. It will " +"adjust the velocity to avoid collisions. Once the adjustment to the velocity " +"is complete, it will emit the [signal velocity_computed] signal." +msgstr "" + +#: doc/classes/NavigationAgent2D.xml:112 doc/classes/NavigationAgent3D.xml:118 +msgid "The maximum number of neighbors for the agent to consider." +msgstr "" + +#: doc/classes/NavigationAgent2D.xml:115 doc/classes/NavigationAgent3D.xml:121 +msgid "The maximum speed that an agent can move." +msgstr "" + +#: doc/classes/NavigationAgent2D.xml:118 doc/classes/NavigationAgent3D.xml:124 +msgid "The distance to search for other agents." +msgstr "" + +#: doc/classes/NavigationAgent2D.xml:121 doc/classes/NavigationAgent3D.xml:127 +msgid "" +"The maximum distance the agent is allowed away from the ideal path to the " +"final location. This can happen due to trying to avoid collisions. When the " +"maximum distance is exceeded, it recalculates the ideal path." +msgstr "" + +#: doc/classes/NavigationAgent2D.xml:124 doc/classes/NavigationAgent3D.xml:130 +msgid "The radius of the agent." +msgstr "" + +#: doc/classes/NavigationAgent2D.xml:127 doc/classes/NavigationAgent3D.xml:133 +msgid "" +"The distance threshold before a target is considered to be reached. This " +"will allow an agent to not have to hit a point on the path exactly, but in " +"the area." +msgstr "" + +#: doc/classes/NavigationAgent2D.xml:130 doc/classes/NavigationAgent3D.xml:136 +msgid "" +"The minimal amount of time for which this agent's velocities, that are " +"computed with the collision avoidance algorithim, are safe with respect to " +"other agents. The larger the number, the sooner the agent will respond to " +"other agents, but less freedom in choosing its velocities. Must be positive." +msgstr "" + +#: doc/classes/NavigationAgent2D.xml:136 doc/classes/NavigationAgent3D.xml:142 +msgid "Notifies when the final location is reached." +msgstr "" + +#: doc/classes/NavigationAgent2D.xml:141 doc/classes/NavigationAgent3D.xml:147 +msgid "Notifies when the navigation path changes." +msgstr "" + +#: doc/classes/NavigationAgent2D.xml:146 doc/classes/NavigationAgent3D.xml:152 +msgid "" +"Notifies when the player defined target, set with [method " +"set_target_location], is reached." +msgstr "" + +#: doc/classes/NavigationAgent2D.xml:153 doc/classes/NavigationAgent3D.xml:159 +msgid "" +"Notifies when the collision avoidance velocity is calculated. Emitted by " +"[method set_velocity]." +msgstr "" + +#: doc/classes/NavigationAgent3D.xml:4 +msgid "3D Agent used in navigation for collision avoidance." +msgstr "" + +#: doc/classes/NavigationAgent3D.xml:7 +msgid "" +"3D Agent that is used in navigation to reach a location while avoiding " +"static and dynamic obstacles. The dynamic obstacles are avoided using RVO " +"collision avoidance. The agent needs navigation data to work correctly. This " +"can be done by having the agent as a child of a [Navigation3D] node, or " +"using [method set_navigation]. [NavigationAgent3D] is physics safe." +msgstr "" + +#: doc/classes/NavigationAgent3D.xml:23 +msgid "" +"Returns the reachable final location in global coordinates. This can change " +"if the navigation path is altered in any way. Because of this, it would be " +"best to check this each frame." +msgstr "" + +#: doc/classes/NavigationAgent3D.xml:37 +msgid "" +"Returns which index the agent is currently on in the navigation path's " +"[PackedVector3Array]." +msgstr "" + +#: doc/classes/NavigationAgent3D.xml:44 +msgid "" +"Returns the [Navigation3D] node that the agent is using for its navigation " +"system." +msgstr "" + +#: doc/classes/NavigationAgent3D.xml:51 +msgid "" +"Returns a [Vector3] in global coordinates, that can be moved to, making sure " +"that there are no static objects in the way. If the agent does not have a " +"navigation path, it will return the origin of the agent's parent." +msgstr "" + +#: doc/classes/NavigationAgent3D.xml:58 +msgid "Returns the user defined [Vector3] after setting the target location." +msgstr "" + +#: doc/classes/NavigationAgent3D.xml:88 +msgid "" +"Sets the [Navigation3D] node used by the agent. Useful when you don't want " +"to make the agent a child of a [Navigation3D] node." +msgstr "" + +#: doc/classes/NavigationAgent3D.xml:112 +msgid "The agent height offset to match the navigation mesh height." +msgstr "" + +#: doc/classes/NavigationAgent3D.xml:115 +msgid "" +"Ignores collisions on the Y axis. Must be true to move on a horizontal plane." +msgstr "" + +#: doc/classes/NavigationObstacle2D.xml:4 +msgid "2D Obstacle used in navigation for collision avoidance." +msgstr "" + +#: doc/classes/NavigationObstacle2D.xml:7 +msgid "" +"2D Obstacle used in navigation for collision avoidance. The obstacle needs " +"navigation data to work correctly. This can be done by having the obstacle " +"as a child of a [Navigation2D] node, or using [method set_navigation]. " +"[NavigationObstacle2D] is physics safe." +msgstr "" + +#: doc/classes/NavigationObstacle2D.xml:16 +msgid "" +"Returns the [Navigation2D] node that the obstacle is using for its " +"navigation system." +msgstr "" + +#: doc/classes/NavigationObstacle2D.xml:25 +msgid "" +"Sets the [Navigation2D] node used by the obstacle. Useful when you don't " +"want to make the obstacle a child of a [Navigation2D] node." +msgstr "" + +#: doc/classes/NavigationObstacle3D.xml:4 +msgid "3D Obstacle used in navigation for collision avoidance." +msgstr "" + +#: doc/classes/NavigationObstacle3D.xml:7 +msgid "" +"3D Obstacle used in navigation for collision avoidance. The obstacle needs " +"navigation data to work correctly. This can be done by having the obstacle " +"as a child of a [Navigation3D] node, or using [method set_navigation]. " +"[NavigationObstacle3D] is physics safe." +msgstr "" + +#: doc/classes/NavigationObstacle3D.xml:16 +msgid "" +"Returns the [Navigation3D] node that the obstacle is using for its " +"navigation system." +msgstr "" + +#: doc/classes/NavigationObstacle3D.xml:25 +msgid "" +"Sets the [Navigation3D] node used by the obstacle. Useful when you don't " +"want to make the obstacle a child of a [Navigation3D] node." +msgstr "" + +#: doc/classes/NavigationPolygon.xml:4 +msgid "" +"A node that has methods to draw outlines or use indices of vertices to " +"create navigation polygons." +msgstr "" + +#: doc/classes/NavigationPolygon.xml:7 +msgid "" +"There are two ways to create polygons. Either by using the [method " +"add_outline] method, or using the [method add_polygon] method.\n" +"Using [method add_outline]:\n" +"[codeblock]\n" +"var polygon = NavigationPolygon.new()\n" +"var outline = PackedVector2Array([Vector2(0, 0), Vector2(0, 50), Vector2(50, " +"50), Vector2(50, 0)])\n" +"polygon.add_outline(outline)\n" +"polygon.make_polygons_from_outlines()\n" +"$NavigationRegion2D.navpoly = polygon\n" +"[/codeblock]\n" +"Using [method add_polygon] and indices of the vertices array.\n" +"[codeblock]\n" +"var polygon = NavigationPolygon.new()\n" +"var vertices = PackedVector2Array([Vector2(0, 0), Vector2(0, 50), " +"Vector2(50, 50), Vector2(50, 0)])\n" +"polygon.set_vertices(vertices)\n" +"var indices = PackedInt32Array(0, 3, 1)\n" +"polygon.add_polygon(indices)\n" +"$NavigationRegion2D.navpoly = polygon\n" +"[/codeblock]" +msgstr "" + +#: doc/classes/NavigationPolygon.xml:35 +msgid "" +"Appends a [PackedVector2Array] that contains the vertices of an outline to " +"the internal array that contains all the outlines. You have to call [method " +"make_polygons_from_outlines] in order for this array to be converted to " +"polygons that the engine will use." +msgstr "" + +#: doc/classes/NavigationPolygon.xml:46 +msgid "" +"Adds a [PackedVector2Array] that contains the vertices of an outline to the " +"internal array that contains all the outlines at a fixed position. You have " +"to call [method make_polygons_from_outlines] in order for this array to be " +"converted to polygons that the engine will use." +msgstr "" + +#: doc/classes/NavigationPolygon.xml:55 +msgid "" +"Adds a polygon using the indices of the vertices you get when calling " +"[method get_vertices]." +msgstr "" + +#: doc/classes/NavigationPolygon.xml:62 +msgid "" +"Clears the array of the outlines, but it doesn't clear the vertices and the " +"polygons that were created by them." +msgstr "" + +#: doc/classes/NavigationPolygon.xml:69 +msgid "" +"Clears the array of polygons, but it doesn't clear the array of outlines and " +"vertices." +msgstr "" + +#: doc/classes/NavigationPolygon.xml:78 +msgid "" +"Returns a [PackedVector2Array] containing the vertices of an outline that " +"was created in the editor or by script." +msgstr "" + +#: doc/classes/NavigationPolygon.xml:85 +msgid "" +"Returns the number of outlines that were created in the editor or by script." +msgstr "" + +#: doc/classes/NavigationPolygon.xml:94 +msgid "" +"Returns a [PackedInt32Array] containing the indices of the vertices of a " +"created polygon." +msgstr "" + +#: doc/classes/NavigationPolygon.xml:101 +msgid "Returns the count of all polygons." +msgstr "" + +#: doc/classes/NavigationPolygon.xml:108 +msgid "" +"Returns a [PackedVector2Array] containing all the vertices being used to " +"create the polygons." +msgstr "" + +#: doc/classes/NavigationPolygon.xml:115 +msgid "Creates polygons from the outlines added in the editor or by script." +msgstr "" + +#: doc/classes/NavigationPolygon.xml:124 +msgid "" +"Removes an outline created in the editor or by script. You have to call " +"[method make_polygons_from_outlines] for the polygons to update." +msgstr "" + +#: doc/classes/NavigationPolygon.xml:135 +msgid "" +"Changes an outline created in the editor or by script. You have to call " +"[method make_polygons_from_outlines] for the polygons to update." +msgstr "" + +#: doc/classes/NavigationPolygon.xml:144 +msgid "" +"Sets the vertices that can be then indexed to create polygons with the " +"[method add_polygon] method." +msgstr "" + +#: doc/classes/NavigationRegion3D.xml:4 +msgid "A region of the navigation map." +msgstr "" + +#: doc/classes/NavigationRegion3D.xml:7 +msgid "" +"A region of the navigation map. It tells the [Navigation3D] node what can be " +"navigated and what cannot, based on the [NavigationMesh] resource. This " +"should be a child of a [Navigation3D] node (even not a direct child)." +msgstr "" + +#: doc/classes/NavigationRegion3D.xml:16 +msgid "" +"Bakes the [NavigationMesh]. The baking is done in a separate thread because " +"navigation baking is not a cheap operation. This can be done at runtime. " +"When it is completed, it automatically sets the new [NavigationMesh]." +msgstr "" + +#: doc/classes/NavigationRegion3D.xml:22 +msgid "Determines if the [NavigationRegion3D] is enabled or disabled." +msgstr "" + +#: doc/classes/NavigationRegion3D.xml:25 +msgid "The [NavigationMesh] resource to use." +msgstr "" + +#: doc/classes/NavigationRegion3D.xml:31 +msgid "Notifies when the navigation mesh bake operation is completed." +msgstr "" + +#: doc/classes/NavigationRegion3D.xml:36 +msgid "Notifies when the [NavigationMesh] has changed." +msgstr "" + +#: doc/classes/NavigationServer2D.xml:4 +msgid "Server interface for low-level 2D navigation access" +msgstr "" + +#: doc/classes/NavigationServer2D.xml:7 +msgid "" +"NavigationServer2D is the server responsible for all 2D navigation. It " +"creates the agents, maps, and regions for navigation to work as expected. " +"This keeps tracks of any call and executes them during the sync phase. This " +"means that you can request any change to the map, using any thread, without " +"worrying." +msgstr "" + +#: doc/classes/NavigationServer2D.xml:16 doc/classes/NavigationServer3D.xml:16 +msgid "Creates the agent." +msgstr "" + +#: doc/classes/NavigationServer2D.xml:25 doc/classes/NavigationServer3D.xml:25 +msgid "Returns true if the map got changed the previous frame." +msgstr "" + +#: doc/classes/NavigationServer2D.xml:40 doc/classes/NavigationServer3D.xml:40 +msgid "Callback called at the end of the RVO process." +msgstr "" + +#: doc/classes/NavigationServer2D.xml:51 doc/classes/NavigationServer3D.xml:51 +msgid "Puts the agent in the map." +msgstr "" + +#: doc/classes/NavigationServer2D.xml:62 doc/classes/NavigationServer3D.xml:62 +msgid "" +"Sets the maximum number of other agents the agent takes into account in the " +"navigation. The larger this number, the longer the running time of the " +"simulation. If the number is too low, the simulation will not be safe." +msgstr "" + +#: doc/classes/NavigationServer2D.xml:73 doc/classes/NavigationServer3D.xml:73 +msgid "Sets the maximum speed of the agent. Must be positive." +msgstr "" + +#: doc/classes/NavigationServer2D.xml:84 doc/classes/NavigationServer3D.xml:84 +msgid "" +"Sets the maximum distance to other agents this agent takes into account in " +"the navigation. The larger this number, the longer the running time of the " +"simulation. If the number is too low, the simulation will not be safe." +msgstr "" + +#: doc/classes/NavigationServer2D.xml:95 doc/classes/NavigationServer3D.xml:95 +msgid "Sets the position of the agent in world space." +msgstr "" + +#: doc/classes/NavigationServer2D.xml:106 +#: doc/classes/NavigationServer3D.xml:106 +msgid "Sets the radius of the agent." +msgstr "" + +#: doc/classes/NavigationServer2D.xml:117 +#: doc/classes/NavigationServer3D.xml:117 +msgid "Sets the new target velocity." +msgstr "" + +#: doc/classes/NavigationServer2D.xml:128 +#: doc/classes/NavigationServer3D.xml:128 +msgid "" +"The minimal amount of time for which the agent's velocities that are " +"computed by the simulation are safe with respect to other agents. The larger " +"this number, the sooner this agent will respond to the presence of other " +"agents, but the less freedom this agent has in choosing its velocities. Must " +"be positive." +msgstr "" + +#: doc/classes/NavigationServer2D.xml:139 +#: doc/classes/NavigationServer3D.xml:139 +msgid "Sets the current velocity of the agent." +msgstr "" + +#: doc/classes/NavigationServer2D.xml:148 +#: doc/classes/NavigationServer3D.xml:148 +msgid "Destroy the RID" +msgstr "" + +#: doc/classes/NavigationServer2D.xml:155 +#: doc/classes/NavigationServer3D.xml:155 +msgid "Create a new map." +msgstr "" + +#: doc/classes/NavigationServer2D.xml:164 +#: doc/classes/NavigationServer3D.xml:164 +msgid "Returns the map cell size." +msgstr "" + +#: doc/classes/NavigationServer2D.xml:186 +#: doc/classes/NavigationServer3D.xml:197 +msgid "" +"Returns the owner region RID for the point returned by [method " +"map_get_closest_point]." +msgstr "" + +#: doc/classes/NavigationServer2D.xml:195 +msgid "" +"Returns the edge connection margin of the map. The edge connection margin is " +"a distance used to connect two regions." +msgstr "" + +#: doc/classes/NavigationServer2D.xml:210 +msgid "" +"Returns the navigation path to reach the destination from the origin, while " +"avoiding static obstacles." +msgstr "" + +#: doc/classes/NavigationServer2D.xml:219 +#: doc/classes/NavigationServer3D.xml:254 +msgid "Returns true if the map is active." +msgstr "" + +#: doc/classes/NavigationServer2D.xml:230 +#: doc/classes/NavigationServer3D.xml:265 +msgid "Sets the map active." +msgstr "" + +#: doc/classes/NavigationServer2D.xml:241 +#: doc/classes/NavigationServer3D.xml:276 +msgid "Set the map cell size used to weld the navigation mesh polygons." +msgstr "" + +#: doc/classes/NavigationServer2D.xml:252 +msgid "" +"Set the map edge connection margin used to weld the compatible region edges." +msgstr "" + +#: doc/classes/NavigationServer2D.xml:259 +#: doc/classes/NavigationServer3D.xml:327 +msgid "Creates a new region." +msgstr "" + +#: doc/classes/NavigationServer2D.xml:270 +#: doc/classes/NavigationServer3D.xml:338 +msgid "Sets the map for the region." +msgstr "" + +#: doc/classes/NavigationServer2D.xml:281 +#: doc/classes/NavigationServer3D.xml:349 +msgid "Sets the navigation mesh for the region." +msgstr "" + +#: doc/classes/NavigationServer2D.xml:292 +#: doc/classes/NavigationServer3D.xml:360 +msgid "Sets the global transformation for the region." +msgstr "" + +#: doc/classes/NavigationServer3D.xml:4 +msgid "Server interface for low-level 3D navigation access" +msgstr "" + +#: doc/classes/NavigationServer3D.xml:7 +msgid "" +"NavigationServer3D is the server responsible for all 3D navigation. It " +"creates the agents, maps, and regions for navigation to work as expected. " +"This keeps tracks of any call and executes them during the sync phase. This " +"means that you can request any change to the map, using any thread, without " +"worrying." +msgstr "" + +#: doc/classes/NavigationServer3D.xml:175 +msgid "" +"Returns the point closest to the provided [code]point[/code] on the " +"navigation mesh surface." +msgstr "" + +#: doc/classes/NavigationServer3D.xml:186 +msgid "" +"Returns the normal for the point returned by [method map_get_closest_point]." +msgstr "" + +#: doc/classes/NavigationServer3D.xml:221 +msgid "Returns the edge connection margin of the map." +msgstr "" + +#: doc/classes/NavigationServer3D.xml:236 +msgid "Returns the navigation path to reach the destination from the origin." +msgstr "" + +#: doc/classes/NavigationServer3D.xml:245 +msgid "Returns the map's up direction." +msgstr "" + +#: doc/classes/NavigationServer3D.xml:287 +msgid "" +"Set the map edge connection margein used to weld the compatible region edges." +msgstr "" + +#: doc/classes/NavigationServer3D.xml:298 +msgid "Sets the map up direction." +msgstr "" + +#: doc/classes/NavigationServer3D.xml:307 +msgid "" +"Process the collision avoidance agents.\n" +"The result of this process is needed by the physics server, so this must be " +"called in the main thread.\n" +"Note: This function is not thread safe." +msgstr "" + +#: doc/classes/NavigationServer3D.xml:320 +msgid "Bakes the navigation mesh." +msgstr "" + +#: doc/classes/NavigationServer3D.xml:369 +msgid "Control activation of this server." +msgstr "" + +#: modules/enet/doc_classes/NetworkedMultiplayerENet.xml:4 +msgid "" +"PacketPeer implementation using the [url=http://enet.bespin.org/index." +"html]ENet[/url] library." +msgstr "" + +#: modules/enet/doc_classes/NetworkedMultiplayerENet.xml:7 +msgid "" +"A PacketPeer implementation that should be passed to [member SceneTree." +"network_peer] after being initialized as either a client or server. Events " +"can then be handled by connecting to [SceneTree] signals." +msgstr "" + +#: modules/enet/doc_classes/NetworkedMultiplayerENet.xml:10 +#: doc/classes/NetworkedMultiplayerPeer.xml:10 +msgid "" +"https://docs.godotengine.org/en/latest/tutorials/networking/" +"high_level_multiplayer.html" +msgstr "" + +#: modules/enet/doc_classes/NetworkedMultiplayerENet.xml:11 +msgid "http://enet.bespin.org/usergroup0.html" +msgstr "" + +#: modules/enet/doc_classes/NetworkedMultiplayerENet.xml:20 +msgid "" +"Closes the connection. Ignored if no connection is currently established. If " +"this is a server it tries to notify all clients before forcibly " +"disconnecting them. If this is a client it simply closes the connection to " +"the server." +msgstr "" + +#: modules/enet/doc_classes/NetworkedMultiplayerENet.xml:37 +msgid "" +"Create client that connects to a server at [code]address[/code] using " +"specified [code]port[/code]. The given address needs to be either a fully " +"qualified domain name (e.g. [code]\"www.example.com\"[/code]) or an IP " +"address in IPv4 or IPv6 format (e.g. [code]\"192.168.1.1\"[/code]). The " +"[code]port[/code] is the port the server is listening on. The " +"[code]in_bandwidth[/code] and [code]out_bandwidth[/code] parameters can be " +"used to limit the incoming and outgoing bandwidth to the given number of " +"bytes per second. The default of 0 means unlimited bandwidth. Note that ENet " +"will strategically drop packets on specific sides of a connection between " +"peers to ensure the peer's bandwidth is not overwhelmed. The bandwidth " +"parameters also determine the window size of a connection which limits the " +"amount of reliable packets that may be in transit at any given time. Returns " +"[constant OK] if a client was created, [constant ERR_ALREADY_IN_USE] if this " +"NetworkedMultiplayerENet instance already has an open connection (in which " +"case you need to call [method close_connection] first) or [constant " +"ERR_CANT_CREATE] if the client could not be created. If [code]client_port[/" +"code] is specified, the client will also listen to the given port; this is " +"useful for some NAT traversal techniques." +msgstr "" + +#: modules/enet/doc_classes/NetworkedMultiplayerENet.xml:52 +msgid "" +"Create server that listens to connections via [code]port[/code]. The port " +"needs to be an available, unused port between 0 and 65535. Note that ports " +"below 1024 are privileged and may require elevated permissions depending on " +"the platform. To change the interface the server listens on, use [method " +"set_bind_ip]. The default IP is the wildcard [code]\"*\"[/code], which " +"listens on all available interfaces. [code]max_clients[/code] is the maximum " +"number of clients that are allowed at once, any number up to 4095 may be " +"used, although the achievable number of simultaneous clients may be far " +"lower and depends on the application. For additional details on the " +"bandwidth parameters, see [method create_client]. Returns [constant OK] if a " +"server was created, [constant ERR_ALREADY_IN_USE] if this " +"NetworkedMultiplayerENet instance already has an open connection (in which " +"case you need to call [method close_connection] first) or [constant " +"ERR_CANT_CREATE] if the server could not be created." +msgstr "" + +#: modules/enet/doc_classes/NetworkedMultiplayerENet.xml:63 +msgid "" +"Disconnect the given peer. If \"now\" is set to [code]true[/code], the " +"connection will be closed immediately without flushing queued messages." +msgstr "" + +#: modules/enet/doc_classes/NetworkedMultiplayerENet.xml:70 +msgid "" +"Returns the channel of the last packet fetched via [method PacketPeer." +"get_packet]." +msgstr "" + +#: modules/enet/doc_classes/NetworkedMultiplayerENet.xml:77 +msgid "" +"Returns the channel of the next packet that will be retrieved via [method " +"PacketPeer.get_packet]." +msgstr "" + +#: modules/enet/doc_classes/NetworkedMultiplayerENet.xml:86 +#: modules/websocket/doc_classes/WebSocketServer.xml:33 +msgid "Returns the IP address of the given peer." +msgstr "" + +#: modules/enet/doc_classes/NetworkedMultiplayerENet.xml:95 +#: modules/websocket/doc_classes/WebSocketServer.xml:42 +msgid "Returns the remote port of the given peer." +msgstr "" + +#: modules/enet/doc_classes/NetworkedMultiplayerENet.xml:104 +msgid "" +"The IP used when creating a server. This is set to the wildcard [code]\"*\"[/" +"code] by default, which binds to all available interfaces. The given IP " +"needs to be in IPv4 or IPv6 address format, for example: " +"[code]\"192.168.1.1\"[/code]." +msgstr "" + +#: modules/enet/doc_classes/NetworkedMultiplayerENet.xml:113 +msgid "" +"Configure the [X509Certificate] to use when [member use_dtls] is [code]true[/" +"code]. For servers, you must also setup the [CryptoKey] via [method " +"set_dtls_key]." +msgstr "" + +#: modules/enet/doc_classes/NetworkedMultiplayerENet.xml:122 +msgid "" +"Configure the [CryptoKey] to use when [member use_dtls] is [code]true[/" +"code]. Remember to also call [method set_dtls_certificate] to setup your " +"[X509Certificate]." +msgstr "" + +#: modules/enet/doc_classes/NetworkedMultiplayerENet.xml:128 +msgid "" +"Enforce ordered packets when using [constant NetworkedMultiplayerPeer." +"TRANSFER_MODE_UNRELIABLE] (thus behaving similarly to [constant " +"NetworkedMultiplayerPeer.TRANSFER_MODE_UNRELIABLE_ORDERED]). This is the " +"only way to use ordering with the RPC system." +msgstr "" + +#: modules/enet/doc_classes/NetworkedMultiplayerENet.xml:131 +msgid "" +"The number of channels to be used by ENet. Channels are used to separate " +"different kinds of data. In reliable or ordered mode, for example, the " +"packet delivery order is ensured on a per channel basis." +msgstr "" + +#: modules/enet/doc_classes/NetworkedMultiplayerENet.xml:134 +msgid "" +"The compression method used for network packets. These have different " +"tradeoffs of compression speed versus bandwidth, you may need to test which " +"one works best for your use case if you use compression at all." +msgstr "" + +#: modules/enet/doc_classes/NetworkedMultiplayerENet.xml:137 +msgid "" +"Enable or disable certificate verification when [member use_dtls] " +"[code]true[/code]." +msgstr "" + +#: modules/enet/doc_classes/NetworkedMultiplayerENet.xml:141 +msgid "" +"Enable or disable the server feature that notifies clients of other peers' " +"connection/disconnection, and relays messages between them. When this option " +"is [code]false[/code], clients won't be automatically notified of other " +"peers and won't be able to send them packets through the server." +msgstr "" + +#: modules/enet/doc_classes/NetworkedMultiplayerENet.xml:144 +msgid "" +"Set the default channel to be used to transfer data. By default, this value " +"is [code]-1[/code] which means that ENet will only use 2 channels, one for " +"reliable and one for unreliable packets. Channel [code]0[/code] is reserved, " +"and cannot be used. Setting this member to any value between [code]0[/code] " +"and [member channel_count] (excluded) will force ENet to use that channel " +"for sending data." +msgstr "" + +#: modules/enet/doc_classes/NetworkedMultiplayerENet.xml:148 +msgid "" +"When enabled, the client or server created by this peer, will use " +"[PacketPeerDTLS] instead of raw UDP sockets for communicating with the " +"remote peer. This will make the communication encrypted with DTLS at the " +"cost of higher resource usage and potentially larger packet size.\n" +"Note: When creating a DTLS server, make sure you setup the key/certificate " +"pair via [method set_dtls_key] and [method set_dtls_certificate]. For DTLS " +"clients, have a look at the [member dtls_verify] option, and configure the " +"certificate accordingly via [method set_dtls_certificate]." +msgstr "" + +#: modules/enet/doc_classes/NetworkedMultiplayerENet.xml:154 +msgid "" +"No compression. This uses the most bandwidth, but has the upside of " +"requiring the fewest CPU resources." +msgstr "" + +#: modules/enet/doc_classes/NetworkedMultiplayerENet.xml:157 +msgid "ENet's built-in range encoding." +msgstr "" + +#: modules/enet/doc_classes/NetworkedMultiplayerENet.xml:160 +msgid "" +"[url=http://fastlz.org/]FastLZ[/url] compression. This option uses less CPU " +"resources compared to [constant COMPRESS_ZLIB], at the expense of using more " +"bandwidth." +msgstr "" + +#: modules/enet/doc_classes/NetworkedMultiplayerENet.xml:163 +msgid "" +"[url=https://www.zlib.net/]Zlib[/url] compression. This option uses less " +"bandwidth compared to [constant COMPRESS_FASTLZ], at the expense of using " +"more CPU resources." +msgstr "" + +#: modules/enet/doc_classes/NetworkedMultiplayerENet.xml:166 +msgid "[url=https://facebook.github.io/zstd/]Zstandard[/url] compression." +msgstr "" + +#: doc/classes/NetworkedMultiplayerPeer.xml:4 +msgid "A high-level network interface to simplify multiplayer interactions." +msgstr "" + +#: doc/classes/NetworkedMultiplayerPeer.xml:7 +msgid "" +"Manages the connection to network peers. Assigns unique IDs to each client " +"connected to the server." +msgstr "" + +#: doc/classes/NetworkedMultiplayerPeer.xml:17 +msgid "" +"Returns the current state of the connection. See [enum ConnectionStatus]." +msgstr "" + +#: doc/classes/NetworkedMultiplayerPeer.xml:24 +msgid "" +"Returns the ID of the [NetworkedMultiplayerPeer] who sent the most recent " +"packet." +msgstr "" + +#: doc/classes/NetworkedMultiplayerPeer.xml:31 +msgid "Returns the ID of this [NetworkedMultiplayerPeer]." +msgstr "" + +#: doc/classes/NetworkedMultiplayerPeer.xml:38 +msgid "Waits up to 1 second to receive a new network event." +msgstr "" + +#: doc/classes/NetworkedMultiplayerPeer.xml:47 +msgid "" +"Sets the peer to which packets will be sent.\n" +"The [code]id[/code] can be one of: [constant TARGET_PEER_BROADCAST] to send " +"to all connected peers, [constant TARGET_PEER_SERVER] to send to the peer " +"acting as server, a valid peer ID to send to that specific peer, a negative " +"peer ID to send to all peers except that one. By default, the target peer is " +"[constant TARGET_PEER_BROADCAST]." +msgstr "" + +#: doc/classes/NetworkedMultiplayerPeer.xml:54 +msgid "" +"If [code]true[/code], this [NetworkedMultiplayerPeer] refuses new " +"connections." +msgstr "" + +#: doc/classes/NetworkedMultiplayerPeer.xml:57 +msgid "" +"The manner in which to send packets to the [code]target_peer[/code]. See " +"[enum TransferMode]." +msgstr "" + +#: doc/classes/NetworkedMultiplayerPeer.xml:63 +msgid "Emitted when a connection attempt fails." +msgstr "" + +#: doc/classes/NetworkedMultiplayerPeer.xml:68 +msgid "Emitted when a connection attempt succeeds." +msgstr "" + +#: doc/classes/NetworkedMultiplayerPeer.xml:75 +msgid "Emitted by the server when a client connects." +msgstr "" + +#: doc/classes/NetworkedMultiplayerPeer.xml:82 +msgid "Emitted by the server when a client disconnects." +msgstr "" + +#: doc/classes/NetworkedMultiplayerPeer.xml:87 +msgid "Emitted by clients when the server disconnects." +msgstr "" + +#: doc/classes/NetworkedMultiplayerPeer.xml:93 +msgid "" +"Packets are not acknowledged, no resend attempts are made for lost packets. " +"Packets may arrive in any order. Potentially faster than [constant " +"TRANSFER_MODE_UNRELIABLE_ORDERED]. Use for non-critical data, and always " +"consider whether the order matters." +msgstr "" + +#: doc/classes/NetworkedMultiplayerPeer.xml:96 +msgid "" +"Packets are not acknowledged, no resend attempts are made for lost packets. " +"Packets are received in the order they were sent in. Potentially faster than " +"[constant TRANSFER_MODE_RELIABLE]. Use for non-critical data or data that " +"would be outdated if received late due to resend attempt(s) anyway, for " +"example movement and positional data." +msgstr "" + +#: doc/classes/NetworkedMultiplayerPeer.xml:99 +msgid "" +"Packets must be received and resend attempts should be made until the " +"packets are acknowledged. Packets must be received in the order they were " +"sent in. Most reliable transfer mode, but potentially the slowest due to the " +"overhead. Use for critical data that must be transmitted and arrive in " +"order, for example an ability being triggered or a chat message. Consider " +"carefully if the information really is critical, and use sparingly." +msgstr "" + +#: doc/classes/NetworkedMultiplayerPeer.xml:102 +msgid "The ongoing connection disconnected." +msgstr "" + +#: doc/classes/NetworkedMultiplayerPeer.xml:105 +msgid "A connection attempt is ongoing." +msgstr "" + +#: doc/classes/NetworkedMultiplayerPeer.xml:108 +msgid "The connection attempt succeeded." +msgstr "" + +#: doc/classes/NetworkedMultiplayerPeer.xml:111 +msgid "Packets are sent to the server and then redistributed to other peers." +msgstr "" + +#: doc/classes/NetworkedMultiplayerPeer.xml:114 +msgid "Packets are sent to the server alone." +msgstr "" + +#: doc/classes/NinePatchRect.xml:4 +msgid "" +"Scalable texture-based frame that tiles the texture's centers and sides, but " +"keeps the corners' original size. Perfect for panels and dialog boxes." +msgstr "" + +#: doc/classes/NinePatchRect.xml:7 +msgid "" +"Also known as 9-slice panels, NinePatchRect produces clean panels of any " +"size, based on a small texture. To do so, it splits the texture in a 3×3 " +"grid. When you scale the node, it tiles the texture's sides horizontally or " +"vertically, the center on both axes but it doesn't scale or tile the corners." +msgstr "" + +#: doc/classes/NinePatchRect.xml:18 +msgid "" +"Returns the size of the margin identified by the given [enum Margin] " +"constant." +msgstr "" + +#: doc/classes/NinePatchRect.xml:29 +msgid "" +"Sets the size of the margin identified by the given [enum Margin] constant " +"to [code]value[/code] in pixels." +msgstr "" + +#: doc/classes/NinePatchRect.xml:35 doc/classes/NinePatchRect.xml:38 +#: doc/classes/NinePatchRect.xml:72 doc/classes/NinePatchRect.xml:75 +#: doc/classes/NinePatchRect.xml:78 +msgid "Doesn't do anything at the time of writing." +msgstr "" + +#: doc/classes/NinePatchRect.xml:41 +msgid "" +"If [code]true[/code], draw the panel's center. Else, only draw the 9-slice's " +"borders." +msgstr "" + +#: doc/classes/NinePatchRect.xml:45 +msgid "" +"The height of the 9-slice's bottom row. A margin of 16 means the 9-slice's " +"bottom corners and side will have a height of 16 pixels. You can set all 4 " +"margin values individually to create panels with non-uniform borders." +msgstr "" + +#: doc/classes/NinePatchRect.xml:48 +msgid "The height of the 9-slice's left column." +msgstr "" + +#: doc/classes/NinePatchRect.xml:51 +msgid "The height of the 9-slice's right column." +msgstr "" + +#: doc/classes/NinePatchRect.xml:54 +msgid "The height of the 9-slice's top row." +msgstr "" + +#: doc/classes/NinePatchRect.xml:57 +msgid "" +"Rectangular region of the texture to sample from. If you're working with an " +"atlas, use this property to define the area the 9-slice should use. All " +"other properties are relative to this one. If the rect is empty, " +"NinePatchRect will use the whole texture." +msgstr "" + +#: doc/classes/NinePatchRect.xml:60 +msgid "The node's texture resource." +msgstr "" + +#: doc/classes/NinePatchRect.xml:66 +msgid "Emitted when the node's texture changes." +msgstr "" + +#: doc/classes/Node.xml:4 +msgid "Base class for all [i]scene[/i] objects." +msgstr "" + +#: doc/classes/Node.xml:7 +msgid "" +"Nodes are Godot's building blocks. They can be assigned as the child of " +"another node, resulting in a tree arrangement. A given node can contain any " +"number of nodes as children with the requirement that all siblings (direct " +"children of a node) should have unique names.\n" +"A tree of nodes is called a [i]scene[/i]. Scenes can be saved to the disk " +"and then instanced into other scenes. This allows for very high flexibility " +"in the architecture and data model of Godot projects.\n" +"[b]Scene tree:[/b] The [SceneTree] contains the active tree of nodes. When a " +"node is added to the scene tree, it receives the [constant " +"NOTIFICATION_ENTER_TREE] notification and its [method _enter_tree] callback " +"is triggered. Child nodes are always added [i]after[/i] their parent node, i." +"e. the [method _enter_tree] callback of a parent node will be triggered " +"before its child's.\n" +"Once all nodes have been added in the scene tree, they receive the [constant " +"NOTIFICATION_READY] notification and their respective [method _ready] " +"callbacks are triggered. For groups of nodes, the [method _ready] callback " +"is called in reverse order, starting with the children and moving up to the " +"parent nodes.\n" +"This means that when adding a node to the scene tree, the following order " +"will be used for the callbacks: [method _enter_tree] of the parent, [method " +"_enter_tree] of the children, [method _ready] of the children and finally " +"[method _ready] of the parent (recursively for the entire scene tree).\n" +"[b]Processing:[/b] Nodes can override the \"process\" state, so that they " +"receive a callback on each frame requesting them to process (do something). " +"Normal processing (callback [method _process], toggled with [method " +"set_process]) happens as fast as possible and is dependent on the frame " +"rate, so the processing time [i]delta[/i] is passed as an argument. Physics " +"processing (callback [method _physics_process], toggled with [method " +"set_physics_process]) happens a fixed number of times per second (60 by " +"default) and is useful for code related to the physics engine.\n" +"Nodes can also process input events. When present, the [method _input] " +"function will be called for each input that the program receives. In many " +"cases, this can be overkill (unless used for simple projects), and the " +"[method _unhandled_input] function might be preferred; it is called when the " +"input event was not handled by anyone else (typically, GUI [Control] nodes), " +"ensuring that the node only receives the events that were meant for it.\n" +"To keep track of the scene hierarchy (especially when instancing scenes into " +"other scenes), an \"owner\" can be set for the node with the [member owner] " +"property. This keeps track of who instanced what. This is mostly useful when " +"writing editors and tools, though.\n" +"Finally, when a node is freed with [method Object.free] or [method " +"queue_free], it will also free all its children.\n" +"[b]Groups:[/b] Nodes can be added to as many groups as you want to be easy " +"to manage, you could create groups like \"enemies\" or \"collectables\" for " +"example, depending on your game. See [method add_to_group], [method " +"is_in_group] and [method remove_from_group]. You can then retrieve all nodes " +"in these groups, iterate them and even call methods on groups via the " +"methods on [SceneTree].\n" +"[b]Networking with nodes:[/b] After connecting to a server (or making one, " +"see [NetworkedMultiplayerENet]), it is possible to use the built-in RPC " +"(remote procedure call) system to communicate over the network. By calling " +"[method rpc] with a method name, it will be called locally and in all " +"connected peers (peers = clients and the server that accepts connections). " +"To identify which node receives the RPC call, Godot will use its [NodePath] " +"(make sure node names are the same on all peers). Also, take a look at the " +"high-level networking tutorial and corresponding demos." +msgstr "" + +#: doc/classes/Node.xml:20 +msgid "" +"https://docs.godotengine.org/en/latest/getting_started/step_by_step/" +"scenes_and_nodes.html" +msgstr "" + +#: doc/classes/Node.xml:27 +msgid "" +"Called when the node enters the [SceneTree] (e.g. upon instancing, scene " +"changing, or after calling [method add_child] in a script). If the node has " +"children, its [method _enter_tree] callback will be called first, and then " +"that of the children.\n" +"Corresponds to the [constant NOTIFICATION_ENTER_TREE] notification in " +"[method Object._notification]." +msgstr "" + +#: doc/classes/Node.xml:35 +msgid "" +"Called when the node is about to leave the [SceneTree] (e.g. upon freeing, " +"scene changing, or after calling [method remove_child] in a script). If the " +"node has children, its [method _exit_tree] callback will be called last, " +"after all its children have left the tree.\n" +"Corresponds to the [constant NOTIFICATION_EXIT_TREE] notification in [method " +"Object._notification] and signal [signal tree_exiting]. To get notified when " +"the node has already left the active tree, connect to the [signal " +"tree_exited]." +msgstr "" + +#: doc/classes/Node.xml:43 +msgid "" +"The string returned from this method is displayed as a warning in the Scene " +"Dock if the script that overrides it is a [code]tool[/code] script.\n" +"Returning an empty string produces no warning.\n" +"Call [method update_configuration_warning] when the warning needs to be " +"updated for this node." +msgstr "" + +#: doc/classes/Node.xml:54 +msgid "" +"Called when there is an input event. The input event propagates up through " +"the node tree until a node consumes it.\n" +"It is only called if input processing is enabled, which is done " +"automatically if this method is overridden, and can be toggled with [method " +"set_process_input].\n" +"To consume the input event and stop it propagating further to other nodes, " +"[method Viewport.set_input_as_handled] can be called.\n" +"For gameplay input, [method _unhandled_input] and [method " +"_unhandled_key_input] are usually a better fit as they allow the GUI to " +"intercept the events first." +msgstr "" + +#: doc/classes/Node.xml:66 +msgid "" +"Called during the physics processing step of the main loop. Physics " +"processing means that the frame rate is synced to the physics, i.e. the " +"[code]delta[/code] variable should be constant.\n" +"It is only called if physics processing is enabled, which is done " +"automatically if this method is overridden, and can be toggled with [method " +"set_physics_process].\n" +"Corresponds to the [constant NOTIFICATION_PHYSICS_PROCESS] notification in " +"[method Object._notification]." +msgstr "" + +#: doc/classes/Node.xml:77 +msgid "" +"Called during the processing step of the main loop. Processing happens at " +"every frame and as fast as possible, so the [code]delta[/code] time since " +"the previous frame is not constant.\n" +"It is only called if processing is enabled, which is done automatically if " +"this method is overridden, and can be toggled with [method set_process].\n" +"Corresponds to the [constant NOTIFICATION_PROCESS] notification in [method " +"Object._notification]." +msgstr "" + +#: doc/classes/Node.xml:86 +msgid "" +"Called when the node is \"ready\", i.e. when both the node and its children " +"have entered the scene tree. If the node has children, their [method _ready] " +"callbacks get triggered first, and the parent node will receive the ready " +"notification afterwards.\n" +"Corresponds to the [constant NOTIFICATION_READY] notification in [method " +"Object._notification]. See also the [code]onready[/code] keyword for " +"variables.\n" +"Usually used for initialization. For even earlier initialization, [method " +"Object._init] may be used. See also [method _enter_tree].\n" +"[b]Note:[/b] [method _ready] may be called only once for each node. After " +"removing a node from the scene tree and adding again, [code]_ready[/code] " +"will not be called for the second time. This can be bypassed with requesting " +"another call with [method request_ready], which may be called anywhere " +"before adding the node again." +msgstr "" + +#: doc/classes/Node.xml:98 +msgid "" +"Called when an [InputEvent] hasn't been consumed by [method _input] or any " +"GUI. The input event propagates up through the node tree until a node " +"consumes it.\n" +"It is only called if unhandled input processing is enabled, which is done " +"automatically if this method is overridden, and can be toggled with [method " +"set_process_unhandled_input].\n" +"To consume the input event and stop it propagating further to other nodes, " +"[method Viewport.set_input_as_handled] can be called.\n" +"For gameplay input, this and [method _unhandled_key_input] are usually a " +"better fit than [method _input] as they allow the GUI to intercept the " +"events first." +msgstr "" + +#: doc/classes/Node.xml:110 +msgid "" +"Called when an [InputEventKey] hasn't been consumed by [method _input] or " +"any GUI. The input event propagates up through the node tree until a node " +"consumes it.\n" +"It is only called if unhandled key input processing is enabled, which is " +"done automatically if this method is overridden, and can be toggled with " +"[method set_process_unhandled_key_input].\n" +"To consume the input event and stop it propagating further to other nodes, " +"[method Viewport.set_input_as_handled] can be called.\n" +"For gameplay input, this and [method _unhandled_input] are usually a better " +"fit than [method _input] as they allow the GUI to intercept the events first." +msgstr "" + +#: doc/classes/Node.xml:124 +msgid "" +"Adds a child node. Nodes can have any number of children, but every child " +"must have a unique name. Child nodes are automatically deleted when the " +"parent node is deleted, so an entire scene can be removed by deleting its " +"topmost node.\n" +"If [code]legible_unique_name[/code] is [code]true[/code], the child node " +"will have an human-readable name based on the name of the node being " +"instanced instead of its type.\n" +"[b]Note:[/b] If the child node already has a parent, the function will fail. " +"Use [method remove_child] first to remove the node from its current parent. " +"For example:\n" +"[codeblock]\n" +"if child_node.get_parent():\n" +" child_node.get_parent().remove_child(child_node)\n" +"add_child(child_node)\n" +"[/codeblock]\n" +"If you need the child node to be added below a specific node in the list of " +"children, use [method add_child_below_node] instead of this method.\n" +"[b]Note:[/b] If you want a child to be persisted to a [PackedScene], you " +"must set [member owner] in addition to calling [method add_child]. This is " +"typically relevant for [url=https://godot.readthedocs.io/en/latest/tutorials/" +"misc/running_code_in_the_editor.html]tool scripts[/url] and [url=https://" +"godot.readthedocs.io/en/latest/tutorials/plugins/editor/index.html]editor " +"plugins[/url]. If [method add_child] is called without setting [member " +"owner], the newly added [Node] will not be visible in the scene tree, though " +"it will be visible in the 2D/3D view." +msgstr "" + +#: doc/classes/Node.xml:146 +msgid "" +"Adds a child node below the [code]preceding_node[/code].\n" +"If [code]legible_unique_name[/code] is [code]true[/code], the child node " +"will have an human-readable name based on the name of the node being " +"instanced instead of its type.\n" +"Use [method add_child] instead of this method if you don't need the child " +"node to be added below a specific node in the list of children." +msgstr "" + +#: doc/classes/Node.xml:159 +msgid "" +"Adds the node to a group. Groups are helpers to name and organize a subset " +"of nodes, for example \"enemies\" or \"collectables\". A node can be in any " +"number of groups. Nodes can be assigned a group at any time, but will not be " +"added until they are inside the scene tree (see [method is_inside_tree]). " +"See notes in the description, and the group methods in [SceneTree].\n" +"The [code]persistent[/code] option is used when packing node to " +"[PackedScene] and saving to file. Non-persistent groups aren't stored." +msgstr "" + +#: doc/classes/Node.xml:167 +msgid "" +"Returns [code]true[/code] if the node can process while the scene tree is " +"paused (see [member pause_mode]). Always returns [code]true[/code] if the " +"scene tree is not paused, and [code]false[/code] if the node is not in the " +"tree." +msgstr "" + +#: doc/classes/Node.xml:176 +msgid "" +"Duplicates the node, returning a new node.\n" +"You can fine-tune the behavior using the [code]flags[/code] (see [enum " +"DuplicateFlags]).\n" +"[b]Note:[/b] It will not work properly if the node contains a script with " +"constructor arguments (i.e. needs to supply arguments to [method Object." +"_init] method). In that case, the node will be duplicated without a script." +msgstr "" + +#: doc/classes/Node.xml:191 +msgid "" +"Finds a descendant of this node whose name matches [code]mask[/code] as in " +"[method String.match] (i.e. case-sensitive, but [code]\"*\"[/code] matches " +"zero or more characters and [code]\"?\"[/code] matches any single character " +"except [code]\".\"[/code]).\n" +"[b]Note:[/b] It does not match against the full path, just against " +"individual node names.\n" +"If [code]owned[/code] is [code]true[/code], this method only finds nodes " +"whose owner is this node. This is especially important for scenes " +"instantiated through a script, because those scenes don't have an owner." +msgstr "" + +#: doc/classes/Node.xml:202 +msgid "" +"Finds the first parent of the current node whose name matches [code]mask[/" +"code] as in [method String.match] (i.e. case-sensitive, but [code]\"*\"[/" +"code] matches zero or more characters and [code]\"?\"[/code] matches any " +"single character except [code]\".\"[/code]).\n" +"[b]Note:[/b] It does not match against the full path, just against " +"individual node names." +msgstr "" + +#: doc/classes/Node.xml:212 +msgid "" +"Returns a child node by its index (see [method get_child_count]). This " +"method is often used for iterating all children of a node.\n" +"To access a child node via its name, use [method get_node]." +msgstr "" + +#: doc/classes/Node.xml:220 +msgid "Returns the number of child nodes." +msgstr "" + +#: doc/classes/Node.xml:227 +msgid "Returns an array of references to node's children." +msgstr "" + +#: doc/classes/Node.xml:234 +msgid "Returns an array listing the groups that the node is a member of." +msgstr "" + +#: doc/classes/Node.xml:241 +msgid "" +"Returns the node's order in the scene tree branch. For example, if called on " +"the first child node the position is [code]0[/code]." +msgstr "" + +#: doc/classes/Node.xml:248 +msgid "" +"Returns the peer ID of the network master for this node. See [method " +"set_network_master]." +msgstr "" + +#: doc/classes/Node.xml:257 +msgid "" +"Fetches a node. The [NodePath] can be either a relative path (from the " +"current node) or an absolute path (in the scene tree) to a node. If the path " +"does not exist, a [code]null instance[/code] is returned and an error is " +"logged. Attempts to access methods on the return value will result in an " +"\"Attempt to call <method> on a null instance.\" error.\n" +"[b]Note:[/b] Fetching absolute paths only works when the node is inside the " +"scene tree (see [method is_inside_tree]).\n" +"[b]Example:[/b] Assume your current node is Character and the following " +"tree:\n" +"[codeblock]\n" +"/root\n" +"/root/Character\n" +"/root/Character/Sword\n" +"/root/Character/Backpack/Dagger\n" +"/root/MyGame\n" +"/root/Swamp/Alligator\n" +"/root/Swamp/Mosquito\n" +"/root/Swamp/Goblin\n" +"[/codeblock]\n" +"Possible paths are:\n" +"[codeblock]\n" +"get_node(\"Sword\")\n" +"get_node(\"Backpack/Dagger\")\n" +"get_node(\"../Swamp/Alligator\")\n" +"get_node(\"/root/MyGame\")\n" +"[/codeblock]" +msgstr "" + +#: doc/classes/Node.xml:285 +msgid "" +"Fetches a node and one of its resources as specified by the [NodePath]'s " +"subname (e.g. [code]Area2D/CollisionShape2D:shape[/code]). If several nested " +"resources are specified in the [NodePath], the last one will be fetched.\n" +"The return value is an array of size 3: the first index points to the [Node] " +"(or [code]null[/code] if not found), the second index points to the " +"[Resource] (or [code]null[/code] if not found), and the third index is the " +"remaining [NodePath], if any.\n" +"For example, assuming that [code]Area2D/CollisionShape2D[/code] is a valid " +"node and that its [code]shape[/code] property has been assigned a " +"[RectangleShape2D] resource, one could have this kind of output:\n" +"[codeblock]\n" +"print(get_node_and_resource(\"Area2D/CollisionShape2D\")) # " +"[[CollisionShape2D:1161], Null, ]\n" +"print(get_node_and_resource(\"Area2D/CollisionShape2D:shape\")) # " +"[[CollisionShape2D:1161], [RectangleShape2D:1156], ]\n" +"print(get_node_and_resource(\"Area2D/CollisionShape2D:shape:extents\")) # " +"[[CollisionShape2D:1161], [RectangleShape2D:1156], :extents]\n" +"[/codeblock]" +msgstr "" + +#: doc/classes/Node.xml:301 +msgid "" +"Similar to [method get_node], but does not log an error if [code]path[/code] " +"does not point to a valid [Node]." +msgstr "" + +#: doc/classes/Node.xml:308 +msgid "" +"Returns the parent node of the current node, or an empty [Node] if the node " +"lacks a parent." +msgstr "" + +#: doc/classes/Node.xml:315 +msgid "" +"Returns the absolute path of the current node. This only works if the " +"current node is inside the scene tree (see [method is_inside_tree])." +msgstr "" + +#: doc/classes/Node.xml:324 +msgid "" +"Returns the relative [NodePath] from this node to the specified [code]node[/" +"code]. Both nodes must be in the same scene or the function will fail." +msgstr "" + +#: doc/classes/Node.xml:331 +msgid "" +"Returns the time elapsed since the last physics-bound frame (see [method " +"_physics_process]). This is always a constant value in physics processing " +"unless the frames per second is changed via [member Engine." +"iterations_per_second]." +msgstr "" + +#: doc/classes/Node.xml:338 +msgid "" +"Returns the time elapsed (in seconds) since the last process callback. This " +"value may vary from frame to frame." +msgstr "" + +#: doc/classes/Node.xml:345 +msgid "" +"Returns [code]true[/code] if this is an instance load placeholder. See " +"[InstancePlaceholder]." +msgstr "" + +#: doc/classes/Node.xml:352 +msgid "Returns the [SceneTree] that contains this node." +msgstr "" + +#: doc/classes/Node.xml:359 +msgid "Returns the node's [Viewport]." +msgstr "" + +#: doc/classes/Node.xml:368 +msgid "" +"Returns [code]true[/code] if the node that the [NodePath] points to exists." +msgstr "" + +#: doc/classes/Node.xml:377 +msgid "" +"Returns [code]true[/code] if the [NodePath] points to a valid node and its " +"subname points to a valid resource, e.g. [code]Area2D/CollisionShape2D:" +"shape[/code]. Properties with a non-[Resource] type (e.g. nodes or primitive " +"math types) are not considered resources." +msgstr "" + +#: doc/classes/Node.xml:386 +msgid "" +"Returns [code]true[/code] if the given node is a direct or indirect child of " +"the current node." +msgstr "" + +#: doc/classes/Node.xml:393 +msgid "" +"Returns [code]true[/code] if the node is folded (collapsed) in the Scene " +"dock." +msgstr "" + +#: doc/classes/Node.xml:402 +msgid "" +"Returns [code]true[/code] if the given node occurs later in the scene " +"hierarchy than the current node." +msgstr "" + +#: doc/classes/Node.xml:411 +msgid "" +"Returns [code]true[/code] if this node is in the specified group. See notes " +"in the description, and the group methods in [SceneTree]." +msgstr "" + +#: doc/classes/Node.xml:418 +msgid "" +"Returns [code]true[/code] if this node is currently inside a [SceneTree]." +msgstr "" + +#: doc/classes/Node.xml:425 +msgid "" +"Returns [code]true[/code] if the local system is the master of this node." +msgstr "" + +#: doc/classes/Node.xml:432 +msgid "" +"Returns [code]true[/code] if physics processing is enabled (see [method " +"set_physics_process])." +msgstr "" + +#: doc/classes/Node.xml:439 +msgid "" +"Returns [code]true[/code] if internal physics processing is enabled (see " +"[method set_physics_process_internal])." +msgstr "" + +#: doc/classes/Node.xml:446 +msgid "" +"Returns [code]true[/code] if processing is enabled (see [method " +"set_process])." +msgstr "" + +#: doc/classes/Node.xml:453 +msgid "" +"Returns [code]true[/code] if the node is processing input (see [method " +"set_process_input])." +msgstr "" + +#: doc/classes/Node.xml:460 +msgid "" +"Returns [code]true[/code] if internal processing is enabled (see [method " +"set_process_internal])." +msgstr "" + +#: doc/classes/Node.xml:467 +msgid "" +"Returns [code]true[/code] if the node is processing unhandled input (see " +"[method set_process_unhandled_input])." +msgstr "" + +#: doc/classes/Node.xml:474 +msgid "" +"Returns [code]true[/code] if the node is processing unhandled key input (see " +"[method set_process_unhandled_key_input])." +msgstr "" + +#: doc/classes/Node.xml:485 +msgid "" +"Moves a child node to a different position (order) among the other children. " +"Since calls, signals, etc are performed by tree order, changing the order of " +"children nodes may be useful." +msgstr "" + +#: doc/classes/Node.xml:492 +msgid "" +"Prints all stray nodes (nodes outside the [SceneTree]). Used for debugging. " +"Works only in debug builds." +msgstr "" + +#: doc/classes/Node.xml:499 +msgid "" +"Prints the tree to stdout. Used mainly for debugging purposes. This version " +"displays the path relative to the current node, and is good for copy/pasting " +"into the [method get_node] function.\n" +"[b]Example output:[/b]\n" +"[codeblock]\n" +"TheGame\n" +"TheGame/Menu\n" +"TheGame/Menu/Label\n" +"TheGame/Menu/Camera2D\n" +"TheGame/SplashScreen\n" +"TheGame/SplashScreen/Camera2D\n" +"[/codeblock]" +msgstr "" + +#: doc/classes/Node.xml:515 +msgid "" +"Similar to [method print_tree], this prints the tree to stdout. This version " +"displays a more graphical representation similar to what is displayed in the " +"scene inspector. It is useful for inspecting larger trees.\n" +"[b]Example output:[/b]\n" +"[codeblock]\n" +" â”–â•´TheGame\n" +" â” â•´Menu\n" +" ┃ â” â•´Label\n" +" ┃ â”–â•´Camera2D\n" +" â”–-SplashScreen\n" +" â”–â•´Camera2D\n" +"[/codeblock]" +msgstr "" + +#: doc/classes/Node.xml:537 +msgid "" +"Calls the given method (if present) with the arguments given in [code]args[/" +"code] on this node and recursively on all its children. If the " +"[code]parent_first[/code] argument is [code]true[/code], the method will be " +"called on the current node first, then on all its children. If " +"[code]parent_first[/code] is [code]false[/code], the children will be called " +"first." +msgstr "" + +#: doc/classes/Node.xml:546 +msgid "" +"Notifies the current node and all its children recursively by calling " +"[method Object.notification] on all of them." +msgstr "" + +#: doc/classes/Node.xml:553 +msgid "" +"Queues a node for deletion at the end of the current frame. When deleted, " +"all of its child nodes will be deleted as well. This method ensures it's " +"safe to delete the node, contrary to [method Object.free]. Use [method " +"Object.is_queued_for_deletion] to check whether a node will be deleted at " +"the end of the frame." +msgstr "" + +#: doc/classes/Node.xml:560 +msgid "" +"Moves this node to the bottom of parent node's children hierarchy. This is " +"often useful in GUIs ([Control] nodes), because their order of drawing " +"depends on their order in the tree, i.e. the further they are on the node " +"list, the higher they are drawn. After using [code]raise[/code], a Control " +"will be drawn on top of their siblings." +msgstr "" + +#: doc/classes/Node.xml:567 +msgid "" +"Removes a node and sets all its children as children of the parent node (if " +"it exists). All event subscriptions that pass by the removed node will be " +"unsubscribed." +msgstr "" + +#: doc/classes/Node.xml:576 +msgid "" +"Removes a child node. The node is NOT deleted and must be deleted manually." +msgstr "" + +#: doc/classes/Node.xml:585 +msgid "" +"Removes a node from a group. See notes in the description, and the group " +"methods in [SceneTree]." +msgstr "" + +#: doc/classes/Node.xml:596 +msgid "" +"Replaces a node in a scene by the given one. Subscriptions that pass through " +"this node will be lost." +msgstr "" + +#: doc/classes/Node.xml:603 +msgid "" +"Requests that [code]_ready[/code] be called again. Note that the method " +"won't be called immediately, but is scheduled for when the node is added to " +"the scene tree again (see [method _ready]). [code]_ready[/code] is called " +"only for the node which requested it, which means that you need to request " +"ready for each child if you want them to call [code]_ready[/code] too (in " +"which case, [code]_ready[/code] will be called in the same order as it would " +"normally)." +msgstr "" + +#: doc/classes/Node.xml:612 +msgid "" +"Sends a remote procedure call request for the given [code]method[/code] to " +"peers on the network (and locally), optionally sending all additional " +"arguments as arguments to the method called by the RPC. The call request " +"will only be received by nodes with the same [NodePath], including the exact " +"same node name. Behaviour depends on the RPC configuration for the given " +"method, see [method rpc_config]. Methods are not exposed to RPCs by default. " +"See also [method rset] and [method rset_config] for properties. Returns an " +"empty [Variant].\n" +"[b]Note:[/b] You can only safely use RPCs on clients after you received the " +"[code]connected_to_server[/code] signal from the [SceneTree]. You also need " +"to keep track of the connection state, either by the [SceneTree] signals " +"like [code]server_disconnected[/code] or by checking [code]SceneTree." +"network_peer.get_connection_status() == CONNECTION_CONNECTED[/code]." +msgstr "" + +#: doc/classes/Node.xml:624 +msgid "" +"Changes the RPC mode for the given [code]method[/code] to the given " +"[code]mode[/code]. See [enum MultiplayerAPI.RPCMode]. An alternative is " +"annotating methods and properties with the corresponding keywords " +"([code]remote[/code], [code]master[/code], [code]puppet[/code], " +"[code]remotesync[/code], [code]mastersync[/code], [code]puppetsync[/code]). " +"By default, methods are not exposed to networking (and RPCs). See also " +"[method rset] and [method rset_config] for properties." +msgstr "" + +#: doc/classes/Node.xml:635 +msgid "" +"Sends a [method rpc] to a specific peer identified by [code]peer_id[/code] " +"(see [method NetworkedMultiplayerPeer.set_target_peer]). Returns an empty " +"[Variant]." +msgstr "" + +#: doc/classes/Node.xml:644 +msgid "" +"Sends a [method rpc] using an unreliable protocol. Returns an empty " +"[Variant]." +msgstr "" + +#: doc/classes/Node.xml:655 +msgid "" +"Sends a [method rpc] to a specific peer identified by [code]peer_id[/code] " +"using an unreliable protocol (see [method NetworkedMultiplayerPeer." +"set_target_peer]). Returns an empty [Variant]." +msgstr "" + +#: doc/classes/Node.xml:666 +msgid "" +"Remotely changes a property's value on other peers (and locally). Behaviour " +"depends on the RPC configuration for the given property, see [method " +"rset_config]. See also [method rpc] for RPCs for methods, most information " +"applies to this method as well." +msgstr "" + +#: doc/classes/Node.xml:677 +msgid "" +"Changes the RPC mode for the given [code]property[/code] to the given " +"[code]mode[/code]. See [enum MultiplayerAPI.RPCMode]. An alternative is " +"annotating methods and properties with the corresponding keywords " +"([code]remote[/code], [code]master[/code], [code]puppet[/code], " +"[code]remotesync[/code], [code]mastersync[/code], [code]puppetsync[/code]). " +"By default, properties are not exposed to networking (and RPCs). See also " +"[method rpc] and [method rpc_config] for methods." +msgstr "" + +#: doc/classes/Node.xml:690 +msgid "" +"Remotely changes the property's value on a specific peer identified by " +"[code]peer_id[/code] (see [method NetworkedMultiplayerPeer.set_target_peer])." +msgstr "" + +#: doc/classes/Node.xml:701 +msgid "" +"Remotely changes the property's value on other peers (and locally) using an " +"unreliable protocol." +msgstr "" + +#: doc/classes/Node.xml:714 +msgid "" +"Remotely changes property's value on a specific peer identified by " +"[code]peer_id[/code] using an unreliable protocol (see [method " +"NetworkedMultiplayerPeer.set_target_peer])." +msgstr "" + +#: doc/classes/Node.xml:723 +msgid "Sets the folded state of the node in the Scene dock." +msgstr "" + +#: doc/classes/Node.xml:734 +msgid "" +"Sets the node's network master to the peer with the given peer ID. The " +"network master is the peer that has authority over the node on the network. " +"Useful in conjunction with the [code]master[/code] and [code]puppet[/code] " +"keywords. Inherited from the parent node by default, which ultimately " +"defaults to peer ID 1 (the server). If [code]recursive[/code], the given " +"peer is recursively set as the master for all children of this node." +msgstr "" + +#: doc/classes/Node.xml:743 +msgid "" +"Enables or disables physics (i.e. fixed framerate) processing. When a node " +"is being processed, it will receive a [constant " +"NOTIFICATION_PHYSICS_PROCESS] at a fixed (usually 60 FPS, see [member Engine." +"iterations_per_second] to change) interval (and the [method " +"_physics_process] callback will be called if exists). Enabled automatically " +"if [method _physics_process] is overridden. Any calls to this before [method " +"_ready] will be ignored." +msgstr "" + +#: doc/classes/Node.xml:752 +msgid "" +"Enables or disables internal physics for this node. Internal physics " +"processing happens in isolation from the normal [method _physics_process] " +"calls and is used by some nodes internally to guarantee proper functioning " +"even if the node is paused or physics processing is disabled for scripting " +"([method set_physics_process]). Only useful for advanced uses to manipulate " +"built-in nodes' behaviour." +msgstr "" + +#: doc/classes/Node.xml:761 +msgid "" +"Enables or disables processing. When a node is being processed, it will " +"receive a [constant NOTIFICATION_PROCESS] on every drawn frame (and the " +"[method _process] callback will be called if exists). Enabled automatically " +"if [method _process] is overridden. Any calls to this before [method _ready] " +"will be ignored." +msgstr "" + +#: doc/classes/Node.xml:770 +msgid "" +"Enables or disables input processing. This is not required for GUI controls! " +"Enabled automatically if [method _input] is overridden. Any calls to this " +"before [method _ready] will be ignored." +msgstr "" + +#: doc/classes/Node.xml:779 +msgid "" +"Enables or disabled internal processing for this node. Internal processing " +"happens in isolation from the normal [method _process] calls and is used by " +"some nodes internally to guarantee proper functioning even if the node is " +"paused or processing is disabled for scripting ([method set_process]). Only " +"useful for advanced uses to manipulate built-in nodes' behaviour." +msgstr "" + +#: doc/classes/Node.xml:788 +msgid "" +"Enables unhandled input processing. This is not required for GUI controls! " +"It enables the node to receive all input that was not previously handled " +"(usually by a [Control]). Enabled automatically if [method _unhandled_input] " +"is overridden. Any calls to this before [method _ready] will be ignored." +msgstr "" + +#: doc/classes/Node.xml:797 +msgid "" +"Enables unhandled key input processing. Enabled automatically if [method " +"_unhandled_key_input] is overridden. Any calls to this before [method " +"_ready] will be ignored." +msgstr "" + +#: doc/classes/Node.xml:806 +msgid "" +"Sets whether this is an instance load placeholder. See [InstancePlaceholder]." +msgstr "" + +#: doc/classes/Node.xml:813 +msgid "" +"Updates the warning displayed for this node in the Scene Dock.\n" +"Use [method _get_configuration_warning] to setup the warning message to " +"display." +msgstr "" + +#: doc/classes/Node.xml:820 +msgid "" +"The override to the default [MultiplayerAPI]. Set to [code]null[/code] to " +"use the default [SceneTree] one." +msgstr "" + +#: doc/classes/Node.xml:823 +msgid "" +"When a scene is instanced from a file, its topmost node contains the " +"filename from which it was loaded." +msgstr "" + +#: doc/classes/Node.xml:826 +msgid "" +"The [MultiplayerAPI] instance associated with this node. Either the [member " +"custom_multiplayer], or the default SceneTree one (if inside tree)." +msgstr "" + +#: doc/classes/Node.xml:829 +msgid "" +"The name of the node. This name is unique among the siblings (other child " +"nodes from the same parent). When set to an existing name, the node will be " +"automatically renamed." +msgstr "" + +#: doc/classes/Node.xml:832 +msgid "" +"The node owner. A node can have any other node as owner (as long as it is a " +"valid parent, grandparent, etc. ascending in the tree). When saving a node " +"(using [PackedScene]), all the nodes it owns will be saved with it. This " +"allows for the creation of complex [SceneTree]s, with instancing and " +"subinstancing." +msgstr "" + +#: doc/classes/Node.xml:835 +msgid "Pause mode. How the node will behave if the [SceneTree] is paused." +msgstr "" + +#: doc/classes/Node.xml:838 +msgid "" +"The node's priority in the execution order of the enabled processing " +"callbacks (i.e. [constant NOTIFICATION_PROCESS], [constant " +"NOTIFICATION_PHYSICS_PROCESS] and their internal counterparts). Nodes whose " +"process priority value is [i]lower[/i] will have their processing callbacks " +"executed first." +msgstr "" + +#: doc/classes/Node.xml:844 +msgid "Emitted when the node is ready." +msgstr "" + +#: doc/classes/Node.xml:849 +msgid "Emitted when the node is renamed." +msgstr "" + +#: doc/classes/Node.xml:854 +msgid "Emitted when the node enters the tree." +msgstr "" + +#: doc/classes/Node.xml:859 +msgid "Emitted after the node exits the tree and is no longer active." +msgstr "" + +#: doc/classes/Node.xml:864 +msgid "" +"Emitted when the node is still active but about to exit the tree. This is " +"the right place for de-initialization (or a \"destructor\", if you will)." +msgstr "" + +#: doc/classes/Node.xml:870 +msgid "Notification received when the node enters a [SceneTree]." +msgstr "" + +#: doc/classes/Node.xml:873 +msgid "Notification received when the node is about to exit a [SceneTree]." +msgstr "" + +#: doc/classes/Node.xml:876 +msgid "Notification received when the node is moved in the parent." +msgstr "" + +#: doc/classes/Node.xml:879 +msgid "Notification received when the node is ready. See [method _ready]." +msgstr "" + +#: doc/classes/Node.xml:882 +msgid "Notification received when the node is paused." +msgstr "" + +#: doc/classes/Node.xml:885 +msgid "Notification received when the node is unpaused." +msgstr "" + +#: doc/classes/Node.xml:888 +msgid "" +"Notification received every frame when the physics process flag is set (see " +"[method set_physics_process])." +msgstr "" + +#: doc/classes/Node.xml:891 +msgid "" +"Notification received every frame when the process flag is set (see [method " +"set_process])." +msgstr "" + +#: doc/classes/Node.xml:894 +msgid "" +"Notification received when a node is set as a child of another node.\n" +"[b]Note:[/b] This doesn't mean that a node entered the [SceneTree]." +msgstr "" + +#: doc/classes/Node.xml:898 +msgid "" +"Notification received when a node is unparented (parent removed it from the " +"list of children)." +msgstr "" + +#: doc/classes/Node.xml:901 +msgid "Notification received when the node is instanced." +msgstr "" + +#: doc/classes/Node.xml:904 +msgid "Notification received when a drag begins." +msgstr "" + +#: doc/classes/Node.xml:907 +msgid "Notification received when a drag ends." +msgstr "" + +#: doc/classes/Node.xml:910 +msgid "Notification received when the node's [NodePath] changed." +msgstr "" + +#: doc/classes/Node.xml:913 +msgid "" +"Notification received every frame when the internal process flag is set (see " +"[method set_process_internal])." +msgstr "" + +#: doc/classes/Node.xml:916 +msgid "" +"Notification received every frame when the internal physics process flag is " +"set (see [method set_physics_process_internal])." +msgstr "" + +#: doc/classes/Node.xml:919 +msgid "" +"Notification received from the OS when the mouse enters the game window.\n" +"Implemented on desktop and web platforms." +msgstr "" + +#: doc/classes/Node.xml:923 +msgid "" +"Notification received from the OS when the mouse leaves the game window.\n" +"Implemented on desktop and web platforms." +msgstr "" + +#: doc/classes/Node.xml:927 +msgid "" +"Notification received from the OS when the game window is focused.\n" +"Implemented on all platforms." +msgstr "" + +#: doc/classes/Node.xml:931 +msgid "" +"Notification received from the OS when the game window is unfocused.\n" +"Implemented on all platforms." +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 [kbd]Alt + F4[/kbd]).\n" +"Implemented on desktop platforms." +msgstr "" + +#: doc/classes/Node.xml:939 +msgid "" +"Notification received from the OS when a go back request is sent (e.g. " +"pressing the \"Back\" button on Android).\n" +"Specific to the Android platform." +msgstr "" + +#: doc/classes/Node.xml:972 +msgid "" +"Inherits pause mode from the node's parent. For the root node, it is " +"equivalent to [constant PAUSE_MODE_STOP]. Default." +msgstr "" + +#: doc/classes/Node.xml:975 +msgid "Stops processing when the [SceneTree] is paused." +msgstr "" + +#: doc/classes/Node.xml:978 +msgid "Continue to process regardless of the [SceneTree] pause state." +msgstr "" + +#: doc/classes/Node.xml:981 +msgid "Duplicate the node's signals." +msgstr "" + +#: doc/classes/Node.xml:984 +msgid "Duplicate the node's groups." +msgstr "" + +#: doc/classes/Node.xml:987 +msgid "Duplicate the node's scripts." +msgstr "" + +#: doc/classes/Node.xml:990 +msgid "" +"Duplicate using instancing.\n" +"An instance stays linked to the original so when the original changes, the " +"instance changes too." +msgstr "" + +#: doc/classes/Node2D.xml:4 +msgid "" +"A 2D game object, inherited by all 2D-related nodes. Has a position, " +"rotation, scale, and Z index." +msgstr "" + +#: doc/classes/Node2D.xml:7 +msgid "" +"A 2D game object, with a transform (position, rotation, and scale). All 2D " +"nodes, including physics objects and sprites, inherit from Node2D. Use " +"Node2D as a parent node to move, scale and rotate children in a 2D project. " +"Also gives control of the node's render order." +msgstr "" + +#: doc/classes/Node2D.xml:19 +msgid "Multiplies the current scale by the [code]ratio[/code] vector." +msgstr "" + +#: doc/classes/Node2D.xml:28 +msgid "" +"Returns the angle between the node and the [code]point[/code] in radians." +msgstr "" + +#: doc/classes/Node2D.xml:37 +msgid "Returns the [Transform2D] relative to this node's parent." +msgstr "" + +#: doc/classes/Node2D.xml:46 +msgid "Adds the [code]offset[/code] vector to the node's global position." +msgstr "" + +#: doc/classes/Node2D.xml:55 +msgid "" +"Rotates the node so it points towards the [code]point[/code], which is " +"expected to use global coordinates." +msgstr "" + +#: doc/classes/Node2D.xml:66 +msgid "" +"Applies a local translation on the node's X axis based on the [method Node." +"_process]'s [code]delta[/code]. If [code]scaled[/code] is [code]false[/" +"code], normalizes the movement." +msgstr "" + +#: doc/classes/Node2D.xml:77 +msgid "" +"Applies a local translation on the node's Y axis based on the [method Node." +"_process]'s [code]delta[/code]. If [code]scaled[/code] is [code]false[/" +"code], normalizes the movement." +msgstr "" + +#: doc/classes/Node2D.xml:86 +msgid "" +"Applies a rotation to the node, in radians, starting from its current " +"rotation." +msgstr "" + +#: doc/classes/Node2D.xml:95 +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 "" +"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 +msgid "" +"Translates the node by the given [code]offset[/code] in local coordinates." +msgstr "" + +#: doc/classes/Node2D.xml:119 +msgid "Global position." +msgstr "" + +#: doc/classes/Node2D.xml:122 +msgid "Global rotation in radians." +msgstr "" + +#: doc/classes/Node2D.xml:125 +msgid "Global rotation in degrees." +msgstr "" + +#: doc/classes/Node2D.xml:128 +msgid "Global scale." +msgstr "" + +#: doc/classes/Node2D.xml:131 +msgid "Global [Transform2D]." +msgstr "" + +#: doc/classes/Node2D.xml:134 +msgid "Position, relative to the node's parent." +msgstr "" + +#: doc/classes/Node2D.xml:137 +msgid "Rotation in radians, relative to the node's parent." +msgstr "" + +#: doc/classes/Node2D.xml:140 +msgid "Rotation in degrees, relative to the node's parent." +msgstr "" + +#: doc/classes/Node2D.xml:143 +msgid "The node's scale. Unscaled value: [code](1, 1)[/code]." +msgstr "" + +#: doc/classes/Node2D.xml:146 +msgid "Local [Transform2D]." +msgstr "" + +#: doc/classes/Node2D.xml:149 +msgid "" +"If [code]true[/code], the node's Z index is relative to its parent's Z " +"index. If this node's Z index is 2 and its parent's effective Z index is 3, " +"then this node's effective Z index will be 2 + 3 = 5." +msgstr "" + +#: doc/classes/Node2D.xml:152 +msgid "" +"Z index. Controls the order in which the nodes render. A node with a higher " +"Z index will display in front of others." +msgstr "" + +#: doc/classes/Node3D.xml:4 +msgid "Most basic 3D game object, parent of all 3D-related nodes." +msgstr "" + +#: doc/classes/Node3D.xml:7 +msgid "" +"Most basic 3D game object, with a 3D [Transform] and visibility settings. " +"All other 3D game objects inherit from Node3D. Use [Node3D] as a parent node " +"to move, scale, rotate and show/hide children in a 3D project.\n" +"Affine operations (rotate, scale, translate) happen in parent's local " +"coordinate system, unless the [Node3D] object is set as top-level. Affine " +"operations in this coordinate system correspond to direct affine operations " +"on the [Node3D]'s transform. The word local below refers to this coordinate " +"system. The coordinate system that is attached to the [Node3D] object itself " +"is referred to as object-local coordinate system.\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:12 +msgid "" +"https://docs.godotengine.org/en/latest/tutorials/3d/introduction_to_3d.html" +msgstr "" + +#: 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:33 +msgid "" +"Returns the current [World3D] resource this [Node3D] node is registered to." +msgstr "" + +#: 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:53 +msgid "" +"Scales the global (world) transformation by the given [Vector3] scale " +"factors." +msgstr "" + +#: 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:69 +msgid "" +"Disables rendering of this node. Changes [member visible] to [code]false[/" +"code]." +msgstr "" + +#: 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: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:90 +msgid "" +"Returns whether this node is set as Toplevel, that is whether it ignores its " +"parent nodes transformations." +msgstr "" + +#: 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:104 +msgid "" +"Returns whether the node is visible, taking into consideration that its " +"parents visibility." +msgstr "" + +#: doc/classes/Node3D.xml:115 +msgid "" +"Rotates itself so that the local -Z axis points towards the [code]target[/" +"code] position.\n" +"The transform will first be rotated around the given [code]up[/code] vector, " +"and then fully aligned to the target by a further rotation around an axis " +"perpendicular to both the [code]target[/code] and [code]up[/code] vectors.\n" +"Operations take place in global space." +msgstr "" + +#: 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: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:148 +msgid "" +"Rotates the local transformation around axis, a unit [Vector3], by specified " +"angle in radians." +msgstr "" + +#: 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:168 +msgid "Rotates the local transformation around the X axis by angle in radians." +msgstr "" + +#: doc/classes/Node3D.xml:177 +msgid "Rotates the local transformation around the Y axis by angle in radians." +msgstr "" + +#: doc/classes/Node3D.xml:186 +msgid "Rotates the local transformation around the Z axis by angle in radians." +msgstr "" + +#: 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:204 +msgid "" +"Makes the node ignore its parents transformations. Node transformations are " +"only in global space." +msgstr "" + +#: 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:220 +msgid "" +"Reset all transformations for this node (sets its [Transform] to the " +"identity matrix)." +msgstr "" + +#: doc/classes/Node3D.xml:229 +msgid "" +"Sets whether the node ignores notification that its transformation (global " +"or local) changed." +msgstr "" + +#: 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: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:254 +msgid "" +"Enables rendering of this node. Changes [member visible] to [code]true[/" +"code]." +msgstr "" + +#: 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:272 +msgid "" +"Transforms [code]global_point[/code] from world space to this node's local " +"space." +msgstr "" + +#: 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 " +"scale, so if scaled by e.g. [code](10, 1, 1)[/code], a translation by an " +"offset of [code](2, 0, 0)[/code] would actually add 20 ([code]2 * 10[/code]) " +"to the X coordinate." +msgstr "" + +#: doc/classes/Node3D.xml:291 +msgid "" +"Changes the node's position by the given offset [Vector3] in local space." +msgstr "" + +#: doc/classes/Node3D.xml:298 +msgid "Updates the [Node3DGizmo] of this node." +msgstr "" + +#: 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:307 +msgid "World3D space (global) [Transform] of this node." +msgstr "" + +#: 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" +"[b]Note:[/b] In the mathematical sense, rotation is a matrix and not a " +"vector. The three Euler angles, which are the three independent parameters " +"of the Euler-angle parametrization of the rotation matrix, are stored in a " +"[Vector3] data structure not because the rotation is a vector, but only " +"because [Vector3] exists as a convenient data-structure to store 3 floating-" +"point numbers. Therefore, applying affine operations on the rotation \"vector" +"\" is not meaningful." +msgstr "" + +#: 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:317 +msgid "Scale part of the local transformation." +msgstr "" + +#: doc/classes/Node3D.xml:320 +msgid "Local space [Transform] of this node, with respect to the parent node." +msgstr "" + +#: doc/classes/Node3D.xml:323 +msgid "Local translation of this node." +msgstr "" + +#: doc/classes/Node3D.xml:326 +msgid "If [code]true[/code], this node is drawn." +msgstr "" + +#: doc/classes/Node3D.xml:332 +msgid "Emitted when node visibility changes." +msgstr "" + +#: 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" +"In order for [constant NOTIFICATION_TRANSFORM_CHANGED] to work, users first " +"need to ask for it, with [method set_notify_transform]." +msgstr "" + +#: doc/classes/Node3D.xml:342 +msgid "" +"Node3D nodes receives this notification when they are registered to new " +"[World3D] resource." +msgstr "" + +#: doc/classes/Node3D.xml:345 +msgid "" +"Node3D nodes receives this notification when they are unregistered from " +"current [World3D] resource." +msgstr "" + +#: doc/classes/Node3D.xml:348 +msgid "Node3D nodes receives this notification when their visibility changes." +msgstr "" + +#: doc/classes/NodePath.xml:4 +msgid "Pre-parsed scene tree path." +msgstr "" + +#: doc/classes/NodePath.xml:7 +msgid "" +"A pre-parsed relative or absolute path in a scene tree, for use with [method " +"Node.get_node] and similar functions. It can reference a node, a resource " +"within a node, or a property of a node or resource. For instance, " +"[code]\"Path2D/PathFollow2D/Sprite2D:texture:size\"[/code] would refer to " +"the [code]size[/code] property of the [code]texture[/code] resource on the " +"node named [code]\"Sprite2D\"[/code] which is a child of the other named " +"nodes in the path.\n" +"You will usually just pass a string to [method Node.get_node] and it will be " +"automatically converted, but you may occasionally want to parse a path ahead " +"of time with [NodePath] or the literal syntax [code]@\"path\"[/code]. " +"Exporting a [NodePath] variable will give you a node selection widget in the " +"properties panel of the editor, which can often be useful.\n" +"A [NodePath] is composed of a list of slash-separated node names (like a " +"filesystem path) and an optional colon-separated list of \"subnames\" which " +"can be resources or properties.\n" +"Some examples of NodePaths include the following:\n" +"[codeblock]\n" +"# No leading slash means it is relative to the current node.\n" +"@\"A\" # Immediate child A\n" +"@\"A/B\" # A's child B\n" +"@\".\" # The current node.\n" +"@\"..\" # The parent node.\n" +"@\"../C\" # A sibling node C.\n" +"# A leading slash means it is absolute from the SceneTree.\n" +"@\"/root\" # Equivalent to get_tree().get_root().\n" +"@\"/root/Main\" # If your main scene's root node were named \"Main\".\n" +"@\"/root/MyAutoload\" # If you have an autoloaded node or scene.\n" +"[/codeblock]" +msgstr "" + +#: doc/classes/NodePath.xml:33 +msgid "" +"Creates a NodePath from a string, e.g. [code]\"Path2D/PathFollow2D/Sprite2D:" +"texture:size\"[/code]. A path is absolute if it starts with a slash. " +"Absolute paths are only valid in the global scene tree, not within " +"individual scenes. In a relative path, [code]\".\"[/code] and [code]\"..\"[/" +"code] indicate the current node and its parent.\n" +"The \"subnames\" optionally included after the path to the target node can " +"point to resources or properties, and can also be nested.\n" +"Examples of valid NodePaths (assuming that those nodes exist and have the " +"referenced resources or properties):\n" +"[codeblock]\n" +"# Points to the Sprite2D node\n" +"\"Path2D/PathFollow2D/Sprite2D\"\n" +"# Points to the Sprite2D node and its \"texture\" resource.\n" +"# get_node() would retrieve \"Sprite2D\", while get_node_and_resource()\n" +"# would retrieve both the Sprite2D node and the \"texture\" resource.\n" +"\"Path2D/PathFollow2D/Sprite2D:texture\"\n" +"# Points to the Sprite2D node and its \"position\" property.\n" +"\"Path2D/PathFollow2D/Sprite2D:position\"\n" +"# Points to the Sprite2D node and the \"x\" component of its \"position\" " +"property.\n" +"\"Path2D/PathFollow2D/Sprite2D:position:x\"\n" +"# Absolute path (from \"root\")\n" +"\"/root/Level/Path2D\"\n" +"[/codeblock]" +msgstr "" + +#: doc/classes/NodePath.xml:56 +msgid "" +"Returns a node path with a colon character ([code]:[/code]) prepended, " +"transforming it to a pure property path with no node name (defaults to " +"resolving from the current node).\n" +"[codeblock]\n" +"# This will be parsed as a node path to the \"x\" property in the \"position" +"\" node\n" +"var node_path = NodePath(\"position:x\")\n" +"# This will be parsed as a node path to the \"x\" component of the \"position" +"\" property in the current node\n" +"var property_path = node_path.get_as_property_path()\n" +"print(property_path) # :position:x\n" +"[/codeblock]" +msgstr "" + +#: doc/classes/NodePath.xml:70 +msgid "" +"Returns all subnames concatenated with a colon character ([code]:[/code]) as " +"separator, i.e. the right side of the first colon in a node path.\n" +"[codeblock]\n" +"var nodepath = NodePath(\"Path2D/PathFollow2D/Sprite2D:texture:load_path\")\n" +"print(nodepath.get_concatenated_subnames()) # texture:load_path\n" +"[/codeblock]" +msgstr "" + +#: doc/classes/NodePath.xml:83 +msgid "" +"Gets the node name indicated by [code]idx[/code] (0 to [method " +"get_name_count]).\n" +"[codeblock]\n" +"var node_path = NodePath(\"Path2D/PathFollow2D/Sprite2D\")\n" +"print(node_path.get_name(0)) # Path2D\n" +"print(node_path.get_name(1)) # PathFollow2D\n" +"print(node_path.get_name(2)) # Sprite\n" +"[/codeblock]" +msgstr "" + +#: doc/classes/NodePath.xml:96 +msgid "" +"Gets the number of node names which make up the path. Subnames (see [method " +"get_subname_count]) are not included.\n" +"For example, [code]\"Path2D/PathFollow2D/Sprite2D\"[/code] has 3 names." +msgstr "" + +#: doc/classes/NodePath.xml:106 +msgid "" +"Gets the resource or property name indicated by [code]idx[/code] (0 to " +"[method get_subname_count]).\n" +"[codeblock]\n" +"var node_path = NodePath(\"Path2D/PathFollow2D/Sprite2D:texture:load_path" +"\")\n" +"print(node_path.get_subname(0)) # texture\n" +"print(node_path.get_subname(1)) # load_path\n" +"[/codeblock]" +msgstr "" + +#: doc/classes/NodePath.xml:118 +msgid "" +"Gets the number of resource or property names (\"subnames\") in the path. " +"Each subname is listed after a colon character ([code]:[/code]) in the node " +"path.\n" +"For example, [code]\"Path2D/PathFollow2D/Sprite2D:texture:load_path\"[/code] " +"has 2 subnames." +msgstr "" + +#: doc/classes/NodePath.xml:126 +msgid "" +"Returns [code]true[/code] if the node path is absolute (as opposed to " +"relative), which means that it starts with a slash character ([code]/[/" +"code]). Absolute node paths can be used to access the root node ([code]\"/" +"root\"[/code]) or autoloads (e.g. [code]\"/global\"[/code] if a \"global\" " +"autoload was registered)." +msgstr "" + +#: doc/classes/NodePath.xml:133 +msgid "Returns [code]true[/code] if the node path is empty." +msgstr "" + +#: modules/opensimplex/doc_classes/NoiseTexture.xml:4 +msgid "[OpenSimplexNoise] filled texture." +msgstr "" + +#: modules/opensimplex/doc_classes/NoiseTexture.xml:7 +msgid "" +"Uses an [OpenSimplexNoise] to fill the texture data. You can specify the " +"texture size but keep in mind that larger textures will take longer to " +"generate and seamless noise only works with square sized textures.\n" +"NoiseTexture can also generate normalmap textures.\n" +"The class uses [Thread]s to generate the texture data internally, so [method " +"Texture2D.get_data] may return [code]null[/code] if the generation process " +"has not completed yet. In that case, you need to wait for the texture to be " +"generated before accessing the data:\n" +"[codeblock]\n" +"var texture = preload(\"res://noise.tres\")\n" +"yield(texture, \"changed\")\n" +"var image = texture.get_data()\n" +"[/codeblock]" +msgstr "" + +#: modules/opensimplex/doc_classes/NoiseTexture.xml:22 +msgid "" +"If [code]true[/code], the resulting texture contains a normal map created " +"from the original noise interpreted as a bump map." +msgstr "" + +#: modules/opensimplex/doc_classes/NoiseTexture.xml:25 +msgid "" +"Strength of the bump maps used in this texture. A higher value will make the " +"bump maps appear larger while a lower value will make them appear softer." +msgstr "" + +#: modules/opensimplex/doc_classes/NoiseTexture.xml:28 +msgid "Height of the generated texture." +msgstr "" + +#: modules/opensimplex/doc_classes/NoiseTexture.xml:31 +msgid "The [OpenSimplexNoise] instance used to generate the noise." +msgstr "" + +#: modules/opensimplex/doc_classes/NoiseTexture.xml:34 +msgid "" +"Whether the texture can be tiled without visible seams or not. Seamless " +"textures take longer to generate." +msgstr "" + +#: modules/opensimplex/doc_classes/NoiseTexture.xml:37 +msgid "Width of the generated texture." +msgstr "" + +#: doc/classes/Object.xml:4 +msgid "Base class for all non built-in types." +msgstr "" + +#: doc/classes/Object.xml:7 +msgid "" +"Every class which is not a built-in type inherits from this class.\n" +"You can construct Objects from scripting languages, using [code]Object.new()" +"[/code] in GDScript, [code]new Object[/code] in C#, or the \"Construct Object" +"\" node in VisualScript.\n" +"Objects do not manage memory. If a class inherits from Object, you will have " +"to delete instances of it manually. To do so, call the [method free] method " +"from your script or delete the instance from C++.\n" +"Some classes that extend Object add memory management. This is the case of " +"[Reference], which counts references and deletes itself automatically when " +"no longer referenced. [Node], another fundamental type, deletes all its " +"children when freed from memory.\n" +"Objects export properties, which are mainly useful for storage and editing, " +"but not really so much in programming. Properties are exported in [method " +"_get_property_list] and handled in [method _get] and [method _set]. However, " +"scripting languages and C++ have simpler means to export them.\n" +"Property membership can be tested directly in GDScript using [code]in[/" +"code]:\n" +"[codeblock]\n" +"var n = Node2D.new()\n" +"print(\"position\" in n) # Prints \"True\".\n" +"print(\"other_property\" in n) # Prints \"False\".\n" +"[/codeblock]\n" +"Objects also receive notifications. Notifications are a simple way to notify " +"the object about different events, so they can all be handled together. See " +"[method _notification]." +msgstr "" + +#: doc/classes/Object.xml:29 +msgid "" +"Virtual method which can be overridden to customize the return value of " +"[method get].\n" +"Returns the given property. Returns [code]null[/code] if the [code]property[/" +"code] does not exist." +msgstr "" + +#: doc/classes/Object.xml:37 +msgid "" +"Virtual method which can be overridden to customize the return value of " +"[method get_property_list].\n" +"Returns the object's property list as an [Array] of dictionaries.\n" +"Each property's [Dictionary] must contain at least [code]name: String[/code] " +"and [code]type: int[/code] (see [enum Variant.Type]) entries. Optionally, it " +"can also include [code]hint: int[/code] (see [enum PropertyHint]), " +"[code]hint_string: String[/code], and [code]usage: int[/code] (see [enum " +"PropertyUsageFlags])." +msgstr "" + +#: doc/classes/Object.xml:46 +msgid "Called when the object is initialized." +msgstr "" + +#: doc/classes/Object.xml:55 +msgid "" +"Called whenever the object receives a notification, which is identified in " +"[code]what[/code] by a constant. The base [Object] has two constants " +"[constant NOTIFICATION_POSTINITIALIZE] and [constant " +"NOTIFICATION_PREDELETE], but subclasses such as [Node] define a lot more " +"notifications which are also received by this method." +msgstr "" + +#: doc/classes/Object.xml:66 +msgid "" +"Virtual method which can be overridden to customize the return value of " +"[method set].\n" +"Sets a property. Returns [code]true[/code] if the [code]property[/code] " +"exists." +msgstr "" + +#: doc/classes/Object.xml:74 +msgid "" +"Virtual method which can be overridden to customize the return value of " +"[method to_string], and thus the object's representation where it is " +"converted to a string, e.g. with [code]print(obj)[/code].\n" +"Returns a [String] representing the object. If not overridden, defaults to " +"[code]\"[ClassName:RID]\"[/code]." +msgstr "" + +#: doc/classes/Object.xml:86 +msgid "" +"Adds a user-defined [code]signal[/code]. Arguments are optional, but can be " +"added as an [Array] of dictionaries, each containing [code]name: String[/" +"code] and [code]type: int[/code] (see [enum Variant.Type]) entries." +msgstr "" + +#: doc/classes/Object.xml:95 +msgid "" +"Calls the [code]method[/code] on the object and returns the result. This " +"method supports a variable number of arguments, so parameters are passed as " +"a comma separated list. Example:\n" +"[codeblock]\n" +"call(\"set\", \"position\", Vector2(42.0, 0.0))\n" +"[/codeblock]" +msgstr "" + +#: doc/classes/Object.xml:107 +msgid "" +"Calls the [code]method[/code] on the object during idle time. This method " +"supports a variable number of arguments, so parameters are passed as a comma " +"separated list. Example:\n" +"[codeblock]\n" +"call_deferred(\"set\", \"position\", Vector2(42.0, 0.0))\n" +"[/codeblock]" +msgstr "" + +#: doc/classes/Object.xml:121 +msgid "" +"Calls the [code]method[/code] on the object and returns the result. " +"Contrarily to [method call], this method does not support a variable number " +"of arguments but expects all parameters to be via a single [Array].\n" +"[codeblock]\n" +"callv(\"set\", [ \"position\", Vector2(42.0, 0.0) ])\n" +"[/codeblock]" +msgstr "" + +#: doc/classes/Object.xml:131 +msgid "" +"Returns [code]true[/code] if the object can translate strings. See [method " +"set_message_translation] and [method tr]." +msgstr "" + +#: doc/classes/Object.xml:146 +msgid "" +"[b]FIXME:[/b] The syntax changed with the addition of [Callable], this " +"should be updated.\n" +"Connects a [code]signal[/code] to a [code]method[/code] on a [code]target[/" +"code] object. Pass optional [code]binds[/code] to the call as an [Array] of " +"parameters. These parameters will be passed to the method after any " +"parameter used in the call to [method emit_signal]. Use [code]flags[/code] " +"to set deferred or one-shot connections. See [enum ConnectFlags] constants.\n" +"A [code]signal[/code] can only be connected once to a [code]method[/code]. " +"It will throw an error if already connected, unless the signal was connected " +"with [constant CONNECT_REFERENCE_COUNTED]. To avoid this, first, use [method " +"is_connected] to check for existing connections.\n" +"If the [code]target[/code] is destroyed in the game's lifecycle, the " +"connection will be lost.\n" +"Examples:\n" +"[codeblock]\n" +"connect(\"pressed\", self, \"_on_Button_pressed\") # BaseButton signal\n" +"connect(\"text_entered\", self, \"_on_LineEdit_text_entered\") # LineEdit " +"signal\n" +"connect(\"hit\", self, \"_on_Player_hit\", [ weapon_type, damage ]) # User-" +"defined signal\n" +"[/codeblock]\n" +"An example of the relationship between [code]binds[/code] passed to [method " +"connect] and parameters used when calling [method emit_signal]:\n" +"[codeblock]\n" +"connect(\"hit\", self, \"_on_Player_hit\", [ weapon_type, damage ]) # " +"weapon_type and damage are passed last\n" +"emit_signal(\"hit\", \"Dark lord\", 5) # \"Dark lord\" and 5 are passed " +"first\n" +"func _on_Player_hit(hit_by, level, weapon_type, damage):\n" +" print(\"Hit by %s (lvl %d) with weapon %s for %d damage\" % [hit_by, " +"level, weapon_type, damage])\n" +"[/codeblock]" +msgstr "" + +#: doc/classes/Object.xml:173 +msgid "" +"[b]FIXME:[/b] The syntax changed with the addition of [Callable], this " +"should be updated.\n" +"Disconnects a [code]signal[/code] from a [code]method[/code] on the given " +"[code]target[/code].\n" +"If you try to disconnect a connection that does not exist, the method will " +"throw an error. Use [method is_connected] to ensure that the connection " +"exists." +msgstr "" + +#: doc/classes/Object.xml:184 +msgid "" +"Emits the given [code]signal[/code]. The signal must exist, so it should be " +"a built-in signal of this class or one of its parent classes, or a user-" +"defined signal. This method supports a variable number of arguments, so " +"parameters are passed as a comma separated list. Example:\n" +"[codeblock]\n" +"emit_signal(\"hit\", weapon_type, damage)\n" +"emit_signal(\"game_over\")\n" +"[/codeblock]" +msgstr "" + +#: doc/classes/Object.xml:195 +msgid "" +"Deletes the object from memory. Any pre-existing reference to the freed " +"object will now return [code]null[/code]." +msgstr "" + +#: doc/classes/Object.xml:204 +msgid "" +"Returns the [Variant] value of the given [code]property[/code]. If the " +"[code]property[/code] doesn't exist, this will return [code]null[/code]." +msgstr "" + +#: doc/classes/Object.xml:211 +msgid "Returns the object's class as a [String]." +msgstr "" + +#: doc/classes/Object.xml:218 +msgid "" +"Returns an [Array] of dictionaries with information about signals that are " +"connected to the object.\n" +"Each [Dictionary] contains three String entries:\n" +"- [code]source[/code] is a reference to the signal emitter.\n" +"- [code]signal_name[/code] is the name of the connected signal.\n" +"- [code]method_name[/code] is the name of the method to which the signal is " +"connected." +msgstr "" + +#: doc/classes/Object.xml:231 +msgid "" +"Gets the object's property indexed by the given [NodePath]. The node path " +"should be relative to the current object and can use the colon character " +"([code]:[/code]) to access nested properties. Examples: [code]\"position:x" +"\"[/code] or [code]\"material:next_pass:blend_mode\"[/code]." +msgstr "" + +#: doc/classes/Object.xml:238 +msgid "" +"Returns the object's unique instance ID.\n" +"This ID can be saved in [EncodedObjectAsID], and can be used to retrieve the " +"object instance with [method @GDScript.instance_from_id]." +msgstr "" + +#: doc/classes/Object.xml:248 +msgid "Returns the object's metadata entry for the given [code]name[/code]." +msgstr "" + +#: doc/classes/Object.xml:255 +msgid "Returns the object's metadata as a [PackedStringArray]." +msgstr "" + +#: doc/classes/Object.xml:262 +msgid "Returns the object's methods and their signatures as an [Array]." +msgstr "" + +#: doc/classes/Object.xml:269 +msgid "" +"Returns the object's property list as an [Array] of dictionaries.\n" +"Each property's [Dictionary] contain at least [code]name: String[/code] and " +"[code]type: int[/code] (see [enum Variant.Type]) entries. Optionally, it can " +"also include [code]hint: int[/code] (see [enum PropertyHint]), " +"[code]hint_string: String[/code], and [code]usage: int[/code] (see [enum " +"PropertyUsageFlags])." +msgstr "" + +#: doc/classes/Object.xml:277 +msgid "" +"Returns the object's [Script] instance, or [code]null[/code] if none is " +"assigned." +msgstr "" + +#: doc/classes/Object.xml:286 +msgid "Returns an [Array] of connections for the given [code]signal[/code]." +msgstr "" + +#: doc/classes/Object.xml:293 +msgid "Returns the list of signals as an [Array] of dictionaries." +msgstr "" + +#: doc/classes/Object.xml:302 +msgid "" +"Returns [code]true[/code] if a metadata entry is found with the given " +"[code]name[/code]." +msgstr "" + +#: doc/classes/Object.xml:311 +msgid "" +"Returns [code]true[/code] if the object contains the given [code]method[/" +"code]." +msgstr "" + +#: doc/classes/Object.xml:320 +msgid "Returns [code]true[/code] if the given [code]signal[/code] exists." +msgstr "" + +#: doc/classes/Object.xml:329 +msgid "" +"Returns [code]true[/code] if the given user-defined [code]signal[/code] " +"exists. Only signals added using [method add_user_signal] are taken into " +"account." +msgstr "" + +#: doc/classes/Object.xml:336 +msgid "Returns [code]true[/code] if signal emission blocking is enabled." +msgstr "" + +#: doc/classes/Object.xml:345 +msgid "" +"Returns [code]true[/code] if the object inherits from the given [code]class[/" +"code]." +msgstr "" + +#: doc/classes/Object.xml:356 +msgid "" +"[b]FIXME:[/b] The syntax changed with the addition of [Callable], this " +"should be updated.\n" +"Returns [code]true[/code] if a connection exists for a given [code]signal[/" +"code], [code]target[/code], and [code]method[/code]." +msgstr "" + +#: doc/classes/Object.xml:364 +msgid "" +"Returns [code]true[/code] if the [method Node.queue_free] method was called " +"for the object." +msgstr "" + +#: doc/classes/Object.xml:375 +msgid "" +"Send a given notification to the object, which will also trigger a call to " +"the [method _notification] method of all classes that the object inherits " +"from.\n" +"If [code]reversed[/code] is [code]true[/code], [method _notification] is " +"called first on the object's own class, and then up to its successive parent " +"classes. If [code]reversed[/code] is [code]false[/code], [method " +"_notification] is called first on the highest ancestor ([Object] itself), " +"and then down to its successive inheriting classes." +msgstr "" + +#: doc/classes/Object.xml:383 +msgid "" +"Notify the editor that the property list has changed, so that editor plugins " +"can take the new values into account. Does nothing on export builds." +msgstr "" + +#: doc/classes/Object.xml:392 +msgid "Removes a given entry from the object's metadata." +msgstr "" + +#: doc/classes/Object.xml:403 +msgid "" +"Assigns a new value to the given property. If the [code]property[/code] does " +"not exist, nothing will happen." +msgstr "" + +#: doc/classes/Object.xml:412 +msgid "If set to [code]true[/code], signal emission is blocked." +msgstr "" + +#: doc/classes/Object.xml:423 +msgid "" +"Assigns a new value to the given property, after the current frame's physics " +"step. This is equivalent to calling [method set] via [method call_deferred], " +"i.e. [code]call_deferred(\"set\", property, value)[/code]." +msgstr "" + +#: doc/classes/Object.xml:434 +msgid "" +"Assigns a new value to the property identified by the [NodePath]. The node " +"path should be relative to the current object and can use the colon " +"character ([code]:[/code]) to access nested properties. Example:\n" +"[codeblock]\n" +"set_indexed(\"position\", Vector2(42, 0))\n" +"set_indexed(\"position:y\", -10)\n" +"print(position) # (42, -10)\n" +"[/codeblock]" +msgstr "" + +#: doc/classes/Object.xml:448 +msgid "" +"Defines whether the object can translate strings (with calls to [method " +"tr]). Enabled by default." +msgstr "" + +#: doc/classes/Object.xml:459 +msgid "" +"Adds or changes a given entry in the object's metadata. Metadata are " +"serialized, and can take any [Variant] value." +msgstr "" + +#: doc/classes/Object.xml:468 +msgid "" +"Assigns a script to the object. Each object can have a single script " +"assigned to it, which are used to extend its functionality.\n" +"If the object already had a script, the previous script instance will be " +"freed and its variables and state will be lost. The new script's [method " +"_init] method will be called." +msgstr "" + +#: doc/classes/Object.xml:476 +msgid "" +"Returns a [String] representing the object. If not overridden, defaults to " +"[code]\"[ClassName:RID]\"[/code].\n" +"Override the method [method _to_string] to customize the [String] " +"representation." +msgstr "" + +#: doc/classes/Object.xml:486 +msgid "" +"Translates a message using translation catalogs configured in the Project " +"Settings.\n" +"Only works if message translation is enabled (which it is by default), " +"otherwise it returns the [code]message[/code] unchanged. See [method " +"set_message_translation]." +msgstr "" + +#: doc/classes/Object.xml:494 +msgid "Emitted whenever the object's script is changed." +msgstr "" + +#: doc/classes/Object.xml:500 +msgid "Called right when the object is initialized. Not available in script." +msgstr "" + +#: doc/classes/Object.xml:503 +msgid "Called before the object is about to be deleted." +msgstr "" + +#: doc/classes/Object.xml:506 +msgid "" +"Connects a signal in deferred mode. This way, signal emissions are stored in " +"a queue, then set on idle time." +msgstr "" + +#: doc/classes/Object.xml:509 +msgid "Persisting connections are saved when the object is serialized to file." +msgstr "" + +#: doc/classes/Object.xml:512 +msgid "One-shot connections disconnect themselves after emission." +msgstr "" + +#: doc/classes/Object.xml:515 +msgid "" +"Connect a signal as reference counted. This means that a given signal can be " +"connected several times to the same target, and will only be fully " +"disconnected once no references are left." +msgstr "" + +#: doc/classes/OccluderPolygon2D.xml:4 +msgid "Defines a 2D polygon for LightOccluder2D." +msgstr "" + +#: doc/classes/OccluderPolygon2D.xml:7 +msgid "" +"Editor facility that helps you draw a 2D polygon used as resource for " +"[LightOccluder2D]." +msgstr "" + +#: doc/classes/OccluderPolygon2D.xml:15 +msgid "" +"If [code]true[/code], closes the polygon. A closed OccluderPolygon2D " +"occludes the light coming from any direction. An opened OccluderPolygon2D " +"occludes the light only at its outline's direction." +msgstr "" + +#: doc/classes/OccluderPolygon2D.xml:18 +msgid "The culling mode to use." +msgstr "" + +#: doc/classes/OccluderPolygon2D.xml:21 +msgid "" +"A [Vector2] array with the index for polygon's vertices positions.\n" +"[b]Note:[/b] The returned value is a copy of the underlying array, rather " +"than a reference." +msgstr "" + +#: doc/classes/OccluderPolygon2D.xml:27 +msgid "Culling is disabled. See [member cull_mode]." +msgstr "" + +#: doc/classes/OccluderPolygon2D.xml:30 +msgid "" +"Culling is performed in the clockwise direction. See [member cull_mode]." +msgstr "" + +#: doc/classes/OccluderPolygon2D.xml:33 +msgid "" +"Culling is performed in the counterclockwise direction. See [member " +"cull_mode]." +msgstr "" + +#: doc/classes/OmniLight3D.xml:4 +msgid "Omnidirectional light, such as a light bulb or a candle." +msgstr "" + +#: doc/classes/OmniLight3D.xml:7 +msgid "" +"An Omnidirectional light is a type of [Light3D] that emits light in all " +"directions. The light is attenuated by distance and this attenuation can be " +"configured by changing its energy, radius, and attenuation parameters." +msgstr "" + +#: doc/classes/OmniLight3D.xml:16 +msgid "" +"The light's attenuation (drop-off) curve. A number of presets are available " +"in the [b]Inspector[/b] by right-clicking the curve." +msgstr "" + +#: doc/classes/OmniLight3D.xml:19 +msgid "The light's radius." +msgstr "" + +#: doc/classes/OmniLight3D.xml:22 +msgid "See [enum ShadowMode]." +msgstr "" + +#: doc/classes/OmniLight3D.xml:27 +msgid "" +"Shadows are rendered to a dual-paraboloid texture. Faster than [constant " +"SHADOW_CUBE], but lower-quality." +msgstr "" + +#: doc/classes/OmniLight3D.xml:30 +msgid "" +"Shadows are rendered to a cubemap. Slower than [constant " +"SHADOW_DUAL_PARABOLOID], but higher-quality." +msgstr "" + +#: modules/opensimplex/doc_classes/OpenSimplexNoise.xml:4 +msgid "Noise generator based on Open Simplex." +msgstr "" + +#: modules/opensimplex/doc_classes/OpenSimplexNoise.xml:7 +msgid "" +"This resource allows you to configure and sample a fractal noise space. Here " +"is a brief usage example that configures an OpenSimplexNoise and gets " +"samples at various positions and dimensions:\n" +"[codeblock]\n" +"var noise = OpenSimplexNoise.new()\n" +"\n" +"# Configure\n" +"noise.seed = randi()\n" +"noise.octaves = 4\n" +"noise.period = 20.0\n" +"noise.persistence = 0.8\n" +"\n" +"# Sample\n" +"print(\"Values:\")\n" +"print(noise.get_noise_2d(1.0, 1.0))\n" +"print(noise.get_noise_3d(0.5, 3.0, 15.0))\n" +"print(noise.get_noise_4d(0.5, 1.9, 4.7, 0.0))\n" +"[/codeblock]" +msgstr "" + +#: modules/opensimplex/doc_classes/OpenSimplexNoise.xml:35 +msgid "" +"Generate a noise image with the requested [code]width[/code] and " +"[code]height[/code], based on the current noise parameters." +msgstr "" + +#: modules/opensimplex/doc_classes/OpenSimplexNoise.xml:44 +msgid "" +"Returns the 1D noise value [code][-1,1][/code] at the given x-coordinate.\n" +"[b]Note:[/b] This method actually returns the 2D noise value [code][-1,1][/" +"code] with fixed y-coordinate value 0.0." +msgstr "" + +#: modules/opensimplex/doc_classes/OpenSimplexNoise.xml:56 +#: modules/opensimplex/doc_classes/OpenSimplexNoise.xml:65 +msgid "Returns the 2D noise value [code][-1,1][/code] at the given position." +msgstr "" + +#: modules/opensimplex/doc_classes/OpenSimplexNoise.xml:78 +#: modules/opensimplex/doc_classes/OpenSimplexNoise.xml:87 +msgid "Returns the 3D noise value [code][-1,1][/code] at the given position." +msgstr "" + +#: modules/opensimplex/doc_classes/OpenSimplexNoise.xml:102 +msgid "Returns the 4D noise value [code][-1,1][/code] at the given position." +msgstr "" + +#: modules/opensimplex/doc_classes/OpenSimplexNoise.xml:111 +msgid "" +"Generate a tileable noise image, based on the current noise parameters. " +"Generated seamless images are always square ([code]size[/code] × [code]size[/" +"code])." +msgstr "" + +#: modules/opensimplex/doc_classes/OpenSimplexNoise.xml:117 +msgid "Difference in period between [member octaves]." +msgstr "" + +#: modules/opensimplex/doc_classes/OpenSimplexNoise.xml:120 +msgid "" +"Number of OpenSimplex noise layers that are sampled to get the fractal " +"noise. Higher values result in more detailed noise but take more time to " +"generate.\n" +"[b]Note:[/b] The maximum allowed value is 9." +msgstr "" + +#: modules/opensimplex/doc_classes/OpenSimplexNoise.xml:124 +msgid "" +"Period of the base octave. A lower period results in a higher-frequency " +"noise (more value changes across the same distance)." +msgstr "" + +#: modules/opensimplex/doc_classes/OpenSimplexNoise.xml:127 +msgid "" +"Contribution factor of the different octaves. A [code]persistence[/code] " +"value of 1 means all the octaves have the same contribution, a value of 0.5 " +"means each octave contributes half as much as the previous one." +msgstr "" + +#: modules/opensimplex/doc_classes/OpenSimplexNoise.xml:130 +msgid "" +"Seed used to generate random values, different seeds will generate different " +"noise maps." +msgstr "" + +#: doc/classes/OptionButton.xml:4 +msgid "Button control that provides selectable options when pressed." +msgstr "" + +#: doc/classes/OptionButton.xml:7 +msgid "" +"OptionButton is a type button that provides a selectable list of items when " +"pressed. The item selected becomes the \"current\" item and is displayed as " +"the button text." +msgstr "" + +#: doc/classes/OptionButton.xml:22 +msgid "" +"Adds an item, with a [code]texture[/code] icon, text [code]label[/code] and " +"(optionally) [code]id[/code]. If no [code]id[/code] is passed, the item " +"index will be used as the item's ID. New items are appended at the end." +msgstr "" + +#: doc/classes/OptionButton.xml:33 +msgid "" +"Adds an item, with text [code]label[/code] and (optionally) [code]id[/code]. " +"If no [code]id[/code] is passed, the item index will be used as the item's " +"ID. New items are appended at the end." +msgstr "" + +#: doc/classes/OptionButton.xml:40 +msgid "" +"Adds a separator to the list of items. Separators help to group items. " +"Separator also takes up an index and is appended at the end." +msgstr "" + +#: doc/classes/OptionButton.xml:47 +msgid "Clears all the items in the [OptionButton]." +msgstr "" + +#: doc/classes/OptionButton.xml:54 +msgid "Returns the amount of items in the OptionButton, including separators." +msgstr "" + +#: doc/classes/OptionButton.xml:63 doc/classes/PopupMenu.xml:267 +msgid "Returns the icon of the item at index [code]idx[/code]." +msgstr "" + +#: doc/classes/OptionButton.xml:72 +msgid "Returns the ID of the item at index [code]idx[/code]." +msgstr "" + +#: doc/classes/OptionButton.xml:81 +msgid "Returns the index of the item with the given [code]id[/code]." +msgstr "" + +#: doc/classes/OptionButton.xml:90 +msgid "" +"Retrieves the metadata of an item. Metadata may be any type and can be used " +"to store extra information about an item, such as an external string ID." +msgstr "" + +#: doc/classes/OptionButton.xml:99 doc/classes/PopupMenu.xml:321 +msgid "Returns the text of the item at index [code]idx[/code]." +msgstr "" + +#: doc/classes/OptionButton.xml:113 +msgid "" +"Returns the ID of the selected item, or [code]0[/code] if no item is " +"selected." +msgstr "" + +#: doc/classes/OptionButton.xml:120 +msgid "" +"Gets the metadata of the selected item. Metadata for items can be set using " +"[method set_item_metadata]." +msgstr "" + +#: doc/classes/OptionButton.xml:129 +msgid "" +"Returns [code]true[/code] if the item at index [code]idx[/code] is disabled." +msgstr "" + +#: doc/classes/OptionButton.xml:138 +msgid "Removes the item at index [code]idx[/code]." +msgstr "" + +#: doc/classes/OptionButton.xml:147 +msgid "" +"Selects an item by index and makes it the current item. This will work even " +"if the item is disabled." +msgstr "" + +#: doc/classes/OptionButton.xml:158 +msgid "" +"Sets whether the item at index [code]idx[/code] is disabled.\n" +"Disabled items are drawn differently in the dropdown and are not selectable " +"by the user. If the current selected item is set as disabled, it will remain " +"selected." +msgstr "" + +#: doc/classes/OptionButton.xml:170 +msgid "Sets the icon of the item at index [code]idx[/code]." +msgstr "" + +#: doc/classes/OptionButton.xml:181 +msgid "Sets the ID of the item at index [code]idx[/code]." +msgstr "" + +#: doc/classes/OptionButton.xml:192 +msgid "" +"Sets the metadata of an item. Metadata may be of any type and can be used to " +"store extra information about an item, such as an external string ID." +msgstr "" + +#: doc/classes/OptionButton.xml:203 doc/classes/PopupMenu.xml:554 +msgid "Sets the text of the item at index [code]idx[/code]." +msgstr "" + +#: doc/classes/OptionButton.xml:211 +msgid "" +"The index of the currently selected item, or [code]-1[/code] if no item is " +"selected." +msgstr "" + +#: doc/classes/OptionButton.xml:220 +msgid "" +"Emitted the when user navigates to an item using the [code]ui_up[/code] or " +"[code]ui_down[/code] actions. The index of the item selected is passed as " +"argument." +msgstr "" + +#: doc/classes/OptionButton.xml:227 +msgid "" +"Emitted when the current item has been changed by the user. The index of the " +"item selected is passed as argument." +msgstr "" + +#: doc/classes/OptionButton.xml:235 +msgid "The arrow icon to be drawn on the right end of the button." +msgstr "" + +#: doc/classes/OptionButton.xml:238 +msgid "" +"The horizontal space between the arrow icon and the right edge of the button." +msgstr "" + +#: doc/classes/OptionButton.xml:241 +msgid "[StyleBox] used when the [OptionButton] is disabled." +msgstr "" + +#: doc/classes/OptionButton.xml:244 +msgid "" +"[StyleBox] used when the [OptionButton] is focused. It is displayed over the " +"current [StyleBox], so using [StyleBoxEmpty] will just disable the focus " +"visual effect." +msgstr "" + +#: doc/classes/OptionButton.xml:247 +msgid "[Font] of the [OptionButton]'s text." +msgstr "" + +#: doc/classes/OptionButton.xml:250 +msgid "Default text [Color] of the [OptionButton]." +msgstr "" + +#: doc/classes/OptionButton.xml:253 +msgid "Text [Color] used when the [OptionButton] is disabled." +msgstr "" + +#: doc/classes/OptionButton.xml:256 +msgid "Text [Color] used when the [OptionButton] is being hovered." +msgstr "" + +#: doc/classes/OptionButton.xml:259 +msgid "Text [Color] used when the [OptionButton] is being pressed." +msgstr "" + +#: doc/classes/OptionButton.xml:262 +msgid "[StyleBox] used when the [OptionButton] is being hovered." +msgstr "" + +#: doc/classes/OptionButton.xml:265 +msgid "The horizontal space between [OptionButton]'s icon and text." +msgstr "" + +#: doc/classes/OptionButton.xml:268 +msgid "Default [StyleBox] for the [OptionButton]." +msgstr "" + +#: doc/classes/OptionButton.xml:271 +msgid "[StyleBox] used when the [OptionButton] is being pressed." +msgstr "" + +#: doc/classes/OS.xml:4 +msgid "Operating System functions." +msgstr "" + +#: doc/classes/OS.xml:7 +msgid "" +"Operating System functions. OS wraps the most common functionality to " +"communicate with the host operating system, such as the clipboard, video " +"driver, date and time, timers, environment variables, execution of binaries, " +"command line, etc." +msgstr "" + +#: doc/classes/OS.xml:16 +msgid "" +"Returns [code]true[/code] if the current host platform is using multiple " +"threads." +msgstr "" + +#: doc/classes/OS.xml:23 +msgid "" +"Shuts down system MIDI driver.\n" +"[b]Note:[/b] This method is implemented on Linux, macOS and Windows." +msgstr "" + +#: doc/classes/OS.xml:33 +msgid "" +"Delay execution of the current thread by [code]msec[/code] milliseconds." +msgstr "" + +#: doc/classes/OS.xml:42 +msgid "" +"Delay execution of the current thread by [code]usec[/code] microseconds." +msgstr "" + +#: doc/classes/OS.xml:51 +msgid "" +"Dumps the memory allocation ringlist to a file (only works in debug).\n" +"Entry format per line: \"Address - Size - Description\"." +msgstr "" + +#: doc/classes/OS.xml:61 +msgid "" +"Dumps all used resources to file (only works in debug).\n" +"Entry format per line: \"Resource Type : Resource Location\".\n" +"At the end of the file is a statistic of all used Resource Types." +msgstr "" + +#: doc/classes/OS.xml:80 +msgid "" +"Execute the file at the given path with the arguments passed as an array of " +"strings. Platform path resolution will take place. The resolved file must " +"exist and be executable.\n" +"The arguments are used in the given order and separated by a space, so " +"[code]OS.execute(\"ping\", [\"-w\", \"3\", \"godotengine.org\"], false)[/" +"code] will resolve to [code]ping -w 3 godotengine.org[/code] in the system's " +"shell.\n" +"This method has slightly different behavior based on whether the " +"[code]blocking[/code] mode is enabled.\n" +"If [code]blocking[/code] is [code]true[/code], the Godot thread will pause " +"its execution while waiting for the process to terminate. The shell output " +"of the process will be written to the [code]output[/code] array as a single " +"string. When the process terminates, the Godot thread will resume " +"execution.\n" +"If [code]blocking[/code] is [code]false[/code], the Godot thread will " +"continue while the new process runs. It is not possible to retrieve the " +"shell output in non-blocking mode, so [code]output[/code] will be empty.\n" +"The return value also depends on the blocking mode. When blocking, the " +"method will return an exit code of the process. When non-blocking, the " +"method returns a process ID, which you can use to monitor the process (and " +"potentially terminate it with [method kill]). If the process forking (non-" +"blocking) or opening (blocking) fails, the method will return [code]-1[/" +"code] or another exit code.\n" +"Example of blocking mode and retrieving the shell output:\n" +"[codeblock]\n" +"var output = []\n" +"var exit_code = OS.execute(\"ls\", [\"-l\", \"/tmp\"], true, output)\n" +"[/codeblock]\n" +"Example of non-blocking mode, running another instance of the project and " +"storing its process ID:\n" +"[codeblock]\n" +"var pid = OS.execute(OS.get_executable_path(), [], false)\n" +"[/codeblock]\n" +"If you wish to access a shell built-in or perform a composite command, a " +"platform-specific shell can be invoked. For example:\n" +"[codeblock]\n" +"OS.execute(\"CMD.exe\", [\"/C\", \"cd %TEMP% && dir\"], true, output)\n" +"[/codeblock]\n" +"[b]Note:[/b] This method is implemented on Android, iOS, Linux, macOS and " +"Windows." +msgstr "" + +#: doc/classes/OS.xml:108 +msgid "Returns the keycode of the given string (e.g. \"Escape\")." +msgstr "" + +#: doc/classes/OS.xml:115 +msgid "Returns the command line arguments passed to the engine." +msgstr "" + +#: doc/classes/OS.xml:122 +msgid "" +"Returns an array of MIDI device names.\n" +"The returned array will be empty if the system MIDI driver has not " +"previously been initialised with [method open_midi_inputs].\n" +"[b]Note:[/b] This method is implemented on Linux, macOS and Windows." +msgstr "" + +#: doc/classes/OS.xml:133 +msgid "" +"Returns current date as a dictionary of keys: [code]year[/code], " +"[code]month[/code], [code]day[/code], [code]weekday[/code], [code]dst[/code] " +"(Daylight Savings Time)." +msgstr "" + +#: doc/classes/OS.xml:142 +msgid "" +"Returns current datetime as a dictionary of keys: [code]year[/code], " +"[code]month[/code], [code]day[/code], [code]weekday[/code], [code]dst[/code] " +"(Daylight Savings Time), [code]hour[/code], [code]minute[/code], " +"[code]second[/code]." +msgstr "" + +#: doc/classes/OS.xml:151 +msgid "" +"Gets a dictionary of time values corresponding to the given UNIX epoch time " +"(in seconds).\n" +"The returned Dictionary's values will be the same as [method get_datetime], " +"with the exception of Daylight Savings Time as it cannot be determined from " +"the epoch." +msgstr "" + +#: doc/classes/OS.xml:161 +msgid "Returns an environment variable." +msgstr "" + +#: doc/classes/OS.xml:168 +msgid "Returns the path to the current engine executable." +msgstr "" + +#: doc/classes/OS.xml:175 +msgid "" +"With this function you can get the list of dangerous permissions that have " +"been granted to the Android application.\n" +"[b]Note:[/b] This method is implemented on Android." +msgstr "" + +#: doc/classes/OS.xml:185 +msgid "" +"Returns the given keycode as a string (e.g. Return values: [code]\"Escape\"[/" +"code], [code]\"Shift+Escape\"[/code]).\n" +"See also [member InputEventKey.keycode] and [method InputEventKey." +"get_keycode_with_modifiers]." +msgstr "" + +#: doc/classes/OS.xml:193 +msgid "Returns the host OS locale." +msgstr "" + +#: doc/classes/OS.xml:200 +msgid "" +"Returns the model name of the current device.\n" +"[b]Note:[/b] This method is implemented on Android and iOS. Returns " +"[code]\"GenericDevice\"[/code] on unsupported platforms." +msgstr "" + +#: doc/classes/OS.xml:208 +msgid "" +"Returns the name of the host OS. Possible values are: [code]\"Android\"[/" +"code], [code]\"Haiku\"[/code], [code]\"iOS\"[/code], [code]\"HTML5\"[/code], " +"[code]\"OSX\"[/code], [code]\"Server\"[/code], [code]\"Windows\"[/code], " +"[code]\"UWP\"[/code], [code]\"X11\"[/code]." +msgstr "" + +#: doc/classes/OS.xml:215 +msgid "" +"Returns the project's process ID.\n" +"[b]Note:[/b] This method is implemented on Android, iOS, Linux, macOS and " +"Windows." +msgstr "" + +#: doc/classes/OS.xml:223 +msgid "Returns the number of threads available on the host machine." +msgstr "" + +#: doc/classes/OS.xml:230 +msgid "" +"Returns the amount of time in milliseconds it took for the boot logo to " +"appear." +msgstr "" + +#: doc/classes/OS.xml:237 +msgid "Returns the maximum amount of static memory used (only works in debug)." +msgstr "" + +#: doc/classes/OS.xml:244 +msgid "Returns the amount of static memory being used by the program in bytes." +msgstr "" + +#: doc/classes/OS.xml:253 +msgid "" +"Returns the actual path to commonly used folders across different platforms. " +"Available locations are specified in [enum SystemDir].\n" +"[b]Note:[/b] This method is implemented on Android, Linux, macOS and Windows." +msgstr "" + +#: doc/classes/OS.xml:261 +msgid "Returns the epoch time of the operating system in milliseconds." +msgstr "" + +#: doc/classes/OS.xml:268 +msgid "Returns the epoch time of the operating system in seconds." +msgstr "" + +#: doc/classes/OS.xml:275 +msgid "" +"Returns the amount of time passed in milliseconds since the engine started." +msgstr "" + +#: doc/classes/OS.xml:282 +msgid "" +"Returns the amount of time passed in microseconds since the engine started." +msgstr "" + +#: doc/classes/OS.xml:291 +msgid "Returns current time as a dictionary of keys: hour, minute, second." +msgstr "" + +#: doc/classes/OS.xml:298 +msgid "" +"Returns the current time zone as a dictionary with the keys: bias and name." +msgstr "" + +#: doc/classes/OS.xml:305 +msgid "" +"Returns a string that is unique to the device.\n" +"[b]Note:[/b] Returns an empty string on HTML5 and UWP, as this method isn't " +"implemented on those platforms yet." +msgstr "" + +#: doc/classes/OS.xml:313 +msgid "Returns the current UNIX epoch timestamp." +msgstr "" + +#: doc/classes/OS.xml:322 +msgid "" +"Gets an epoch time value from a dictionary of time values.\n" +"[code]datetime[/code] must be populated with the following keys: [code]year[/" +"code], [code]month[/code], [code]day[/code], [code]hour[/code], " +"[code]minute[/code], [code]second[/code].\n" +"You can pass the output from [method get_datetime_from_unix_time] directly " +"into this function. Daylight Savings Time ([code]dst[/code]), if present, is " +"ignored." +msgstr "" + +#: doc/classes/OS.xml:331 +msgid "" +"Returns the absolute directory path where user data is written ([code]user://" +"[/code]).\n" +"On Linux, this is [code]~/.local/share/godot/app_userdata/[project_name][/" +"code], or [code]~/.local/share/[custom_name][/code] if " +"[code]use_custom_user_dir[/code] is set.\n" +"On macOS, this is [code]~/Library/Application Support/Godot/app_userdata/" +"[project_name][/code], or [code]~/Library/Application Support/[custom_name][/" +"code] if [code]use_custom_user_dir[/code] is set.\n" +"On Windows, this is [code]%APPDATA%\\Godot\\app_userdata\\[project_name][/" +"code], or [code]%APPDATA%\\[custom_name][/code] if " +"[code]use_custom_user_dir[/code] is set. [code]%APPDATA%[/code] expands to " +"[code]%USERPROFILE%\\AppData\\Roaming[/code].\n" +"If the project name is empty, [code]user://[/code] falls back to [code]res://" +"[/code]." +msgstr "" + +#: doc/classes/OS.xml:344 +msgid "Returns [code]true[/code] if an environment variable exists." +msgstr "" + +#: doc/classes/OS.xml:353 +msgid "" +"Returns [code]true[/code] if the feature for the given feature tag is " +"supported in the currently running instance, depending on platform, build " +"etc. Can be used to check whether you're currently running a debug build, on " +"a certain platform or arch, etc. Refer to the [url=https://docs.godotengine." +"org/en/latest/getting_started/workflow/export/feature_tags.html]Feature " +"Tags[/url] documentation for more details.\n" +"[b]Note:[/b] Tag names are case-sensitive." +msgstr "" + +#: doc/classes/OS.xml:361 +msgid "" +"Returns [code]true[/code] if the Godot binary used to run the project is a " +"[i]debug[/i] export template, or when running in the editor.\n" +"Returns [code]false[/code] if the Godot binary used to run the project is a " +"[i]release[/i] export template.\n" +"To check whether the Godot binary used to run the project is an export " +"template (debug or release), use [code]OS.has_feature(\"standalone\")[/code] " +"instead." +msgstr "" + +#: doc/classes/OS.xml:372 +msgid "" +"Returns [code]true[/code] if the input keycode corresponds to a Unicode " +"character." +msgstr "" + +#: doc/classes/OS.xml:379 +msgid "" +"Returns [code]true[/code] if the engine was executed with [code]-v[/code] " +"(verbose stdout)." +msgstr "" + +#: doc/classes/OS.xml:386 +msgid "" +"If [code]true[/code], the [code]user://[/code] file system is persistent, so " +"that its state is the same after a player quits and starts the game again. " +"Relevant to the HTML5 platform, where this persistence may be unavailable." +msgstr "" + +#: doc/classes/OS.xml:395 +msgid "" +"Kill (terminate) the process identified by the given process ID ([code]pid[/" +"code]), e.g. the one returned by [method execute] in non-blocking mode.\n" +"[b]Note:[/b] This method can also be used to kill processes that were not " +"spawned by the game.\n" +"[b]Note:[/b] This method is implemented on Android, iOS, Linux, macOS and " +"Windows." +msgstr "" + +#: doc/classes/OS.xml:404 +msgid "" +"Initialises the singleton for the system MIDI driver.\n" +"[b]Note:[/b] This method is implemented on Linux, macOS and Windows." +msgstr "" + +#: doc/classes/OS.xml:414 +msgid "" +"Shows all resources in the game. Optionally, the list can be written to a " +"file by specifying a file path in [code]tofile[/code]." +msgstr "" + +#: doc/classes/OS.xml:421 +msgid "Shows the list of loaded textures sorted by size in memory." +msgstr "" + +#: doc/classes/OS.xml:430 +msgid "Shows the number of resources loaded by the game of the given types." +msgstr "" + +#: doc/classes/OS.xml:439 +msgid "Shows all resources currently used by the game." +msgstr "" + +#: doc/classes/OS.xml:448 +msgid "" +"At the moment this function is only used by [code]AudioDriverOpenSL[/code] " +"to request permission for [code]RECORD_AUDIO[/code] on Android." +msgstr "" + +#: doc/classes/OS.xml:455 +msgid "" +"With this function you can request dangerous permissions since normal " +"permissions are automatically granted at install time in Android " +"application.\n" +"[b]Note:[/b] This method is implemented on Android." +msgstr "" + +#: doc/classes/OS.xml:465 +msgid "Sets the name of the current thread." +msgstr "" + +#: doc/classes/OS.xml:474 +msgid "Enables backup saves if [code]enabled[/code] is [code]true[/code]." +msgstr "" + +#: doc/classes/OS.xml:483 +msgid "" +"Requests the OS to open a resource with the most appropriate program. For " +"example:\n" +"- [code]OS.shell_open(\"C:\\\\Users\\name\\Downloads\")[/code] on Windows " +"opens the file explorer at the user's Downloads folder.\n" +"- [code]OS.shell_open(\"https://godotengine.org\")[/code] opens the default " +"web browser on the official Godot website.\n" +"- [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.\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: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 " +"indicates an error. For portability reasons, the exit code should be set " +"between 0 and 125 (inclusive).\n" +"[b]Note:[/b] This value will be ignored if using [method SceneTree.quit] " +"with an [code]exit_code[/code] argument passed." +msgstr "" + +#: 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: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: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:509 +msgid "The Vulkan rendering backend." +msgstr "" + +#: doc/classes/OS.xml:512 +msgid "Sunday." +msgstr "" + +#: doc/classes/OS.xml:515 +msgid "Monday." +msgstr "" + +#: doc/classes/OS.xml:518 +msgid "Tuesday." +msgstr "" + +#: doc/classes/OS.xml:521 +msgid "Wednesday." +msgstr "" + +#: doc/classes/OS.xml:524 +msgid "Thursday." +msgstr "" + +#: doc/classes/OS.xml:527 +msgid "Friday." +msgstr "" + +#: doc/classes/OS.xml:530 +msgid "Saturday." +msgstr "" + +#: doc/classes/OS.xml:533 +msgid "January." +msgstr "" + +#: doc/classes/OS.xml:536 +msgid "February." +msgstr "" + +#: doc/classes/OS.xml:539 +msgid "March." +msgstr "" + +#: doc/classes/OS.xml:542 +msgid "April." +msgstr "" + +#: doc/classes/OS.xml:545 +msgid "May." +msgstr "" + +#: doc/classes/OS.xml:548 +msgid "June." +msgstr "" + +#: doc/classes/OS.xml:551 +msgid "July." +msgstr "" + +#: doc/classes/OS.xml:554 +msgid "August." +msgstr "" + +#: doc/classes/OS.xml:557 +msgid "September." +msgstr "" + +#: doc/classes/OS.xml:560 +msgid "October." +msgstr "" + +#: doc/classes/OS.xml:563 +msgid "November." +msgstr "" + +#: doc/classes/OS.xml:566 +msgid "December." +msgstr "" + +#: doc/classes/OS.xml:569 +msgid "Desktop directory path." +msgstr "" + +#: doc/classes/OS.xml:572 +msgid "DCIM (Digital Camera Images) directory path." +msgstr "" + +#: doc/classes/OS.xml:575 +msgid "Documents directory path." +msgstr "" + +#: doc/classes/OS.xml:578 +msgid "Downloads directory path." +msgstr "" + +#: doc/classes/OS.xml:581 +msgid "Movies directory path." +msgstr "" + +#: doc/classes/OS.xml:584 +msgid "Music directory path." +msgstr "" + +#: doc/classes/OS.xml:587 +msgid "Pictures directory path." +msgstr "" + +#: doc/classes/OS.xml:590 +msgid "Ringtones directory path." +msgstr "" + +#: doc/classes/PackedByteArray.xml:4 +msgid "A packed [Array] of bytes." +msgstr "" + +#: doc/classes/PackedByteArray.xml:7 +msgid "" +"An [Array] specifically designed to hold bytes. Packs data tightly, so it " +"saves memory for large array sizes.\n" +"[b]Note:[/b] This type is passed by value and not by reference." +msgstr "" + +#: doc/classes/PackedByteArray.xml:19 +msgid "" +"Constructs a new [PackedByteArray]. Optionally, you can pass in a generic " +"[Array] that will be converted." +msgstr "" + +#: doc/classes/PackedByteArray.xml:37 +msgid "Appends a [PackedByteArray] at the end of this array." +msgstr "" + +#: doc/classes/PackedByteArray.xml:46 +msgid "" +"Returns a new [PackedByteArray] with the data compressed. Set the " +"compression mode using one of [enum File.CompressionMode]'s constants." +msgstr "" + +#: doc/classes/PackedByteArray.xml:57 +msgid "" +"Returns a new [PackedByteArray] with the data decompressed. Set " +"[code]buffer_size[/code] to the size of the uncompressed data. Set the " +"compression mode using one of [enum File.CompressionMode]'s constants." +msgstr "" + +#: doc/classes/PackedByteArray.xml:71 +msgid "" +"Returns a copy of the array's contents as [String]. Fast alternative to " +"[method get_string_from_utf8] if the content is ASCII-only. Unlike the UTF-8 " +"function this function maps every byte to a character in the array. " +"Multibyte sequences will not be interpreted correctly. For parsing user " +"input always use [method get_string_from_utf8]." +msgstr "" + +#: doc/classes/PackedByteArray.xml:78 +msgid "" +"Returns a copy of the array's contents as [String]. Slower than [method " +"get_string_from_ascii] but supports UTF-8 encoded data. Use this function if " +"you are unsure about the source of the data. For user input this function " +"should always be preferred." +msgstr "" + +#: doc/classes/PackedByteArray.xml:85 +msgid "" +"Returns a hexadecimal representation of this array as a [String].\n" +"[codeblock]\n" +"var array = PackedByteArray([11, 46, 255])\n" +"print(array.hex_encode()) # Prints: 0b2eff\n" +"[/codeblock]" +msgstr "" + +#: doc/classes/PackedByteArray.xml:100 doc/classes/PackedColorArray.xml:55 +#: doc/classes/PackedFloat32Array.xml:56 doc/classes/PackedFloat64Array.xml:56 +#: doc/classes/PackedStringArray.xml:55 doc/classes/PackedVector2Array.xml:55 +#: doc/classes/PackedVector3Array.xml:55 +msgid "" +"Inserts a new element at a given position in the array. The position must be " +"valid, or at the end of the array ([code]idx == size()[/code])." +msgstr "" + +#: doc/classes/PackedByteArray.xml:134 doc/classes/PackedColorArray.xml:89 +#: doc/classes/PackedFloat32Array.xml:90 doc/classes/PackedFloat64Array.xml:90 +#: doc/classes/PackedInt32Array.xml:90 doc/classes/PackedInt64Array.xml:90 +#: doc/classes/PackedStringArray.xml:89 doc/classes/PackedVector2Array.xml:89 +#: doc/classes/PackedVector3Array.xml:89 +msgid "" +"Sets the size of the array. If the array is grown, reserves elements at the " +"end of the array. If the array is shrunk, truncates the array to the new " +"size." +msgstr "" + +#: doc/classes/PackedByteArray.xml:145 +msgid "Changes the byte at the given index." +msgstr "" + +#: doc/classes/PackedByteArray.xml:152 doc/classes/PackedColorArray.xml:107 +#: doc/classes/PackedFloat32Array.xml:108 +#: doc/classes/PackedFloat64Array.xml:108 doc/classes/PackedStringArray.xml:107 +#: doc/classes/PackedVector2Array.xml:107 +#: doc/classes/PackedVector3Array.xml:107 +msgid "Returns the size of the array." +msgstr "" + +#: doc/classes/PackedByteArray.xml:163 +msgid "" +"Returns the slice of the [PackedByteArray] between indices (inclusive) as a " +"new [PackedByteArray]. Any negative index is considered to be from the end " +"of the array." +msgstr "" + +#: doc/classes/PackedColorArray.xml:4 +msgid "A packed [Array] of [Color]s." +msgstr "" + +#: doc/classes/PackedColorArray.xml:7 +msgid "" +"An [Array] specifically designed to hold [Color]. Packs data tightly, so it " +"saves memory for large array sizes.\n" +"[b]Note:[/b] This type is passed by value and not by reference." +msgstr "" + +#: doc/classes/PackedColorArray.xml:19 +msgid "" +"Constructs a new [PackedColorArray]. Optionally, you can pass in a generic " +"[Array] that will be converted." +msgstr "" + +#: doc/classes/PackedColorArray.xml:37 +msgid "Appends a [PackedColorArray] at the end of this array." +msgstr "" + +#: doc/classes/PackedColorArray.xml:71 doc/classes/PackedInt32Array.xml:72 +#: doc/classes/PackedInt64Array.xml:72 +msgid "Appends a value to the array." +msgstr "" + +#: doc/classes/PackedColorArray.xml:100 +msgid "Changes the [Color] at the given index." +msgstr "" + +#: doc/classes/PackedDataContainerRef.xml:4 +msgid "Reference version of [PackedDataContainer]." +msgstr "" + +#: doc/classes/PackedFloat32Array.xml:4 +msgid "A packed [Array] of 32-bit floating-point values." +msgstr "" + +#: doc/classes/PackedFloat32Array.xml:7 +msgid "" +"An [Array] specifically designed to hold 32-bit floating-point values. Packs " +"data tightly, so it saves memory for large array sizes.\n" +"[b]Note:[/b] This type is passed by value and not by reference.\n" +"If you need to pack 64-bit floats tightly, see [PackedFloat64Array]." +msgstr "" + +#: doc/classes/PackedFloat32Array.xml:20 +msgid "" +"Constructs a new [PackedFloat32Array]. Optionally, you can pass in a generic " +"[Array] that will be converted." +msgstr "" + +#: doc/classes/PackedFloat32Array.xml:38 +msgid "Appends a [PackedFloat32Array] at the end of this array." +msgstr "" + +#: doc/classes/PackedFloat32Array.xml:101 +#: doc/classes/PackedFloat64Array.xml:101 +msgid "Changes the float at the given index." +msgstr "" + +#: doc/classes/PackedFloat64Array.xml:4 +msgid "A packed [Array] of 64-bit floating-point values." +msgstr "" + +#: doc/classes/PackedFloat64Array.xml:7 +msgid "" +"An [Array] specifically designed to hold 64-bit floating-point values. Packs " +"data tightly, so it saves memory for large array sizes.\n" +"[b]Note:[/b] This type is passed by value and not by reference.\n" +"If you only need to pack 32-bit floats tightly, see [PackedFloat32Array] for " +"a more memory-friendly alternative." +msgstr "" + +#: doc/classes/PackedFloat64Array.xml:20 +msgid "" +"Constructs a new [PackedFloat64Array]. Optionally, you can pass in a generic " +"[Array] that will be converted." +msgstr "" + +#: doc/classes/PackedFloat64Array.xml:38 +msgid "Appends a [PackedFloat64Array] at the end of this array." +msgstr "" + +#: doc/classes/PackedInt32Array.xml:4 +msgid "A packed [Array] of 32-bit integers." +msgstr "" + +#: doc/classes/PackedInt32Array.xml:7 +msgid "" +"An [Array] specifically designed to hold 32-bit integer values. Packs data " +"tightly, so it saves memory for large array sizes.\n" +"[b]Note:[/b] This type is passed by value and not by reference.\n" +"[b]Note:[/b] This type stores signed 32-bit integers, which means it can " +"take values in the interval [code][-2^31, 2^31 - 1][/code], i.e. [code]" +"[-2147483648, 2147483647][/code]. Exceeding those bounds will wrap around. " +"In comparison, [int] uses signed 64-bit integers which can hold much larger " +"values. If you need to pack 64-bit integers tightly, see [PackedInt64Array]." +msgstr "" + +#: doc/classes/PackedInt32Array.xml:20 +msgid "" +"Constructs a new [PackedInt32Array]. Optionally, you can pass in a generic " +"[Array] that will be converted." +msgstr "" + +#: doc/classes/PackedInt32Array.xml:38 +msgid "Appends a [PackedInt32Array] at the end of this array." +msgstr "" + +#: doc/classes/PackedInt32Array.xml:56 doc/classes/PackedInt64Array.xml:56 +msgid "" +"Inserts a new integer at a given position in the array. The position must be " +"valid, or at the end of the array ([code]idx == size()[/code])." +msgstr "" + +#: doc/classes/PackedInt32Array.xml:101 doc/classes/PackedInt64Array.xml:101 +msgid "Changes the integer at the given index." +msgstr "" + +#: doc/classes/PackedInt32Array.xml:108 doc/classes/PackedInt64Array.xml:108 +msgid "Returns the array size." +msgstr "" + +#: doc/classes/PackedInt64Array.xml:4 +msgid "A packed [Array] of 64-bit integers." +msgstr "" + +#: doc/classes/PackedInt64Array.xml:7 +msgid "" +"An [Array] specifically designed to hold 64-bit integer values. Packs data " +"tightly, so it saves memory for large array sizes.\n" +"[b]Note:[/b] This type is passed by value and not by reference.\n" +"[b]Note:[/b] This type stores signed 64-bit integers, which means it can " +"take values in the interval [code][-2^63, 2^63 - 1][/code], i.e. [code]" +"[-9223372036854775808, 9223372036854775807][/code]. Exceeding those bounds " +"will wrap around. If you only need to pack 32-bit integers tightly, see " +"[PackedInt32Array] for a more memory-friendly alternative." +msgstr "" + +#: doc/classes/PackedInt64Array.xml:20 +msgid "" +"Constructs a new [PackedInt64Array]. Optionally, you can pass in a generic " +"[Array] that will be converted." +msgstr "" + +#: doc/classes/PackedInt64Array.xml:38 +msgid "Appends a [PackedInt64Array] at the end of this array." +msgstr "" + +#: doc/classes/PackedScene.xml:4 +msgid "An abstraction of a serialized scene." +msgstr "" + +#: doc/classes/PackedScene.xml:7 +msgid "" +"A simplified interface to a scene file. Provides access to operations and " +"checks that can be performed on the scene resource itself.\n" +"Can be used to save a node to a file. When saving, the node as well as all " +"the node it owns get saved (see [code]owner[/code] property on [Node]).\n" +"[b]Note:[/b] The node doesn't need to own itself.\n" +"[b]Example of saving a node with different owners:[/b] The following example " +"creates 3 objects: [code]Node2D[/code] ([code]node[/code]), " +"[code]RigidBody2D[/code] ([code]rigid[/code]) and [code]CollisionObject2D[/" +"code] ([code]collision[/code]). [code]collision[/code] is a child of " +"[code]rigid[/code] which is a child of [code]node[/code]. Only [code]rigid[/" +"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" +"var node = Node2D.new()\n" +"var rigid = RigidBody2D.new()\n" +"var collision = CollisionShape2D.new()\n" +"\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" +"rigid.owner = node\n" +"\n" +"var scene = PackedScene.new()\n" +"# Only `node` and `rigid` are now packed.\n" +"var result = scene.pack(node)\n" +"if result == OK:\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:40 +msgid "Returns [code]true[/code] if the scene file has nodes." +msgstr "" + +#: doc/classes/PackedScene.xml:47 +msgid "" +"Returns the [code]SceneState[/code] representing the scene file contents." +msgstr "" + +#: 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:65 +msgid "" +"Pack will ignore any sub-nodes not owned by given node. See [member Node." +"owner]." +msgstr "" + +#: doc/classes/PackedScene.xml:71 +msgid "" +"A dictionary representation of the scene contents.\n" +"Available keys include \"rnames\" and \"variants\" for resources, " +"\"node_count\", \"nodes\", \"node_paths\" for nodes, \"editable_instances\" " +"for base scene children overrides, \"conn_count\" and \"conns\" for signal " +"connections, and \"version\" for the format style of the PackedScene." +msgstr "" + +#: doc/classes/PackedScene.xml:77 +msgid "If passed to [method instance], blocks edits to the scene state." +msgstr "" + +#: 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: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" +"[b]Note:[/b] Only available in editor builds." +msgstr "" + +#: doc/classes/PackedStringArray.xml:4 +msgid "A packed [Array] of [String]s." +msgstr "" + +#: doc/classes/PackedStringArray.xml:7 +msgid "" +"An [Array] specifically designed to hold [String]s. Packs data tightly, so " +"it saves memory for large array sizes.\n" +"[b]Note:[/b] This type is passed by value and not by reference." +msgstr "" + +#: doc/classes/PackedStringArray.xml:19 +msgid "" +"Constructs a new [PackedStringArray]. Optionally, you can pass in a generic " +"[Array] that will be converted." +msgstr "" + +#: doc/classes/PackedStringArray.xml:37 +msgid "Appends a [PackedStringArray] at the end of this array." +msgstr "" + +#: doc/classes/PackedStringArray.xml:71 +msgid "Appends a string element at end of the array." +msgstr "" + +#: doc/classes/PackedStringArray.xml:100 +msgid "Changes the [String] at the given index." +msgstr "" + +#: doc/classes/PackedVector2Array.xml:4 +msgid "A packed [Array] of [Vector2]s." +msgstr "" + +#: doc/classes/PackedVector2Array.xml:7 +msgid "" +"An [Array] specifically designed to hold [Vector2]. Packs data tightly, so " +"it saves memory for large array sizes.\n" +"[b]Note:[/b] This type is passed by value and not by reference." +msgstr "" + +#: doc/classes/PackedVector2Array.xml:19 +msgid "" +"Constructs a new [PackedVector2Array]. Optionally, you can pass in a generic " +"[Array] that will be converted." +msgstr "" + +#: doc/classes/PackedVector2Array.xml:37 +msgid "Appends a [PackedVector2Array] at the end of this array." +msgstr "" + +#: doc/classes/PackedVector2Array.xml:71 +msgid "Inserts a [Vector2] at the end." +msgstr "" + +#: doc/classes/PackedVector2Array.xml:100 +msgid "Changes the [Vector2] at the given index." +msgstr "" + +#: doc/classes/PackedVector3Array.xml:4 +msgid "A packed [Array] of [Vector3]s." +msgstr "" + +#: doc/classes/PackedVector3Array.xml:7 +msgid "" +"An [Array] specifically designed to hold [Vector3]. Packs data tightly, so " +"it saves memory for large array sizes.\n" +"[b]Note:[/b] This type is passed by value and not by reference." +msgstr "" + +#: doc/classes/PackedVector3Array.xml:19 +msgid "" +"Constructs a new [PackedVector3Array]. Optionally, you can pass in a generic " +"[Array] that will be converted." +msgstr "" + +#: doc/classes/PackedVector3Array.xml:37 +msgid "Appends a [PackedVector3Array] at the end of this array." +msgstr "" + +#: doc/classes/PackedVector3Array.xml:71 +msgid "Inserts a [Vector3] at the end." +msgstr "" + +#: doc/classes/PackedVector3Array.xml:100 +msgid "Changes the [Vector3] at the given index." +msgstr "" + +#: doc/classes/PacketPeer.xml:4 +msgid "Abstraction and base class for packet-based protocols." +msgstr "" + +#: doc/classes/PacketPeer.xml:7 +msgid "" +"PacketPeer is an abstraction and base class for packet-based protocols (such " +"as UDP). It provides an API for sending and receiving packets both as raw " +"data or variables. This makes it easy to transfer data over a protocol, " +"without having to encode data as low-level bytes or having to worry about " +"network ordering." +msgstr "" + +#: doc/classes/PacketPeer.xml:16 +msgid "Returns the number of packets currently available in the ring-buffer." +msgstr "" + +#: doc/classes/PacketPeer.xml:23 +msgid "Gets a raw packet." +msgstr "" + +#: doc/classes/PacketPeer.xml:30 +msgid "" +"Returns the error state of the last packet received (via [method get_packet] " +"and [method get_var])." +msgstr "" + +#: doc/classes/PacketPeer.xml:39 +msgid "" +"Gets a Variant. If [code]allow_objects[/code] is [code]true[/code], decoding " +"objects is allowed.\n" +"[b]Warning:[/b] Deserialized objects can contain code which gets executed. " +"Do not use this option if the serialized object comes from untrusted sources " +"to avoid potential security threats such as remote code execution." +msgstr "" + +#: doc/classes/PacketPeer.xml:49 +msgid "Sends a raw packet." +msgstr "" + +#: doc/classes/PacketPeer.xml:60 +msgid "" +"Sends a [Variant] as a packet. If [code]full_objects[/code] is [code]true[/" +"code], encoding objects is allowed (and can potentially include code)." +msgstr "" + +#: doc/classes/PacketPeer.xml:66 +msgid "" +"Maximum buffer size allowed when encoding [Variant]s. Raise this value to " +"support heavier memory allocations.\n" +"The [method put_var] method allocates memory on the stack, and the buffer " +"used will grow automatically to the closest power of two to match the size " +"of the [Variant]. If the [Variant] is bigger than " +"[code]encode_buffer_max_size[/code], the method will error out with " +"[constant ERR_OUT_OF_MEMORY]." +msgstr "" + +#: doc/classes/PacketPeerDTLS.xml:4 +msgid "DTLS packet peer." +msgstr "" + +#: doc/classes/PacketPeerDTLS.xml:7 +msgid "" +"This class represents a DTLS peer connection. It can be used to connect to a " +"DTLS server, and is returned by [method DTLSServer.take_connection]." +msgstr "" + +#: doc/classes/PacketPeerDTLS.xml:24 +msgid "" +"Connects a [code]peer[/code] beginning the DTLS handshake using the " +"underlying [PacketPeerUDP] which must be connected (see [method " +"PacketPeerUDP.connect_to_host]). If [code]validate_certs[/code] is " +"[code]true[/code], [PacketPeerDTLS] will validate that the certificate " +"presented by the remote peer and match it with the [code]for_hostname[/code] " +"argument. You can specify a custom [X509Certificate] to use for validation " +"via the [code]valid_certificate[/code] argument." +msgstr "" + +#: doc/classes/PacketPeerDTLS.xml:31 +msgid "Disconnects this peer, terminating the DTLS session." +msgstr "" + +#: doc/classes/PacketPeerDTLS.xml:38 doc/classes/StreamPeerSSL.xml:55 +msgid "Returns the status of the connection. See [enum Status] for values." +msgstr "" + +#: doc/classes/PacketPeerDTLS.xml:45 +msgid "" +"Poll the connection to check for incoming packets. Call this frequently to " +"update the status and keep the connection working." +msgstr "" + +#: doc/classes/PacketPeerDTLS.xml:51 +msgid "A status representing a [PacketPeerDTLS] that is disconnected." +msgstr "" + +#: doc/classes/PacketPeerDTLS.xml:54 +msgid "" +"A status representing a [PacketPeerDTLS] that is currently performing the " +"handshake with a remote peer." +msgstr "" + +#: doc/classes/PacketPeerDTLS.xml:57 +msgid "" +"A status representing a [PacketPeerDTLS] that is connected to a remote peer." +msgstr "" + +#: doc/classes/PacketPeerDTLS.xml:60 +msgid "A status representing a [PacketPeerDTLS] in a generic error state." +msgstr "" + +#: doc/classes/PacketPeerDTLS.xml:63 +msgid "" +"An error status that shows a mismatch in the DTLS certificate domain " +"presented by the host and the domain requested for validation." +msgstr "" + +#: doc/classes/PacketPeerStream.xml:4 +msgid "Wrapper to use a PacketPeer over a StreamPeer." +msgstr "" + +#: doc/classes/PacketPeerStream.xml:7 +msgid "" +"PacketStreamPeer provides a wrapper for working using packets over a stream. " +"This allows for using packet based code with StreamPeers. PacketPeerStream " +"implements a custom protocol over the StreamPeer, so the user should not " +"read or write to the wrapped StreamPeer directly." +msgstr "" + +#: doc/classes/PacketPeerStream.xml:19 +msgid "The wrapped [StreamPeer] object." +msgstr "" + +#: doc/classes/PacketPeerUDP.xml:4 +msgid "UDP packet peer." +msgstr "" + +#: doc/classes/PacketPeerUDP.xml:7 +msgid "" +"UDP packet peer. Can be used to send raw UDP packets as well as [Variant]s." +msgstr "" + +#: doc/classes/PacketPeerUDP.xml:16 +msgid "Closes the UDP socket the [PacketPeerUDP] is currently listening on." +msgstr "" + +#: doc/classes/PacketPeerUDP.xml:27 +msgid "" +"Calling this method connects this UDP peer to the given [code]host[/code]/" +"[code]port[/code] pair. UDP is in reality connectionless, so this option " +"only means that incoming packets from different addresses are automatically " +"discarded, and that outgoing packets are always sent to the connected " +"address (future calls to [method set_dest_address] are not allowed). This " +"method does not send any data to the remote peer, to do that, use [method " +"PacketPeer.put_var] or [method PacketPeer.put_packet] as usual. See also " +"[UDPServer].\n" +"Note: Connecting to the remote peer does not help to protect from malicious " +"attacks like IP spoofing, etc. Think about using an encryption technique " +"like SSL or DTLS if you feel like your application is transferring sensitive " +"information." +msgstr "" + +#: doc/classes/PacketPeerUDP.xml:35 +msgid "" +"Returns the IP of the remote peer that sent the last packet(that was " +"received with [method PacketPeer.get_packet] or [method PacketPeer.get_var])." +msgstr "" + +#: doc/classes/PacketPeerUDP.xml:42 +msgid "" +"Returns the port of the remote peer that sent the last packet(that was " +"received with [method PacketPeer.get_packet] or [method PacketPeer.get_var])." +msgstr "" + +#: doc/classes/PacketPeerUDP.xml:49 +msgid "" +"Returns [code]true[/code] if the UDP socket is open and has been connected " +"to a remote address. See [method connect_to_host]." +msgstr "" + +#: doc/classes/PacketPeerUDP.xml:56 +msgid "Returns whether this [PacketPeerUDP] is listening." +msgstr "" + +#: doc/classes/PacketPeerUDP.xml:67 +msgid "" +"Joins the multicast group specified by [code]multicast_address[/code] using " +"the interface identified by [code]interface_name[/code].\n" +"You can join the same multicast group with multiple interfaces. Use [method " +"IP.get_local_interfaces] to know which are available.\n" +"Note: Some Android devices might require the " +"[code]CHANGE_WIFI_MULTICAST_STATE[/code] permission for multicast to work." +msgstr "" + +#: doc/classes/PacketPeerUDP.xml:80 +msgid "" +"Removes the interface identified by [code]interface_name[/code] from the " +"multicast group specified by [code]multicast_address[/code]." +msgstr "" + +#: doc/classes/PacketPeerUDP.xml:93 +msgid "" +"Makes this [PacketPeerUDP] listen on the [code]port[/code] binding to " +"[code]bind_address[/code] with a buffer size [code]recv_buf_size[/code].\n" +"If [code]bind_address[/code] is set to [code]\"*\"[/code] (default), the " +"peer will listen on all available addresses (both IPv4 and IPv6).\n" +"If [code]bind_address[/code] is set to [code]\"0.0.0.0\"[/code] (for IPv4) " +"or [code]\"::\"[/code] (for IPv6), the peer will listen on all available " +"addresses matching that IP type.\n" +"If [code]bind_address[/code] is set to any valid address (e.g. " +"[code]\"192.168.1.101\"[/code], [code]\"::1\"[/code], etc), the peer will " +"only listen on the interface with that addresses (or fail if no interface " +"with the given address exists)." +msgstr "" + +#: doc/classes/PacketPeerUDP.xml:105 +msgid "" +"Enable or disable sending of broadcast packets (e.g. " +"[code]set_dest_address(\"255.255.255.255\", 4343)[/code]. This option is " +"disabled by default.\n" +"Note: Some Android devices might require the " +"[code]CHANGE_WIFI_MULTICAST_STATE[/code] permission and this option to be " +"enabled to receive broadcast packets too." +msgstr "" + +#: doc/classes/PacketPeerUDP.xml:117 +msgid "" +"Sets the destination address and port for sending packets and variables. A " +"hostname will be resolved using DNS if needed.\n" +"Note: [method set_broadcast_enabled] must be enabled before sending packets " +"to a broadcast address (e.g. [code]255.255.255.255[/code])." +msgstr "" + +#: doc/classes/PacketPeerUDP.xml:125 +msgid "" +"Waits for a packet to arrive on the listening port. See [method listen]." +msgstr "" + +#: doc/classes/Panel.xml:4 +msgid "Provides an opaque background for [Control] children." +msgstr "" + +#: doc/classes/Panel.xml:7 +msgid "" +"Panel is a [Control] that displays an opaque background. It's commonly used " +"as a parent and container for other types of [Control] nodes." +msgstr "" + +#: doc/classes/Panel.xml:25 +msgid "The style of this [Panel]." +msgstr "" + +#: doc/classes/PanelContainer.xml:4 +msgid "Panel container type." +msgstr "" + +#: doc/classes/PanelContainer.xml:7 +msgid "" +"Panel container type. This container fits controls inside of the delimited " +"area of a stylebox. It's useful for giving controls an outline." +msgstr "" + +#: doc/classes/PanelContainer.xml:20 +msgid "The style of [PanelContainer]'s background." +msgstr "" + +#: doc/classes/PanoramaSkyMaterial.xml:4 +msgid "A [Material] used with [Sky] to draw a background texture." +msgstr "" + +#: doc/classes/PanoramaSkyMaterial.xml:7 +msgid "" +"A resource referenced in a [Sky] that is used to draw a background. The " +"Panorama sky material functions similar to skyboxes in other engines, except " +"it uses an equirectangular sky map instead of a cube map.\n" +"Using an HDR panorama is strongly recommended for accurate, high-quality " +"reflections. Godot supports the Radiance HDR ([code].hdr[/code]) and OpenEXR " +"([code].exr[/code]) image formats for this purpose.\n" +"You can use [url=https://danilw.github.io/GLSL-howto/cubemap_to_panorama_js/" +"cubemap_to_panorama.html]this tool[/url] to convert a cube map to an " +"equirectangular sky map." +msgstr "" + +#: doc/classes/PanoramaSkyMaterial.xml:17 +msgid "[Texture2D] to be applied to the [PanoramaSkyMaterial]." +msgstr "" + +#: doc/classes/ParallaxBackground.xml:4 +msgid "A node used to create a parallax scrolling background." +msgstr "" + +#: doc/classes/ParallaxBackground.xml:7 +msgid "" +"A ParallaxBackground uses one or more [ParallaxLayer] child nodes to create " +"a parallax effect. Each [ParallaxLayer] can move at a different speed using " +"[member ParallaxLayer.motion_offset]. This creates an illusion of depth in a " +"2D game. If not used with a [Camera2D], you must manually calculate the " +"[member scroll_offset]." +msgstr "" + +#: doc/classes/ParallaxBackground.xml:16 +msgid "The base position offset for all [ParallaxLayer] children." +msgstr "" + +#: doc/classes/ParallaxBackground.xml:19 +msgid "The base motion scale for all [ParallaxLayer] children." +msgstr "" + +#: doc/classes/ParallaxBackground.xml:22 +msgid "" +"If [code]true[/code], elements in [ParallaxLayer] child aren't affected by " +"the zoom level of the camera." +msgstr "" + +#: doc/classes/ParallaxBackground.xml:25 +msgid "" +"Top-left limits for scrolling to begin. If the camera is outside of this " +"limit, the background will stop scrolling. Must be lower than [member " +"scroll_limit_end] to work." +msgstr "" + +#: doc/classes/ParallaxBackground.xml:28 +msgid "" +"Bottom-right limits for scrolling to end. If the camera is outside of this " +"limit, the background will stop scrolling. Must be higher than [member " +"scroll_limit_begin] to work." +msgstr "" + +#: doc/classes/ParallaxBackground.xml:31 +msgid "" +"The ParallaxBackground's scroll value. Calculated automatically when using a " +"[Camera2D], but can be used to manually manage scrolling when no camera is " +"present." +msgstr "" + +#: doc/classes/ParallaxLayer.xml:4 +msgid "A parallax scrolling layer to be used with [ParallaxBackground]." +msgstr "" + +#: doc/classes/ParallaxLayer.xml:7 +msgid "" +"A ParallaxLayer must be the child of a [ParallaxBackground] node. Each " +"ParallaxLayer can be set to move at different speeds relative to the camera " +"movement or the [member ParallaxBackground.scroll_offset] value.\n" +"This node's children will be affected by its scroll offset.\n" +"[b]Note:[/b] Any changes to this node's position and scale made after it " +"enters the scene will be ignored." +msgstr "" + +#: doc/classes/ParallaxLayer.xml:17 +msgid "" +"The ParallaxLayer's [Texture2D] mirroring. Useful for creating an infinite " +"scrolling background. If an axis is set to [code]0[/code], the [Texture2D] " +"will not be mirrored." +msgstr "" + +#: doc/classes/ParallaxLayer.xml:20 +msgid "" +"The ParallaxLayer's offset relative to the parent ParallaxBackground's " +"[member ParallaxBackground.scroll_offset]." +msgstr "" + +#: doc/classes/ParallaxLayer.xml:23 +msgid "" +"Multiplies the ParallaxLayer's motion. If an axis is set to [code]0[/code], " +"it will not scroll." +msgstr "" + +#: doc/classes/ParticlesMaterial.xml:4 +msgid "Particle properties for [GPUParticles3D] and [GPUParticles2D] nodes." +msgstr "" + +#: doc/classes/ParticlesMaterial.xml:7 +msgid "" +"ParticlesMaterial defines particle properties and behavior. It is used in " +"the [code]process_material[/code] of [GPUParticles3D] and [GPUParticles2D] " +"emitter nodes.\n" +"Some of this material's properties are applied to each particle when " +"emitted, while others can have a [CurveTexture] applied to vary values over " +"the lifetime of the particle.\n" +"When a randomness ratio is applied to a property it is used to scale that " +"property by a random amount. The random ratio is used to interpolate between " +"[code]1.0[/code] and a random number less than one, the result is multiplied " +"by the property to obtain the randomized property. For example a random " +"ratio of [code]0.4[/code] would scale the original property between " +"[code]0.4-1.0[/code] of its original value." +msgstr "" + +#: doc/classes/ParticlesMaterial.xml:20 +msgid "Returns [code]true[/code] if the specified flag is enabled." +msgstr "" + +#: doc/classes/ParticlesMaterial.xml:38 +msgid "Returns the randomness ratio associated with the specified parameter." +msgstr "" + +#: doc/classes/ParticlesMaterial.xml:47 +msgid "Returns the [Texture2D] used by the specified parameter." +msgstr "" + +#: doc/classes/ParticlesMaterial.xml:58 +msgid "" +"If [code]true[/code], enables the specified flag. See [enum Flags] for " +"options." +msgstr "" + +#: doc/classes/ParticlesMaterial.xml:69 +msgid "Sets the specified [enum Parameter]." +msgstr "" + +#: doc/classes/ParticlesMaterial.xml:80 +msgid "Sets the randomness ratio for the specified [enum Parameter]." +msgstr "" + +#: doc/classes/ParticlesMaterial.xml:91 +msgid "Sets the [Texture2D] for the specified [enum Parameter]." +msgstr "" + +#: doc/classes/ParticlesMaterial.xml:97 +msgid "" +"Initial rotation applied to each particle, in degrees.\n" +"Only applied when [member flag_disable_z] or [member flag_rotate_y] are " +"[code]true[/code] or the [BaseMaterial3D] being used to draw the particle is " +"using [constant BaseMaterial3D.BILLBOARD_PARTICLES]." +msgstr "" + +#: doc/classes/ParticlesMaterial.xml:101 +msgid "Each particle's rotation will be animated along this [CurveTexture]." +msgstr "" + +#: doc/classes/ParticlesMaterial.xml:107 +msgid "" +"Initial angular velocity applied to each particle. Sets the speed of " +"rotation of the particle.\n" +"Only applied when [member flag_disable_z] or [member flag_rotate_y] are " +"[code]true[/code] or the [BaseMaterial3D] being used to draw the particle is " +"using [constant BaseMaterial3D.BILLBOARD_PARTICLES]." +msgstr "" + +#: doc/classes/ParticlesMaterial.xml:111 +msgid "Each particle's angular velocity will vary along this [CurveTexture]." +msgstr "" + +#: doc/classes/ParticlesMaterial.xml:120 +msgid "Each particle's animation offset will vary along this [CurveTexture]." +msgstr "" + +#: doc/classes/ParticlesMaterial.xml:129 +msgid "Each particle's animation speed will vary along this [CurveTexture]." +msgstr "" + +#: doc/classes/ParticlesMaterial.xml:135 +msgid "" +"Each particle's initial color. If the [GPUParticles2D]'s [code]texture[/" +"code] is defined, it will be multiplied by this color. To have particle " +"display color in a [BaseMaterial3D] make sure to set [member BaseMaterial3D." +"vertex_color_use_as_albedo] to [code]true[/code]." +msgstr "" + +#: doc/classes/ParticlesMaterial.xml:138 +msgid "Each particle's color will vary along this [GradientTexture]." +msgstr "" + +#: doc/classes/ParticlesMaterial.xml:144 +msgid "Damping will vary along this [CurveTexture]." +msgstr "" + +#: doc/classes/ParticlesMaterial.xml:153 +msgid "" +"The box's extents if [code]emission_shape[/code] is set to [constant " +"EMISSION_SHAPE_BOX]." +msgstr "" + +#: doc/classes/ParticlesMaterial.xml:156 +msgid "" +"Particle color will be modulated by color determined by sampling this " +"texture at the same point as the [member emission_point_texture]." +msgstr "" + +#: doc/classes/ParticlesMaterial.xml:159 +msgid "" +"Particle velocity and rotation will be set by sampling this texture at the " +"same point as the [member emission_point_texture]. Used only in [constant " +"EMISSION_SHAPE_DIRECTED_POINTS]. Can be created automatically from mesh or " +"node by selecting \"Create Emission Points from Mesh/Node\" under the " +"\"Particles\" tool in the toolbar." +msgstr "" + +#: doc/classes/ParticlesMaterial.xml:162 +msgid "" +"The number of emission points if [code]emission_shape[/code] is set to " +"[constant EMISSION_SHAPE_POINTS] or [constant " +"EMISSION_SHAPE_DIRECTED_POINTS]." +msgstr "" + +#: doc/classes/ParticlesMaterial.xml:165 +msgid "" +"Particles will be emitted at positions determined by sampling this texture " +"at a random position. Used with [constant EMISSION_SHAPE_POINTS] and " +"[constant EMISSION_SHAPE_DIRECTED_POINTS]. Can be created automatically from " +"mesh or node by selecting \"Create Emission Points from Mesh/Node\" under " +"the \"Particles\" tool in the toolbar." +msgstr "" + +#: doc/classes/ParticlesMaterial.xml:168 +msgid "" +"Particles will be emitted inside this region. Use [enum EmissionShape] " +"constants for values." +msgstr "" + +#: doc/classes/ParticlesMaterial.xml:171 +msgid "" +"The sphere's radius if [code]emission_shape[/code] is set to [constant " +"EMISSION_SHAPE_SPHERE]." +msgstr "" + +#: doc/classes/ParticlesMaterial.xml:192 +msgid "Each particle's hue will vary along this [CurveTexture]." +msgstr "" + +#: doc/classes/ParticlesMaterial.xml:210 +msgid "" +"Each particle's linear acceleration will vary along this [CurveTexture]." +msgstr "" + +#: doc/classes/ParticlesMaterial.xml:216 +msgid "" +"Orbital velocity applied to each particle. Makes the particles circle around " +"origin. Specified in number of full rotations around origin per second.\n" +"Only available when [member flag_disable_z] is [code]true[/code]." +msgstr "" + +#: doc/classes/ParticlesMaterial.xml:220 +msgid "Each particle's orbital velocity will vary along this [CurveTexture]." +msgstr "" + +#: doc/classes/ParticlesMaterial.xml:229 +msgid "" +"Each particle's radial acceleration will vary along this [CurveTexture]." +msgstr "" + +#: doc/classes/ParticlesMaterial.xml:238 +msgid "Each particle's scale will vary along this [CurveTexture]." +msgstr "" + +#: doc/classes/ParticlesMaterial.xml:250 +msgid "" +"Each particle's tangential acceleration will vary along this [CurveTexture]." +msgstr "" + +#: doc/classes/ParticlesMaterial.xml:256 +msgid "Trail particles' color will vary along this [GradientTexture]." +msgstr "" + +#: doc/classes/ParticlesMaterial.xml:259 +msgid "" +"Emitter will emit [code]amount[/code] divided by [code]trail_divisor[/code] " +"particles. The remaining particles will be used as trail(s)." +msgstr "" + +#: doc/classes/ParticlesMaterial.xml:262 +msgid "Trail particles' size will vary along this [CurveTexture]." +msgstr "" + +#: doc/classes/ParticlesMaterial.xml:267 +msgid "" +"Use with [method set_param], [method set_param_randomness], and [method " +"set_param_texture] to set initial velocity properties." +msgstr "" + +#: doc/classes/ParticlesMaterial.xml:270 +msgid "" +"Use with [method set_param], [method set_param_randomness], and [method " +"set_param_texture] to set angular velocity properties." +msgstr "" + +#: doc/classes/ParticlesMaterial.xml:273 +msgid "" +"Use with [method set_param], [method set_param_randomness], and [method " +"set_param_texture] to set orbital velocity properties." +msgstr "" + +#: doc/classes/ParticlesMaterial.xml:276 +msgid "" +"Use with [method set_param], [method set_param_randomness], and [method " +"set_param_texture] to set linear acceleration properties." +msgstr "" + +#: doc/classes/ParticlesMaterial.xml:279 +msgid "" +"Use with [method set_param], [method set_param_randomness], and [method " +"set_param_texture] to set radial acceleration properties." +msgstr "" + +#: doc/classes/ParticlesMaterial.xml:282 +msgid "" +"Use with [method set_param], [method set_param_randomness], and [method " +"set_param_texture] to set tangential acceleration properties." +msgstr "" + +#: doc/classes/ParticlesMaterial.xml:285 +msgid "" +"Use with [method set_param], [method set_param_randomness], and [method " +"set_param_texture] to set damping properties." +msgstr "" + +#: doc/classes/ParticlesMaterial.xml:288 +msgid "" +"Use with [method set_param], [method set_param_randomness], and [method " +"set_param_texture] to set angle properties." +msgstr "" + +#: doc/classes/ParticlesMaterial.xml:291 +msgid "" +"Use with [method set_param], [method set_param_randomness], and [method " +"set_param_texture] to set scale properties." +msgstr "" + +#: doc/classes/ParticlesMaterial.xml:294 +msgid "" +"Use with [method set_param], [method set_param_randomness], and [method " +"set_param_texture] to set hue variation properties." +msgstr "" + +#: doc/classes/ParticlesMaterial.xml:297 +msgid "" +"Use with [method set_param], [method set_param_randomness], and [method " +"set_param_texture] to set animation speed properties." +msgstr "" + +#: doc/classes/ParticlesMaterial.xml:300 +msgid "" +"Use with [method set_param], [method set_param_randomness], and [method " +"set_param_texture] to set animation offset properties." +msgstr "" + +#: doc/classes/ParticlesMaterial.xml:306 +msgid "Use with [method set_flag] to set [member flag_align_y]." +msgstr "" + +#: doc/classes/ParticlesMaterial.xml:309 +msgid "Use with [method set_flag] to set [member flag_rotate_y]." +msgstr "" + +#: doc/classes/ParticlesMaterial.xml:312 +msgid "Use with [method set_flag] to set [member flag_disable_z]." +msgstr "" + +#: doc/classes/ParticlesMaterial.xml:327 +msgid "" +"Particles will be emitted at a position determined by sampling a random " +"point on the [member emission_point_texture]. Particle color will be " +"modulated by [member emission_color_texture]." +msgstr "" + +#: doc/classes/ParticlesMaterial.xml:330 +msgid "" +"Particles will be emitted at a position determined by sampling a random " +"point on the [member emission_point_texture]. Particle velocity and rotation " +"will be set based on [member emission_normal_texture]. Particle color will " +"be modulated by [member emission_color_texture]." +msgstr "" + +#: doc/classes/Path2D.xml:4 +msgid "Contains a [Curve2D] path for [PathFollow2D] nodes to follow." +msgstr "" + +#: doc/classes/Path2D.xml:7 +msgid "" +"Can have [PathFollow2D] child nodes moving along the [Curve2D]. See " +"[PathFollow2D] for more information on usage.\n" +"[b]Note:[/b] The path is considered as relative to the moved nodes (children " +"of [PathFollow2D]). As such, the curve should usually start with a zero " +"vector ([code](0, 0)[/code])." +msgstr "" + +#: doc/classes/Path2D.xml:16 +msgid "A [Curve2D] describing the path." +msgstr "" + +#: doc/classes/Path3D.xml:4 +msgid "Contains a [Curve3D] path for [PathFollow3D] nodes to follow." +msgstr "" + +#: doc/classes/Path3D.xml:7 +msgid "" +"Can have [PathFollow3D] child nodes moving along the [Curve3D]. See " +"[PathFollow3D] for more information on the usage.\n" +"Note that the path is considered as relative to the moved nodes (children of " +"[PathFollow3D]). As such, the curve should usually start with a zero vector " +"[code](0, 0, 0)[/code]." +msgstr "" + +#: doc/classes/Path3D.xml:16 +msgid "A [Curve3D] describing the path." +msgstr "" + +#: doc/classes/Path3D.xml:22 +msgid "Emitted when the [member curve] changes." +msgstr "" + +#: doc/classes/PathFollow2D.xml:4 +msgid "Point sampler for a [Path2D]." +msgstr "" + +#: doc/classes/PathFollow2D.xml:7 +msgid "" +"This node takes its parent [Path2D], and returns the coordinates of a point " +"within it, given a distance from the first vertex.\n" +"It is useful for making other nodes follow a path, without coding the " +"movement pattern. For that, the nodes must be children of this node. The " +"descendant nodes will then move accordingly when setting an offset in this " +"node." +msgstr "" + +#: doc/classes/PathFollow2D.xml:16 +msgid "" +"If [code]true[/code], the position between two cached points is interpolated " +"cubically, and linearly otherwise.\n" +"The points along the [Curve2D] of the [Path2D] are precomputed before use, " +"for faster calculations. The point at the requested offset is then " +"calculated interpolating between two adjacent cached points. This may " +"present a problem if the curve makes sharp turns, as the cached points may " +"not follow the curve closely enough.\n" +"There are two answers to this problem: either increase the number of cached " +"points and increase memory consumption, or make a cubic interpolation " +"between two points at the cost of (slightly) slower calculations." +msgstr "" + +#: doc/classes/PathFollow2D.xml:21 doc/classes/PathFollow3D.xml:21 +msgid "The node's offset along the curve." +msgstr "" + +#: doc/classes/PathFollow2D.xml:24 +msgid "" +"How far to look ahead of the curve to calculate the tangent if the node is " +"rotating. E.g. shorter lookaheads will lead to faster rotations." +msgstr "" + +#: doc/classes/PathFollow2D.xml:27 doc/classes/PathFollow3D.xml:24 +msgid "" +"If [code]true[/code], any offset outside the path's length will wrap around, " +"instead of stopping at the ends. Use it for cyclic paths." +msgstr "" + +#: doc/classes/PathFollow2D.xml:30 +msgid "The distance along the path in pixels." +msgstr "" + +#: doc/classes/PathFollow2D.xml:33 +msgid "" +"If [code]true[/code], this node rotates to follow the path, making its " +"descendants rotate." +msgstr "" + +#: doc/classes/PathFollow2D.xml:36 +msgid "" +"The distance along the path as a number in the range 0.0 (for the first " +"vertex) to 1.0 (for the last). This is just another way of expressing the " +"offset within the path, as the offset supplied is multiplied internally by " +"the path's length." +msgstr "" + +#: doc/classes/PathFollow2D.xml:39 doc/classes/PathFollow3D.xml:36 +msgid "The node's offset perpendicular to the curve." +msgstr "" + +#: doc/classes/PathFollow3D.xml:4 +msgid "Point sampler for a [Path3D]." +msgstr "" + +#: doc/classes/PathFollow3D.xml:7 +msgid "" +"This node takes its parent [Path3D], and returns the coordinates of a point " +"within it, given a distance from the first vertex.\n" +"It is useful for making other nodes follow a path, without coding the " +"movement pattern. For that, the nodes must be children of this node. The " +"descendant nodes will then move accordingly when setting an offset in this " +"node." +msgstr "" + +#: doc/classes/PathFollow3D.xml:16 +msgid "" +"If [code]true[/code], the position between two cached points is interpolated " +"cubically, and linearly otherwise.\n" +"The points along the [Curve3D] of the [Path3D] are precomputed before use, " +"for faster calculations. The point at the requested offset is then " +"calculated interpolating between two adjacent cached points. This may " +"present a problem if the curve makes sharp turns, as the cached points may " +"not follow the curve closely enough.\n" +"There are two answers to this problem: either increase the number of cached " +"points and increase memory consumption, or make a cubic interpolation " +"between two points at the cost of (slightly) slower calculations." +msgstr "" + +#: doc/classes/PathFollow3D.xml:27 +msgid "" +"The distance from the first vertex, measured in 3D units along the path. " +"This sets this node's position to a point within the path." +msgstr "" + +#: doc/classes/PathFollow3D.xml:30 +msgid "" +"Allows or forbids rotation on one or more axes, depending on the [enum " +"RotationMode] constants being used." +msgstr "" + +#: doc/classes/PathFollow3D.xml:33 +msgid "" +"The distance from the first vertex, considering 0.0 as the first vertex and " +"1.0 as the last. This is just another way of expressing the offset within " +"the path, as the offset supplied is multiplied internally by the path's " +"length." +msgstr "" + +#: doc/classes/PathFollow3D.xml:41 +msgid "Forbids the PathFollow3D to rotate." +msgstr "" + +#: doc/classes/PathFollow3D.xml:44 +msgid "Allows the PathFollow3D to rotate in the Y axis only." +msgstr "" + +#: doc/classes/PathFollow3D.xml:47 +msgid "Allows the PathFollow3D to rotate in both the X, and Y axes." +msgstr "" + +#: doc/classes/PathFollow3D.xml:50 +msgid "Allows the PathFollow3D to rotate in any axis." +msgstr "" + +#: doc/classes/PathFollow3D.xml:53 +msgid "" +"Uses the up vector information in a [Curve3D] to enforce orientation. This " +"rotation mode requires the [Path3D]'s [member Curve3D.up_vector_enabled] " +"property to be set to [code]true[/code]." +msgstr "" + +#: doc/classes/PCKPacker.xml:4 +msgid "Creates packages that can be loaded into a running project." +msgstr "" + +#: doc/classes/PCKPacker.xml:7 +msgid "" +"The [PCKPacker] is used to create packages that can be loaded into a running " +"project using [method ProjectSettings.load_resource_pack].\n" +"[codeblock]\n" +"var packer = PCKPacker.new()\n" +"packer.pck_start(\"test.pck\")\n" +"packer.add_file(\"res://text.txt\", \"text.txt\")\n" +"packer.flush()\n" +"[/codeblock]\n" +"The above [PCKPacker] creates package [code]test.pck[/code], then adds a " +"file named [code]text.txt[/code] at the root of the package." +msgstr "" + +#: doc/classes/PCKPacker.xml:27 +msgid "" +"Adds the [code]source_path[/code] file to the current PCK package at the " +"[code]pck_path[/code] internal path (should start with [code]res://[/code])." +msgstr "" + +#: doc/classes/PCKPacker.xml:36 +msgid "" +"Writes the files specified using all [method add_file] calls since the last " +"flush. If [code]verbose[/code] is [code]true[/code], a list of files added " +"will be printed to the console for easier debugging." +msgstr "" + +#: doc/classes/PCKPacker.xml:47 +msgid "" +"Creates a new PCK file with the name [code]pck_name[/code]. The [code].pck[/" +"code] file extension isn't added automatically, so it should be part of " +"[code]pck_name[/code] (even though it's not required)." +msgstr "" + +#: doc/classes/Performance.xml:4 +msgid "Exposes performance-related data." +msgstr "" + +#: doc/classes/Performance.xml:7 +msgid "" +"This class provides access to a number of different monitors related to " +"performance, such as memory usage, draw calls, and FPS. These are the same " +"as the values displayed in the [b]Monitor[/b] tab in the editor's " +"[b]Debugger[/b] panel. By using the [method get_monitor] method of this " +"class, you can access this data from your code.\n" +"[b]Note:[/b] A few of these monitors are only available in debug mode and " +"will always return 0 when used in a release build.\n" +"[b]Note:[/b] Many of these monitors are not updated in real-time, so there " +"may be a short delay between changes." +msgstr "" + +#: doc/classes/Performance.xml:20 +msgid "" +"Returns the value of one of the available monitors. You should provide one " +"of the [enum Monitor] constants as the argument, like this:\n" +"[codeblock]\n" +"print(Performance.get_monitor(Performance.TIME_FPS)) # Prints the FPS to the " +"console\n" +"[/codeblock]" +msgstr "" + +#: doc/classes/Performance.xml:29 +msgid "Number of frames per second." +msgstr "" + +#: doc/classes/Performance.xml:32 +msgid "Time it took to complete one frame, in seconds." +msgstr "" + +#: doc/classes/Performance.xml:35 +msgid "Time it took to complete one physics frame, in seconds." +msgstr "" + +#: doc/classes/Performance.xml:38 +msgid "" +"Static memory currently used, in bytes. Not available in release builds." +msgstr "" + +#: doc/classes/Performance.xml:41 +msgid "Available static memory. Not available in release builds." +msgstr "" + +#: doc/classes/Performance.xml:44 +msgid "" +"Largest amount of memory the message queue buffer has used, in bytes. The " +"message queue is used for deferred functions calls and notifications." +msgstr "" + +#: doc/classes/Performance.xml:47 +msgid "Number of objects currently instanced (including nodes)." +msgstr "" + +#: doc/classes/Performance.xml:50 +msgid "Number of resources currently used." +msgstr "" + +#: doc/classes/Performance.xml:53 +msgid "" +"Number of nodes currently instanced in the scene tree. This also includes " +"the root node." +msgstr "" + +#: doc/classes/Performance.xml:56 +msgid "" +"Number of orphan nodes, i.e. nodes which are not parented to a node of the " +"scene tree." +msgstr "" + +#: doc/classes/Performance.xml:59 +msgid "3D objects drawn per frame." +msgstr "" + +#: doc/classes/Performance.xml:62 +msgid "Vertices drawn per frame. 3D only." +msgstr "" + +#: doc/classes/Performance.xml:65 +msgid "Material changes per frame. 3D only." +msgstr "" + +#: doc/classes/Performance.xml:68 +msgid "Shader changes per frame. 3D only." +msgstr "" + +#: doc/classes/Performance.xml:71 +msgid "Render surface changes per frame. 3D only." +msgstr "" + +#: doc/classes/Performance.xml:74 +msgid "Draw calls per frame. 3D only." +msgstr "" + +#: 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:3925 +msgid "The amount of texture memory used." +msgstr "" + +#: 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:3919 +msgid "Unimplemented in the GLES2 rendering backend, always returns 0." +msgstr "" + +#: doc/classes/Performance.xml:89 +msgid "Number of active [RigidBody2D] nodes in the game." +msgstr "" + +#: doc/classes/Performance.xml:92 +msgid "Number of collision pairs in the 2D physics engine." +msgstr "" + +#: doc/classes/Performance.xml:95 +msgid "Number of islands in the 2D physics engine." +msgstr "" + +#: doc/classes/Performance.xml:98 +msgid "Number of active [RigidBody3D] and [VehicleBody3D] nodes in the game." +msgstr "" + +#: doc/classes/Performance.xml:101 +msgid "Number of collision pairs in the 3D physics engine." +msgstr "" + +#: doc/classes/Performance.xml:104 +msgid "Number of islands in the 3D physics engine." +msgstr "" + +#: doc/classes/Performance.xml:107 +msgid "Output latency of the [AudioServer]." +msgstr "" + +#: doc/classes/Performance.xml:110 +msgid "Represents the size of the [enum Monitor] enum." +msgstr "" + +#: doc/classes/PHashTranslation.xml:4 +msgid "Optimized translation." +msgstr "" + +#: doc/classes/PHashTranslation.xml:7 +msgid "" +"Optimized translation. Uses real-time compressed translations, which results " +"in very small dictionaries." +msgstr "" + +#: doc/classes/PHashTranslation.xml:18 +msgid "" +"Generates and sets an optimized translation from the given [Translation] " +"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 "" + +#: doc/classes/PhysicalSkyMaterial.xml:7 +msgid "" +"The [PhysicalSkyMaterial] uses the Preetham analytic daylight model to draw " +"a sky based on physical properties. This results in a substantially more " +"realistic sky than the [ProceduralSkyMaterial], but it is slightly slower " +"and less flexible.\n" +"The [PhysicalSkyMaterial] only supports one sun. The color, energy, and " +"direction of the sun are taken from the first [DirectionalLight3D] in the " +"scene tree.\n" +"As it is based on a daylight model, the sky fades to black as the sunset " +"ends. If you want a full day/night cycle, you will have to add a night sky " +"by converting this to a [ShaderMaterial] and adding a night sky directly " +"into the resulting shader." +msgstr "" + +#: doc/classes/PhysicalSkyMaterial.xml:17 +msgid "" +"Sets the amount of dithering to use. Dithering helps reduce banding that " +"appears from the smooth changes in color in the sky. Use the lowest value " +"possible, higher amounts may add fuzziness to the sky." +msgstr "" + +#: doc/classes/PhysicalSkyMaterial.xml:20 +msgid "" +"Sets the exposure of the sky. Higher exposure values make the entire sky " +"brighter." +msgstr "" + +#: doc/classes/PhysicalSkyMaterial.xml:23 +msgid "" +"Modulates the [Color] on the bottom half of the sky to represent the ground." +msgstr "" + +#: doc/classes/PhysicalSkyMaterial.xml:26 +msgid "" +"Controls the strength of mie scattering for the sky. Mie scattering results " +"from light colliding with larger particles (like water). On earth, mie " +"scattering results in a whiteish color around the sun and horizon." +msgstr "" + +#: doc/classes/PhysicalSkyMaterial.xml:29 +msgid "" +"Controls the [Color] of the mie scattering effect. While not physically " +"accurate, this allows for the creation of alien looking planets." +msgstr "" + +#: doc/classes/PhysicalSkyMaterial.xml:32 +msgid "" +"Controls the direction of the mie scattering. A value of [code]1[/code] " +"means that when light hits a particle it passing through straight forward. A " +"value of [code]-1[/code] means that all light is scatter backwards." +msgstr "" + +#: doc/classes/PhysicalSkyMaterial.xml:35 +msgid "" +"Controls the strength of the rayleigh scattering. Rayleigh scattering " +"results from light colliding with small particles. It is responsible for the " +"blue color of the sky." +msgstr "" + +#: doc/classes/PhysicalSkyMaterial.xml:38 +msgid "" +"Controls the [Color] of the rayleigh scattering. While not physically " +"accurate, this allows for the creation of alien looking planets. For " +"example, setting this to a red [Color] results in a mars looking atmosphere " +"with a corresponding blue sunset." +msgstr "" + +#: doc/classes/PhysicalSkyMaterial.xml:41 +msgid "" +"Sets the size of the sun disk. Default value is based on Sol's perceived " +"size from Earth." +msgstr "" + +#: doc/classes/PhysicalSkyMaterial.xml:44 +msgid "" +"Sets the thickness of the atmosphere. High turbidity creates a foggy looking " +"atmosphere, while a low turbidity results in a clearer atmosphere." +msgstr "" + +#: doc/classes/PhysicsBody2D.xml:4 +msgid "Base class for all objects affected by physics in 2D space." +msgstr "" + +#: doc/classes/PhysicsBody2D.xml:7 +msgid "" +"PhysicsBody2D is an abstract base class for implementing a physics body. All " +"*Body2D types inherit from it." +msgstr "" + +#: doc/classes/PhysicsBody2D.xml:19 doc/classes/PhysicsBody3D.xml:19 +#: doc/classes/SoftBody3D.xml:19 +msgid "Adds a body to the list of bodies that this body can't collide with." +msgstr "" + +#: doc/classes/PhysicsBody2D.xml:26 doc/classes/PhysicsBody3D.xml:26 +#: doc/classes/SoftBody3D.xml:26 +msgid "" +"Returns an array of nodes that were added as collision exceptions for this " +"body." +msgstr "" + +#: doc/classes/PhysicsBody2D.xml:53 doc/classes/PhysicsBody3D.xml:53 +#: doc/classes/SoftBody3D.xml:53 +msgid "" +"Removes a body from the list of bodies that this body can't collide with." +msgstr "" + +#: doc/classes/PhysicsBody2D.xml:64 doc/classes/PhysicsBody3D.xml:64 +msgid "" +"Sets individual bits on the [member collision_layer] bitmask. Use this if " +"you only need to change one layer's value." +msgstr "" + +#: doc/classes/PhysicsBody2D.xml:75 doc/classes/PhysicsBody3D.xml:75 +msgid "" +"Sets individual bits on the [member collision_mask] bitmask. Use this if you " +"only need to change one layer's value." +msgstr "" + +#: doc/classes/PhysicsBody2D.xml:81 doc/classes/PhysicsBody3D.xml:81 +msgid "" +"The physics layers this area is in.\n" +"Collidable objects can exist in any of 32 different layers. These layers " +"work like a tagging system, and are not visual. A collidable can use these " +"layers to select with which objects it can collide, using the [member " +"collision_mask] property.\n" +"A contact is detected if object A is in any of the layers that object B " +"scans, or object B is in any layer scanned by object A." +msgstr "" + +#: doc/classes/PhysicsBody2D.xml:86 doc/classes/PhysicsBody3D.xml:86 +msgid "The physics layers this area scans for collisions." +msgstr "" + +#: doc/classes/PhysicsBody2D.xml:90 +msgid "" +"Both [member collision_layer] and [member collision_mask]. Returns [member " +"collision_layer] when accessed. Updates [member collision_layer] and [member " +"collision_mask] when modified." +msgstr "" + +#: doc/classes/PhysicsBody3D.xml:4 +msgid "Base class for all objects affected by physics in 3D space." +msgstr "" + +#: doc/classes/PhysicsBody3D.xml:7 +msgid "" +"PhysicsBody3D is an abstract base class for implementing a physics body. All " +"*Body types inherit from it." +msgstr "" + +#: doc/classes/PhysicsDirectBodyState2D.xml:4 +msgid "Direct access object to a physics body in the [PhysicsServer2D]." +msgstr "" + +#: doc/classes/PhysicsDirectBodyState2D.xml:7 +msgid "" +"Provides direct access to a physics body in the [PhysicsServer2D], allowing " +"safe changes to physics properties. This object is passed via the direct " +"state callback of rigid/character bodies, and is intended for changing the " +"direct state of that body. See [method RigidBody2D._integrate_forces]." +msgstr "" + +#: doc/classes/PhysicsDirectBodyState2D.xml:10 +#: doc/classes/PhysicsDirectSpaceState2D.xml:10 +#: doc/classes/PhysicsDirectSpaceState3D.xml:10 doc/classes/RayCast2D.xml:14 +#: doc/classes/RayCast3D.xml:14 doc/classes/World2D.xml:10 +#: doc/classes/World3D.xml:10 +msgid "" +"https://docs.godotengine.org/en/latest/tutorials/physics/ray-casting.html" +msgstr "" + +#: doc/classes/PhysicsDirectBodyState2D.xml:19 doc/classes/RigidBody2D.xml:31 +msgid "Adds a constant directional force without affecting rotation." +msgstr "" + +#: doc/classes/PhysicsDirectBodyState2D.xml:30 +#: doc/classes/PhysicsDirectBodyState3D.xml:30 doc/classes/RigidBody2D.xml:42 +msgid "" +"Adds a positioned force to the body. Both the force and the offset from the " +"body origin are in global coordinates." +msgstr "" + +#: doc/classes/PhysicsDirectBodyState2D.xml:39 doc/classes/RigidBody2D.xml:51 +msgid "Adds a constant rotational force." +msgstr "" + +#: doc/classes/PhysicsDirectBodyState2D.xml:48 doc/classes/RigidBody2D.xml:60 +msgid "Applies a directional impulse without affecting rotation." +msgstr "" + +#: doc/classes/PhysicsDirectBodyState2D.xml:59 +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. " +"For this reason, it should only be used when simulating one-time impacts " +"(use the \"_force\" functions otherwise). The offset uses the rotation of " +"the global coordinate system, but is centered at the object's origin." +msgstr "" + +#: doc/classes/PhysicsDirectBodyState2D.xml:68 doc/classes/RigidBody2D.xml:80 +msgid "Applies a rotational impulse to the body." +msgstr "" + +#: doc/classes/PhysicsDirectBodyState2D.xml:77 +#: doc/classes/PhysicsDirectBodyState3D.xml:78 +msgid "Returns the collider's [RID]." +msgstr "" + +#: doc/classes/PhysicsDirectBodyState2D.xml:86 +#: doc/classes/PhysicsDirectBodyState3D.xml:87 +msgid "Returns the collider's object id." +msgstr "" + +#: doc/classes/PhysicsDirectBodyState2D.xml:95 +msgid "" +"Returns the collider object. This depends on how it was created (will return " +"a scene node if such was used to create it)." +msgstr "" + +#: doc/classes/PhysicsDirectBodyState2D.xml:104 +#: doc/classes/PhysicsDirectBodyState3D.xml:105 +msgid "Returns the contact position in the collider." +msgstr "" + +#: doc/classes/PhysicsDirectBodyState2D.xml:113 +#: doc/classes/PhysicsDirectBodyState3D.xml:114 +msgid "Returns the collider's shape index." +msgstr "" + +#: doc/classes/PhysicsDirectBodyState2D.xml:122 +msgid "" +"Returns the collided shape's metadata. This metadata is different from " +"[method Object.get_meta], and is set with [method PhysicsServer2D." +"shape_set_data]." +msgstr "" + +#: doc/classes/PhysicsDirectBodyState2D.xml:131 +#: doc/classes/PhysicsDirectBodyState3D.xml:123 +msgid "Returns the linear velocity vector at the collider's contact point." +msgstr "" + +#: doc/classes/PhysicsDirectBodyState2D.xml:138 +msgid "" +"Returns the number of contacts this body has with other bodies.\n" +"[b]Note:[/b] By default, this returns 0 unless bodies are configured to " +"monitor contacts. See [member RigidBody2D.contact_monitor]." +msgstr "" + +#: doc/classes/PhysicsDirectBodyState2D.xml:148 +#: doc/classes/PhysicsDirectBodyState3D.xml:149 +msgid "Returns the local normal at the contact point." +msgstr "" + +#: doc/classes/PhysicsDirectBodyState2D.xml:157 +#: doc/classes/PhysicsDirectBodyState3D.xml:158 +msgid "Returns the local position of the contact point." +msgstr "" + +#: doc/classes/PhysicsDirectBodyState2D.xml:166 +#: doc/classes/PhysicsDirectBodyState3D.xml:167 +msgid "Returns the local shape index of the collision." +msgstr "" + +#: doc/classes/PhysicsDirectBodyState2D.xml:173 +#: doc/classes/PhysicsDirectBodyState3D.xml:174 +msgid "Returns the current state of the space, useful for queries." +msgstr "" + +#: doc/classes/PhysicsDirectBodyState2D.xml:180 +#: doc/classes/PhysicsDirectBodyState3D.xml:181 +msgid "Calls the built-in force integration code." +msgstr "" + +#: doc/classes/PhysicsDirectBodyState2D.xml:186 +#: doc/classes/PhysicsDirectBodyState3D.xml:187 doc/classes/RigidBody2D.xml:121 +msgid "The body's rotational velocity." +msgstr "" + +#: doc/classes/PhysicsDirectBodyState2D.xml:189 +#: doc/classes/PhysicsDirectBodyState3D.xml:192 +msgid "The inverse of the inertia of the body." +msgstr "" + +#: doc/classes/PhysicsDirectBodyState2D.xml:192 +#: doc/classes/PhysicsDirectBodyState3D.xml:195 +msgid "The inverse of the mass of the body." +msgstr "" + +#: doc/classes/PhysicsDirectBodyState2D.xml:195 +#: doc/classes/PhysicsDirectBodyState3D.xml:198 doc/classes/RigidBody2D.xml:155 +msgid "The body's linear velocity." +msgstr "" + +#: doc/classes/PhysicsDirectBodyState2D.xml:198 +#: doc/classes/PhysicsDirectBodyState3D.xml:203 +msgid "If [code]true[/code], this body is currently sleeping (not active)." +msgstr "" + +#: doc/classes/PhysicsDirectBodyState2D.xml:201 +#: doc/classes/PhysicsDirectBodyState3D.xml:206 +msgid "The timestep (delta) used for the simulation." +msgstr "" + +#: doc/classes/PhysicsDirectBodyState2D.xml:204 +#: doc/classes/PhysicsDirectBodyState3D.xml:209 +msgid "" +"The rate at which the body stops rotating, if there are not any other forces " +"moving it." +msgstr "" + +#: doc/classes/PhysicsDirectBodyState2D.xml:207 +#: doc/classes/PhysicsDirectBodyState3D.xml:212 +msgid "The total gravity vector being currently applied to this body." +msgstr "" + +#: doc/classes/PhysicsDirectBodyState2D.xml:210 +#: doc/classes/PhysicsDirectBodyState3D.xml:215 +msgid "" +"The rate at which the body stops moving, if there are not any other forces " +"moving it." +msgstr "" + +#: doc/classes/PhysicsDirectBodyState2D.xml:213 +#: doc/classes/PhysicsDirectBodyState3D.xml:218 +msgid "The body's transformation matrix." +msgstr "" + +#: doc/classes/PhysicsDirectBodyState3D.xml:4 +msgid "Direct access object to a physics body in the [PhysicsServer3D]." +msgstr "" + +#: doc/classes/PhysicsDirectBodyState3D.xml:7 +msgid "" +"Provides direct access to a physics body in the [PhysicsServer3D], allowing " +"safe changes to physics properties. This object is passed via the direct " +"state callback of rigid/character bodies, and is intended for changing the " +"direct state of that body. See [method RigidBody3D._integrate_forces]." +msgstr "" + +#: 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]." +msgstr "" + +#: doc/classes/PhysicsDirectBodyState3D.xml:39 +msgid "Adds a constant rotational force without affecting position." +msgstr "" + +#: doc/classes/PhysicsDirectBodyState3D.xml:48 +msgid "" +"Applies a single directional impulse without affecting rotation.\n" +"This is equivalent to [code]apply_impulse(Vector3(0, 0, 0), impulse)[/code]." +msgstr "" + +#: doc/classes/PhysicsDirectBodyState3D.xml:60 +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. " +"For this reason it should only be used when simulating one-time impacts. The " +"position uses the rotation of the global coordinate system, but is centered " +"at the object's origin." +msgstr "" + +#: doc/classes/PhysicsDirectBodyState3D.xml:69 +msgid "" +"Apply a torque impulse (which will be affected by the body mass and shape). " +"This will rotate the body around the vector [code]j[/code] passed as " +"parameter." +msgstr "" + +#: doc/classes/PhysicsDirectBodyState3D.xml:96 +msgid "Returns the collider object." +msgstr "" + +#: doc/classes/PhysicsDirectBodyState3D.xml:130 +msgid "" +"Returns the number of contacts this body has with other bodies.\n" +"[b]Note:[/b] By default, this returns 0 unless bodies are configured to " +"monitor contacts. See [member RigidBody3D.contact_monitor]." +msgstr "" + +#: doc/classes/PhysicsDirectBodyState3D.xml:140 +msgid "Impulse created by the contact. Only implemented for Bullet physics." +msgstr "" + +#: doc/classes/PhysicsDirectSpaceState2D.xml:4 +msgid "Direct access object to a space in the [PhysicsServer2D]." +msgstr "" + +#: doc/classes/PhysicsDirectSpaceState2D.xml:7 +msgid "" +"Direct access object to a space in the [PhysicsServer2D]. It's used mainly " +"to do queries against objects and areas residing in a given space." +msgstr "" + +#: doc/classes/PhysicsDirectSpaceState2D.xml:19 +msgid "" +"Checks how far the shape can travel toward a point. If the shape can not " +"move, the array will be empty.\n" +"[b]Note:[/b] Both the shape and the motion are supplied through a " +"[PhysicsShapeQueryParameters2D] object. The method will return an array with " +"two floats between 0 and 1, both representing a fraction of [code]motion[/" +"code]. The first is how far the shape can move without triggering a " +"collision, and the second is the point at which a collision will occur. If " +"no collision is detected, the returned array will be [code][1, 1][/code]." +msgstr "" + +#: doc/classes/PhysicsDirectSpaceState2D.xml:31 +msgid "" +"Checks the intersections of a shape, given through a " +"[PhysicsShapeQueryParameters2D] object, against the space. The resulting " +"array contains a list of points where the shape intersects another. Like " +"with [method intersect_shape], the number of returned results can be limited " +"to save processing time." +msgstr "" + +#: doc/classes/PhysicsDirectSpaceState2D.xml:40 +msgid "" +"Checks the intersections of a shape, given through a " +"[PhysicsShapeQueryParameters2D] object, against the space. If it collides " +"with more than one shape, the nearest one is selected. If the shape did not " +"intersect anything, then an empty dictionary is returned instead.\n" +"[b]Note:[/b] This method does not take into account the [code]motion[/code] " +"property of the object. The returned object is a dictionary containing the " +"following fields:\n" +"[code]collider_id[/code]: The colliding object's ID.\n" +"[code]linear_velocity[/code]: The colliding object's velocity [Vector2]. If " +"the object is an [Area2D], the result is [code](0, 0)[/code].\n" +"[code]metadata[/code]: The intersecting shape's metadata. This metadata is " +"different from [method Object.get_meta], and is set with [method " +"PhysicsServer2D.shape_set_data].\n" +"[code]normal[/code]: The object's surface normal at the intersection point.\n" +"[code]point[/code]: The intersection point.\n" +"[code]rid[/code]: The intersecting object's [RID].\n" +"[code]shape[/code]: The shape index of the colliding shape." +msgstr "" + +#: doc/classes/PhysicsDirectSpaceState2D.xml:67 +msgid "" +"Checks whether a point is inside any shape. The shapes the point is inside " +"of are returned in an array containing dictionaries with the following " +"fields:\n" +"[code]collider[/code]: The colliding object.\n" +"[code]collider_id[/code]: The colliding object's ID.\n" +"[code]metadata[/code]: The intersecting shape's metadata. This metadata is " +"different from [method Object.get_meta], and is set with [method " +"PhysicsServer2D.shape_set_data].\n" +"[code]rid[/code]: The intersecting object's [RID].\n" +"[code]shape[/code]: The shape index of the colliding shape.\n" +"Additionally, the method can take an [code]exclude[/code] array of objects " +"or [RID]s that are to be excluded from collisions, a [code]collision_mask[/" +"code] bitmask representing the physics layers to check in, or booleans to " +"determine if the ray should collide with [PhysicsBody2D]s or [Area2D]s, " +"respectively." +msgstr "" + +#: doc/classes/PhysicsDirectSpaceState2D.xml:112 +msgid "" +"Intersects a ray in a given space. The returned object is a dictionary with " +"the following fields:\n" +"[code]collider[/code]: The colliding object.\n" +"[code]collider_id[/code]: The colliding object's ID.\n" +"[code]metadata[/code]: The intersecting shape's metadata. This metadata is " +"different from [method Object.get_meta], and is set with [method " +"PhysicsServer2D.shape_set_data].\n" +"[code]normal[/code]: The object's surface normal at the intersection point.\n" +"[code]position[/code]: The intersection point.\n" +"[code]rid[/code]: The intersecting object's [RID].\n" +"[code]shape[/code]: The shape index of the colliding shape.\n" +"If the ray did not intersect anything, then an empty dictionary is returned " +"instead.\n" +"Additionally, the method can take an [code]exclude[/code] array of objects " +"or [RID]s that are to be excluded from collisions, a [code]collision_mask[/" +"code] bitmask representing the physics layers to check in, or booleans to " +"determine if the ray should collide with [PhysicsBody2D]s or [Area2D]s, " +"respectively." +msgstr "" + +#: doc/classes/PhysicsDirectSpaceState2D.xml:132 +msgid "" +"Checks the intersections of a shape, given through a " +"[PhysicsShapeQueryParameters2D] object, against the space.\n" +"[b]Note:[/b] This method does not take into account the [code]motion[/code] " +"property of the object. The intersected shapes are returned in an array " +"containing dictionaries with the following fields:\n" +"[code]collider[/code]: The colliding object.\n" +"[code]collider_id[/code]: The colliding object's ID.\n" +"[code]metadata[/code]: The intersecting shape's metadata. This metadata is " +"different from [method Object.get_meta], and is set with [method " +"PhysicsServer2D.shape_set_data].\n" +"[code]rid[/code]: The intersecting object's [RID].\n" +"[code]shape[/code]: The shape index of the colliding shape.\n" +"The number of intersections can be limited with the [code]max_results[/code] " +"parameter, to reduce the processing time." +msgstr "" + +#: doc/classes/PhysicsDirectSpaceState3D.xml:4 +msgid "Direct access object to a space in the [PhysicsServer3D]." +msgstr "" + +#: doc/classes/PhysicsDirectSpaceState3D.xml:7 +msgid "" +"Direct access object to a space in the [PhysicsServer3D]. It's used mainly " +"to do queries against objects and areas residing in a given space." +msgstr "" + +#: doc/classes/PhysicsDirectSpaceState3D.xml:21 +msgid "" +"Checks whether the shape can travel to a point. The method will return an " +"array with two floats between 0 and 1, both representing a fraction of " +"[code]motion[/code]. The first is how far the shape can move without " +"triggering a collision, and the second is the point at which a collision " +"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 GodotPhysics3D." +msgstr "" + +#: doc/classes/PhysicsDirectSpaceState3D.xml:33 +msgid "" +"Checks the intersections of a shape, given through a " +"[PhysicsShapeQueryParameters3D] object, against the space. The resulting " +"array contains a list of points where the shape intersects another. Like " +"with [method intersect_shape], the number of returned results can be limited " +"to save processing time." +msgstr "" + +#: doc/classes/PhysicsDirectSpaceState3D.xml:42 +msgid "" +"Checks the intersections of a shape, given through a " +"[PhysicsShapeQueryParameters3D] object, against the space. If it collides " +"with more than one shape, the nearest one is selected. The returned object " +"is a dictionary containing the following fields:\n" +"[code]collider_id[/code]: The colliding object's ID.\n" +"[code]linear_velocity[/code]: The colliding object's velocity [Vector3]. If " +"the object is an [Area3D], the result is [code](0, 0, 0)[/code].\n" +"[code]normal[/code]: The object's surface normal at the intersection point.\n" +"[code]point[/code]: The intersection point.\n" +"[code]rid[/code]: The intersecting object's [RID].\n" +"[code]shape[/code]: The shape index of the colliding shape.\n" +"If the shape did not intersect anything, then an empty dictionary is " +"returned instead." +msgstr "" + +#: doc/classes/PhysicsDirectSpaceState3D.xml:68 +msgid "" +"Intersects a ray in a given space. The returned object is a dictionary with " +"the following fields:\n" +"[code]collider[/code]: The colliding object.\n" +"[code]collider_id[/code]: The colliding object's ID.\n" +"[code]normal[/code]: The object's surface normal at the intersection point.\n" +"[code]position[/code]: The intersection point.\n" +"[code]rid[/code]: The intersecting object's [RID].\n" +"[code]shape[/code]: The shape index of the colliding shape.\n" +"If the ray did not intersect anything, then an empty dictionary is returned " +"instead.\n" +"Additionally, the method can take an [code]exclude[/code] array of objects " +"or [RID]s that are to be excluded from collisions, a [code]collision_mask[/" +"code] bitmask representing the physics layers to check in, or booleans to " +"determine if the ray should collide with [PhysicsBody3D]s or [Area3D]s, " +"respectively." +msgstr "" + +#: doc/classes/PhysicsDirectSpaceState3D.xml:87 +msgid "" +"Checks the intersections of a shape, given through a " +"[PhysicsShapeQueryParameters3D] object, against the space. The intersected " +"shapes are returned in an array containing dictionaries with the following " +"fields:\n" +"[code]collider[/code]: The colliding object.\n" +"[code]collider_id[/code]: The colliding object's ID.\n" +"[code]rid[/code]: The intersecting object's [RID].\n" +"[code]shape[/code]: The shape index of the colliding shape.\n" +"The number of intersections can be limited with the [code]max_results[/code] " +"parameter, to reduce the processing time." +msgstr "" + +#: doc/classes/PhysicsMaterial.xml:4 +msgid "A material for physics properties." +msgstr "" + +#: doc/classes/PhysicsMaterial.xml:7 +msgid "" +"Provides a means of modifying the collision properties of a [PhysicsBody3D]." +msgstr "" + +#: doc/classes/PhysicsMaterial.xml:20 +msgid "" +"The body's friction. Values range from [code]0[/code] (frictionless) to " +"[code]1[/code] (maximum friction)." +msgstr "" + +#: doc/classes/PhysicsServer2D.xml:4 +msgid "Server interface for low-level 2D physics access." +msgstr "" + +#: doc/classes/PhysicsServer2D.xml:7 +msgid "" +"PhysicsServer2D is the server responsible for all 2D physics. It can create " +"many kinds of physics objects, but does not insert them on the node tree." +msgstr "" + +#: doc/classes/PhysicsServer2D.xml:24 doc/classes/PhysicsServer3D.xml:24 +msgid "" +"Adds a shape to the area, along with a transform matrix. Shapes are usually " +"referenced by their index, so you should track which shape has a given index." +msgstr "" + +#: doc/classes/PhysicsServer2D.xml:45 doc/classes/PhysicsServer2D.xml:418 +#: doc/classes/PhysicsServer3D.xml:35 doc/classes/PhysicsServer3D.xml:409 +msgid "" +"Assigns the area to a descendant of [Object], so it can exist in the node " +"tree." +msgstr "" + +#: doc/classes/PhysicsServer2D.xml:54 doc/classes/PhysicsServer3D.xml:44 +msgid "" +"Removes all shapes from an area. It does not delete the shapes, so they can " +"be reassigned later." +msgstr "" + +#: doc/classes/PhysicsServer2D.xml:61 +msgid "Creates an [Area2D]." +msgstr "" + +#: doc/classes/PhysicsServer2D.xml:78 doc/classes/PhysicsServer2D.xml:505 +#: doc/classes/PhysicsServer3D.xml:60 doc/classes/PhysicsServer3D.xml:492 +msgid "Gets the instance ID of the object the area is assigned to." +msgstr "" + +#: doc/classes/PhysicsServer2D.xml:89 +msgid "" +"Returns an area parameter value. See [enum AreaParameter] for a list of " +"available parameters." +msgstr "" + +#: doc/classes/PhysicsServer2D.xml:100 doc/classes/PhysicsServer3D.xml:82 +msgid "Returns the [RID] of the nth shape of an area." +msgstr "" + +#: doc/classes/PhysicsServer2D.xml:109 doc/classes/PhysicsServer3D.xml:91 +msgid "Returns the number of shapes assigned to an area." +msgstr "" + +#: doc/classes/PhysicsServer2D.xml:120 doc/classes/PhysicsServer3D.xml:102 +msgid "Returns the transform matrix of a shape within an area." +msgstr "" + +#: doc/classes/PhysicsServer2D.xml:129 doc/classes/PhysicsServer3D.xml:111 +msgid "Returns the space assigned to the area." +msgstr "" + +#: doc/classes/PhysicsServer2D.xml:138 doc/classes/PhysicsServer3D.xml:120 +msgid "Returns the space override mode for the area." +msgstr "" + +#: doc/classes/PhysicsServer2D.xml:147 doc/classes/PhysicsServer3D.xml:129 +msgid "Returns the transform matrix for an area." +msgstr "" + +#: doc/classes/PhysicsServer2D.xml:158 doc/classes/PhysicsServer3D.xml:149 +msgid "" +"Removes a shape from an area. It does not delete the shape, so it can be " +"reassigned later." +msgstr "" + +#: doc/classes/PhysicsServer2D.xml:181 doc/classes/PhysicsServer3D.xml:172 +msgid "Assigns the area to one or many physics layers." +msgstr "" + +#: doc/classes/PhysicsServer2D.xml:192 doc/classes/PhysicsServer3D.xml:183 +msgid "Sets which physics layers the area will monitor." +msgstr "" + +#: doc/classes/PhysicsServer2D.xml:205 doc/classes/PhysicsServer3D.xml:196 +msgid "" +"Sets the function to call when any body/area enters or exits the area. This " +"callback will be called for any object interacting with the area, and takes " +"five parameters:\n" +"1: [constant AREA_BODY_ADDED] or [constant AREA_BODY_REMOVED], depending on " +"whether the object entered or exited the area.\n" +"2: [RID] of the object that entered/exited the area.\n" +"3: Instance ID of the object that entered/exited the area.\n" +"4: The shape index of the object that entered/exited the area.\n" +"5: The shape index of the area where the object entered/exited." +msgstr "" + +#: doc/classes/PhysicsServer2D.xml:233 +msgid "" +"Sets the value for an area parameter. See [enum AreaParameter] for a list of " +"available parameters." +msgstr "" + +#: doc/classes/PhysicsServer2D.xml:246 doc/classes/PhysicsServer3D.xml:248 +msgid "" +"Substitutes a given area shape by another. The old shape is selected by its " +"index, the new one by its [RID]." +msgstr "" + +#: doc/classes/PhysicsServer2D.xml:259 +msgid "Disables a given shape in an area." +msgstr "" + +#: doc/classes/PhysicsServer2D.xml:272 doc/classes/PhysicsServer3D.xml:273 +msgid "Sets the transform matrix for an area shape." +msgstr "" + +#: doc/classes/PhysicsServer2D.xml:283 doc/classes/PhysicsServer3D.xml:284 +msgid "Assigns a space to the area." +msgstr "" + +#: doc/classes/PhysicsServer2D.xml:294 +msgid "" +"Sets the space override mode for the area. See [enum AreaSpaceOverrideMode] " +"for a list of available modes." +msgstr "" + +#: doc/classes/PhysicsServer2D.xml:305 doc/classes/PhysicsServer3D.xml:306 +msgid "Sets the transform matrix for an area." +msgstr "" + +#: doc/classes/PhysicsServer2D.xml:326 doc/classes/PhysicsServer3D.xml:327 +msgid "Adds a body to the list of bodies exempt from collisions." +msgstr "" + +#: doc/classes/PhysicsServer2D.xml:339 +msgid "" +"Adds a positioned force to the applied force and torque. As with [method " +"body_apply_impulse], both the force and the offset from the body origin are " +"in global coordinates. A force differs from an impulse in that, while the " +"two are forces, the impulse clears itself after being applied." +msgstr "" + +#: doc/classes/PhysicsServer2D.xml:354 doc/classes/PhysicsServer3D.xml:354 +msgid "" +"Adds a shape to the body, along with a transform matrix. Shapes are usually " +"referenced by their index, so you should track which shape has a given index." +msgstr "" + +#: doc/classes/PhysicsServer2D.xml:387 +msgid "" +"Adds a positioned impulse to the applied force and torque. Both the force " +"and the offset from the body origin are in global coordinates." +msgstr "" + +#: doc/classes/PhysicsServer2D.xml:427 doc/classes/PhysicsServer3D.xml:418 +msgid "Removes all shapes from a body." +msgstr "" + +#: doc/classes/PhysicsServer2D.xml:434 +msgid "Creates a physics body." +msgstr "" + +#: doc/classes/PhysicsServer2D.xml:451 doc/classes/PhysicsServer3D.xml:438 +msgid "Returns the physics layer or layers a body belongs to." +msgstr "" + +#: doc/classes/PhysicsServer2D.xml:460 +msgid "Returns the physics layer or layers a body can collide with." +msgstr "" + +#: doc/classes/PhysicsServer2D.xml:469 +msgid "Returns the continuous collision detection mode." +msgstr "" + +#: doc/classes/PhysicsServer2D.xml:478 +msgid "Returns the [PhysicsDirectBodyState2D] of the body." +msgstr "" + +#: doc/classes/PhysicsServer2D.xml:487 doc/classes/PhysicsServer3D.xml:474 +msgid "" +"Returns the maximum contacts that can be reported. See [method " +"body_set_max_contacts_reported]." +msgstr "" + +#: doc/classes/PhysicsServer2D.xml:496 doc/classes/PhysicsServer3D.xml:483 +msgid "Returns the body mode." +msgstr "" + +#: doc/classes/PhysicsServer2D.xml:516 +msgid "" +"Returns the value of a body parameter. See [enum BodyParameter] for a list " +"of available parameters." +msgstr "" + +#: doc/classes/PhysicsServer2D.xml:527 doc/classes/PhysicsServer3D.xml:514 +msgid "Returns the [RID] of the nth shape of a body." +msgstr "" + +#: doc/classes/PhysicsServer2D.xml:536 doc/classes/PhysicsServer3D.xml:523 +msgid "Returns the number of shapes assigned to a body." +msgstr "" + +#: doc/classes/PhysicsServer2D.xml:547 +msgid "Returns the metadata of a shape of a body." +msgstr "" + +#: doc/classes/PhysicsServer2D.xml:558 doc/classes/PhysicsServer3D.xml:534 +msgid "Returns the transform matrix of a body shape." +msgstr "" + +#: doc/classes/PhysicsServer2D.xml:567 doc/classes/PhysicsServer3D.xml:543 +msgid "Returns the [RID] of the space assigned to a body." +msgstr "" + +#: doc/classes/PhysicsServer2D.xml:578 doc/classes/PhysicsServer3D.xml:554 +msgid "Returns a body state." +msgstr "" + +#: doc/classes/PhysicsServer2D.xml:587 doc/classes/PhysicsServer3D.xml:582 +msgid "" +"Returns whether a body uses a callback function to calculate its own physics " +"(see [method body_set_force_integration_callback])." +msgstr "" + +#: doc/classes/PhysicsServer2D.xml:598 +msgid "Removes a body from the list of bodies exempt from collisions." +msgstr "" + +#: doc/classes/PhysicsServer2D.xml:609 doc/classes/PhysicsServer3D.xml:614 +msgid "" +"Removes a shape from a body. The shape is not deleted, so it can be reused " +"afterwards." +msgstr "" + +#: doc/classes/PhysicsServer2D.xml:620 doc/classes/PhysicsServer3D.xml:637 +#: 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." +msgstr "" + +#: doc/classes/PhysicsServer2D.xml:631 doc/classes/PhysicsServer3D.xml:648 +msgid "Sets the physics layer or layers a body belongs to." +msgstr "" + +#: doc/classes/PhysicsServer2D.xml:642 doc/classes/PhysicsServer3D.xml:659 +msgid "Sets the physics layer or layers a body can collide with." +msgstr "" + +#: doc/classes/PhysicsServer2D.xml:653 +msgid "" +"Sets the continuous collision detection mode using one of the [enum CCDMode] " +"constants.\n" +"Continuous collision detection tries to predict where a moving body will " +"collide, instead of moving it and correcting its movement if it collided." +msgstr "" + +#: doc/classes/PhysicsServer2D.xml:669 doc/classes/PhysicsServer3D.xml:686 +msgid "" +"Sets the function used to calculate physics for an object, if that object " +"allows it (see [method body_set_omit_force_integration])." +msgstr "" + +#: doc/classes/PhysicsServer2D.xml:680 doc/classes/PhysicsServer3D.xml:707 +msgid "" +"Sets 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/PhysicsServer2D.xml:691 +msgid "Sets the body mode using one of the [enum BodyMode] constants." +msgstr "" + +#: doc/classes/PhysicsServer2D.xml:702 doc/classes/PhysicsServer3D.xml:729 +msgid "" +"Sets whether a body uses a callback function to calculate its own physics " +"(see [method body_set_force_integration_callback])." +msgstr "" + +#: doc/classes/PhysicsServer2D.xml:715 +msgid "" +"Sets a body parameter. See [enum BodyParameter] for a list of available " +"parameters." +msgstr "" + +#: doc/classes/PhysicsServer2D.xml:728 doc/classes/PhysicsServer3D.xml:766 +msgid "" +"Substitutes a given body shape by another. The old shape is selected by its " +"index, the new one by its [RID]." +msgstr "" + +#: doc/classes/PhysicsServer2D.xml:743 +msgid "" +"Enables one way collision on body if [code]enable[/code] is [code]true[/" +"code]." +msgstr "" + +#: doc/classes/PhysicsServer2D.xml:756 +msgid "Disables shape in body if [code]disable[/code] is [code]true[/code]." +msgstr "" + +#: doc/classes/PhysicsServer2D.xml:769 +msgid "" +"Sets metadata of a shape within a body. This metadata is different from " +"[method Object.set_meta], and can be retrieved on shape queries." +msgstr "" + +#: doc/classes/PhysicsServer2D.xml:782 doc/classes/PhysicsServer3D.xml:791 +msgid "Sets the transform matrix for a body shape." +msgstr "" + +#: doc/classes/PhysicsServer2D.xml:793 doc/classes/PhysicsServer3D.xml:802 +msgid "Assigns a space to the body (see [method space_create])." +msgstr "" + +#: doc/classes/PhysicsServer2D.xml:806 +msgid "Sets a body state using one of the [enum BodyState] constants." +msgstr "" + +#: doc/classes/PhysicsServer2D.xml:825 +msgid "" +"Returns [code]true[/code] if a collision would result from moving in the " +"given direction from a given point in space. Margin increases the size of " +"the shapes involved in the collision detection. [PhysicsTestMotionResult2D] " +"can be passed to return additional information in." +msgstr "" + +#: doc/classes/PhysicsServer2D.xml:864 +msgid "" +"Creates a damped spring joint between two bodies. If not specified, the " +"second body is assumed to be the joint itself." +msgstr "" + +#: doc/classes/PhysicsServer2D.xml:875 +msgid "Returns the value of a damped spring joint parameter." +msgstr "" + +#: doc/classes/PhysicsServer2D.xml:888 +msgid "" +"Sets a damped spring joint parameter. See [enum DampedStringParam] for a " +"list of available parameters." +msgstr "" + +#: doc/classes/PhysicsServer2D.xml:897 +msgid "" +"Destroys any of the objects created by PhysicsServer2D. If the [RID] passed " +"is not one of the objects that can be created by PhysicsServer2D, an error " +"will be sent to the console." +msgstr "" + +#: doc/classes/PhysicsServer2D.xml:906 +msgid "" +"Returns information about the current state of the 2D physics engine. See " +"[enum ProcessInfo] for a list of available states." +msgstr "" + +#: doc/classes/PhysicsServer2D.xml:923 +msgid "" +"Creates a groove joint between two bodies. If not specified, the bodies are " +"assumed to be the joint itself." +msgstr "" + +#: doc/classes/PhysicsServer2D.xml:934 +msgid "Returns the value of a joint parameter." +msgstr "" + +#: doc/classes/PhysicsServer2D.xml:943 +msgid "Returns a joint's type (see [enum JointType])." +msgstr "" + +#: doc/classes/PhysicsServer2D.xml:956 +msgid "" +"Sets a joint parameter. See [enum JointParam] for a list of available " +"parameters." +msgstr "" + +#: doc/classes/PhysicsServer2D.xml:975 +msgid "" +"Creates a pin joint between two bodies. If not specified, the second body is " +"assumed to be the joint itself." +msgstr "" + +#: doc/classes/PhysicsServer2D.xml:1002 +msgid "Activates or deactivates the 2D physics engine." +msgstr "" + +#: doc/classes/PhysicsServer2D.xml:1011 doc/classes/PhysicsServer3D.xml:1156 +msgid "Returns the shape data." +msgstr "" + +#: doc/classes/PhysicsServer2D.xml:1020 +msgid "Returns a shape's type (see [enum ShapeType])." +msgstr "" + +#: doc/classes/PhysicsServer2D.xml:1031 doc/classes/PhysicsServer3D.xml:1176 +msgid "" +"Sets the shape data that defines its shape and size. The data to be passed " +"depends on the kind of shape created [method shape_get_type]." +msgstr "" + +#: doc/classes/PhysicsServer2D.xml:1038 doc/classes/PhysicsServer3D.xml:1207 +msgid "" +"Creates a space. A space is a collection of parameters for the physics " +"engine that can be assigned to an area or a body. It can be assigned to an " +"area with [method area_set_space], or to a body with [method body_set_space]." +msgstr "" + +#: doc/classes/PhysicsServer2D.xml:1047 +msgid "" +"Returns the state of a space, a [PhysicsDirectSpaceState2D]. This object can " +"be used to make collision/intersection queries." +msgstr "" + +#: doc/classes/PhysicsServer2D.xml:1058 doc/classes/PhysicsServer3D.xml:1227 +msgid "Returns the value of a space parameter." +msgstr "" + +#: doc/classes/PhysicsServer2D.xml:1067 doc/classes/PhysicsServer3D.xml:1236 +msgid "Returns whether the space is active." +msgstr "" + +#: doc/classes/PhysicsServer2D.xml:1078 doc/classes/PhysicsServer3D.xml:1247 +msgid "" +"Marks a space as active. It will not have an effect, unless it is assigned " +"to an area or body." +msgstr "" + +#: doc/classes/PhysicsServer2D.xml:1091 +msgid "" +"Sets the value for a space parameter. See [enum SpaceParameter] for a list " +"of available parameters." +msgstr "" + +#: doc/classes/PhysicsServer2D.xml:1097 doc/classes/PhysicsServer3D.xml:1602 +msgid "" +"Constant to set/get the maximum distance a pair of bodies has to move before " +"their collision status has to be recalculated." +msgstr "" + +#: doc/classes/PhysicsServer2D.xml:1100 doc/classes/PhysicsServer3D.xml:1605 +msgid "" +"Constant to set/get the maximum distance a shape can be from another before " +"they are considered separated." +msgstr "" + +#: doc/classes/PhysicsServer2D.xml:1103 doc/classes/PhysicsServer3D.xml:1608 +msgid "" +"Constant to set/get the maximum distance a shape can penetrate another shape " +"before it is considered a collision." +msgstr "" + +#: doc/classes/PhysicsServer2D.xml:1106 doc/classes/PhysicsServer3D.xml:1611 +msgid "" +"Constant to set/get the threshold linear velocity of activity. A body marked " +"as potentially inactive for both linear and angular velocity will be put to " +"sleep after the time given." +msgstr "" + +#: doc/classes/PhysicsServer2D.xml:1109 doc/classes/PhysicsServer3D.xml:1614 +msgid "" +"Constant to set/get the threshold angular velocity of activity. A body " +"marked as potentially inactive for both linear and angular velocity will be " +"put to sleep after the time given." +msgstr "" + +#: doc/classes/PhysicsServer2D.xml:1112 doc/classes/PhysicsServer3D.xml:1617 +msgid "" +"Constant to set/get the maximum time of activity. A body marked as " +"potentially inactive for both linear and angular velocity will be put to " +"sleep after this time." +msgstr "" + +#: doc/classes/PhysicsServer2D.xml:1115 doc/classes/PhysicsServer3D.xml:1622 +msgid "" +"Constant to set/get the default solver bias for all physics constraints. A " +"solver bias is a factor controlling how much two objects \"rebound\", after " +"violating a constraint, to avoid leaving them in that state because of " +"numerical imprecision." +msgstr "" + +#: doc/classes/PhysicsServer2D.xml:1120 +msgid "" +"This is the constant for creating line shapes. A line shape is an infinite " +"line with an origin point, and a normal. Thus, it can be used for front/" +"behind checks." +msgstr "" + +#: doc/classes/PhysicsServer2D.xml:1125 +msgid "" +"This is the constant for creating segment shapes. A segment shape is a line " +"from a point A to a point B. It can be checked for intersections." +msgstr "" + +#: doc/classes/PhysicsServer2D.xml:1128 +msgid "" +"This is the constant for creating circle shapes. A circle shape only has a " +"radius. It can be used for intersections and inside/outside checks." +msgstr "" + +#: doc/classes/PhysicsServer2D.xml:1131 +msgid "" +"This is the constant for creating rectangle shapes. A rectangle shape is " +"defined by a width and a height. It can be used for intersections and inside/" +"outside checks." +msgstr "" + +#: doc/classes/PhysicsServer2D.xml:1134 +msgid "" +"This is the constant for creating capsule shapes. A capsule shape is defined " +"by a radius and a length. It can be used for intersections and inside/" +"outside checks." +msgstr "" + +#: doc/classes/PhysicsServer2D.xml:1137 +msgid "" +"This is the constant for creating convex polygon shapes. A polygon is " +"defined by a list of points. It can be used for intersections and inside/" +"outside checks. Unlike the [member CollisionPolygon2D.polygon] property, " +"polygons modified with [method shape_set_data] do not verify that the points " +"supplied form is a convex polygon." +msgstr "" + +#: doc/classes/PhysicsServer2D.xml:1140 +msgid "" +"This is the constant for creating concave polygon shapes. A polygon is " +"defined by a list of points. It can be used for intersections checks, but " +"not for inside/outside checks." +msgstr "" + +#: doc/classes/PhysicsServer2D.xml:1143 doc/classes/PhysicsServer3D.xml:1497 +msgid "" +"This constant is used internally by the engine. Any attempt to create this " +"kind of shape results in an error." +msgstr "" + +#: doc/classes/PhysicsServer2D.xml:1146 doc/classes/PhysicsServer3D.xml:1500 +msgid "Constant to set/get gravity strength in an area." +msgstr "" + +#: doc/classes/PhysicsServer2D.xml:1149 doc/classes/PhysicsServer3D.xml:1503 +msgid "Constant to set/get gravity vector/center in an area." +msgstr "" + +#: doc/classes/PhysicsServer2D.xml:1152 doc/classes/PhysicsServer3D.xml:1506 +msgid "" +"Constant to set/get whether the gravity vector of an area is a direction, or " +"a center point." +msgstr "" + +#: doc/classes/PhysicsServer2D.xml:1155 doc/classes/PhysicsServer3D.xml:1509 +msgid "" +"Constant to set/get the falloff factor for point gravity of an area. The " +"greater this value is, the faster the strength of gravity decreases with the " +"square of distance." +msgstr "" + +#: doc/classes/PhysicsServer2D.xml:1158 doc/classes/PhysicsServer3D.xml:1512 +msgid "" +"This constant was used to set/get the falloff factor for point gravity. It " +"has been superseded by [constant AREA_PARAM_GRAVITY_DISTANCE_SCALE]." +msgstr "" + +#: doc/classes/PhysicsServer2D.xml:1161 doc/classes/PhysicsServer3D.xml:1515 +msgid "Constant to set/get the linear dampening factor of an area." +msgstr "" + +#: doc/classes/PhysicsServer2D.xml:1164 doc/classes/PhysicsServer3D.xml:1518 +msgid "Constant to set/get the angular dampening factor of an area." +msgstr "" + +#: doc/classes/PhysicsServer2D.xml:1167 doc/classes/PhysicsServer3D.xml:1521 +msgid "Constant to set/get the priority (order of processing) of an area." +msgstr "" + +#: doc/classes/PhysicsServer2D.xml:1170 doc/classes/PhysicsServer3D.xml:1524 +msgid "" +"This area does not affect gravity/damp. These are generally areas that exist " +"only to detect collisions, and objects entering or exiting them." +msgstr "" + +#: doc/classes/PhysicsServer2D.xml:1173 doc/classes/PhysicsServer3D.xml:1527 +msgid "" +"This area adds its gravity/damp values to whatever has been calculated so " +"far. This way, many overlapping areas can combine their physics to make " +"interesting effects." +msgstr "" + +#: doc/classes/PhysicsServer2D.xml:1176 doc/classes/PhysicsServer3D.xml:1530 +msgid "" +"This area adds its gravity/damp values to whatever has been calculated so " +"far. Then stops taking into account the rest of the areas, even the default " +"one." +msgstr "" + +#: doc/classes/PhysicsServer2D.xml:1179 doc/classes/PhysicsServer3D.xml:1533 +msgid "" +"This area replaces any gravity/damp, even the default one, and stops taking " +"into account the rest of the areas." +msgstr "" + +#: doc/classes/PhysicsServer2D.xml:1182 doc/classes/PhysicsServer3D.xml:1536 +msgid "" +"This area replaces any gravity/damp calculated so far, but keeps calculating " +"the rest of the areas, down to the default one." +msgstr "" + +#: doc/classes/PhysicsServer2D.xml:1185 doc/classes/PhysicsServer3D.xml:1539 +msgid "Constant for static bodies." +msgstr "" + +#: doc/classes/PhysicsServer2D.xml:1188 doc/classes/PhysicsServer3D.xml:1542 +msgid "Constant for kinematic bodies." +msgstr "" + +#: doc/classes/PhysicsServer2D.xml:1191 doc/classes/PhysicsServer3D.xml:1545 +msgid "Constant for rigid bodies." +msgstr "" + +#: doc/classes/PhysicsServer2D.xml:1194 doc/classes/PhysicsServer3D.xml:1548 +msgid "" +"Constant for rigid bodies in character mode. In this mode, a body can not " +"rotate, and only its linear velocity is affected by physics." +msgstr "" + +#: doc/classes/PhysicsServer2D.xml:1197 doc/classes/PhysicsServer3D.xml:1551 +msgid "Constant to set/get a body's bounce factor." +msgstr "" + +#: doc/classes/PhysicsServer2D.xml:1200 doc/classes/PhysicsServer3D.xml:1554 +msgid "Constant to set/get a body's friction." +msgstr "" + +#: doc/classes/PhysicsServer2D.xml:1203 doc/classes/PhysicsServer3D.xml:1557 +msgid "Constant to set/get a body's mass." +msgstr "" + +#: doc/classes/PhysicsServer2D.xml:1206 +msgid "Constant to set/get a body's inertia." +msgstr "" + +#: doc/classes/PhysicsServer2D.xml:1209 doc/classes/PhysicsServer3D.xml:1560 +msgid "Constant to set/get a body's gravity multiplier." +msgstr "" + +#: doc/classes/PhysicsServer2D.xml:1212 doc/classes/PhysicsServer3D.xml:1563 +msgid "Constant to set/get a body's linear dampening factor." +msgstr "" + +#: doc/classes/PhysicsServer2D.xml:1215 doc/classes/PhysicsServer3D.xml:1566 +msgid "Constant to set/get a body's angular dampening factor." +msgstr "" + +#: doc/classes/PhysicsServer2D.xml:1218 doc/classes/PhysicsServer3D.xml:1569 +msgid "Represents the size of the [enum BodyParameter] enum." +msgstr "" + +#: doc/classes/PhysicsServer2D.xml:1221 doc/classes/PhysicsServer3D.xml:1572 +msgid "Constant to set/get the current transform matrix of the body." +msgstr "" + +#: doc/classes/PhysicsServer2D.xml:1224 doc/classes/PhysicsServer3D.xml:1575 +msgid "Constant to set/get the current linear velocity of the body." +msgstr "" + +#: doc/classes/PhysicsServer2D.xml:1227 doc/classes/PhysicsServer3D.xml:1578 +msgid "Constant to set/get the current angular velocity of the body." +msgstr "" + +#: doc/classes/PhysicsServer2D.xml:1230 doc/classes/PhysicsServer3D.xml:1581 +msgid "Constant to sleep/wake up a body, or to get whether it is sleeping." +msgstr "" + +#: doc/classes/PhysicsServer2D.xml:1233 doc/classes/PhysicsServer3D.xml:1584 +msgid "Constant to set/get whether the body can sleep." +msgstr "" + +#: doc/classes/PhysicsServer2D.xml:1236 +msgid "Constant to create pin joints." +msgstr "" + +#: doc/classes/PhysicsServer2D.xml:1239 +msgid "Constant to create groove joints." +msgstr "" + +#: doc/classes/PhysicsServer2D.xml:1242 +msgid "Constant to create damped spring joints." +msgstr "" + +#: doc/classes/PhysicsServer2D.xml:1251 +msgid "" +"Sets the resting length of the spring joint. The joint will always try to go " +"to back this length when pulled apart." +msgstr "" + +#: doc/classes/PhysicsServer2D.xml:1254 +msgid "" +"Sets the stiffness of the spring joint. The joint applies a force equal to " +"the stiffness times the distance from its resting length." +msgstr "" + +#: doc/classes/PhysicsServer2D.xml:1257 +msgid "" +"Sets the damping ratio of the spring joint. A value of 0 indicates an " +"undamped spring, while 1 causes the system to reach equilibrium as fast as " +"possible (critical damping)." +msgstr "" + +#: doc/classes/PhysicsServer2D.xml:1260 +msgid "" +"Disables continuous collision detection. This is the fastest way to detect " +"body collisions, but can miss small, fast-moving objects." +msgstr "" + +#: doc/classes/PhysicsServer2D.xml:1263 +msgid "" +"Enables continuous collision detection by raycasting. It is faster than " +"shapecasting, but less precise." +msgstr "" + +#: doc/classes/PhysicsServer2D.xml:1266 +msgid "" +"Enables continuous collision detection by shapecasting. It is the slowest " +"CCD method, and the most precise." +msgstr "" + +#: doc/classes/PhysicsServer2D.xml:1269 doc/classes/PhysicsServer3D.xml:1587 +msgid "" +"The value of the first parameter and area callback function receives, when " +"an object enters one of its shapes." +msgstr "" + +#: doc/classes/PhysicsServer2D.xml:1272 doc/classes/PhysicsServer3D.xml:1590 +msgid "" +"The value of the first parameter and area callback function receives, when " +"an object exits one of its shapes." +msgstr "" + +#: doc/classes/PhysicsServer2D.xml:1275 doc/classes/PhysicsServer3D.xml:1593 +msgid "Constant to get the number of objects that are not sleeping." +msgstr "" + +#: doc/classes/PhysicsServer2D.xml:1278 doc/classes/PhysicsServer3D.xml:1596 +msgid "Constant to get the number of possible collisions." +msgstr "" + +#: doc/classes/PhysicsServer2D.xml:1281 doc/classes/PhysicsServer3D.xml:1599 +msgid "" +"Constant to get the number of space regions where a collision could occur." +msgstr "" + +#: doc/classes/PhysicsServer3D.xml:4 +msgid "Server interface for low-level physics access." +msgstr "" + +#: doc/classes/PhysicsServer3D.xml:7 +msgid "" +"PhysicsServer3D is the server responsible for all 3D physics. It can create " +"many kinds of physics objects, but does not insert them on the node tree." +msgstr "" + +#: doc/classes/PhysicsServer3D.xml:51 +msgid "Creates an [Area3D]." +msgstr "" + +#: doc/classes/PhysicsServer3D.xml:71 +msgid "" +"Returns an area parameter value. A list of available parameters is on the " +"[enum AreaParameter] constants." +msgstr "" + +#: doc/classes/PhysicsServer3D.xml:138 +msgid "If [code]true[/code], area collides with rays." +msgstr "" + +#: doc/classes/PhysicsServer3D.xml:224 +msgid "" +"Sets the value for an area parameter. A list of available parameters is on " +"the [enum AreaParameter] constants." +msgstr "" + +#: doc/classes/PhysicsServer3D.xml:235 +msgid "Sets object pickable with rays." +msgstr "" + +#: doc/classes/PhysicsServer3D.xml:295 +msgid "" +"Sets the space override mode for the area. The modes are described in the " +"[enum AreaSpaceOverrideMode] constants." +msgstr "" + +#: doc/classes/PhysicsServer3D.xml:387 +msgid "" +"Gives the body a push at a [code]position[/code] in the direction of the " +"[code]impulse[/code]." +msgstr "" + +#: doc/classes/PhysicsServer3D.xml:398 +msgid "Gives the body a push to rotate it." +msgstr "" + +#: doc/classes/PhysicsServer3D.xml:429 +msgid "" +"Creates a physics body. The first parameter can be any value from [enum " +"BodyMode] constants, for the type of body created. Additionally, the body " +"can be created in sleeping state to save processing time." +msgstr "" + +#: doc/classes/PhysicsServer3D.xml:447 +msgid "" +"Returns the physics layer or layers a body can collide with.\n" +"-" +msgstr "" + +#: doc/classes/PhysicsServer3D.xml:457 +msgid "Returns the [PhysicsDirectBodyState3D] of the body." +msgstr "" + +#: doc/classes/PhysicsServer3D.xml:503 +msgid "" +"Returns the value of a body parameter. A list of available parameters is on " +"the [enum BodyParameter] constants." +msgstr "" + +#: doc/classes/PhysicsServer3D.xml:573 +msgid "" +"If [code]true[/code], the continuous collision detection mode is enabled." +msgstr "" + +#: doc/classes/PhysicsServer3D.xml:591 +msgid "If [code]true[/code], the body can be detected by rays." +msgstr "" + +#: doc/classes/PhysicsServer3D.xml:602 +msgid "" +"Removes a body from the list of bodies exempt from collisions.\n" +"Continuous collision detection tries to predict where a moving body will " +"collide, instead of moving it and correcting its movement if it collided." +msgstr "" + +#: doc/classes/PhysicsServer3D.xml:670 +msgid "" +"If [code]true[/code], the continuous collision detection mode is enabled.\n" +"Continuous collision detection tries to predict where a moving body will " +"collide, instead of moving it and correcting its movement if it collided." +msgstr "" + +#: doc/classes/PhysicsServer3D.xml:718 +msgid "Sets the body mode, from one of the [enum BodyMode] constants." +msgstr "" + +#: doc/classes/PhysicsServer3D.xml:742 +msgid "" +"Sets a body parameter. A list of available parameters is on the [enum " +"BodyParameter] constants." +msgstr "" + +#: doc/classes/PhysicsServer3D.xml:753 +msgid "Sets the body pickable with rays if [code]enabled[/code] is set." +msgstr "" + +#: doc/classes/PhysicsServer3D.xml:815 +msgid "Sets a body state (see [enum BodyState] constants)." +msgstr "" + +#: doc/classes/PhysicsServer3D.xml:826 +msgid "" +"Gets a cone_twist_joint parameter (see [enum ConeTwistJointParam] constants)." +msgstr "" + +#: doc/classes/PhysicsServer3D.xml:839 +msgid "" +"Sets a cone_twist_joint parameter (see [enum ConeTwistJointParam] constants)." +msgstr "" + +#: doc/classes/PhysicsServer3D.xml:848 +msgid "" +"Destroys any of the objects created by PhysicsServer3D. If the [RID] passed " +"is not one of the objects that can be created by PhysicsServer3D, an error " +"will be sent to the console." +msgstr "" + +#: doc/classes/PhysicsServer3D.xml:861 +msgid "" +"Gets a generic_6_DOF_joint flag (see [enum G6DOFJointAxisFlag] constants)." +msgstr "" + +#: doc/classes/PhysicsServer3D.xml:874 +msgid "" +"Gets a generic_6_DOF_joint parameter (see [enum G6DOFJointAxisParam] " +"constants)." +msgstr "" + +#: doc/classes/PhysicsServer3D.xml:889 +msgid "" +"Sets a generic_6_DOF_joint flag (see [enum G6DOFJointAxisFlag] constants)." +msgstr "" + +#: doc/classes/PhysicsServer3D.xml:904 +msgid "" +"Sets a generic_6_DOF_joint parameter (see [enum G6DOFJointAxisParam] " +"constants)." +msgstr "" + +#: doc/classes/PhysicsServer3D.xml:913 +msgid "Returns an Info defined by the [enum ProcessInfo] input given." +msgstr "" + +#: doc/classes/PhysicsServer3D.xml:924 +msgid "Gets a hinge_joint flag (see [enum HingeJointFlag] constants)." +msgstr "" + +#: doc/classes/PhysicsServer3D.xml:935 +msgid "Gets a hinge_joint parameter (see [enum HingeJointParam])." +msgstr "" + +#: doc/classes/PhysicsServer3D.xml:948 +msgid "Sets a hinge_joint flag (see [enum HingeJointFlag] constants)." +msgstr "" + +#: doc/classes/PhysicsServer3D.xml:961 +msgid "Sets a hinge_joint parameter (see [enum HingeJointParam] constants)." +msgstr "" + +#: doc/classes/PhysicsServer3D.xml:976 +msgid "Creates a [ConeTwistJoint3D]." +msgstr "" + +#: doc/classes/PhysicsServer3D.xml:991 +msgid "Creates a [Generic6DOFJoint3D]." +msgstr "" + +#: doc/classes/PhysicsServer3D.xml:1006 +msgid "Creates a [HingeJoint3D]." +msgstr "" + +#: doc/classes/PhysicsServer3D.xml:1021 +msgid "Creates a [PinJoint3D]." +msgstr "" + +#: doc/classes/PhysicsServer3D.xml:1036 +msgid "Creates a [SliderJoint3D]." +msgstr "" + +#: doc/classes/PhysicsServer3D.xml:1045 +msgid "Gets the priority value of the Joint3D." +msgstr "" + +#: doc/classes/PhysicsServer3D.xml:1054 +msgid "Returns the type of the Joint3D." +msgstr "" + +#: doc/classes/PhysicsServer3D.xml:1065 +msgid "Sets the priority value of the Joint3D." +msgstr "" + +#: doc/classes/PhysicsServer3D.xml:1074 +msgid "" +"Returns position of the joint in the local space of body a of the joint." +msgstr "" + +#: doc/classes/PhysicsServer3D.xml:1083 +msgid "" +"Returns position of the joint in the local space of body b of the joint." +msgstr "" + +#: doc/classes/PhysicsServer3D.xml:1094 +msgid "Gets a pin_joint parameter (see [enum PinJointParam] constants)." +msgstr "" + +#: doc/classes/PhysicsServer3D.xml:1105 +msgid "Sets position of the joint in the local space of body a of the joint." +msgstr "" + +#: doc/classes/PhysicsServer3D.xml:1116 +msgid "Sets position of the joint in the local space of body b of the joint." +msgstr "" + +#: doc/classes/PhysicsServer3D.xml:1129 +msgid "Sets a pin_joint parameter (see [enum PinJointParam] constants)." +msgstr "" + +#: doc/classes/PhysicsServer3D.xml:1138 +msgid "Activates or deactivates the 3D physics engine." +msgstr "" + +#: doc/classes/PhysicsServer3D.xml:1147 +msgid "" +"Creates a shape of a type from [enum ShapeType]. Does not assign it to a " +"body or an area. To do so, you must use [method area_set_shape] or [method " +"body_set_shape]." +msgstr "" + +#: doc/classes/PhysicsServer3D.xml:1165 +msgid "Returns the type of shape (see [enum ShapeType] constants)." +msgstr "" + +#: doc/classes/PhysicsServer3D.xml:1187 doc/classes/PhysicsServer3D.xml:1200 +msgid "Gets a slider_joint parameter (see [enum SliderJointParam] constants)." +msgstr "" + +#: doc/classes/PhysicsServer3D.xml:1216 +msgid "" +"Returns the state of a space, a [PhysicsDirectSpaceState3D]. This object can " +"be used to make collision/intersection queries." +msgstr "" + +#: doc/classes/PhysicsServer3D.xml:1260 +msgid "" +"Sets the value for a space parameter. A list of available parameters is on " +"the [enum SpaceParameter] constants." +msgstr "" + +#: doc/classes/PhysicsServer3D.xml:1266 +msgid "The [Joint3D] is a [PinJoint3D]." +msgstr "" + +#: doc/classes/PhysicsServer3D.xml:1269 +msgid "The [Joint3D] is a [HingeJoint3D]." +msgstr "" + +#: doc/classes/PhysicsServer3D.xml:1272 +msgid "The [Joint3D] is a [SliderJoint3D]." +msgstr "" + +#: doc/classes/PhysicsServer3D.xml:1275 +msgid "The [Joint3D] is a [ConeTwistJoint3D]." +msgstr "" + +#: doc/classes/PhysicsServer3D.xml:1278 +msgid "The [Joint3D] is a [Generic6DOFJoint3D]." +msgstr "" + +#: doc/classes/PhysicsServer3D.xml:1281 +msgid "" +"The strength with which the pinned objects try to stay in positional " +"relation to each other.\n" +"The higher, the stronger." +msgstr "" + +#: doc/classes/PhysicsServer3D.xml:1285 +msgid "" +"The strength with which the pinned objects try to stay in velocity relation " +"to each other.\n" +"The higher, the stronger." +msgstr "" + +#: doc/classes/PhysicsServer3D.xml:1289 +msgid "" +"If above 0, this value is the maximum value for an impulse that this Joint3D " +"puts on its ends." +msgstr "" + +#: doc/classes/PhysicsServer3D.xml:1295 +msgid "The maximum rotation across the Hinge." +msgstr "" + +#: doc/classes/PhysicsServer3D.xml:1298 +msgid "The minimum rotation across the Hinge." +msgstr "" + +#: doc/classes/PhysicsServer3D.xml:1315 +msgid "If [code]true[/code], the Hinge has a maximum and a minimum rotation." +msgstr "" + +#: doc/classes/PhysicsServer3D.xml:1318 +msgid "If [code]true[/code], a motor turns the Hinge." +msgstr "" + +#: doc/classes/PhysicsServer3D.xml:1321 doc/classes/SliderJoint3D.xml:81 +#: doc/classes/SliderJoint3D.xml:104 +msgid "" +"The maximum difference between the pivot points on their X axis before " +"damping happens." +msgstr "" + +#: doc/classes/PhysicsServer3D.xml:1324 doc/classes/SliderJoint3D.xml:72 +#: doc/classes/SliderJoint3D.xml:107 +msgid "" +"The minimum difference between the pivot points on their X axis before " +"damping happens." +msgstr "" + +#: doc/classes/PhysicsServer3D.xml:1327 doc/classes/SliderJoint3D.xml:78 +#: doc/classes/SliderJoint3D.xml:110 +msgid "" +"A factor applied to the movement across the slider axis once the limits get " +"surpassed. The lower, the slower the movement." +msgstr "" + +#: doc/classes/PhysicsServer3D.xml:1330 doc/classes/SliderJoint3D.xml:113 +msgid "" +"The amount of restitution once the limits are surpassed. The lower, the more " +"velocityenergy gets lost." +msgstr "" + +#: doc/classes/PhysicsServer3D.xml:1333 doc/classes/SliderJoint3D.xml:116 +msgid "The amount of damping once the slider limits are surpassed." +msgstr "" + +#: doc/classes/PhysicsServer3D.xml:1336 doc/classes/SliderJoint3D.xml:90 +#: doc/classes/SliderJoint3D.xml:119 +msgid "" +"A factor applied to the movement across the slider axis as long as the " +"slider is in the limits. The lower, the slower the movement." +msgstr "" + +#: doc/classes/PhysicsServer3D.xml:1339 doc/classes/SliderJoint3D.xml:87 +#: doc/classes/SliderJoint3D.xml:122 +msgid "The amount of restitution inside the slider limits." +msgstr "" + +#: doc/classes/PhysicsServer3D.xml:1342 doc/classes/SliderJoint3D.xml:84 +#: doc/classes/SliderJoint3D.xml:125 +msgid "The amount of damping inside the slider limits." +msgstr "" + +#: doc/classes/PhysicsServer3D.xml:1345 doc/classes/SliderJoint3D.xml:99 +#: doc/classes/SliderJoint3D.xml:128 +msgid "A factor applied to the movement across axes orthogonal to the slider." +msgstr "" + +#: doc/classes/PhysicsServer3D.xml:1348 doc/classes/SliderJoint3D.xml:96 +#: doc/classes/SliderJoint3D.xml:131 +msgid "" +"The amount of restitution when movement is across axes orthogonal to the " +"slider." +msgstr "" + +#: doc/classes/PhysicsServer3D.xml:1351 doc/classes/SliderJoint3D.xml:93 +#: doc/classes/SliderJoint3D.xml:134 +msgid "" +"The amount of damping when movement is across axes orthogonal to the slider." +msgstr "" + +#: doc/classes/PhysicsServer3D.xml:1354 doc/classes/SliderJoint3D.xml:48 +#: doc/classes/SliderJoint3D.xml:137 +msgid "The upper limit of rotation in the slider." +msgstr "" + +#: doc/classes/PhysicsServer3D.xml:1357 doc/classes/SliderJoint3D.xml:37 +#: doc/classes/SliderJoint3D.xml:140 +msgid "The lower limit of rotation in the slider." +msgstr "" + +#: doc/classes/PhysicsServer3D.xml:1360 doc/classes/SliderJoint3D.xml:143 +msgid "A factor applied to the all rotation once the limit is surpassed." +msgstr "" + +#: doc/classes/PhysicsServer3D.xml:1363 doc/classes/SliderJoint3D.xml:146 +msgid "The amount of restitution of the rotation when the limit is surpassed." +msgstr "" + +#: doc/classes/PhysicsServer3D.xml:1366 doc/classes/SliderJoint3D.xml:149 +msgid "The amount of damping of the rotation when the limit is surpassed." +msgstr "" + +#: doc/classes/PhysicsServer3D.xml:1369 +msgid "A factor that gets applied to the all rotation in the limits." +msgstr "" + +#: doc/classes/PhysicsServer3D.xml:1372 doc/classes/SliderJoint3D.xml:54 +#: doc/classes/SliderJoint3D.xml:155 +msgid "The amount of restitution of the rotation in the limits." +msgstr "" + +#: doc/classes/PhysicsServer3D.xml:1375 doc/classes/SliderJoint3D.xml:51 +#: doc/classes/SliderJoint3D.xml:158 +msgid "The amount of damping of the rotation in the limits." +msgstr "" + +#: doc/classes/PhysicsServer3D.xml:1378 +msgid "" +"A factor that gets applied to the all rotation across axes orthogonal to the " +"slider." +msgstr "" + +#: doc/classes/PhysicsServer3D.xml:1381 doc/classes/SliderJoint3D.xml:63 +#: doc/classes/SliderJoint3D.xml:164 +msgid "" +"The amount of restitution of the rotation across axes orthogonal to the " +"slider." +msgstr "" + +#: doc/classes/PhysicsServer3D.xml:1384 doc/classes/SliderJoint3D.xml:60 +#: doc/classes/SliderJoint3D.xml:167 +msgid "" +"The amount of damping of the rotation across axes orthogonal to the slider." +msgstr "" + +#: doc/classes/PhysicsServer3D.xml:1387 +msgid "Represents the size of the [enum SliderJointParam] enum." +msgstr "" + +#: doc/classes/PhysicsServer3D.xml:1404 +msgid "" +"The ease with which the Joint3D twists, if it's too low, it takes more force " +"to twist the joint." +msgstr "" + +#: doc/classes/PhysicsServer3D.xml:1416 +msgid "" +"A factor that gets applied to the movement across the axes. The lower, the " +"slower the movement." +msgstr "" + +#: doc/classes/PhysicsServer3D.xml:1419 +msgid "" +"The amount of restitution on the axes movement. The lower, the more velocity-" +"energy gets lost." +msgstr "" + +#: doc/classes/PhysicsServer3D.xml:1425 +msgid "The velocity that the joint's linear motor will attempt to reach." +msgstr "" + +#: doc/classes/PhysicsServer3D.xml:1428 +msgid "" +"The maximum force that the linear motor can apply while trying to reach the " +"target velocity." +msgstr "" + +#: doc/classes/PhysicsServer3D.xml:1437 +msgid "A factor that gets multiplied onto all rotations across the axes." +msgstr "" + +#: doc/classes/PhysicsServer3D.xml:1449 +msgid "" +"When correcting the crossing of limits in rotation across the axes, this " +"error tolerance factor defines how much the correction gets slowed down. The " +"lower, the slower." +msgstr "" + +#: doc/classes/PhysicsServer3D.xml:1458 +msgid "" +"If [code]set[/code] there is linear motion possible within the given limits." +msgstr "" + +#: doc/classes/PhysicsServer3D.xml:1461 +msgid "If [code]set[/code] there is rotational motion possible." +msgstr "" + +#: doc/classes/PhysicsServer3D.xml:1464 +msgid "If [code]set[/code] there is a rotational motor across these axes." +msgstr "" + +#: doc/classes/PhysicsServer3D.xml:1467 +msgid "" +"If [code]set[/code] there is a linear motor on this axis that targets a " +"specific velocity." +msgstr "" + +#: doc/classes/PhysicsServer3D.xml:1470 +msgid "The [Shape3D] is a [WorldMarginShape3D]." +msgstr "" + +#: doc/classes/PhysicsServer3D.xml:1473 +msgid "The [Shape3D] is a [RayShape3D]." +msgstr "" + +#: doc/classes/PhysicsServer3D.xml:1476 +msgid "The [Shape3D] is a [SphereShape3D]." +msgstr "" + +#: doc/classes/PhysicsServer3D.xml:1479 +msgid "The [Shape3D] is a [BoxShape3D]." +msgstr "" + +#: doc/classes/PhysicsServer3D.xml:1482 +msgid "The [Shape3D] is a [CapsuleShape3D]." +msgstr "" + +#: doc/classes/PhysicsServer3D.xml:1485 +msgid "The [Shape3D] is a [CylinderShape3D]." +msgstr "" + +#: doc/classes/PhysicsServer3D.xml:1488 +msgid "The [Shape3D] is a [ConvexPolygonShape3D]." +msgstr "" + +#: doc/classes/PhysicsServer3D.xml:1491 +msgid "The [Shape3D] is a [ConcavePolygonShape3D]." +msgstr "" + +#: doc/classes/PhysicsServer3D.xml:1494 +msgid "The [Shape3D] is a [HeightMapShape3D]." +msgstr "" + +#: doc/classes/PhysicsShapeQueryParameters2D.xml:4 +msgid "Parameters to be sent to a 2D shape physics query." +msgstr "" + +#: doc/classes/PhysicsShapeQueryParameters2D.xml:7 +msgid "" +"This class contains the shape and other parameters for 2D intersection/" +"collision queries. See also [PhysicsShapeQueryResult2D]." +msgstr "" + +#: doc/classes/PhysicsShapeQueryParameters2D.xml:18 +msgid "" +"Sets the [Shape2D] that will be used for collision/intersection queries." +msgstr "" + +#: doc/classes/PhysicsShapeQueryParameters2D.xml:24 +msgid "If [code]true[/code], the query will take [Area2D]s into account." +msgstr "" + +#: doc/classes/PhysicsShapeQueryParameters2D.xml:27 +msgid "" +"If [code]true[/code], the query will take [PhysicsBody2D]s into account." +msgstr "" + +#: doc/classes/PhysicsShapeQueryParameters2D.xml:30 +#: doc/classes/PhysicsShapeQueryParameters3D.xml:30 +msgid "The physics layer(s) the query will take into account (as a bitmask)." +msgstr "" + +#: doc/classes/PhysicsShapeQueryParameters2D.xml:33 +#: doc/classes/PhysicsShapeQueryParameters3D.xml:33 +msgid "" +"The list of objects or object [RID]s that will be excluded from collisions." +msgstr "" + +#: doc/classes/PhysicsShapeQueryParameters2D.xml:36 +#: doc/classes/PhysicsShapeQueryParameters3D.xml:36 doc/classes/Shape3D.xml:16 +msgid "The collision margin for the shape." +msgstr "" + +#: doc/classes/PhysicsShapeQueryParameters2D.xml:39 +msgid "The motion of the shape being queried for." +msgstr "" + +#: doc/classes/PhysicsShapeQueryParameters2D.xml:42 +#: doc/classes/PhysicsShapeQueryParameters3D.xml:39 +msgid "The queried shape's [RID]. See also [method set_shape]." +msgstr "" + +#: doc/classes/PhysicsShapeQueryParameters2D.xml:45 +#: doc/classes/PhysicsShapeQueryParameters3D.xml:42 +msgid "The queried shape's transform matrix." +msgstr "" + +#: doc/classes/PhysicsShapeQueryParameters3D.xml:4 +msgid "Parameters to be sent to a 3D shape physics query." +msgstr "" + +#: doc/classes/PhysicsShapeQueryParameters3D.xml:7 +msgid "" +"This class contains the shape and other parameters for 3D intersection/" +"collision queries. See also [PhysicsShapeQueryResult3D]." +msgstr "" + +#: doc/classes/PhysicsShapeQueryParameters3D.xml:18 +msgid "" +"Sets the [Shape3D] that will be used for collision/intersection queries." +msgstr "" + +#: doc/classes/PhysicsShapeQueryParameters3D.xml:24 +msgid "If [code]true[/code], the query will take [Area3D]s into account." +msgstr "" + +#: doc/classes/PhysicsShapeQueryParameters3D.xml:27 +msgid "" +"If [code]true[/code], the query will take [PhysicsBody3D]s into account." +msgstr "" + +#: doc/classes/PhysicsShapeQueryResult2D.xml:4 +msgid "Result of a 2D shape query in [PhysicsServer2D]." +msgstr "" + +#: doc/classes/PhysicsShapeQueryResult2D.xml:7 +msgid "" +"The result of a 2D shape query in [PhysicsServer2D]. See also " +"[PhysicsShapeQueryParameters2D]." +msgstr "" + +#: doc/classes/PhysicsShapeQueryResult2D.xml:16 +#: doc/classes/PhysicsShapeQueryResult3D.xml:16 +msgid "Returns the number of objects that intersected with the shape." +msgstr "" + +#: doc/classes/PhysicsShapeQueryResult2D.xml:25 +#: doc/classes/PhysicsShapeQueryResult3D.xml:25 +msgid "" +"Returns the [Object] that intersected with the shape at index [code]idx[/" +"code]." +msgstr "" + +#: doc/classes/PhysicsShapeQueryResult2D.xml:34 +#: doc/classes/PhysicsShapeQueryResult3D.xml:34 +msgid "" +"Returns the instance ID of the [Object] that intersected with the shape at " +"index [code]idx[/code]." +msgstr "" + +#: doc/classes/PhysicsShapeQueryResult2D.xml:43 +msgid "" +"Returns the child index of the object's [Shape2D] that intersected with the " +"shape at index [code]idx[/code]." +msgstr "" + +#: doc/classes/PhysicsShapeQueryResult2D.xml:52 +#: doc/classes/PhysicsShapeQueryResult3D.xml:52 +msgid "" +"Returns the [RID] of the object that intersected with the shape at index " +"[code]idx[/code]." +msgstr "" + +#: doc/classes/PhysicsShapeQueryResult3D.xml:4 +msgid "Result of a 3D shape query in [PhysicsServer3D]." +msgstr "" + +#: doc/classes/PhysicsShapeQueryResult3D.xml:7 +msgid "" +"The result of a 3D shape query in [PhysicsServer3D]. See also " +"[PhysicsShapeQueryParameters3D]." +msgstr "" + +#: doc/classes/PhysicsShapeQueryResult3D.xml:43 +msgid "" +"Returns the child index of the object's [Shape3D] that intersected with the " +"shape at index [code]idx[/code]." +msgstr "" + +#: doc/classes/PinJoint2D.xml:4 +msgid "Pin joint for 2D shapes." +msgstr "" + +#: doc/classes/PinJoint2D.xml:7 +msgid "" +"Pin joint for 2D rigid bodies. It pins two bodies (rigid or static) together." +msgstr "" + +#: doc/classes/PinJoint2D.xml:15 +msgid "" +"The higher this value, the more the bond to the pinned partner can flex." +msgstr "" + +#: doc/classes/PinJoint3D.xml:4 +msgid "Pin joint for 3D shapes." +msgstr "" + +#: doc/classes/PinJoint3D.xml:7 +msgid "" +"Pin joint for 3D rigid bodies. It pins 2 bodies (rigid or static) together." +msgstr "" + +#: doc/classes/PinJoint3D.xml:35 doc/classes/PinJoint3D.xml:46 +msgid "" +"The force with which the pinned objects stay in positional relation to each " +"other. The higher, the stronger." +msgstr "" + +#: doc/classes/PinJoint3D.xml:38 doc/classes/PinJoint3D.xml:49 +msgid "" +"The force with which the pinned objects stay in velocity relation to each " +"other. The higher, the stronger." +msgstr "" + +#: doc/classes/PinJoint3D.xml:41 doc/classes/PinJoint3D.xml:52 +msgid "" +"If above 0, this value is the maximum value for an impulse that this Joint3D " +"produces." +msgstr "" + +#: doc/classes/Plane.xml:4 +msgid "Plane in hessian form." +msgstr "" + +#: doc/classes/Plane.xml:7 +msgid "" +"Plane represents a normalized plane equation. Basically, \"normal\" is the " +"normal of the plane (a,b,c normalized), and \"d\" is the distance from the " +"origin to the plane (in the direction of \"normal\"). \"Over\" or \"Above\" " +"the plane is considered the side of the plane towards where the normal is " +"pointing." +msgstr "" + +#: doc/classes/Plane.xml:25 +msgid "" +"Creates a plane from the four parameters. The three components of the " +"resulting plane's [member normal] are [code]a[/code], [code]b[/code] and " +"[code]c[/code], and the plane has a distance of [code]d[/code] from the " +"origin." +msgstr "" + +#: doc/classes/Plane.xml:38 +msgid "Creates a plane from the three points, given in clockwise order." +msgstr "" + +#: doc/classes/Plane.xml:49 +msgid "Creates a plane from the normal and the plane's distance to the origin." +msgstr "" + +#: doc/classes/Plane.xml:56 +msgid "Returns the center of the plane." +msgstr "" + +#: doc/classes/Plane.xml:65 +msgid "" +"Returns the shortest distance from the plane to the position [code]point[/" +"code]." +msgstr "" + +#: doc/classes/Plane.xml:72 +msgid "Returns a point on the plane." +msgstr "" + +#: doc/classes/Plane.xml:83 +msgid "" +"Returns [code]true[/code] if [code]point[/code] is inside the plane (by a " +"very minimum [code]epsilon[/code] threshold)." +msgstr "" + +#: doc/classes/Plane.xml:94 +msgid "" +"Returns the intersection point of the three planes [code]b[/code], [code]c[/" +"code] and this plane. If no intersection is found, [code]null[/code] is " +"returned." +msgstr "" + +#: doc/classes/Plane.xml:105 +msgid "" +"Returns the intersection point of a ray consisting of the position " +"[code]from[/code] and the direction normal [code]dir[/code] with this plane. " +"If no intersection is found, [code]null[/code] is returned." +msgstr "" + +#: doc/classes/Plane.xml:116 +msgid "" +"Returns the intersection point of a segment from position [code]begin[/code] " +"to position [code]end[/code] with this plane. If no intersection is found, " +"[code]null[/code] is returned." +msgstr "" + +#: doc/classes/Plane.xml:125 +msgid "" +"Returns [code]true[/code] if this plane and [code]plane[/code] are " +"approximately equal, by running [method @GDScript.is_equal_approx] on each " +"component." +msgstr "" + +#: doc/classes/Plane.xml:134 +msgid "" +"Returns [code]true[/code] if [code]point[/code] is located above the plane." +msgstr "" + +#: doc/classes/Plane.xml:141 +msgid "Returns a copy of the plane, normalized." +msgstr "" + +#: doc/classes/Plane.xml:150 +msgid "" +"Returns the orthogonal projection of point [code]p[/code] into a point in " +"the plane." +msgstr "" + +#: doc/classes/Plane.xml:156 +msgid "" +"Distance from the origin to the plane, in the direction of [member normal]." +msgstr "" + +#: doc/classes/Plane.xml:159 +msgid "" +"The normal of the plane. \"Over\" or \"Above\" the plane is considered the " +"side of the plane towards where the normal is pointing." +msgstr "" + +#: doc/classes/Plane.xml:162 +msgid "The [member normal]'s X component." +msgstr "" + +#: doc/classes/Plane.xml:165 +msgid "The [member normal]'s Y component." +msgstr "" + +#: doc/classes/Plane.xml:168 +msgid "The [member normal]'s Z component." +msgstr "" + +#: doc/classes/Plane.xml:173 +msgid "A plane that extends in the Y and Z axes." +msgstr "" + +#: doc/classes/Plane.xml:176 +msgid "A plane that extends in the X and Z axes." +msgstr "" + +#: doc/classes/Plane.xml:179 +msgid "A plane that extends in the X and Y axes." +msgstr "" + +#: doc/classes/PlaneMesh.xml:4 +msgid "Class representing a planar [PrimitiveMesh]." +msgstr "" + +#: doc/classes/PlaneMesh.xml:7 +msgid "" +"Class representing a planar [PrimitiveMesh]. This flat mesh does not have a " +"thickness. By default, this mesh is aligned on the X and Z axes; this " +"default rotation isn't suited for use with billboarded materials. For " +"billboarded materials, use [QuadMesh] instead." +msgstr "" + +#: doc/classes/PlaneMesh.xml:15 +msgid "Size of the generated plane." +msgstr "" + +#: doc/classes/PlaneMesh.xml:18 +msgid "Number of subdivision along the Z axis." +msgstr "" + +#: doc/classes/PlaneMesh.xml:21 +msgid "Number of subdivision along the X axis." +msgstr "" + +#: modules/gdnative/doc_classes/PluginScript.xml:14 +msgid "Returns a new instance of the script." +msgstr "" + +#: doc/classes/PointMesh.xml:4 +msgid "Mesh with a single Point primitive." +msgstr "" + +#: doc/classes/PointMesh.xml:7 +msgid "" +"The PointMesh is made from a single point. Instead of relying on triangles, " +"points are rendered as a single rectangle on the screen with a constant " +"size. They are intended to be used with Particle systems, but can be used as " +"a cheap way to render constant size billboarded sprites (for example in a " +"point cloud).\n" +"PointMeshes, must be used with a material that has a point size. Point size " +"can be accessed in a shader with [code]POINT_SIZE[/code], or in a " +"[BaseMaterial3D] by setting [member BaseMaterial3D.use_point_size] and the " +"variable [member BaseMaterial3D.point_size].\n" +"When using PointMeshes, properties that normally alter vertices will be " +"ignored, including billboard mode, grow, and cull face." +msgstr "" + +#: doc/classes/Polygon2D.xml:4 +msgid "A 2D polygon." +msgstr "" + +#: doc/classes/Polygon2D.xml:7 +msgid "" +"A Polygon2D is defined by a set of points. Each point is connected to the " +"next, with the final point being connected to the first, resulting in a " +"closed polygon. Polygon2Ds can be filled with color (solid or gradient) or " +"filled with a given texture." +msgstr "" + +#: doc/classes/Polygon2D.xml:20 +msgid "" +"Adds a bone with the specified [code]path[/code] and [code]weights[/code]." +msgstr "" + +#: doc/classes/Polygon2D.xml:27 +msgid "Removes all bones from this [Polygon2D]." +msgstr "" + +#: doc/classes/Polygon2D.xml:36 +msgid "Removes the specified bone from this [Polygon2D]." +msgstr "" + +#: doc/classes/Polygon2D.xml:43 +msgid "Returns the number of bones in this [Polygon2D]." +msgstr "" + +#: doc/classes/Polygon2D.xml:52 +msgid "Returns the path to the node associated with the specified bone." +msgstr "" + +#: doc/classes/Polygon2D.xml:61 +msgid "Returns the height values of the specified bone." +msgstr "" + +#: doc/classes/Polygon2D.xml:72 +msgid "Sets the path to the node associated with the specified bone." +msgstr "" + +#: doc/classes/Polygon2D.xml:83 +msgid "Sets the weight values for the specified bone." +msgstr "" + +#: doc/classes/Polygon2D.xml:89 +msgid "If [code]true[/code], polygon edges will be anti-aliased." +msgstr "" + +#: doc/classes/Polygon2D.xml:94 +msgid "" +"The polygon's fill color. If [code]texture[/code] is defined, it will be " +"multiplied by this color. It will also be the default color for vertices not " +"set in [code]vertex_colors[/code]." +msgstr "" + +#: doc/classes/Polygon2D.xml:99 +msgid "" +"Added padding applied to the bounding box when using [code]invert[/code]. " +"Setting this value too small may result in a \"Bad Polygon\" error." +msgstr "" + +#: doc/classes/Polygon2D.xml:102 +msgid "" +"If [code]true[/code], polygon will be inverted, containing the area outside " +"the defined points and extending to the [code]invert_border[/code]." +msgstr "" + +#: doc/classes/Polygon2D.xml:107 +msgid "The offset applied to each vertex." +msgstr "" + +#: doc/classes/Polygon2D.xml:110 +msgid "" +"The polygon's list of vertices. The final point will be connected to the " +"first.\n" +"[b]Note:[/b] This returns a copy of the [PackedVector2Array] rather than a " +"reference." +msgstr "" + +#: doc/classes/Polygon2D.xml:124 +msgid "" +"The polygon's fill texture. Use [code]uv[/code] to set texture coordinates." +msgstr "" + +#: doc/classes/Polygon2D.xml:127 +msgid "" +"Amount to offset the polygon's [code]texture[/code]. If [code](0, 0)[/code] " +"the texture's origin (its top-left corner) will be placed at the polygon's " +"[code]position[/code]." +msgstr "" + +#: doc/classes/Polygon2D.xml:130 +msgid "The texture's rotation in radians." +msgstr "" + +#: doc/classes/Polygon2D.xml:133 +msgid "The texture's rotation in degrees." +msgstr "" + +#: doc/classes/Polygon2D.xml:136 +msgid "" +"Amount to multiply the [code]uv[/code] coordinates when using a " +"[code]texture[/code]. Larger values make the texture smaller, and vice versa." +msgstr "" + +#: doc/classes/Polygon2D.xml:139 +msgid "" +"Texture coordinates for each vertex of the polygon. There should be one " +"[code]uv[/code] per polygon vertex. If there are fewer, undefined vertices " +"will use [code](0, 0)[/code]." +msgstr "" + +#: doc/classes/Polygon2D.xml:142 +msgid "" +"Color for each vertex. Colors are interpolated between vertices, resulting " +"in smooth gradients. There should be one per polygon vertex. If there are " +"fewer, undefined vertices will use [code]color[/code]." +msgstr "" + +#: doc/classes/Popup.xml:4 +msgid "Base container control for popups and dialogs." +msgstr "" + +#: doc/classes/Popup.xml:7 +msgid "" +"Popup is a base [Control] used to show dialogs and popups. It's a subwindow " +"and modal by default (see [Control]) and has helpers for custom popup " +"behavior." +msgstr "" + +#: doc/classes/Popup.xml:23 +msgid "Emitted when a popup is hidden." +msgstr "" + +#: doc/classes/PopupMenu.xml:4 +msgid "PopupMenu displays a list of options." +msgstr "" + +#: doc/classes/PopupMenu.xml:7 +msgid "" +"[PopupMenu] is a [Control] that displays a list of options. They are popular " +"in toolbars or context menus." +msgstr "" + +#: doc/classes/PopupMenu.xml:22 +msgid "" +"Adds a new checkable item with text [code]label[/code].\n" +"An [code]id[/code] can optionally be provided, as well as an accelerator " +"([code]accel[/code]). If no [code]id[/code] is provided, one will be created " +"from the index. If no [code]accel[/code] is provided then the default " +"[code]0[/code] will be assigned to it. See [method get_item_accelerator] for " +"more info on accelerators.\n" +"[b]Note:[/b] Checkable items just display a checkmark, but don't have any " +"built-in checking behavior and must be checked/unchecked manually. See " +"[method set_item_checked] for more info on how to control it." +msgstr "" + +#: doc/classes/PopupMenu.xml:37 +msgid "" +"Adds a new checkable item and assigns the specified [ShortCut] to it. Sets " +"the label of the checkbox to the [ShortCut]'s name.\n" +"An [code]id[/code] can optionally be provided. If no [code]id[/code] is " +"provided, one will be created from the index.\n" +"[b]Note:[/b] Checkable items just display a checkmark, but don't have any " +"built-in checking behavior and must be checked/unchecked manually. See " +"[method set_item_checked] for more info on how to control it." +msgstr "" + +#: doc/classes/PopupMenu.xml:54 +msgid "" +"Adds a new checkable item with text [code]label[/code] and icon " +"[code]texture[/code].\n" +"An [code]id[/code] can optionally be provided, as well as an accelerator " +"([code]accel[/code]). If no [code]id[/code] is provided, one will be created " +"from the index. If no [code]accel[/code] is provided then the default " +"[code]0[/code] will be assigned to it. See [method get_item_accelerator] for " +"more info on accelerators.\n" +"[b]Note:[/b] Checkable items just display a checkmark, but don't have any " +"built-in checking behavior and must be checked/unchecked manually. See " +"[method set_item_checked] for more info on how to control it." +msgstr "" + +#: doc/classes/PopupMenu.xml:71 +msgid "" +"Adds a new checkable item and assigns the specified [ShortCut] and icon " +"[code]texture[/code] to it. Sets the label of the checkbox to the " +"[ShortCut]'s name.\n" +"An [code]id[/code] can optionally be provided. If no [code]id[/code] is " +"provided, one will be created from the index.\n" +"[b]Note:[/b] Checkable items just display a checkmark, but don't have any " +"built-in checking behavior and must be checked/unchecked manually. See " +"[method set_item_checked] for more info on how to control it." +msgstr "" + +#: doc/classes/PopupMenu.xml:88 +msgid "" +"Adds a new item with text [code]label[/code] and icon [code]texture[/code].\n" +"An [code]id[/code] can optionally be provided, as well as an accelerator " +"([code]accel[/code]). If no [code]id[/code] is provided, one will be created " +"from the index. If no [code]accel[/code] is provided then the default " +"[code]0[/code] will be assigned to it. See [method get_item_accelerator] for " +"more info on accelerators." +msgstr "" + +#: doc/classes/PopupMenu.xml:104 +msgid "Same as [method add_icon_check_item], but uses a radio check button." +msgstr "" + +#: doc/classes/PopupMenu.xml:119 +msgid "" +"Same as [method add_icon_check_shortcut], but uses a radio check button." +msgstr "" + +#: doc/classes/PopupMenu.xml:134 +msgid "" +"Adds a new item and assigns the specified [ShortCut] and icon [code]texture[/" +"code] to it. Sets the label of the checkbox to the [ShortCut]'s name.\n" +"An [code]id[/code] can optionally be provided. If no [code]id[/code] is " +"provided, one will be created from the index." +msgstr "" + +#: doc/classes/PopupMenu.xml:148 +msgid "" +"Adds a new item with text [code]label[/code].\n" +"An [code]id[/code] can optionally be provided, as well as an accelerator " +"([code]accel[/code]). If no [code]id[/code] is provided, one will be created " +"from the index. If no [code]accel[/code] is provided then the default " +"[code]0[/code] will be assigned to it. See [method get_item_accelerator] for " +"more info on accelerators." +msgstr "" + +#: doc/classes/PopupMenu.xml:166 +msgid "" +"Adds a new multistate item with text [code]label[/code].\n" +"Contrarily to normal binary items, multistate items can have more than two " +"states, as defined by [code]max_states[/code]. Each press or activate of the " +"item will increase the state by one. The default value is defined by " +"[code]default_state[/code].\n" +"An [code]id[/code] can optionally be provided, as well as an accelerator " +"([code]accel[/code]). If no [code]id[/code] is provided, one will be created " +"from the index. If no [code]accel[/code] is provided then the default " +"[code]0[/code] will be assigned to it. See [method get_item_accelerator] for " +"more info on accelerators." +msgstr "" + +#: doc/classes/PopupMenu.xml:181 +msgid "" +"Adds a new radio check button with text [code]label[/code].\n" +"An [code]id[/code] can optionally be provided, as well as an accelerator " +"([code]accel[/code]). If no [code]id[/code] is provided, one will be created " +"from the index. If no [code]accel[/code] is provided then the default " +"[code]0[/code] will be assigned to it. See [method get_item_accelerator] for " +"more info on accelerators.\n" +"[b]Note:[/b] Checkable items just display a checkmark, but don't have any " +"built-in checking behavior and must be checked/unchecked manually. See " +"[method set_item_checked] for more info on how to control it." +msgstr "" + +#: doc/classes/PopupMenu.xml:196 +msgid "" +"Adds a new radio check button and assigns a [ShortCut] to it. Sets the label " +"of the checkbox to the [ShortCut]'s name.\n" +"An [code]id[/code] can optionally be provided. If no [code]id[/code] is " +"provided, one will be created from the index.\n" +"[b]Note:[/b] Checkable items just display a checkmark, but don't have any " +"built-in checking behavior and must be checked/unchecked manually. See " +"[method set_item_checked] for more info on how to control it." +msgstr "" + +#: doc/classes/PopupMenu.xml:207 +msgid "Adds a separator between items. Separators also occupy an index." +msgstr "" + +#: doc/classes/PopupMenu.xml:220 +msgid "" +"Adds a [ShortCut].\n" +"An [code]id[/code] can optionally be provided. If no [code]id[/code] is " +"provided, one will be created from the index." +msgstr "" + +#: doc/classes/PopupMenu.xml:234 +msgid "" +"Adds an item that will act as a submenu of the parent [PopupMenu] node when " +"clicked. The [code]submenu[/code] argument is the name of the child " +"[PopupMenu] node that will be shown when the item is clicked.\n" +"An [code]id[/code] can optionally be provided. If no [code]id[/code] is " +"provided, one will be created from the index." +msgstr "" + +#: doc/classes/PopupMenu.xml:242 +msgid "Removes all items from the [PopupMenu]." +msgstr "" + +#: doc/classes/PopupMenu.xml:251 +msgid "" +"Returns the accelerator of the item at index [code]idx[/code]. Accelerators " +"are special combinations of keys that activate the item, no matter which " +"control is focused." +msgstr "" + +#: doc/classes/PopupMenu.xml:258 +msgid "Returns the number of items in the [PopupMenu]." +msgstr "" + +#: doc/classes/PopupMenu.xml:276 +msgid "" +"Returns the id of the item at index [code]idx[/code]. [code]id[/code] can be " +"manually assigned, while index can not." +msgstr "" + +#: doc/classes/PopupMenu.xml:285 +msgid "" +"Returns the index of the item containing the specified [code]id[/code]. " +"Index is automatically assigned to each item by the engine. Index can not be " +"set manually." +msgstr "" + +#: doc/classes/PopupMenu.xml:294 +msgid "" +"Returns the metadata of the specified item, which might be of any type. You " +"can set it with [method set_item_metadata], which provides a simple way of " +"assigning context data to items." +msgstr "" + +#: doc/classes/PopupMenu.xml:303 +msgid "" +"Returns the [ShortCut] associated with the specified [code]idx[/code] item." +msgstr "" + +#: doc/classes/PopupMenu.xml:312 +msgid "" +"Returns the submenu name of the item at index [code]idx[/code]. See [method " +"add_submenu_item] for more info on how to add a submenu." +msgstr "" + +#: doc/classes/PopupMenu.xml:330 +msgid "" +"Returns the tooltip associated with the specified index index [code]idx[/" +"code]." +msgstr "" + +#: doc/classes/PopupMenu.xml:339 +msgid "" +"Returns [code]true[/code] if the item at index [code]idx[/code] is checkable " +"in some way, i.e. if it has a checkbox or radio button.\n" +"[b]Note:[/b] Checkable items just display a checkmark or radio button, but " +"don't have any built-in checking behavior and must be checked/unchecked " +"manually." +msgstr "" + +#: doc/classes/PopupMenu.xml:349 +msgid "" +"Returns [code]true[/code] if the item at index [code]idx[/code] is checked." +msgstr "" + +#: doc/classes/PopupMenu.xml:358 +msgid "" +"Returns [code]true[/code] if the item at index [code]idx[/code] is disabled. " +"When it is disabled it can't be selected, or its action invoked.\n" +"See [method set_item_disabled] for more info on how to disable an item." +msgstr "" + +#: doc/classes/PopupMenu.xml:368 +msgid "" +"Returns [code]true[/code] if the item at index [code]idx[/code] has radio " +"button-style checkability.\n" +"[b]Note:[/b] This is purely cosmetic; you must add the logic for checking/" +"unchecking items in radio groups." +msgstr "" + +#: doc/classes/PopupMenu.xml:378 +msgid "" +"Returns [code]true[/code] if the item is a separator. If it is, it will be " +"displayed as a line. See [method add_separator] for more info on how to add " +"a separator." +msgstr "" + +#: doc/classes/PopupMenu.xml:387 +msgid "Returns [code]true[/code] if the specified item's shortcut is disabled." +msgstr "" + +#: doc/classes/PopupMenu.xml:396 +msgid "" +"Removes the item at index [code]idx[/code] from the menu.\n" +"[b]Note:[/b] The indices of items after the removed item will be shifted by " +"one." +msgstr "" + +#: doc/classes/PopupMenu.xml:408 +msgid "" +"Sets the accelerator of the item at index [code]idx[/code]. Accelerators are " +"special combinations of keys that activate the item, no matter which control " +"is focused." +msgstr "" + +#: doc/classes/PopupMenu.xml:419 +msgid "" +"Sets whether the item at index [code]idx[/code] has a checkbox. If " +"[code]false[/code], sets the type of the item to plain text.\n" +"[b]Note:[/b] Checkable items just display a checkmark, but don't have any " +"built-in checking behavior and must be checked/unchecked manually." +msgstr "" + +#: doc/classes/PopupMenu.xml:431 +msgid "" +"Sets the type of the item at the specified index [code]idx[/code] to radio " +"button. If [code]false[/code], sets the type of the item to plain text." +msgstr "" + +#: doc/classes/PopupMenu.xml:442 +msgid "" +"Mark the item at index [code]idx[/code] as a separator, which means that it " +"would be displayed as a line. If [code]false[/code], sets the type of the " +"item to plain text." +msgstr "" + +#: doc/classes/PopupMenu.xml:453 +msgid "Sets the checkstate status of the item at index [code]idx[/code]." +msgstr "" + +#: doc/classes/PopupMenu.xml:464 +msgid "" +"Enables/disables the item at index [code]idx[/code]. When it is disabled, it " +"can't be selected and its action can't be invoked." +msgstr "" + +#: doc/classes/PopupMenu.xml:475 +msgid "Replaces the [Texture2D] icon of the specified [code]idx[/code]." +msgstr "" + +#: doc/classes/PopupMenu.xml:486 +msgid "Sets the [code]id[/code] of the item at index [code]idx[/code]." +msgstr "" + +#: doc/classes/PopupMenu.xml:497 +msgid "" +"Sets the metadata of an item, which may be of any type. You can later get it " +"with [method get_item_metadata], which provides a simple way of assigning " +"context data to items." +msgstr "" + +#: doc/classes/PopupMenu.xml:508 +msgid "" +"Sets the state of an multistate item. See [method add_multistate_item] for " +"details." +msgstr "" + +#: doc/classes/PopupMenu.xml:521 +msgid "Sets a [ShortCut] for the specified item [code]idx[/code]." +msgstr "" + +#: doc/classes/PopupMenu.xml:532 +msgid "Disables the [ShortCut] of the specified index [code]idx[/code]." +msgstr "" + +#: doc/classes/PopupMenu.xml:543 +msgid "" +"Sets the submenu of the item at index [code]idx[/code]. The submenu is the " +"name of a child [PopupMenu] node that would be shown when the item is " +"clicked." +msgstr "" + +#: doc/classes/PopupMenu.xml:565 +msgid "" +"Sets the [String] tooltip of the item at the specified index [code]idx[/" +"code]." +msgstr "" + +#: doc/classes/PopupMenu.xml:574 +msgid "" +"Toggles the check state of the item of the specified index [code]idx[/code]." +msgstr "" + +#: doc/classes/PopupMenu.xml:583 +msgid "" +"Cycle to the next state of an multistate item. See [method " +"add_multistate_item] for details." +msgstr "" + +#: doc/classes/PopupMenu.xml:589 +msgid "If [code]true[/code], allows to navigate [PopupMenu] with letter keys." +msgstr "" + +#: doc/classes/PopupMenu.xml:592 +msgid "" +"If [code]true[/code], hides the [PopupMenu] when a checkbox or radio button " +"is selected." +msgstr "" + +#: doc/classes/PopupMenu.xml:595 +msgid "If [code]true[/code], hides the [PopupMenu] when an item is selected." +msgstr "" + +#: doc/classes/PopupMenu.xml:598 +msgid "" +"If [code]true[/code], hides the [PopupMenu] when a state item is selected." +msgstr "" + +#: doc/classes/PopupMenu.xml:601 +msgid "" +"Sets the delay time in seconds for the submenu item to popup on mouse " +"hovering. If the popup menu is added as a child of another (acting as a " +"submenu), it will inherit the delay time of the parent menu item." +msgstr "" + +#: doc/classes/PopupMenu.xml:609 +msgid "" +"Emitted when user navigated to an item of some [code]id[/code] using " +"[code]ui_up[/code] or [code]ui_down[/code] action." +msgstr "" + +#: doc/classes/PopupMenu.xml:616 +msgid "" +"Emitted when an item of some [code]id[/code] is pressed or its accelerator " +"is activated." +msgstr "" + +#: doc/classes/PopupMenu.xml:623 +msgid "" +"Emitted when an item of some [code]index[/code] is pressed or its " +"accelerator is activated." +msgstr "" + +#: doc/classes/PopupMenu.xml:631 +msgid "[Texture2D] icon for the checked checkbox items." +msgstr "" + +#: doc/classes/PopupMenu.xml:634 +msgid "[Font] used for the menu items." +msgstr "" + +#: doc/classes/PopupMenu.xml:637 +msgid "The default text [Color] for menu items' names." +msgstr "" + +#: doc/classes/PopupMenu.xml:640 +msgid "" +"The text [Color] used for shortcuts and accelerators that show next to the " +"menu item name when defined. See [method get_item_accelerator] for more info " +"on accelerators." +msgstr "" + +#: doc/classes/PopupMenu.xml:643 +msgid "[Color] used for disabled menu items' text." +msgstr "" + +#: doc/classes/PopupMenu.xml:646 +msgid "[Color] used for the hovered text." +msgstr "" + +#: doc/classes/PopupMenu.xml:649 +msgid "[StyleBox] displayed when the [PopupMenu] item is hovered." +msgstr "" + +#: doc/classes/PopupMenu.xml:652 +msgid "" +"The horizontal space between the item's name and the shortcut text/submenu " +"arrow." +msgstr "" + +#: doc/classes/PopupMenu.xml:655 +msgid "" +"[StyleBox] for the left side of labeled separator. See [method " +"add_separator]." +msgstr "" + +#: doc/classes/PopupMenu.xml:658 +msgid "" +"[StyleBox] for the right side of labeled separator. See [method " +"add_separator]." +msgstr "" + +#: doc/classes/PopupMenu.xml:661 +msgid "Default [StyleBox] of the [PopupMenu] items." +msgstr "" + +#: doc/classes/PopupMenu.xml:664 +msgid "[StyleBox] used when the [PopupMenu] item is disabled." +msgstr "" + +#: doc/classes/PopupMenu.xml:667 +msgid "[Texture2D] icon for the checked radio button items." +msgstr "" + +#: doc/classes/PopupMenu.xml:670 +msgid "[Texture2D] icon for the unchecked radio button items." +msgstr "" + +#: doc/classes/PopupMenu.xml:673 +msgid "[StyleBox] used for the separators. See [method add_separator]." +msgstr "" + +#: doc/classes/PopupMenu.xml:676 +msgid "[Texture2D] icon for the submenu arrow." +msgstr "" + +#: doc/classes/PopupMenu.xml:679 +msgid "[Texture2D] icon for the unchecked checkbox items." +msgstr "" + +#: doc/classes/PopupMenu.xml:682 +msgid "The vertical space between each menu item." +msgstr "" + +#: doc/classes/PopupPanel.xml:4 +msgid "Class for displaying popups with a panel background." +msgstr "" + +#: doc/classes/PopupPanel.xml:7 +msgid "" +"Class for displaying popups with a panel background. In some cases it might " +"be simpler to use than [Popup], since it provides a configurable background. " +"If you are making windows, better check [Window]." +msgstr "" + +#: doc/classes/PopupPanel.xml:17 +msgid "The background panel style of this [PopupPanel]." +msgstr "" + +#: doc/classes/Position2D.xml:4 +msgid "Generic 2D position hint for editing." +msgstr "" + +#: doc/classes/Position2D.xml:7 +msgid "" +"Generic 2D position hint for editing. It's just like a plain [Node2D], but " +"it displays as a cross in the 2D editor at all times. You can set cross' " +"visual size by using the gizmo in the 2D editor while the node is selected." +msgstr "" + +#: doc/classes/Position3D.xml:4 +msgid "Generic 3D position hint for editing." +msgstr "" + +#: doc/classes/Position3D.xml:7 +msgid "" +"Generic 3D position hint for editing. It's just like a plain [Node3D], but " +"it displays as a cross in the 3D editor at all times." +msgstr "" + +#: doc/classes/PrimitiveMesh.xml:4 +msgid "" +"Base class for all primitive meshes. Handles applying a [Material] to a " +"primitive mesh." +msgstr "" + +#: doc/classes/PrimitiveMesh.xml:7 +msgid "" +"Base class for all primitive meshes. Handles applying a [Material] to a " +"primitive mesh. Examples include [CapsuleMesh], [CubeMesh], [CylinderMesh], " +"[PlaneMesh], [PrismMesh], [QuadMesh], and [SphereMesh]." +msgstr "" + +#: doc/classes/PrimitiveMesh.xml:16 +msgid "" +"Returns mesh arrays used to constitute surface of [Mesh]. Mesh arrays can be " +"used with [ArrayMesh] to create new surfaces." +msgstr "" + +#: doc/classes/PrimitiveMesh.xml:22 +msgid "" +"Overrides the [AABB] with one defined by user for use with frustum culling. " +"Especially useful to avoid unnexpected culling when using a shader to " +"offset vertices." +msgstr "" + +#: doc/classes/PrimitiveMesh.xml:25 +msgid "" +"If set, the order of the vertices in each triangle are reversed resulting in " +"the backside of the mesh being drawn.\n" +"This gives the same result as using [constant BaseMaterial3D.CULL_BACK] in " +"[member BaseMaterial3D.cull_mode]." +msgstr "" + +#: doc/classes/PrimitiveMesh.xml:29 +msgid "The current [Material] of the primitive mesh." +msgstr "" + +#: doc/classes/PrismMesh.xml:4 doc/classes/PrismMesh.xml:7 +msgid "Class representing a prism-shaped [PrimitiveMesh]." +msgstr "" + +#: doc/classes/PrismMesh.xml:15 +msgid "" +"Displacement of the upper edge along the X axis. 0.0 positions edge straight " +"above the bottom-left edge." +msgstr "" + +#: doc/classes/PrismMesh.xml:18 +msgid "Size of the prism." +msgstr "" + +#: doc/classes/PrismMesh.xml:21 +msgid "Number of added edge loops along the Z axis." +msgstr "" + +#: doc/classes/PrismMesh.xml:24 +msgid "Number of added edge loops along the Y axis." +msgstr "" + +#: doc/classes/PrismMesh.xml:27 +msgid "Number of added edge loops along the X axis." +msgstr "" + +#: doc/classes/ProceduralSkyMaterial.xml:4 +msgid "" +"A [Material] used with [Sky] to generate a background based on user input " +"parameters." +msgstr "" + +#: doc/classes/ProceduralSkyMaterial.xml:7 +msgid "" +"ProceduralSkyMaterial provides a way to create an effective background " +"quickly by defining procedural parameters for the sun, the sky and the " +"ground. The sky and ground are very similar, they are defined by a color at " +"the horizon, another color, and finally an easing curve to interpolate " +"between these two colors. Similarly, the sun is described by a position in " +"the sky, a color, and an easing curve. However, the sun also defines a " +"minimum and maximum angle, these two values define at what distance the " +"easing curve begins and ends from the sun, and thus end up defining the size " +"of the sun in the sky.\n" +"The [ProceduralSkyMaterial] uses a lightweight shader to draw the sky and is " +"thus suited for real time updates. When you do not need a quick sky that is " +"not realistic, this is a good option.\n" +"The [ProceduralSkyMaterial] supports up to 4 suns. Each sun takes its color, " +"energy, and direction from the corresponding [DirectionalLight3D] in the " +"scene." +msgstr "" + +#: doc/classes/ProceduralSkyMaterial.xml:17 +msgid "" +"Color of the ground at the bottom. Blends with [member ground_horizon_color]." +msgstr "" + +#: doc/classes/ProceduralSkyMaterial.xml:20 +msgid "" +"How quickly the [member ground_horizon_color] fades into the [member " +"ground_bottom_color]." +msgstr "" + +#: doc/classes/ProceduralSkyMaterial.xml:23 +msgid "Amount of energy contribution from the ground." +msgstr "" + +#: doc/classes/ProceduralSkyMaterial.xml:26 +msgid "" +"Color of the ground at the horizon. Blends with [member ground_bottom_color]." +msgstr "" + +#: doc/classes/ProceduralSkyMaterial.xml:29 +msgid "" +"How quickly the [member sky_horizon_color] fades into the [member " +"sky_top_color]." +msgstr "" + +#: doc/classes/ProceduralSkyMaterial.xml:32 +msgid "Amount of energy contribution from the sky." +msgstr "" + +#: doc/classes/ProceduralSkyMaterial.xml:35 +msgid "Color of the sky at the horizon. Blends with [member sky_top_color]." +msgstr "" + +#: doc/classes/ProceduralSkyMaterial.xml:38 +msgid "Color of the sky at the top. Blends with [member sky_horizon_color]." +msgstr "" + +#: doc/classes/ProceduralSkyMaterial.xml:41 +msgid "Distance from center of sun where it fades out completely." +msgstr "" + +#: doc/classes/ProceduralSkyMaterial.xml:44 +msgid "" +"How quickly the sun fades away between the edge of the sun disk and [member " +"sun_angle_max]." +msgstr "" + +#: doc/classes/ProgressBar.xml:4 +msgid "General-purpose progress bar." +msgstr "" + +#: doc/classes/ProgressBar.xml:7 +msgid "General-purpose progress bar. Shows fill percentage from right to left." +msgstr "" + +#: doc/classes/ProgressBar.xml:15 +msgid "If [code]true[/code], the fill percentage is displayed on the bar." +msgstr "" + +#: doc/classes/ProgressBar.xml:24 +msgid "The style of the background." +msgstr "" + +#: doc/classes/ProgressBar.xml:27 +msgid "The style of the progress (i.e. the part that fills the bar)." +msgstr "" + +#: doc/classes/ProgressBar.xml:30 +msgid "" +"Font used to draw the fill percentage if [member percent_visible] is " +"[code]true[/code]." +msgstr "" + +#: doc/classes/ProgressBar.xml:33 +msgid "The color of the text." +msgstr "" + +#: doc/classes/ProgressBar.xml:36 +msgid "The color of the text's shadow." +msgstr "" + +#: doc/classes/ProjectSettings.xml:4 +msgid "Contains global variables accessible from everywhere." +msgstr "" + +#: doc/classes/ProjectSettings.xml:7 +msgid "" +"Contains global variables accessible from everywhere. Use [method " +"get_setting], [method set_setting] or [method has_setting] to access them. " +"Variables stored in [code]project.godot[/code] are also loaded into " +"ProjectSettings, making this object very useful for reading custom game " +"configuration options.\n" +"When naming a Project Settings property, use the full path to the setting " +"including the category. For example, [code]\"application/config/name\"[/" +"code] for the project name. Category and property names can be viewed in the " +"Project Settings dialog.\n" +"[b]Overriding:[/b] Any project setting can be overridden by creating a file " +"named [code]override.cfg[/code] in the project's root directory. This can " +"also be used in exported projects by placing this file in the same directory " +"as the project binary." +msgstr "" + +#: doc/classes/ProjectSettings.xml:20 +msgid "" +"Adds a custom property info to a property. The dictionary must contain:\n" +"- [code]name[/code]: [String] (the property's name)\n" +"- [code]type[/code]: [int] (see [enum Variant.Type])\n" +"- optionally [code]hint[/code]: [int] (see [enum PropertyHint]) and " +"[code]hint_string[/code]: [String]\n" +"[b]Example:[/b]\n" +"[codeblock]\n" +"ProjectSettings.set(\"category/property_name\", 0)\n" +"\n" +"var property_info = {\n" +" \"name\": \"category/property_name\",\n" +" \"type\": TYPE_INT,\n" +" \"hint\": PROPERTY_HINT_ENUM,\n" +" \"hint_string\": \"one,two,three\"\n" +"}\n" +"\n" +"ProjectSettings.add_property_info(property_info)\n" +"[/codeblock]" +msgstr "" + +#: doc/classes/ProjectSettings.xml:45 +msgid "Clears the whole configuration (not recommended, may break things)." +msgstr "" + +#: doc/classes/ProjectSettings.xml:54 +msgid "" +"Returns the order of a configuration value (influences when saved to the " +"config file)." +msgstr "" + +#: doc/classes/ProjectSettings.xml:63 +msgid "" +"Returns the value of a setting.\n" +"[b]Example:[/b]\n" +"[codeblock]\n" +"print(ProjectSettings.get_setting(\"application/config/name\"))\n" +"[/codeblock]" +msgstr "" + +#: doc/classes/ProjectSettings.xml:76 +msgid "" +"Converts a localized path ([code]res://[/code]) to a full native OS path." +msgstr "" + +#: doc/classes/ProjectSettings.xml:85 +msgid "Returns [code]true[/code] if a configuration value is present." +msgstr "" + +#: doc/classes/ProjectSettings.xml:96 +msgid "" +"Loads the contents of the .pck or .zip file specified by [code]pack[/code] " +"into the resource filesystem ([code]res://[/code]). Returns [code]true[/" +"code] on success.\n" +"[b]Note:[/b] If a file from [code]pack[/code] shares the same path as a file " +"already in the resource filesystem, any attempts to load that file will use " +"the file from [code]pack[/code] unless [code]replace_files[/code] is set to " +"[code]false[/code]." +msgstr "" + +#: doc/classes/ProjectSettings.xml:106 +msgid "Convert a path to a localized path ([code]res://[/code] path)." +msgstr "" + +#: doc/classes/ProjectSettings.xml:115 +msgid "" +"Returns [code]true[/code] if the specified property exists and its initial " +"value differs from the current value." +msgstr "" + +#: doc/classes/ProjectSettings.xml:124 +msgid "" +"Returns the specified property's initial value. Returns [code]null[/code] if " +"the property does not exist." +msgstr "" + +#: doc/classes/ProjectSettings.xml:131 +msgid "Saves the configuration to the [code]project.godot[/code] file." +msgstr "" + +#: doc/classes/ProjectSettings.xml:140 +msgid "Saves the configuration to a custom file." +msgstr "" + +#: doc/classes/ProjectSettings.xml:151 +msgid "" +"Sets the specified property's initial value. This is the value the property " +"reverts to." +msgstr "" + +#: doc/classes/ProjectSettings.xml:162 +msgid "" +"Sets the order of a configuration value (influences when saved to the config " +"file)." +msgstr "" + +#: doc/classes/ProjectSettings.xml:173 +msgid "" +"Sets the value of a setting.\n" +"[b]Example:[/b]\n" +"[codeblock]\n" +"ProjectSettings.set_setting(\"application/config/name\", \"Example\")\n" +"[/codeblock]" +msgstr "" + +#: doc/classes/ProjectSettings.xml:183 +msgid "Background color for the boot splash." +msgstr "" + +#: doc/classes/ProjectSettings.xml:186 +msgid "" +"If [code]true[/code], scale the boot splash image to the full window length " +"when engine starts. If [code]false[/code], the engine will leave it at the " +"default pixel size." +msgstr "" + +#: doc/classes/ProjectSettings.xml:189 +msgid "Path to an image used as the boot splash." +msgstr "" + +#: doc/classes/ProjectSettings.xml:192 +msgid "" +"If [code]true[/code], applies linear filtering when scaling the image " +"(recommended for high resolution artwork). If [code]false[/code], uses " +"nearest-neighbor interpolation (recommended for pixel art)." +msgstr "" + +#: doc/classes/ProjectSettings.xml:195 +msgid "" +"This user directory is used for storing persistent data ([code]user://[/" +"code] filesystem). If left empty, [code]user://[/code] resolves to a project-" +"specific folder in Godot's own configuration folder (see [method OS." +"get_user_data_dir]). If a custom directory name is defined, this name will " +"be used instead and appended to the system-specific user data directory " +"(same parent folder as the Godot configuration folder documented in [method " +"OS.get_user_data_dir]).\n" +"The [member application/config/use_custom_user_dir] setting must be enabled " +"for this to take effect." +msgstr "" + +#: doc/classes/ProjectSettings.xml:199 +msgid "" +"The project's description, displayed as a tooltip in the Project Manager " +"when hovering the project." +msgstr "" + +#: doc/classes/ProjectSettings.xml:202 +msgid "" +"Icon used for the project, set when project loads. Exporters will also use " +"this icon when possible." +msgstr "" + +#: doc/classes/ProjectSettings.xml:205 +msgid "" +"Icon set in [code].icns[/code] format used on macOS to set the game's icon. " +"This is done automatically on start by calling [method DisplayServer." +"set_native_icon]." +msgstr "" + +#: doc/classes/ProjectSettings.xml:208 +msgid "" +"The project's name. It is used both by the Project Manager and by exporters. " +"The project name can be translated by translating its value in localization " +"files." +msgstr "" + +#: doc/classes/ProjectSettings.xml:211 +msgid "" +"Specifies a file to override project settings. For example: [code]user://" +"custom_settings.cfg[/code].\n" +"[b]Note:[/b] Regardless of this setting's value, [code]res://override.cfg[/" +"code] will still be read to override the project settings (see this class' " +"description at the top)." +msgstr "" + +#: doc/classes/ProjectSettings.xml:215 +msgid "" +"If [code]true[/code], the project will save user data to its own user " +"directory (see [member application/config/custom_user_dir_name]). This " +"setting is only effective on desktop platforms. A name must be set in the " +"[member application/config/custom_user_dir_name] setting for this to take " +"effect. If [code]false[/code], the project will save user data to [code](OS " +"user data directory)/Godot/app_userdata/(project name)[/code]." +msgstr "" + +#: doc/classes/ProjectSettings.xml:218 +msgid "" +"Icon set in [code].ico[/code] format used on Windows to set the game's icon. " +"This is done automatically on start by calling [method DisplayServer." +"set_native_icon]." +msgstr "" + +#: doc/classes/ProjectSettings.xml:221 +msgid "" +"If [code]true[/code], disables printing to standard error in an exported " +"build." +msgstr "" + +#: doc/classes/ProjectSettings.xml:224 +msgid "" +"If [code]true[/code], disables printing to standard output in an exported " +"build." +msgstr "" + +#: doc/classes/ProjectSettings.xml:227 +msgid "" +"Forces a delay between frames in the main loop (in milliseconds). This may " +"be useful if you plan to disable vertical synchronization." +msgstr "" + +#: doc/classes/ProjectSettings.xml:230 +msgid "" +"If [code]true[/code], enables low-processor usage mode. This setting only " +"works on desktop platforms. The screen is not redrawn if nothing changes " +"visually. This is meant for writing applications and editors, but is pretty " +"useless (and can hurt performance) in most games." +msgstr "" + +#: doc/classes/ProjectSettings.xml:233 +msgid "" +"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/ProjectSettings.xml:236 +msgid "Path to the main scene file that will be loaded when the project runs." +msgstr "" + +#: doc/classes/ProjectSettings.xml:239 doc/classes/ProjectSettings.xml:242 +msgid "" +"Audio buses will disable automatically when sound goes below a given dB " +"threshold for a given time. This saves CPU as effects assigned to that bus " +"will no longer do any processing." +msgstr "" + +#: doc/classes/ProjectSettings.xml:245 +msgid "" +"Default [AudioBusLayout] resource file to use in the project, unless " +"overridden by the scene." +msgstr "" + +#: doc/classes/ProjectSettings.xml:248 +msgid "" +"Specifies the audio driver to use. This setting is platform-dependent as " +"each platform supports different audio drivers. If left empty, the default " +"audio driver will be used." +msgstr "" + +#: doc/classes/ProjectSettings.xml:251 +msgid "" +"If [code]true[/code], microphone input will be allowed. This requires " +"appropriate permissions to be set when exporting to Android or iOS." +msgstr "" + +#: doc/classes/ProjectSettings.xml:254 +msgid "" +"Mixing rate used for audio. In general, it's better to not touch this and " +"leave it to the host operating system." +msgstr "" + +#: doc/classes/ProjectSettings.xml:257 +msgid "" +"Output latency in milliseconds for audio. Lower values will result in lower " +"audio latency at the cost of increased CPU usage. Low values may result in " +"audible cracking on slower hardware." +msgstr "" + +#: doc/classes/ProjectSettings.xml:260 +msgid "" +"Setting to hardcode audio delay when playing video. Best to leave this " +"untouched unless you know what you are doing." +msgstr "" + +#: doc/classes/ProjectSettings.xml:263 +msgid "" +"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 "" +"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 "" +"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 [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. Higher values can result in better " +"compression, but will require more memory when compressing and decompressing." +msgstr "" + +#: doc/classes/ProjectSettings.xml:278 +msgid "" +"If [code]true[/code], displays getters and setters in autocompletion results " +"in the script editor. This setting is meant to be used when porting old " +"projects (Godot 2), as using member variables is the preferred style from " +"Godot 3 onwards." +msgstr "" + +#: doc/classes/ProjectSettings.xml:281 +msgid "" +"If [code]true[/code], enables warnings when a constant is used as a function." +msgstr "" + +#: doc/classes/ProjectSettings.xml:284 +msgid "" +"If [code]true[/code], enables warnings when deprecated keywords are used." +msgstr "" + +#: doc/classes/ProjectSettings.xml:287 +msgid "" +"If [code]true[/code], enables specific GDScript warnings (see [code]debug/" +"gdscript/warnings/*[/code] settings). If [code]false[/code], disables all " +"GDScript warnings." +msgstr "" + +#: doc/classes/ProjectSettings.xml:290 +msgid "" +"If [code]true[/code], scripts in the [code]res://addons[/code] folder will " +"not generate warnings." +msgstr "" + +#: doc/classes/ProjectSettings.xml:293 +msgid "" +"If [code]true[/code], enables warnings when a function is declared with the " +"same name as a constant." +msgstr "" + +#: doc/classes/ProjectSettings.xml:296 +msgid "" +"If [code]true[/code], enables warnings when a function is declared with the " +"same name as a variable. This will turn into an error in a future version " +"when first-class functions become supported in GDScript." +msgstr "" + +#: doc/classes/ProjectSettings.xml:299 +msgid "" +"If [code]true[/code], enables warnings when a function assigned to a " +"variable may yield and return a function state instead of a value." +msgstr "" + +#: doc/classes/ProjectSettings.xml:302 +msgid "" +"If [code]true[/code], enables warnings when using a function as if it was a " +"property." +msgstr "" + +#: doc/classes/ProjectSettings.xml:305 +msgid "" +"If [code]true[/code], enables warnings when a ternary operator may emit " +"values with incompatible types." +msgstr "" + +#: doc/classes/ProjectSettings.xml:308 +msgid "" +"If [code]true[/code], enables warnings when dividing an integer by another " +"integer (the decimal part will be discarded)." +msgstr "" + +#: doc/classes/ProjectSettings.xml:311 +msgid "" +"If [code]true[/code], enables warnings when passing a floating-point value " +"to a function that expects an integer (it will be converted and lose " +"precision)." +msgstr "" + +#: doc/classes/ProjectSettings.xml:314 +msgid "" +"If [code]true[/code], enables warnings when using a property as if it was a " +"function." +msgstr "" + +#: doc/classes/ProjectSettings.xml:317 +msgid "" +"If [code]true[/code], enables warnings when calling a function without using " +"its return value (by assigning it to a variable or using it as a function " +"argument). Such return values are sometimes used to denote possible errors " +"using the [enum Error] enum." +msgstr "" + +#: doc/classes/ProjectSettings.xml:320 +msgid "" +"If [code]true[/code], enables warnings when defining a local or subclass " +"member variable that would shadow a variable at an upper level (such as a " +"member variable)." +msgstr "" + +#: doc/classes/ProjectSettings.xml:323 +msgid "" +"If [code]true[/code], enables warnings when calling an expression that has " +"no effect on the surrounding code, such as writing [code]2 + 2[/code] as a " +"statement." +msgstr "" + +#: doc/classes/ProjectSettings.xml:326 +msgid "" +"If [code]true[/code], enables warnings when calling a ternary expression " +"that has no effect on the surrounding code, such as writing [code]42 if " +"active else 0[/code] as a statement." +msgstr "" + +#: doc/classes/ProjectSettings.xml:329 +msgid "" +"If [code]true[/code], all warnings will be reported as if they were errors." +msgstr "" + +#: doc/classes/ProjectSettings.xml:332 +msgid "" +"If [code]true[/code], enables warnings when using a variable that wasn't " +"previously assigned." +msgstr "" + +#: doc/classes/ProjectSettings.xml:335 +msgid "" +"If [code]true[/code], enables warnings when assigning a variable using an " +"assignment operator like [code]+=[/code] if the variable wasn't previously " +"assigned." +msgstr "" + +#: doc/classes/ProjectSettings.xml:338 +msgid "" +"If [code]true[/code], enables warnings when unreachable code is detected " +"(such as after a [code]return[/code] statement that will always be executed)." +msgstr "" + +#: doc/classes/ProjectSettings.xml:341 +msgid "" +"If [code]true[/code], enables warnings when using an expression whose type " +"may not be compatible with the function parameter expected." +msgstr "" + +#: doc/classes/ProjectSettings.xml:344 +msgid "If [code]true[/code], enables warnings when performing an unsafe cast." +msgstr "" + +#: doc/classes/ProjectSettings.xml:347 +msgid "" +"If [code]true[/code], enables warnings when calling a method whose presence " +"is not guaranteed at compile-time in the class." +msgstr "" + +#: doc/classes/ProjectSettings.xml:350 +msgid "" +"If [code]true[/code], enables warnings when accessing a property whose " +"presence is not guaranteed at compile-time in the class." +msgstr "" + +#: doc/classes/ProjectSettings.xml:353 +msgid "" +"If [code]true[/code], enables warnings when a function parameter is unused." +msgstr "" + +#: doc/classes/ProjectSettings.xml:356 +msgid "" +"If [code]true[/code], enables warnings when a member variable is unused." +msgstr "" + +#: doc/classes/ProjectSettings.xml:359 +msgid "If [code]true[/code], enables warnings when a signal is unused." +msgstr "" + +#: doc/classes/ProjectSettings.xml:362 +msgid "If [code]true[/code], enables warnings when a local variable is unused." +msgstr "" + +#: doc/classes/ProjectSettings.xml:365 +msgid "" +"If [code]true[/code], enables warnings when a variable is declared with the " +"same name as a function. This will turn into an error in a future version " +"when first-class functions become supported in GDScript." +msgstr "" + +#: doc/classes/ProjectSettings.xml:368 +msgid "" +"If [code]true[/code], enables warnings when assigning the result of a " +"function that returns [code]void[/code] to a variable." +msgstr "" + +#: doc/classes/ProjectSettings.xml:371 +msgid "Message to be displayed before the backtrace when the engine crashes." +msgstr "" + +#: doc/classes/ProjectSettings.xml:374 +msgid "" +"Maximum number of frames per second allowed. The actual number of frames per " +"second may still be below this value if the game is lagging.\n" +"If [member display/window/vsync/use_vsync] is enabled, it takes precedence " +"and the forced FPS number cannot exceed the monitor's refresh rate.\n" +"This setting is therefore mostly relevant for lowering the maximum FPS below " +"VSync, e.g. to perform non real-time rendering of static frames, or test the " +"project under lag conditions." +msgstr "" + +#: doc/classes/ProjectSettings.xml:379 +msgid "Maximum call stack allowed for debugging GDScript." +msgstr "" + +#: doc/classes/ProjectSettings.xml:382 +msgid "Maximum amount of functions per frame allowed when profiling." +msgstr "" + +#: doc/classes/ProjectSettings.xml:385 +msgid "Print frames per second to standard output every second." +msgstr "" + +#: doc/classes/ProjectSettings.xml:388 +msgid "" +"Print more information to standard output when running. It displays " +"information such as memory leaks, which scenes and resources are being " +"loaded, etc." +msgstr "" + +#: doc/classes/ProjectSettings.xml:391 +msgid "Maximum call stack in visual scripting, to avoid infinite recursion." +msgstr "" + +#: doc/classes/ProjectSettings.xml:394 +msgid "" +"Color of the contact points between collision shapes, visible when \"Visible " +"Collision Shapes\" is enabled in the Debug menu." +msgstr "" + +#: doc/classes/ProjectSettings.xml:397 +msgid "" +"Maximum number of contact points between collision shapes to display when " +"\"Visible Collision Shapes\" is enabled in the Debug menu." +msgstr "" + +#: doc/classes/ProjectSettings.xml:400 +msgid "" +"Color of the collision shapes, visible when \"Visible Collision Shapes\" is " +"enabled in the Debug menu." +msgstr "" + +#: doc/classes/ProjectSettings.xml:403 +msgid "" +"Color of the disabled navigation geometry, visible when \"Visible Navigation" +"\" is enabled in the Debug menu." +msgstr "" + +#: doc/classes/ProjectSettings.xml:406 +msgid "" +"Color of the navigation geometry, visible when \"Visible Navigation\" is " +"enabled in the Debug menu." +msgstr "" + +#: doc/classes/ProjectSettings.xml:409 +msgid "Custom image for the mouse cursor (limited to 256×256)." +msgstr "" + +#: doc/classes/ProjectSettings.xml:412 +msgid "Hotspot for the custom mouse cursor image." +msgstr "" + +#: doc/classes/ProjectSettings.xml:415 +msgid "Position offset for tooltips, relative to the mouse cursor's hotspot." +msgstr "" + +#: doc/classes/ProjectSettings.xml:418 +msgid "" +"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." +msgstr "" + +#: doc/classes/ProjectSettings.xml:421 +msgid "" +"If [code]true[/code], keeps the screen on (even in case of inactivity), so " +"the screensaver does not take over. Works on desktop and mobile platforms." +msgstr "" + +#: doc/classes/ProjectSettings.xml:424 +msgid "Default orientation on mobile devices." +msgstr "" + +#: doc/classes/ProjectSettings.xml:427 +msgid "" +"If [code]true[/code], the home indicator is hidden automatically. This only " +"affects iOS devices without a physical home button." +msgstr "" + +#: doc/classes/ProjectSettings.xml:430 +msgid "Force the window to be always on top." +msgstr "" + +#: doc/classes/ProjectSettings.xml:433 +msgid "Force the window to be borderless." +msgstr "" + +#: doc/classes/ProjectSettings.xml:436 +msgid "Sets the window to full screen when it starts." +msgstr "" + +#: doc/classes/ProjectSettings.xml:439 +msgid "" +"Sets the game's main viewport height. On desktop platforms, this is the " +"default window size. Stretch mode settings also use this as a reference when " +"enabled." +msgstr "" + +#: doc/classes/ProjectSettings.xml:442 +msgid "Allows the window to be resizable by default." +msgstr "" + +#: doc/classes/ProjectSettings.xml:445 +msgid "" +"If greater than zero, overrides the window height when running the game. " +"Useful for testing stretch modes." +msgstr "" + +#: doc/classes/ProjectSettings.xml:448 +msgid "" +"If greater than zero, overrides the window width when running the game. " +"Useful for testing stretch modes." +msgstr "" + +#: doc/classes/ProjectSettings.xml:451 +msgid "" +"Sets the game's main viewport width. On desktop platforms, this is the " +"default window size. Stretch mode settings also use this as a reference when " +"enabled." +msgstr "" + +#: doc/classes/ProjectSettings.xml:454 +msgid "" +"If [code]true[/code], enables vertical synchronization. This eliminates " +"tearing that may appear in moving scenes, at the cost of higher input " +"latency and stuttering at lower framerates. If [code]false[/code], vertical " +"synchronization will be disabled, however, many platforms will enforce it " +"regardless (such as mobile platforms and HTML5)." +msgstr "" + +#: doc/classes/ProjectSettings.xml:457 +msgid "" +"If [code]Use Vsync[/code] is enabled and this setting is [code]true[/code], " +"enables vertical synchronization via the operating system's window " +"compositor when in windowed mode and the compositor is enabled. This will " +"prevent stutter in certain situations. (Windows only.)\n" +"[b]Note:[/b] This option is experimental and meant to alleviate stutter " +"experienced by some users. However, some users have experienced a Vsync " +"framerate halving (e.g. from 60 FPS to 30 FPS) when using it." +msgstr "" + +#: doc/classes/ProjectSettings.xml:461 +msgid "" +"Search path for project-specific script templates. Script templates will be " +"search both in the editor-specific path and in this project-specific path." +msgstr "" + +#: doc/classes/ProjectSettings.xml:464 +msgid "" +"Text-based file extensions to include in the script editor's \"Find in Files" +"\" feature. You can add e.g. [code]tscn[/code] if you wish to also parse " +"your scene files, especially if you use built-in scripts which are " +"serialized in the scene files." +msgstr "" + +#: doc/classes/ProjectSettings.xml:467 +msgid "" +"Default value for [member ScrollContainer.scroll_deadzone], which will be " +"used for all [ScrollContainer]s unless overridden." +msgstr "" + +#: doc/classes/ProjectSettings.xml:470 +msgid "" +"If [code]true[/code], swaps OK and Cancel buttons in dialogs on Windows and " +"UWP to follow interface conventions." +msgstr "" + +#: 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:478 +msgid "" +"Path to a custom [Font] resource to use as default for all GUI elements of " +"the project." +msgstr "" + +#: doc/classes/ProjectSettings.xml:481 +msgid "If [code]true[/code], makes sure the theme used works with HiDPI." +msgstr "" + +#: doc/classes/ProjectSettings.xml:484 +msgid "" +"Timer setting for incremental search in [Tree], [ItemList], etc. controls " +"(in milliseconds)." +msgstr "" + +#: doc/classes/ProjectSettings.xml:487 +msgid "Timer for detecting idle in [TextEdit] (in seconds)." +msgstr "" + +#: doc/classes/ProjectSettings.xml:490 +msgid "Default delay for tooltips (in seconds)." +msgstr "" + +#: doc/classes/ProjectSettings.xml:493 +msgid "" +"Default [InputEventAction] to confirm a focused button, menu or list item, " +"or validate input.\n" +"[b]Note:[/b] Default [code]ui_*[/code] actions cannot be removed as they are " +"necessary for the internal logic of several [Control]s. The events assigned " +"to the action can however be modified." +msgstr "" + +#: 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 " +"necessary for the internal logic of several [Control]s. The events assigned " +"to the action can however be modified." +msgstr "" + +#: 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 " +"necessary for the internal logic of several [Control]s. The events assigned " +"to the action can however be modified." +msgstr "" + +#: 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 " +"KEY_END] on typical desktop UI systems.\n" +"[b]Note:[/b] Default [code]ui_*[/code] actions cannot be removed as they are " +"necessary for the internal logic of several [Control]s. The events assigned " +"to the action can however be modified." +msgstr "" + +#: 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" +"[b]Note:[/b] Default [code]ui_*[/code] actions cannot be removed as they are " +"necessary for the internal logic of several [Control]s. The events assigned " +"to the action can however be modified." +msgstr "" + +#: 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" +"[b]Note:[/b] Default [code]ui_*[/code] actions cannot be removed as they are " +"necessary for the internal logic of several [Control]s. The events assigned " +"to the action can however be modified." +msgstr "" + +#: 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 " +"KEY_HOME] on typical desktop UI systems.\n" +"[b]Note:[/b] Default [code]ui_*[/code] actions cannot be removed as they are " +"necessary for the internal logic of several [Control]s. The events assigned " +"to the action can however be modified." +msgstr "" + +#: 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 " +"necessary for the internal logic of several [Control]s. The events assigned " +"to the action can however be modified." +msgstr "" + +#: 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 " +"typical desktop UI systems.\n" +"[b]Note:[/b] Default [code]ui_*[/code] actions cannot be removed as they are " +"necessary for the internal logic of several [Control]s. The events assigned " +"to the action can however be modified." +msgstr "" + +#: 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 " +"typical desktop UI systems.\n" +"[b]Note:[/b] Default [code]ui_*[/code] actions cannot be removed as they are " +"necessary for the internal logic of several [Control]s. The events assigned " +"to the action can however be modified." +msgstr "" + +#: 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 " +"necessary for the internal logic of several [Control]s. The events assigned " +"to the action can however be modified." +msgstr "" + +#: doc/classes/ProjectSettings.xml:537 +msgid "" +"Default [InputEventAction] to select an item in a [Control] (e.g. in an " +"[ItemList] or a [Tree]).\n" +"[b]Note:[/b] Default [code]ui_*[/code] actions cannot be removed as they are " +"necessary for the internal logic of several [Control]s. The events assigned " +"to the action can however be modified." +msgstr "" + +#: 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 " +"necessary for the internal logic of several [Control]s. The events assigned " +"to the action can however be modified." +msgstr "" + +#: 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:548 +msgid "" +"If [code]true[/code], sends touch input events when clicking or dragging the " +"mouse." +msgstr "" + +#: doc/classes/ProjectSettings.xml:551 +msgid "Optional name for the 2D physics layer 1." +msgstr "" + +#: doc/classes/ProjectSettings.xml:554 +msgid "Optional name for the 2D physics layer 10." +msgstr "" + +#: doc/classes/ProjectSettings.xml:557 +msgid "Optional name for the 2D physics layer 11." +msgstr "" + +#: doc/classes/ProjectSettings.xml:560 +msgid "Optional name for the 2D physics layer 12." +msgstr "" + +#: doc/classes/ProjectSettings.xml:563 +msgid "Optional name for the 2D physics layer 13." +msgstr "" + +#: doc/classes/ProjectSettings.xml:566 +msgid "Optional name for the 2D physics layer 14." +msgstr "" + +#: doc/classes/ProjectSettings.xml:569 +msgid "Optional name for the 2D physics layer 15." +msgstr "" + +#: doc/classes/ProjectSettings.xml:572 +msgid "Optional name for the 2D physics layer 16." +msgstr "" + +#: doc/classes/ProjectSettings.xml:575 +msgid "Optional name for the 2D physics layer 17." +msgstr "" + +#: doc/classes/ProjectSettings.xml:578 +msgid "Optional name for the 2D physics layer 18." +msgstr "" + +#: doc/classes/ProjectSettings.xml:581 +msgid "Optional name for the 2D physics layer 19." +msgstr "" + +#: doc/classes/ProjectSettings.xml:584 +msgid "Optional name for the 2D physics layer 2." +msgstr "" + +#: doc/classes/ProjectSettings.xml:587 +msgid "Optional name for the 2D physics layer 20." +msgstr "" + +#: doc/classes/ProjectSettings.xml:590 +msgid "Optional name for the 2D physics layer 3." +msgstr "" + +#: doc/classes/ProjectSettings.xml:593 +msgid "Optional name for the 2D physics layer 4." +msgstr "" + +#: doc/classes/ProjectSettings.xml:596 +msgid "Optional name for the 2D physics layer 5." +msgstr "" + +#: doc/classes/ProjectSettings.xml:599 +msgid "Optional name for the 2D physics layer 6." +msgstr "" + +#: doc/classes/ProjectSettings.xml:602 +msgid "Optional name for the 2D physics layer 7." +msgstr "" + +#: doc/classes/ProjectSettings.xml:605 +msgid "Optional name for the 2D physics layer 8." +msgstr "" + +#: doc/classes/ProjectSettings.xml:608 +msgid "Optional name for the 2D physics layer 9." +msgstr "" + +#: doc/classes/ProjectSettings.xml:611 +msgid "Optional name for the 2D render layer 1." +msgstr "" + +#: doc/classes/ProjectSettings.xml:614 +msgid "Optional name for the 2D render layer 10." +msgstr "" + +#: doc/classes/ProjectSettings.xml:617 +msgid "Optional name for the 2D render layer 11." +msgstr "" + +#: doc/classes/ProjectSettings.xml:620 +msgid "Optional name for the 2D render layer 12." +msgstr "" + +#: doc/classes/ProjectSettings.xml:623 +msgid "Optional name for the 2D render layer 13." +msgstr "" + +#: doc/classes/ProjectSettings.xml:626 +msgid "Optional name for the 2D render layer 14." +msgstr "" + +#: doc/classes/ProjectSettings.xml:629 +msgid "Optional name for the 2D render layer 15." +msgstr "" + +#: doc/classes/ProjectSettings.xml:632 +msgid "Optional name for the 2D render layer 16." +msgstr "" + +#: doc/classes/ProjectSettings.xml:635 +msgid "Optional name for the 2D render layer 17." +msgstr "" + +#: doc/classes/ProjectSettings.xml:638 +msgid "Optional name for the 2D render layer 18." +msgstr "" + +#: doc/classes/ProjectSettings.xml:641 +msgid "Optional name for the 2D render layer 19." +msgstr "" + +#: doc/classes/ProjectSettings.xml:644 +msgid "Optional name for the 2D render layer 2." +msgstr "" + +#: doc/classes/ProjectSettings.xml:647 +msgid "Optional name for the 2D render layer 20." +msgstr "" + +#: doc/classes/ProjectSettings.xml:650 +msgid "Optional name for the 2D render layer 3." +msgstr "" + +#: doc/classes/ProjectSettings.xml:653 +msgid "Optional name for the 2D render layer 4." +msgstr "" + +#: doc/classes/ProjectSettings.xml:656 +msgid "Optional name for the 2D render layer 5." +msgstr "" + +#: doc/classes/ProjectSettings.xml:659 +msgid "Optional name for the 2D render layer 6." +msgstr "" + +#: doc/classes/ProjectSettings.xml:662 +msgid "Optional name for the 2D render layer 7." +msgstr "" + +#: doc/classes/ProjectSettings.xml:665 +msgid "Optional name for the 2D render layer 8." +msgstr "" + +#: doc/classes/ProjectSettings.xml:668 +msgid "Optional name for the 2D render layer 9." +msgstr "" + +#: doc/classes/ProjectSettings.xml:671 +msgid "Optional name for the 3D physics layer 1." +msgstr "" + +#: doc/classes/ProjectSettings.xml:674 +msgid "Optional name for the 3D physics layer 10." +msgstr "" + +#: doc/classes/ProjectSettings.xml:677 +msgid "Optional name for the 3D physics layer 11." +msgstr "" + +#: doc/classes/ProjectSettings.xml:680 +msgid "Optional name for the 3D physics layer 12." +msgstr "" + +#: doc/classes/ProjectSettings.xml:683 +msgid "Optional name for the 3D physics layer 13." +msgstr "" + +#: doc/classes/ProjectSettings.xml:686 +msgid "Optional name for the 3D physics layer 14." +msgstr "" + +#: doc/classes/ProjectSettings.xml:689 +msgid "Optional name for the 3D physics layer 15." +msgstr "" + +#: doc/classes/ProjectSettings.xml:692 +msgid "Optional name for the 3D physics layer 16." +msgstr "" + +#: doc/classes/ProjectSettings.xml:695 +msgid "Optional name for the 3D physics layer 17." +msgstr "" + +#: doc/classes/ProjectSettings.xml:698 +msgid "Optional name for the 3D physics layer 18." +msgstr "" + +#: doc/classes/ProjectSettings.xml:701 +msgid "Optional name for the 3D physics layer 19." +msgstr "" + +#: doc/classes/ProjectSettings.xml:704 +msgid "Optional name for the 3D physics layer 2." +msgstr "" + +#: doc/classes/ProjectSettings.xml:707 +msgid "Optional name for the 3D physics layer 20." +msgstr "" + +#: doc/classes/ProjectSettings.xml:710 +msgid "Optional name for the 3D physics layer 3." +msgstr "" + +#: doc/classes/ProjectSettings.xml:713 +msgid "Optional name for the 3D physics layer 4." +msgstr "" + +#: doc/classes/ProjectSettings.xml:716 +msgid "Optional name for the 3D physics layer 5." +msgstr "" + +#: doc/classes/ProjectSettings.xml:719 +msgid "Optional name for the 3D physics layer 6." +msgstr "" + +#: doc/classes/ProjectSettings.xml:722 +msgid "Optional name for the 3D physics layer 7." +msgstr "" + +#: doc/classes/ProjectSettings.xml:725 +msgid "Optional name for the 3D physics layer 8." +msgstr "" + +#: doc/classes/ProjectSettings.xml:728 +msgid "Optional name for the 3D physics layer 9." +msgstr "" + +#: doc/classes/ProjectSettings.xml:731 +msgid "Optional name for the 3D render layer 1." +msgstr "" + +#: doc/classes/ProjectSettings.xml:734 +msgid "Optional name for the 3D render layer 10." +msgstr "" + +#: doc/classes/ProjectSettings.xml:737 +msgid "Optional name for the 3D render layer 11." +msgstr "" + +#: doc/classes/ProjectSettings.xml:740 +msgid "Optional name for the 3D render layer 12." +msgstr "" + +#: doc/classes/ProjectSettings.xml:743 +msgid "Optional name for the 3D render layer 13." +msgstr "" + +#: doc/classes/ProjectSettings.xml:746 +msgid "Optional name for the 3D render layer 14" +msgstr "" + +#: doc/classes/ProjectSettings.xml:749 +msgid "Optional name for the 3D render layer 15." +msgstr "" + +#: doc/classes/ProjectSettings.xml:752 +msgid "Optional name for the 3D render layer 16." +msgstr "" + +#: doc/classes/ProjectSettings.xml:755 +msgid "Optional name for the 3D render layer 17." +msgstr "" + +#: doc/classes/ProjectSettings.xml:758 +msgid "Optional name for the 3D render layer 18." +msgstr "" + +#: doc/classes/ProjectSettings.xml:761 +msgid "Optional name for the 3D render layer 19." +msgstr "" + +#: doc/classes/ProjectSettings.xml:764 +msgid "Optional name for the 3D render layer 2." +msgstr "" + +#: doc/classes/ProjectSettings.xml:767 +msgid "Optional name for the 3D render layer 20." +msgstr "" + +#: doc/classes/ProjectSettings.xml:770 +msgid "Optional name for the 3D render layer 3." +msgstr "" + +#: doc/classes/ProjectSettings.xml:773 +msgid "Optional name for the 3D render layer 4." +msgstr "" + +#: doc/classes/ProjectSettings.xml:776 +msgid "Optional name for the 3D render layer 5." +msgstr "" + +#: doc/classes/ProjectSettings.xml:779 +msgid "Optional name for the 3D render layer 6." +msgstr "" + +#: doc/classes/ProjectSettings.xml:782 +msgid "Optional name for the 3D render layer 7." +msgstr "" + +#: doc/classes/ProjectSettings.xml:785 +msgid "Optional name for the 3D render layer 8." +msgstr "" + +#: doc/classes/ProjectSettings.xml:788 +msgid "Optional name for the 3D render layer 9." +msgstr "" + +#: 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:794 +msgid "" +"If non-empty, this locale will be used when running the project from the " +"editor." +msgstr "" + +#: doc/classes/ProjectSettings.xml:797 +msgid "If [code]true[/code], logs all output to files." +msgstr "" + +#: 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:803 +msgid "Specifies the maximum amount of log files allowed (used for rotation)." +msgstr "" + +#: 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: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 " +"on threads. If servers get stalled too often when loading resources in a " +"thread, increase this number." +msgstr "" + +#: 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: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: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: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:836 +msgid "" +"Default size of packet peer stream for deserializing Godot data. Over this " +"size, data is dropped." +msgstr "" + +#: doc/classes/ProjectSettings.xml:839 +msgid "Timeout (in seconds) for connection attempts using TCP." +msgstr "" + +#: doc/classes/ProjectSettings.xml:842 +msgid "Maximum size (in kiB) for the [WebRTCDataChannel] input buffer." +msgstr "" + +#: doc/classes/ProjectSettings.xml:845 +msgid "Maximum size (in kiB) for the [WebSocketClient] input buffer." +msgstr "" + +#: doc/classes/ProjectSettings.xml:848 +msgid "Maximum number of concurrent input packets for [WebSocketClient]." +msgstr "" + +#: doc/classes/ProjectSettings.xml:851 +msgid "Maximum size (in kiB) for the [WebSocketClient] output buffer." +msgstr "" + +#: doc/classes/ProjectSettings.xml:854 +msgid "Maximum number of concurrent output packets for [WebSocketClient]." +msgstr "" + +#: doc/classes/ProjectSettings.xml:857 +msgid "Maximum size (in kiB) for the [WebSocketServer] input buffer." +msgstr "" + +#: doc/classes/ProjectSettings.xml:860 +msgid "Maximum number of concurrent input packets for [WebSocketServer]." +msgstr "" + +#: doc/classes/ProjectSettings.xml:863 +msgid "Maximum size (in kiB) for the [WebSocketServer] output buffer." +msgstr "" + +#: doc/classes/ProjectSettings.xml:866 +msgid "Maximum number of concurrent output packets for [WebSocketServer]." +msgstr "" + +#: 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:872 +msgid "Page size used by remote filesystem (in bytes)." +msgstr "" + +#: 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: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:881 +msgid "" +"What to use to separate node name from number. This is mostly an editor " +"setting." +msgstr "" + +#: 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:887 +msgid "Cell size used for the broad-phase 2D hash grid algorithm." +msgstr "" + +#: doc/classes/ProjectSettings.xml:890 +msgid "The default angular damp in 2D." +msgstr "" + +#: 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 " +"the default gravity at runtime, use the following code sample:\n" +"[codeblock]\n" +"# Set the default gravity strength to 98.\n" +"PhysicsServer2D.area_set_param(get_viewport().find_world_2d().get_space(), " +"PhysicsServer2D.AREA_PARAM_GRAVITY, 98)\n" +"[/codeblock]" +msgstr "" + +#: 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 " +"the default gravity vector at runtime, use the following code sample:\n" +"[codeblock]\n" +"# Set the default gravity direction to `Vector2(0, 1)`.\n" +"PhysicsServer2D.area_set_param(get_viewport().find_world_2d().get_space(), " +"PhysicsServer2D.AREA_PARAM_GRAVITY_VECTOR, Vector2(0, 1))\n" +"[/codeblock]" +msgstr "" + +#: doc/classes/ProjectSettings.xml:909 +msgid "The default linear damp in 2D." +msgstr "" + +#: 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:915 +msgid "" +"Sets which physics engine to use for 2D physics.\n" +"\"DEFAULT\" and \"GodotPhysics2D\" are the same, as there is currently no " +"alternative 2D physics server implemented." +msgstr "" + +#: 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: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: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 " +"only physics process.\n" +"[b]Warning:[/b] As of Godot 3.2, there are mixed reports about the use of a " +"Multi-Threaded thread model for physics. Be sure to assess whether it does " +"give you extra performance and no regressions when using it." +msgstr "" + +#: 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: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:935 +msgid "The default angular damp in 3D." +msgstr "" + +#: 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 " +"the default gravity at runtime, use the following code sample:\n" +"[codeblock]\n" +"# Set the default gravity strength to 9.8.\n" +"PhysicsServer3D.area_set_param(get_viewport().find_world().get_space(), " +"PhysicsServer3D.AREA_PARAM_GRAVITY, 9.8)\n" +"[/codeblock]" +msgstr "" + +#: 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 " +"the default gravity vector at runtime, use the following code sample:\n" +"[codeblock]\n" +"# Set the default gravity direction to `Vector3(0, -1, 0)`.\n" +"PhysicsServer3D.area_set_param(get_viewport().find_world().get_space(), " +"PhysicsServer3D.AREA_PARAM_GRAVITY_VECTOR, Vector3(0, -1, 0))\n" +"[/codeblock]" +msgstr "" + +#: doc/classes/ProjectSettings.xml:954 +msgid "The default linear damp in 3D." +msgstr "" + +#: 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 \"GodotPhysics3D\" engine is still supported as an " +"alternative." +msgstr "" + +#: doc/classes/ProjectSettings.xml:961 +msgid "Enables [member Viewport.physics_object_picking] on the root viewport." +msgstr "" + +#: 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" +"[b]Note:[/b] This property is only read when the project starts. To change " +"the physics FPS at runtime, set [member Engine.iterations_per_second] " +"instead." +msgstr "" + +#: doc/classes/ProjectSettings.xml:968 +msgid "" +"Fix to improve physics jitter, specially on monitors where refresh rate is " +"different than the physics FPS.\n" +"[b]Note:[/b] This property is only read when the project starts. To change " +"the physics FPS at runtime, set [member Engine.physics_jitter_fix] instead." +msgstr "" + +#: doc/classes/ProjectSettings.xml:972 +msgid "" +"Default background clear color. Overridable per [Viewport] using its " +"[Environment]. See [member Environment.background_mode] and [member " +"Environment.background_color] in particular. To change this default color " +"programmatically, use [method RenderingServer.set_default_clear_color]." +msgstr "" + +#: 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 " +"at scene load time regardless of whether you have set an environment or not. " +"If you do not rely on the fallback environment, it is best to delete " +"[code]default_env.tres[/code], or to specify a different default environment " +"here." +msgstr "" + +#: 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: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 " +"[url=https://github.com/godotengine/godot/issues/9913]GitHub issue 9913[/" +"url] for details.\n" +"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." +msgstr "" + +#: 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: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: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: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: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: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]--" +"rendering-driver[/code] command line argument.\n" +"[b]FIXME:[/b] No longer valid after DisplayServer split:\n" +"In such cases, this property is not updated, so use [code]OS." +"get_current_video_driver[/code] to query it at run-time." +msgstr "" + +#: doc/classes/ProjectSettings.xml:1025 +msgid "" +"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:1028 +msgid "" +"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 " +"allocated. This means [code]SCREEN_TEXTURE[/code] and [code]DEPTH_TEXTURE[/" +"code] will not be available in shaders and post-processing effects will not " +"be available in the [Environment]." +msgstr "" + +#: 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: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: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: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: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: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 " +"quality reflections, but increases time to calculate radiance maps. In " +"general, fewer samples are needed for simpler, low dynamic range " +"environments while more samples are needed for HDR environments and " +"environments with a high level of detail." +msgstr "" + +#: 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: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:1064 +msgid "" +"If [code]true[/code], uses texture arrays instead of mipmaps for reflection " +"probes and panorama backgrounds (sky). This reduces jitter noise and " +"upscaling artifacts on reflections, but is significantly slower to compute " +"and uses [member rendering/quality/reflections/roughness_layers] times more " +"memory." +msgstr "" + +#: 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: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: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:1093 +msgid "" +"If [code]true[/code], uses faster but lower-quality Lambert material " +"lighting model instead of Burley." +msgstr "" + +#: 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: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: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: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:1117 +msgid "" +"Size for shadow atlas (used for OmniLights and SpotLights). See " +"documentation." +msgstr "" + +#: 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:1123 +msgid "" +"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:1126 +msgid "" +"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: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: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: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: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: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: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 "" + +#: doc/classes/QuadMesh.xml:4 +msgid "Class representing a square mesh." +msgstr "" + +#: doc/classes/QuadMesh.xml:7 +msgid "" +"Class representing a square [PrimitiveMesh]. This flat mesh does not have a " +"thickness. By default, this mesh is aligned on the X and Y axes; this " +"default rotation is more suited for use with billboarded materials. Unlike " +"[PlaneMesh], this mesh doesn't provide subdivision options." +msgstr "" + +#: doc/classes/QuadMesh.xml:15 +msgid "Size on the X and Y axes." +msgstr "" + +#: doc/classes/Quat.xml:4 +msgid "Quaternion." +msgstr "" + +#: doc/classes/Quat.xml:7 +msgid "" +"A unit quaternion used for representing 3D rotations.\n" +"It is similar to [Basis], which implements matrix representation of " +"rotations, and can be parametrized using both an axis-angle pair or Euler " +"angles. But due to its compactness and the way it is stored in memory, " +"certain operations (obtaining axis-angle and performing SLERP, in " +"particular) are more efficient and robust against floating-point errors.\n" +"Quaternions need to be (re)normalized." +msgstr "" + +#: doc/classes/Quat.xml:12 +msgid "" +"https://docs.godotengine.org/en/latest/tutorials/3d/using_transforms." +"html#interpolating-with-quaternions" +msgstr "" + +#: doc/classes/Quat.xml:21 +msgid "Returns the rotation matrix corresponding to the given quaternion." +msgstr "" + +#: doc/classes/Quat.xml:30 +msgid "" +"Returns a quaternion that will perform a rotation specified by Euler angles " +"(in the YXZ convention: first Z, then X, and Y last), given in the vector " +"format as (X angle, Y angle, Z angle)." +msgstr "" + +#: doc/classes/Quat.xml:41 +msgid "" +"Returns a quaternion that will rotate around the given axis by the specified " +"angle. The axis must be a normalized vector." +msgstr "" + +#: doc/classes/Quat.xml:56 +msgid "Returns a quaternion defined by these values." +msgstr "" + +#: doc/classes/Quat.xml:71 +msgid "" +"Performs a cubic spherical-linear interpolation with another quaternion." +msgstr "" + +#: doc/classes/Quat.xml:80 +msgid "Returns the dot product of two quaternions." +msgstr "" + +#: doc/classes/Quat.xml:87 +msgid "" +"Returns Euler angles (in the YXZ convention: first Z, then X, and Y last) " +"corresponding to the rotation represented by the unit quaternion. Returned " +"vector contains the rotation angles in the format (X angle, Y angle, Z " +"angle)." +msgstr "" + +#: doc/classes/Quat.xml:94 +msgid "Returns the inverse of the quaternion." +msgstr "" + +#: doc/classes/Quat.xml:103 +msgid "" +"Returns [code]true[/code] if this quaterion and [code]quat[/code] are " +"approximately equal, by running [method @GDScript.is_equal_approx] on each " +"component." +msgstr "" + +#: doc/classes/Quat.xml:110 +msgid "Returns whether the quaternion is normalized or not." +msgstr "" + +#: doc/classes/Quat.xml:117 +msgid "Returns the length of the quaternion." +msgstr "" + +#: doc/classes/Quat.xml:124 +msgid "Returns the length of the quaternion, squared." +msgstr "" + +#: doc/classes/Quat.xml:131 +msgid "Returns a copy of the quaternion, normalized to unit length." +msgstr "" + +#: doc/classes/Quat.xml:142 +msgid "" +"Sets the quaternion to a rotation which rotates around axis by the specified " +"angle, in radians. The axis must be a normalized vector." +msgstr "" + +#: doc/classes/Quat.xml:151 +msgid "" +"Sets the quaternion to a rotation specified by Euler angles (in the YXZ " +"convention: first Z, then X, and Y last), given in the vector format as (X " +"angle, Y angle, Z angle)." +msgstr "" + +#: doc/classes/Quat.xml:162 +msgid "Performs a spherical-linear interpolation with another quaternion." +msgstr "" + +#: doc/classes/Quat.xml:173 +msgid "" +"Performs a spherical-linear interpolation with another quaterion without " +"checking if the rotation path is not bigger than 90°." +msgstr "" + +#: doc/classes/Quat.xml:182 +msgid "Transforms the vector [code]v[/code] by this quaternion." +msgstr "" + +#: doc/classes/Quat.xml:188 +msgid "W component of the quaternion." +msgstr "" + +#: doc/classes/Quat.xml:191 +msgid "X component of the quaternion." +msgstr "" + +#: doc/classes/Quat.xml:194 +msgid "Y component of the quaternion." +msgstr "" + +#: doc/classes/Quat.xml:197 +msgid "Z component of the quaternion." +msgstr "" + +#: doc/classes/Quat.xml:202 +msgid "" +"The identity rotation. Equivalent to an identity matrix. If a vector is " +"transformed by an identity quaternion, it will not change." +msgstr "" + +#: doc/classes/RandomNumberGenerator.xml:4 +msgid "A class for generating pseudo-random numbers." +msgstr "" + +#: doc/classes/RandomNumberGenerator.xml:7 +msgid "" +"RandomNumberGenerator is a class for generating pseudo-random numbers. It " +"currently uses [url=http://www.pcg-random.org/]PCG32[/url].\n" +"[b]Note:[/b] The underlying algorithm is an implementation detail. As a " +"result, it should not be depended upon for reproducible random streams " +"across Godot versions.\n" +"To generate a random float number (within a given range) based on a time-" +"dependant seed:\n" +"[codeblock]\n" +"var rng = RandomNumberGenerator.new()\n" +"func _ready():\n" +" rng.randomize()\n" +" var my_random_number = rng.randf_range(-10.0, 10.0)\n" +"[/codeblock]" +msgstr "" + +#: doc/classes/RandomNumberGenerator.xml:24 +msgid "" +"Generates a pseudo-random float between [code]0.0[/code] and [code]1.0[/" +"code] (inclusive)." +msgstr "" + +#: doc/classes/RandomNumberGenerator.xml:35 +msgid "" +"Generates a pseudo-random float between [code]from[/code] and [code]to[/" +"code] (inclusive)." +msgstr "" + +#: doc/classes/RandomNumberGenerator.xml:46 +msgid "" +"Generates a [url=https://en.wikipedia.org/wiki/Normal_distribution]normally-" +"distributed[/url] pseudo-random number, using Box-Muller transform with the " +"specified [code]mean[/code] and a standard [code]deviation[/code]. This is " +"also called Gaussian distribution." +msgstr "" + +#: doc/classes/RandomNumberGenerator.xml:53 +msgid "" +"Generates a pseudo-random 32-bit unsigned integer between [code]0[/code] and " +"[code]4294967295[/code] (inclusive)." +msgstr "" + +#: doc/classes/RandomNumberGenerator.xml:64 +msgid "" +"Generates a pseudo-random 32-bit signed integer between [code]from[/code] " +"and [code]to[/code] (inclusive)." +msgstr "" + +#: doc/classes/RandomNumberGenerator.xml:71 +msgid "Setups a time-based seed to generator." +msgstr "" + +#: doc/classes/RandomNumberGenerator.xml:77 +msgid "" +"The seed used by the random number generator. A given seed will give a " +"reproducible sequence of pseudo-random numbers.\n" +"[b]Note:[/b] The RNG does not have an avalanche effect, and can output " +"similar random streams given similar seeds. Consider using a hash function " +"to improve your seed quality if they're sourced externally." +msgstr "" + +#: doc/classes/Range.xml:4 +msgid "Abstract base class for range-based controls." +msgstr "" + +#: doc/classes/Range.xml:7 +msgid "" +"Range is a base class for [Control] nodes that change a floating-point " +"[i]value[/i] between a [i]minimum[/i] and a [i]maximum[/i], using [i]step[/" +"i] and [i]page[/i], for example a [ScrollBar]." +msgstr "" + +#: doc/classes/Range.xml:18 +msgid "" +"Binds two ranges together along with any ranges previously grouped with " +"either of them. When any of range's member variables change, it will share " +"the new value with all other ranges in its group." +msgstr "" + +#: doc/classes/Range.xml:25 +msgid "Stops range from sharing its member variables with any other." +msgstr "" + +#: doc/classes/Range.xml:31 +msgid "" +"If [code]true[/code], [member value] may be greater than [member max_value]." +msgstr "" + +#: doc/classes/Range.xml:34 +msgid "" +"If [code]true[/code], [member value] may be less than [member min_value]." +msgstr "" + +#: doc/classes/Range.xml:37 +msgid "" +"If [code]true[/code], and [code]min_value[/code] is greater than 0, " +"[code]value[/code] will be represented exponentially rather than linearly." +msgstr "" + +#: doc/classes/Range.xml:40 +msgid "" +"Maximum value. Range is clamped if [code]value[/code] is greater than " +"[code]max_value[/code]." +msgstr "" + +#: doc/classes/Range.xml:43 +msgid "" +"Minimum value. Range is clamped if [code]value[/code] is less than " +"[code]min_value[/code]." +msgstr "" + +#: doc/classes/Range.xml:46 +msgid "" +"Page size. Used mainly for [ScrollBar]. ScrollBar's length is its size " +"multiplied by [code]page[/code] over the difference between [code]min_value[/" +"code] and [code]max_value[/code]." +msgstr "" + +#: doc/classes/Range.xml:49 +msgid "The value mapped between 0 and 1." +msgstr "" + +#: doc/classes/Range.xml:52 +msgid "" +"If [code]true[/code], [code]value[/code] will always be rounded to the " +"nearest integer." +msgstr "" + +#: doc/classes/Range.xml:55 +msgid "" +"If greater than 0, [code]value[/code] will always be rounded to a multiple " +"of [code]step[/code]. If [code]rounded[/code] is also [code]true[/code], " +"[code]value[/code] will first be rounded to a multiple of [code]step[/code] " +"then rounded to the nearest integer." +msgstr "" + +#: doc/classes/Range.xml:58 +msgid "Range's current value." +msgstr "" + +#: doc/classes/Range.xml:64 +msgid "" +"Emitted when [member min_value], [member max_value], [member page], or " +"[member step] change." +msgstr "" + +#: doc/classes/Range.xml:71 +msgid "Emitted when [member value] changes." +msgstr "" + +#: doc/classes/RayCast2D.xml:4 doc/classes/RayCast3D.xml:4 +msgid "Query the closest object intersecting a ray." +msgstr "" + +#: doc/classes/RayCast2D.xml:7 +msgid "" +"A RayCast represents a line from its origin to its destination position, " +"[code]cast_to[/code]. It is used to query the 2D space in order to find the " +"closest object along the path of the ray.\n" +"RayCast2D can ignore some objects by adding them to the exception list via " +"[code]add_exception[/code], by setting proper filtering with collision " +"layers, or by filtering object types with type masks.\n" +"RayCast2D can be configured to report collisions with [Area2D]s ([member " +"collide_with_areas]) and/or [PhysicsBody2D]s ([member " +"collide_with_bodies]).\n" +"Only enabled raycasts will be able to query the space and report " +"collisions.\n" +"RayCast2D calculates intersection every physics frame (see [Node]), and the " +"result is cached so it can be used later until the next frame. If multiple " +"queries are required between physics frames (or during the same frame) use " +"[method force_raycast_update] after adjusting the raycast." +msgstr "" + +#: doc/classes/RayCast2D.xml:23 doc/classes/RayCast3D.xml:23 +msgid "" +"Adds a collision exception so the ray does not report collisions with the " +"specified node." +msgstr "" + +#: doc/classes/RayCast2D.xml:32 doc/classes/RayCast3D.xml:32 +msgid "" +"Adds a collision exception so the ray does not report collisions with the " +"specified [RID]." +msgstr "" + +#: doc/classes/RayCast2D.xml:39 doc/classes/RayCast3D.xml:39 +msgid "Removes all collision exceptions for this ray." +msgstr "" + +#: doc/classes/RayCast2D.xml:46 +msgid "" +"Updates the collision information for the ray. Use this method to update the " +"collision information immediately instead of waiting for the next " +"[code]_physics_process[/code] call, for example if the ray or its parent has " +"changed state.\n" +"[b]Note:[/b] [code]enabled == true[/code] is not required for this to work." +msgstr "" + +#: doc/classes/RayCast2D.xml:54 doc/classes/RayCast3D.xml:55 +msgid "" +"Returns the first object that the ray intersects, or [code]null[/code] if no " +"object is intersecting the ray (i.e. [method is_colliding] returns " +"[code]false[/code])." +msgstr "" + +#: doc/classes/RayCast2D.xml:61 doc/classes/RayCast3D.xml:62 +msgid "" +"Returns the shape ID of the first object that the ray intersects, or " +"[code]0[/code] if no object is intersecting the ray (i.e. [method " +"is_colliding] returns [code]false[/code])." +msgstr "" + +#: doc/classes/RayCast2D.xml:77 doc/classes/RayCast3D.xml:79 +msgid "" +"Returns the normal of the intersecting object's shape at the collision point." +msgstr "" + +#: doc/classes/RayCast2D.xml:84 +msgid "" +"Returns the collision point at which the ray intersects the closest object.\n" +"[b]Note:[/b] this point is in the [b]global[/b] coordinate system." +msgstr "" + +#: doc/classes/RayCast2D.xml:92 doc/classes/RayCast3D.xml:94 +msgid "" +"Returns whether any object is intersecting with the ray's vector " +"(considering the vector length)." +msgstr "" + +#: doc/classes/RayCast2D.xml:101 doc/classes/RayCast3D.xml:103 +msgid "" +"Removes a collision exception so the ray does report collisions with the " +"specified node." +msgstr "" + +#: doc/classes/RayCast2D.xml:110 doc/classes/RayCast3D.xml:112 +msgid "" +"Removes a collision exception so the ray does report collisions with the " +"specified [RID]." +msgstr "" + +#: doc/classes/RayCast2D.xml:121 +msgid "" +"Sets or clears individual bits on the collision mask. This makes selecting " +"the areas scanned easier." +msgstr "" + +#: doc/classes/RayCast2D.xml:127 doc/classes/RayCast3D.xml:130 +msgid "" +"The ray's destination point, relative to the RayCast's [code]position[/code]." +msgstr "" + +#: doc/classes/RayCast2D.xml:130 +msgid "If [code]true[/code], collision with [Area2D]s will be reported." +msgstr "" + +#: doc/classes/RayCast2D.xml:133 +msgid "If [code]true[/code], collision with [PhysicsBody2D]s will be reported." +msgstr "" + +#: doc/classes/RayCast2D.xml:136 doc/classes/RayCast3D.xml:139 +msgid "" +"The ray's collision mask. Only objects in at least one collision layer " +"enabled in the mask will be detected." +msgstr "" + +#: doc/classes/RayCast2D.xml:139 doc/classes/RayCast3D.xml:142 +msgid "If [code]true[/code], collisions will be reported." +msgstr "" + +#: doc/classes/RayCast2D.xml:142 +msgid "" +"If [code]true[/code], the parent node will be excluded from collision " +"detection." +msgstr "" + +#: doc/classes/RayCast3D.xml:7 +msgid "" +"A RayCast represents a line from its origin to its destination position, " +"[code]cast_to[/code]. It is used to query the 3D space in order to find the " +"closest object along the path of the ray.\n" +"RayCast3D can ignore some objects by adding them to the exception list via " +"[code]add_exception[/code] or by setting proper filtering with collision " +"layers and masks.\n" +"RayCast3D can be configured to report collisions with [Area3D]s ([member " +"collide_with_areas]) and/or [PhysicsBody3D]s ([member " +"collide_with_bodies]).\n" +"Only enabled raycasts will be able to query the space and report " +"collisions.\n" +"RayCast3D calculates intersection every physics frame (see [Node]), and the " +"result is cached so it can be used later until the next frame. If multiple " +"queries are required between physics frames (or during the same frame), use " +"[method force_raycast_update] after adjusting the raycast." +msgstr "" + +#: doc/classes/RayCast3D.xml:46 +msgid "" +"Updates the collision information for the ray.\n" +"Use this method to update the collision information immediately instead of " +"waiting for the next [code]_physics_process[/code] call, for example if the " +"ray or its parent has changed state.\n" +"[b]Note:[/b] [code]enabled == true[/code] is not required for this to work." +msgstr "" + +#: doc/classes/RayCast3D.xml:71 +msgid "" +"Returns [code]true[/code] if the bit index passed is turned on.\n" +"[b]Note:[/b] Bit indices range from 0-19." +msgstr "" + +#: doc/classes/RayCast3D.xml:86 +msgid "" +"Returns the collision point at which the ray intersects the closest object.\n" +"[b]Note:[/b] This point is in the [b]global[/b] coordinate system." +msgstr "" + +#: doc/classes/RayCast3D.xml:123 +msgid "" +"Sets the bit index passed to the [code]value[/code] passed.\n" +"[b]Note:[/b] Bit indexes range from 0-19." +msgstr "" + +#: doc/classes/RayCast3D.xml:133 +msgid "If [code]true[/code], collision with [Area3D]s will be reported." +msgstr "" + +#: doc/classes/RayCast3D.xml:136 +msgid "If [code]true[/code], collision with [PhysicsBody3D]s will be reported." +msgstr "" + +#: doc/classes/RayCast3D.xml:145 +msgid "" +"If [code]true[/code], collisions will be ignored for this RayCast3D's " +"immediate parent." +msgstr "" + +#: doc/classes/RayShape2D.xml:4 +msgid "Ray shape for 2D collisions." +msgstr "" + +#: doc/classes/RayShape2D.xml:7 +msgid "" +"Ray shape for 2D collisions. A ray is not really a collision body; instead, " +"it tries to separate itself from whatever is touching its far endpoint. It's " +"often useful for characters." +msgstr "" + +#: doc/classes/RayShape2D.xml:15 doc/classes/RayShape3D.xml:15 +msgid "The ray's length." +msgstr "" + +#: doc/classes/RayShape2D.xml:18 doc/classes/RayShape3D.xml:18 +msgid "If [code]true[/code], allow the shape to return the correct normal." +msgstr "" + +#: doc/classes/RayShape3D.xml:4 +msgid "Ray shape for 3D collisions." +msgstr "" + +#: doc/classes/RayShape3D.xml:7 +msgid "" +"Ray shape for 3D collisions, which can be set into a [PhysicsBody3D] or " +"[Area3D]. A ray is not really a collision body; instead, it tries to " +"separate itself from whatever is touching its far endpoint. It's often " +"useful for characters." +msgstr "" + +#: doc/classes/Rect2.xml:4 +msgid "2D axis-aligned bounding box using floating point coordinates." +msgstr "" + +#: doc/classes/Rect2.xml:7 +msgid "" +"[Rect2] consists of a position, a size, and several utility functions. It is " +"typically used for fast overlap tests.\n" +"It uses floating point coordinates." +msgstr "" + +#: doc/classes/Rect2.xml:22 +msgid "Constructs a [Rect2] by position and size." +msgstr "" + +#: doc/classes/Rect2.xml:37 +msgid "Constructs a [Rect2] by x, y, width, and height." +msgstr "" + +#: doc/classes/Rect2.xml:46 +msgid "Constructs a [Rect2] from a [Rect2i]." +msgstr "" + +#: doc/classes/Rect2.xml:53 +msgid "" +"Returns a [Rect2] with equivalent position and area, modified so that the " +"top-left corner is the origin and [code]width[/code] and [code]height[/code] " +"are positive." +msgstr "" + +#: doc/classes/Rect2.xml:62 +msgid "Returns the intersection of this [Rect2] and b." +msgstr "" + +#: doc/classes/Rect2.xml:71 +msgid "" +"Returns [code]true[/code] if this [Rect2] completely encloses another one." +msgstr "" + +#: doc/classes/Rect2.xml:80 +msgid "Returns this [Rect2] expanded to include a given point." +msgstr "" + +#: doc/classes/Rect2.xml:87 +msgid "Returns the area of the [Rect2]." +msgstr "" + +#: doc/classes/Rect2.xml:96 +msgid "" +"Returns a copy of the [Rect2] grown a given amount of units towards all the " +"sides." +msgstr "" + +#: doc/classes/Rect2.xml:111 +msgid "" +"Returns a copy of the [Rect2] grown a given amount of units towards each " +"direction individually." +msgstr "" + +#: doc/classes/Rect2.xml:122 +msgid "" +"Returns a copy of the [Rect2] grown a given amount of units towards the " +"[enum Margin] direction." +msgstr "" + +#: doc/classes/Rect2.xml:129 +msgid "Returns [code]true[/code] if the [Rect2] is flat or empty." +msgstr "" + +#: doc/classes/Rect2.xml:138 +msgid "Returns [code]true[/code] if the [Rect2] contains a point." +msgstr "" + +#: doc/classes/Rect2.xml:149 +msgid "" +"Returns [code]true[/code] if the [Rect2] overlaps with [code]b[/code] (i.e. " +"they have at least one point in common).\n" +"If [code]include_borders[/code] is [code]true[/code], they will also be " +"considered overlapping if their borders touch, even without intersection." +msgstr "" + +#: doc/classes/Rect2.xml:159 +msgid "" +"Returns [code]true[/code] if this [Rect2] and [code]rect[/code] are " +"approximately equal, by calling [code]is_equal_approx[/code] on each " +"component." +msgstr "" + +#: doc/classes/Rect2.xml:168 +msgid "Returns a larger [Rect2] that contains this [Rect2] and [code]b[/code]." +msgstr "" + +#: doc/classes/Rect2.xml:174 +msgid "Ending corner." +msgstr "" + +#: doc/classes/Rect2.xml:177 +msgid "Position (starting corner)." +msgstr "" + +#: doc/classes/Rect2i.xml:4 +msgid "2D axis-aligned bounding box using integer coordinates." +msgstr "" + +#: doc/classes/Rect2i.xml:7 +msgid "" +"[Rect2i] consists of a position, a size, and several utility functions. It " +"is typically used for fast overlap tests.\n" +"It uses integer coordinates." +msgstr "" + +#: doc/classes/Rect2i.xml:22 +msgid "Constructs a [Rect2i] by position and size." +msgstr "" + +#: doc/classes/Rect2i.xml:37 +msgid "Constructs a [Rect2i] by x, y, width, and height." +msgstr "" + +#: doc/classes/Rect2i.xml:46 +msgid "" +"Constructs a new [Rect2i] from [Rect2]. The floating point coordinates will " +"be truncated." +msgstr "" + +#: doc/classes/RectangleShape2D.xml:4 +msgid "Rectangle shape for 2D collisions." +msgstr "" + +#: doc/classes/RectangleShape2D.xml:7 +msgid "" +"Rectangle shape for 2D collisions. This shape is useful for modeling box-" +"like 2D objects." +msgstr "" + +#: doc/classes/RectangleShape2D.xml:15 +msgid "" +"The rectangle's half extents. The width and height of this shape is twice " +"the half extents." +msgstr "" + +#: doc/classes/Reference.xml:4 +msgid "Base class for reference-counted objects." +msgstr "" + +#: doc/classes/Reference.xml:7 +msgid "" +"Base class for any object that keeps a reference count. [Resource] and many " +"other helper objects inherit this class.\n" +"References keep an internal reference counter so that they are automatically " +"released when no longer in use, and only then. References therefore do not " +"need to be freed manually with [method Object.free].\n" +"In the vast majority of use cases, instantiating and using [Reference]-" +"derived types is all you need to do. The methods provided in this class are " +"only for advanced users, and can cause issues if misused." +msgstr "" + +#: doc/classes/Reference.xml:18 +msgid "" +"Initializes the internal reference counter. Use this only if you really know " +"what you are doing.\n" +"Returns whether the initialization was successful." +msgstr "" + +#: doc/classes/Reference.xml:26 +msgid "" +"Increments the internal reference counter. Use this only if you really know " +"what you are doing.\n" +"Returns [code]true[/code] if the increment was successful, [code]false[/" +"code] otherwise." +msgstr "" + +#: doc/classes/Reference.xml:34 +msgid "" +"Decrements the internal reference counter. Use this only if you really know " +"what you are doing.\n" +"Returns [code]true[/code] if the decrement was successful, [code]false[/" +"code] otherwise." +msgstr "" + +#: doc/classes/ReferenceRect.xml:4 +msgid "Reference frame for GUI." +msgstr "" + +#: doc/classes/ReferenceRect.xml:7 +msgid "" +"A rectangle box that displays only a [member border_color] border color " +"around its rectangle. [ReferenceRect] has no fill [Color]." +msgstr "" + +#: doc/classes/ReferenceRect.xml:15 +msgid "Sets the border [Color] of the [ReferenceRect]." +msgstr "" + +#: doc/classes/ReferenceRect.xml:18 +msgid "" +"If set to [code]true[/code], the [ReferenceRect] will only be visible while " +"in editor. Otherwise, [ReferenceRect] will be visible in game." +msgstr "" + +#: doc/classes/ReflectionProbe.xml:4 +msgid "Captures its surroundings to create reflections." +msgstr "" + +#: doc/classes/ReflectionProbe.xml:7 +msgid "" +"Captures its surroundings as a cubemap, and stores versions of it with " +"increasing levels of blur to simulate different material roughnesses.\n" +"The [ReflectionProbe] is used to create high-quality reflections at the cost " +"of performance. It can be combined with [GIProbe]s and Screen Space " +"Reflections to achieve high quality reflections. [ReflectionProbe]s render " +"all objects within their [member cull_mask], so updating them can be quite " +"expensive. It is best to update them once with the important static objects " +"and then leave them." +msgstr "" + +#: doc/classes/ReflectionProbe.xml:11 +msgid "" +"https://docs.godotengine.org/en/latest/tutorials/3d/reflection_probes.html" +msgstr "" + +#: doc/classes/ReflectionProbe.xml:17 +msgid "" +"If [code]true[/code], enables box projection. This makes reflections look " +"more correct in rectangle-shaped rooms by offsetting the reflection center " +"depending on the camera's location." +msgstr "" + +#: doc/classes/ReflectionProbe.xml:20 +msgid "" +"Sets the cull mask which determines what objects are drawn by this probe. " +"Every [VisualInstance3D] with a layer included in this cull mask will be " +"rendered by the probe. It is best to only include large objects which are " +"likely to take up a lot of space in the reflection in order to save on " +"rendering cost." +msgstr "" + +#: doc/classes/ReflectionProbe.xml:23 +msgid "" +"If [code]true[/code], computes shadows in the reflection probe. This makes " +"the reflection probe slower to render; you may want to disable this if using " +"the [constant UPDATE_ALWAYS] [member update_mode]." +msgstr "" + +#: doc/classes/ReflectionProbe.xml:26 +msgid "" +"The size of the reflection probe. The larger the extents the more space " +"covered by the probe which will lower the perceived resolution. It is best " +"to keep the extents only as large as you need them." +msgstr "" + +#: doc/classes/ReflectionProbe.xml:29 +msgid "" +"Defines the reflection intensity. Intensity modulates the strength of the " +"reflection." +msgstr "" + +#: doc/classes/ReflectionProbe.xml:32 +msgid "" +"Sets the ambient light color to be used when this probe is set to [member " +"interior_enable]." +msgstr "" + +#: doc/classes/ReflectionProbe.xml:35 +msgid "" +"Sets the contribution value for how much the reflection affects the ambient " +"light for this reflection probe when set to [member interior_enable]. Useful " +"so that ambient light matches the color of the room." +msgstr "" + +#: doc/classes/ReflectionProbe.xml:38 +msgid "" +"Sets the energy multiplier for this reflection probe's ambient light " +"contribution when set to [member interior_enable]." +msgstr "" + +#: doc/classes/ReflectionProbe.xml:41 +msgid "" +"If [code]true[/code], reflections will ignore sky contribution. Ambient " +"lighting is then controlled by the [code]interior_ambient_*[/code] " +"properties." +msgstr "" + +#: doc/classes/ReflectionProbe.xml:44 +msgid "" +"Sets the max distance away from the probe an object can be before it is " +"culled." +msgstr "" + +#: doc/classes/ReflectionProbe.xml:47 +msgid "" +"Sets the origin offset to be used when this reflection probe is in box " +"project mode." +msgstr "" + +#: doc/classes/ReflectionProbe.xml:50 +msgid "" +"Sets how frequently the probe is updated. Can be [constant UPDATE_ONCE] or " +"[constant UPDATE_ALWAYS]." +msgstr "" + +#: doc/classes/ReflectionProbe.xml:55 +msgid "" +"Update the probe once on the next frame. The corresponding radiance map will " +"be generated over the following six frames. This is slower to update than " +"[constant UPDATE_ALWAYS] but can result in higher quality reflections." +msgstr "" + +#: doc/classes/ReflectionProbe.xml:58 +msgid "" +"Update the probe every frame. This is needed when you want to capture " +"dynamic objects. However, it results in an increased render time. Use " +"[constant UPDATE_ONCE] whenever possible." +msgstr "" + +#: modules/regex/doc_classes/RegEx.xml:4 +msgid "Class for searching text for patterns using regular expressions." +msgstr "" + +#: modules/regex/doc_classes/RegEx.xml:7 +msgid "" +"A regular expression (or regex) is a compact language that can be used to " +"recognise strings that follow a specific pattern, such as URLs, email " +"addresses, complete sentences, etc. For instance, a regex of [code]ab[0-9][/" +"code] would find any string that is [code]ab[/code] followed by any number " +"from [code]0[/code] to [code]9[/code]. For a more in-depth look, you can " +"easily find various tutorials and detailed explanations on the Internet.\n" +"To begin, the RegEx object needs to be compiled with the search pattern " +"using [method compile] before it can be used.\n" +"[codeblock]\n" +"var regex = RegEx.new()\n" +"regex.compile(\"\\\\w-(\\\\d+)\")\n" +"[/codeblock]\n" +"The search pattern must be escaped first for GDScript before it is escaped " +"for the expression. For example, [code]compile(\"\\\\d+\")[/code] would be " +"read by RegEx as [code]\\d+[/code]. Similarly, [code]compile(\"\\\"(?:\\\\\\" +"\\.|[^\\\"])*\\\"\")[/code] would be read as [code]\"(?:\\\\.|[^\"])*\"[/" +"code].\n" +"Using [method search] you can find the pattern within the given text. If a " +"pattern is found, [RegExMatch] is returned and you can retrieve details of " +"the results using functions such as [method RegExMatch.get_string] and " +"[method RegExMatch.get_start].\n" +"[codeblock]\n" +"var regex = RegEx.new()\n" +"regex.compile(\"\\\\w-(\\\\d+)\")\n" +"var result = regex.search(\"abc n-0123\")\n" +"if result:\n" +" print(result.get_string()) # Would print n-0123\n" +"[/codeblock]\n" +"The results of capturing groups [code]()[/code] can be retrieved by passing " +"the group number to the various functions in [RegExMatch]. Group 0 is the " +"default and will always refer to the entire pattern. In the above example, " +"calling [code]result.get_string(1)[/code] would give you [code]0123[/code].\n" +"This version of RegEx also supports named capturing groups, and the names " +"can be used to retrieve the results. If two or more groups have the same " +"name, the name would only refer to the first one with a match.\n" +"[codeblock]\n" +"var regex = RegEx.new()\n" +"regex.compile(\"d(?<digit>[0-9]+)|x(?<digit>[0-9a-f]+)\")\n" +"var result = regex.search(\"the number is x2f\")\n" +"if result:\n" +" print(result.get_string(\"digit\")) # Would print 2f\n" +"[/codeblock]\n" +"If you need to process multiple results, [method search_all] generates a " +"list of all non-overlapping results. This can be combined with a [code]for[/" +"code] loop for convenience.\n" +"[codeblock]\n" +"for result in regex.search_all(\"d01, d03, d0c, x3f and x42\"):\n" +" print(result.get_string(\"digit\"))\n" +"# Would print 01 03 3f 42\n" +"# Note that d0c would not match\n" +"[/codeblock]\n" +"[b]Note:[/b] Godot's regex implementation is based on the [url=https://www." +"pcre.org/]PCRE2[/url] library. You can view the full pattern reference " +"[url=https://www.pcre.org/current/doc/html/pcre2pattern.html]here[/url].\n" +"[b]Tip:[/b] You can use [url=https://regexr.com/]Regexr[/url] to test " +"regular expressions online." +msgstr "" + +#: modules/regex/doc_classes/RegEx.xml:48 +msgid "" +"This method resets the state of the object, as if it was freshly created. " +"Namely, it unassigns the regular expression of this object." +msgstr "" + +#: modules/regex/doc_classes/RegEx.xml:57 +msgid "" +"Compiles and assign the search pattern to use. Returns [constant OK] if the " +"compilation is successful. If an error is encountered, details are printed " +"to standard output and an error is returned." +msgstr "" + +#: modules/regex/doc_classes/RegEx.xml:64 +msgid "Returns the number of capturing groups in compiled pattern." +msgstr "" + +#: modules/regex/doc_classes/RegEx.xml:71 +msgid "" +"Returns an array of names of named capturing groups in the compiled pattern. " +"They are ordered by appearance." +msgstr "" + +#: modules/regex/doc_classes/RegEx.xml:78 +msgid "Returns the original search pattern that was compiled." +msgstr "" + +#: modules/regex/doc_classes/RegEx.xml:85 +msgid "Returns whether this object has a valid search pattern assigned." +msgstr "" + +#: modules/regex/doc_classes/RegEx.xml:98 +msgid "" +"Searches the text for the compiled pattern. Returns a [RegExMatch] container " +"of the first matching result if found, otherwise [code]null[/code]. The " +"region to search within can be specified without modifying where the start " +"and end anchor would be." +msgstr "" + +#: modules/regex/doc_classes/RegEx.xml:111 +msgid "" +"Searches the text for the compiled pattern. Returns an array of [RegExMatch] " +"containers for each non-overlapping result. If no results were found, an " +"empty array is returned instead. The region to search within can be " +"specified without modifying where the start and end anchor would be." +msgstr "" + +#: modules/regex/doc_classes/RegEx.xml:128 +msgid "" +"Searches the text for the compiled pattern and replaces it with the " +"specified string. Escapes and backreferences such as [code]$1[/code] and " +"[code]$name[/code] are expanded and resolved. By default, only the first " +"instance is replaced, but it can be changed for all instances (global " +"replacement). The region to search within can be specified without modifying " +"where the start and end anchor would be." +msgstr "" + +#: modules/regex/doc_classes/RegExMatch.xml:4 +msgid "Contains the results of a [RegEx] search." +msgstr "" + +#: modules/regex/doc_classes/RegExMatch.xml:7 +msgid "" +"Contains the results of a single [RegEx] match returned by [method RegEx." +"search] and [method RegEx.search_all]. It can be used to find the position " +"and range of the match and its capturing groups, and it can extract its " +"substring for you." +msgstr "" + +#: modules/regex/doc_classes/RegExMatch.xml:18 +msgid "" +"Returns the end position of the match within the source string. The end " +"position of capturing groups can be retrieved by providing its group number " +"as an integer or its string name (if it's a named group). The default value " +"of 0 refers to the whole pattern.\n" +"Returns -1 if the group did not match or doesn't exist." +msgstr "" + +#: modules/regex/doc_classes/RegExMatch.xml:26 +msgid "Returns the number of capturing groups." +msgstr "" + +#: modules/regex/doc_classes/RegExMatch.xml:35 +msgid "" +"Returns the starting position of the match within the source string. The " +"starting position of capturing groups can be retrieved by providing its " +"group number as an integer or its string name (if it's a named group). The " +"default value of 0 refers to the whole pattern.\n" +"Returns -1 if the group did not match or doesn't exist." +msgstr "" + +#: modules/regex/doc_classes/RegExMatch.xml:45 +msgid "" +"Returns the substring of the match from the source string. Capturing groups " +"can be retrieved by providing its group number as an integer or its string " +"name (if it's a named group). The default value of 0 refers to the whole " +"pattern.\n" +"Returns an empty string if the group did not match or doesn't exist." +msgstr "" + +#: modules/regex/doc_classes/RegExMatch.xml:52 +msgid "" +"A dictionary of named groups and its corresponding group number. Only groups " +"with that were matched are included. If multiple groups have the same name, " +"that name would refer to the first matching one." +msgstr "" + +#: modules/regex/doc_classes/RegExMatch.xml:55 +msgid "An [Array] of the match and its capturing groups." +msgstr "" + +#: modules/regex/doc_classes/RegExMatch.xml:58 +msgid "" +"The source string used with the search pattern to find this matching result." +msgstr "" + +#: doc/classes/RemoteTransform2D.xml:4 +msgid "" +"RemoteTransform2D pushes its own [Transform2D] to another [CanvasItem] " +"derived Node in the scene." +msgstr "" + +#: doc/classes/RemoteTransform2D.xml:7 +msgid "" +"RemoteTransform2D pushes its own [Transform2D] to another [CanvasItem] " +"derived Node (called the remote node) in the scene.\n" +"It can be set to update another Node's position, rotation and/or scale. It " +"can use either global or local coordinates." +msgstr "" + +#: doc/classes/RemoteTransform2D.xml:17 +msgid "" +"[RemoteTransform2D] caches the remote node. It may not notice if the remote " +"node disappears; [method force_update_cache] forces it to update the cache " +"again." +msgstr "" + +#: doc/classes/RemoteTransform2D.xml:23 +msgid "" +"The [NodePath] to the remote node, relative to the RemoteTransform2D's " +"position in the scene." +msgstr "" + +#: doc/classes/RemoteTransform2D.xml:26 doc/classes/RemoteTransform3D.xml:26 +msgid "If [code]true[/code], the remote node's position is updated." +msgstr "" + +#: doc/classes/RemoteTransform2D.xml:29 doc/classes/RemoteTransform3D.xml:29 +msgid "If [code]true[/code], the remote node's rotation is updated." +msgstr "" + +#: doc/classes/RemoteTransform2D.xml:32 doc/classes/RemoteTransform3D.xml:32 +msgid "If [code]true[/code], the remote node's scale is updated." +msgstr "" + +#: doc/classes/RemoteTransform2D.xml:35 doc/classes/RemoteTransform3D.xml:35 +msgid "" +"If [code]true[/code], global coordinates are used. If [code]false[/code], " +"local coordinates are used." +msgstr "" + +#: doc/classes/RemoteTransform3D.xml:4 +msgid "" +"RemoteTransform3D pushes its own [Transform] to another [Node3D] derived " +"Node in the scene." +msgstr "" + +#: doc/classes/RemoteTransform3D.xml:7 +msgid "" +"RemoteTransform3D pushes its own [Transform] to another [Node3D] derived " +"Node (called the remote node) in the scene.\n" +"It can be set to update another Node's position, rotation and/or scale. It " +"can use either global or local coordinates." +msgstr "" + +#: doc/classes/RemoteTransform3D.xml:17 +msgid "" +"[RemoteTransform3D] caches the remote node. It may not notice if the remote " +"node disappears; [method force_update_cache] forces it to update the cache " +"again." +msgstr "" + +#: doc/classes/RemoteTransform3D.xml:23 +msgid "" +"The [NodePath] to the remote node, relative to the RemoteTransform3D's " +"position in the scene." +msgstr "" + +#: doc/classes/RenderingServer.xml:4 +msgid "Server for anything visible." +msgstr "" + +#: doc/classes/RenderingServer.xml:7 +msgid "" +"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 rendering server is completely opaque, the internals are entirely " +"implementation specific and cannot be accessed.\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 " +"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].\n" +"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].\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. " +"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.\n" +"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." +msgstr "" + +#: doc/classes/RenderingServer.xml:18 +msgid "" +"https://docs.godotengine.org/en/latest/tutorials/optimization/using_servers." +"html" +msgstr "" + +#: doc/classes/RenderingServer.xml:33 +msgid "Sets images to be rendered in the window margin." +msgstr "" + +#: doc/classes/RenderingServer.xml:48 +msgid "" +"Sets margin size, where black bars (or images, if [method " +"black_bars_set_images] was used) are rendered." +msgstr "" + +#: doc/classes/RenderingServer.xml:55 +msgid "" +"Creates a camera and adds it to the RenderingServer. It can be accessed with " +"the RID that is returned. This RID will be used in all [code]camera_*[/code] " +"RenderingServer functions.\n" +"Once finished with your RID, you will want to free the RID using the " +"RenderingServer's [method free_rid] static method." +msgstr "" + +#: doc/classes/RenderingServer.xml:67 +msgid "" +"Sets the cull mask associated with this camera. The cull mask describes " +"which 3D layers are rendered by this camera. Equivalent to [member Camera3D." +"cull_mask]." +msgstr "" + +#: doc/classes/RenderingServer.xml:78 +msgid "" +"Sets the environment used by this camera. Equivalent to [member Camera3D." +"environment]." +msgstr "" + +#: doc/classes/RenderingServer.xml:95 +msgid "" +"Sets camera to use frustum projection. This mode allows adjusting the " +"[code]offset[/code] argument to create \"tilted frustum\" effects." +msgstr "" + +#: doc/classes/RenderingServer.xml:110 +msgid "" +"Sets camera to use orthogonal projection, also known as orthographic " +"projection. Objects remain the same size on the screen no matter how far " +"away they are." +msgstr "" + +#: doc/classes/RenderingServer.xml:125 +msgid "" +"Sets camera to use perspective projection. Objects on the screen becomes " +"smaller when they are far away." +msgstr "" + +#: doc/classes/RenderingServer.xml:136 +msgid "Sets [Transform] of camera." +msgstr "" + +#: doc/classes/RenderingServer.xml:147 +msgid "" +"If [code]true[/code], preserves the horizontal aspect ratio which is " +"equivalent to [constant Camera3D.KEEP_WIDTH]. If [code]false[/code], " +"preserves the vertical aspect ratio which is equivalent to [constant " +"Camera3D.KEEP_HEIGHT]." +msgstr "" + +#: doc/classes/RenderingServer.xml:154 +msgid "" +"Creates a canvas and returns the assigned [RID]. It can be accessed with the " +"RID that is returned. This RID will be used in all [code]canvas_*[/code] " +"RenderingServer functions.\n" +"Once finished with your RID, you will want to free the RID using the " +"RenderingServer's [method free_rid] static method." +msgstr "" + +#: doc/classes/RenderingServer.xml:164 +msgid "Clears the [CanvasItem] and removes all commands in it." +msgstr "" + +#: doc/classes/RenderingServer.xml:177 +msgid "Sets the [CanvasItem] to copy a rect to the backbuffer." +msgstr "" + +#: doc/classes/RenderingServer.xml:188 +msgid "Sets the index for the [CanvasItem]." +msgstr "" + +#: doc/classes/RenderingServer.xml:199 +msgid "Sets a new material to the [CanvasItem]." +msgstr "" + +#: doc/classes/RenderingServer.xml:210 +msgid "Sets if the [CanvasItem] uses its parent's material." +msgstr "" + +#: doc/classes/RenderingServer.xml:221 +msgid "" +"If this is enabled, the Z index of the parent will be added to the " +"children's Z index." +msgstr "" + +#: doc/classes/RenderingServer.xml:232 +msgid "" +"Sets the [CanvasItem]'s Z index, i.e. its draw order (lower indexes are " +"drawn first)." +msgstr "" + +#: doc/classes/RenderingServer.xml:243 +msgid "" +"Attaches the canvas light to the canvas. Removes it from its previous canvas." +msgstr "" + +#: doc/classes/RenderingServer.xml:250 +msgid "" +"Creates a canvas light and adds it to the RenderingServer. It can be " +"accessed with the RID that is returned. This RID will be used in all " +"[code]canvas_light_*[/code] RenderingServer functions.\n" +"Once finished with your RID, you will want to free the RID using the " +"RenderingServer's [method free_rid] static method." +msgstr "" + +#: doc/classes/RenderingServer.xml:262 +msgid "" +"Attaches a light occluder to the canvas. Removes it from its previous canvas." +msgstr "" + +#: doc/classes/RenderingServer.xml:269 +msgid "" +"Creates a light occluder and adds it to the RenderingServer. It can be " +"accessed with the RID that is returned. This RID will be used in all " +"[code]canvas_light_ocluder_*[/code] RenderingServer functions.\n" +"Once finished with your RID, you will want to free the RID using the " +"RenderingServer's [method free_rid] static method." +msgstr "" + +#: doc/classes/RenderingServer.xml:281 +msgid "Enables or disables light occluder." +msgstr "" + +#: doc/classes/RenderingServer.xml:292 doc/classes/RenderingServer.xml:369 +msgid "" +"The light mask. See [LightOccluder2D] for more information on light masks." +msgstr "" + +#: doc/classes/RenderingServer.xml:303 +msgid "Sets a light occluder's polygon." +msgstr "" + +#: doc/classes/RenderingServer.xml:314 +msgid "Sets a light occluder's [Transform2D]." +msgstr "" + +#: doc/classes/RenderingServer.xml:325 +msgid "Sets the color for a light." +msgstr "" + +#: doc/classes/RenderingServer.xml:336 +msgid "Enables or disables a canvas light." +msgstr "" + +#: doc/classes/RenderingServer.xml:347 +msgid "Sets a canvas light's energy." +msgstr "" + +#: doc/classes/RenderingServer.xml:358 +msgid "Sets a canvas light's height." +msgstr "" + +#: doc/classes/RenderingServer.xml:380 +msgid "" +"The binary mask used to determine which layers this canvas light's shadows " +"affects. See [LightOccluder2D] for more information on light masks." +msgstr "" + +#: doc/classes/RenderingServer.xml:393 +msgid "The layer range that gets rendered with this light." +msgstr "" + +#: doc/classes/RenderingServer.xml:404 +msgid "The mode of the light, see [enum CanvasLightMode] constants." +msgstr "" + +#: doc/classes/RenderingServer.xml:415 +msgid "" +"Sets the texture's scale factor of the light. Equivalent to [member Light2D." +"texture_scale]." +msgstr "" + +#: doc/classes/RenderingServer.xml:426 +msgid "" +"Sets the width of the shadow buffer, size gets scaled to the next power of " +"two for this." +msgstr "" + +#: doc/classes/RenderingServer.xml:437 +msgid "Sets the color of the canvas light's shadow." +msgstr "" + +#: doc/classes/RenderingServer.xml:448 +msgid "Enables or disables the canvas light's shadow." +msgstr "" + +#: doc/classes/RenderingServer.xml:459 +msgid "" +"Sets the canvas light's shadow's filter, see [enum CanvasLightShadowFilter] " +"constants." +msgstr "" + +#: doc/classes/RenderingServer.xml:470 +msgid "Smoothens the shadow. The lower, the smoother." +msgstr "" + +#: doc/classes/RenderingServer.xml:481 +msgid "" +"Sets texture to be used by light. Equivalent to [member Light2D.texture]." +msgstr "" + +#: doc/classes/RenderingServer.xml:492 +msgid "" +"Sets the offset of the light's texture. Equivalent to [member Light2D." +"offset]." +msgstr "" + +#: doc/classes/RenderingServer.xml:503 +msgid "Sets the canvas light's [Transform2D]." +msgstr "" + +#: doc/classes/RenderingServer.xml:516 +msgid "" +"Sets the Z range of objects that will be affected by this light. Equivalent " +"to [member Light2D.range_z_min] and [member Light2D.range_z_max]." +msgstr "" + +#: doc/classes/RenderingServer.xml:523 +msgid "" +"Creates a new light occluder polygon and adds it to the RenderingServer. It " +"can be accessed with the RID that is returned. This RID will be used in all " +"[code]canvas_occluder_polygon_*[/code] RenderingServer functions.\n" +"Once finished with your RID, you will want to free the RID using the " +"RenderingServer's [method free_rid] static method." +msgstr "" + +#: doc/classes/RenderingServer.xml:535 +msgid "" +"Sets an occluder polygons cull mode. See [enum " +"CanvasOccluderPolygonCullMode] constants." +msgstr "" + +#: doc/classes/RenderingServer.xml:548 +msgid "Sets the shape of the occluder polygon." +msgstr "" + +#: doc/classes/RenderingServer.xml:559 +msgid "Sets the shape of the occluder polygon as lines." +msgstr "" + +#: doc/classes/RenderingServer.xml:572 +msgid "" +"A copy of the canvas item will be drawn with a local offset of the mirroring " +"[Vector2]." +msgstr "" + +#: doc/classes/RenderingServer.xml:583 +msgid "Modulates all colors in the given canvas." +msgstr "" + +#: doc/classes/RenderingServer.xml:590 +msgid "" +"Creates a directional 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_*[/code] RenderingServer functions.\n" +"Once finished with your RID, you will want to free the RID using the " +"RenderingServer's [method free_rid] static method.\n" +"To place in a scene, attach this directional light to an instance using " +"[method instance_set_base] using the returned RID." +msgstr "" + +#: doc/classes/RenderingServer.xml:599 +msgid "" +"Creates an environment and adds it to the RenderingServer. It can be " +"accessed with the RID that is returned. This RID will be used in all " +"[code]environment_*[/code] RenderingServer functions.\n" +"Once finished with your RID, you will want to free the RID using the " +"RenderingServer's [method free_rid] static method." +msgstr "" + +#: doc/classes/RenderingServer.xml:619 +msgid "" +"Sets the values to be used with the \"Adjustment\" post-process effect. See " +"[Environment] for more details." +msgstr "" + +#: doc/classes/RenderingServer.xml:650 +msgid "" +"Sets the [i]BGMode[/i] of the environment. Equivalent to [member Environment." +"background_mode]." +msgstr "" + +#: doc/classes/RenderingServer.xml:661 +msgid "" +"Color displayed for clear areas of the scene (if using Custom color or Color" +"+Sky background modes)." +msgstr "" + +#: doc/classes/RenderingServer.xml:672 +msgid "Sets the intensity of the background color." +msgstr "" + +#: doc/classes/RenderingServer.xml:683 +msgid "Sets the maximum layer to use if using Canvas background mode." +msgstr "" + +#: doc/classes/RenderingServer.xml:700 +msgid "" +"Sets the variables to be used with the scene fog. See [Environment] for more " +"details." +msgstr "" + +#: doc/classes/RenderingServer.xml:721 +msgid "" +"Sets the variables to be used with the fog depth effect. See [Environment] " +"for more details." +msgstr "" + +#: doc/classes/RenderingServer.xml:738 +msgid "" +"Sets the variables to be used with the fog height effect. See [Environment] " +"for more details." +msgstr "" + +#: doc/classes/RenderingServer.xml:777 +msgid "" +"Sets the [Sky] to be used as the environment's background when using " +"[i]BGMode[/i] sky. Equivalent to [member Environment.sky]." +msgstr "" + +#: doc/classes/RenderingServer.xml:788 +msgid "" +"Sets a custom field of view for the background [Sky]. Equivalent to [member " +"Environment.sky_custom_fov]." +msgstr "" + +#: doc/classes/RenderingServer.xml:799 +msgid "" +"Sets the rotation of the background [Sky] expressed as a [Basis]. Equivalent " +"to [member Environment.sky_rotation], where the rotation vector is used to " +"construct the [Basis]." +msgstr "" + +#: doc/classes/RenderingServer.xml:842 +msgid "" +"Sets the variables to be used with the \"screen space reflections\" post-" +"process effect. See [Environment] for more details." +msgstr "" + +#: doc/classes/RenderingServer.xml:867 +msgid "" +"Sets the variables to be used with the \"tonemap\" post-process effect. See " +"[Environment] for more details." +msgstr "" + +#: doc/classes/RenderingServer.xml:874 +msgid "Removes buffers and clears testcubes." +msgstr "" + +#: doc/classes/RenderingServer.xml:885 +msgid "" +"Forces a frame to be drawn when the function is called. Drawing a frame " +"updates all [Viewport]s that are set to update. Use with extreme caution." +msgstr "" + +#: doc/classes/RenderingServer.xml:892 +msgid "Synchronizes threads." +msgstr "" + +#: doc/classes/RenderingServer.xml:901 +msgid "Tries to free an object in the RenderingServer." +msgstr "" + +#: doc/classes/RenderingServer.xml:910 +msgid "Returns a certain information, see [enum RenderInfo] for options." +msgstr "" + +#: doc/classes/RenderingServer.xml:917 +msgid "Returns the id of the test cube. Creates one if none exists." +msgstr "" + +#: doc/classes/RenderingServer.xml:924 +msgid "Returns the id of the test texture. Creates one if none exists." +msgstr "" + +#: doc/classes/RenderingServer.xml:931 +msgid "" +"Returns the name of the video adapter (e.g. \"GeForce GTX 1080/PCIe/" +"SSE2\").\n" +"[b]Note:[/b] When running a headless or server binary, this function returns " +"an empty string." +msgstr "" + +#: doc/classes/RenderingServer.xml:939 +msgid "" +"Returns the vendor of the video adapter (e.g. \"NVIDIA Corporation\").\n" +"[b]Note:[/b] When running a headless or server binary, this function returns " +"an empty string." +msgstr "" + +#: doc/classes/RenderingServer.xml:947 +msgid "Returns the id of a white texture. Creates one if none exists." +msgstr "" + +#: 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:1015 +msgid "Not yet implemented. Always returns [code]false[/code]." +msgstr "" + +#: 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:1037 +msgid "" +"Sets up [ImmediateGeometry3D] internals to prepare for drawing. Equivalent " +"to [method ImmediateGeometry3D.begin]." +msgstr "" + +#: 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:1057 +msgid "" +"Sets the color to be used with next vertex. Equivalent to [method " +"ImmediateGeometry3D.set_color]." +msgstr "" + +#: 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 " +"[code]immediate_*[/code] RenderingServer functions.\n" +"Once finished with your RID, you will want to free the RID using the " +"RenderingServer's [method free_rid] static method.\n" +"To place in a scene, attach this immediate geometry to an instance using " +"[method instance_set_base] using the returned RID." +msgstr "" + +#: doc/classes/RenderingServer.xml:1075 +msgid "" +"Ends drawing the [ImmediateGeometry3D] and displays it. Equivalent to " +"[method ImmediateGeometry3D.end]." +msgstr "" + +#: doc/classes/RenderingServer.xml:1084 +msgid "Returns the material assigned to the [ImmediateGeometry3D]." +msgstr "" + +#: 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:1106 +msgid "Sets the material to be used to draw the [ImmediateGeometry3D]." +msgstr "" + +#: 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:1128 +msgid "" +"Sets the UV to be used with next vertex. Equivalent to [method " +"ImmediateGeometry3D.set_uv]." +msgstr "" + +#: 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:1150 +msgid "" +"Adds the next vertex using the information provided in advance. Equivalent " +"to [method ImmediateGeometry3D.add_vertex]." +msgstr "" + +#: 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:1168 +msgid "" +"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: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:1190 +msgid "" +"Attaches a skeleton to an instance. Removes the previous skeleton from the " +"instance." +msgstr "" + +#: 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 " +"[code]instance_*[/code] RenderingServer functions.\n" +"Once finished with your RID, you will want to free the RID using the " +"RenderingServer's [method free_rid] static method.\n" +"An instance is a way of placing a 3D object in the scenario. Objects like " +"particles, meshes, and reflection probes need to be associated with an " +"instance to be visible in the scenario using [method instance_set_base]." +msgstr "" + +#: 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 " +"RID will be used in all [code]instance_*[/code] RenderingServer functions.\n" +"Once finished with your RID, you will want to free the RID using the " +"RenderingServer's [method free_rid] static method." +msgstr "" + +#: 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:1233 +msgid "" +"Sets the shadow casting setting to one of [enum ShadowCastingSetting]. " +"Equivalent to [member GeometryInstance3D.cast_shadow]." +msgstr "" + +#: 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: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: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 " +"the light types, mesh, multimesh, immediate geometry, particle system, " +"reflection probe, lightmap capture, and the GI probe are all types that can " +"be set as the base of an instance in order to be displayed in the scenario." +msgstr "" + +#: doc/classes/RenderingServer.xml:1298 +msgid "Sets the weight for a given blend shape associated with this instance." +msgstr "" + +#: 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:1320 +msgid "Function not implemented in Godot 3.x." +msgstr "" + +#: 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:1342 +msgid "" +"Sets the render layers that this instance will be drawn to. Equivalent to " +"[member VisualInstance3D.layers]." +msgstr "" + +#: 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:1366 +msgid "" +"Sets the material of a specific surface. Equivalent to [method " +"MeshInstance3D.set_surface_material]." +msgstr "" + +#: doc/classes/RenderingServer.xml:1377 +msgid "" +"Sets the world space transform of the instance. Equivalent to [member Node3D." +"transform]." +msgstr "" + +#: doc/classes/RenderingServer.xml:1390 +msgid "Sets the lightmap to use with this instance." +msgstr "" + +#: doc/classes/RenderingServer.xml:1401 +msgid "" +"Sets whether an instance is drawn or not. Equivalent to [member Node3D." +"visible]." +msgstr "" + +#: 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 " +"[DirectionalLight3D]. Use [method @GDScript.instance_from_id] to obtain the " +"actual nodes. A scenario RID must be provided, which is available in the " +"[World3D] you want to query. This forces an update for all resources queued " +"to update.\n" +"[b]Warning:[/b] This function is primarily intended for editor usage. For in-" +"game use cases, prefer physics collision." +msgstr "" + +#: 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 " +"[DirectionalLight3D]. Use [method @GDScript.instance_from_id] to obtain the " +"actual nodes. A scenario RID must be provided, which is available in the " +"[World3D] you want to query. This forces an update for all resources queued " +"to update.\n" +"[b]Warning:[/b] This function is primarily intended for editor usage. For in-" +"game use cases, prefer physics collision." +msgstr "" + +#: 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 " +"[DirectionalLight3D]. Use [method @GDScript.instance_from_id] to obtain the " +"actual nodes. A scenario RID must be provided, which is available in the " +"[World3D] you want to query. This forces an update for all resources queued " +"to update.\n" +"[b]Warning:[/b] This function is primarily intended for editor usage. For in-" +"game use cases, prefer physics collision." +msgstr "" + +#: 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: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: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: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:1494 +msgid "" +"Sets the color of the light. Equivalent to [member Light3D.light_color]." +msgstr "" + +#: 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: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:1529 +msgid "" +"Sets the specified light parameter. See [enum LightParam] for options. " +"Equivalent to [method Light3D.set_param]." +msgstr "" + +#: 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 " +"cast a shadow on both sides of the mesh, set the mesh to use double sided " +"shadows with [method instance_geometry_set_cast_shadows_setting]. Equivalent " +"to [member Light3D.shadow_reverse_cull_face]." +msgstr "" + +#: 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:1573 +msgid "" +"Sets the color of the shadow cast by the light. Equivalent to [member " +"Light3D.shadow_color]." +msgstr "" + +#: doc/classes/RenderingServer.xml:1584 +msgid "Sets whether GI probes capture light information from this light." +msgstr "" + +#: 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 " +"[code]lightmap_capture_*[/code] RenderingServer functions.\n" +"Once finished with your RID, you will want to free the RID using the " +"RenderingServer's [method free_rid] static method.\n" +"To place in a scene, attach this lightmap capture to an instance using " +"[method instance_set_base] using the returned RID." +msgstr "" + +#: doc/classes/RenderingServer.xml:1602 +msgid "Returns the size of the lightmap capture area." +msgstr "" + +#: doc/classes/RenderingServer.xml:1611 +msgid "Returns the energy multiplier used by the lightmap capture." +msgstr "" + +#: doc/classes/RenderingServer.xml:1620 +msgid "Returns the octree used by the lightmap capture." +msgstr "" + +#: doc/classes/RenderingServer.xml:1629 +msgid "" +"Returns the cell subdivision amount used by this lightmap capture's octree." +msgstr "" + +#: doc/classes/RenderingServer.xml:1638 +msgid "Returns the cell transform for this lightmap capture's octree." +msgstr "" + +#: doc/classes/RenderingServer.xml:1649 +msgid "Sets the size of the area covered by the lightmap capture." +msgstr "" + +#: doc/classes/RenderingServer.xml:1660 +msgid "Sets the energy multiplier for this lightmap capture." +msgstr "" + +#: doc/classes/RenderingServer.xml:1671 +msgid "Sets the octree to be used by this lightmap capture." +msgstr "" + +#: doc/classes/RenderingServer.xml:1682 +msgid "Sets the subdivision level of this lightmap capture's octree." +msgstr "" + +#: doc/classes/RenderingServer.xml:1693 +msgid "Sets the octree cell transform for this lightmap capture's octree." +msgstr "" + +#: 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: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 " +"[code]material_*[/code] RenderingServer functions.\n" +"Once finished with your RID, you will want to free the RID using the " +"RenderingServer's [method free_rid] static method." +msgstr "" + +#: doc/classes/RenderingServer.xml:1725 +msgid "Returns the value of a certain material's parameter." +msgstr "" + +#: doc/classes/RenderingServer.xml:1736 +msgid "Sets an object's next material." +msgstr "" + +#: doc/classes/RenderingServer.xml:1749 +msgid "Sets a material's parameter." +msgstr "" + +#: doc/classes/RenderingServer.xml:1760 +msgid "Sets a material's render priority." +msgstr "" + +#: doc/classes/RenderingServer.xml:1771 +msgid "Sets a shader material's shader." +msgstr "" + +#: doc/classes/RenderingServer.xml:1800 +msgid "Removes all surfaces from a mesh." +msgstr "" + +#: 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_*[/" +"code] RenderingServer functions.\n" +"Once finished with your RID, you will want to free the RID using the " +"RenderingServer's [method free_rid] static method.\n" +"To place in a scene, attach this mesh to an instance using [method " +"instance_set_base] using the returned RID." +msgstr "" + +#: doc/classes/RenderingServer.xml:1818 +msgid "Returns a mesh's blend shape count." +msgstr "" + +#: doc/classes/RenderingServer.xml:1827 +msgid "Returns a mesh's blend shape mode." +msgstr "" + +#: doc/classes/RenderingServer.xml:1836 +msgid "Returns a mesh's custom aabb." +msgstr "" + +#: doc/classes/RenderingServer.xml:1845 +msgid "Returns a mesh's number of surfaces." +msgstr "" + +#: doc/classes/RenderingServer.xml:1856 +msgid "Sets a mesh's blend shape mode." +msgstr "" + +#: doc/classes/RenderingServer.xml:1867 +msgid "Sets a mesh's custom aabb." +msgstr "" + +#: doc/classes/RenderingServer.xml:1878 +msgid "Returns a mesh's surface's buffer arrays." +msgstr "" + +#: doc/classes/RenderingServer.xml:1889 +msgid "Returns a mesh's surface's arrays for blend shapes." +msgstr "" + +#: doc/classes/RenderingServer.xml:1904 doc/classes/RenderingServer.xml:1917 +msgid "Function is unused in Godot 3.x." +msgstr "" + +#: doc/classes/RenderingServer.xml:1928 +msgid "Returns a mesh's surface's material." +msgstr "" + +#: doc/classes/RenderingServer.xml:1941 +msgid "Sets a mesh's surface's material." +msgstr "" + +#: 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: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 " +"functions.\n" +"Once finished with your RID, you will want to free the RID using the " +"RenderingServer's [method free_rid] static method.\n" +"To place in a scene, attach this multimesh to an instance using [method " +"instance_set_base] using the returned RID." +msgstr "" + +#: 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:2007 +msgid "Returns the number of instances allocated for this multimesh." +msgstr "" + +#: 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:2025 +msgid "Returns the number of visible instances for this multimesh." +msgstr "" + +#: doc/classes/RenderingServer.xml:2036 +msgid "Returns the color by which the specified instance will be modulated." +msgstr "" + +#: doc/classes/RenderingServer.xml:2047 +msgid "Returns the custom data associated with the specified instance." +msgstr "" + +#: doc/classes/RenderingServer.xml:2058 +msgid "Returns the [Transform] of the specified instance." +msgstr "" + +#: 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:2082 +msgid "" +"Sets the color by which this instance will be modulated. Equivalent to " +"[method MultiMesh.set_instance_color]." +msgstr "" + +#: 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:2108 +msgid "" +"Sets the [Transform] for this instance. Equivalent to [method MultiMesh." +"set_instance_transform]." +msgstr "" + +#: 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:2142 +msgid "" +"Sets the mesh to be drawn by the multimesh. Equivalent to [member MultiMesh." +"mesh]." +msgstr "" + +#: 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: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 " +"[code]light_*[/code] RenderingServer functions.\n" +"Once finished with your RID, you will want to free the RID using the " +"RenderingServer's [method free_rid] static method.\n" +"To place in a scene, attach this omni light to an instance using [method " +"instance_set_base] using the returned RID." +msgstr "" + +#: 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 " +"[code]particles_*[/code] RenderingServer functions.\n" +"Once finished with your RID, you will want to free the RID using the " +"RenderingServer's [method free_rid] static method.\n" +"To place in a scene, attach these particles to an instance using [method " +"instance_set_base] using the returned RID." +msgstr "" + +#: 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:2189 +msgid "Returns [code]true[/code] if particles are currently set to emitting." +msgstr "" + +#: 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: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 " +"instances_cull_aabb], [method instances_cull_convex], or [method " +"instances_cull_ray]." +msgstr "" + +#: doc/classes/RenderingServer.xml:2216 +msgid "" +"Reset the particles on the next update. Equivalent to [method GPUParticles3D." +"restart]." +msgstr "" + +#: 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:2238 +msgid "" +"Sets a custom axis-aligned bounding box for the particle system. Equivalent " +"to [member GPUParticles3D.visibility_aabb]." +msgstr "" + +#: 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: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:2273 +msgid "" +"Sets the number of draw passes to use. Equivalent to [member GPUParticles3D." +"draw_passes]." +msgstr "" + +#: 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: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:2306 +msgid "" +"Sets the explosiveness ratio. Equivalent to [member GPUParticles3D." +"explosiveness]." +msgstr "" + +#: 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: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:2339 +msgid "" +"Sets the lifetime of each particle in the system. Equivalent to [member " +"GPUParticles3D.lifetime]." +msgstr "" + +#: 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: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: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: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:2394 +msgid "" +"Sets the speed scale of the particle system. Equivalent to [member " +"GPUParticles3D.speed_scale]." +msgstr "" + +#: 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: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 " +"[code]reflection_probe_*[/code] RenderingServer functions.\n" +"Once finished with your RID, you will want to free the RID using the " +"RenderingServer's [method free_rid] static method.\n" +"To place in a scene, attach this reflection probe to an instance using " +"[method instance_set_base] using the returned RID." +msgstr "" + +#: 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: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: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: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:2469 +msgid "" +"Sets the size of the area that the reflection probe will capture. Equivalent " +"to [member ReflectionProbe.extents]." +msgstr "" + +#: 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: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: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: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 " +"ambient light matches the color of the room. Equivalent to [member " +"ReflectionProbe.interior_ambient_contrib]." +msgstr "" + +#: 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: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: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:2559 +msgid "" +"Schedules a callback to the corresponding named [code]method[/code] on " +"[code]where[/code] after a frame has been drawn.\n" +"The callback method must use only 1 argument which will be called with " +"[code]userdata[/code]." +msgstr "" + +#: 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 " +"[code]scenario_*[/code] RenderingServer functions.\n" +"Once finished with your RID, you will want to free the RID using the " +"RenderingServer's [method free_rid] static method.\n" +"The scenario is the 3D world that all the visual instances exist in." +msgstr "" + +#: doc/classes/RenderingServer.xml:2580 +msgid "" +"Sets the [enum ScenarioDebugMode] for this scenario. See [enum " +"ScenarioDebugMode] for options." +msgstr "" + +#: doc/classes/RenderingServer.xml:2591 +msgid "Sets the environment that will be used with this scenario." +msgstr "" + +#: 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: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. " +"If [code]use_filter[/code] is [code]true[/code], the image will be scaled " +"with linear interpolation. If [code]use_filter[/code] is [code]false[/code], " +"the image will be scaled with nearest-neighbor interpolation." +msgstr "" + +#: 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:2635 +msgid "" +"Sets the default clear color which is used when a specific clear color has " +"not been selected." +msgstr "" + +#: 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 " +"[code]shader_*[/code] RenderingServer functions.\n" +"Once finished with your RID, you will want to free the RID using the " +"RenderingServer's [method free_rid] static method." +msgstr "" + +#: doc/classes/RenderingServer.xml:2652 +msgid "Returns a shader's code." +msgstr "" + +#: doc/classes/RenderingServer.xml:2663 +msgid "Returns a default texture from a shader searched by name." +msgstr "" + +#: doc/classes/RenderingServer.xml:2682 +msgid "Returns the parameters of a shader." +msgstr "" + +#: doc/classes/RenderingServer.xml:2693 +msgid "Sets a shader's code." +msgstr "" + +#: doc/classes/RenderingServer.xml:2706 +msgid "Sets a shader's default texture. Overwrites the texture given by name." +msgstr "" + +#: doc/classes/RenderingServer.xml:2719 +msgid "Allocates the GPU buffers for this skeleton." +msgstr "" + +#: doc/classes/RenderingServer.xml:2730 +msgid "Returns the [Transform] set for a specific bone of this skeleton." +msgstr "" + +#: doc/classes/RenderingServer.xml:2741 +msgid "Returns the [Transform2D] set for a specific bone of this skeleton." +msgstr "" + +#: doc/classes/RenderingServer.xml:2754 +msgid "Sets the [Transform] for a specific bone of this skeleton." +msgstr "" + +#: doc/classes/RenderingServer.xml:2767 +msgid "Sets the [Transform2D] for a specific bone of this skeleton." +msgstr "" + +#: 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 " +"[code]skeleton_*[/code] RenderingServer functions.\n" +"Once finished with your RID, you will want to free the RID using the " +"RenderingServer's [method free_rid] static method." +msgstr "" + +#: doc/classes/RenderingServer.xml:2784 +msgid "Returns the number of bones allocated for this skeleton." +msgstr "" + +#: 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_*[/" +"code] RenderingServer functions.\n" +"Once finished with your RID, you will want to free the RID using the " +"RenderingServer's [method free_rid] static method." +msgstr "" + +#: 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: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_*[/" +"code] RenderingServer functions.\n" +"Once finished with your RID, you will want to free the RID using the " +"RenderingServer's [method free_rid] static method.\n" +"To place in a scene, attach this spot light to an instance using [method " +"instance_set_base] using the returned RID." +msgstr "" + +#: doc/classes/RenderingServer.xml:2839 +msgid "Sets a viewport's camera." +msgstr "" + +#: doc/classes/RenderingServer.xml:2850 +msgid "Sets a viewport's canvas." +msgstr "" + +#: 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[/" +"code], then the viewport does not use a framebuffer and the contents of the " +"viewport are rendered directly to screen. However, note that the root " +"viewport is drawn last, therefore it will draw over the screen. Accordingly, " +"you must set the root viewport to an area that does not cover the area that " +"you have attached this viewport to.\n" +"For example, you can set the root viewport to not render at all with the " +"following code:\n" +"[codeblock]\n" +"func _ready():\n" +" get_viewport().set_attach_to_screen_rect(Rect2())\n" +" $Viewport.set_attach_to_screen_rect(Rect2(0, 0, 600, 600))\n" +"[/codeblock]\n" +"Using this can result in significant optimization, especially on lower-end " +"devices. However, it comes at the cost of having to manage your viewports " +"manually. For a further optimization see, [method " +"viewport_set_render_direct_to_screen]." +msgstr "" + +#: 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 " +"[code]viewport_*[/code] RenderingServer functions.\n" +"Once finished with your RID, you will want to free the RID using the " +"RenderingServer's [method free_rid] static method." +msgstr "" + +#: doc/classes/RenderingServer.xml:2889 +msgid "" +"Returns a viewport's render information. For options, see the [enum " +"ViewportRenderInfo] constants." +msgstr "" + +#: doc/classes/RenderingServer.xml:2898 +msgid "Returns the viewport's last rendered frame." +msgstr "" + +#: doc/classes/RenderingServer.xml:2909 +msgid "Detaches a viewport from a canvas and vice versa." +msgstr "" + +#: doc/classes/RenderingServer.xml:2920 +msgid "If [code]true[/code], sets the viewport active, else sets it inactive." +msgstr "" + +#: 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:2949 +msgid "Sets the transformation of a viewport's canvas." +msgstr "" + +#: doc/classes/RenderingServer.xml:2960 +msgid "" +"Sets the clear mode of a viewport. See [enum ViewportClearMode] for options." +msgstr "" + +#: doc/classes/RenderingServer.xml:2971 +msgid "" +"Sets the debug draw mode of a viewport. See [enum ViewportDebugDraw] for " +"options." +msgstr "" + +#: doc/classes/RenderingServer.xml:2982 +msgid "" +"If [code]true[/code], rendering of a viewport's environment is disabled." +msgstr "" + +#: doc/classes/RenderingServer.xml:2993 +msgid "Sets the viewport's global transformation matrix." +msgstr "" + +#: doc/classes/RenderingServer.xml:3004 +msgid "If [code]true[/code], the viewport's canvas is not rendered." +msgstr "" + +#: doc/classes/RenderingServer.xml:3015 +msgid "Currently unimplemented in Godot 3.x." +msgstr "" + +#: doc/classes/RenderingServer.xml:3026 +msgid "Sets the anti-aliasing mode. See [enum ViewportMSAA] for options." +msgstr "" + +#: doc/classes/RenderingServer.xml:3037 +msgid "Sets the viewport's parent to another viewport." +msgstr "" + +#: 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 " +"viewport to the root viewport. While this optimization can result in a " +"significant increase in speed (especially on older devices), it comes at a " +"cost of usability. When this is enabled, you cannot read from the viewport " +"or from the [code]SCREEN_TEXTURE[/code]. You also lose the benefit of " +"certain window settings, such as the various stretch modes. Another " +"consequence to be aware of is that in 2D the rendering happens in window " +"coordinates, so if you have a viewport that is double the size of the " +"window, and you set this, then only the portion that fits within the window " +"will be drawn, no automatic scaling is possible, even if your game scene is " +"significantly larger than the window size." +msgstr "" + +#: 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:3073 +msgid "Sets the shadow atlas quadrant's subdivision." +msgstr "" + +#: 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:3097 +msgid "Sets the viewport's width and height." +msgstr "" + +#: doc/classes/RenderingServer.xml:3108 +msgid "" +"If [code]true[/code], the viewport renders its background as transparent." +msgstr "" + +#: doc/classes/RenderingServer.xml:3119 +msgid "" +"Sets when the viewport should be updated. See [enum ViewportUpdateMode] " +"constants for options." +msgstr "" + +#: doc/classes/RenderingServer.xml:3130 +msgid "" +"If [code]true[/code], the viewport uses augmented or virtual reality " +"technologies. See [XRInterface]." +msgstr "" + +#: 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:3142 +msgid "" +"Emitted at the beginning of the frame, before the RenderingServer updates " +"all the Viewports." +msgstr "" + +#: doc/classes/RenderingServer.xml:3148 +msgid "Marks an error that shows that the index array is empty." +msgstr "" + +#: doc/classes/RenderingServer.xml:3151 +msgid "Number of weights/bones per vertex." +msgstr "" + +#: doc/classes/RenderingServer.xml:3154 +msgid "The minimum Z-layer for canvas items." +msgstr "" + +#: doc/classes/RenderingServer.xml:3157 +msgid "The maximum Z-layer for canvas items." +msgstr "" + +#: 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:3163 +msgid "Unused enum in Godot 3.x." +msgstr "" + +#: doc/classes/RenderingServer.xml:3184 +msgid "Shader is a 3D shader." +msgstr "" + +#: doc/classes/RenderingServer.xml:3187 +msgid "Shader is a 2D shader." +msgstr "" + +#: doc/classes/RenderingServer.xml:3190 +msgid "Shader is a particle shader." +msgstr "" + +#: doc/classes/RenderingServer.xml:3193 +msgid "Shader is a sky shader." +msgstr "" + +#: doc/classes/RenderingServer.xml:3196 +msgid "Represents the size of the [enum ShaderMode] enum." +msgstr "" + +#: 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:3208 +msgid "Array is a normal array." +msgstr "" + +#: doc/classes/RenderingServer.xml:3211 +msgid "Array is a tangent array." +msgstr "" + +#: doc/classes/RenderingServer.xml:3214 +msgid "Array is a color array." +msgstr "" + +#: doc/classes/RenderingServer.xml:3217 +msgid "Array is an UV coordinates array." +msgstr "" + +#: doc/classes/RenderingServer.xml:3220 +msgid "Array is an UV coordinates array for the second UV coordinates." +msgstr "" + +#: doc/classes/RenderingServer.xml:3223 +msgid "Array contains bone information." +msgstr "" + +#: doc/classes/RenderingServer.xml:3226 +msgid "Array is weight information." +msgstr "" + +#: doc/classes/RenderingServer.xml:3229 +msgid "Array is index array." +msgstr "" + +#: doc/classes/RenderingServer.xml:3235 +msgid "Flag used to mark a vertex array." +msgstr "" + +#: doc/classes/RenderingServer.xml:3238 +msgid "Flag used to mark a normal array." +msgstr "" + +#: doc/classes/RenderingServer.xml:3241 +msgid "Flag used to mark a tangent array." +msgstr "" + +#: doc/classes/RenderingServer.xml:3244 +msgid "Flag used to mark a color array." +msgstr "" + +#: doc/classes/RenderingServer.xml:3247 +msgid "Flag used to mark an UV coordinates array." +msgstr "" + +#: doc/classes/RenderingServer.xml:3250 +msgid "" +"Flag used to mark an UV coordinates array for the second UV coordinates." +msgstr "" + +#: doc/classes/RenderingServer.xml:3253 +msgid "Flag used to mark a bone information array." +msgstr "" + +#: doc/classes/RenderingServer.xml:3256 +msgid "Flag used to mark a weights array." +msgstr "" + +#: doc/classes/RenderingServer.xml:3259 +msgid "Flag used to mark an index array." +msgstr "" + +#: doc/classes/RenderingServer.xml:3288 +msgid "Primitive to draw consists of points." +msgstr "" + +#: doc/classes/RenderingServer.xml:3291 +msgid "Primitive to draw consists of lines." +msgstr "" + +#: doc/classes/RenderingServer.xml:3294 +msgid "Primitive to draw consists of a line strip from start to end." +msgstr "" + +#: doc/classes/RenderingServer.xml:3297 +msgid "Primitive to draw consists of triangles." +msgstr "" + +#: 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:3303 +msgid "Represents the size of the [enum PrimitiveType] enum." +msgstr "" + +#: doc/classes/RenderingServer.xml:3312 +msgid "Use [Transform2D] to store MultiMesh transform." +msgstr "" + +#: doc/classes/RenderingServer.xml:3315 +msgid "Use [Transform] to store MultiMesh transform." +msgstr "" + +#: doc/classes/RenderingServer.xml:3318 +msgid "Is a directional (sun) light." +msgstr "" + +#: doc/classes/RenderingServer.xml:3321 +msgid "Is an omni light." +msgstr "" + +#: doc/classes/RenderingServer.xml:3324 +msgid "Is a spot light." +msgstr "" + +#: doc/classes/RenderingServer.xml:3327 +msgid "The light's energy." +msgstr "" + +#: doc/classes/RenderingServer.xml:3332 +msgid "The light's influence on specularity." +msgstr "" + +#: doc/classes/RenderingServer.xml:3335 +msgid "The light's range." +msgstr "" + +#: 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:3344 +msgid "The spotlight's angle." +msgstr "" + +#: doc/classes/RenderingServer.xml:3347 +msgid "The spotlight's attenuation." +msgstr "" + +#: doc/classes/RenderingServer.xml:3350 +msgid "Max distance that shadows will be rendered." +msgstr "" + +#: doc/classes/RenderingServer.xml:3353 +msgid "Proportion of shadow atlas occupied by the first split." +msgstr "" + +#: doc/classes/RenderingServer.xml:3356 +msgid "Proportion of shadow atlas occupied by the second split." +msgstr "" + +#: 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: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:3368 +msgid "Bias the shadow lookup to fix self-shadowing artifacts." +msgstr "" + +#: doc/classes/RenderingServer.xml:3379 +msgid "Represents the size of the [enum LightParam] enum." +msgstr "" + +#: doc/classes/RenderingServer.xml:3382 +msgid "Use a dual paraboloid shadow map for omni lights." +msgstr "" + +#: 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:3388 +msgid "Use orthogonal shadow projection for directional light." +msgstr "" + +#: doc/classes/RenderingServer.xml:3391 +msgid "Use 2 splits for shadow projection when using directional light." +msgstr "" + +#: doc/classes/RenderingServer.xml:3394 +msgid "Use 4 splits for shadow projection when using directional light." +msgstr "" + +#: doc/classes/RenderingServer.xml:3397 +msgid "" +"Keeps shadows stable as camera moves but has lower effective resolution." +msgstr "" + +#: 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:3403 +msgid "Reflection probe will update reflections once and then stop." +msgstr "" + +#: 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:3419 +msgid "Draw particles in the order that they appear in the particles array." +msgstr "" + +#: doc/classes/RenderingServer.xml:3422 +msgid "Sort particles based on their lifetime." +msgstr "" + +#: doc/classes/RenderingServer.xml:3425 +msgid "Sort particles based on their distance to the camera." +msgstr "" + +#: doc/classes/RenderingServer.xml:3428 +msgid "Do not update the viewport." +msgstr "" + +#: doc/classes/RenderingServer.xml:3431 +msgid "Update the viewport once then set to disabled." +msgstr "" + +#: doc/classes/RenderingServer.xml:3434 +msgid "Update the viewport whenever it is visible." +msgstr "" + +#: doc/classes/RenderingServer.xml:3439 +msgid "Always update the viewport." +msgstr "" + +#: doc/classes/RenderingServer.xml:3442 +msgid "The viewport is always cleared before drawing." +msgstr "" + +#: doc/classes/RenderingServer.xml:3445 +msgid "The viewport is never cleared before drawing." +msgstr "" + +#: 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:3451 +msgid "Multisample antialiasing is disabled." +msgstr "" + +#: doc/classes/RenderingServer.xml:3454 +msgid "Multisample antialiasing uses 2 samples per pixel." +msgstr "" + +#: doc/classes/RenderingServer.xml:3457 +msgid "Multisample antialiasing uses 4 samples per pixel." +msgstr "" + +#: doc/classes/RenderingServer.xml:3460 +msgid "Multisample antialiasing uses 8 samples per pixel." +msgstr "" + +#: doc/classes/RenderingServer.xml:3463 +msgid "Multisample antialiasing uses 16 samples per pixel." +msgstr "" + +#: doc/classes/RenderingServer.xml:3474 +msgid "Number of objects drawn in a single frame." +msgstr "" + +#: doc/classes/RenderingServer.xml:3477 +msgid "Number of vertices drawn in a single frame." +msgstr "" + +#: doc/classes/RenderingServer.xml:3480 +msgid "Number of material changes during this frame." +msgstr "" + +#: doc/classes/RenderingServer.xml:3483 +msgid "Number of shader changes during this frame." +msgstr "" + +#: doc/classes/RenderingServer.xml:3486 +msgid "Number of surface changes during this frame." +msgstr "" + +#: doc/classes/RenderingServer.xml:3489 +msgid "Number of draw calls during this frame." +msgstr "" + +#: doc/classes/RenderingServer.xml:3492 +msgid "Represents the size of the [enum ViewportRenderInfo] enum." +msgstr "" + +#: doc/classes/RenderingServer.xml:3495 +msgid "Debug draw is disabled. Default setting." +msgstr "" + +#: 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: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:3507 +msgid "Debug draw draws objects in wireframe." +msgstr "" + +#: 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:3551 +msgid "Use a specified color as the background." +msgstr "" + +#: doc/classes/RenderingServer.xml:3554 +msgid "Use a sky resource for the background." +msgstr "" + +#: 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:3560 +msgid "" +"Do not clear the background, use whatever was rendered last frame as the " +"background." +msgstr "" + +#: doc/classes/RenderingServer.xml:3566 +msgid "Represents the size of the [enum EnvironmentBG] enum." +msgstr "" + +#: doc/classes/RenderingServer.xml:3605 +msgid "Output color as they came in." +msgstr "" + +#: doc/classes/RenderingServer.xml:3608 +msgid "Use the Reinhard tonemapper." +msgstr "" + +#: doc/classes/RenderingServer.xml:3611 +msgid "Use the filmic tonemapper." +msgstr "" + +#: doc/classes/RenderingServer.xml:3614 +msgid "Use the ACES tonemapper." +msgstr "" + +#: doc/classes/RenderingServer.xml:3625 +msgid "Disables the blur set for SSAO. Will make SSAO look noisier." +msgstr "" + +#: doc/classes/RenderingServer.xml:3628 +msgid "Perform a 1x1 blur on the SSAO output." +msgstr "" + +#: doc/classes/RenderingServer.xml:3631 +msgid "Performs a 2x2 blur on the SSAO output." +msgstr "" + +#: doc/classes/RenderingServer.xml:3634 +msgid "Performs a 3x3 blur on the SSAO output. Use this for smoothest SSAO." +msgstr "" + +#: doc/classes/RenderingServer.xml:3637 +msgid "Lowest quality of screen space ambient occlusion." +msgstr "" + +#: doc/classes/RenderingServer.xml:3640 +msgid "Medium quality screen space ambient occlusion." +msgstr "" + +#: 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: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:3693 +msgid "Draw all objects as wireframe models." +msgstr "" + +#: 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:3699 +msgid "" +"Draw all objects without shading. Equivalent to setting all objects shaders " +"to [code]unshaded[/code]." +msgstr "" + +#: doc/classes/RenderingServer.xml:3702 +msgid "The instance does not have a type." +msgstr "" + +#: doc/classes/RenderingServer.xml:3705 +msgid "The instance is a mesh." +msgstr "" + +#: doc/classes/RenderingServer.xml:3708 +msgid "The instance is a multimesh." +msgstr "" + +#: doc/classes/RenderingServer.xml:3711 +msgid "The instance is an immediate geometry." +msgstr "" + +#: doc/classes/RenderingServer.xml:3714 +msgid "The instance is a particle emitter." +msgstr "" + +#: doc/classes/RenderingServer.xml:3717 +msgid "The instance is a light." +msgstr "" + +#: doc/classes/RenderingServer.xml:3720 +msgid "The instance is a reflection probe." +msgstr "" + +#: 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:3729 +msgid "The instance is a lightmap capture." +msgstr "" + +#: doc/classes/RenderingServer.xml:3732 +msgid "Represents the size of the [enum InstanceType] enum." +msgstr "" + +#: doc/classes/RenderingServer.xml:3735 +msgid "" +"A combination of the flags of geometry instances (mesh, multimesh, immediate " +"and particles)." +msgstr "" + +#: doc/classes/RenderingServer.xml:3738 +msgid "Allows the instance to be used in baked lighting." +msgstr "" + +#: 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:3747 +msgid "Represents the size of the [enum InstanceFlags] enum." +msgstr "" + +#: doc/classes/RenderingServer.xml:3750 +msgid "Disable shadows from this instance." +msgstr "" + +#: doc/classes/RenderingServer.xml:3753 +msgid "Cast shadows from this instance." +msgstr "" + +#: 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:3759 +msgid "" +"Only render the shadows from the object. The object itself will not be drawn." +msgstr "" + +#: doc/classes/RenderingServer.xml:3762 +msgid "The nine patch gets stretched where needed." +msgstr "" + +#: doc/classes/RenderingServer.xml:3765 +msgid "The nine patch gets filled with tiles where needed." +msgstr "" + +#: 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: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:3813 +msgid "Adds light color subtractive to the canvas." +msgstr "" + +#: doc/classes/RenderingServer.xml:3816 +msgid "The light adds color depending on transparency." +msgstr "" + +#: doc/classes/RenderingServer.xml:3819 +msgid "The light adds color depending on mask." +msgstr "" + +#: doc/classes/RenderingServer.xml:3822 +msgid "Do not apply a filter to canvas light shadows." +msgstr "" + +#: doc/classes/RenderingServer.xml:3825 +msgid "Use PCF5 filtering to filter canvas light shadows." +msgstr "" + +#: doc/classes/RenderingServer.xml:3828 +msgid "Use PCF13 filtering to filter canvas light shadows." +msgstr "" + +#: 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:3837 +msgid "Culling of the canvas occluder is clockwise." +msgstr "" + +#: doc/classes/RenderingServer.xml:3840 +msgid "Culling of the canvas occluder is counterclockwise." +msgstr "" + +#: doc/classes/RenderingServer.xml:3901 +msgid "The amount of objects in the frame." +msgstr "" + +#: doc/classes/RenderingServer.xml:3904 +msgid "The amount of vertices in the frame." +msgstr "" + +#: doc/classes/RenderingServer.xml:3907 +msgid "The amount of modified materials in the frame." +msgstr "" + +#: doc/classes/RenderingServer.xml:3910 +msgid "The amount of shader rebinds in the frame." +msgstr "" + +#: doc/classes/RenderingServer.xml:3913 +msgid "The amount of surface changes in the frame." +msgstr "" + +#: doc/classes/RenderingServer.xml:3916 +msgid "The amount of draw calls in frame." +msgstr "" + +#: doc/classes/RenderingServer.xml:3931 +msgid "Hardware supports shaders. This enum is currently unused in Godot 3.x." +msgstr "" + +#: doc/classes/RenderingServer.xml:3934 +msgid "" +"Hardware supports multithreading. This enum is currently unused in Godot 3.x." +msgstr "" + +#: doc/classes/Resource.xml:4 +msgid "Base class for all resources." +msgstr "" + +#: doc/classes/Resource.xml:7 +msgid "" +"Resource is the base class for all Godot-specific resource types, serving " +"primarily as data containers. They are reference counted and freed when no " +"longer in use. They are also cached once loaded from disk, so that any " +"further attempts to load a resource from a given path will return the same " +"reference (all this in contrast to a [Node], which is not reference counted " +"and can be instanced from disk as many times as desired). Resources can be " +"saved externally on disk or bundled into another object, such as a [Node] or " +"another resource." +msgstr "" + +#: doc/classes/Resource.xml:10 +msgid "" +"https://docs.godotengine.org/en/latest/getting_started/step_by_step/" +"resources.html" +msgstr "" + +#: doc/classes/Resource.xml:17 +msgid "" +"Virtual function which can be overridden to customize the behavior value of " +"[method setup_local_to_scene]." +msgstr "" + +#: doc/classes/Resource.xml:26 +msgid "" +"Duplicates the resource, returning a new resource. By default, sub-resources " +"are shared between resource copies for efficiency, this can be changed by " +"passing [code]true[/code] to the [code]subresources[/code] argument." +msgstr "" + +#: doc/classes/Resource.xml:33 +msgid "" +"If [member resource_local_to_scene] is enabled and the resource was loaded " +"from a [PackedScene] instantiation, returns the local scene where this " +"resource's unique copy is in use. Otherwise, returns [code]null[/code]." +msgstr "" + +#: doc/classes/Resource.xml:40 +msgid "" +"Returns the RID of the resource (or an empty RID). Many resources (such as " +"[Texture2D], [Mesh], etc) are high-level abstractions of resources stored in " +"a server, so this function will return the original RID." +msgstr "" + +#: doc/classes/Resource.xml:47 +msgid "" +"This method is called when a resource with [member resource_local_to_scene] " +"enabled is loaded from a [PackedScene] instantiation. Its behavior can be " +"customized by overriding [method _setup_local_to_scene] from script.\n" +"For most resources, this method performs no base logic. [ViewportTexture] " +"performs custom logic to properly set the proxy texture and flags in the " +"local viewport." +msgstr "" + +#: doc/classes/Resource.xml:57 +msgid "" +"Sets the path of the resource, potentially overriding an existing cache " +"entry for this path. This differs from setting [member resource_path], as " +"the latter would error out if another resource was already cached for the " +"given path." +msgstr "" + +#: doc/classes/Resource.xml:63 +msgid "" +"If [code]true[/code], the resource will be made unique in each instance of " +"its local scene. It can thus be modified in a scene instance without " +"impacting other instances of that same scene." +msgstr "" + +#: doc/classes/Resource.xml:66 +msgid "The name of the resource. This is an optional identifier." +msgstr "" + +#: doc/classes/Resource.xml:69 +msgid "" +"The path to the resource. In case it has its own file, it will return its " +"filepath. If it's tied to the scene, it will return the scene's path, " +"followed by the resource's index." +msgstr "" + +#: doc/classes/Resource.xml:75 +msgid "Emitted whenever the resource changes." +msgstr "" + +#: doc/classes/ResourceFormatLoader.xml:4 +msgid "Loads a specific resource type from a file." +msgstr "" + +#: doc/classes/ResourceFormatLoader.xml:7 +msgid "" +"Godot loads resources in the editor or in exported games using " +"ResourceFormatLoaders. They are queried automatically via the " +"[ResourceLoader] singleton, or when a resource with internal dependencies is " +"loaded. Each file type may load as a different resource type, so multiple " +"ResourceFormatLoaders are registered in the engine.\n" +"Extending this class allows you to define your own loader. Be sure to " +"respect the documented return types and values. You should give it a global " +"class name with [code]class_name[/code] for it to be registered. Like built-" +"in ResourceFormatLoaders, it will be called automatically when loading " +"resources of its handled type(s). You may also implement a " +"[ResourceFormatSaver].\n" +"[b]Note:[/b] You can also extend [EditorImportPlugin] if the resource type " +"you need exists but Godot is unable to load its format. Choosing one way " +"over another depends if the format is suitable or not for the final exported " +"game. For example, it's better to import [code].png[/code] textures as " +"[code].stex[/code] ([StreamTexture]) first, so they can be loaded with " +"better efficiency on the graphics card." +msgstr "" + +#: doc/classes/ResourceFormatLoader.xml:22 +msgid "" +"If implemented, gets the dependencies of a given resource. If " +"[code]add_types[/code] is [code]true[/code], paths should be appended " +"[code]::TypeName[/code], where [code]TypeName[/code] is the class name of " +"the dependency.\n" +"[b]Note:[/b] Custom resource types defined by scripts aren't known by the " +"[ClassDB], so you might just return [code]\"Resource\"[/code] for them." +msgstr "" + +#: doc/classes/ResourceFormatLoader.xml:30 +msgid "Gets the list of extensions for files this loader is able to read." +msgstr "" + +#: doc/classes/ResourceFormatLoader.xml:39 +msgid "" +"Gets the class name of the resource associated with the given path. If the " +"loader cannot handle it, it should return [code]\"\"[/code].\n" +"[b]Note:[/b] Custom resource types defined by scripts aren't known by the " +"[ClassDB], so you might just return [code]\"Resource\"[/code] for them." +msgstr "" + +#: doc/classes/ResourceFormatLoader.xml:49 +msgid "" +"Tells which resource class this loader can load.\n" +"[b]Note:[/b] Custom resource types defined by scripts aren't known by the " +"[ClassDB], so you might just handle [code]\"Resource\"[/code] for them." +msgstr "" + +#: doc/classes/ResourceFormatLoader.xml:61 +msgid "" +"Loads a resource when the engine finds this loader to be compatible. If the " +"loaded resource is the result of an import, [code]original_path[/code] will " +"target the source file. Returns a [Resource] object on success, or an [enum " +"Error] constant in case of failure." +msgstr "" + +#: doc/classes/ResourceFormatLoader.xml:72 +msgid "" +"If implemented, renames dependencies within the given resource and saves it. " +"[code]renames[/code] is a dictionary [code]{ String => String }[/code] " +"mapping old dependency paths to new paths.\n" +"Returns [constant OK] on success, or an [enum Error] constant in case of " +"failure." +msgstr "" + +#: doc/classes/ResourceFormatSaver.xml:4 +msgid "Saves a specific resource type to a file." +msgstr "" + +#: doc/classes/ResourceFormatSaver.xml:7 +msgid "" +"The engine can save resources when you do it from the editor, or when you " +"use the [ResourceSaver] singleton. This is accomplished thanks to multiple " +"[ResourceFormatSaver]s, each handling its own format and called " +"automatically by the engine.\n" +"By default, Godot saves resources as [code].tres[/code] (text-based), [code]." +"res[/code] (binary) or another built-in format, but you can choose to create " +"your own format by extending this class. Be sure to respect the documented " +"return types and values. You should give it a global class name with " +"[code]class_name[/code] for it to be registered. Like built-in " +"ResourceFormatSavers, it will be called automatically when saving resources " +"of its recognized type(s). You may also implement a [ResourceFormatLoader]." +msgstr "" + +#: doc/classes/ResourceFormatSaver.xml:19 +msgid "" +"Returns the list of extensions available for saving the resource object, " +"provided it is recognized (see [method recognize])." +msgstr "" + +#: doc/classes/ResourceFormatSaver.xml:28 +msgid "Returns whether the given resource object can be saved by this saver." +msgstr "" + +#: doc/classes/ResourceFormatSaver.xml:41 +msgid "" +"Saves the given resource object to a file at the target [code]path[/code]. " +"[code]flags[/code] is a bitmask composed with [enum ResourceSaver." +"SaverFlags] constants.\n" +"Returns [constant OK] on success, or an [enum Error] constant in case of " +"failure." +msgstr "" + +#: doc/classes/ResourceLoader.xml:4 +msgid "Singleton used to load resource files." +msgstr "" + +#: doc/classes/ResourceLoader.xml:7 +msgid "" +"Singleton used to load resource files from the filesystem.\n" +"It uses the many [ResourceFormatLoader] classes registered in the engine " +"(either built-in or from a plugin) to load files into memory and convert " +"them to a format that can be used by the engine.\n" +"GDScript has a simplified [method @GDScript.load] built-in method which can " +"be used in most situations, leaving the use of [ResourceLoader] for more " +"advanced scenarios." +msgstr "" + +#: doc/classes/ResourceLoader.xml:22 +msgid "" +"Returns whether a recognized resource exists for the given [code]path[/" +"code].\n" +"An optional [code]type_hint[/code] can be used to further specify the " +"[Resource] type that should be handled by the [ResourceFormatLoader]." +msgstr "" + +#: doc/classes/ResourceLoader.xml:32 +msgid "" +"Returns the dependencies for the resource at the given [code]path[/code]." +msgstr "" + +#: doc/classes/ResourceLoader.xml:41 +msgid "Returns the list of recognized extensions for a resource type." +msgstr "" + +#: doc/classes/ResourceLoader.xml:50 +msgid "" +"Returns whether a cached resource is available for the given [code]path[/" +"code].\n" +"Once a resource has been loaded by the engine, it is cached in memory for " +"faster access, and future calls to the [method load] method will use the " +"cached version. The cached resource can be overridden by using [method " +"Resource.take_over_path] on a new resource for that same path." +msgstr "" + +#: doc/classes/ResourceLoader.xml:64 +msgid "" +"Loads a resource at the given [code]path[/code], caching the result for " +"further access.\n" +"The registered [ResourceFormatLoader]s are queried sequentially to find the " +"first one which can handle the file's extension, and then attempt loading. " +"If loading fails, the remaining ResourceFormatLoaders are also attempted.\n" +"An optional [code]type_hint[/code] can be used to further specify the " +"[Resource] type that should be handled by the [ResourceFormatLoader].\n" +"If [code]no_cache[/code] is [code]true[/code], the resource cache will be " +"bypassed and the resource will be loaded anew. Otherwise, the cached " +"resource will be returned if it exists.\n" +"Returns an empty resource if no ResourceFormatLoader could handle the file." +msgstr "" + +#: doc/classes/ResourceLoader.xml:77 +msgid "" +"Returns the resource loaded by [method load_threaded_request].\n" +"If this is called before the loading thread is done (i.e. [method " +"load_threaded_get_status] is not [constant THREAD_LOAD_LOADED]), the calling " +"thread will be blocked until the resource has finished loading." +msgstr "" + +#: doc/classes/ResourceLoader.xml:89 +msgid "" +"Returns the status of a threaded loading operation started with [method " +"load_threaded_request] for the resource at [code]path[/code]. See [enum " +"ThreadLoadStatus] for possible return values.\n" +"An array variable can optionally be passed via [code]progress[/code], and " +"will return a one-element array containing the percentage of completion of " +"the threaded loading." +msgstr "" + +#: doc/classes/ResourceLoader.xml:103 +msgid "" +"Loads the resource using threads. If [code]use_sub_threads[/code] is " +"[code]true[/code], multiple threads will be used to load the resource, which " +"makes loading faster, but may affect the main thread (and thus cause game " +"slowdowns)." +msgstr "" + +#: doc/classes/ResourceLoader.xml:112 +msgid "" +"Changes the behavior on missing sub-resources. The default behavior is to " +"abort loading." +msgstr "" + +#: doc/classes/ResourceLoader.xml:118 +msgid "" +"The resource is invalid, or has not been loaded with [method " +"load_threaded_request]." +msgstr "" + +#: doc/classes/ResourceLoader.xml:121 +msgid "The resource is still being loaded." +msgstr "" + +#: doc/classes/ResourceLoader.xml:124 +msgid "Some error occurred during loading and it failed." +msgstr "" + +#: doc/classes/ResourceLoader.xml:127 +msgid "" +"The resource was loaded successfully and can be accessed via [method " +"load_threaded_get]." +msgstr "" + +#: doc/classes/ResourcePreloader.xml:4 +msgid "Resource Preloader Node." +msgstr "" + +#: doc/classes/ResourcePreloader.xml:7 +msgid "" +"This node is used to preload sub-resources inside a scene, so when the scene " +"is loaded, all the resources are ready to use and can be retrieved from the " +"preloader.\n" +"GDScript has a simplified [method @GDScript.preload] built-in method which " +"can be used in most situations, leaving the use of [ResourcePreloader] for " +"more advanced scenarios." +msgstr "" + +#: doc/classes/ResourcePreloader.xml:21 +msgid "" +"Adds a resource to the preloader with the given [code]name[/code]. If a " +"resource with the given [code]name[/code] already exists, the new resource " +"will be renamed to \"[code]name[/code] N\" where N is an incrementing number " +"starting from 2." +msgstr "" + +#: doc/classes/ResourcePreloader.xml:30 +msgid "Returns the resource associated to [code]name[/code]." +msgstr "" + +#: doc/classes/ResourcePreloader.xml:37 +msgid "Returns the list of resources inside the preloader." +msgstr "" + +#: doc/classes/ResourcePreloader.xml:46 +msgid "" +"Returns [code]true[/code] if the preloader contains a resource associated to " +"[code]name[/code]." +msgstr "" + +#: doc/classes/ResourcePreloader.xml:55 +msgid "" +"Removes the resource associated to [code]name[/code] from the preloader." +msgstr "" + +#: doc/classes/ResourcePreloader.xml:66 +msgid "" +"Renames a resource inside the preloader from [code]name[/code] to " +"[code]newname[/code]." +msgstr "" + +#: doc/classes/ResourceSaver.xml:4 +msgid "Singleton for saving Godot-specific resource types." +msgstr "" + +#: doc/classes/ResourceSaver.xml:7 +msgid "" +"Singleton for saving Godot-specific resource types to the filesystem.\n" +"It uses the many [ResourceFormatSaver] classes registered in the engine " +"(either built-in or from a plugin) to save engine-specific resource data to " +"text-based (e.g. [code].tres[/code] or [code].tscn[/code]) or binary files " +"(e.g. [code].res[/code] or [code].scn[/code])." +msgstr "" + +#: doc/classes/ResourceSaver.xml:19 +msgid "" +"Returns the list of extensions available for saving a resource of a given " +"type." +msgstr "" + +#: doc/classes/ResourceSaver.xml:32 +msgid "" +"Saves a resource to disk to the given path, using a [ResourceFormatSaver] " +"that recognizes the resource object.\n" +"The [code]flags[/code] bitmask can be specified to customize the save " +"behavior.\n" +"Returns [constant OK] on success." +msgstr "" + +#: doc/classes/ResourceSaver.xml:40 +msgid "Save the resource with a path relative to the scene which uses it." +msgstr "" + +#: doc/classes/ResourceSaver.xml:43 +msgid "Bundles external resources." +msgstr "" + +#: doc/classes/ResourceSaver.xml:46 +msgid "" +"Changes the [member Resource.resource_path] of the saved resource to match " +"its new location." +msgstr "" + +#: doc/classes/ResourceSaver.xml:49 +msgid "" +"Do not save editor-specific metadata (identified by their [code]__editor[/" +"code] prefix)." +msgstr "" + +#: doc/classes/ResourceSaver.xml:52 +msgid "Save as big endian (see [member File.endian_swap])." +msgstr "" + +#: doc/classes/ResourceSaver.xml:55 +msgid "" +"Compress the resource on save using [constant File.COMPRESSION_ZSTD]. Only " +"available for binary resource types." +msgstr "" + +#: doc/classes/ResourceSaver.xml:58 +msgid "" +"Take over the paths of the saved subresources (see [method Resource." +"take_over_path])." +msgstr "" + +#: doc/classes/RichTextEffect.xml:4 +msgid "A custom effect for use with [RichTextLabel]." +msgstr "" + +#: doc/classes/RichTextEffect.xml:7 +msgid "" +"A custom effect for use with [RichTextLabel].\n" +"[b]Note:[/b] For a [RichTextEffect] to be usable, a BBCode tag must be " +"defined as a member variable called [code]bbcode[/code] in the script.\n" +"[codeblock]\n" +"# The RichTextEffect will be usable like this: `[example]Some text[/" +"example]`\n" +"var bbcode = \"example\"\n" +"[/codeblock]\n" +"[b]Note:[/b] As soon as a [RichTextLabel] contains at least one " +"[RichTextEffect], it will continuously process the effect unless the project " +"is paused. This may impact battery life negatively." +msgstr "" + +#: doc/classes/RichTextEffect.xml:26 +msgid "" +"Override this method to modify properties in [code]char_fx[/code]. The " +"method must return [code]true[/code] if the character could be transformed " +"successfully. If the method returns [code]false[/code], it will skip " +"transformation to avoid displaying broken text." +msgstr "" + +#: doc/classes/RichTextLabel.xml:4 +msgid "Label that displays rich text." +msgstr "" + +#: doc/classes/RichTextLabel.xml:7 +msgid "" +"Rich text can contain custom text, fonts, images and some basic formatting. " +"The label manages these as an internal tag stack. It also adapts itself to " +"given width/heights.\n" +"[b]Note:[/b] Assignments to [member bbcode_text] clear the tag stack and " +"reconstruct it from the property's contents. Any edits made to [member " +"bbcode_text] will erase previous edits made from other manual sources such " +"as [method append_bbcode] and the [code]push_*[/code] / [method pop] methods." +msgstr "" + +#: doc/classes/RichTextLabel.xml:24 +msgid "" +"Adds an image's opening and closing tags to the tag stack, optionally " +"providing a [code]width[/code] and [code]height[/code] to resize the image.\n" +"If [code]width[/code] or [code]height[/code] is set to 0, the image size " +"will be adjusted in order to keep the original aspect ratio." +msgstr "" + +#: doc/classes/RichTextLabel.xml:34 +msgid "Adds raw non-BBCode-parsed text to the tag stack." +msgstr "" + +#: doc/classes/RichTextLabel.xml:43 +msgid "" +"Parses [code]bbcode[/code] and adds tags to the tag stack as needed. Returns " +"the result of the parsing, [constant OK] if successful." +msgstr "" + +#: doc/classes/RichTextLabel.xml:50 +msgid "Clears the tag stack and sets [member bbcode_text] to an empty string." +msgstr "" + +#: doc/classes/RichTextLabel.xml:57 +msgid "Returns the height of the content." +msgstr "" + +#: doc/classes/RichTextLabel.xml:64 +msgid "" +"Returns the total number of newlines in the tag stack's text tags. Considers " +"wrapped text as one line." +msgstr "" + +#: doc/classes/RichTextLabel.xml:71 +msgid "" +"Returns the total number of characters from text tags. Does not include " +"BBCodes." +msgstr "" + +#: doc/classes/RichTextLabel.xml:78 +msgid "Returns the vertical scrollbar." +msgstr "" + +#: doc/classes/RichTextLabel.xml:85 +msgid "Returns the number of visible lines." +msgstr "" + +#: doc/classes/RichTextLabel.xml:94 +msgid "" +"Installs a custom effect. [code]effect[/code] should be a valid " +"[RichTextEffect]." +msgstr "" + +#: doc/classes/RichTextLabel.xml:101 +msgid "Adds a newline tag to the tag stack." +msgstr "" + +#: doc/classes/RichTextLabel.xml:110 +msgid "" +"The assignment version of [method append_bbcode]. Clears the tag stack and " +"inserts the new content. Returns [constant OK] if parses [code]bbcode[/code] " +"successfully." +msgstr "" + +#: doc/classes/RichTextLabel.xml:119 +msgid "Parses BBCode parameter [code]expressions[/code] into a dictionary." +msgstr "" + +#: doc/classes/RichTextLabel.xml:126 +msgid "" +"Terminates the current tag. Use after [code]push_*[/code] methods to close " +"BBCodes manually. Does not need to follow [code]add_*[/code] methods." +msgstr "" + +#: doc/classes/RichTextLabel.xml:135 +msgid "" +"Adds an [code][align][/code] tag based on the given [code]align[/code] " +"value. See [enum Align] for possible values." +msgstr "" + +#: doc/classes/RichTextLabel.xml:142 +msgid "" +"Adds a [code][font][/code] tag with a bold font to the tag stack. This is " +"the same as adding a [code][b][/code] tag if not currently in a [code][i][/" +"code] tag." +msgstr "" + +#: doc/classes/RichTextLabel.xml:149 +msgid "" +"Adds a [code][font][/code] tag with a bold italics font to the tag stack." +msgstr "" + +#: doc/classes/RichTextLabel.xml:156 +msgid "" +"Adds a [code][cell][/code] tag to the tag stack. Must be inside a [code]" +"[table][/code] tag. See [method push_table] for details." +msgstr "" + +#: doc/classes/RichTextLabel.xml:165 +msgid "Adds a [code][color][/code] tag to the tag stack." +msgstr "" + +#: doc/classes/RichTextLabel.xml:174 +msgid "" +"Adds a [code][font][/code] tag to the tag stack. Overrides default fonts for " +"its duration." +msgstr "" + +#: doc/classes/RichTextLabel.xml:183 +msgid "" +"Adds an [code][indent][/code] tag to the tag stack. Multiplies [code]level[/" +"code] by current [member tab_size] to determine new margin length." +msgstr "" + +#: doc/classes/RichTextLabel.xml:190 +msgid "" +"Adds a [code][font][/code] tag with a italics font to the tag stack. This is " +"the same as adding a [code][i][/code] tag if not currently in a [code][b][/" +"code] tag." +msgstr "" + +#: doc/classes/RichTextLabel.xml:199 +msgid "" +"Adds a [code][list][/code] tag to the tag stack. Similar to the BBCodes " +"[code][ol][/code] or [code][ul][/code], but supports more list types. Not " +"fully implemented!" +msgstr "" + +#: doc/classes/RichTextLabel.xml:208 +msgid "" +"Adds a [code][meta][/code] tag to the tag stack. Similar to the BBCode [code]" +"[url=something]{text}[/url][/code], but supports non-[String] metadata types." +msgstr "" + +#: doc/classes/RichTextLabel.xml:215 +msgid "Adds a [code][font][/code] tag with a monospace font to the tag stack." +msgstr "" + +#: doc/classes/RichTextLabel.xml:222 +msgid "Adds a [code][font][/code] tag with a normal font to the tag stack." +msgstr "" + +#: doc/classes/RichTextLabel.xml:229 +msgid "Adds a [code][s][/code] tag to the tag stack." +msgstr "" + +#: doc/classes/RichTextLabel.xml:238 +msgid "Adds a [code][table=columns][/code] tag to the tag stack." +msgstr "" + +#: doc/classes/RichTextLabel.xml:245 +msgid "Adds a [code][u][/code] tag to the tag stack." +msgstr "" + +#: doc/classes/RichTextLabel.xml:254 +msgid "" +"Removes a line of content from the label. Returns [code]true[/code] if the " +"line exists.\n" +"The [code]line[/code] argument is the index of the line to remove, it can " +"take values in the interval [code][0, get_line_count() - 1][/code]." +msgstr "" + +#: doc/classes/RichTextLabel.xml:264 +msgid "Scrolls the window's top line to match [code]line[/code]." +msgstr "" + +#: doc/classes/RichTextLabel.xml:277 +msgid "" +"Edits the selected column's expansion options. If [code]expand[/code] is " +"[code]true[/code], the column expands in proportion to its expansion ratio " +"versus the other columns' ratios.\n" +"For example, 2 columns with ratios 3 and 4 plus 70 pixels in available width " +"would expand 30 and 40 pixels, respectively.\n" +"If [code]expand[/code] is [code]false[/code], the column will not contribute " +"to the total ratio." +msgstr "" + +#: doc/classes/RichTextLabel.xml:285 +msgid "If [code]true[/code], the label uses BBCode formatting." +msgstr "" + +#: doc/classes/RichTextLabel.xml:288 +msgid "" +"The label's text in BBCode format. Is not representative of manual " +"modifications to the internal tag stack. Erases changes made by other " +"methods when edited.\n" +"[b]Note:[/b] It is unadvised to use [code]+=[/code] operator with " +"[code]bbcode_text[/code] (e.g. [code]bbcode_text += \"some string\"[/code]) " +"as it replaces the whole text and can cause slowdowns. Use [method " +"append_bbcode] for adding text instead." +msgstr "" + +#: doc/classes/RichTextLabel.xml:292 +msgid "" +"The currently installed custom effects. This is an array of " +"[RichTextEffect]s.\n" +"To add a custom effect, it's more convenient to use [method install_effect]." +msgstr "" + +#: doc/classes/RichTextLabel.xml:296 +msgid "" +"If [code]true[/code], the label underlines meta tags such as [code][url]" +"{text}[/url][/code]." +msgstr "" + +#: doc/classes/RichTextLabel.xml:299 +msgid "If [code]true[/code], the label uses the custom font color." +msgstr "" + +#: doc/classes/RichTextLabel.xml:302 +msgid "" +"The range of characters to display, as a [float] between 0.0 and 1.0. When " +"assigned an out of range value, it's the same as assigning 1.0.\n" +"[b]Note:[/b] Setting this property updates [member visible_characters] based " +"on current [method get_total_character_count]." +msgstr "" + +#: doc/classes/RichTextLabel.xml:307 +msgid "" +"If [code]true[/code], the scrollbar is visible. Setting this to [code]false[/" +"code] does not block scrolling completely. See [method scroll_to_line]." +msgstr "" + +#: doc/classes/RichTextLabel.xml:310 +msgid "" +"If [code]true[/code], the window scrolls down to display new content " +"automatically." +msgstr "" + +#: doc/classes/RichTextLabel.xml:313 +msgid "If [code]true[/code], the label allows text selection." +msgstr "" + +#: doc/classes/RichTextLabel.xml:316 +msgid "" +"The number of spaces associated with a single tab length. Does not affect " +"[code]\\t[/code] in text tags, only indent tags." +msgstr "" + +#: doc/classes/RichTextLabel.xml:319 +msgid "" +"The raw text of the label.\n" +"When set, clears the tag stack and adds a raw text tag to the top of it. " +"Does not parse BBCodes. Does not modify [member bbcode_text]." +msgstr "" + +#: doc/classes/RichTextLabel.xml:323 +msgid "" +"The restricted number of characters to display in the label. If [code]-1[/" +"code], all characters will be displayed." +msgstr "" + +#: doc/classes/RichTextLabel.xml:331 +msgid "" +"Triggered when the user clicks on content between meta tags. If the meta is " +"defined in text, e.g. [code][url={\"data\"=\"hi\"}]hi[/url][/code], then the " +"parameter for this signal will be a [String] type. If a particular type or " +"an object is desired, the [method push_meta] method must be used to manually " +"insert the data into the tag stack." +msgstr "" + +#: doc/classes/RichTextLabel.xml:338 +msgid "Triggers when the mouse exits a meta tag." +msgstr "" + +#: doc/classes/RichTextLabel.xml:345 +msgid "Triggers when the mouse enters a meta tag." +msgstr "" + +#: doc/classes/RichTextLabel.xml:351 +msgid "Makes text left aligned." +msgstr "" + +#: doc/classes/RichTextLabel.xml:354 +msgid "Makes text centered." +msgstr "" + +#: doc/classes/RichTextLabel.xml:357 +msgid "Makes text right aligned." +msgstr "" + +#: doc/classes/RichTextLabel.xml:360 +msgid "Makes text fill width." +msgstr "" + +#: doc/classes/RichTextLabel.xml:363 +msgid "Each list item has a number marker." +msgstr "" + +#: doc/classes/RichTextLabel.xml:366 +msgid "Each list item has a letter marker." +msgstr "" + +#: doc/classes/RichTextLabel.xml:369 +msgid "Each list item has a filled circle marker." +msgstr "" + +#: doc/classes/RichTextLabel.xml:412 +msgid "The font used for bold text." +msgstr "" + +#: doc/classes/RichTextLabel.xml:415 +msgid "The font used for bold italics text." +msgstr "" + +#: doc/classes/RichTextLabel.xml:418 +msgid "The default text color." +msgstr "" + +#: doc/classes/RichTextLabel.xml:421 +msgid "The background The background used when the [RichTextLabel] is focused." +msgstr "" + +#: doc/classes/RichTextLabel.xml:424 +msgid "" +"The color of selected text, used when [member selection_enabled] is " +"[code]true[/code]." +msgstr "" + +#: doc/classes/RichTextLabel.xml:427 +msgid "The color of the font's shadow." +msgstr "" + +#: doc/classes/RichTextLabel.xml:430 +msgid "The font used for italics text." +msgstr "" + +#: doc/classes/RichTextLabel.xml:433 +msgid "The vertical space between lines." +msgstr "" + +#: doc/classes/RichTextLabel.xml:436 +msgid "The font used for monospace text." +msgstr "" + +#: doc/classes/RichTextLabel.xml:439 +msgid "The normal background for the [RichTextLabel]." +msgstr "" + +#: doc/classes/RichTextLabel.xml:442 +msgid "The default text font." +msgstr "" + +#: doc/classes/RichTextLabel.xml:445 +msgid "The color of the selection box." +msgstr "" + +#: doc/classes/RichTextLabel.xml:448 +msgid "" +"Boolean value. If 1 ([code]true[/code]), the shadow will be displayed around " +"the whole text as an outline." +msgstr "" + +#: doc/classes/RichTextLabel.xml:451 +msgid "The horizontal offset of the font's shadow." +msgstr "" + +#: doc/classes/RichTextLabel.xml:454 +msgid "The vertical offset of the font's shadow." +msgstr "" + +#: doc/classes/RichTextLabel.xml:457 +msgid "The horizontal separation of elements in a table." +msgstr "" + +#: doc/classes/RichTextLabel.xml:460 +msgid "The vertical separation of elements in a table." +msgstr "" + +#: doc/classes/RID.xml:4 +msgid "Handle for a [Resource]'s unique ID." +msgstr "" + +#: doc/classes/RID.xml:7 +msgid "" +"The RID type is used to access the unique integer ID of a resource. They are " +"opaque, which means they do not grant access to the associated resource by " +"themselves. They are used by and with the low-level Server classes such as " +"[RenderingServer]." +msgstr "" + +#: doc/classes/RID.xml:18 +msgid "" +"Creates a new RID instance with the ID of a given resource. When not handed " +"a valid resource, silently stores the unused ID 0." +msgstr "" + +#: doc/classes/RID.xml:25 +msgid "Returns the ID of the referenced resource." +msgstr "" + +#: doc/classes/RigidBody2D.xml:4 +msgid "A body that is controlled by the 2D physics engine." +msgstr "" + +#: doc/classes/RigidBody2D.xml:7 +msgid "" +"This node implements simulated 2D physics. You do not control a RigidBody2D " +"directly. Instead you apply forces to it (gravity, impulses, etc.) and the " +"physics simulation calculates the resulting movement based on its mass, " +"friction, and other physical properties.\n" +"A RigidBody2D has 4 behavior [member mode]s: Rigid, Static, Character, and " +"Kinematic.\n" +"[b]Note:[/b] You should not change a RigidBody2D's [code]position[/code] or " +"[code]linear_velocity[/code] every frame or even very often. If you need to " +"directly affect the body's state, use [method _integrate_forces], which " +"allows you to directly access the physics state.\n" +"Please also keep in mind that physics bodies manage their own transform " +"which overwrites the ones you set. So any direct or indirect transformation " +"(including scaling of the node or its parent) will be visible in the editor " +"only, and immediately reset at runtime.\n" +"If you need to override the default physics behavior or add a transformation " +"at runtime, you can write a custom force integration. See [member " +"custom_integrator]." +msgstr "" + +#: doc/classes/RigidBody2D.xml:22 +msgid "" +"Allows you to read and safely modify the simulation state for the object. " +"Use this instead of [method Node._physics_process] if you need to directly " +"change the body's [code]position[/code] or other physics properties. By " +"default, it works in addition to the usual physics behavior, but [member " +"custom_integrator] allows you to disable the default behavior and write " +"custom force integration for a body." +msgstr "" + +#: doc/classes/RigidBody2D.xml:71 +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. " +"For this reason it should only be used when simulating one-time impacts (use " +"the \"_force\" functions otherwise). The position uses the rotation of the " +"global coordinate system, but is centered at the object's origin." +msgstr "" + +#: doc/classes/RigidBody2D.xml:87 +msgid "" +"Returns a list of the bodies colliding with this one. Use [member " +"contacts_reported] to set the maximum number reported. You must also set " +"[member contact_monitor] to [code]true[/code].\n" +"[b]Note:[/b] The result of this test is not immediate after moving objects. " +"For performance, list of collisions is updated once per frame and before the " +"physics step. Consider using signals instead." +msgstr "" + +#: doc/classes/RigidBody2D.xml:97 +msgid "" +"Sets the body's velocity on the given axis. The velocity in the given vector " +"axis will be set as the given vector length. This is useful for jumping " +"behavior." +msgstr "" + +#: doc/classes/RigidBody2D.xml:112 +msgid "" +"Returns [code]true[/code] if a collision would result from moving in the " +"given vector. [code]margin[/code] increases the size of the shapes involved " +"in the collision detection, and [code]result[/code] is an object of type " +"[PhysicsTestMotionResult2D], which contains additional information about the " +"collision (should there be one)." +msgstr "" + +#: doc/classes/RigidBody2D.xml:118 +msgid "" +"Damps the body's [member angular_velocity]. If [code]-1[/code], the body " +"will use the [b]Default Angular Damp[/b] defined in [b]Project > Project " +"Settings > Physics > 2d[/b]." +msgstr "" + +#: doc/classes/RigidBody2D.xml:124 +msgid "The body's total applied force." +msgstr "" + +#: doc/classes/RigidBody2D.xml:127 +msgid "The body's total applied torque." +msgstr "" + +#: doc/classes/RigidBody2D.xml:130 +msgid "" +"If [code]true[/code], the body will not calculate forces and will act as a " +"static body if there is no movement. The body will wake up when other forces " +"are applied via collisions or by using [method apply_impulse] or [method " +"add_force]." +msgstr "" + +#: doc/classes/RigidBody2D.xml:133 +msgid "" +"If [code]true[/code], the body will emit signals when it collides with " +"another RigidBody2D. See also [member contacts_reported]." +msgstr "" + +#: doc/classes/RigidBody2D.xml:136 +msgid "The maximum number of contacts to report." +msgstr "" + +#: doc/classes/RigidBody2D.xml:139 +msgid "" +"Continuous collision detection mode.\n" +"Continuous collision detection tries to predict where a moving body will " +"collide instead of moving it and correcting its movement after collision. " +"Continuous collision detection is slower, but more precise and misses fewer " +"collisions with small, fast-moving objects. Raycasting and shapecasting " +"methods are available. See [enum CCDMode] for details." +msgstr "" + +#: doc/classes/RigidBody2D.xml:143 +msgid "" +"If [code]true[/code], internal force integration is disabled for this body. " +"Aside from collision response, the body will only move as determined by the " +"[method _integrate_forces] function." +msgstr "" + +#: doc/classes/RigidBody2D.xml:146 +msgid "" +"Multiplies the gravity applied to the body. The body's gravity is calculated " +"from the [b]Default Gravity[/b] value in [b]Project > Project Settings > " +"Physics > 2d[/b] and/or any additional gravity vector applied by [Area2D]s." +msgstr "" + +#: doc/classes/RigidBody2D.xml:149 +msgid "" +"The body's moment of inertia. This is like mass, but for rotation: it " +"determines how much torque it takes to rotate the body. The moment of " +"inertia is usually computed automatically from the mass and the shapes, but " +"this function allows you to set a custom value. Set 0 inertia to return to " +"automatically computing it." +msgstr "" + +#: doc/classes/RigidBody2D.xml:152 +msgid "" +"Damps the body's [member linear_velocity]. If [code]-1[/code], the body will " +"use the [b]Default Linear Damp[/b] in [b]Project > Project Settings > " +"Physics > 2d[/b]." +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:181 +#: doc/classes/StaticBody2D.xml:22 doc/classes/StaticBody3D.xml:22 +msgid "" +"The physics material override for the body.\n" +"If a material is assigned to this property, it will be used instead of any " +"other physics material, such as an inherited one." +msgstr "" + +#: doc/classes/RigidBody2D.xml:168 +msgid "" +"If [code]true[/code], the body is sleeping and will not calculate forces " +"until woken up by a collision or by using [method apply_impulse] or [method " +"add_force]." +msgstr "" + +#: doc/classes/RigidBody2D.xml:171 +msgid "" +"The body's weight based on its mass and the [b]Default Gravity[/b] value in " +"[b]Project > Project Settings > Physics > 2d[/b]." +msgstr "" + +#: doc/classes/RigidBody2D.xml:179 +msgid "" +"Emitted when a body enters into contact with this one. [member " +"contact_monitor] must be [code]true[/code] and [member contacts_reported] " +"greater than [code]0[/code]." +msgstr "" + +#: doc/classes/RigidBody2D.xml:186 +msgid "" +"Emitted when a body exits contact with this one. [member contact_monitor] " +"must be [code]true[/code] and [member contacts_reported] greater than " +"[code]0[/code]." +msgstr "" + +#: doc/classes/RigidBody2D.xml:199 +msgid "" +"Emitted when a body enters into contact with this one. Reports colliding " +"shape information. See [CollisionObject2D] for shape index information. " +"[member contact_monitor] must be [code]true[/code] and [member " +"contacts_reported] greater than [code]0[/code]." +msgstr "" + +#: doc/classes/RigidBody2D.xml:212 +msgid "" +"Emitted when a body shape exits contact with this one. Reports colliding " +"shape information. See [CollisionObject2D] for shape index information. " +"[member contact_monitor] must be [code]true[/code] and [member " +"contacts_reported] greater than [code]0[/code]." +msgstr "" + +#: doc/classes/RigidBody2D.xml:217 +msgid "Emitted when [member sleeping] changes." +msgstr "" + +#: doc/classes/RigidBody2D.xml:223 +msgid "" +"Rigid mode. The body behaves as a physical object. It collides with other " +"bodies and responds to forces applied to it. This is the default mode." +msgstr "" + +#: doc/classes/RigidBody2D.xml:226 +msgid "Static mode. The body behaves like a [StaticBody2D] and does not move." +msgstr "" + +#: doc/classes/RigidBody2D.xml:229 +msgid "" +"Character mode. Similar to [constant MODE_RIGID], but the body can not " +"rotate." +msgstr "" + +#: doc/classes/RigidBody2D.xml:232 +msgid "" +"Kinematic mode. The body behaves like a [KinematicBody2D], and must be moved " +"by code." +msgstr "" + +#: doc/classes/RigidBody2D.xml:235 +msgid "" +"Continuous collision detection disabled. This is the fastest way to detect " +"body collisions, but can miss small, fast-moving objects." +msgstr "" + +#: doc/classes/RigidBody2D.xml:238 +msgid "" +"Continuous collision detection enabled using raycasting. This is faster than " +"shapecasting but less precise." +msgstr "" + +#: doc/classes/RigidBody2D.xml:241 +msgid "" +"Continuous collision detection enabled using shapecasting. This is the " +"slowest CCD method and the most precise." +msgstr "" + +#: doc/classes/RigidBody3D.xml:4 +msgid "" +"Physics Body whose position is determined through physics simulation in 3D " +"space." +msgstr "" + +#: doc/classes/RigidBody3D.xml:7 +msgid "" +"This is the node that implements full 3D physics. This means that you do not " +"control a RigidBody3D directly. Instead, you can apply forces to it " +"(gravity, impulses, etc.), and the physics simulation will calculate the " +"resulting movement, collision, bouncing, rotating, etc.\n" +"A RigidBody3D has 4 behavior [member mode]s: Rigid, Static, Character, and " +"Kinematic.\n" +"[b]Note:[/b] Don't change a RigidBody3D's position every frame or very " +"often. Sporadic changes work fine, but physics runs at a different " +"granularity (fixed Hz) than usual rendering (process callback) and maybe " +"even in a separate thread, so changing this from a process loop may result " +"in strange behavior. If you need to directly affect the body's state, use " +"[method _integrate_forces], which allows you to directly access the physics " +"state.\n" +"If you need to override the default physics behavior, you can write a custom " +"force integration function. See [member custom_integrator]." +msgstr "" + +#: doc/classes/RigidBody3D.xml:22 +msgid "" +"Called during physics processing, allowing you to read and safely modify the " +"simulation state for the object. By default, it works in addition to the " +"usual physics behavior, but the [member custom_integrator] property allows " +"you to disable the default behavior and do fully custom force integration " +"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 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:53 +msgid "" +"Adds a constant rotational force (i.e. a motor) without affecting position." +msgstr "" + +#: 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: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. " +"For this reason it should only be used when simulating one-time impacts. The " +"position uses the rotation of the global coordinate system, but is centered " +"at the object's origin." +msgstr "" + +#: 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:92 +msgid "" +"Returns [code]true[/code] if the specified linear or rotational axis is " +"locked." +msgstr "" + +#: 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 " +"to increase it.\n" +"[b]Note:[/b] The result of this test is not immediate after moving objects. " +"For performance, list of collisions is updated once per frame and before the " +"physics step. Consider using signals instead." +msgstr "" + +#: doc/classes/RigidBody3D.xml:111 +msgid "Locks the specified linear or rotational axis." +msgstr "" + +#: doc/classes/RigidBody3D.xml:126 +msgid "Damps RigidBody3D's rotational forces." +msgstr "" + +#: doc/classes/RigidBody3D.xml:129 +msgid "RigidBody3D's rotational velocity." +msgstr "" + +#: 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: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:159 +msgid "" +"If [code]true[/code], continuous collision detection is used.\n" +"Continuous collision detection tries to predict where a moving body will " +"collide, instead of moving it and correcting its movement if it collided. " +"Continuous collision detection is more precise, and misses fewer impacts by " +"small, fast-moving objects. Not using continuous collision detection is " +"faster to compute, but can miss small, fast-moving objects." +msgstr "" + +#: 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 " +"body will only move as determined by the [method _integrate_forces] " +"function, if defined." +msgstr "" + +#: 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 " +"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/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: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 " +"different granularity. Use [method _integrate_forces] as your process loop " +"for precise control of the body state." +msgstr "" + +#: doc/classes/RigidBody3D.xml:178 +msgid "The body mode. See [enum Mode] for possible values." +msgstr "" + +#: 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: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: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: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" +"This signal not only receives the body that collided with this one, but also " +"its [RID] ([code]body_id[/code]), the shape index from the colliding body " +"([code]body_shape[/code]), and the shape index from this body " +"([code]local_shape[/code]) the other body collided with." +msgstr "" + +#: 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" +"This signal not only receives the body that stopped colliding with this one, " +"but also its [RID] ([code]body_id[/code]), the shape index from the " +"colliding body ([code]body_shape[/code]), and the shape index from this body " +"([code]local_shape[/code]) the other body stopped colliding with." +msgstr "" + +#: 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: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:245 +msgid "" +"Static mode. The body behaves like a [StaticBody3D], and can only move by " +"user code." +msgstr "" + +#: doc/classes/RigidBody3D.xml:248 +msgid "" +"Character body mode. This behaves like a rigid body, but can not rotate." +msgstr "" + +#: doc/classes/RigidBody3D.xml:251 +msgid "" +"Kinematic body mode. The body behaves like a [KinematicBody3D], and can only " +"move by user code." +msgstr "" + +#: doc/classes/SceneState.xml:4 +msgid "A script interface to a scene file's data." +msgstr "" + +#: doc/classes/SceneState.xml:7 +msgid "" +"Maintains a list of resources, nodes, exported, and overridden properties, " +"and built-in scripts associated with a scene.\n" +"This class cannot be instantiated directly, it is retrieved for a given " +"scene as the result of [method PackedScene.get_state]." +msgstr "" + +#: doc/classes/SceneState.xml:19 +msgid "" +"Returns the list of bound parameters for the signal at [code]idx[/code]." +msgstr "" + +#: doc/classes/SceneState.xml:26 +msgid "" +"Returns the number of signal connections in the scene.\n" +"The [code]idx[/code] argument used to query connection metadata in other " +"[code]get_connection_*[/code] methods in the interval [code][0, " +"get_connection_count() - 1][/code]." +msgstr "" + +#: doc/classes/SceneState.xml:36 +msgid "" +"Returns the connection flags for the signal at [code]idx[/code]. See [enum " +"Object.ConnectFlags] constants." +msgstr "" + +#: doc/classes/SceneState.xml:45 +msgid "Returns the method connected to the signal at [code]idx[/code]." +msgstr "" + +#: doc/classes/SceneState.xml:54 +msgid "Returns the name of the signal at [code]idx[/code]." +msgstr "" + +#: doc/classes/SceneState.xml:63 +msgid "" +"Returns the path to the node that owns the signal at [code]idx[/code], " +"relative to the root node." +msgstr "" + +#: doc/classes/SceneState.xml:72 +msgid "" +"Returns the path to the node that owns the method connected to the signal at " +"[code]idx[/code], relative to the root node." +msgstr "" + +#: doc/classes/SceneState.xml:79 +msgid "" +"Returns the number of nodes in the scene.\n" +"The [code]idx[/code] argument used to query node data in other " +"[code]get_node_*[/code] methods in the interval [code][0, get_node_count() - " +"1][/code]." +msgstr "" + +#: doc/classes/SceneState.xml:89 +msgid "" +"Returns the list of group names associated with the node at [code]idx[/code]." +msgstr "" + +#: doc/classes/SceneState.xml:98 +msgid "" +"Returns the node's index, which is its position relative to its siblings. " +"This is only relevant and saved in scenes for cases where new nodes are " +"added to an instanced or inherited scene among siblings from the base scene. " +"Despite the name, this index is not related to the [code]idx[/code] argument " +"used here and in other methods." +msgstr "" + +#: doc/classes/SceneState.xml:107 +msgid "" +"Returns a [PackedScene] for the node at [code]idx[/code] (i.e. the whole " +"branch starting at this node, with its child nodes and resources), or " +"[code]null[/code] if the node is not an instance." +msgstr "" + +#: doc/classes/SceneState.xml:116 +msgid "" +"Returns the path to the represented scene file if the node at [code]idx[/" +"code] is an [InstancePlaceholder]." +msgstr "" + +#: doc/classes/SceneState.xml:125 +msgid "Returns the name of the node at [code]idx[/code]." +msgstr "" + +#: doc/classes/SceneState.xml:134 +msgid "" +"Returns the path to the owner of the node at [code]idx[/code], relative to " +"the root node." +msgstr "" + +#: doc/classes/SceneState.xml:145 +msgid "" +"Returns the path to the node at [code]idx[/code].\n" +"If [code]for_parent[/code] is [code]true[/code], returns the path of the " +"[code]idx[/code] node's parent instead." +msgstr "" + +#: doc/classes/SceneState.xml:155 +msgid "" +"Returns the number of exported or overridden properties for the node at " +"[code]idx[/code].\n" +"The [code]prop_idx[/code] argument used to query node property data in other " +"[code]get_node_property_*[/code] methods in the interval [code][0, " +"get_node_property_count() - 1][/code]." +msgstr "" + +#: doc/classes/SceneState.xml:167 +msgid "" +"Returns the name of the property at [code]prop_idx[/code] for the node at " +"[code]idx[/code]." +msgstr "" + +#: doc/classes/SceneState.xml:178 +msgid "" +"Returns the value of the property at [code]prop_idx[/code] for the node at " +"[code]idx[/code]." +msgstr "" + +#: doc/classes/SceneState.xml:187 +msgid "Returns the type of the node at [code]idx[/code]." +msgstr "" + +#: doc/classes/SceneState.xml:196 +msgid "" +"Returns [code]true[/code] if the node at [code]idx[/code] is an " +"[InstancePlaceholder]." +msgstr "" + +#: doc/classes/SceneState.xml:202 +msgid "" +"If passed to [method PackedScene.instance], blocks edits to the scene state." +msgstr "" + +#: doc/classes/SceneState.xml:205 +msgid "" +"If passed to [method PackedScene.instance], provides inherited scene " +"resources to the local scene.\n" +"[b]Note:[/b] Only available in editor builds." +msgstr "" + +#: doc/classes/SceneState.xml:209 +msgid "" +"If passed to [method PackedScene.instance], provides local scene resources " +"to the local scene. Only the main scene should receive the main edit state.\n" +"[b]Note:[/b] Only available in editor builds." +msgstr "" + +#: doc/classes/SceneTree.xml:4 +msgid "Manages the game loop via a hierarchy of nodes." +msgstr "" + +#: doc/classes/SceneTree.xml:7 +msgid "" +"As one of the most important classes, the [SceneTree] manages the hierarchy " +"of nodes in a scene as well as scenes themselves. Nodes can be added, " +"retrieved and removed. The whole scene tree (and thus the current scene) can " +"be paused. Scenes can be loaded, switched and reloaded.\n" +"You can also use the [SceneTree] to organize your nodes into groups: every " +"node can be assigned as many groups as you want to create, e.g. a \"enemy\" " +"group. You can then iterate these groups or even call methods and set " +"properties on all the group's members at once.\n" +"[SceneTree] is the default [MainLoop] implementation used by scenes, and is " +"thus in charge of the game loop." +msgstr "" + +#: doc/classes/SceneTree.xml:12 +msgid "" +"https://docs.godotengine.org/en/latest/getting_started/step_by_step/" +"scene_tree.html" +msgstr "" + +#: doc/classes/SceneTree.xml:13 +msgid "" +"https://docs.godotengine.org/en/latest/tutorials/viewports/" +"multiple_resolutions.html" +msgstr "" + +#: doc/classes/SceneTree.xml:24 +msgid "Calls [code]method[/code] on each member of the given group." +msgstr "" + +#: doc/classes/SceneTree.xml:37 +msgid "" +"Calls [code]method[/code] on each member of the given group, respecting the " +"given [enum GroupCallFlags]." +msgstr "" + +#: doc/classes/SceneTree.xml:46 +msgid "" +"Changes the running scene to the one at the given [code]path[/code], after " +"loading it into a [PackedScene] and creating a new instance.\n" +"Returns [constant OK] on success, [constant ERR_CANT_OPEN] if the " +"[code]path[/code] cannot be loaded into a [PackedScene], or [constant " +"ERR_CANT_CREATE] if that scene cannot be instantiated." +msgstr "" + +#: doc/classes/SceneTree.xml:56 +msgid "" +"Changes the running scene to a new instance of the given [PackedScene].\n" +"Returns [constant OK] on success or [constant ERR_CANT_CREATE] if the scene " +"cannot be instantiated." +msgstr "" + +#: doc/classes/SceneTree.xml:68 +msgid "" +"Returns a [SceneTreeTimer] which will [signal SceneTreeTimer.timeout] after " +"the given time in seconds elapsed in this [SceneTree]. If " +"[code]pause_mode_process[/code] is set to [code]false[/code], pausing the " +"[SceneTree] will also pause the timer.\n" +"Commonly used to create a one-shot delay timer as in the following example:\n" +"[codeblock]\n" +"func some_function():\n" +" print(\"start\")\n" +" yield(get_tree().create_timer(1.0), \"timeout\")\n" +" print(\"end\")\n" +"[/codeblock]" +msgstr "" + +#: doc/classes/SceneTree.xml:82 +msgid "" +"Returns the current frame number, i.e. the total frame count since the " +"application started." +msgstr "" + +#: doc/classes/SceneTree.xml:89 +msgid "" +"Returns the peer IDs of all connected peers of this [SceneTree]'s [member " +"network_peer]." +msgstr "" + +#: doc/classes/SceneTree.xml:96 +msgid "Returns the unique peer ID of this [SceneTree]'s [member network_peer]." +msgstr "" + +#: doc/classes/SceneTree.xml:103 +msgid "Returns the number of nodes in this [SceneTree]." +msgstr "" + +#: doc/classes/SceneTree.xml:112 +msgid "Returns a list of all nodes assigned to the given group." +msgstr "" + +#: doc/classes/SceneTree.xml:119 +msgid "Returns the sender's peer ID for the most recently received RPC call." +msgstr "" + +#: doc/classes/SceneTree.xml:128 +msgid "Returns [code]true[/code] if the given group exists." +msgstr "" + +#: doc/classes/SceneTree.xml:142 +msgid "" +"Returns [code]true[/code] if this [SceneTree]'s [member network_peer] is in " +"server mode (listening for connections)." +msgstr "" + +#: doc/classes/SceneTree.xml:153 +msgid "Sends the given notification to all members of the [code]group[/code]." +msgstr "" + +#: doc/classes/SceneTree.xml:166 +msgid "" +"Sends the given notification to all members of the [code]group[/code], " +"respecting the given [enum GroupCallFlags]." +msgstr "" + +#: doc/classes/SceneTree.xml:175 +msgid "" +"Queues the given object for deletion, delaying the call to [method Object." +"free] to after the current frame." +msgstr "" + +#: doc/classes/SceneTree.xml:184 +msgid "" +"Quits the application. A process [code]exit_code[/code] can optionally be " +"passed as an argument. If this argument is [code]0[/code] or greater, it " +"will override the [member OS.exit_code] defined before quitting the " +"application." +msgstr "" + +#: doc/classes/SceneTree.xml:191 +msgid "" +"Reloads the currently active scene.\n" +"Returns [constant OK] on success, [constant ERR_UNCONFIGURED] if no [member " +"current_scene] was defined yet, [constant ERR_CANT_OPEN] if [member " +"current_scene] cannot be loaded into a [PackedScene], or [constant " +"ERR_CANT_CREATE] if the scene cannot be instantiated." +msgstr "" + +#: doc/classes/SceneTree.xml:201 +msgid "" +"If [code]true[/code], the application automatically accepts quitting. " +"Enabled by default.\n" +"For mobile platforms, see [method set_quit_on_go_back]." +msgstr "" + +#: doc/classes/SceneTree.xml:215 +msgid "" +"Sets the given [code]property[/code] to [code]value[/code] on all members of " +"the given group." +msgstr "" + +#: doc/classes/SceneTree.xml:230 +msgid "" +"Sets the given [code]property[/code] to [code]value[/code] on all members of " +"the given group, respecting the given [enum GroupCallFlags]." +msgstr "" + +#: doc/classes/SceneTree.xml:239 +msgid "" +"If [code]true[/code], the application quits automatically on going back (e." +"g. on Android). Enabled by default.\n" +"To handle 'Go Back' button when this option is disabled, use [constant " +"DisplayServer.WINDOW_EVENT_GO_BACK_REQUEST]." +msgstr "" + +#: doc/classes/SceneTree.xml:246 +msgid "The current scene." +msgstr "" + +#: doc/classes/SceneTree.xml:249 +msgid "" +"If [code]true[/code], collision shapes will be visible when running the game " +"from the editor for debugging purposes." +msgstr "" + +#: doc/classes/SceneTree.xml:252 +msgid "" +"If [code]true[/code], navigation polygons will be visible when running the " +"game from the editor for debugging purposes." +msgstr "" + +#: doc/classes/SceneTree.xml:255 +msgid "The root of the edited scene." +msgstr "" + +#: doc/classes/SceneTree.xml:258 +msgid "The default [MultiplayerAPI] instance for this [SceneTree]." +msgstr "" + +#: doc/classes/SceneTree.xml:261 +msgid "" +"If [code]true[/code] (default value), enables automatic polling of the " +"[MultiplayerAPI] for this SceneTree during [signal idle_frame].\n" +"If [code]false[/code], you need to manually call [method MultiplayerAPI." +"poll] to process network packets and deliver RPCs/RSETs. This allows running " +"RPCs/RSETs in a different loop (e.g. physics, thread, specific time step) " +"and for manual [Mutex] protection when accessing the [MultiplayerAPI] from " +"threads." +msgstr "" + +#: doc/classes/SceneTree.xml:265 +msgid "" +"The peer object to handle the RPC system (effectively enabling networking " +"when set). Depending on the peer itself, the [SceneTree] will become a " +"network server (check with [method is_network_server]) and will set the root " +"node's network mode to master, or it will become a regular peer with the " +"root node set to puppet. All child nodes are set to inherit the network mode " +"by default. Handling of networking-related events (connection, " +"disconnection, new clients) is done by connecting to [SceneTree]'s signals." +msgstr "" + +#: doc/classes/SceneTree.xml:268 +msgid "" +"If [code]true[/code], the [SceneTree] is paused. Doing so will have the " +"following behavior:\n" +"- 2D and 3D physics will be stopped.\n" +"- [method Node._process], [method Node._physics_process] and [method Node." +"_input] will not be called anymore in nodes." +msgstr "" + +#: doc/classes/SceneTree.xml:273 +msgid "" +"If [code]true[/code], the [SceneTree]'s [member network_peer] refuses new " +"incoming connections." +msgstr "" + +#: doc/classes/SceneTree.xml:276 +msgid "The [SceneTree]'s root [Window]." +msgstr "" + +#: doc/classes/SceneTree.xml:282 +msgid "" +"Emitted whenever this [SceneTree]'s [member network_peer] successfully " +"connected to a server. Only emitted on clients." +msgstr "" + +#: doc/classes/SceneTree.xml:287 +msgid "" +"Emitted whenever this [SceneTree]'s [member network_peer] fails to establish " +"a connection to a server. Only emitted on clients." +msgstr "" + +#: doc/classes/SceneTree.xml:296 +msgid "" +"Emitted when files are dragged from the OS file manager and dropped in the " +"game window. The arguments are a list of file paths and the identifier of " +"the screen where the drag originated." +msgstr "" + +#: doc/classes/SceneTree.xml:301 +msgid "" +"Emitted immediately before [method Node._process] is called on every node in " +"the [SceneTree]." +msgstr "" + +#: doc/classes/SceneTree.xml:308 +msgid "" +"Emitted whenever this [SceneTree]'s [member network_peer] connects with a " +"new peer. ID is the peer ID of the new peer. Clients get notified when other " +"clients connect to the same server. Upon connecting to a server, a client " +"also receives this signal for the server (with ID being 1)." +msgstr "" + +#: doc/classes/SceneTree.xml:315 +msgid "" +"Emitted whenever this [SceneTree]'s [member network_peer] disconnects from a " +"peer. Clients get notified when other clients disconnect from the same " +"server." +msgstr "" + +#: doc/classes/SceneTree.xml:322 +msgid "Emitted whenever a node is added to the [SceneTree]." +msgstr "" + +#: doc/classes/SceneTree.xml:329 +msgid "" +"Emitted when a node's configuration changed. Only emitted in [code]tool[/" +"code] mode." +msgstr "" + +#: doc/classes/SceneTree.xml:336 +msgid "Emitted whenever a node is removed from the [SceneTree]." +msgstr "" + +#: doc/classes/SceneTree.xml:343 +msgid "Emitted whenever a node is renamed." +msgstr "" + +#: doc/classes/SceneTree.xml:348 +msgid "" +"Emitted immediately before [method Node._physics_process] is called on every " +"node in the [SceneTree]." +msgstr "" + +#: doc/classes/SceneTree.xml:353 +msgid "" +"Emitted whenever this [SceneTree]'s [member network_peer] disconnected from " +"server. Only emitted on clients." +msgstr "" + +#: doc/classes/SceneTree.xml:358 +msgid "" +"Emitted whenever the [SceneTree] hierarchy changed (children being moved or " +"renamed, etc.)." +msgstr "" + +#: doc/classes/SceneTree.xml:364 +msgid "Call a group with no flags (default)." +msgstr "" + +#: doc/classes/SceneTree.xml:367 +msgid "Call a group in reverse scene order." +msgstr "" + +#: doc/classes/SceneTree.xml:370 +msgid "Call a group immediately (calls are normally made on idle)." +msgstr "" + +#: doc/classes/SceneTree.xml:373 +msgid "Call a group only once even if the call is executed many times." +msgstr "" + +#: doc/classes/SceneTreeTimer.xml:4 +msgid "One-shot timer." +msgstr "" + +#: doc/classes/SceneTreeTimer.xml:7 +msgid "" +"A one-shot timer managed by the scene tree, which emits [signal timeout] on " +"completion. See also [method SceneTree.create_timer].\n" +"As opposed to [Timer], it does not require the instantiation of a node. " +"Commonly used to create a one-shot delay timer as in the following example:\n" +"[codeblock]\n" +"func some_function():\n" +" print(\"Timer started.\")\n" +" yield(get_tree().create_timer(1.0), \"timeout\")\n" +" print(\"Timer ended.\")\n" +"[/codeblock]" +msgstr "" + +#: doc/classes/SceneTreeTimer.xml:22 +msgid "The time remaining." +msgstr "" + +#: doc/classes/SceneTreeTimer.xml:28 doc/classes/Timer.xml:62 +msgid "Emitted when the timer reaches 0." +msgstr "" + +#: doc/classes/Script.xml:4 +msgid "A class stored as a resource." +msgstr "" + +#: doc/classes/Script.xml:7 +msgid "" +"A class stored as a resource. A script extends the functionality of all " +"objects that instance it.\n" +"The [code]new[/code] method of a script subclass creates a new instance. " +"[method Object.set_script] extends an existing object, if that object's " +"class matches one of the script's base classes." +msgstr "" + +#: doc/classes/Script.xml:11 +msgid "" +"https://docs.godotengine.org/en/latest/getting_started/step_by_step/" +"scripting.html" +msgstr "" + +#: doc/classes/Script.xml:18 +msgid "Returns [code]true[/code] if the script can be instanced." +msgstr "" + +#: doc/classes/Script.xml:25 +msgid "Returns the script directly inherited by this script." +msgstr "" + +#: doc/classes/Script.xml:32 +msgid "Returns the script's base type." +msgstr "" + +#: doc/classes/Script.xml:41 +msgid "Returns the default value of the specified property." +msgstr "" + +#: doc/classes/Script.xml:48 +msgid "Returns a dictionary containing constant names and their values." +msgstr "" + +#: doc/classes/Script.xml:55 +msgid "Returns the list of methods in this [Script]." +msgstr "" + +#: doc/classes/Script.xml:62 +msgid "Returns the list of properties in this [Script]." +msgstr "" + +#: doc/classes/Script.xml:69 +msgid "Returns the list of user signals defined in this [Script]." +msgstr "" + +#: doc/classes/Script.xml:78 +msgid "" +"Returns [code]true[/code] if the script, or a base class, defines a signal " +"with the given name." +msgstr "" + +#: doc/classes/Script.xml:85 +msgid "Returns [code]true[/code] if the script contains non-empty source code." +msgstr "" + +#: doc/classes/Script.xml:94 +msgid "" +"Returns [code]true[/code] if [code]base_object[/code] is an instance of this " +"script." +msgstr "" + +#: doc/classes/Script.xml:101 +msgid "" +"Returns [code]true[/code] if the script is a tool script. A tool script can " +"run in the editor." +msgstr "" + +#: doc/classes/Script.xml:110 +msgid "Reloads the script's class implementation. Returns an error code." +msgstr "" + +#: doc/classes/Script.xml:116 +msgid "" +"The script source code or an empty string if source code is not available. " +"When set, does not reload the class implementation automatically." +msgstr "" + +#: doc/classes/ScriptCreateDialog.xml:4 +msgid "The Editor's popup dialog for creating new [Script] files." +msgstr "" + +#: doc/classes/ScriptCreateDialog.xml:7 +msgid "" +"The [ScriptCreateDialog] creates script files according to a given template " +"for a given scripting language. The standard use is to configure its fields " +"prior to calling one of the [method Window.popup] methods.\n" +"[codeblock]\n" +"func _ready():\n" +" dialog.config(\"Node\", \"res://new_node.gd\") # For in-engine types\n" +" dialog.config(\"\\\"res://base_node.gd\\\"\", \"res://derived_node.gd\") " +"# For script types\n" +" dialog.popup_centered()\n" +"[/codeblock]" +msgstr "" + +#: doc/classes/ScriptCreateDialog.xml:30 +msgid "Prefills required fields to configure the ScriptCreateDialog for use." +msgstr "" + +#: doc/classes/ScriptCreateDialog.xml:43 +msgid "Emitted when the user clicks the OK button." +msgstr "" + +#: doc/classes/ScriptEditor.xml:4 +msgid "Godot editor's script editor." +msgstr "" + +#: 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:57 +msgid "" +"Returns an array with all [Script] objects which are currently open in " +"editor." +msgstr "" + +#: doc/classes/ScriptEditor.xml:66 +msgid "Goes to the specified line in the current script." +msgstr "" + +#: doc/classes/ScriptEditor.xml:85 +msgid "" +"Emitted when user changed active script. Argument is a freshly activated " +"[Script]." +msgstr "" + +#: 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." +msgstr "" + +#: doc/classes/ScrollBar.xml:4 +msgid "Base class for scroll bars." +msgstr "" + +#: doc/classes/ScrollBar.xml:7 +msgid "" +"Scrollbars are a [Range]-based [Control], that display a draggable area (the " +"size of the page). Horizontal ([HScrollBar]) and Vertical ([VScrollBar]) " +"versions are available." +msgstr "" + +#: doc/classes/ScrollBar.xml:15 +msgid "" +"Overrides the step used when clicking increment and decrement buttons or " +"when using arrow keys when the [ScrollBar] is focused." +msgstr "" + +#: doc/classes/ScrollBar.xml:23 +msgid "Emitted when the scrollbar is being scrolled." +msgstr "" + +#: doc/classes/ScrollContainer.xml:4 +msgid "A helper node for displaying scrollable elements such as lists." +msgstr "" + +#: doc/classes/ScrollContainer.xml:7 +msgid "" +"A ScrollContainer node meant to contain a [Control] child.\n" +"ScrollContainers will automatically create a scrollbar child ([HScrollBar], " +"[VScrollBar], or both) when needed and will only draw the Control within the " +"ScrollContainer area. Scrollbars will automatically be drawn at the right " +"(for vertical) or bottom (for horizontal) and will enable dragging to move " +"the viewable Control (and its children) within the ScrollContainer. " +"Scrollbars will also automatically resize the grabber based on the [member " +"Control.rect_min_size] of the Control relative to the ScrollContainer.\n" +"Works great with a [Panel] control. You can set [code]EXPAND[/code] on the " +"children's size flags, so they will upscale to the ScrollContainer's size if " +"it's larger (scroll is invisible for the chosen dimension)." +msgstr "" + +#: doc/classes/ScrollContainer.xml:18 +msgid "" +"Returns the horizontal scrollbar [HScrollBar] of this [ScrollContainer]." +msgstr "" + +#: doc/classes/ScrollContainer.xml:25 +msgid "Returns the vertical scrollbar [VScrollBar] of this [ScrollContainer]." +msgstr "" + +#: doc/classes/ScrollContainer.xml:31 +msgid "" +"If [code]true[/code], the ScrollContainer will automatically scroll to " +"focused children (including indirect children) to make sure they are fully " +"visible." +msgstr "" + +#: doc/classes/ScrollContainer.xml:37 doc/classes/TextEdit.xml:442 +msgid "The current horizontal scroll value." +msgstr "" + +#: doc/classes/ScrollContainer.xml:40 +msgid "If [code]true[/code], enables horizontal scrolling." +msgstr "" + +#: doc/classes/ScrollContainer.xml:43 doc/classes/TextEdit.xml:445 +msgid "The current vertical scroll value." +msgstr "" + +#: doc/classes/ScrollContainer.xml:46 +msgid "If [code]true[/code], enables vertical scrolling." +msgstr "" + +#: doc/classes/ScrollContainer.xml:52 +msgid "Emitted when scrolling stops." +msgstr "" + +#: doc/classes/ScrollContainer.xml:57 +msgid "Emitted when scrolling is started." +msgstr "" + +#: doc/classes/ScrollContainer.xml:65 +msgid "The background [StyleBox] of the [ScrollContainer]." +msgstr "" + +#: doc/classes/SegmentShape2D.xml:4 +msgid "Segment shape for 2D collisions." +msgstr "" + +#: doc/classes/SegmentShape2D.xml:7 +msgid "" +"Segment shape for 2D collisions. Consists of two points, [code]a[/code] and " +"[code]b[/code]." +msgstr "" + +#: doc/classes/SegmentShape2D.xml:15 +msgid "The segment's first point position." +msgstr "" + +#: doc/classes/SegmentShape2D.xml:18 +msgid "The segment's second point position." +msgstr "" + +#: doc/classes/Semaphore.xml:4 +msgid "A synchronization semaphore." +msgstr "" + +#: doc/classes/Semaphore.xml:7 +msgid "" +"A synchronization semaphore which can be used to synchronize multiple " +"[Thread]s. Initialized to zero on creation. Be careful to avoid deadlocks. " +"For a binary version, see [Mutex]." +msgstr "" + +#: doc/classes/Semaphore.xml:17 +msgid "Lowers the [Semaphore], allowing one more thread in." +msgstr "" + +#: doc/classes/Semaphore.xml:24 +msgid "" +"Like [method wait], but won't block, so if the value is zero, fails " +"immediately and returns [constant ERR_BUSY]. If non-zero, it returns " +"[constant OK] to report success." +msgstr "" + +#: doc/classes/Semaphore.xml:31 +msgid "Waits for the [Semaphore], if its value is zero, blocks until non-zero." +msgstr "" + +#: doc/classes/Separator.xml:4 +msgid "Base class for separators." +msgstr "" + +#: doc/classes/Separator.xml:7 +msgid "" +"Separator is a [Control] used for separating other controls. It's purely a " +"visual decoration. Horizontal ([HSeparator]) and Vertical ([VSeparator]) " +"versions are available." +msgstr "" + +#: doc/classes/Shader.xml:4 +msgid "A custom shader program." +msgstr "" + +#: doc/classes/Shader.xml:7 +msgid "" +"This class allows you to define a custom shader program that can be used by " +"a [ShaderMaterial]. Shaders allow you to write your own custom behavior for " +"rendering objects or updating particle information. For a detailed " +"explanation and usage, please see the tutorials linked below." +msgstr "" + +#: doc/classes/Shader.xml:10 doc/classes/ShaderMaterial.xml:10 +msgid "https://docs.godotengine.org/en/latest/tutorials/shading/index.html" +msgstr "" + +#: doc/classes/Shader.xml:11 +msgid "" +"https://docs.godotengine.org/en/latest/tutorials/shading/your_first_shader/" +"what_are_shaders.html" +msgstr "" + +#: doc/classes/Shader.xml:20 +msgid "" +"Returns the texture that is set as default for the specified parameter.\n" +"[b]Note:[/b] [code]param[/code] must match the name of the uniform in the " +"code exactly." +msgstr "" + +#: doc/classes/Shader.xml:28 +msgid "" +"Returns the shader mode for the shader, either [constant MODE_CANVAS_ITEM], " +"[constant MODE_SPATIAL] or [constant MODE_PARTICLES]." +msgstr "" + +#: doc/classes/Shader.xml:37 +msgid "" +"Returns [code]true[/code] if the shader has this param defined as a uniform " +"in its code.\n" +"[b]Note:[/b] [code]param[/code] must match the name of the uniform in the " +"code exactly." +msgstr "" + +#: doc/classes/Shader.xml:49 +msgid "" +"Sets the default texture to be used with a texture uniform. The default is " +"used if a texture is not set in the [ShaderMaterial].\n" +"[b]Note:[/b] [code]param[/code] must match the name of the uniform in the " +"code exactly." +msgstr "" + +#: doc/classes/Shader.xml:56 +msgid "" +"Returns the shader's code as the user has written it, not the full generated " +"code used internally." +msgstr "" + +#: doc/classes/Shader.xml:61 +msgid "Mode used to draw all 3D objects." +msgstr "" + +#: doc/classes/Shader.xml:64 +msgid "Mode used to draw all 2D objects." +msgstr "" + +#: doc/classes/Shader.xml:67 +msgid "" +"Mode used to calculate particle information on a per-particle basis. Not " +"used for drawing." +msgstr "" + +#: doc/classes/Shader.xml:70 +msgid "" +"Mode used for drawing skies. Only works with shaders attached to [Sky] " +"objects." +msgstr "" + +#: doc/classes/ShaderMaterial.xml:4 +msgid "A material that uses a custom [Shader] program." +msgstr "" + +#: doc/classes/ShaderMaterial.xml:7 +msgid "" +"A material that uses a custom [Shader] program to render either items to " +"screen or process particles. You can create multiple materials for the same " +"shader but configure different values for the uniforms defined in the shader." +msgstr "" + +#: doc/classes/ShaderMaterial.xml:19 +msgid "" +"Returns the current value set for this material of a uniform in the shader." +msgstr "" + +#: doc/classes/ShaderMaterial.xml:28 +msgid "" +"Returns [code]true[/code] if the property identified by [code]name[/code] " +"can be reverted to a default value." +msgstr "" + +#: doc/classes/ShaderMaterial.xml:37 +msgid "" +"Returns the default value of the material property with given [code]name[/" +"code]." +msgstr "" + +#: doc/classes/ShaderMaterial.xml:48 +msgid "" +"Changes the value set for this material of a uniform in the shader. [b]Note:" +"[/b] [code]param[/code] must match the name of the uniform in the code " +"exactly." +msgstr "" + +#: doc/classes/ShaderMaterial.xml:54 +msgid "The [Shader] program used to render this material." +msgstr "" + +#: doc/classes/Shape2D.xml:4 +msgid "Base class for all 2D shapes." +msgstr "" + +#: doc/classes/Shape2D.xml:7 +msgid "Base class for all 2D shapes. All 2D shape types inherit from this." +msgstr "" + +#: doc/classes/Shape2D.xml:23 +msgid "" +"Returns [code]true[/code] if this shape is colliding with another.\n" +"This method needs the transformation matrix for this shape " +"([code]local_xform[/code]), the shape to check collisions with " +"([code]with_shape[/code]), and the transformation matrix of that shape " +"([code]shape_xform[/code])." +msgstr "" + +#: doc/classes/Shape2D.xml:37 +msgid "" +"Returns a list of the points where this shape touches another. If there are " +"no collisions the list is empty.\n" +"This method needs the transformation matrix for this shape " +"([code]local_xform[/code]), the shape to check collisions with " +"([code]with_shape[/code]), and the transformation matrix of that shape " +"([code]shape_xform[/code])." +msgstr "" + +#: doc/classes/Shape2D.xml:55 +msgid "" +"Returns whether this shape would collide with another, if a given movement " +"was applied.\n" +"This method needs the transformation matrix for this shape " +"([code]local_xform[/code]), the movement to test on this shape " +"([code]local_motion[/code]), the shape to check collisions with " +"([code]with_shape[/code]), the transformation matrix of that shape " +"([code]shape_xform[/code]), and the movement to test onto the other object " +"([code]shape_motion[/code])." +msgstr "" + +#: doc/classes/Shape2D.xml:73 +msgid "" +"Returns a list of the points where this shape would touch another, if a " +"given movement was applied. If there are no collisions the list is empty.\n" +"This method needs the transformation matrix for this shape " +"([code]local_xform[/code]), the movement to test on this shape " +"([code]local_motion[/code]), the shape to check collisions with " +"([code]with_shape[/code]), the transformation matrix of that shape " +"([code]shape_xform[/code]), and the movement to test onto the other object " +"([code]shape_motion[/code])." +msgstr "" + +#: doc/classes/Shape2D.xml:80 +msgid "The shape's custom solver bias." +msgstr "" + +#: doc/classes/Shape3D.xml:4 +msgid "Base class for all 3D shape resources." +msgstr "" + +#: doc/classes/Shape3D.xml:7 +msgid "" +"Base class for all 3D shape resources. Nodes that inherit from this can be " +"used as shapes for a [PhysicsBody3D] or [Area3D] objects." +msgstr "" + +#: doc/classes/ShortCut.xml:4 +msgid "A shortcut for binding input." +msgstr "" + +#: doc/classes/ShortCut.xml:7 +msgid "" +"A shortcut for binding input.\n" +"Shortcuts are commonly used for interacting with a [Control] element from a " +"[InputEvent]." +msgstr "" + +#: doc/classes/ShortCut.xml:17 +msgid "Returns the shortcut's [InputEvent] as a [String]." +msgstr "" + +#: doc/classes/ShortCut.xml:26 +msgid "" +"Returns [code]true[/code] if the shortcut's [InputEvent] equals [code]event[/" +"code]." +msgstr "" + +#: doc/classes/ShortCut.xml:33 +msgid "If [code]true[/code], this shortcut is valid." +msgstr "" + +#: doc/classes/ShortCut.xml:39 +msgid "" +"The shortcut's [InputEvent].\n" +"Generally the [InputEvent] is a keyboard key, though it can be any " +"[InputEvent]." +msgstr "" + +#: doc/classes/Signal.xml:4 +msgid "Class representing a signal defined in an object." +msgstr "" + +#: doc/classes/Signal.xml:19 +msgid "" +"Creates a new signal named [code]signal_name[/code] in the given object." +msgstr "" + +#: doc/classes/Signal.xml:32 +msgid "" +"Connects this signal to the specified [Callable], optionally providing binds " +"and connection flags." +msgstr "" + +#: doc/classes/Signal.xml:41 +msgid "Disconnects this signal from the specified [Callable]." +msgstr "" + +#: doc/classes/Signal.xml:48 +msgid "Emits this signal to all connected objects." +msgstr "" + +#: doc/classes/Signal.xml:55 +msgid "Returns the list of [Callable]s connected to this signal." +msgstr "" + +#: doc/classes/Signal.xml:62 +msgid "Returns the name of this signal." +msgstr "" + +#: doc/classes/Signal.xml:69 +msgid "Returns the object emitting this signal." +msgstr "" + +#: doc/classes/Signal.xml:76 +msgid "" +"Returns the ID of the object emitting this signal (see [method Object." +"get_instance_id])." +msgstr "" + +#: doc/classes/Signal.xml:85 +msgid "" +"Returns [code]true[/code] if the specified [Callable] is connected to this " +"signal." +msgstr "" + +#: doc/classes/Skeleton2D.xml:4 +msgid "Skeleton for 2D characters and animated objects." +msgstr "" + +#: doc/classes/Skeleton2D.xml:7 +msgid "" +"Skeleton2D parents a hierarchy of [Bone2D] objects. It is a requirement of " +"[Bone2D]. Skeleton2D holds a reference to the rest pose of its children and " +"acts as a single point of access to its bones." +msgstr "" + +#: doc/classes/Skeleton2D.xml:10 +msgid "" +"https://docs.godotengine.org/en/latest/tutorials/animation/2d_skeletons.html" +msgstr "" + +#: doc/classes/Skeleton2D.xml:19 +msgid "" +"Returns a [Bone2D] from the node hierarchy parented by Skeleton2D. The " +"object to return is identified by the parameter [code]idx[/code]. Bones are " +"indexed by descending the node hierarchy from top to bottom, adding the " +"children of each branch before moving to the next sibling." +msgstr "" + +#: doc/classes/Skeleton2D.xml:26 +msgid "" +"Returns the number of [Bone2D] nodes in the node hierarchy parented by " +"Skeleton2D." +msgstr "" + +#: doc/classes/Skeleton2D.xml:33 +msgid "Returns the [RID] of a Skeleton2D instance." +msgstr "" + +#: doc/classes/Skeleton3D.xml:4 +msgid "Skeleton for characters and animated objects." +msgstr "" + +#: doc/classes/Skeleton3D.xml:7 +msgid "" +"Skeleton3D provides a hierarchical interface for managing bones, including " +"pose, rest and animation (see [Animation]). It can also use ragdoll " +"physics.\n" +"The overall transform of a bone with respect to the skeleton is determined " +"by the following hierarchical order: rest pose, custom pose and pose.\n" +"Note that \"global pose\" below refers to the overall transform of the bone " +"with respect to skeleton, so it not the actual global/world transform of the " +"bone." +msgstr "" + +#: doc/classes/Skeleton3D.xml:20 +msgid "" +"Adds a bone, with name [code]name[/code]. [method get_bone_count] will " +"become the bone index." +msgstr "" + +#: doc/classes/Skeleton3D.xml:31 doc/classes/Skeleton3D.xml:124 +#: doc/classes/Skeleton3D.xml:255 +msgid "[i]Deprecated soon.[/i]" +msgstr "" + +#: doc/classes/Skeleton3D.xml:38 +msgid "Clear all the bones in this skeleton." +msgstr "" + +#: doc/classes/Skeleton3D.xml:53 +msgid "Returns the bone index that matches [code]name[/code] as its name." +msgstr "" + +#: doc/classes/Skeleton3D.xml:60 +msgid "Returns the amount of bones in the skeleton." +msgstr "" + +#: doc/classes/Skeleton3D.xml:69 +msgid "" +"Returns the custom pose of the specified bone. Custom pose is applied on top " +"of the rest pose." +msgstr "" + +#: doc/classes/Skeleton3D.xml:78 +msgid "" +"Returns the overall transform of the specified bone, with respect to the " +"skeleton. Being relative to the skeleton frame, this is not the actual " +"\"global\" transform of the bone." +msgstr "" + +#: doc/classes/Skeleton3D.xml:87 +msgid "Returns the name of the bone at index [code]index[/code]." +msgstr "" + +#: doc/classes/Skeleton3D.xml:96 +msgid "" +"Returns the bone index which is the parent of the bone at [code]bone_idx[/" +"code]. If -1, then bone has no parent.\n" +"[b]Note:[/b] The parent bone returned will always be less than " +"[code]bone_idx[/code]." +msgstr "" + +#: doc/classes/Skeleton3D.xml:106 +msgid "" +"Returns the pose transform of the specified bone. Pose is applied on top of " +"the custom pose, which is applied on top the rest pose." +msgstr "" + +#: doc/classes/Skeleton3D.xml:115 +msgid "Returns the rest transform for a bone [code]bone_idx[/code]." +msgstr "" + +#: doc/classes/Skeleton3D.xml:221 +msgid "" +"Sets the bone index [code]parent_idx[/code] as the parent of the bone at " +"[code]bone_idx[/code]. If -1, then bone has no parent.\n" +"[b]Note:[/b] [code]parent_idx[/code] must be less than [code]bone_idx[/code]." +msgstr "" + +#: doc/classes/Skeleton3D.xml:233 +msgid "Returns the pose transform for bone [code]bone_idx[/code]." +msgstr "" + +#: doc/classes/Skeleton3D.xml:244 +msgid "Sets the rest transform for bone [code]bone_idx[/code]." +msgstr "" + +#: doc/classes/Sky.xml:4 +msgid "Background that uses a [Material] to draw a sky." +msgstr "" + +#: doc/classes/Sky.xml:7 +msgid "" +"The [Sky] class uses a [Material] to draw the background and update the " +"reflection/radiance cubemaps." +msgstr "" + +#: doc/classes/Sky.xml:15 +msgid "" +"Sets the method for generating the radiance map from the sky. The radiance " +"map is a cubemap with increasingly blurry versions of the sky corresponding " +"to different levels of roughness. Radiance maps can be expensive to " +"calculate. See [enum ProcessMode] for options." +msgstr "" + +#: doc/classes/Sky.xml:18 +msgid "" +"The [Sky]'s radiance map size. The higher the radiance map size, the more " +"detailed the lighting from the [Sky] will be.\n" +"See [enum RadianceSize] constants for values.\n" +"[b]Note:[/b] Some hardware will have trouble with higher radiance sizes, " +"especially [constant RADIANCE_SIZE_512] and above. Only use such high values " +"on high-end hardware." +msgstr "" + +#: doc/classes/Sky.xml:23 +msgid "" +"[Material] used to draw the background. Can be [PanoramaSkyMaterial], " +"[ProceduralSkyMaterial], [PhysicalSkyMaterial], or even a [ShaderMaterial] " +"if you want to use your own custom shader." +msgstr "" + +#: doc/classes/Sky.xml:28 +msgid "Radiance texture size is 32×32 pixels." +msgstr "" + +#: doc/classes/Sky.xml:31 +msgid "Radiance texture size is 64×64 pixels." +msgstr "" + +#: doc/classes/Sky.xml:34 +msgid "Radiance texture size is 128×128 pixels." +msgstr "" + +#: doc/classes/Sky.xml:37 +msgid "Radiance texture size is 256×256 pixels." +msgstr "" + +#: doc/classes/Sky.xml:40 +msgid "Radiance texture size is 512×512 pixels." +msgstr "" + +#: doc/classes/Sky.xml:43 +msgid "Radiance texture size is 1024×1024 pixels." +msgstr "" + +#: doc/classes/Sky.xml:46 +msgid "Radiance texture size is 2048×2048 pixels." +msgstr "" + +#: doc/classes/Sky.xml:49 +msgid "Represents the size of the [enum RadianceSize] enum." +msgstr "" + +#: doc/classes/Sky.xml:52 +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. 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 +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 radiance_size] must be set to [constant RADIANCE_SIZE_256]." +msgstr "" + +#: doc/classes/Slider.xml:4 doc/classes/Slider.xml:7 +msgid "Base class for GUI sliders." +msgstr "" + +#: doc/classes/Slider.xml:15 +msgid "" +"If [code]true[/code], the slider can be interacted with. If [code]false[/" +"code], the value can be changed only by code." +msgstr "" + +#: doc/classes/Slider.xml:19 +msgid "If [code]true[/code], the value can be changed using the mouse wheel." +msgstr "" + +#: doc/classes/Slider.xml:23 +msgid "" +"Number of ticks displayed on the slider, including border ticks. Ticks are " +"uniformly-distributed value markers." +msgstr "" + +#: doc/classes/Slider.xml:26 +msgid "" +"If [code]true[/code], the slider will display ticks for minimum and maximum " +"values." +msgstr "" + +#: doc/classes/SliderJoint3D.xml:4 +msgid "Piston kind of slider between two bodies in 3D." +msgstr "" + +#: doc/classes/SliderJoint3D.xml:7 +msgid "Slides across the X axis of the pivot object." +msgstr "" + +#: doc/classes/SliderJoint3D.xml:33 +msgid "" +"The amount of damping of the rotation when the limit is surpassed.\n" +"A lower damping value allows a rotation initiated by body A to travel to " +"body B slower." +msgstr "" + +#: doc/classes/SliderJoint3D.xml:40 +msgid "" +"The amount of restitution of the rotation when the limit is surpassed.\n" +"Does not affect damping." +msgstr "" + +#: doc/classes/SliderJoint3D.xml:44 +msgid "" +"A factor applied to the all rotation once the limit is surpassed.\n" +"Makes all rotation slower when between 0 and 1." +msgstr "" + +#: doc/classes/SliderJoint3D.xml:57 doc/classes/SliderJoint3D.xml:152 +msgid "A factor applied to the all rotation in the limits." +msgstr "" + +#: doc/classes/SliderJoint3D.xml:66 doc/classes/SliderJoint3D.xml:161 +msgid "" +"A factor applied to the all rotation across axes orthogonal to the slider." +msgstr "" + +#: doc/classes/SliderJoint3D.xml:69 +msgid "" +"The amount of damping that happens once the limit defined by [member " +"linear_limit/lower_distance] and [member linear_limit/upper_distance] is " +"surpassed." +msgstr "" + +#: doc/classes/SliderJoint3D.xml:75 +msgid "" +"The amount of restitution once the limits are surpassed. The lower, the more " +"velocity-energy gets lost." +msgstr "" + +#: doc/classes/SoftBody3D.xml:4 +msgid "A soft mesh physics body." +msgstr "" + +#: doc/classes/SoftBody3D.xml:7 +msgid "" +"A deformable physics body. Used to create elastic or deformable objects such " +"as cloth, rubber, or other flexible materials." +msgstr "" + +#: doc/classes/SoftBody3D.xml:10 +msgid "https://docs.godotengine.org/en/latest/tutorials/physics/soft_body.html" +msgstr "" + +#: doc/classes/SoftBody3D.xml:83 +msgid "" +"The physics layers this SoftBody3D is in.\n" +"Collidable objects can exist in any of 32 different layers. These layers " +"work like a tagging system, and are not visual. A collidable can use these " +"layers to select with which objects it can collide, using the collision_mask " +"property.\n" +"A contact is detected if object A is in any of the layers that object B " +"scans, or object B is in any layer scanned by object A." +msgstr "" + +#: doc/classes/SoftBody3D.xml:88 +msgid "The physics layers this SoftBody3D scans for collisions." +msgstr "" + +#: doc/classes/SoftBody3D.xml:97 +msgid "" +"[NodePath] to a [CollisionObject3D] this SoftBody3D should avoid clipping." +msgstr "" + +#: doc/classes/SoftBody3D.xml:104 +msgid "If [code]true[/code], the [SoftBody3D] will respond to [RayCast3D]s." +msgstr "" + +#: doc/classes/SoftBody3D.xml:107 +msgid "" +"Increasing this value will improve the resulting simulation, but can affect " +"performance. Use with care." +msgstr "" + +#: doc/classes/SoftBody3D.xml:110 +msgid "The SoftBody3D's mass." +msgstr "" + +#: doc/classes/SphereMesh.xml:4 doc/classes/SphereMesh.xml:7 +msgid "Class representing a spherical [PrimitiveMesh]." +msgstr "" + +#: doc/classes/SphereMesh.xml:15 +msgid "Full height of the sphere." +msgstr "" + +#: doc/classes/SphereMesh.xml:18 +msgid "" +"If [code]true[/code], a hemisphere is created rather than a full sphere.\n" +"[b]Note:[/b] To get a regular hemisphere, the height and radius of the " +"sphere must be equal." +msgstr "" + +#: doc/classes/SphereMesh.xml:22 +msgid "Number of radial segments on the sphere." +msgstr "" + +#: doc/classes/SphereMesh.xml:25 +msgid "Radius of sphere." +msgstr "" + +#: doc/classes/SphereMesh.xml:28 +msgid "Number of segments along the height of the sphere." +msgstr "" + +#: doc/classes/SphereShape3D.xml:4 +msgid "Sphere shape for 3D collisions." +msgstr "" + +#: doc/classes/SphereShape3D.xml:7 +msgid "" +"Sphere shape for 3D collisions, which can be set into a [PhysicsBody3D] or " +"[Area3D]. This shape is useful for modeling sphere-like 3D objects." +msgstr "" + +#: doc/classes/SphereShape3D.xml:15 +msgid "The sphere's radius. The shape's diameter is double the radius." +msgstr "" + +#: doc/classes/SpinBox.xml:4 +msgid "Numerical input text field." +msgstr "" + +#: doc/classes/SpinBox.xml:7 +msgid "" +"SpinBox is a numerical input text field. It allows entering integers and " +"floats.\n" +"[b]Example:[/b]\n" +"[codeblock]\n" +"var spin_box = SpinBox.new()\n" +"add_child(spin_box)\n" +"var line_edit = spin_box.get_line_edit()\n" +"line_edit.context_menu_enabled = false\n" +"spin_box.align = LineEdit.ALIGN_RIGHT\n" +"[/codeblock]\n" +"The above code will create a [SpinBox], disable context menu on it and set " +"the text alignment to right.\n" +"See [Range] class for more options over the [SpinBox]." +msgstr "" + +#: doc/classes/SpinBox.xml:26 +msgid "Applies the current value of this [SpinBox]." +msgstr "" + +#: doc/classes/SpinBox.xml:33 +msgid "" +"Returns the [LineEdit] instance from this [SpinBox]. You can use it to " +"access properties and methods of [LineEdit]." +msgstr "" + +#: doc/classes/SpinBox.xml:39 +msgid "Sets the text alignment of the [SpinBox]." +msgstr "" + +#: doc/classes/SpinBox.xml:42 +msgid "" +"If [code]true[/code], the [SpinBox] will be editable. Otherwise, it will be " +"read only." +msgstr "" + +#: doc/classes/SpinBox.xml:45 +msgid "" +"Adds the specified [code]prefix[/code] string before the numerical value of " +"the [SpinBox]." +msgstr "" + +#: doc/classes/SpinBox.xml:48 +msgid "" +"Adds the specified [code]prefix[/code] string after the numerical value of " +"the [SpinBox]." +msgstr "" + +#: doc/classes/SpinBox.xml:55 +msgid "Sets a custom [Texture2D] for up and down arrows of the [SpinBox]." +msgstr "" + +#: doc/classes/SplitContainer.xml:4 +msgid "Container for splitting and adjusting." +msgstr "" + +#: doc/classes/SplitContainer.xml:7 +msgid "" +"Container for splitting two [Control]s vertically or horizontally, with a " +"grabber that allows adjusting the split offset or ratio." +msgstr "" + +#: doc/classes/SplitContainer.xml:16 +msgid "" +"Clamps the [member split_offset] value to not go outside the currently " +"possible minimal and maximum values." +msgstr "" + +#: doc/classes/SplitContainer.xml:22 +msgid "" +"If [code]true[/code], the area of the first [Control] will be collapsed and " +"the dragger will be disabled." +msgstr "" + +#: doc/classes/SplitContainer.xml:25 +msgid "" +"Determines the dragger's visibility. See [enum DraggerVisibility] for " +"details." +msgstr "" + +#: doc/classes/SplitContainer.xml:28 +msgid "" +"The initial offset of the splitting between the two [Control]s, with " +"[code]0[/code] being at the end of the first [Control]." +msgstr "" + +#: doc/classes/SplitContainer.xml:36 +msgid "Emitted when the dragger is dragged by user." +msgstr "" + +#: doc/classes/SplitContainer.xml:42 +msgid "The split dragger is visible when the cursor hovers it." +msgstr "" + +#: doc/classes/SplitContainer.xml:45 +msgid "The split dragger is never visible." +msgstr "" + +#: doc/classes/SplitContainer.xml:48 +msgid "The split dragger is never visible and its space collapsed." +msgstr "" + +#: doc/classes/SpotLight3D.xml:4 +msgid "A spotlight, such as a reflector spotlight or a lantern." +msgstr "" + +#: doc/classes/SpotLight3D.xml:7 +msgid "" +"A Spotlight is a type of [Light3D] node that emits lights in a specific " +"direction, in the shape of a cone. The light is attenuated through the " +"distance. This attenuation can be configured by changing the energy, radius " +"and attenuation parameters of [Light3D]." +msgstr "" + +#: doc/classes/SpotLight3D.xml:16 +msgid "The spotlight's angle in degrees." +msgstr "" + +#: doc/classes/SpotLight3D.xml:19 +msgid "The spotlight's angular attenuation curve." +msgstr "" + +#: doc/classes/SpotLight3D.xml:22 +msgid "The spotlight's light energy attenuation curve." +msgstr "" + +#: doc/classes/SpotLight3D.xml:25 +msgid "The maximal range that can be reached by the spotlight." +msgstr "" + +#: doc/classes/SpringArm3D.xml:4 +msgid "A helper node, mostly used in 3rd person cameras." +msgstr "" + +#: doc/classes/SpringArm3D.xml:7 +msgid "" +"The SpringArm3D node is a node that casts a ray (or collision shape) along " +"its z axis and moves all its direct children to the collision point, minus a " +"margin.\n" +"The most common use case for this is to make a 3rd person camera that reacts " +"to collisions in the environment.\n" +"The SpringArm3D will either cast a ray, or if a shape is given, it will cast " +"the shape in the direction of its z axis.\n" +"If you use the SpringArm3D as a camera controller for your player, you might " +"need to exclude the player's collider from the SpringArm3D's collision check." +msgstr "" + +#: doc/classes/SpringArm3D.xml:21 +msgid "" +"Adds the [PhysicsBody3D] object with the given [RID] to the list of " +"[PhysicsBody3D] objects excluded from the collision check." +msgstr "" + +#: doc/classes/SpringArm3D.xml:28 +msgid "" +"Clears the list of [PhysicsBody3D] objects excluded from the collision check." +msgstr "" + +#: doc/classes/SpringArm3D.xml:35 +msgid "" +"Returns the proportion between the current arm length (after checking for " +"collisions) and the [member spring_length]. Ranges from 0 to 1." +msgstr "" + +#: doc/classes/SpringArm3D.xml:44 +msgid "" +"Removes the given [RID] from the list of [PhysicsBody3D] objects excluded " +"from the collision check." +msgstr "" + +#: doc/classes/SpringArm3D.xml:50 +msgid "The layers against which the collision check shall be done." +msgstr "" + +#: doc/classes/SpringArm3D.xml:53 +msgid "" +"When the collision check is made, a candidate length for the SpringArm3D is " +"given.\n" +"The margin is then subtracted to this length and the translation is applied " +"to the child objects of the SpringArm3D.\n" +"This margin is useful for when the SpringArm3D has a [Camera3D] as a child " +"node: without the margin, the [Camera3D] would be placed on the exact point " +"of collision, while with the margin the [Camera3D] would be placed close to " +"the point of collision." +msgstr "" + +#: doc/classes/SpringArm3D.xml:58 +msgid "" +"The [Shape3D] to use for the SpringArm3D.\n" +"When the shape is set, the SpringArm3D will cast the [Shape3D] on its z axis " +"instead of performing a ray cast." +msgstr "" + +#: doc/classes/SpringArm3D.xml:62 +msgid "" +"The maximum extent of the SpringArm3D. This is used as a length for both the " +"ray and the shape cast used internally to calculate the desired position of " +"the SpringArm3D's child nodes.\n" +"To know more about how to perform a shape cast or a ray cast, please consult " +"the [PhysicsDirectSpaceState3D] documentation." +msgstr "" + +#: doc/classes/Sprite2D.xml:4 +msgid "General-purpose sprite node." +msgstr "" + +#: doc/classes/Sprite2D.xml:7 +msgid "" +"A node that displays a 2D texture. The texture displayed can be a region " +"from a larger atlas texture, or a frame from a sprite sheet animation." +msgstr "" + +#: doc/classes/Sprite2D.xml:16 +msgid "" +"Returns a [Rect2] representing the Sprite2D's boundary in local coordinates. " +"Can be used to detect if the Sprite2D was clicked. Example:\n" +"[codeblock]\n" +"func _input(event):\n" +" if event is InputEventMouseButton and event.pressed and event." +"button_index == BUTTON_LEFT:\n" +" if get_rect().has_point(to_local(event.position)):\n" +" print(\"A click!\")\n" +"[/codeblock]" +msgstr "" + +#: doc/classes/Sprite2D.xml:31 +msgid "" +"Returns [code]true[/code], if the pixel at the given position is opaque and " +"[code]false[/code] in other case.\n" +"[b]Note:[/b] It also returns [code]false[/code], if the sprite's texture is " +"[code]null[/code] or if the given position is invalid." +msgstr "" + +#: doc/classes/Sprite2D.xml:38 +msgid "If [code]true[/code], texture is centered." +msgstr "" + +#: doc/classes/Sprite2D.xml:47 doc/classes/Sprite3D.xml:16 +msgid "" +"Current frame to display from sprite sheet. [member vframes] or [member " +"hframes] must be greater than 1." +msgstr "" + +#: doc/classes/Sprite2D.xml:50 doc/classes/Sprite3D.xml:19 +msgid "" +"Coordinates of the frame to display from sprite sheet. This is as an alias " +"for the [member frame] property. [member vframes] or [member hframes] must " +"be greater than 1." +msgstr "" + +#: doc/classes/Sprite2D.xml:53 doc/classes/Sprite3D.xml:22 +msgid "The number of columns in the sprite sheet." +msgstr "" + +#: doc/classes/Sprite2D.xml:56 +msgid "The normal map gives depth to the Sprite2D." +msgstr "" + +#: doc/classes/Sprite2D.xml:62 +msgid "" +"If [code]true[/code], texture is cut from a larger atlas texture. See " +"[member region_rect]." +msgstr "" + +#: doc/classes/Sprite2D.xml:65 +msgid "If [code]true[/code], the outermost pixels get blurred out." +msgstr "" + +#: doc/classes/Sprite2D.xml:68 doc/classes/Sprite3D.xml:28 +msgid "" +"The region of the atlas texture to display. [member region_enabled] must be " +"[code]true[/code]." +msgstr "" + +#: doc/classes/Sprite2D.xml:71 +msgid "Strength of the specular light effect of this [Sprite2D]." +msgstr "" + +#: doc/classes/Sprite2D.xml:77 +msgid "The specular map is used for more control on the shininess effect." +msgstr "" + +#: doc/classes/Sprite2D.xml:80 doc/classes/Sprite3D.xml:31 +msgid "[Texture2D] object to draw." +msgstr "" + +#: doc/classes/Sprite2D.xml:83 doc/classes/Sprite3D.xml:34 +msgid "The number of rows in the sprite sheet." +msgstr "" + +#: doc/classes/Sprite2D.xml:89 doc/classes/Sprite3D.xml:40 +msgid "Emitted when the [member frame] changes." +msgstr "" + +#: doc/classes/Sprite2D.xml:94 +msgid "Emitted when the [member texture] changes." +msgstr "" + +#: doc/classes/Sprite3D.xml:4 +msgid "2D sprite node in a 3D world." +msgstr "" + +#: doc/classes/Sprite3D.xml:7 +msgid "" +"A node that displays a 2D texture in a 3D environment. The texture displayed " +"can be a region from a larger atlas texture, or a frame from a sprite sheet " +"animation.\n" +"[b]Note:[/b] There are [url=https://github.com/godotengine/godot/" +"issues/20855]known performance issues[/url] when using [Sprite3D]. Consider " +"using a [MeshInstance3D] with a [QuadMesh] as the mesh instead. You can " +"still have billboarding by enabling billboard properties in the QuadMesh's " +"[StandardMaterial3D]." +msgstr "" + +#: doc/classes/Sprite3D.xml:25 +msgid "" +"If [code]true[/code], texture will be cut from a larger atlas texture. See " +"[member region_rect]." +msgstr "" + +#: doc/classes/SpriteBase3D.xml:4 +msgid "2D sprite node in 3D environment." +msgstr "" + +#: doc/classes/SpriteBase3D.xml:7 +msgid "A node that displays 2D texture information in a 3D environment." +msgstr "" + +#: doc/classes/SpriteBase3D.xml:31 +msgid "Returns the rectangle representing this sprite." +msgstr "" + +#: doc/classes/SpriteBase3D.xml:42 +msgid "If [code]true[/code], the specified flag will be enabled." +msgstr "" + +#: doc/classes/SpriteBase3D.xml:50 +msgid "The direction in which the front of the texture faces." +msgstr "" + +#: doc/classes/SpriteBase3D.xml:58 +msgid "" +"If [code]true[/code], texture can be seen from the back as well, if " +"[code]false[/code], it is invisible when looking at it from behind." +msgstr "" + +#: doc/classes/SpriteBase3D.xml:67 +msgid "" +"A color value that gets multiplied on, could be used for mood-coloring or to " +"simulate the color of light." +msgstr "" + +#: doc/classes/SpriteBase3D.xml:73 +msgid "" +"The objects visibility on a scale from [code]0[/code] fully invisible to " +"[code]1[/code] fully visible." +msgstr "" + +#: doc/classes/SpriteBase3D.xml:76 +msgid "The size of one pixel's width on the sprite to scale it in 3D." +msgstr "" + +#: doc/classes/SpriteBase3D.xml:79 +msgid "" +"If [code]true[/code], the [Light3D] in the [Environment] has effects on the " +"sprite." +msgstr "" + +#: doc/classes/SpriteBase3D.xml:82 +msgid "" +"If [code]true[/code], the texture's transparency and the opacity are used to " +"make those parts of the sprite invisible." +msgstr "" + +#: doc/classes/SpriteBase3D.xml:87 +msgid "" +"If set, the texture's transparency and the opacity are used to make those " +"parts of the sprite invisible." +msgstr "" + +#: doc/classes/SpriteBase3D.xml:90 +msgid "If set, lights in the environment affect the sprite." +msgstr "" + +#: doc/classes/SpriteBase3D.xml:93 +msgid "" +"If set, texture can be seen from the back as well, if not, it is invisible " +"when looking at it from behind." +msgstr "" + +#: doc/classes/SpriteBase3D.xml:96 +msgid "Represents the size of the [enum DrawFlags] enum." +msgstr "" + +#: doc/classes/SpriteFrames.xml:4 +msgid "Sprite frame library for AnimatedSprite2D." +msgstr "" + +#: doc/classes/SpriteFrames.xml:7 +msgid "" +"Sprite frame library for [AnimatedSprite2D]. Contains frames and animation " +"data for playback." +msgstr "" + +#: doc/classes/SpriteFrames.xml:18 +msgid "Adds a new animation to the library." +msgstr "" + +#: doc/classes/SpriteFrames.xml:31 +msgid "Adds a frame to the given animation." +msgstr "" + +#: doc/classes/SpriteFrames.xml:40 +msgid "Removes all frames from the given animation." +msgstr "" + +#: doc/classes/SpriteFrames.xml:47 +msgid "Removes all animations. A \"default\" animation will be created." +msgstr "" + +#: doc/classes/SpriteFrames.xml:56 +msgid "If [code]true[/code], the given animation will loop." +msgstr "" + +#: doc/classes/SpriteFrames.xml:63 +msgid "" +"Returns an array containing the names associated to each animation. Values " +"are placed in alphabetical order." +msgstr "" + +#: doc/classes/SpriteFrames.xml:72 doc/classes/SpriteFrames.xml:154 +msgid "The animation's speed in frames per second." +msgstr "" + +#: doc/classes/SpriteFrames.xml:83 +msgid "Returns the animation's selected frame." +msgstr "" + +#: doc/classes/SpriteFrames.xml:92 +msgid "Returns the number of frames in the animation." +msgstr "" + +#: doc/classes/SpriteFrames.xml:101 +msgid "If [code]true[/code], the named animation exists." +msgstr "" + +#: doc/classes/SpriteFrames.xml:110 +msgid "Removes the given animation." +msgstr "" + +#: doc/classes/SpriteFrames.xml:121 +msgid "Removes the animation's selected frame." +msgstr "" + +#: doc/classes/SpriteFrames.xml:132 +msgid "Changes the animation's name to [code]newname[/code]." +msgstr "" + +#: doc/classes/SpriteFrames.xml:143 +msgid "If [code]true[/code], the animation will loop." +msgstr "" + +#: doc/classes/SpriteFrames.xml:167 +msgid "Sets the texture of the given frame." +msgstr "" + +#: doc/classes/SpriteFrames.xml:173 +msgid "Compatibility property, always equals to an empty array." +msgstr "" + +#: doc/classes/StaticBody2D.xml:4 +msgid "Static body for 2D physics." +msgstr "" + +#: doc/classes/StaticBody2D.xml:7 +msgid "" +"Static body for 2D physics. A StaticBody2D is a body that is not intended to " +"move. It is ideal for implementing objects in the environment, such as walls " +"or platforms.\n" +"Additionally, a constant linear or angular velocity can be set for the " +"static body, which will affect colliding bodies as if it were moving (for " +"example, a conveyor belt)." +msgstr "" + +#: doc/classes/StaticBody2D.xml:16 +msgid "" +"The body's constant angular velocity. This does not rotate the body, but " +"affects colliding bodies, as if it were rotating." +msgstr "" + +#: doc/classes/StaticBody2D.xml:19 +msgid "" +"The body's constant linear velocity. This does not move the body, but " +"affects colliding bodies, as if it were moving." +msgstr "" + +#: doc/classes/StaticBody3D.xml:4 +msgid "Static body for 3D physics." +msgstr "" + +#: doc/classes/StaticBody3D.xml:7 +msgid "" +"Static body for 3D physics. A static body is a simple body that is not " +"intended to move. In contrast to [RigidBody3D], they don't consume any CPU " +"resources as long as they don't move.\n" +"Additionally, a constant linear or angular velocity can be set for the " +"static body, so even if it doesn't move, it affects other bodies as if it " +"was moving (this is useful for simulating conveyor belts or conveyor wheels)." +msgstr "" + +#: doc/classes/StaticBody3D.xml:16 +msgid "" +"The body's constant angular velocity. This does not rotate the body, but " +"affects other bodies that touch it, as if it was in a state of rotation." +msgstr "" + +#: doc/classes/StaticBody3D.xml:19 +msgid "" +"The body's constant linear velocity. This does not move the body, but " +"affects other bodies that touch it, as if it was in a state of movement." +msgstr "" + +#: doc/classes/StreamPeer.xml:4 +msgid "Abstraction and base class for stream-based protocols." +msgstr "" + +#: doc/classes/StreamPeer.xml:7 +msgid "" +"StreamPeer is an abstraction and base class for stream-based protocols (such " +"as TCP or UNIX sockets). It provides an API for sending and receiving data " +"through streams as raw data or strings." +msgstr "" + +#: doc/classes/StreamPeer.xml:16 +msgid "Gets a signed 16-bit value from the stream." +msgstr "" + +#: doc/classes/StreamPeer.xml:23 +msgid "Gets a signed 32-bit value from the stream." +msgstr "" + +#: doc/classes/StreamPeer.xml:30 +msgid "Gets a signed 64-bit value from the stream." +msgstr "" + +#: doc/classes/StreamPeer.xml:37 +msgid "Gets a signed byte from the stream." +msgstr "" + +#: doc/classes/StreamPeer.xml:44 +msgid "Returns the amount of bytes this [StreamPeer] has available." +msgstr "" + +#: doc/classes/StreamPeer.xml:53 +msgid "" +"Returns a chunk data with the received bytes. The amount of bytes to be " +"received can be requested in the [code]bytes[/code] argument. If not enough " +"bytes are available, the function will block until the desired amount is " +"received. This function returns two values, an [enum @GlobalScope.Error] " +"code and a data array." +msgstr "" + +#: doc/classes/StreamPeer.xml:60 +msgid "Gets a double-precision float from the stream." +msgstr "" + +#: doc/classes/StreamPeer.xml:67 +msgid "Gets a single-precision float from the stream." +msgstr "" + +#: doc/classes/StreamPeer.xml:76 +msgid "" +"Returns a chunk data with the received bytes. The amount of bytes to be " +"received can be requested in the \"bytes\" argument. If not enough bytes are " +"available, the function will return how many were actually received. This " +"function returns two values, an [enum @GlobalScope.Error] code, and a data " +"array." +msgstr "" + +#: doc/classes/StreamPeer.xml:85 +msgid "" +"Gets a string with byte-length [code]bytes[/code] from the stream. If " +"[code]bytes[/code] is negative (default) the length will be read from the " +"stream using the reverse process of [method put_string]." +msgstr "" + +#: doc/classes/StreamPeer.xml:92 +msgid "Gets an unsigned 16-bit value from the stream." +msgstr "" + +#: doc/classes/StreamPeer.xml:99 +msgid "Gets an unsigned 32-bit value from the stream." +msgstr "" + +#: doc/classes/StreamPeer.xml:106 +msgid "Gets an unsigned 64-bit value from the stream." +msgstr "" + +#: doc/classes/StreamPeer.xml:113 +msgid "Gets an unsigned byte from the stream." +msgstr "" + +#: doc/classes/StreamPeer.xml:122 +msgid "" +"Gets an UTF-8 string with byte-length [code]bytes[/code] from the stream " +"(this decodes the string sent as UTF-8). If [code]bytes[/code] is negative " +"(default) the length will be read from the stream using the reverse process " +"of [method put_utf8_string]." +msgstr "" + +#: doc/classes/StreamPeer.xml:131 +msgid "" +"Gets a Variant from the stream. If [code]allow_objects[/code] is [code]true[/" +"code], decoding objects is allowed.\n" +"[b]Warning:[/b] Deserialized objects can contain code which gets executed. " +"Do not use this option if the serialized object comes from untrusted sources " +"to avoid potential security threats such as remote code execution." +msgstr "" + +#: doc/classes/StreamPeer.xml:141 +msgid "Puts a signed 16-bit value into the stream." +msgstr "" + +#: doc/classes/StreamPeer.xml:150 +msgid "Puts a signed 32-bit value into the stream." +msgstr "" + +#: doc/classes/StreamPeer.xml:159 +msgid "Puts a signed 64-bit value into the stream." +msgstr "" + +#: doc/classes/StreamPeer.xml:168 +msgid "Puts a signed byte into the stream." +msgstr "" + +#: doc/classes/StreamPeer.xml:177 +msgid "" +"Sends a chunk of data through the connection, blocking if necessary until " +"the data is done sending. This function returns an [enum @GlobalScope.Error] " +"code." +msgstr "" + +#: doc/classes/StreamPeer.xml:186 +msgid "Puts a double-precision float into the stream." +msgstr "" + +#: doc/classes/StreamPeer.xml:195 +msgid "Puts a single-precision float into the stream." +msgstr "" + +#: doc/classes/StreamPeer.xml:204 +msgid "" +"Sends a chunk of data through the connection. If all the data could not be " +"sent at once, only part of it will. This function returns two values, an " +"[enum @GlobalScope.Error] code and an integer, describing how much data was " +"actually sent." +msgstr "" + +#: doc/classes/StreamPeer.xml:213 +msgid "" +"Puts a zero-terminated ASCII string into the stream prepended by a 32-bit " +"unsigned integer representing its size.\n" +"Note: To put an ASCII string without prepending its size, you can use " +"[method put_data]:\n" +"[codeblock]\n" +"put_data(\"Hello world\".to_ascii())\n" +"[/codeblock]" +msgstr "" + +#: doc/classes/StreamPeer.xml:226 +msgid "Puts an unsigned 16-bit value into the stream." +msgstr "" + +#: doc/classes/StreamPeer.xml:235 +msgid "Puts an unsigned 32-bit value into the stream." +msgstr "" + +#: doc/classes/StreamPeer.xml:244 +msgid "Puts an unsigned 64-bit value into the stream." +msgstr "" + +#: doc/classes/StreamPeer.xml:253 +msgid "Puts an unsigned byte into the stream." +msgstr "" + +#: doc/classes/StreamPeer.xml:262 +msgid "" +"Puts a zero-terminated UTF-8 string into the stream prepended by a 32 bits " +"unsigned integer representing its size.\n" +"Note: To put an UTF-8 string without prepending its size, you can use " +"[method put_data]:\n" +"[codeblock]\n" +"put_data(\"Hello world\".to_utf8())\n" +"[/codeblock]" +msgstr "" + +#: doc/classes/StreamPeer.xml:277 +msgid "" +"Puts a Variant into the stream. If [code]full_objects[/code] is [code]true[/" +"code] encoding objects is allowed (and can potentially include code)." +msgstr "" + +#: doc/classes/StreamPeer.xml:283 +msgid "" +"If [code]true[/code], this [StreamPeer] will using big-endian format for " +"encoding and decoding." +msgstr "" + +#: doc/classes/StreamPeerSSL.xml:4 +msgid "SSL stream peer." +msgstr "" + +#: doc/classes/StreamPeerSSL.xml:7 +msgid "" +"SSL stream peer. This object can be used to connect to an SSL server or " +"accept a single SSL client connection." +msgstr "" + +#: doc/classes/StreamPeerSSL.xml:25 +msgid "" +"Accepts a peer connection as a server using the given [code]private_key[/" +"code] and providing the given [code]certificate[/code] to the client. You " +"can pass the optional [code]chain[/code] parameter to provide additional CA " +"chain information along with the certificate." +msgstr "" + +#: doc/classes/StreamPeerSSL.xml:40 +msgid "" +"Connects to a peer using an underlying [StreamPeer] [code]stream[/code]. If " +"[code]validate_certs[/code] is [code]true[/code], [StreamPeerSSL] will " +"validate that the certificate presented by the peer matches the " +"[code]for_hostname[/code].\n" +"[b]Note:[/b] Specifying a custom [code]valid_certificate[/code] is not " +"supported in HTML5 exports due to browsers restrictions." +msgstr "" + +#: doc/classes/StreamPeerSSL.xml:48 doc/classes/StreamPeerTCP.xml:27 +msgid "Disconnects from host." +msgstr "" + +#: doc/classes/StreamPeerSSL.xml:62 +msgid "" +"Poll the connection to check for incoming bytes. Call this right before " +"[method StreamPeer.get_available_bytes] for it to work properly." +msgstr "" + +#: doc/classes/StreamPeerSSL.xml:72 +msgid "A status representing a [StreamPeerSSL] that is disconnected." +msgstr "" + +#: doc/classes/StreamPeerSSL.xml:75 +msgid "A status representing a [StreamPeerSSL] during handshaking." +msgstr "" + +#: doc/classes/StreamPeerSSL.xml:78 +msgid "A status representing a [StreamPeerSSL] that is connected to a host." +msgstr "" + +#: doc/classes/StreamPeerSSL.xml:81 +msgid "A status representing a [StreamPeerSSL] in error state." +msgstr "" + +#: doc/classes/StreamPeerSSL.xml:84 +msgid "" +"An error status that shows a mismatch in the SSL certificate domain " +"presented by the host and the domain requested for validation." +msgstr "" + +#: doc/classes/StreamPeerTCP.xml:4 +msgid "TCP stream peer." +msgstr "" + +#: doc/classes/StreamPeerTCP.xml:7 +msgid "" +"TCP stream peer. This object can be used to connect to TCP servers, or also " +"is returned by a TCP server." +msgstr "" + +#: doc/classes/StreamPeerTCP.xml:20 +msgid "" +"Connects to the specified [code]host:port[/code] pair. A hostname will be " +"resolved if valid. Returns [constant OK] on success or [constant FAILED] on " +"failure." +msgstr "" + +#: doc/classes/StreamPeerTCP.xml:34 +msgid "Returns the IP of this peer." +msgstr "" + +#: doc/classes/StreamPeerTCP.xml:41 +msgid "Returns the port of this peer." +msgstr "" + +#: doc/classes/StreamPeerTCP.xml:48 +msgid "Returns the status of the connection, see [enum Status]." +msgstr "" + +#: doc/classes/StreamPeerTCP.xml:55 +msgid "" +"Returns [code]true[/code] if this peer is currently connected to a host, " +"[code]false[/code] otherwise." +msgstr "" + +#: doc/classes/StreamPeerTCP.xml:64 +msgid "" +"Disables Nagle's algorithm to improve latency for small packets.\n" +"[b]Note:[/b] For applications that send large packets or need to transfer a " +"lot of data, this can decrease the total available bandwidth." +msgstr "" + +#: doc/classes/StreamPeerTCP.xml:71 +msgid "" +"The initial status of the [StreamPeerTCP]. This is also the status after " +"disconnecting." +msgstr "" + +#: doc/classes/StreamPeerTCP.xml:74 +msgid "A status representing a [StreamPeerTCP] that is connecting to a host." +msgstr "" + +#: doc/classes/StreamPeerTCP.xml:77 +msgid "A status representing a [StreamPeerTCP] that is connected to a host." +msgstr "" + +#: doc/classes/StreamPeerTCP.xml:80 +msgid "A status representing a [StreamPeerTCP] in error state." +msgstr "" + +#: doc/classes/StreamTexture.xml:4 +msgid "A [code].stex[/code] texture." +msgstr "" + +#: doc/classes/StreamTexture.xml:7 +msgid "A texture that is loaded from a [code].stex[/code] file." +msgstr "" + +#: doc/classes/StreamTexture.xml:18 +msgid "Loads the texture from the given path." +msgstr "" + +#: doc/classes/StreamTexture.xml:24 +msgid "The StreamTexture's file path to a [code].stex[/code] file." +msgstr "" + +#: doc/classes/String.xml:4 +msgid "Built-in string class." +msgstr "" + +#: doc/classes/String.xml:7 +msgid "" +"This is the built-in string class (and the one used by GDScript). It " +"supports Unicode and provides all necessary means for string handling. " +"Strings are reference counted and use a copy-on-write approach, so passing " +"them around is cheap in resources." +msgstr "" + +#: doc/classes/String.xml:10 +msgid "" +"https://docs.godotengine.org/en/latest/getting_started/scripting/gdscript/" +"gdscript_format_string.html" +msgstr "" + +#: doc/classes/String.xml:19 +msgid "Constructs a new String from the given [bool]." +msgstr "" + +#: doc/classes/String.xml:28 +msgid "Constructs a new String from the given [int]." +msgstr "" + +#: doc/classes/String.xml:37 +msgid "Constructs a new String from the given [float]." +msgstr "" + +#: doc/classes/String.xml:46 +msgid "Constructs a new String from the given [Vector2]." +msgstr "" + +#: doc/classes/String.xml:55 +msgid "Constructs a new String from the given [Vector2i]." +msgstr "" + +#: doc/classes/String.xml:64 +msgid "Constructs a new String from the given [Rect2]." +msgstr "" + +#: doc/classes/String.xml:73 +msgid "Constructs a new String from the given [Rect2i]." +msgstr "" + +#: doc/classes/String.xml:82 +msgid "Constructs a new String from the given [Vector3]." +msgstr "" + +#: doc/classes/String.xml:91 +msgid "Constructs a new String from the given [Vector3i]." +msgstr "" + +#: doc/classes/String.xml:100 +msgid "Constructs a new String from the given [Transform2D]." +msgstr "" + +#: doc/classes/String.xml:109 +msgid "Constructs a new String from the given [Plane]." +msgstr "" + +#: doc/classes/String.xml:118 +msgid "Constructs a new String from the given [Quat]." +msgstr "" + +#: doc/classes/String.xml:127 +msgid "Constructs a new String from the given [AABB]." +msgstr "" + +#: doc/classes/String.xml:136 +msgid "Constructs a new String from the given [Basis]." +msgstr "" + +#: doc/classes/String.xml:145 +msgid "Constructs a new String from the given [Transform]." +msgstr "" + +#: doc/classes/String.xml:154 +msgid "Constructs a new String from the given [Color]." +msgstr "" + +#: doc/classes/String.xml:163 +msgid "Constructs a new String from the given [StringName]." +msgstr "" + +#: doc/classes/String.xml:172 +msgid "Constructs a new String from the given [NodePath]." +msgstr "" + +#: doc/classes/String.xml:181 +msgid "Constructs a new String from the given [RID]." +msgstr "" + +#: doc/classes/String.xml:190 +msgid "Constructs a new String from the given [Callable]." +msgstr "" + +#: doc/classes/String.xml:199 +msgid "Constructs a new String from the given [Signal]." +msgstr "" + +#: doc/classes/String.xml:208 +msgid "Constructs a new String from the given [Dictionary]." +msgstr "" + +#: doc/classes/String.xml:217 +msgid "Constructs a new String from the given [Array]." +msgstr "" + +#: doc/classes/String.xml:226 +msgid "Constructs a new String from the given [PackedByteArray]." +msgstr "" + +#: doc/classes/String.xml:235 +msgid "Constructs a new String from the given [PackedInt32Array]." +msgstr "" + +#: doc/classes/String.xml:244 +msgid "Constructs a new String from the given [PackedInt64Array]." +msgstr "" + +#: doc/classes/String.xml:253 +msgid "Constructs a new String from the given [PackedFloat32Array]." +msgstr "" + +#: doc/classes/String.xml:262 +msgid "Constructs a new String from the given [PackedFloat64Array]." +msgstr "" + +#: doc/classes/String.xml:271 +msgid "Constructs a new String from the given [PackedStringArray]." +msgstr "" + +#: doc/classes/String.xml:280 +msgid "Constructs a new String from the given [PackedVector2Array]." +msgstr "" + +#: doc/classes/String.xml:289 +msgid "Constructs a new String from the given [PackedVector3Array]." +msgstr "" + +#: doc/classes/String.xml:298 +msgid "Constructs a new String from the given [PackedColorArray]." +msgstr "" + +#: doc/classes/String.xml:307 +msgid "Returns [code]true[/code] if the string begins with the given string." +msgstr "" + +#: doc/classes/String.xml:314 +msgid "Returns the bigrams (pairs of consecutive letters) of this string." +msgstr "" + +#: doc/classes/String.xml:321 +msgid "" +"Returns a copy of the string with special characters escaped using the C " +"language standard." +msgstr "" + +#: doc/classes/String.xml:328 +msgid "" +"Returns a copy of the string with escaped characters replaced by their " +"meanings according to the C language standard." +msgstr "" + +#: doc/classes/String.xml:335 +msgid "" +"Changes the case of some letters. Replaces underscores with spaces, converts " +"all letters to lowercase, then capitalizes first and every letter following " +"the space character. For [code]capitalize camelCase mixed_with_underscores[/" +"code], it will return [code]Capitalize Camelcase Mixed With Underscores[/" +"code]." +msgstr "" + +#: doc/classes/String.xml:344 +msgid "" +"Performs a case-sensitive comparison to another string. Returns [code]-1[/" +"code] if less than, [code]+1[/code] if greater than, or [code]0[/code] if " +"equal." +msgstr "" + +#: doc/classes/String.xml:357 +msgid "" +"Returns the number of occurrences of substring [code]what[/code] between " +"[code]from[/code] and [code]to[/code] positions. If [code]from[/code] and " +"[code]to[/code] equals 0 the whole string will be used. If only [code]to[/" +"code] equals 0 the remained substring will be used." +msgstr "" + +#: doc/classes/String.xml:370 +msgid "" +"Returns the number of occurrences of substring [code]what[/code] (ignoring " +"case) between [code]from[/code] and [code]to[/code] positions. If " +"[code]from[/code] and [code]to[/code] equals 0 the whole string will be " +"used. If only [code]to[/code] equals 0 the remained substring will be used." +msgstr "" + +#: doc/classes/String.xml:377 +msgid "" +"Returns a copy of the string with indentation (leading tabs and spaces) " +"removed." +msgstr "" + +#: doc/classes/String.xml:384 +msgid "Returns [code]true[/code] if the string is empty." +msgstr "" + +#: doc/classes/String.xml:393 +msgid "Returns [code]true[/code] if the string ends with the given string." +msgstr "" + +#: doc/classes/String.xml:404 +msgid "" +"Erases [code]chars[/code] characters from the string starting from " +"[code]position[/code]." +msgstr "" + +#: doc/classes/String.xml:415 +msgid "" +"Finds the first occurrence of a substring. Returns the starting position of " +"the substring or -1 if not found. Optionally, the initial search index can " +"be passed." +msgstr "" + +#: doc/classes/String.xml:424 +msgid "" +"Finds the last occurrence of a substring. Returns the starting position of " +"the substring or -1 if not found." +msgstr "" + +#: doc/classes/String.xml:435 +msgid "" +"Finds the first occurrence of a substring, ignoring case. Returns the " +"starting position of the substring or -1 if not found. Optionally, the " +"initial search index can be passed." +msgstr "" + +#: doc/classes/String.xml:446 +msgid "" +"Formats the string by replacing all occurrences of [code]placeholder[/code] " +"with [code]values[/code]." +msgstr "" + +#: doc/classes/String.xml:453 +msgid "If the string is a valid file path, returns the base directory name." +msgstr "" + +#: doc/classes/String.xml:460 +msgid "" +"If the string is a valid file path, returns the full file path without the " +"extension." +msgstr "" + +#: doc/classes/String.xml:467 +msgid "If the string is a valid file path, returns the extension." +msgstr "" + +#: doc/classes/String.xml:474 +msgid "If the string is a valid file path, returns the filename." +msgstr "" + +#: doc/classes/String.xml:481 +msgid "Hashes the string and returns a 32-bit integer." +msgstr "" + +#: doc/classes/String.xml:488 +msgid "" +"Converts a string containing a hexadecimal number into an integer. " +"Hexadecimal strings are expected to be prefixed with \"[code]0x[/code]\" " +"otherwise [code]0[/code] is returned.\n" +"[codeblock]\n" +"print(\"0xff\".hex_to_int()) # Print \"255\"\n" +"[/codeblock]" +msgstr "" + +#: doc/classes/String.xml:498 +msgid "" +"Escapes (encodes) a string to URL friendly format. Also referred to as 'URL " +"encode'.\n" +"[codeblock]\n" +"print(\"https://example.org/?escaped=\" + \"Godot Engine:'docs'\"." +"http_escape())\n" +"[/codeblock]" +msgstr "" + +#: doc/classes/String.xml:508 +msgid "" +"Unescapes (decodes) a string in URL encoded format. Also referred to as 'URL " +"decode'.\n" +"[codeblock]\n" +"print(\"https://example.org/?escaped=\" + \"Godot%20Engine%3A%27docs%27\"." +"http_unescape())\n" +"[/codeblock]" +msgstr "" + +#: doc/classes/String.xml:520 +msgid "" +"Converts [code]size[/code] represented as number of bytes to human-readable " +"format using internationalized set of data size units, namely: B, KiB, MiB, " +"GiB, TiB, PiB, EiB. Note that the next smallest unit is picked automatically " +"to hold at most 1024 units.\n" +"[codeblock]\n" +"var bytes = 133790307\n" +"var size = String.humanize_size(bytes)\n" +"print(size) # prints \"127.5 MiB\"\n" +"[/codeblock]" +msgstr "" + +#: doc/classes/String.xml:536 +msgid "" +"Returns a copy of the string with the substring [code]what[/code] inserted " +"at the given position." +msgstr "" + +#: doc/classes/String.xml:543 +msgid "" +"If the string is a path to a file or directory, returns [code]true[/code] if " +"the path is absolute." +msgstr "" + +#: doc/classes/String.xml:550 +msgid "" +"If the string is a path to a file or directory, returns [code]true[/code] if " +"the path is relative." +msgstr "" + +#: doc/classes/String.xml:559 +msgid "" +"Returns [code]true[/code] if this string is a subsequence of the given " +"string." +msgstr "" + +#: doc/classes/String.xml:568 +msgid "" +"Returns [code]true[/code] if this string is a subsequence of the given " +"string, without considering case." +msgstr "" + +#: doc/classes/String.xml:575 +msgid "" +"Returns [code]true[/code] if this string is free from characters that aren't " +"allowed in file names, those being:\n" +"[code]: / \\ ? * \" | % < >[/code]" +msgstr "" + +#: doc/classes/String.xml:583 +msgid "Returns [code]true[/code] if this string contains a valid float." +msgstr "" + +#: doc/classes/String.xml:592 +msgid "" +"Returns [code]true[/code] if this string contains a valid hexadecimal " +"number. If [code]with_prefix[/code] is [code]true[/code], then a validity of " +"the hexadecimal number is determined by [code]0x[/code] prefix, for " +"instance: [code]0xDEADC0DE[/code]." +msgstr "" + +#: doc/classes/String.xml:599 +msgid "" +"Returns [code]true[/code] if this string contains a valid color in " +"hexadecimal HTML notation. Other HTML notations such as named colors or " +"[code]hsl()[/code] colors aren't considered valid by this method and will " +"return [code]false[/code]." +msgstr "" + +#: doc/classes/String.xml:606 +msgid "" +"Returns [code]true[/code] if this string is a valid identifier. A valid " +"identifier may contain only letters, digits and underscores ([code]_[/code]) " +"and the first character may not be a digit." +msgstr "" + +#: doc/classes/String.xml:613 +msgid "Returns [code]true[/code] if this string contains a valid integer." +msgstr "" + +#: doc/classes/String.xml:620 +msgid "Returns [code]true[/code] if this string contains a valid IP address." +msgstr "" + +#: doc/classes/String.xml:627 +msgid "" +"Returns a copy of the string with special characters escaped using the JSON " +"standard." +msgstr "" + +#: doc/classes/String.xml:636 +msgid "Returns a number of characters from the left of the string." +msgstr "" + +#: doc/classes/String.xml:643 +msgid "Returns the string's amount of characters." +msgstr "" + +#: doc/classes/String.xml:652 +msgid "Returns a copy of the string with characters removed from the left." +msgstr "" + +#: doc/classes/String.xml:661 +msgid "" +"Does a simple case-sensitive expression match, where [code]\"*\"[/code] " +"matches zero or more arbitrary characters and [code]\"?\"[/code] matches any " +"single character except a period ([code]\".\"[/code])." +msgstr "" + +#: doc/classes/String.xml:670 +msgid "" +"Does a simple case-insensitive expression match, where [code]\"*\"[/code] " +"matches zero or more arbitrary characters and [code]\"?\"[/code] matches any " +"single character except a period ([code]\".\"[/code])." +msgstr "" + +#: doc/classes/String.xml:677 +msgid "Returns the MD5 hash of the string as an array of bytes." +msgstr "" + +#: doc/classes/String.xml:684 +msgid "Returns the MD5 hash of the string as a string." +msgstr "" + +#: doc/classes/String.xml:693 +msgid "" +"Performs a case-insensitive comparison to another string. Returns [code]-1[/" +"code] if less than, [code]+1[/code] if greater than, or [code]0[/code] if " +"equal." +msgstr "" + +#: doc/classes/String.xml:702 +msgid "Returns the character code at position [code]at[/code]." +msgstr "" + +#: doc/classes/String.xml:711 +msgid "" +"Formats a number to have an exact number of [code]digits[/code] after the " +"decimal point." +msgstr "" + +#: doc/classes/String.xml:720 +msgid "" +"Formats a number to have an exact number of [code]digits[/code] before the " +"decimal point." +msgstr "" + +#: doc/classes/String.xml:727 +msgid "Decode a percent-encoded string. See [method percent_encode]." +msgstr "" + +#: doc/classes/String.xml:734 +msgid "" +"Percent-encodes a string. Encodes parameters in a URL when sending a HTTP " +"GET request (and bodies of form-urlencoded POST requests)." +msgstr "" + +#: doc/classes/String.xml:743 +msgid "" +"If the string is a path, this concatenates [code]file[/code] at the end of " +"the string as a subpath. E.g. [code]\"this/is\".plus_file(\"path\") == " +"\"this/is/path\"[/code]." +msgstr "" + +#: doc/classes/String.xml:752 +msgid "" +"Returns original string repeated a number of times. The number of " +"repetitions is given by the argument." +msgstr "" + +#: doc/classes/String.xml:763 +msgid "" +"Replaces occurrences of a case-sensitive substring with the given one inside " +"the string." +msgstr "" + +#: doc/classes/String.xml:774 +msgid "" +"Replaces occurrences of a case-insensitive substring with the given one " +"inside the string." +msgstr "" + +#: doc/classes/String.xml:785 +msgid "" +"Performs a case-sensitive search for a substring, but starts from the end of " +"the string instead of the beginning." +msgstr "" + +#: doc/classes/String.xml:796 +msgid "" +"Performs a case-insensitive search for a substring, but starts from the end " +"of the string instead of the beginning." +msgstr "" + +#: doc/classes/String.xml:805 +msgid "Returns the right side of the string from a given position." +msgstr "" + +#: doc/classes/String.xml:818 +msgid "" +"Splits the string by a [code]delimiter[/code] string and returns an array of " +"the substrings, starting from right.\n" +"The splits in the returned array are sorted in the same order as the " +"original string, from left to right.\n" +"If [code]maxsplit[/code] is specified, it defines the number of splits to do " +"from the right up to [code]maxsplit[/code]. The default value of 0 means " +"that all items are split, thus giving the same result as [method split].\n" +"Example:\n" +"[codeblock]\n" +"var some_string = \"One,Two,Three,Four\"\n" +"var some_array = some_string.rsplit(\",\", true, 1)\n" +"print(some_array.size()) # Prints 2\n" +"print(some_array[0]) # Prints \"Four\"\n" +"print(some_array[1]) # Prints \"Three,Two,One\"\n" +"[/codeblock]" +msgstr "" + +#: doc/classes/String.xml:837 +msgid "Returns a copy of the string with characters removed from the right." +msgstr "" + +#: doc/classes/String.xml:844 +msgid "Returns the SHA-1 hash of the string as an array of bytes." +msgstr "" + +#: doc/classes/String.xml:851 +msgid "Returns the SHA-1 hash of the string as a string." +msgstr "" + +#: doc/classes/String.xml:858 +msgid "Returns the SHA-256 hash of the string as an array of bytes." +msgstr "" + +#: doc/classes/String.xml:865 +msgid "Returns the SHA-256 hash of the string as a string." +msgstr "" + +#: doc/classes/String.xml:874 +msgid "" +"Returns the similarity index of the text compared to this string. 1 means " +"totally similar and 0 means totally dissimilar." +msgstr "" + +#: doc/classes/String.xml:887 +msgid "" +"Splits the string by a [code]delimiter[/code] string and returns an array of " +"the substrings.\n" +"If [code]maxsplit[/code] is specified, it defines the number of splits to do " +"from the left up to [code]maxsplit[/code]. The default value of 0 means that " +"all items are split.\n" +"Example:\n" +"[codeblock]\n" +"var some_string = \"One,Two,Three,Four\"\n" +"var some_array = some_string.split(\",\", true, 1)\n" +"print(some_array.size()) # Prints 2\n" +"print(some_array[0]) # Prints \"One\"\n" +"print(some_array[1]) # Prints \"Two,Three,Four\"\n" +"[/codeblock]" +msgstr "" + +#: doc/classes/String.xml:907 +msgid "" +"Splits the string in floats by using a delimiter string and returns an array " +"of the substrings.\n" +"For example, [code]\"1,2.5,3\"[/code] will return [code][1,2.5,3][/code] if " +"split by [code]\",\"[/code]." +msgstr "" + +#: doc/classes/String.xml:919 +msgid "" +"Returns a copy of the string stripped of any non-printable character " +"(including tabulations, spaces and line breaks) at the beginning and the " +"end. The optional arguments are used to toggle stripping on the left and " +"right edges respectively." +msgstr "" + +#: doc/classes/String.xml:926 +msgid "" +"Returns a copy of the string stripped of any escape character. These include " +"all non-printable control characters of the first page of the ASCII table (< " +"32), such as tabulation ([code]\\t[/code] in C) and newline ([code]\\n[/" +"code] and [code]\\r[/code]) characters, but not spaces." +msgstr "" + +#: doc/classes/String.xml:937 +msgid "" +"Returns part of the string from the position [code]from[/code] with length " +"[code]len[/code]. Argument [code]len[/code] is optional and using -1 will " +"return remaining characters from given position." +msgstr "" + +#: doc/classes/String.xml:944 +msgid "" +"Converts the String (which is a character array) to [PackedByteArray] (which " +"is an array of bytes). The conversion is faster compared to [method " +"to_utf8], as this method assumes that all the characters in the String are " +"ASCII characters." +msgstr "" + +#: doc/classes/String.xml:951 +msgid "" +"Converts a string containing a decimal number into a [code]float[/code]." +msgstr "" + +#: doc/classes/String.xml:958 +msgid "" +"Converts a string containing an integer number into an [code]int[/code]." +msgstr "" + +#: doc/classes/String.xml:965 +msgid "Returns the string converted to lowercase." +msgstr "" + +#: doc/classes/String.xml:972 +msgid "Returns the string converted to uppercase." +msgstr "" + +#: doc/classes/String.xml:979 +msgid "" +"Converts the String (which is an array of characters) to [PackedByteArray] " +"(which is an array of bytes). The conversion is a bit slower than [method " +"to_ascii], but supports all UTF-8 characters. Therefore, you should prefer " +"this function over [method to_ascii]." +msgstr "" + +#: doc/classes/String.xml:988 +msgid "" +"Removes a given string from the start if it starts with it or leaves the " +"string unchanged." +msgstr "" + +#: doc/classes/String.xml:997 +msgid "" +"Removes a given string from the end if it ends with it or leaves the string " +"unchanged." +msgstr "" + +#: doc/classes/String.xml:1004 +msgid "" +"Returns a copy of the string with special characters escaped using the XML " +"standard." +msgstr "" + +#: doc/classes/String.xml:1011 +msgid "" +"Returns a copy of the string with escaped characters replaced by their " +"meanings according to the XML standard." +msgstr "" + +#: doc/classes/StringName.xml:4 +msgid "An optimized string type for unique names." +msgstr "" + +#: doc/classes/StringName.xml:7 +msgid "" +"[StringName]s are immutable strings designed for general-purpose " +"represention of unique names. [StringName] ensures that only one instance of " +"a given name exists (so two [StringName]s with the same value are the same " +"object). Comparing them is much faster than with regular [String]s, because " +"only the pointers are compared, not the whole strings." +msgstr "" + +#: doc/classes/StringName.xml:18 +msgid "Creates a new [StringName] from the given [String]." +msgstr "" + +#: doc/classes/StyleBox.xml:4 +msgid "Base class for drawing stylized boxes for the UI." +msgstr "" + +#: doc/classes/StyleBox.xml:7 +msgid "" +"StyleBox is [Resource] that provides an abstract base class for drawing " +"stylized boxes for the UI. StyleBoxes are used for drawing the styles of " +"buttons, line edit backgrounds, tree backgrounds, etc. and also for testing " +"a transparency mask for pointer signals. If mask test fails on a StyleBox " +"assigned as mask to a control, clicks and motion signals will go through it " +"to the one below." +msgstr "" + +#: doc/classes/StyleBox.xml:20 +msgid "" +"Draws this stylebox using a [CanvasItem] with given [RID].\n" +"You can get a [RID] value using [method Object.get_instance_id] on a " +"[CanvasItem]-derived node." +msgstr "" + +#: doc/classes/StyleBox.xml:28 +msgid "Returns the size of this [StyleBox] without the margins." +msgstr "" + +#: doc/classes/StyleBox.xml:35 +msgid "" +"Returns the [CanvasItem] that handles its [constant CanvasItem." +"NOTIFICATION_DRAW] or [method CanvasItem._draw] callback at this moment." +msgstr "" + +#: doc/classes/StyleBox.xml:44 +msgid "Returns the default value of the specified [enum Margin]." +msgstr "" + +#: doc/classes/StyleBox.xml:53 +msgid "" +"Returns the content margin offset for the specified [enum Margin].\n" +"Positive values reduce size inwards, unlike [Control]'s margin values." +msgstr "" + +#: doc/classes/StyleBox.xml:61 +msgid "Returns the minimum size that this stylebox can be shrunk to." +msgstr "" + +#: doc/classes/StyleBox.xml:68 +msgid "" +"Returns the \"offset\" of a stylebox. This helper function returns a value " +"equivalent to [code]Vector2(style.get_margin(MARGIN_LEFT), style." +"get_margin(MARGIN_TOP))[/code]." +msgstr "" + +#: doc/classes/StyleBox.xml:79 +msgid "" +"Sets the default value of the specified [enum Margin] to given [code]offset[/" +"code] in pixels." +msgstr "" + +#: doc/classes/StyleBox.xml:90 +msgid "Test a position in a rectangle, return whether it passes the mask test." +msgstr "" + +#: doc/classes/StyleBox.xml:96 +msgid "" +"The bottom margin for the contents of this style box. Increasing this value " +"reduces the space available to the contents from the bottom.\n" +"If this value is negative, it is ignored and a child-specific margin is used " +"instead. For example for [StyleBoxFlat] the border thickness (if any) is " +"used instead.\n" +"It is up to the code using this style box to decide what these contents are: " +"for example, a [Button] respects this content margin for the textual " +"contents of the button.\n" +"[method get_margin] should be used to fetch this value as consumer instead " +"of reading these properties directly. This is because it correctly respects " +"negative values and the fallback mentioned above." +msgstr "" + +#: doc/classes/StyleBox.xml:102 +msgid "" +"The left margin for the contents of this style box.Increasing this value " +"reduces the space available to the contents from the left.\n" +"Refer to [member content_margin_bottom] for extra considerations." +msgstr "" + +#: doc/classes/StyleBox.xml:106 +msgid "" +"The right margin for the contents of this style box. Increasing this value " +"reduces the space available to the contents from the right.\n" +"Refer to [member content_margin_bottom] for extra considerations." +msgstr "" + +#: doc/classes/StyleBox.xml:110 +msgid "" +"The top margin for the contents of this style box. Increasing this value " +"reduces the space available to the contents from the top.\n" +"Refer to [member content_margin_bottom] for extra considerations." +msgstr "" + +#: doc/classes/StyleBoxEmpty.xml:4 +msgid "Empty stylebox (does not display anything)." +msgstr "" + +#: doc/classes/StyleBoxEmpty.xml:7 +msgid "Empty stylebox (really does not display anything)." +msgstr "" + +#: doc/classes/StyleBoxFlat.xml:4 +msgid "" +"Customizable [StyleBox] with a given set of parameters (no texture required)." +msgstr "" + +#: doc/classes/StyleBoxFlat.xml:7 +msgid "" +"This [StyleBox] can be used to achieve all kinds of looks without the need " +"of a texture. Those properties are customizable:\n" +"- Color\n" +"- Border width (individual width for each border)\n" +"- Rounded corners (individual radius for each corner)\n" +"- Shadow (with blur and offset)\n" +"Setting corner radius to high values is allowed. As soon as corners would " +"overlap, the stylebox will switch to a relative system. Example:\n" +"[codeblock]\n" +"height = 30\n" +"corner_radius_top_left = 50\n" +"corner_radius_bottom_left = 100\n" +"[/codeblock]\n" +"The relative system now would take the 1:2 ratio of the two left corners to " +"calculate the actual corner width. Both corners added will [b]never[/b] be " +"more than the height. Result:\n" +"[codeblock]\n" +"corner_radius_top_left: 10\n" +"corner_radius_bottom_left: 20\n" +"[/codeblock]" +msgstr "" + +#: doc/classes/StyleBoxFlat.xml:33 +msgid "" +"Returns the given [code]margin[/code]'s border width. See [enum Margin] for " +"possible values." +msgstr "" + +#: doc/classes/StyleBoxFlat.xml:40 +msgid "Returns the smallest border width out of all four borders." +msgstr "" + +#: doc/classes/StyleBoxFlat.xml:49 +msgid "" +"Returns the given [code]corner[/code]'s radius. See [enum Corner] for " +"possible values." +msgstr "" + +#: doc/classes/StyleBoxFlat.xml:58 doc/classes/StyleBoxTexture.xml:18 +msgid "" +"Returns the size of the given [code]margin[/code]'s expand margin. See [enum " +"Margin] for possible values." +msgstr "" + +#: doc/classes/StyleBoxFlat.xml:69 +msgid "" +"Sets the border width to [code]width[/code] pixels for the given " +"[code]margin[/code]. See [enum Margin] for possible values." +msgstr "" + +#: doc/classes/StyleBoxFlat.xml:78 +msgid "Sets the border width to [code]width[/code] pixels for all margins." +msgstr "" + +#: doc/classes/StyleBoxFlat.xml:89 +msgid "" +"Sets the corner radius to [code]radius[/code] pixels for the given " +"[code]corner[/code]. See [enum Corner] for possible values." +msgstr "" + +#: doc/classes/StyleBoxFlat.xml:98 +msgid "Sets the corner radius to [code]radius[/code] pixels for all corners." +msgstr "" + +#: doc/classes/StyleBoxFlat.xml:113 +msgid "" +"Sets the corner radius for each corner to [code]radius_top_left[/code], " +"[code]radius_top_right[/code], [code]radius_bottom_right[/code], and " +"[code]radius_bottom_left[/code] pixels." +msgstr "" + +#: doc/classes/StyleBoxFlat.xml:124 doc/classes/StyleBoxTexture.xml:62 +msgid "" +"Sets the expand margin to [code]size[/code] pixels for the given " +"[code]margin[/code]. See [enum Margin] for possible values." +msgstr "" + +#: doc/classes/StyleBoxFlat.xml:133 doc/classes/StyleBoxTexture.xml:36 +msgid "Sets the expand margin to [code]size[/code] pixels for all margins." +msgstr "" + +#: doc/classes/StyleBoxFlat.xml:148 doc/classes/StyleBoxTexture.xml:51 +msgid "" +"Sets the expand margin for each margin to [code]size_left[/code], " +"[code]size_top[/code], [code]size_right[/code], and [code]size_bottom[/code] " +"pixels." +msgstr "" + +#: doc/classes/StyleBoxFlat.xml:154 +msgid "" +"Antialiasing draws a small ring around the edges, which fades to " +"transparency. As a result, edges look much smoother. This is only noticeable " +"when using rounded corners." +msgstr "" + +#: doc/classes/StyleBoxFlat.xml:157 +msgid "" +"This changes the size of the faded ring. Higher values can be used to " +"achieve a \"blurry\" effect." +msgstr "" + +#: doc/classes/StyleBoxFlat.xml:160 +msgid "The background color of the stylebox." +msgstr "" + +#: doc/classes/StyleBoxFlat.xml:163 +msgid "If [code]true[/code], the border will fade into the background color." +msgstr "" + +#: doc/classes/StyleBoxFlat.xml:166 +msgid "Sets the color of the border." +msgstr "" + +#: doc/classes/StyleBoxFlat.xml:169 +msgid "Border width for the bottom border." +msgstr "" + +#: doc/classes/StyleBoxFlat.xml:172 +msgid "Border width for the left border." +msgstr "" + +#: doc/classes/StyleBoxFlat.xml:175 +msgid "Border width for the right border." +msgstr "" + +#: doc/classes/StyleBoxFlat.xml:178 +msgid "Border width for the top border." +msgstr "" + +#: doc/classes/StyleBoxFlat.xml:181 +msgid "" +"This sets the amount of vertices used for each corner. Higher values result " +"in rounder corners but take more processing power to compute. When choosing " +"a value, you should take the corner radius ([method set_corner_radius_all]) " +"into account.\n" +"For corner radii smaller than 10, [code]4[/code] or [code]5[/code] should be " +"enough. For corner radii smaller than 30, values between [code]8[/code] and " +"[code]12[/code] should be enough.\n" +"A corner detail of [code]1[/code] will result in chamfered corners instead " +"of rounded corners, which is useful for some artistic effects." +msgstr "" + +#: doc/classes/StyleBoxFlat.xml:186 +msgid "" +"The bottom-left corner's radius. If [code]0[/code], the corner is not " +"rounded." +msgstr "" + +#: doc/classes/StyleBoxFlat.xml:189 +msgid "" +"The bottom-right corner's radius. If [code]0[/code], the corner is not " +"rounded." +msgstr "" + +#: doc/classes/StyleBoxFlat.xml:192 +msgid "" +"The top-left corner's radius. If [code]0[/code], the corner is not rounded." +msgstr "" + +#: doc/classes/StyleBoxFlat.xml:195 +msgid "" +"The top-right corner's radius. If [code]0[/code], the corner is not rounded." +msgstr "" + +#: doc/classes/StyleBoxFlat.xml:198 +msgid "Toggles drawing of the inner part of the stylebox." +msgstr "" + +#: doc/classes/StyleBoxFlat.xml:201 +msgid "" +"Expands the stylebox outside of the control rect on the bottom edge. Useful " +"in combination with [member border_width_bottom] to draw a border outside " +"the control rect." +msgstr "" + +#: doc/classes/StyleBoxFlat.xml:204 +msgid "" +"Expands the stylebox outside of the control rect on the left edge. Useful in " +"combination with [member border_width_left] to draw a border outside the " +"control rect." +msgstr "" + +#: doc/classes/StyleBoxFlat.xml:207 +msgid "" +"Expands the stylebox outside of the control rect on the right edge. Useful " +"in combination with [member border_width_right] to draw a border outside the " +"control rect." +msgstr "" + +#: doc/classes/StyleBoxFlat.xml:210 +msgid "" +"Expands the stylebox outside of the control rect on the top edge. Useful in " +"combination with [member border_width_top] to draw a border outside the " +"control rect." +msgstr "" + +#: doc/classes/StyleBoxFlat.xml:213 +msgid "" +"The color of the shadow. This has no effect if [member shadow_size] is lower " +"than 1." +msgstr "" + +#: doc/classes/StyleBoxFlat.xml:216 +msgid "" +"The shadow offset in pixels. Adjusts the position of the shadow relatively " +"to the stylebox." +msgstr "" + +#: doc/classes/StyleBoxFlat.xml:219 +msgid "The shadow size in pixels." +msgstr "" + +#: doc/classes/StyleBoxLine.xml:4 +msgid "[StyleBox] that displays a single line." +msgstr "" + +#: doc/classes/StyleBoxLine.xml:7 +msgid "" +"[StyleBox] that displays a single line of a given color and thickness. It " +"can be used to draw things like separators." +msgstr "" + +#: doc/classes/StyleBoxLine.xml:15 +msgid "The line's color." +msgstr "" + +#: doc/classes/StyleBoxLine.xml:18 +msgid "" +"The number of pixels the line will extend before the [StyleBoxLine]'s " +"bounds. If set to a negative value, the line will begin inside the " +"[StyleBoxLine]'s bounds." +msgstr "" + +#: doc/classes/StyleBoxLine.xml:21 +msgid "" +"The number of pixels the line will extend past the [StyleBoxLine]'s bounds. " +"If set to a negative value, the line will end inside the [StyleBoxLine]'s " +"bounds." +msgstr "" + +#: doc/classes/StyleBoxLine.xml:24 +msgid "The line's thickness in pixels." +msgstr "" + +#: doc/classes/StyleBoxLine.xml:27 +msgid "" +"If [code]true[/code], the line will be vertical. If [code]false[/code], the " +"line will be horizontal." +msgstr "" + +#: doc/classes/StyleBoxTexture.xml:4 +msgid "Texture-based nine-patch [StyleBox]." +msgstr "" + +#: doc/classes/StyleBoxTexture.xml:7 +msgid "" +"Texture-based nine-patch [StyleBox], in a way similar to [NinePatchRect]. " +"This stylebox performs a 3×3 scaling of a texture, where only the center " +"cell is fully stretched. This makes it possible to design bordered styles " +"regardless of the stylebox's size." +msgstr "" + +#: doc/classes/StyleBoxTexture.xml:27 +msgid "" +"Returns the size of the given [code]margin[/code]. See [enum Margin] for " +"possible values." +msgstr "" + +#: doc/classes/StyleBoxTexture.xml:73 +msgid "" +"Sets the margin to [code]size[/code] pixels for the given [code]margin[/" +"code]. See [enum Margin] for possible values." +msgstr "" + +#: doc/classes/StyleBoxTexture.xml:79 +msgid "" +"Controls how the stylebox's texture will be stretched or tiled horizontally. " +"See [enum AxisStretchMode] for possible values." +msgstr "" + +#: doc/classes/StyleBoxTexture.xml:82 +msgid "" +"Controls how the stylebox's texture will be stretched or tiled vertically. " +"See [enum AxisStretchMode] for possible values." +msgstr "" + +#: doc/classes/StyleBoxTexture.xml:85 +msgid "" +"If [code]true[/code], the nine-patch texture's center tile will be drawn." +msgstr "" + +#: doc/classes/StyleBoxTexture.xml:88 +msgid "" +"Expands the bottom margin of this style box when drawing, causing it to be " +"drawn larger than requested." +msgstr "" + +#: doc/classes/StyleBoxTexture.xml:91 +msgid "" +"Expands the left margin of this style box when drawing, causing it to be " +"drawn larger than requested." +msgstr "" + +#: doc/classes/StyleBoxTexture.xml:94 +msgid "" +"Expands the right margin of this style box when drawing, causing it to be " +"drawn larger than requested." +msgstr "" + +#: doc/classes/StyleBoxTexture.xml:97 +msgid "" +"Expands the top margin of this style box when drawing, causing it to be " +"drawn larger than requested." +msgstr "" + +#: doc/classes/StyleBoxTexture.xml:100 +msgid "" +"Increases the bottom margin of the 3×3 texture box.\n" +"A higher value means more of the source texture is considered to be part of " +"the bottom border of the 3×3 box.\n" +"This is also the value used as fallback for [member StyleBox." +"content_margin_bottom] if it is negative." +msgstr "" + +#: doc/classes/StyleBoxTexture.xml:105 +msgid "" +"Increases the left margin of the 3×3 texture box.\n" +"A higher value means more of the source texture is considered to be part of " +"the left border of the 3×3 box.\n" +"This is also the value used as fallback for [member StyleBox." +"content_margin_left] if it is negative." +msgstr "" + +#: doc/classes/StyleBoxTexture.xml:110 +msgid "" +"Increases the right margin of the 3×3 texture box.\n" +"A higher value means more of the source texture is considered to be part of " +"the right border of the 3×3 box.\n" +"This is also the value used as fallback for [member StyleBox." +"content_margin_right] if it is negative." +msgstr "" + +#: doc/classes/StyleBoxTexture.xml:115 +msgid "" +"Increases the top margin of the 3×3 texture box.\n" +"A higher value means more of the source texture is considered to be part of " +"the top border of the 3×3 box.\n" +"This is also the value used as fallback for [member StyleBox." +"content_margin_top] if it is negative." +msgstr "" + +#: doc/classes/StyleBoxTexture.xml:120 +msgid "Modulates the color of the texture when this style box is drawn." +msgstr "" + +#: doc/classes/StyleBoxTexture.xml:123 +msgid "The normal map to use when drawing this style box." +msgstr "" + +#: doc/classes/StyleBoxTexture.xml:126 +msgid "" +"Species a sub-region of the texture to use.\n" +"This is equivalent to first wrapping the texture in an [AtlasTexture] with " +"the same region." +msgstr "" + +#: doc/classes/StyleBoxTexture.xml:130 +msgid "The texture to use when drawing this style box." +msgstr "" + +#: doc/classes/StyleBoxTexture.xml:136 +msgid "Emitted when the stylebox's texture is changed." +msgstr "" + +#: doc/classes/StyleBoxTexture.xml:142 +msgid "" +"Stretch the stylebox's texture. This results in visible distortion unless " +"the texture size matches the stylebox's size perfectly." +msgstr "" + +#: doc/classes/StyleBoxTexture.xml:145 +msgid "" +"Repeats the stylebox's texture to match the stylebox's size according to the " +"nine-patch system." +msgstr "" + +#: doc/classes/StyleBoxTexture.xml:148 +msgid "" +"Repeats the stylebox's texture to match the stylebox's size according to the " +"nine-patch system. Unlike [constant AXIS_STRETCH_MODE_TILE], the texture may " +"be slightly stretched to make the nine-patch texture tile seamlessly." +msgstr "" + +#: doc/classes/SubViewport.xml:13 +msgid "The clear mode when the sub-viewport is used as a render target." +msgstr "" + +#: doc/classes/SubViewport.xml:16 +msgid "The update mode when the sub-viewport is used as a render target." +msgstr "" + +#: doc/classes/SubViewport.xml:19 +msgid "The width and height of the sub-viewport." +msgstr "" + +#: 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: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 "Always clear the render target before drawing." +msgstr "" + +#: doc/classes/SubViewport.xml:36 +msgid "Never clear the render target." +msgstr "" + +#: doc/classes/SubViewport.xml:39 +msgid "" +"Clear the render target next frame, then switch to [constant " +"CLEAR_MODE_NEVER]." +msgstr "" + +#: doc/classes/SubViewport.xml:42 +msgid "Do not update the render target." +msgstr "" + +#: doc/classes/SubViewport.xml:45 +msgid "" +"Update the render target once, then switch to [constant UPDATE_DISABLED]." +msgstr "" + +#: doc/classes/SubViewport.xml:48 +msgid "" +"Update the render target only when it is visible. This is the default value." +msgstr "" + +#: doc/classes/SubViewport.xml:51 +msgid "Update the render target only when the its parent is visible." +msgstr "" + +#: doc/classes/SubViewport.xml:54 +msgid "Always update the render target." +msgstr "" + +#: doc/classes/SubViewportContainer.xml:4 +msgid "Control for holding [SubViewport]s." +msgstr "" + +#: doc/classes/SubViewportContainer.xml:7 +msgid "" +"A [Container] node that holds a [SubViewport], automatically setting its " +"size." +msgstr "" + +#: doc/classes/SubViewportContainer.xml:15 +msgid "" +"If [code]true[/code], the sub-viewport will be scaled to the control's size." +msgstr "" + +#: doc/classes/SubViewportContainer.xml:18 +msgid "" +"Divides the sub-viewport's effective resolution by this value while " +"preserving its scale. This can be used to speed up rendering.\n" +"For example, a 1280×720 sub-viewport with [member stretch_shrink] set to " +"[code]2[/code] will be rendered at 640×360 while occupying the same size in " +"the container.\n" +"[b]Note:[/b] [member stretch] must be [code]true[/code] for this property to " +"work." +msgstr "" + +#: doc/classes/SurfaceTool.xml:4 +msgid "Helper tool to create geometry." +msgstr "" + +#: doc/classes/SurfaceTool.xml:7 +msgid "" +"The [SurfaceTool] is used to construct a [Mesh] by specifying vertex " +"attributes individually. It can be used to construct a [Mesh] from a script. " +"All properties except indices need to be added before calling [method " +"add_vertex]. For example, to add vertex colors and UVs:\n" +"[codeblock]\n" +"var st = SurfaceTool.new()\n" +"st.begin(Mesh.PRIMITIVE_TRIANGLES)\n" +"st.add_color(Color(1, 0, 0))\n" +"st.add_uv(Vector2(0, 0))\n" +"st.add_vertex(Vector3(0, 0, 0))\n" +"[/codeblock]\n" +"The above [SurfaceTool] now contains one vertex of a triangle which has a UV " +"coordinate and a specified [Color]. If another vertex were added without " +"calling [method add_uv] or [method add_color], then the last values would be " +"used.\n" +"Vertex attributes must be passed [b]before[/b] calling [method add_vertex]. " +"Failure to do so will result in an error when committing the vertex " +"information to a mesh.\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.\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: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:39 +msgid "Specifies a [Color] for the next vertex to use." +msgstr "" + +#: 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:57 +msgid "Specifies a normal for the next vertex to use." +msgstr "" + +#: 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:75 +msgid "Specifies a tangent for the next vertex to use." +msgstr "" + +#: 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:104 +msgid "Specifies a set of UV coordinates to use for the next vertex." +msgstr "" + +#: 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: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:131 +msgid "" +"Specifies weight values for next vertex to use. [code]weights[/code] must " +"contain 4 values." +msgstr "" + +#: 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: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:160 +msgid "Clear all information passed into the surface tool so far." +msgstr "" + +#: 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 " +"to the existing [ArrayMesh].\n" +"Default flag is [constant Mesh.ARRAY_COMPRESS_DEFAULT]. See " +"[code]ARRAY_COMPRESS_*[/code] constants in [enum Mesh.ArrayFormat] for other " +"flags." +msgstr "" + +#: 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:190 +msgid "Creates a vertex array from an existing [Mesh]." +msgstr "" + +#: 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:210 +msgid "Removes the index array by expanding the vertex array." +msgstr "" + +#: 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 " +"inverted.\n" +"Requires the primitive type to be set to [constant Mesh.PRIMITIVE_TRIANGLES]." +msgstr "" + +#: 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:234 +msgid "" +"Shrinks the vertex array by creating an index array (avoids reusing " +"vertices)." +msgstr "" + +#: doc/classes/SurfaceTool.xml:243 +msgid "Sets [Material] to be used by the [Mesh] you are constructing." +msgstr "" + +#: doc/classes/TabContainer.xml:4 +msgid "Tabbed container." +msgstr "" + +#: doc/classes/TabContainer.xml:7 +msgid "" +"Sets the active tab's [code]visible[/code] property to the value [code]true[/" +"code]. Sets all other children's to [code]false[/code].\n" +"Ignores non-[Control] children.\n" +"Individual tabs are always visible unless you use [method set_tab_disabled] " +"and [method set_tab_title] to hide it.\n" +"To hide only a tab's content, nest the content inside a child [Control], so " +"it receives the [TabContainer]'s visibility setting instead." +msgstr "" + +#: doc/classes/TabContainer.xml:19 +msgid "Returns the child [Control] node located at the active tab index." +msgstr "" + +#: doc/classes/TabContainer.xml:26 +msgid "" +"Returns the [Popup] node instance if one has been set already with [method " +"set_popup]." +msgstr "" + +#: doc/classes/TabContainer.xml:33 +msgid "Returns the previously active tab index." +msgstr "" + +#: doc/classes/TabContainer.xml:42 +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 +msgid "Returns the number of tabs." +msgstr "" + +#: doc/classes/TabContainer.xml:58 doc/classes/Tabs.xml:59 +msgid "" +"Returns [code]true[/code] if the tab at index [code]tab_idx[/code] is " +"disabled." +msgstr "" + +#: doc/classes/TabContainer.xml:67 doc/classes/Tabs.xml:68 +msgid "" +"Returns the [Texture2D] for the tab at index [code]tab_idx[/code] or " +"[code]null[/code] if the tab has no [Texture2D]." +msgstr "" + +#: doc/classes/TabContainer.xml:76 doc/classes/Tabs.xml:93 +msgid "" +"Returns the title of the tab at index [code]tab_idx[/code]. Tab titles " +"default to the name of the indexed child node, but this can be overridden " +"with [method set_tab_title]." +msgstr "" + +#: doc/classes/TabContainer.xml:83 +msgid "Returns the [TabContainer] rearrange group id." +msgstr "" + +#: doc/classes/TabContainer.xml:92 +msgid "" +"If set on a [Popup] node instance, a popup menu icon appears in the top-" +"right corner of the [TabContainer]. Clicking it will expand the [Popup] node." +msgstr "" + +#: doc/classes/TabContainer.xml:103 +msgid "" +"If [code]disabled[/code] is [code]false[/code], hides the tab at index " +"[code]tab_idx[/code].\n" +"[b]Note:[/b] Its title text will remain, unless also removed with [method " +"set_tab_title]." +msgstr "" + +#: doc/classes/TabContainer.xml:115 +msgid "Sets an icon for the tab at index [code]tab_idx[/code]." +msgstr "" + +#: doc/classes/TabContainer.xml:126 +msgid "" +"Sets a title for the tab at index [code]tab_idx[/code]. Tab titles default " +"to the name of the indexed child node, but this can be overridden with " +"[method set_tab_title]." +msgstr "" + +#: doc/classes/TabContainer.xml:135 +msgid "" +"Defines rearrange group id, choose for each [TabContainer] the same value to " +"enable tab drag between [TabContainer]. Enable drag with " +"[code]set_drag_to_rearrange_enabled(true)[/code]." +msgstr "" + +#: doc/classes/TabContainer.xml:141 +msgid "" +"The current tab index. When set, this index's [Control] node's " +"[code]visible[/code] property is set to [code]true[/code] and all others are " +"set to [code]false[/code]." +msgstr "" + +#: doc/classes/TabContainer.xml:144 doc/classes/Tabs.xml:181 +msgid "If [code]true[/code], tabs can be rearranged with mouse drag." +msgstr "" + +#: doc/classes/TabContainer.xml:147 +msgid "" +"The alignment of all tabs in the tab container. See the [enum TabAlign] " +"constants for details." +msgstr "" + +#: doc/classes/TabContainer.xml:150 +msgid "" +"If [code]true[/code], tabs are visible. If [code]false[/code], tabs' content " +"and titles are hidden." +msgstr "" + +#: doc/classes/TabContainer.xml:153 +msgid "" +"If [code]true[/code], children [Control] nodes that are hidden have their " +"minimum size take into account in the total, instead of only the currently " +"visible one." +msgstr "" + +#: doc/classes/TabContainer.xml:159 +msgid "" +"Emitted when the [TabContainer]'s [Popup] button is clicked. See [method " +"set_popup] for details." +msgstr "" + +#: doc/classes/TabContainer.xml:166 doc/classes/Tabs.xml:212 +msgid "Emitted when switching to another tab." +msgstr "" + +#: doc/classes/TabContainer.xml:173 +msgid "Emitted when a tab is selected, even if it is the current tab." +msgstr "" + +#: doc/classes/TabContainer.xml:179 doc/classes/Tabs.xml:239 +msgid "Align the tabs to the left." +msgstr "" + +#: doc/classes/TabContainer.xml:182 doc/classes/Tabs.xml:242 +msgid "Align the tabs to the center." +msgstr "" + +#: doc/classes/TabContainer.xml:185 doc/classes/Tabs.xml:245 +msgid "Align the tabs to the right." +msgstr "" + +#: doc/classes/TabContainer.xml:190 doc/classes/Tabs.xml:274 +msgid "" +"Icon for the left arrow button that appears when there are too many tabs to " +"fit in the container width. When the button is disabled (i.e. the first tab " +"is visible), it appears semi-transparent." +msgstr "" + +#: doc/classes/TabContainer.xml:193 doc/classes/Tabs.xml:277 +msgid "" +"Icon for the left arrow button that appears when there are too many tabs to " +"fit in the container width. Used when the button is being hovered with the " +"cursor." +msgstr "" + +#: doc/classes/TabContainer.xml:196 doc/classes/Tabs.xml:280 +msgid "The font used to draw tab names." +msgstr "" + +#: doc/classes/TabContainer.xml:199 doc/classes/Tabs.xml:283 +msgid "Font color of inactive tabs." +msgstr "" + +#: doc/classes/TabContainer.xml:202 doc/classes/Tabs.xml:286 +msgid "Font color of disabled tabs." +msgstr "" + +#: doc/classes/TabContainer.xml:205 doc/classes/Tabs.xml:289 +msgid "Font color of the currently selected tab." +msgstr "" + +#: doc/classes/TabContainer.xml:208 +msgid "Horizontal separation between tabs." +msgstr "" + +#: doc/classes/TabContainer.xml:211 doc/classes/Tabs.xml:295 +msgid "" +"Icon for the right arrow button that appears when there are too many tabs to " +"fit in the container width. When the button is disabled (i.e. the last tab " +"is visible) it appears semi-transparent." +msgstr "" + +#: doc/classes/TabContainer.xml:214 doc/classes/Tabs.xml:298 +msgid "" +"Icon for the right arrow button that appears when there are too many tabs to " +"fit in the container width. Used when the button is being hovered with the " +"cursor." +msgstr "" + +#: doc/classes/TabContainer.xml:217 +msgid "The icon for the menu button (see [method set_popup])." +msgstr "" + +#: doc/classes/TabContainer.xml:220 +msgid "" +"The icon for the menu button (see [method set_popup]) when it's being " +"hovered with the cursor." +msgstr "" + +#: doc/classes/TabContainer.xml:223 +msgid "The style for the background fill." +msgstr "" + +#: doc/classes/TabContainer.xml:226 +msgid "The space at the left and right edges of the tab bar." +msgstr "" + +#: doc/classes/TabContainer.xml:229 +msgid "The style of inactive tabs." +msgstr "" + +#: doc/classes/TabContainer.xml:232 +msgid "The style of disabled tabs." +msgstr "" + +#: doc/classes/TabContainer.xml:235 doc/classes/Tabs.xml:309 +msgid "The style of the currently selected tab." +msgstr "" + +#: doc/classes/Tabs.xml:4 +msgid "Tabs control." +msgstr "" + +#: doc/classes/Tabs.xml:7 +msgid "" +"Simple tabs control, similar to [TabContainer] but is only in charge of " +"drawing tabs, not interact with children." +msgstr "" + +#: doc/classes/Tabs.xml:20 +msgid "Adds a new tab." +msgstr "" + +#: doc/classes/Tabs.xml:29 +msgid "Moves the scroll view to make the tab visible." +msgstr "" + +#: doc/classes/Tabs.xml:36 +msgid "" +"Returns [code]true[/code] if the offset buttons (the ones that appear when " +"there's not enough space for all tabs) are visible." +msgstr "" + +#: doc/classes/Tabs.xml:43 +msgid "Returns [code]true[/code] if select with right mouse button is enabled." +msgstr "" + +#: doc/classes/Tabs.xml:75 +msgid "Returns the number of hidden tabs offsetted to the left." +msgstr "" + +#: doc/classes/Tabs.xml:84 +msgid "Returns tab [Rect2] with local position and size." +msgstr "" + +#: doc/classes/Tabs.xml:100 +msgid "Returns the [Tabs]' rearrange group ID." +msgstr "" + +#: doc/classes/Tabs.xml:111 +msgid "Moves a tab from [code]from[/code] to [code]to[/code]." +msgstr "" + +#: doc/classes/Tabs.xml:120 +msgid "Removes the tab at index [code]tab_idx[/code]." +msgstr "" + +#: doc/classes/Tabs.xml:129 +msgid "" +"If [code]true[/code], enables selecting a tab with the right mouse button." +msgstr "" + +#: doc/classes/Tabs.xml:140 +msgid "" +"If [code]disabled[/code] is [code]false[/code], hides the tab at index " +"[code]tab_idx[/code].\n" +"[b]Note:[/b] Its title text will remain unless it is also removed with " +"[method set_tab_title]." +msgstr "" + +#: doc/classes/Tabs.xml:152 +msgid "Sets an [code]icon[/code] for the tab at index [code]tab_idx[/code]." +msgstr "" + +#: doc/classes/Tabs.xml:163 +msgid "Sets a [code]title[/code] for the tab at index [code]tab_idx[/code]." +msgstr "" + +#: doc/classes/Tabs.xml:172 +msgid "" +"Defines the rearrange group ID. Choose for each [Tabs] the same value to " +"dragging tabs between [Tabs]. Enable drag with " +"[code]set_drag_to_rearrange_enabled(true)[/code]." +msgstr "" + +#: doc/classes/Tabs.xml:178 +msgid "Select tab at index [code]tab_idx[/code]." +msgstr "" + +#: doc/classes/Tabs.xml:184 +msgid "" +"if [code]true[/code], the mouse's scroll wheel cab be used to navigate the " +"scroll view." +msgstr "" + +#: doc/classes/Tabs.xml:187 +msgid "The alignment of all tabs. See [enum TabAlign] for details." +msgstr "" + +#: doc/classes/Tabs.xml:190 +msgid "" +"Sets when the close button will appear on the tabs. See [enum " +"CloseButtonDisplayPolicy] for details." +msgstr "" + +#: doc/classes/Tabs.xml:198 +msgid "" +"Emitted when the active tab is rearranged via mouse drag. See [member " +"drag_to_rearrange_enabled]." +msgstr "" + +#: doc/classes/Tabs.xml:205 +msgid "Emitted when a tab is right-clicked." +msgstr "" + +#: doc/classes/Tabs.xml:219 +msgid "Emitted when a tab is clicked, even if it is the current tab." +msgstr "" + +#: doc/classes/Tabs.xml:226 +msgid "Emitted when a tab is closed." +msgstr "" + +#: doc/classes/Tabs.xml:233 +msgid "Emitted when a tab is hovered by the mouse." +msgstr "" + +#: doc/classes/Tabs.xml:248 +msgid "Represents the size of the [enum TabAlign] enum." +msgstr "" + +#: doc/classes/Tabs.xml:251 +msgid "Never show the close buttons." +msgstr "" + +#: doc/classes/Tabs.xml:254 +msgid "Only show the close button on the currently active tab." +msgstr "" + +#: doc/classes/Tabs.xml:257 +msgid "Show the close button on all tabs." +msgstr "" + +#: doc/classes/Tabs.xml:260 +msgid "Represents the size of the [enum CloseButtonDisplayPolicy] enum." +msgstr "" + +#: doc/classes/Tabs.xml:265 +msgid "Background of the close button when it's being hovered with the cursor." +msgstr "" + +#: doc/classes/Tabs.xml:268 +msgid "Background of the close button when it's being pressed." +msgstr "" + +#: doc/classes/Tabs.xml:271 +msgid "The icon for the close button (see [member tab_close_display_policy])." +msgstr "" + +#: doc/classes/Tabs.xml:292 +msgid "The horizontal separation between the tabs." +msgstr "" + +#: doc/classes/Tabs.xml:303 +msgid "The style of an inactive tab." +msgstr "" + +#: doc/classes/Tabs.xml:306 +msgid "The style of a disabled tab" +msgstr "" + +#: doc/classes/TCP_Server.xml:4 +msgid "A TCP server." +msgstr "" + +#: doc/classes/TCP_Server.xml:7 +msgid "" +"A TCP server. Listens to connections on a port and returns a [StreamPeerTCP] " +"when it gets an incoming connection." +msgstr "" + +#: doc/classes/TCP_Server.xml:16 +msgid "Returns [code]true[/code] if a connection is available for taking." +msgstr "" + +#: doc/classes/TCP_Server.xml:23 +msgid "" +"Returns [code]true[/code] if the server is currently listening for " +"connections." +msgstr "" + +#: doc/classes/TCP_Server.xml:34 +msgid "" +"Listen on the [code]port[/code] binding to [code]bind_address[/code].\n" +"If [code]bind_address[/code] is set as [code]\"*\"[/code] (default), the " +"server will listen on all available addresses (both IPv4 and IPv6).\n" +"If [code]bind_address[/code] is set as [code]\"0.0.0.0\"[/code] (for IPv4) " +"or [code]\"::\"[/code] (for IPv6), the server will listen on all available " +"addresses matching that IP type.\n" +"If [code]bind_address[/code] is set to any valid address (e.g. " +"[code]\"192.168.1.101\"[/code], [code]\"::1\"[/code], etc), the server will " +"only listen on the interface with that addresses (or fail if no interface " +"with the given address exists)." +msgstr "" + +#: doc/classes/TCP_Server.xml:44 +msgid "Stops listening." +msgstr "" + +#: doc/classes/TCP_Server.xml:51 +msgid "" +"If a connection is available, returns a StreamPeerTCP with the connection." +msgstr "" + +#: doc/classes/TextEdit.xml:4 +msgid "Multiline text editing control." +msgstr "" + +#: doc/classes/TextEdit.xml:7 +msgid "" +"TextEdit is meant for editing large, multiline text. It also has facilities " +"for editing code, such as syntax highlighting support and multiple levels of " +"undo/redo." +msgstr "" + +#: doc/classes/TextEdit.xml:24 +msgid "Adds color region (given the delimiters) and its colors." +msgstr "" + +#: doc/classes/TextEdit.xml:35 +msgid "Adds a [code]keyword[/code] and its [Color]." +msgstr "" + +#: doc/classes/TextEdit.xml:44 +msgid "" +"Returns if the given line is foldable, that is, it has indented lines right " +"below it." +msgstr "" + +#: doc/classes/TextEdit.xml:57 +msgid "" +"Clears all custom syntax coloring information previously added with [method " +"add_color_region] or [method add_keyword_color]." +msgstr "" + +#: doc/classes/TextEdit.xml:64 +msgid "Clears the undo history." +msgstr "" + +#: doc/classes/TextEdit.xml:71 +msgid "Copy's the current text selection." +msgstr "" + +#: doc/classes/TextEdit.xml:78 +msgid "Returns the column the editing cursor is at." +msgstr "" + +#: doc/classes/TextEdit.xml:85 +msgid "Returns the line the editing cursor is at." +msgstr "" + +#: doc/classes/TextEdit.xml:96 +msgid "" +"Moves the cursor at the specified [code]column[/code] index.\n" +"If [code]adjust_viewport[/code] is set to [code]true[/code], the viewport " +"will center at the cursor position after the move occurs." +msgstr "" + +#: doc/classes/TextEdit.xml:112 +msgid "" +"Moves the cursor at the specified [code]line[/code] index.\n" +"If [code]adjust_viewport[/code] is set to [code]true[/code], the viewport " +"will center at the cursor position after the move occurs.\n" +"If [code]can_be_hidden[/code] is set to [code]true[/code], the specified " +"[code]line[/code] can be hidden using [method set_line_as_hidden]." +msgstr "" + +#: doc/classes/TextEdit.xml:121 +msgid "Cut's the current selection." +msgstr "" + +#: doc/classes/TextEdit.xml:128 +msgid "Deselects the current selection." +msgstr "" + +#: doc/classes/TextEdit.xml:135 +msgid "Folds all lines that are possible to be folded (see [method can_fold])." +msgstr "" + +#: doc/classes/TextEdit.xml:144 +msgid "Folds the given line, if possible (see [method can_fold])." +msgstr "" + +#: doc/classes/TextEdit.xml:151 +msgid "Returns an array containing the line number of each breakpoint." +msgstr "" + +#: doc/classes/TextEdit.xml:160 +msgid "Returns the [Color] of the specified [code]keyword[/code]." +msgstr "" + +#: doc/classes/TextEdit.xml:169 +msgid "Returns the text of a specific line." +msgstr "" + +#: doc/classes/TextEdit.xml:176 +msgid "Returns the amount of total lines in the text." +msgstr "" + +#: doc/classes/TextEdit.xml:183 +msgid "" +"Returns the [PopupMenu] of this [TextEdit]. By default, this menu is " +"displayed when right-clicking on the [TextEdit]." +msgstr "" + +#: doc/classes/TextEdit.xml:190 +msgid "Returns the selection begin column." +msgstr "" + +#: doc/classes/TextEdit.xml:197 +msgid "Returns the selection begin line." +msgstr "" + +#: doc/classes/TextEdit.xml:204 +msgid "Returns the text inside the selection." +msgstr "" + +#: doc/classes/TextEdit.xml:211 +msgid "Returns the selection end column." +msgstr "" + +#: doc/classes/TextEdit.xml:218 +msgid "Returns the selection end line." +msgstr "" + +#: doc/classes/TextEdit.xml:225 +msgid "Returns a [String] text with the word under the mouse cursor location." +msgstr "" + +#: doc/classes/TextEdit.xml:234 +msgid "" +"Returns whether the specified [code]keyword[/code] has a color set to it or " +"not." +msgstr "" + +#: doc/classes/TextEdit.xml:243 +msgid "Insert the specified text at the cursor position." +msgstr "" + +#: doc/classes/TextEdit.xml:252 +msgid "Returns whether the line at the specified index is folded or not." +msgstr "" + +#: doc/classes/TextEdit.xml:261 +msgid "Returns whether the line at the specified index is hidden or not." +msgstr "" + +#: doc/classes/TextEdit.xml:268 +msgid "Returns [code]true[/code] if the selection is active." +msgstr "" + +#: doc/classes/TextEdit.xml:277 +msgid "" +"Triggers a right-click menu action by the specified index. See [enum " +"MenuItems] for a list of available indexes." +msgstr "" + +#: doc/classes/TextEdit.xml:284 +msgid "Paste the current selection." +msgstr "" + +#: doc/classes/TextEdit.xml:291 +msgid "Perform redo operation." +msgstr "" + +#: doc/classes/TextEdit.xml:298 +msgid "" +"Removes all the breakpoints. This will not fire the [signal " +"breakpoint_toggled] signal." +msgstr "" + +#: doc/classes/TextEdit.xml:313 +msgid "" +"Perform a search inside the text. Search flags can be specified in the [enum " +"SearchFlags] enum.\n" +"Returns an empty [code]PackedInt32Array[/code] if no result was found. " +"Otherwise, the result line and column can be accessed at indices specified " +"in the [enum SearchResult] enum, e.g:\n" +"[codeblock]\n" +"var result = search(key, flags, line, column)\n" +"if result.size() > 0:\n" +" # Result found.\n" +" var res_line = result[TextEdit.SEARCH_RESULT_LINE]\n" +" var res_column = result[TextEdit.SEARCH_RESULT_COLUMN]\n" +"[/codeblock]" +msgstr "" + +#: doc/classes/TextEdit.xml:336 +msgid "Perform selection, from line/column to line/column." +msgstr "" + +#: doc/classes/TextEdit.xml:343 +msgid "Select all the text." +msgstr "" + +#: doc/classes/TextEdit.xml:354 +msgid "If [code]true[/code], hides the line of the specified index." +msgstr "" + +#: doc/classes/TextEdit.xml:363 +msgid "Toggle the folding of the code block at the given line." +msgstr "" + +#: doc/classes/TextEdit.xml:370 +msgid "Perform undo operation." +msgstr "" + +#: doc/classes/TextEdit.xml:379 +msgid "Unfolds the given line, if folded." +msgstr "" + +#: doc/classes/TextEdit.xml:386 +msgid "" +"Unhide all lines that were previously set to hidden by [method " +"set_line_as_hidden]." +msgstr "" + +#: doc/classes/TextEdit.xml:392 +msgid "If [code]true[/code], the breakpoint gutter is visible." +msgstr "" + +#: doc/classes/TextEdit.xml:401 +msgid "" +"If [code]true[/code], the caret displays as a rectangle.\n" +"If [code]false[/code], the caret displays as a bar." +msgstr "" + +#: doc/classes/TextEdit.xml:405 +msgid "" +"If [code]true[/code], a right-click moves the cursor at the mouse position " +"before displaying the context menu.\n" +"If [code]false[/code], the context menu disregards mouse location." +msgstr "" + +#: doc/classes/TextEdit.xml:409 +msgid "If [code]true[/code], a right-click displays the context menu." +msgstr "" + +#: doc/classes/TextEdit.xml:412 +msgid "" +"If [code]true[/code], the \"space\" character will have a visible " +"representation." +msgstr "" + +#: doc/classes/TextEdit.xml:415 +msgid "" +"If [code]true[/code], the \"tab\" character will have a visible " +"representation." +msgstr "" + +#: doc/classes/TextEdit.xml:419 +msgid "" +"If [code]true[/code], the fold gutter is visible. This enables folding " +"groups of indented lines." +msgstr "" + +#: doc/classes/TextEdit.xml:422 +msgid "" +"If [code]true[/code], all lines that have been set to hidden by [method " +"set_line_as_hidden], will not be visible." +msgstr "" + +#: doc/classes/TextEdit.xml:425 +msgid "" +"If [code]true[/code], all occurrences of the selected text will be " +"highlighted." +msgstr "" + +#: doc/classes/TextEdit.xml:428 +msgid "If [code]true[/code], the line containing the cursor is highlighted." +msgstr "" + +#: 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:452 +msgid "" +"If [code]true[/code], line numbers are displayed to the left of the text." +msgstr "" + +#: 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: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:461 +msgid "String value of the [TextEdit]." +msgstr "" + +#: doc/classes/TextEdit.xml:464 +msgid "Vertical scroll sensitivity." +msgstr "" + +#: 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:475 +msgid "Emitted when a breakpoint is placed via the breakpoint gutter." +msgstr "" + +#: doc/classes/TextEdit.xml:480 +msgid "Emitted when the cursor changes." +msgstr "" + +#: doc/classes/TextEdit.xml:489 +msgid "Emitted when the info icon is clicked." +msgstr "" + +#: doc/classes/TextEdit.xml:520 +msgid "Match case when searching." +msgstr "" + +#: doc/classes/TextEdit.xml:523 +msgid "Match whole words when searching." +msgstr "" + +#: doc/classes/TextEdit.xml:526 +msgid "Search from end to beginning." +msgstr "" + +#: doc/classes/TextEdit.xml:529 +msgid "Used to access the result column from [method search]." +msgstr "" + +#: doc/classes/TextEdit.xml:532 +msgid "Used to access the result line from [method search]." +msgstr "" + +#: 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:544 +msgid "Erases the whole [TextEdit] text." +msgstr "" + +#: doc/classes/TextEdit.xml:547 +msgid "Selects the whole [TextEdit] text." +msgstr "" + +#: doc/classes/TextEdit.xml:553 +msgid "Redoes the previous action." +msgstr "" + +#: 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:564 +msgid "" +"Sets the [Color] of the bookmark marker. [member syntax_highlighting] has to " +"be enabled." +msgstr "" + +#: 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:607 +msgid "Sets the default [Font]." +msgstr "" + +#: doc/classes/TextEdit.xml:610 +msgid "Sets the font [Color]." +msgstr "" + +#: 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:623 +msgid "Sets the spacing between the lines." +msgstr "" + +#: doc/classes/TextEdit.xml:626 +msgid "Sets the [Color] of marked text." +msgstr "" + +#: doc/classes/TextEdit.xml:631 +msgid "Sets the [StyleBox] of this [TextEdit]." +msgstr "" + +#: doc/classes/TextEdit.xml:636 +msgid "" +"Sets the [StyleBox] of this [TextEdit] when [member readonly] is enabled." +msgstr "" + +#: doc/classes/TextEdit.xml:641 +msgid "Sets the highlight [Color] of text selections." +msgstr "" + +#: doc/classes/TextEdit.xml:648 +msgid "Sets a custom [Texture2D] for tab text characters." +msgstr "" + +#: doc/classes/TextEdit.xml:651 +msgid "" +"Sets the highlight [Color] of multiple occurrences. [member " +"highlight_all_occurrences] has to be enabled." +msgstr "" + +#: doc/classes/Texture2D.xml:4 +msgid "Texture for 2D and 3D." +msgstr "" + +#: doc/classes/Texture2D.xml:7 +msgid "" +"A texture works by registering an image in the video hardware, which then " +"can be used in 3D models or 2D [Sprite2D] or GUI [Control].\n" +"Textures are often created by loading them from a file. See [method " +"@GDScript.load].\n" +"[Texture2D] is a base for other resources. It cannot be used directly." +msgstr "" + +#: doc/classes/Texture2D.xml:36 +msgid "" +"Draws the texture using a [CanvasItem] with the [RenderingServer] API at the " +"specified [code]position[/code]." +msgstr "" + +#: doc/classes/Texture2D.xml:63 +msgid "Draws the texture using a [CanvasItem] with the [RenderingServer] API." +msgstr "" + +#: doc/classes/Texture2D.xml:92 +msgid "" +"Draws a part of the texture using a [CanvasItem] with the [RenderingServer] " +"API." +msgstr "" + +#: doc/classes/Texture2D.xml:99 +msgid "" +"Returns an [Image] with the data from this [Texture2D]. [Image]s can be " +"accessed and manipulated directly." +msgstr "" + +#: doc/classes/Texture2D.xml:106 +msgid "Returns the texture height." +msgstr "" + +#: doc/classes/Texture2D.xml:113 +msgid "Returns the texture size." +msgstr "" + +#: doc/classes/Texture2D.xml:120 +msgid "Returns the texture width." +msgstr "" + +#: doc/classes/Texture2D.xml:127 +msgid "Returns [code]true[/code] if this [Texture2D] has an alpha channel." +msgstr "" + +#: doc/classes/TextureButton.xml:4 +msgid "" +"Texture-based button. Supports Pressed, Hover, Disabled and Focused states." +msgstr "" + +#: doc/classes/TextureButton.xml:7 +msgid "" +"[TextureButton] has the same functionality as [Button], except it uses " +"sprites instead of Godot's [Theme] resource. It is faster to create, but it " +"doesn't support localization like more complex [Control]s.\n" +"The \"normal\" state must contain a texture ([member texture_normal]); other " +"textures are optional." +msgstr "" + +#: doc/classes/TextureButton.xml:16 +msgid "" +"If [code]true[/code], the texture stretches to the edges of the node's " +"bounding rectangle using the [member stretch_mode]. If [code]false[/code], " +"the texture will not scale with the node." +msgstr "" + +#: doc/classes/TextureButton.xml:19 +msgid "" +"Controls the texture's behavior when you resize the node's bounding " +"rectangle, [b]only if[/b] [member expand] is [code]true[/code]. Set it to " +"one of the [enum StretchMode] constants. See the constants to learn more." +msgstr "" + +#: doc/classes/TextureButton.xml:22 +msgid "" +"Pure black and white [BitMap] image to use for click detection. On the mask, " +"white pixels represent the button's clickable area. Use it to create buttons " +"with curved shapes." +msgstr "" + +#: doc/classes/TextureButton.xml:25 +msgid "" +"Texture to display when the node is disabled. See [member BaseButton." +"disabled]." +msgstr "" + +#: doc/classes/TextureButton.xml:28 +msgid "Texture to display when the node has mouse or keyboard focus." +msgstr "" + +#: doc/classes/TextureButton.xml:31 +msgid "Texture to display when the mouse hovers the node." +msgstr "" + +#: doc/classes/TextureButton.xml:34 +msgid "" +"Texture to display by default, when the node is [b]not[/b] in the disabled, " +"focused, hover or pressed state." +msgstr "" + +#: doc/classes/TextureButton.xml:37 +msgid "" +"Texture to display on mouse down over the node, if the node has keyboard " +"focus and the player presses the Enter key or if the player presses the " +"[member BaseButton.shortcut] key." +msgstr "" + +#: doc/classes/TextureButton.xml:42 doc/classes/TextureRect.xml:36 +msgid "Scale to fit the node's bounding rectangle." +msgstr "" + +#: doc/classes/TextureButton.xml:45 doc/classes/TextureRect.xml:39 +msgid "Tile inside the node's bounding rectangle." +msgstr "" + +#: doc/classes/TextureButton.xml:48 doc/classes/TextureRect.xml:42 +msgid "" +"The texture keeps its original size and stays in the bounding rectangle's " +"top-left corner." +msgstr "" + +#: doc/classes/TextureButton.xml:51 doc/classes/TextureRect.xml:45 +msgid "" +"The texture keeps its original size and stays centered in the node's " +"bounding rectangle." +msgstr "" + +#: doc/classes/TextureButton.xml:54 doc/classes/TextureRect.xml:48 +msgid "" +"Scale the texture to fit the node's bounding rectangle, but maintain the " +"texture's aspect ratio." +msgstr "" + +#: doc/classes/TextureButton.xml:57 +msgid "" +"Scale the texture to fit the node's bounding rectangle, center it, and " +"maintain its aspect ratio." +msgstr "" + +#: doc/classes/TextureButton.xml:60 doc/classes/TextureRect.xml:54 +msgid "" +"Scale the texture so that the shorter side fits the bounding rectangle. The " +"other side clips to the node's limits." +msgstr "" + +#: doc/classes/TextureLayered.xml:4 +msgid "Base class for 3D texture types." +msgstr "" + +#: doc/classes/TextureLayered.xml:7 +msgid "" +"Base class for [Texture2DArray], [Cubemap] and [CubemapArray]. Cannot be " +"used directly, but contains all the functions necessary for accessing the " +"derived resource types. Data is set on a per-layer basis. For " +"[Texture2DArray]s, the layer specifies the array layer." +msgstr "" + +#: doc/classes/TextureLayered.xml:24 +msgid "" +"Returns the current format being used by this texture. See [enum Image." +"Format] for details." +msgstr "" + +#: doc/classes/TextureLayered.xml:31 +msgid "" +"Returns the height of the texture. Height is typically represented by the Y-" +"axis." +msgstr "" + +#: doc/classes/TextureLayered.xml:40 +msgid "" +"Returns an [Image] resource with the data from specified [code]layer[/code]." +msgstr "" + +#: doc/classes/TextureLayered.xml:53 +msgid "" +"Returns the width of the texture. Width is typically represented by the X-" +"axis." +msgstr "" + +#: doc/classes/TextureProgress.xml:4 +msgid "" +"Texture-based progress bar. Useful for loading screens and life or stamina " +"bars." +msgstr "" + +#: doc/classes/TextureProgress.xml:7 +msgid "" +"TextureProgress works like [ProgressBar], but uses up to 3 textures instead " +"of Godot's [Theme] resource. It can be used to create horizontal, vertical " +"and radial progress bars." +msgstr "" + +#: doc/classes/TextureProgress.xml:33 +msgid "The fill direction. See [enum FillMode] for possible values." +msgstr "" + +#: doc/classes/TextureProgress.xml:37 +msgid "" +"If [code]true[/code], Godot treats the bar's textures like in " +"[NinePatchRect]. Use the [code]stretch_margin_*[/code] properties like " +"[member stretch_margin_bottom] to set up the nine patch's 3×3 grid. When " +"using a radial [member fill_mode], this setting will enable stretching." +msgstr "" + +#: doc/classes/TextureProgress.xml:40 +msgid "" +"Offsets [member texture_progress] if [member fill_mode] is [constant " +"FILL_CLOCKWISE] or [constant FILL_COUNTER_CLOCKWISE]." +msgstr "" + +#: doc/classes/TextureProgress.xml:43 +msgid "" +"Upper limit for the fill of [member texture_progress] if [member fill_mode] " +"is [constant FILL_CLOCKWISE] or [constant FILL_COUNTER_CLOCKWISE]. When the " +"node's [code]value[/code] is equal to its [code]max_value[/code], the " +"texture fills up to this angle.\n" +"See [member Range.value], [member Range.max_value]." +msgstr "" + +#: doc/classes/TextureProgress.xml:47 +msgid "" +"Starting angle for the fill of [member texture_progress] if [member " +"fill_mode] is [constant FILL_CLOCKWISE] or [constant " +"FILL_COUNTER_CLOCKWISE]. When the node's [code]value[/code] is equal to its " +"[code]min_value[/code], the texture doesn't show up at all. When the " +"[code]value[/code] increases, the texture fills and tends towards [member " +"radial_fill_degrees]." +msgstr "" + +#: doc/classes/TextureProgress.xml:50 +msgid "" +"The height of the 9-patch's bottom row. A margin of 16 means the 9-slice's " +"bottom corners and side will have a height of 16 pixels. You can set all 4 " +"margin values individually to create panels with non-uniform borders." +msgstr "" + +#: doc/classes/TextureProgress.xml:53 +msgid "The width of the 9-patch's left column." +msgstr "" + +#: doc/classes/TextureProgress.xml:56 +msgid "The width of the 9-patch's right column." +msgstr "" + +#: doc/classes/TextureProgress.xml:59 +msgid "The height of the 9-patch's top row." +msgstr "" + +#: doc/classes/TextureProgress.xml:62 +msgid "" +"[Texture2D] that draws over the progress bar. Use it to add highlights or an " +"upper-frame that hides part of [member texture_progress]." +msgstr "" + +#: doc/classes/TextureProgress.xml:65 +msgid "" +"[Texture2D] that clips based on the node's [code]value[/code] and [member " +"fill_mode]. As [code]value[/code] increased, the texture fills up. It shows " +"entirely when [code]value[/code] reaches [code]max_value[/code]. It doesn't " +"show at all if [code]value[/code] is equal to [code]min_value[/code].\n" +"The [code]value[/code] property comes from [Range]. See [member Range." +"value], [member Range.min_value], [member Range.max_value]." +msgstr "" + +#: doc/classes/TextureProgress.xml:69 +msgid "[Texture2D] that draws under the progress bar. The bar's background." +msgstr "" + +#: doc/classes/TextureProgress.xml:72 +msgid "" +"Multiplies the color of the bar's [code]texture_over[/code] texture. The " +"effect is similar to [member CanvasItem.modulate], except it only affects " +"this specific texture instead of the entire node." +msgstr "" + +#: doc/classes/TextureProgress.xml:75 +msgid "" +"Multiplies the color of the bar's [code]texture_progress[/code] texture." +msgstr "" + +#: doc/classes/TextureProgress.xml:78 +msgid "Multiplies the color of the bar's [code]texture_under[/code] texture." +msgstr "" + +#: doc/classes/TextureProgress.xml:83 +msgid "The [member texture_progress] fills from left to right." +msgstr "" + +#: doc/classes/TextureProgress.xml:86 +msgid "The [member texture_progress] fills from right to left." +msgstr "" + +#: doc/classes/TextureProgress.xml:89 +msgid "The [member texture_progress] fills from top to bottom." +msgstr "" + +#: doc/classes/TextureProgress.xml:92 +msgid "The [member texture_progress] fills from bottom to top." +msgstr "" + +#: doc/classes/TextureProgress.xml:95 +msgid "" +"Turns the node into a radial bar. The [member texture_progress] fills " +"clockwise. See [member radial_center_offset], [member radial_initial_angle] " +"and [member radial_fill_degrees] to control the way the bar fills up." +msgstr "" + +#: doc/classes/TextureProgress.xml:98 +msgid "" +"Turns the node into a radial bar. The [member texture_progress] fills " +"counterclockwise. See [member radial_center_offset], [member " +"radial_initial_angle] and [member radial_fill_degrees] to control the way " +"the bar fills up." +msgstr "" + +#: doc/classes/TextureProgress.xml:101 +msgid "" +"The [member texture_progress] fills from the center, expanding both towards " +"the left and the right." +msgstr "" + +#: doc/classes/TextureProgress.xml:104 +msgid "" +"The [member texture_progress] fills from the center, expanding both towards " +"the top and the bottom." +msgstr "" + +#: doc/classes/TextureProgress.xml:107 +msgid "" +"Turns the node into a radial bar. The [member texture_progress] fills " +"radially from the center, expanding both clockwise and counterclockwise. See " +"[member radial_center_offset], [member radial_initial_angle] and [member " +"radial_fill_degrees] to control the way the bar fills up." +msgstr "" + +#: doc/classes/TextureRect.xml:4 +msgid "Control for drawing textures." +msgstr "" + +#: doc/classes/TextureRect.xml:7 +msgid "" +"Used to draw icons and sprites in a user interface. The texture's placement " +"can be controlled with the [member stretch_mode] property. It can scale, " +"tile, or stay centered inside its bounding rectangle." +msgstr "" + +#: doc/classes/TextureRect.xml:15 +msgid "If [code]true[/code], the texture scales to fit its bounding rectangle." +msgstr "" + +#: doc/classes/TextureRect.xml:25 +msgid "" +"Controls the texture's behavior when resizing the node's bounding rectangle. " +"See [enum StretchMode]." +msgstr "" + +#: doc/classes/TextureRect.xml:28 +msgid "The node's [Texture2D] resource." +msgstr "" + +#: doc/classes/TextureRect.xml:33 +msgid "" +"Scale to fit the node's bounding rectangle, only if [code]expand[/code] is " +"[code]true[/code]. Default [code]stretch_mode[/code], for backwards " +"compatibility. Until you set [code]expand[/code] to [code]true[/code], the " +"texture will behave like [constant STRETCH_KEEP]." +msgstr "" + +#: doc/classes/TextureRect.xml:51 +msgid "" +"Scale the texture to fit the node's bounding rectangle, center it and " +"maintain its aspect ratio." +msgstr "" + +#: doc/classes/Theme.xml:4 +msgid "Theme for controls." +msgstr "" + +#: doc/classes/Theme.xml:7 +msgid "" +"A theme for skinning controls. Controls can be skinned individually, but for " +"complex applications, it's more practical to just create a global theme that " +"defines everything. This theme can be applied to any [Control]; the Control " +"and its children will automatically use it.\n" +"Theme resources can alternatively be loaded by writing them in a [code]." +"theme[/code] file, see the documentation for more information." +msgstr "" + +#: doc/classes/Theme.xml:11 +msgid "https://docs.godotengine.org/en/latest/tutorials/gui/gui_skinning.html" +msgstr "" + +#: doc/classes/Theme.xml:18 +msgid "Clears all values on the theme." +msgstr "" + +#: doc/classes/Theme.xml:29 +msgid "" +"Clears the [Color] at [code]name[/code] if the theme has [code]type[/code]." +msgstr "" + +#: doc/classes/Theme.xml:40 +msgid "" +"Clears the constant at [code]name[/code] if the theme has [code]type[/code]." +msgstr "" + +#: doc/classes/Theme.xml:51 +msgid "" +"Clears the [Font] at [code]name[/code] if the theme has [code]type[/code]." +msgstr "" + +#: doc/classes/Theme.xml:62 +msgid "" +"Clears the icon at [code]name[/code] if the theme has [code]type[/code]." +msgstr "" + +#: doc/classes/Theme.xml:73 +msgid "" +"Clears [StyleBox] at [code]name[/code] if the theme has [code]type[/code]." +msgstr "" + +#: doc/classes/Theme.xml:80 +msgid "Sets the theme's values to a copy of the default theme values." +msgstr "" + +#: doc/classes/Theme.xml:89 +msgid "Sets the theme's values to a copy of a given theme." +msgstr "" + +#: doc/classes/Theme.xml:100 +msgid "" +"Returns the [Color] at [code]name[/code] if the theme has [code]type[/code]." +msgstr "" + +#: doc/classes/Theme.xml:109 +msgid "" +"Returns all the [Color]s as a [PackedStringArray] filled with each [Color]'s " +"name, for use in [method get_color], if the theme has [code]type[/code]." +msgstr "" + +#: doc/classes/Theme.xml:120 +msgid "" +"Returns the constant at [code]name[/code] if the theme has [code]type[/code]." +msgstr "" + +#: doc/classes/Theme.xml:129 +msgid "" +"Returns all the constants as a [PackedStringArray] filled with each " +"constant's name, for use in [method get_constant], if the theme has " +"[code]type[/code]." +msgstr "" + +#: doc/classes/Theme.xml:140 +msgid "" +"Returns the [Font] at [code]name[/code] if the theme has [code]type[/code]." +msgstr "" + +#: doc/classes/Theme.xml:149 +msgid "" +"Returns all the [Font]s as a [PackedStringArray] filled with each [Font]'s " +"name, for use in [method get_font], if the theme has [code]type[/code]." +msgstr "" + +#: doc/classes/Theme.xml:160 +msgid "" +"Returns the icon [Texture2D] at [code]name[/code] if the theme has " +"[code]type[/code]." +msgstr "" + +#: doc/classes/Theme.xml:169 +msgid "" +"Returns all the icons as a [PackedStringArray] filled with each " +"[Texture2D]'s name, for use in [method get_icon], if the theme has " +"[code]type[/code]." +msgstr "" + +#: doc/classes/Theme.xml:180 +msgid "" +"Returns the icon [StyleBox] at [code]name[/code] if the theme has " +"[code]type[/code]." +msgstr "" + +#: doc/classes/Theme.xml:189 +msgid "" +"Returns all the [StyleBox]s as a [PackedStringArray] filled with each " +"[StyleBox]'s name, for use in [method get_stylebox], if the theme has " +"[code]type[/code]." +msgstr "" + +#: doc/classes/Theme.xml:196 +msgid "" +"Returns all the [StyleBox] types as a [PackedStringArray] filled with each " +"[StyleBox]'s type, for use in [method get_stylebox] and/or [method " +"get_stylebox_list], if the theme has [code]type[/code]." +msgstr "" + +#: doc/classes/Theme.xml:205 +msgid "" +"Returns all the types in [code]type[/code] as a [PackedStringArray] for use " +"in any of the [code]get_*[/code] functions, if the theme has [code]type[/" +"code]." +msgstr "" + +#: doc/classes/Theme.xml:216 +msgid "" +"Returns [code]true[/code] if [Color] with [code]name[/code] is in " +"[code]type[/code].\n" +"Returns [code]false[/code] if the theme does not have [code]type[/code]." +msgstr "" + +#: doc/classes/Theme.xml:228 +msgid "" +"Returns [code]true[/code] if constant with [code]name[/code] is in " +"[code]type[/code].\n" +"Returns [code]false[/code] if the theme does not have [code]type[/code]." +msgstr "" + +#: doc/classes/Theme.xml:240 +msgid "" +"Returns [code]true[/code] if [Font] with [code]name[/code] is in [code]type[/" +"code].\n" +"Returns [code]false[/code] if the theme does not have [code]type[/code]." +msgstr "" + +#: doc/classes/Theme.xml:252 +msgid "" +"Returns [code]true[/code] if icon [Texture2D] with [code]name[/code] is in " +"[code]type[/code].\n" +"Returns [code]false[/code] if the theme does not have [code]type[/code]." +msgstr "" + +#: doc/classes/Theme.xml:264 +msgid "" +"Returns [code]true[/code] if [StyleBox] with [code]name[/code] is in " +"[code]type[/code].\n" +"Returns [code]false[/code] if the theme does not have [code]type[/code]." +msgstr "" + +#: doc/classes/Theme.xml:278 +msgid "" +"Sets the theme's [Color] to [code]color[/code] at [code]name[/code] in " +"[code]type[/code].\n" +"Does nothing if the theme does not have [code]type[/code]." +msgstr "" + +#: doc/classes/Theme.xml:292 +msgid "" +"Sets the theme's constant to [code]constant[/code] at [code]name[/code] in " +"[code]type[/code].\n" +"Does nothing if the theme does not have [code]type[/code]." +msgstr "" + +#: doc/classes/Theme.xml:306 +msgid "" +"Sets the theme's [Font] to [code]font[/code] at [code]name[/code] in " +"[code]type[/code].\n" +"Does nothing if the theme does not have [code]type[/code]." +msgstr "" + +#: doc/classes/Theme.xml:320 +msgid "" +"Sets the theme's icon [Texture2D] to [code]texture[/code] at [code]name[/" +"code] in [code]type[/code].\n" +"Does nothing if the theme does not have [code]type[/code]." +msgstr "" + +#: doc/classes/Theme.xml:334 +msgid "" +"Sets theme's [StyleBox] to [code]stylebox[/code] at [code]name[/code] in " +"[code]type[/code].\n" +"Does nothing if the theme does not have [code]type[/code]." +msgstr "" + +#: doc/classes/Theme.xml:341 +msgid "The theme's default font." +msgstr "" + +#: doc/classes/Thread.xml:4 +msgid "A unit of execution in a process." +msgstr "" + +#: doc/classes/Thread.xml:7 +msgid "" +"A unit of execution in a process. Can run methods on [Object]s " +"simultaneously. The use of synchronization via [Mutex] or [Semaphore] is " +"advised if working with shared objects." +msgstr "" + +#: doc/classes/Thread.xml:17 +msgid "" +"Returns the current [Thread]'s ID, uniquely identifying it among all threads." +msgstr "" + +#: doc/classes/Thread.xml:24 +msgid "" +"Returns [code]true[/code] if this [Thread] is currently active. An active " +"[Thread] cannot start work on a new method but can be joined with [method " +"wait_to_finish]." +msgstr "" + +#: doc/classes/Thread.xml:39 +msgid "" +"Starts a new [Thread] that runs [code]method[/code] on object " +"[code]instance[/code] with [code]userdata[/code] passed as an argument. Even " +"if no userdata is passed, [code]method[/code] must accept one argument and " +"it will be null. The [code]priority[/code] of the [Thread] can be changed by " +"passing a value from the [enum Priority] enum.\n" +"Returns [constant OK] on success, or [constant ERR_CANT_CREATE] on failure." +msgstr "" + +#: doc/classes/Thread.xml:47 +msgid "" +"Joins the [Thread] and waits for it to finish. Returns what the method " +"called returned." +msgstr "" + +#: doc/classes/Thread.xml:53 +msgid "A thread running with lower priority than normally." +msgstr "" + +#: doc/classes/Thread.xml:56 +msgid "A thread with a standard priority." +msgstr "" + +#: doc/classes/Thread.xml:59 +msgid "A thread running with higher priority than normally." +msgstr "" + +#: doc/classes/TileMap.xml:4 +msgid "Node for 2D tile-based maps." +msgstr "" + +#: doc/classes/TileMap.xml:7 +msgid "" +"Node for 2D tile-based maps. Tilemaps use a [TileSet] which contain a list " +"of tiles (textures plus optional collision, navigation, and/or occluder " +"shapes) which are used to create grid-based maps." +msgstr "" + +#: doc/classes/TileMap.xml:10 +msgid "https://docs.godotengine.org/en/latest/tutorials/2d/using_tilemaps.html" +msgstr "" + +#: doc/classes/TileMap.xml:17 +msgid "Clears all cells." +msgstr "" + +#: doc/classes/TileMap.xml:24 +msgid "Clears cells that do not exist in the tileset." +msgstr "" + +#: doc/classes/TileMap.xml:35 +msgid "" +"Returns the tile index of the given cell. If no tile exists in the cell, " +"returns [constant INVALID_CELL]." +msgstr "" + +#: doc/classes/TileMap.xml:46 +msgid "" +"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 +msgid "" +"Returns the tile index of the cell given by a Vector2. If no tile exists in " +"the cell, returns [constant INVALID_CELL]." +msgstr "" + +#: doc/classes/TileMap.xml:64 +msgid "Returns [code]true[/code] if the given collision layer bit is set." +msgstr "" + +#: doc/classes/TileMap.xml:73 +msgid "Returns [code]true[/code] if the given collision mask bit is set." +msgstr "" + +#: doc/classes/TileMap.xml:80 +msgid "" +"Returns a [Vector2] array with the positions of all cells containing a tile " +"from the tileset (i.e. a tile index different from [code]-1[/code])." +msgstr "" + +#: doc/classes/TileMap.xml:89 +msgid "Returns an array of all cells with the given tile [code]id[/code]." +msgstr "" + +#: doc/classes/TileMap.xml:96 +msgid "Returns a rectangle enclosing the used (non-empty) tiles of the map." +msgstr "" + +#: doc/classes/TileMap.xml:107 +msgid "" +"Returns [code]true[/code] if the given cell is transposed, i.e. the X and Y " +"axes are swapped." +msgstr "" + +#: doc/classes/TileMap.xml:118 +msgid "Returns [code]true[/code] if the given cell is flipped in the X axis." +msgstr "" + +#: doc/classes/TileMap.xml:129 +msgid "Returns [code]true[/code] if the given cell is flipped in the Y axis." +msgstr "" + +#: doc/classes/TileMap.xml:140 +msgid "" +"Returns the global position corresponding to the given tilemap (grid-based) " +"coordinates.\n" +"Optionally, the tilemap's half offset can be ignored." +msgstr "" + +#: doc/classes/TileMap.xml:162 +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. 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 " +"update_dirty_quadrants].\n" +"Overriding this method also overrides it internally, allowing custom logic " +"to be implemented when tiles are placed/removed:\n" +"[codeblock]\n" +"func set_cell(x, y, tile, flip_x, flip_y, transpose, autotile_coord)\n" +" # Write your custom logic here.\n" +" # To call the default method:\n" +" .set_cell(x, y, tile, flip_x, flip_y, transpose, autotile_coord)\n" +"[/codeblock]" +msgstr "" + +#: doc/classes/TileMap.xml:190 +msgid "" +"Sets the tile index for the given cell.\n" +"An index of [code]-1[/code] clears the cell.\n" +"Optionally, the tile can also be flipped or transposed.\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 " +"update_dirty_quadrants]." +msgstr "" + +#: doc/classes/TileMap.xml:205 +msgid "Sets the given collision layer bit." +msgstr "" + +#: doc/classes/TileMap.xml:216 +msgid "Sets the given collision mask bit." +msgstr "" + +#: doc/classes/TileMap.xml:225 +msgid "" +"Applies autotiling rules to the cell (and its adjacent cells) referenced by " +"its grid-based X and Y coordinates." +msgstr "" + +#: doc/classes/TileMap.xml:236 +msgid "" +"Applies autotiling rules to the cells in the given region (specified by grid-" +"based X and Y coordinates).\n" +"Calling with invalid (or missing) parameters applies autotiling rules for " +"the entire tilemap." +msgstr "" + +#: doc/classes/TileMap.xml:244 +msgid "" +"Updates the tile map's quadrants, allowing things such as navigation and " +"collision shapes to be immediately used if modified." +msgstr "" + +#: doc/classes/TileMap.xml:253 +msgid "" +"Returns the tilemap (grid-based) coordinates corresponding to the given " +"local position." +msgstr "" + +#: doc/classes/TileMap.xml:259 +msgid "If [code]true[/code], the cell's UVs will be clipped." +msgstr "" + +#: doc/classes/TileMap.xml:262 +msgid "The custom [Transform2D] to be applied to the TileMap's cells." +msgstr "" + +#: doc/classes/TileMap.xml:265 +msgid "" +"Amount to offset alternating tiles. See [enum HalfOffset] for possible " +"values." +msgstr "" + +#: doc/classes/TileMap.xml:268 +msgid "" +"The TileMap's quadrant size. Optimizes drawing by batching, using chunks of " +"this size." +msgstr "" + +#: doc/classes/TileMap.xml:271 +msgid "The TileMap's cell size." +msgstr "" + +#: doc/classes/TileMap.xml:274 +msgid "Position for tile origin. See [enum TileOrigin] for possible values." +msgstr "" + +#: doc/classes/TileMap.xml:277 +msgid "" +"If [code]true[/code], the TileMap's children will be drawn in order of their " +"Y coordinate." +msgstr "" + +#: doc/classes/TileMap.xml:280 +msgid "" +"If [code]true[/code], the textures will be centered in the middle of each " +"tile. This is useful for certain isometric or top-down modes when textures " +"are made larger or smaller than the tiles (e.g. to avoid flickering on tile " +"edges). The offset is still applied, but from the center of the tile. If " +"used, [member compatibility_mode] is ignored.\n" +"If [code]false[/code], the texture position start in the top-left corner " +"unless [member compatibility_mode] is enabled." +msgstr "" + +#: doc/classes/TileMap.xml:284 +msgid "" +"Bounce value for static body collisions (see [code]collision_use_kinematic[/" +"code])." +msgstr "" + +#: doc/classes/TileMap.xml:287 +msgid "" +"Friction value for static body collisions (see " +"[code]collision_use_kinematic[/code])." +msgstr "" + +#: doc/classes/TileMap.xml:290 +msgid "The collision layer(s) for all colliders in the TileMap." +msgstr "" + +#: doc/classes/TileMap.xml:293 +msgid "The collision mask(s) for all colliders in the TileMap." +msgstr "" + +#: doc/classes/TileMap.xml:296 +msgid "" +"If [code]true[/code], TileMap collisions will be handled as a kinematic " +"body. If [code]false[/code], collisions will be handled as static body." +msgstr "" + +#: doc/classes/TileMap.xml:299 +msgid "" +"If [code]true[/code], this tilemap's collision shape will be added to the " +"collision shape of the parent. The parent has to be a [CollisionObject2D]." +msgstr "" + +#: doc/classes/TileMap.xml:302 +msgid "" +"If [code]true[/code], the compatibility with the tilemaps made in Godot 3.1 " +"or earlier is maintained (textures move when the tile origin changes and " +"rotate if the texture size is not homogeneous). This mode presents problems " +"when doing [code]flip_h[/code], [code]flip_v[/code] and [code]transpose[/" +"code] tile operations on non-homogeneous isometric tiles (e.g. 2:1), in " +"which the texture could not coincide with the collision, thus it is not " +"recommended for isometric or non-square tiles.\n" +"If [code]false[/code], the textures do not move when doing [code]flip_h[/" +"code], [code]flip_v[/code] operations if no offset is used, nor when " +"changing the tile origin.\n" +"The compatibility mode doesn't work with the [member centered_textures] " +"option, because displacing textures with the [member cell_tile_origin] " +"option or in irregular tiles is not relevant when centering those textures." +msgstr "" + +#: doc/classes/TileMap.xml:307 +msgid "The TileMap orientation mode. See [enum Mode] for possible values." +msgstr "" + +#: doc/classes/TileMap.xml:310 +msgid "" +"The light mask assigned to all light occluders in the TileMap. The TileSet's " +"light occluders will cast shadows only from Light2D(s) that have the same " +"light mask(s)." +msgstr "" + +#: doc/classes/TileMap.xml:313 +msgid "The assigned [TileSet]." +msgstr "" + +#: doc/classes/TileMap.xml:319 +msgid "Emitted when a tilemap setting has changed." +msgstr "" + +#: doc/classes/TileMap.xml:325 +msgid "Returned when a cell doesn't exist." +msgstr "" + +#: doc/classes/TileMap.xml:328 +msgid "Orthogonal orientation mode." +msgstr "" + +#: doc/classes/TileMap.xml:331 +msgid "Isometric orientation mode." +msgstr "" + +#: doc/classes/TileMap.xml:334 +msgid "Custom orientation mode." +msgstr "" + +#: doc/classes/TileMap.xml:337 +msgid "Half offset on the X coordinate." +msgstr "" + +#: doc/classes/TileMap.xml:340 +msgid "Half offset on the Y coordinate." +msgstr "" + +#: doc/classes/TileMap.xml:343 +msgid "Half offset disabled." +msgstr "" + +#: doc/classes/TileMap.xml:346 +msgid "Half offset on the X coordinate (negative)." +msgstr "" + +#: doc/classes/TileMap.xml:349 +msgid "Half offset on the Y coordinate (negative)." +msgstr "" + +#: doc/classes/TileMap.xml:352 +msgid "Tile origin at its top-left corner." +msgstr "" + +#: doc/classes/TileMap.xml:355 +msgid "Tile origin at its center." +msgstr "" + +#: doc/classes/TileMap.xml:358 +msgid "Tile origin at its bottom-left corner." +msgstr "" + +#: doc/classes/TileSet.xml:4 +msgid "Tile library for tilemaps." +msgstr "" + +#: doc/classes/TileSet.xml:7 +msgid "" +"A TileSet is a library of tiles for a [TileMap]. It contains a list of " +"tiles, each consisting of a sprite and optional collision shapes.\n" +"Tiles are referenced by a unique integer ID." +msgstr "" + +#: doc/classes/TileSet.xml:55 +msgid "Clears all bitmask information of the autotile." +msgstr "" + +#: doc/classes/TileSet.xml:66 +msgid "" +"Returns the bitmask of the subtile from an autotile given its coordinates.\n" +"The value is the sum of the values in [enum AutotileBindings] present in the " +"subtile (e.g. a value of 5 means the bitmask has bindings in both the top " +"left and top right)." +msgstr "" + +#: doc/classes/TileSet.xml:76 +msgid "Returns the [enum BitmaskMode] of the autotile." +msgstr "" + +#: doc/classes/TileSet.xml:85 +msgid "" +"Returns the subtile that's being used as an icon in an atlas/autotile given " +"its coordinates.\n" +"The subtile defined as the icon will be used as a fallback when the atlas/" +"autotile's bitmask information is incomplete. It will also be used to " +"represent it in the TileSet editor." +msgstr "" + +#: doc/classes/TileSet.xml:97 +msgid "" +"Returns the light occluder of the subtile from an atlas/autotile given its " +"coordinates." +msgstr "" + +#: doc/classes/TileSet.xml:108 +msgid "" +"Returns the navigation polygon of the subtile from an atlas/autotile given " +"its coordinates." +msgstr "" + +#: doc/classes/TileSet.xml:117 +msgid "Returns the size of the subtiles in an atlas/autotile." +msgstr "" + +#: doc/classes/TileSet.xml:126 +msgid "Returns the spacing between subtiles of the atlas/autotile." +msgstr "" + +#: doc/classes/TileSet.xml:137 +msgid "" +"Returns the priority of the subtile from an autotile given its coordinates.\n" +"When more than one subtile has the same bitmask value, one of them will be " +"picked randomly for drawing. Its priority will define how often it will be " +"picked." +msgstr "" + +#: doc/classes/TileSet.xml:149 +msgid "" +"Returns the drawing index of the subtile from an atlas/autotile given its " +"coordinates." +msgstr "" + +#: doc/classes/TileSet.xml:162 +msgid "" +"Sets the bitmask of the subtile from an autotile given its coordinates.\n" +"The value is the sum of the values in [enum AutotileBindings] present in the " +"subtile (e.g. a value of 5 means the bitmask has bindings in both the top " +"left and top right)." +msgstr "" + +#: doc/classes/TileSet.xml:174 +msgid "Sets the [enum BitmaskMode] of the autotile." +msgstr "" + +#: doc/classes/TileSet.xml:185 +msgid "" +"Sets the subtile that will be used as an icon in an atlas/autotile given its " +"coordinates.\n" +"The subtile defined as the icon will be used as a fallback when the atlas/" +"autotile's bitmask information is incomplete. It will also be used to " +"represent it in the TileSet editor." +msgstr "" + +#: doc/classes/TileSet.xml:199 +msgid "" +"Sets the light occluder of the subtile from an atlas/autotile given its " +"coordinates." +msgstr "" + +#: doc/classes/TileSet.xml:212 +msgid "" +"Sets the navigation polygon of the subtile from an atlas/autotile given its " +"coordinates." +msgstr "" + +#: doc/classes/TileSet.xml:223 +msgid "Sets the size of the subtiles in an atlas/autotile." +msgstr "" + +#: doc/classes/TileSet.xml:234 +msgid "Sets the spacing between subtiles of the atlas/autotile." +msgstr "" + +#: doc/classes/TileSet.xml:247 +msgid "" +"Sets the priority of the subtile from an autotile given its coordinates.\n" +"When more than one subtile has the same bitmask value, one of them will be " +"picked randomly for drawing. Its priority will define how often it will be " +"picked." +msgstr "" + +#: doc/classes/TileSet.xml:261 +msgid "" +"Sets the drawing index of the subtile from an atlas/autotile given its " +"coordinates." +msgstr "" + +#: doc/classes/TileSet.xml:268 +msgid "Clears all tiles." +msgstr "" + +#: doc/classes/TileSet.xml:277 +msgid "Creates a new tile with the given ID." +msgstr "" + +#: doc/classes/TileSet.xml:286 +msgid "Returns the first tile matching the given name." +msgstr "" + +#: doc/classes/TileSet.xml:293 +msgid "" +"Returns the ID following the last currently used ID, useful when creating a " +"new tile." +msgstr "" + +#: doc/classes/TileSet.xml:300 +msgid "Returns an array of all currently used tile IDs." +msgstr "" + +#: doc/classes/TileSet.xml:309 +msgid "Removes the given tile ID." +msgstr "" + +#: doc/classes/TileSet.xml:326 +msgid "Adds a shape to the tile." +msgstr "" + +#: doc/classes/TileSet.xml:335 +msgid "Returns the tile's light occluder." +msgstr "" + +#: doc/classes/TileSet.xml:344 +msgid "Returns the tile's material." +msgstr "" + +#: doc/classes/TileSet.xml:353 +msgid "Returns the tile's modulation color." +msgstr "" + +#: doc/classes/TileSet.xml:362 +msgid "Returns the tile's name." +msgstr "" + +#: doc/classes/TileSet.xml:371 +msgid "Returns the navigation polygon of the tile." +msgstr "" + +#: doc/classes/TileSet.xml:380 +msgid "Returns the offset of the tile's navigation polygon." +msgstr "" + +#: doc/classes/TileSet.xml:389 +msgid "Returns the tile's normal map texture." +msgstr "" + +#: doc/classes/TileSet.xml:398 +msgid "Returns the offset of the tile's light occluder." +msgstr "" + +#: doc/classes/TileSet.xml:407 +msgid "Returns the tile sub-region in the texture." +msgstr "" + +#: doc/classes/TileSet.xml:418 +msgid "Returns a tile's given shape." +msgstr "" + +#: doc/classes/TileSet.xml:427 +msgid "Returns the number of shapes assigned to a tile." +msgstr "" + +#: doc/classes/TileSet.xml:438 +msgid "Returns the offset of a tile's shape." +msgstr "" + +#: doc/classes/TileSet.xml:449 +msgid "Returns the one-way collision value of a tile's shape." +msgstr "" + +#: doc/classes/TileSet.xml:470 +msgid "Returns the [Transform2D] of a tile's shape." +msgstr "" + +#: doc/classes/TileSet.xml:479 +msgid "Returns an array of the tile's shapes." +msgstr "" + +#: doc/classes/TileSet.xml:488 +msgid "Returns the tile's texture." +msgstr "" + +#: doc/classes/TileSet.xml:497 +msgid "Returns the texture offset of the tile." +msgstr "" + +#: doc/classes/TileSet.xml:506 +msgid "Returns the tile's [enum TileMode]." +msgstr "" + +#: doc/classes/TileSet.xml:515 +msgid "Returns the tile's Z index (drawing layer)." +msgstr "" + +#: doc/classes/TileSet.xml:526 +msgid "Sets a light occluder for the tile." +msgstr "" + +#: doc/classes/TileSet.xml:537 +msgid "Sets the tile's material." +msgstr "" + +#: doc/classes/TileSet.xml:548 +msgid "Sets the tile's modulation color." +msgstr "" + +#: doc/classes/TileSet.xml:559 +msgid "Sets the tile's name." +msgstr "" + +#: doc/classes/TileSet.xml:570 +msgid "Sets the tile's navigation polygon." +msgstr "" + +#: doc/classes/TileSet.xml:581 +msgid "Sets an offset for the tile's navigation polygon." +msgstr "" + +#: doc/classes/TileSet.xml:592 +msgid "Sets the tile's normal map texture." +msgstr "" + +#: doc/classes/TileSet.xml:603 +msgid "Sets an offset for the tile's light occluder." +msgstr "" + +#: doc/classes/TileSet.xml:614 +msgid "" +"Sets the tile's sub-region in the texture. This is common in texture atlases." +msgstr "" + +#: doc/classes/TileSet.xml:627 +msgid "Sets a shape for the tile, enabling collision." +msgstr "" + +#: doc/classes/TileSet.xml:640 +msgid "Sets the offset of a tile's shape." +msgstr "" + +#: doc/classes/TileSet.xml:653 +msgid "Enables one-way collision on a tile's shape." +msgstr "" + +#: doc/classes/TileSet.xml:678 +msgid "Sets a [Transform2D] on a tile's shape." +msgstr "" + +#: doc/classes/TileSet.xml:689 +msgid "Sets an array of shapes for the tile, enabling collision." +msgstr "" + +#: doc/classes/TileSet.xml:700 +msgid "Sets the tile's texture." +msgstr "" + +#: doc/classes/TileSet.xml:711 +msgid "Sets the tile's texture offset." +msgstr "" + +#: doc/classes/TileSet.xml:722 +msgid "Sets the tile's [enum TileMode]." +msgstr "" + +#: doc/classes/TileSet.xml:733 +msgid "Sets the tile's drawing index." +msgstr "" + +#: doc/classes/Timer.xml:4 +msgid "A countdown timer." +msgstr "" + +#: doc/classes/Timer.xml:7 +msgid "" +"Counts down a specified interval and emits a signal on reaching 0. Can be " +"set to repeat or \"one-shot\" mode." +msgstr "" + +#: doc/classes/Timer.xml:16 +msgid "Returns [code]true[/code] if the timer is stopped." +msgstr "" + +#: doc/classes/Timer.xml:25 +msgid "" +"Starts the timer. Sets [code]wait_time[/code] to [code]time_sec[/code] if " +"[code]time_sec > 0[/code]. This also resets the remaining time to " +"[code]wait_time[/code].\n" +"[b]Note:[/b] this method will not resume a paused timer. See [member paused]." +msgstr "" + +#: doc/classes/Timer.xml:33 +msgid "Stops the timer." +msgstr "" + +#: doc/classes/Timer.xml:39 +msgid "" +"If [code]true[/code], the timer will automatically start when entering the " +"scene tree.\n" +"[b]Note:[/b] This property is automatically set to [code]false[/code] after " +"the timer enters the scene tree and starts." +msgstr "" + +#: doc/classes/Timer.xml:43 +msgid "" +"If [code]true[/code], the timer will stop when reaching 0. If [code]false[/" +"code], it will restart." +msgstr "" + +#: doc/classes/Timer.xml:46 +msgid "" +"If [code]true[/code], the timer is paused and will not process until it is " +"unpaused again, even if [method start] is called." +msgstr "" + +#: doc/classes/Timer.xml:49 +msgid "Processing mode. See [enum TimerProcessMode]." +msgstr "" + +#: doc/classes/Timer.xml:52 +msgid "" +"The timer's remaining time in seconds. Returns 0 if the timer is inactive.\n" +"[b]Note:[/b] You cannot set this value. To change the timer's remaining " +"time, use [method start]." +msgstr "" + +#: doc/classes/Timer.xml:56 +msgid "Wait time in seconds." +msgstr "" + +#: doc/classes/Timer.xml:68 +msgid "" +"Update the timer during the physics step at each frame (fixed framerate " +"processing)." +msgstr "" + +#: doc/classes/Timer.xml:71 +msgid "Update the timer during the idle time at each frame." +msgstr "" + +#: doc/classes/ToolButton.xml:4 +msgid "Flat button helper class." +msgstr "" + +#: doc/classes/ToolButton.xml:7 +msgid "" +"This is a helper class to generate a flat [Button] (see [member Button." +"flat]), creating a [ToolButton] is equivalent to:\n" +"[codeblock]\n" +"var btn = Button.new()\n" +"btn.flat = true\n" +"[/codeblock]" +msgstr "" + +#: doc/classes/ToolButton.xml:24 +msgid "[StyleBox] used when the [ToolButton] is disabled." +msgstr "" + +#: doc/classes/ToolButton.xml:27 +msgid "" +"[StyleBox] used when the [ToolButton] is focused. It is displayed over the " +"current [StyleBox], so using [StyleBoxEmpty] will just disable the focus " +"visual effect." +msgstr "" + +#: doc/classes/ToolButton.xml:30 +msgid "[Font] of the [ToolButton]'s text." +msgstr "" + +#: doc/classes/ToolButton.xml:33 +msgid "Default text [Color] of the [ToolButton]." +msgstr "" + +#: doc/classes/ToolButton.xml:36 +msgid "Text [Color] used when the [ToolButton] is disabled." +msgstr "" + +#: doc/classes/ToolButton.xml:39 +msgid "Text [Color] used when the [ToolButton] is being hovered." +msgstr "" + +#: doc/classes/ToolButton.xml:42 +msgid "Text [Color] used when the [ToolButton] is being pressed." +msgstr "" + +#: doc/classes/ToolButton.xml:45 +msgid "[StyleBox] used when the [ToolButton] is being hovered." +msgstr "" + +#: doc/classes/ToolButton.xml:48 +msgid "The horizontal space between [ToolButton]'s icon and text." +msgstr "" + +#: doc/classes/ToolButton.xml:51 +msgid "Default [StyleBox] for the [ToolButton]." +msgstr "" + +#: doc/classes/ToolButton.xml:54 +msgid "[StyleBox] used when the [ToolButton] is being pressed." +msgstr "" + +#: doc/classes/TouchScreenButton.xml:4 +msgid "Button for touch screen devices." +msgstr "" + +#: doc/classes/TouchScreenButton.xml:7 +msgid "" +"Button for touch screen devices. You can set it to be visible on all " +"screens, or only on touch devices." +msgstr "" + +#: doc/classes/TouchScreenButton.xml:16 +msgid "Returns [code]true[/code] if this button is currently pressed." +msgstr "" + +#: doc/classes/TouchScreenButton.xml:22 +msgid "The button's action. Actions can be handled with [InputEventAction]." +msgstr "" + +#: doc/classes/TouchScreenButton.xml:25 +msgid "The button's bitmask." +msgstr "" + +#: doc/classes/TouchScreenButton.xml:28 +msgid "The button's texture for the normal state." +msgstr "" + +#: doc/classes/TouchScreenButton.xml:31 +msgid "If [code]true[/code], pass-by presses are enabled." +msgstr "" + +#: doc/classes/TouchScreenButton.xml:34 +msgid "The button's texture for the pressed state." +msgstr "" + +#: doc/classes/TouchScreenButton.xml:37 +msgid "The button's shape." +msgstr "" + +#: doc/classes/TouchScreenButton.xml:40 +msgid "" +"If [code]true[/code], the button's shape is centered in the provided " +"texture. If no texture is used, this property has no effect." +msgstr "" + +#: doc/classes/TouchScreenButton.xml:43 +msgid "If [code]true[/code], the button's shape is visible." +msgstr "" + +#: doc/classes/TouchScreenButton.xml:46 +msgid "" +"The button's visibility mode. See [enum VisibilityMode] for possible values." +msgstr "" + +#: doc/classes/TouchScreenButton.xml:52 +msgid "Emitted when the button is pressed (down)." +msgstr "" + +#: doc/classes/TouchScreenButton.xml:57 +msgid "Emitted when the button is released (up)." +msgstr "" + +#: doc/classes/TouchScreenButton.xml:63 +msgid "Always visible." +msgstr "" + +#: doc/classes/TouchScreenButton.xml:66 +msgid "Visible on touch screens only." +msgstr "" + +#: doc/classes/Transform.xml:4 +msgid "3D transformation (3×4 matrix)." +msgstr "" + +#: doc/classes/Transform.xml:7 +msgid "" +"Represents one or many transformations in 3D space such as translation, " +"rotation, or scaling. It consists of a [member basis] and an [member " +"origin]. It is similar to a 3×4 matrix." +msgstr "" + +#: doc/classes/Transform.xml:26 +msgid "" +"Constructs the Transform from four [Vector3]. Each axis corresponds to local " +"basis vectors (some of which may be scaled)." +msgstr "" + +#: doc/classes/Transform.xml:37 +msgid "Constructs the Transform from a [Basis] and [Vector3]." +msgstr "" + +#: doc/classes/Transform.xml:46 +msgid "Constructs the Transform from a [Transform2D]." +msgstr "" + +#: doc/classes/Transform.xml:55 +msgid "" +"Constructs the Transform from a [Quat]. The origin will be Vector3(0, 0, 0)." +msgstr "" + +#: doc/classes/Transform.xml:64 +msgid "" +"Constructs the Transform from a [Basis]. The origin will be Vector3(0, 0, 0)." +msgstr "" + +#: doc/classes/Transform.xml:71 +msgid "" +"Returns the inverse of the transform, under the assumption that the " +"transformation is composed of rotation, scaling and translation." +msgstr "" + +#: doc/classes/Transform.xml:82 +msgid "Interpolates the transform to other Transform by weight amount (0-1)." +msgstr "" + +#: doc/classes/Transform.xml:89 doc/classes/Transform2D.xml:106 +msgid "" +"Returns the inverse of the transform, under the assumption that the " +"transformation is composed of rotation and translation (no scaling, use " +"affine_inverse for transforms with scaling)." +msgstr "" + +#: doc/classes/Transform.xml:98 doc/classes/Transform2D.xml:115 +msgid "" +"Returns [code]true[/code] if this transform and [code]transform[/code] are " +"approximately equal, by calling [code]is_equal_approx[/code] on each " +"component." +msgstr "" + +#: doc/classes/Transform.xml:109 +msgid "" +"Returns a copy of the transform rotated such that its -Z axis points towards " +"the [code]target[/code] position.\n" +"The transform will first be rotated around the given [code]up[/code] vector, " +"and then fully aligned to the target by a further rotation around an axis " +"perpendicular to both the [code]target[/code] and [code]up[/code] vectors.\n" +"Operations take place in global space." +msgstr "" + +#: doc/classes/Transform.xml:118 doc/classes/Transform2D.xml:122 +msgid "" +"Returns the transform with the basis orthogonal (90 degrees), and normalized " +"axis vectors." +msgstr "" + +#: doc/classes/Transform.xml:129 +msgid "" +"Rotates the transform around the given axis by the given angle (in radians), " +"using matrix multiplication. The axis must be a normalized vector." +msgstr "" + +#: doc/classes/Transform.xml:138 +msgid "" +"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 +msgid "" +"Translates the transform by the given offset, relative to the transform's " +"basis vectors.\n" +"Unlike [method rotated] and [method scaled], this does not use matrix " +"multiplication." +msgstr "" + +#: doc/classes/Transform.xml:157 +msgid "" +"Transforms the given [Vector3], [Plane], [AABB], or [PackedVector3Array] by " +"this transform." +msgstr "" + +#: doc/classes/Transform.xml:166 +msgid "" +"Inverse-transforms the given [Vector3], [Plane], [AABB], or " +"[PackedVector3Array] by this transform." +msgstr "" + +#: doc/classes/Transform.xml:172 +msgid "" +"The basis is a matrix containing 3 [Vector3] as its columns: X axis, Y axis, " +"and Z axis. These vectors can be interpreted as the basis vectors of local " +"coordinate system traveling with the object." +msgstr "" + +#: doc/classes/Transform.xml:175 +msgid "The translation offset of the transform." +msgstr "" + +#: doc/classes/Transform.xml:180 +msgid "" +"[Transform] with no translation, rotation or scaling applied. When applied " +"to other data structures, [constant IDENTITY] performs no transformation." +msgstr "" + +#: doc/classes/Transform.xml:183 +msgid "[Transform] with mirroring applied perpendicular to the YZ plane." +msgstr "" + +#: doc/classes/Transform.xml:186 +msgid "[Transform] with mirroring applied perpendicular to the XZ plane." +msgstr "" + +#: doc/classes/Transform.xml:189 +msgid "[Transform] with mirroring applied perpendicular to the XY plane." +msgstr "" + +#: doc/classes/Transform2D.xml:4 +msgid "2D transformation (3×2 matrix)." +msgstr "" + +#: doc/classes/Transform2D.xml:7 +msgid "" +"Represents one or many transformations in 2D space such as translation, " +"rotation, or scaling. It consists of two [member x] and [member y] " +"[Vector2]s and an [member origin]. It is similar to a 3×2 matrix." +msgstr "" + +#: doc/classes/Transform2D.xml:18 +msgid "Constructs the transform from a 3D [Transform]." +msgstr "" + +#: doc/classes/Transform2D.xml:31 +msgid "" +"Constructs the transform from 3 [Vector2]s representing x, y, and origin." +msgstr "" + +#: doc/classes/Transform2D.xml:42 +msgid "Constructs the transform from a given angle (in radians) and position." +msgstr "" + +#: doc/classes/Transform2D.xml:58 +msgid "Transforms the given vector by this transform's basis (no translation)." +msgstr "" + +#: doc/classes/Transform2D.xml:67 +msgid "" +"Inverse-transforms the given vector by this transform's basis (no " +"translation)." +msgstr "" + +#: doc/classes/Transform2D.xml:74 +msgid "Returns the transform's origin (translation)." +msgstr "" + +#: doc/classes/Transform2D.xml:81 +msgid "Returns the transform's rotation (in radians)." +msgstr "" + +#: doc/classes/Transform2D.xml:88 +msgid "Returns the scale." +msgstr "" + +#: doc/classes/Transform2D.xml:99 +msgid "" +"Returns a transform interpolated between this transform and another by a " +"given weight (0-1)." +msgstr "" + +#: doc/classes/Transform2D.xml:131 +msgid "" +"Rotates the transform by the given angle (in radians), using matrix " +"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 " +"transform." +msgstr "" + +#: doc/classes/Transform2D.xml:168 +msgid "" +"Inverse-transforms the given [Vector2], [Rect2], or [PackedVector2Array] by " +"this transform." +msgstr "" + +#: doc/classes/Transform2D.xml:174 +msgid "The transform's translation offset." +msgstr "" + +#: doc/classes/Transform2D.xml:177 +msgid "" +"The X axis of 2×2 basis matrix containing 2 [Vector2]s as its columns: X " +"axis and Y axis. These vectors can be interpreted as the basis vectors of " +"local coordinate system traveling with the object." +msgstr "" + +#: doc/classes/Transform2D.xml:180 +msgid "" +"The Y axis of 2×2 basis matrix containing 2 [Vector2]s as its columns: X " +"axis and Y axis. These vectors can be interpreted as the basis vectors of " +"local coordinate system traveling with the object." +msgstr "" + +#: doc/classes/Transform2D.xml:185 +msgid "" +"[Transform2D] with no translation, rotation or scaling applied. When applied " +"to other data structures, [constant IDENTITY] performs no transformation." +msgstr "" + +#: doc/classes/Transform2D.xml:188 +msgid "[Transform2D] with mirroring applied parallel to the X axis." +msgstr "" + +#: doc/classes/Transform2D.xml:191 +msgid "[Transform2D] with mirroring applied parallel to the Y axis." +msgstr "" + +#: doc/classes/Translation.xml:4 +msgid "Language Translation." +msgstr "" + +#: doc/classes/Translation.xml:7 +msgid "" +"Translations are resources that can be loaded and unloaded on demand. They " +"map a string to another string." +msgstr "" + +#: doc/classes/Translation.xml:10 doc/classes/TranslationServer.xml:10 +msgid "" +"https://docs.godotengine.org/en/latest/tutorials/i18n/" +"internationalizing_games.html" +msgstr "" + +#: doc/classes/Translation.xml:11 doc/classes/TranslationServer.xml:11 +msgid "https://docs.godotengine.org/en/latest/tutorials/i18n/locales.html" +msgstr "" + +#: doc/classes/Translation.xml:22 +msgid "Adds a message if nonexistent, followed by its translation." +msgstr "" + +#: doc/classes/Translation.xml:31 +msgid "Erases a message." +msgstr "" + +#: doc/classes/Translation.xml:40 +msgid "Returns a message's translation." +msgstr "" + +#: doc/classes/Translation.xml:47 +msgid "Returns the number of existing messages." +msgstr "" + +#: doc/classes/Translation.xml:54 +msgid "Returns all the messages (keys)." +msgstr "" + +#: doc/classes/Translation.xml:60 +msgid "The locale of the translation." +msgstr "" + +#: doc/classes/TranslationServer.xml:4 +msgid "Server that manages all translations." +msgstr "" + +#: doc/classes/TranslationServer.xml:7 +msgid "" +"Server that manages all translations. Translations can be set to it and " +"removed from it." +msgstr "" + +#: doc/classes/TranslationServer.xml:20 +msgid "Adds a [Translation] resource." +msgstr "" + +#: doc/classes/TranslationServer.xml:27 +msgid "Clears the server from all translations." +msgstr "" + +#: doc/classes/TranslationServer.xml:34 +msgid "Returns an Array of all loaded locales of the game." +msgstr "" + +#: doc/classes/TranslationServer.xml:41 +msgid "Returns the current locale of the game." +msgstr "" + +#: doc/classes/TranslationServer.xml:50 +msgid "" +"Returns a locale's language and its variant (e.g. [code]\"en_US\"[/code] " +"would return [code]\"English (United States)\"[/code])." +msgstr "" + +#: doc/classes/TranslationServer.xml:59 +msgid "Removes the given translation from the server." +msgstr "" + +#: doc/classes/TranslationServer.xml:68 +msgid "Sets the locale of the game." +msgstr "" + +#: doc/classes/TranslationServer.xml:77 +msgid "Returns the current locale's translation for the given message (key)." +msgstr "" + +#: doc/classes/Tree.xml:4 +msgid "Control to show a tree of items." +msgstr "" + +#: doc/classes/Tree.xml:7 +msgid "" +"This shows a tree of items that can be selected, expanded and collapsed. The " +"tree can have multiple columns with custom controls like text editing, " +"buttons and popups. It can be useful for structured displays and " +"interactions.\n" +"Trees are built via code, using [TreeItem] objects to create the structure. " +"They have a single root but multiple roots can be simulated if a dummy " +"hidden root is added.\n" +"[codeblock]\n" +"func _ready():\n" +" var tree = Tree.new()\n" +" var root = tree.create_item()\n" +" tree.set_hide_root(true)\n" +" var child1 = tree.create_item(root)\n" +" var child2 = tree.create_item(root)\n" +" var subchild1 = tree.create_item(child1)\n" +" subchild1.set_text(0, \"Subchild1\")\n" +"[/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]. You can use [method Object.free] on a [TreeItem] " +"to remove it from the [Tree]." +msgstr "" + +#: doc/classes/Tree.xml:28 +msgid "Returns [code]true[/code] if the column titles are being shown." +msgstr "" + +#: doc/classes/Tree.xml:35 +msgid "Clears the tree. This removes all items." +msgstr "" + +#: doc/classes/Tree.xml:46 +msgid "" +"Creates an item in the tree and adds it as a child of [code]parent[/code].\n" +"If [code]parent[/code] is [code]null[/code], the root item will be the " +"parent, or the new item will be the root itself if the tree is empty.\n" +"The new item will be the [code]idx[/code]th child of parent, or it will be " +"the last child if there are not enough siblings." +msgstr "" + +#: doc/classes/Tree.xml:55 +msgid "" +"Makes the currently focused cell visible.\n" +"This will scroll the tree if necessary. In [constant SELECT_ROW] mode, this " +"will not do horizontal scrolling, as all the cells in the selected row is " +"focused logically.\n" +"[b]Note:[/b] Despite the name of this method, the focus cursor itself is " +"only visible in [constant SELECT_MULTI] mode." +msgstr "" + +#: doc/classes/Tree.xml:66 +msgid "" +"Returns the column index at [code]position[/code], or -1 if no item is there." +msgstr "" + +#: doc/classes/Tree.xml:75 +msgid "Returns the column's title." +msgstr "" + +#: doc/classes/Tree.xml:84 +msgid "Returns the column's width in pixels." +msgstr "" + +#: doc/classes/Tree.xml:91 +msgid "" +"Returns the rectangle for custom popups. Helper to create custom cell " +"controls that display a popup. See [method TreeItem.set_cell_mode]." +msgstr "" + +#: doc/classes/Tree.xml:100 +msgid "" +"Returns the drop section at [code]position[/code], or -100 if no item is " +"there.\n" +"Values -1, 0, or 1 will be returned for the \"above item\", \"on item\", and " +"\"below item\" drop sections, respectively. See [enum DropModeFlags] for a " +"description of each drop section.\n" +"To get the item which the returned drop section is relative to, use [method " +"get_item_at_position]." +msgstr "" + +#: doc/classes/Tree.xml:109 +msgid "" +"Returns the currently edited item. This is only available for custom cell " +"mode." +msgstr "" + +#: doc/classes/Tree.xml:116 +msgid "" +"Returns the column for the currently edited item. This is only available for " +"custom cell mode." +msgstr "" + +#: doc/classes/Tree.xml:127 +msgid "" +"Returns the rectangle area for the specified item. If [code]column[/code] is " +"specified, only get the position and size of that column, otherwise get the " +"rectangle containing all columns." +msgstr "" + +#: doc/classes/Tree.xml:136 +msgid "" +"Returns the tree item at the specified position (relative to the tree origin " +"position)." +msgstr "" + +#: doc/classes/Tree.xml:145 +msgid "" +"Returns the next selected item after the given one, or [code]null[/code] if " +"the end is reached.\n" +"If [code]from[/code] is [code]null[/code], this returns the first selected " +"item." +msgstr "" + +#: doc/classes/Tree.xml:153 +msgid "Returns the last pressed button's index." +msgstr "" + +#: doc/classes/Tree.xml:160 +msgid "" +"Returns the tree's root item, or [code]null[/code] if the tree is empty." +msgstr "" + +#: doc/classes/Tree.xml:167 +msgid "Returns the current scrolling position." +msgstr "" + +#: doc/classes/Tree.xml:174 +msgid "" +"Returns the currently focused item, or [code]null[/code] if no item is " +"focused.\n" +"In [constant SELECT_ROW] and [constant SELECT_SINGLE] modes, the focused " +"item is same as the selected item. In [constant SELECT_MULTI] mode, the " +"focused item is the item under the focus cursor, not necessarily selected.\n" +"To get the currently selected item(s), use [method get_next_selected]." +msgstr "" + +#: doc/classes/Tree.xml:183 +msgid "" +"Returns the currently focused column, or -1 if no column is focused.\n" +"In [constant SELECT_SINGLE] mode, the focused column is the selected column. " +"In [constant SELECT_ROW] mode, the focused column is always 0 if any item is " +"selected. In [constant SELECT_MULTI] mode, the focused column is the column " +"under the focus cursor, and there are not necessarily any column selected.\n" +"To tell whether a column of an item is selected, use [method TreeItem." +"is_selected]." +msgstr "" + +#: doc/classes/Tree.xml:196 +msgid "" +"If [code]true[/code], the column will have the \"Expand\" flag of [Control]. " +"Columns that have the \"Expand\" flag will use their \"min_width\" in a " +"similar fashion to [member Control.size_flags_stretch_ratio]." +msgstr "" + +#: doc/classes/Tree.xml:207 +msgid "" +"Sets the minimum width of a column. Columns that have the \"Expand\" flag " +"will use their \"min_width\" in a similar fashion to [member Control." +"size_flags_stretch_ratio]." +msgstr "" + +#: doc/classes/Tree.xml:218 +msgid "Sets the title of a column." +msgstr "" + +#: doc/classes/Tree.xml:227 +msgid "If [code]true[/code], column titles are visible." +msgstr "" + +#: doc/classes/Tree.xml:233 +msgid "" +"If [code]true[/code], the currently selected cell may be selected again." +msgstr "" + +#: doc/classes/Tree.xml:236 +msgid "If [code]true[/code], a right mouse button click can select items." +msgstr "" + +#: doc/classes/Tree.xml:239 +msgid "The number of columns." +msgstr "" + +#: doc/classes/Tree.xml:242 +msgid "" +"The drop mode as an OR combination of flags. See [enum DropModeFlags] " +"constants. Once dropping is done, reverts to [constant DROP_MODE_DISABLED]. " +"Setting this during [method Control.can_drop_data] is recommended.\n" +"This controls the drop sections, i.e. the decision and drawing of possible " +"drop locations based on the mouse position." +msgstr "" + +#: doc/classes/Tree.xml:247 +msgid "If [code]true[/code], the folding arrow is hidden." +msgstr "" + +#: doc/classes/Tree.xml:250 +msgid "If [code]true[/code], the tree's root is hidden." +msgstr "" + +#: doc/classes/Tree.xml:254 +msgid "" +"Allows single or multiple selection. See the [enum SelectMode] constants." +msgstr "" + +#: doc/classes/Tree.xml:266 +msgid "" +"Emitted when a button on the tree was pressed (see [method TreeItem." +"add_button])." +msgstr "" + +#: doc/classes/Tree.xml:271 +msgid "Emitted when a cell is selected." +msgstr "" + +#: doc/classes/Tree.xml:278 +msgid "Emitted when a column's title is pressed." +msgstr "" + +#: doc/classes/Tree.xml:285 +msgid "" +"Emitted when a cell with the [constant TreeItem.CELL_MODE_CUSTOM] is clicked " +"to be edited." +msgstr "" + +#: doc/classes/Tree.xml:292 +msgid "" +"Emitted when the right mouse button is pressed in the empty space of the " +"tree." +msgstr "" + +#: doc/classes/Tree.xml:299 +msgid "" +"Emitted when the right mouse button is pressed if right mouse button " +"selection is active and the tree is empty." +msgstr "" + +#: doc/classes/Tree.xml:304 +msgid "Emitted when an item's label is double-clicked." +msgstr "" + +#: doc/classes/Tree.xml:311 +msgid "Emitted when an item is collapsed by a click on the folding arrow." +msgstr "" + +#: doc/classes/Tree.xml:316 +msgid "" +"Emitted when a custom button is pressed (i.e. in a [constant TreeItem." +"CELL_MODE_CUSTOM] mode cell)." +msgstr "" + +#: doc/classes/Tree.xml:321 +msgid "Emitted when an item's icon is double-clicked." +msgstr "" + +#: doc/classes/Tree.xml:326 +msgid "Emitted when an item is edited." +msgstr "" + +#: doc/classes/Tree.xml:331 +msgid "Emitted when an item is edited using the right mouse button." +msgstr "" + +#: doc/classes/Tree.xml:338 +msgid "Emitted when an item is selected with the right mouse button." +msgstr "" + +#: doc/classes/Tree.xml:343 +msgid "Emitted when an item is selected." +msgstr "" + +#: doc/classes/Tree.xml:354 +msgid "" +"Emitted instead of [code]item_selected[/code] if [code]select_mode[/code] is " +"[constant SELECT_MULTI]." +msgstr "" + +#: doc/classes/Tree.xml:359 +msgid "Emitted when a left mouse button click does not select any item." +msgstr "" + +#: doc/classes/Tree.xml:365 +msgid "" +"Allows selection of a single cell at a time. From the perspective of items, " +"only a single item is allowed to be selected. And there is only one column " +"selected in the selected item.\n" +"The focus cursor is always hidden in this mode, but it is positioned at the " +"current selection, making the currently selected item the currently focused " +"item." +msgstr "" + +#: doc/classes/Tree.xml:369 +msgid "" +"Allows selection of a single row at a time. From the perspective of items, " +"only a single items is allowed to be selected. And all the columns are " +"selected in the selected item.\n" +"The focus cursor is always hidden in this mode, but it is positioned at the " +"first column of the current selection, making the currently selected item " +"the currently focused item." +msgstr "" + +#: doc/classes/Tree.xml:373 +msgid "" +"Allows selection of multiple cells at the same time. From the perspective of " +"items, multiple items are allowed to be selected. And there can be multiple " +"columns selected in each selected item.\n" +"The focus cursor is visible in this mode, the item or column under the " +"cursor is not necessarily selected." +msgstr "" + +#: doc/classes/Tree.xml:377 +msgid "" +"Disables all drop sections, but still allows to detect the \"on item\" drop " +"section by [method get_drop_section_at_position].\n" +"[b]Note:[/b] This is the default flag, it has no effect when combined with " +"other flags." +msgstr "" + +#: doc/classes/Tree.xml:381 +msgid "" +"Enables the \"on item\" drop section. This drop section covers the entire " +"item.\n" +"When combined with [constant DROP_MODE_INBETWEEN], this drop section halves " +"the height and stays centered vertically." +msgstr "" + +#: doc/classes/Tree.xml:385 +msgid "" +"Enables \"above item\" and \"below item\" drop sections. The \"above item\" " +"drop section covers the top half of the item, and the \"below item\" drop " +"section covers the bottom half.\n" +"When combined with [constant DROP_MODE_ON_ITEM], these drop sections halves " +"the height and stays on top / bottom accordingly." +msgstr "" + +#: doc/classes/Tree.xml:391 +msgid "The arrow icon used when a foldable item is not collapsed." +msgstr "" + +#: doc/classes/Tree.xml:394 +msgid "The arrow icon used when a foldable item is collapsed." +msgstr "" + +#: doc/classes/Tree.xml:397 +msgid "" +"Default [StyleBox] for the [Tree], i.e. used when the control is not being " +"focused." +msgstr "" + +#: doc/classes/Tree.xml:400 +msgid "[StyleBox] used when the [Tree] is being focused." +msgstr "" + +#: doc/classes/Tree.xml:403 +msgid "The horizontal space between each button in a cell." +msgstr "" + +#: doc/classes/Tree.xml:406 +msgid "[StyleBox] used when a button in the tree is pressed." +msgstr "" + +#: doc/classes/Tree.xml:409 +msgid "" +"The check icon to display when the [constant TreeItem.CELL_MODE_CHECK] mode " +"cell is checked." +msgstr "" + +#: doc/classes/Tree.xml:412 +msgid "[StyleBox] used for the cursor, when the [Tree] is being focused." +msgstr "" + +#: doc/classes/Tree.xml:415 +msgid "[StyleBox] used for the cursor, when the [Tree] is not being focused." +msgstr "" + +#: doc/classes/Tree.xml:418 +msgid "" +"Default [StyleBox] for a [constant TreeItem.CELL_MODE_CUSTOM] mode cell." +msgstr "" + +#: doc/classes/Tree.xml:421 +msgid "" +"Text [Color] for a [constant TreeItem.CELL_MODE_CUSTOM] mode cell when it's " +"hovered." +msgstr "" + +#: doc/classes/Tree.xml:424 +msgid "" +"[StyleBox] for a [constant TreeItem.CELL_MODE_CUSTOM] mode cell when it's " +"hovered." +msgstr "" + +#: doc/classes/Tree.xml:427 +msgid "" +"[StyleBox] for a [constant TreeItem.CELL_MODE_CUSTOM] mode cell when it's " +"pressed." +msgstr "" + +#: doc/classes/Tree.xml:430 +msgid "" +"Draws the guidelines if not zero, this acts as a boolean. The guideline is a " +"horizontal line drawn at the bottom of each item." +msgstr "" + +#: doc/classes/Tree.xml:433 +msgid "" +"Draws the relationship lines if not zero, this acts as a boolean. " +"Relationship lines are drawn at the start of child items to show hierarchy." +msgstr "" + +#: doc/classes/Tree.xml:436 +msgid "" +"[Color] used to draw possible drop locations. See [enum DropModeFlags] " +"constants for further description of drop locations." +msgstr "" + +#: doc/classes/Tree.xml:448 +msgid "[Color] of the guideline." +msgstr "" + +#: doc/classes/Tree.xml:451 +msgid "" +"The horizontal space between item cells. This is also used as the margin at " +"the start of an item when folding is disabled." +msgstr "" + +#: doc/classes/Tree.xml:454 +msgid "" +"The horizontal margin at the start of an item. This is used when folding is " +"enabled for the item." +msgstr "" + +#: doc/classes/Tree.xml:457 +msgid "[Color] of the relationship lines." +msgstr "" + +#: doc/classes/Tree.xml:460 +msgid "" +"The maximum distance between the mouse cursor and the control's border to " +"trigger border scrolling when dragging." +msgstr "" + +#: doc/classes/Tree.xml:463 +msgid "The speed of border scrolling." +msgstr "" + +#: doc/classes/Tree.xml:466 +msgid "" +"The arrow icon to display for the [constant TreeItem.CELL_MODE_RANGE] mode " +"cell." +msgstr "" + +#: doc/classes/Tree.xml:469 +msgid "" +"[StyleBox] for the selected items, used when the [Tree] is not being focused." +msgstr "" + +#: doc/classes/Tree.xml:472 +msgid "" +"[StyleBox] for the selected items, used when the [Tree] is being focused." +msgstr "" + +#: doc/classes/Tree.xml:475 +msgid "Default text [Color] of the title button." +msgstr "" + +#: doc/classes/Tree.xml:478 +msgid "[Font] of the title button's text." +msgstr "" + +#: doc/classes/Tree.xml:481 +msgid "[StyleBox] used when the title button is being hovered." +msgstr "" + +#: doc/classes/Tree.xml:484 +msgid "Default [StyleBox] for the title button." +msgstr "" + +#: doc/classes/Tree.xml:487 +msgid "[StyleBox] used when the title button is being pressed." +msgstr "" + +#: doc/classes/Tree.xml:490 +msgid "" +"The check icon to display when the [constant TreeItem.CELL_MODE_CHECK] mode " +"cell is unchecked." +msgstr "" + +#: doc/classes/Tree.xml:493 +msgid "" +"The updown arrow icon to display for the [constant TreeItem.CELL_MODE_RANGE] " +"mode cell." +msgstr "" + +#: doc/classes/Tree.xml:496 +msgid "" +"The vertical padding inside each item, i.e. the distance between the item's " +"content and top/bottom border." +msgstr "" + +#: doc/classes/TreeItem.xml:4 +msgid "Control for a single item inside a [Tree]." +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.\n" +"You can remove a [TreeItem] by using [method Object.free]." +msgstr "" + +#: 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 " +"calling other methods. If not specified, the next available index is used, " +"which may be retrieved by calling [method get_button_count] immediately " +"after this method. Optionally, the button can be [code]disabled[/code] and " +"have a [code]tooltip[/code]." +msgstr "" + +#: 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:45 +msgid "Resets the background color for the given column to default." +msgstr "" + +#: doc/classes/TreeItem.xml:54 +msgid "Resets the color for the given column to default." +msgstr "" + +#: doc/classes/TreeItem.xml:63 +msgid "Deselects the given column." +msgstr "" + +#: 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:85 +msgid "" +"Returns the [Texture2D] of the button at index [code]button_idx[/code] in " +"column [code]column[/code]." +msgstr "" + +#: 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: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:114 +msgid "Returns the column's cell mode." +msgstr "" + +#: doc/classes/TreeItem.xml:121 +msgid "Returns the TreeItem's child items." +msgstr "" + +#: doc/classes/TreeItem.xml:130 +msgid "Returns the custom background color of column [code]column[/code]." +msgstr "" + +#: doc/classes/TreeItem.xml:139 +msgid "Returns the custom color of column [code]column[/code]." +msgstr "" + +#: doc/classes/TreeItem.xml:148 +msgid "Returns [code]true[/code] if [code]expand_right[/code] is set." +msgstr "" + +#: doc/classes/TreeItem.xml:157 +msgid "Returns the given column's icon [Texture2D]. Error if no icon is set." +msgstr "" + +#: doc/classes/TreeItem.xml:166 +msgid "Returns the column's icon's maximum width." +msgstr "" + +#: doc/classes/TreeItem.xml:175 +msgid "Returns the [Color] modulating the column's icon." +msgstr "" + +#: doc/classes/TreeItem.xml:184 +msgid "Returns the icon [Texture2D] region as [Rect2]." +msgstr "" + +#: doc/classes/TreeItem.xml:199 +msgid "Returns the next TreeItem in the tree." +msgstr "" + +#: 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 " +"visible element in the tree when called on the last visible element, " +"otherwise it returns [code]null[/code]." +msgstr "" + +#: doc/classes/TreeItem.xml:216 +msgid "Returns the parent TreeItem." +msgstr "" + +#: doc/classes/TreeItem.xml:223 +msgid "Returns the previous TreeItem in the tree." +msgstr "" + +#: 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 " +"visible element in the tree when called on the first visible element, " +"otherwise it returns [code]null[/code]." +msgstr "" + +#: doc/classes/TreeItem.xml:258 +msgid "Returns the given column's text." +msgstr "" + +#: doc/classes/TreeItem.xml:267 +msgid "Returns the given column's text alignment." +msgstr "" + +#: doc/classes/TreeItem.xml:276 +msgid "Returns the given column's tooltip." +msgstr "" + +#: 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:296 +msgid "Returns [code]true[/code] if the given column is checked." +msgstr "" + +#: doc/classes/TreeItem.xml:313 +msgid "Returns [code]true[/code] if column [code]column[/code] is editable." +msgstr "" + +#: doc/classes/TreeItem.xml:322 +msgid "Returns [code]true[/code] if column [code]column[/code] is selectable." +msgstr "" + +#: doc/classes/TreeItem.xml:331 +msgid "Returns [code]true[/code] if column [code]column[/code] is selected." +msgstr "" + +#: doc/classes/TreeItem.xml:338 +msgid "Moves this TreeItem to the bottom in the [Tree] hierarchy." +msgstr "" + +#: doc/classes/TreeItem.xml:345 +msgid "Moves this TreeItem to the top in the [Tree] hierarchy." +msgstr "" + +#: 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:363 +msgid "Selects the column [code]column[/code]." +msgstr "" + +#: 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: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:400 +msgid "" +"Sets the given column's cell mode to [code]mode[/code]. See [enum " +"TreeCellMode] constants." +msgstr "" + +#: doc/classes/TreeItem.xml:411 +msgid "If [code]true[/code], the column [code]column[/code] is checked." +msgstr "" + +#: 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:445 +msgid "Sets the given column's custom color." +msgstr "" + +#: doc/classes/TreeItem.xml:458 +msgid "" +"Sets the given column's custom draw callback to [code]callback[/code] method " +"on [code]object[/code].\n" +"The [code]callback[/code] should accept two arguments: the [TreeItem] that " +"is drawn and its position and size as a [Rect2]." +msgstr "" + +#: doc/classes/TreeItem.xml:470 +msgid "If [code]true[/code], column [code]column[/code] is editable." +msgstr "" + +#: doc/classes/TreeItem.xml:481 +msgid "" +"If [code]true[/code], column [code]column[/code] is expanded to the right." +msgstr "" + +#: doc/classes/TreeItem.xml:492 +msgid "Sets the given column's icon [Texture2D]." +msgstr "" + +#: doc/classes/TreeItem.xml:503 +msgid "Sets the given column's icon's maximum width." +msgstr "" + +#: doc/classes/TreeItem.xml:514 +msgid "Modulates the given column's icon with [code]modulate[/code]." +msgstr "" + +#: doc/classes/TreeItem.xml:525 +msgid "Sets the given column's icon's texture region." +msgstr "" + +#: doc/classes/TreeItem.xml:572 +msgid "If [code]true[/code], the given column is selectable." +msgstr "" + +#: doc/classes/TreeItem.xml:593 +msgid "" +"Sets the given column's text alignment. See [enum TextAlign] for possible " +"values." +msgstr "" + +#: doc/classes/TreeItem.xml:604 +msgid "Sets the given column's tooltip text." +msgstr "" + +#: doc/classes/TreeItem.xml:610 +msgid "If [code]true[/code], the TreeItem is collapsed." +msgstr "" + +#: doc/classes/TreeItem.xml:613 +msgid "The custom minimum height." +msgstr "" + +#: doc/classes/TreeItem.xml:616 +msgid "If [code]true[/code], folding is disabled for this TreeItem." +msgstr "" + +#: doc/classes/TreeItem.xml:621 +msgid "Cell contains a string." +msgstr "" + +#: doc/classes/TreeItem.xml:624 +msgid "Cell can be checked." +msgstr "" + +#: doc/classes/TreeItem.xml:627 +msgid "Cell contains a range." +msgstr "" + +#: doc/classes/TreeItem.xml:630 +msgid "Cell contains an icon." +msgstr "" + +#: doc/classes/TreeItem.xml:635 +msgid "Align text to the left. See [code]set_text_align()[/code]." +msgstr "" + +#: doc/classes/TreeItem.xml:638 +msgid "Center text. See [code]set_text_align()[/code]." +msgstr "" + +#: doc/classes/TreeItem.xml:641 +msgid "Align text to the right. See [code]set_text_align()[/code]." +msgstr "" + +#: doc/classes/TriangleMesh.xml:4 +msgid "Internal mesh type." +msgstr "" + +#: doc/classes/TriangleMesh.xml:7 +msgid "Mesh type used internally for collision calculations." +msgstr "" + +#: doc/classes/Tween.xml:4 +msgid "Smoothly animates a node's properties over time." +msgstr "" + +#: doc/classes/Tween.xml:7 +msgid "" +"Tweens are useful for animations requiring a numerical property to be " +"interpolated over a range of values. The name [i]tween[/i] comes from [i]in-" +"betweening[/i], an animation technique where you specify [i]keyframes[/i] " +"and the computer interpolates the frames that appear between them.\n" +"[Tween] is more suited than [AnimationPlayer] for animations where you don't " +"know the final values in advance. For example, interpolating a dynamically-" +"chosen camera zoom value is best done with a [Tween] node; it would be " +"difficult to do the same thing with an [AnimationPlayer] node.\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" +" Vector2(0, 0), Vector2(100, 100), 1,\n" +" Tween.TRANS_LINEAR, Tween.EASE_IN_OUT)\n" +"tween.start()\n" +"[/codeblock]\n" +"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.\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 [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: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 " +"[code]initial_val[/code] for [code]duration[/code] seconds, [code]delay[/" +"code] later. Methods are called with consecutive values.\n" +"Use [enum TransitionType] for [code]trans_type[/code] and [enum EaseType] " +"for [code]ease_type[/code] parameters. These values control the timing and " +"direction of the interpolation. See the class description for more " +"information." +msgstr "" + +#: 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 " +"[code]initial_val[/code] for [code]duration[/code] seconds, [code]delay[/" +"code] seconds later.\n" +"Use [enum TransitionType] for [code]trans_type[/code] and [enum EaseType] " +"for [code]ease_type[/code] parameters. These values control the timing and " +"direction of the interpolation. See the class description for more " +"information." +msgstr "" + +#: 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: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:126 +msgid "" +"Calls [code]callback[/code] of [code]object[/code] after [code]duration[/" +"code] on the main thread (similar to [method Object.call_deferred]). " +"[code]arg1[/code]-[code]arg5[/code] are arguments to be passed to the " +"callback." +msgstr "" + +#: 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, " +"[code]delay[/code] seconds later. Methods are called with consecutive " +"values.\n" +"Use [enum TransitionType] for [code]trans_type[/code] and [enum EaseType] " +"for [code]ease_type[/code] parameters. These values control the timing and " +"direction of the interpolation. See the class description for more " +"information." +msgstr "" + +#: 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] " +"seconds, [code]delay[/code] seconds later. Setting the initial value to " +"[code]null[/code] uses the current value of the property.\n" +"Use [enum TransitionType] for [code]trans_type[/code] and [enum EaseType] " +"for [code]ease_type[/code] parameters. These values control the timing and " +"direction of the interpolation. See the class description for more " +"information." +msgstr "" + +#: 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: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:200 +msgid "Stops animation and removes all tweens." +msgstr "" + +#: 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:218 +msgid "" +"Resets all tweens to their initial values (the ones given, not those before " +"the tween)." +msgstr "" + +#: 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:236 +msgid "Continues animating all stopped tweens." +msgstr "" + +#: doc/classes/Tween.xml:245 +msgid "Sets the interpolation to the given [code]time[/code] in seconds." +msgstr "" + +#: doc/classes/Tween.xml:254 +msgid "" +"Activates/deactivates the tween. See also [method stop_all] and [method " +"resume_all]." +msgstr "" + +#: doc/classes/Tween.xml:261 +msgid "Starts the tween. You can define animations both before and after this." +msgstr "" + +#: 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:279 +msgid "Stops animating all tweens." +msgstr "" + +#: 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[/" +"code] seconds, [code]delay[/code] seconds later. Methods are animated by " +"calling them with consecutive values.\n" +"Use [enum TransitionType] for [code]trans_type[/code] and [enum EaseType] " +"for [code]ease_type[/code] parameters. These values control the timing and " +"direction of the interpolation. See the class description for more " +"information." +msgstr "" + +#: 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 " +"[code]final_val[/code] for [code]duration[/code] seconds, [code]delay[/code] " +"seconds later.\n" +"Use [enum TransitionType] for [code]trans_type[/code] and [enum EaseType] " +"for [code]ease_type[/code] parameters. These values control the timing and " +"direction of the interpolation. See the class description for more " +"information." +msgstr "" + +#: doc/classes/Tween.xml:338 +msgid "Returns the current time of the tween." +msgstr "" + +#: doc/classes/Tween.xml:344 +msgid "The tween's animation process thread. See [enum TweenProcessMode]." +msgstr "" + +#: 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[/" +"code] for half of the normal speed. A value of [code]0[/code] pauses the " +"animation, but see also [method set_active] or [method stop_all] for this." +msgstr "" + +#: doc/classes/Tween.xml:350 +msgid "If [code]true[/code], the tween loops." +msgstr "" + +#: doc/classes/Tween.xml:356 +msgid "Emitted when all processes in a tween end." +msgstr "" + +#: doc/classes/Tween.xml:365 +msgid "Emitted when a tween ends." +msgstr "" + +#: doc/classes/Tween.xml:374 +msgid "Emitted when a tween starts." +msgstr "" + +#: doc/classes/Tween.xml:387 +msgid "Emitted at each step of the animation." +msgstr "" + +#: doc/classes/Tween.xml:393 +msgid "The tween updates with the [code]_physics_process[/code] callback." +msgstr "" + +#: doc/classes/Tween.xml:396 +msgid "The tween updates with the [code]_process[/code] callback." +msgstr "" + +#: doc/classes/Tween.xml:399 +msgid "The animation is interpolated linearly." +msgstr "" + +#: doc/classes/Tween.xml:402 +msgid "The animation is interpolated using a sine function." +msgstr "" + +#: doc/classes/Tween.xml:405 +msgid "" +"The animation is interpolated with a quintic (to the power of 5) function." +msgstr "" + +#: doc/classes/Tween.xml:408 +msgid "" +"The animation is interpolated with a quartic (to the power of 4) function." +msgstr "" + +#: doc/classes/Tween.xml:411 +msgid "" +"The animation is interpolated with a quadratic (to the power of 2) function." +msgstr "" + +#: doc/classes/Tween.xml:414 +msgid "" +"The animation is interpolated with an exponential (to the power of x) " +"function." +msgstr "" + +#: doc/classes/Tween.xml:417 +msgid "" +"The animation is interpolated with elasticity, wiggling around the edges." +msgstr "" + +#: doc/classes/Tween.xml:420 +msgid "" +"The animation is interpolated with a cubic (to the power of 3) function." +msgstr "" + +#: doc/classes/Tween.xml:423 +msgid "The animation is interpolated with a function using square roots." +msgstr "" + +#: doc/classes/Tween.xml:426 +msgid "The animation is interpolated by bouncing at the end." +msgstr "" + +#: doc/classes/Tween.xml:429 +msgid "The animation is interpolated backing out at ends." +msgstr "" + +#: doc/classes/Tween.xml:432 +msgid "The interpolation starts slowly and speeds up towards the end." +msgstr "" + +#: doc/classes/Tween.xml:435 +msgid "The interpolation starts quickly and slows down towards the end." +msgstr "" + +#: 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:441 +msgid "" +"A combination of [constant EASE_IN] and [constant EASE_OUT]. The " +"interpolation is fastest at both ends." +msgstr "" + +#: doc/classes/UDPServer.xml:4 +msgid "Helper class to implement a UDP server." +msgstr "" + +#: doc/classes/UDPServer.xml:7 +msgid "" +"A simple server that opens a UDP socket and returns connected " +"[PacketPeerUDP] upon receiving new packets. See also [method PacketPeerUDP." +"connect_to_host].\n" +"Below a small example of how it can be used:\n" +"[codeblock]\n" +"# server.gd\n" +"extends Node\n" +"\n" +"var server := UDPServer.new()\n" +"var peers = []\n" +"\n" +"func _ready():\n" +" server.listen(4242)\n" +"\n" +"func _process(delta):\n" +" if server.is_connection_available():\n" +" var peer : PacketPeerUDP = server.take_connection()\n" +" var pkt = peer.get_packet()\n" +" print(\"Accepted peer: %s:%s\" % [peer.get_packet_ip(), peer." +"get_packet_port()])\n" +" print(\"Received data: %s\" % [pkt.get_string_from_utf8()])\n" +" # Reply so it knows we received the message.\n" +" peer.put_packet(pkt)\n" +" # Keep a reference so we can keep contacting the remote peer.\n" +" peers.append(peer)\n" +"\n" +" for i in range(0, peers.size()):\n" +" pass # Do something with the connected peers.\n" +"\n" +"[/codeblock]\n" +"[codeblock]\n" +"# client.gd\n" +"extends Node\n" +"\n" +"var udp := PacketPeerUDP.new()\n" +"var connected = false\n" +"\n" +"func _ready():\n" +" udp.connect_to_host(\"127.0.0.1\", 4242)\n" +"\n" +"func _process(delta):\n" +" if !connected:\n" +" # Try to contact server\n" +" udp.put_packet(\"The answer is... 42!\".to_utf8())\n" +" if udp.get_available_packet_count() > 0:\n" +" print(\"Connected: %s\" % udp.get_packet().get_string_from_utf8())\n" +" connected = true\n" +"[/codeblock]" +msgstr "" + +#: doc/classes/UDPServer.xml:60 +msgid "" +"Returns [code]true[/code] if a packet with a new address/port combination is " +"received on the socket." +msgstr "" + +#: doc/classes/UDPServer.xml:67 +msgid "" +"Returns [code]true[/code] if the socket is open and listening on a port." +msgstr "" + +#: doc/classes/UDPServer.xml:78 +msgid "" +"Starts the server by opening a UDP socket listening on the given port. You " +"can optionally specify a [code]bind_address[/code] to only listen for " +"packets sent to that address. See also [method PacketPeerUDP.listen]." +msgstr "" + +#: doc/classes/UDPServer.xml:85 +msgid "" +"Stops the server, closing the UDP socket if open. Will not disconnect any " +"connected [PacketPeerUDP]." +msgstr "" + +#: doc/classes/UDPServer.xml:92 +msgid "" +"Returns a [PacketPeerUDP] connected to the address/port combination of the " +"first packet in queue. Will return [code]null[/code] if no packet is in " +"queue. See also [method PacketPeerUDP.connect_to_host]." +msgstr "" + +#: doc/classes/UndoRedo.xml:4 +msgid "Helper to manage undo/redo operations in the editor or custom tools." +msgstr "" + +#: doc/classes/UndoRedo.xml:7 +msgid "" +"Helper to manage undo/redo operations in the editor or custom tools. It " +"works by registering methods and property changes inside \"actions\".\n" +"Common behavior is to create an action, then add do/undo calls to functions " +"or property changes, then committing the action.\n" +"Here's an example on how to add an action to the Godot editor's own " +"[UndoRedo], from a plugin:\n" +"[codeblock]\n" +"var undo_redo = get_undo_redo() # Method of EditorPlugin.\n" +"\n" +"func do_something():\n" +" pass # Put your code here.\n" +"\n" +"func undo_something():\n" +" pass # Put here the code that reverts what's done by " +"\"do_something()\".\n" +"\n" +"func _on_MyButton_pressed():\n" +" var node = get_node(\"MyNode2D\")\n" +" undo_redo.create_action(\"Move the node\")\n" +" undo_redo.add_do_method(self, \"do_something\")\n" +" undo_redo.add_undo_method(self, \"undo_something\")\n" +" undo_redo.add_do_property(node, \"position\", Vector2(100,100))\n" +" undo_redo.add_undo_property(node, \"position\", node.position)\n" +" undo_redo.commit_action()\n" +"[/codeblock]\n" +"[method create_action], [method add_do_method], [method add_undo_method], " +"[method add_do_property], [method add_undo_property], and [method " +"commit_action] should be called one after the other, like in the example. " +"Not doing so could lead to crashes.\n" +"If you don't need to register a method, you can leave [method add_do_method] " +"and [method add_undo_method] out; the same goes for properties. You can also " +"register more than one method/property." +msgstr "" + +#: doc/classes/UndoRedo.xml:42 +msgid "Register a method that will be called when the action is committed." +msgstr "" + +#: doc/classes/UndoRedo.xml:55 +msgid "Register a property value change for \"do\"." +msgstr "" + +#: doc/classes/UndoRedo.xml:64 +msgid "" +"Register a reference for \"do\" that will be erased if the \"do\" history is " +"lost. This is useful mostly for new nodes created for the \"do\" call. Do " +"not use for resources." +msgstr "" + +#: doc/classes/UndoRedo.xml:75 +msgid "Register a method that will be called when the action is undone." +msgstr "" + +#: doc/classes/UndoRedo.xml:88 +msgid "Register a property value change for \"undo\"." +msgstr "" + +#: doc/classes/UndoRedo.xml:97 +msgid "" +"Register a reference for \"undo\" that will be erased if the \"undo\" " +"history is lost. This is useful mostly for nodes removed with the \"do\" " +"call (not the \"undo\" call!)." +msgstr "" + +#: doc/classes/UndoRedo.xml:106 +msgid "" +"Clear the undo/redo history and associated references.\n" +"Passing [code]false[/code] to [code]increase_version[/code] will prevent the " +"version number to be increased from this." +msgstr "" + +#: doc/classes/UndoRedo.xml:114 +msgid "" +"Commit the action. All \"do\" methods/properties are called/set when this " +"function is called." +msgstr "" + +#: doc/classes/UndoRedo.xml:125 +msgid "" +"Create a new action. After this is called, do all your calls to [method " +"add_do_method], [method add_undo_method], [method add_do_property], and " +"[method add_undo_property], then commit the action with [method " +"commit_action].\n" +"The way actions are merged is dictated by the [code]merge_mode[/code] " +"argument. See [enum MergeMode] for details." +msgstr "" + +#: doc/classes/UndoRedo.xml:133 +msgid "Gets the name of the current action." +msgstr "" + +#: doc/classes/UndoRedo.xml:140 +msgid "" +"Gets the version. Every time a new action is committed, the [UndoRedo]'s " +"version number is increased automatically.\n" +"This is useful mostly to check if something changed from a saved version." +msgstr "" + +#: doc/classes/UndoRedo.xml:148 +msgid "Returns [code]true[/code] if a \"redo\" action is available." +msgstr "" + +#: doc/classes/UndoRedo.xml:155 +msgid "Returns [code]true[/code] if an \"undo\" action is available." +msgstr "" + +#: doc/classes/UndoRedo.xml:162 +msgid "" +"Returns [code]true[/code] if the [UndoRedo] is currently committing the " +"action, i.e. running its \"do\" method or property change (see [method " +"commit_action])." +msgstr "" + +#: doc/classes/UndoRedo.xml:169 +msgid "Redo the last action." +msgstr "" + +#: doc/classes/UndoRedo.xml:176 +msgid "Undo the last action." +msgstr "" + +#: doc/classes/UndoRedo.xml:183 +msgid "Called when [method undo] or [method redo] was called." +msgstr "" + +#: doc/classes/UndoRedo.xml:189 +msgid "Makes \"do\"/\"undo\" operations stay in separate actions." +msgstr "" + +#: doc/classes/UndoRedo.xml:192 +msgid "" +"Makes so that the action's \"do\" operation is from the first action created " +"and the \"undo\" operation is from the last subsequent action with the same " +"name." +msgstr "" + +#: doc/classes/UndoRedo.xml:195 +msgid "Makes subsequent actions with the same name be merged into one." +msgstr "" + +#: modules/upnp/doc_classes/UPNP.xml:4 +msgid "UPNP network functions." +msgstr "" + +#: modules/upnp/doc_classes/UPNP.xml:7 +msgid "" +"Provides UPNP functionality to discover [UPNPDevice]s on the local network " +"and execute commands on them, like managing port mappings (port forwarding) " +"and querying the local and remote network IP address. Note that methods on " +"this class are synchronous and block the calling thread.\n" +"To forward a specific port:\n" +"[codeblock]\n" +"const PORT = 7777\n" +"var upnp = UPNP.new()\n" +"upnp.discover(2000, 2, \"InternetGatewayDevice\")\n" +"upnp.add_port_mapping(port)\n" +"[/codeblock]\n" +"To close a specific port (e.g. after you have finished using it):\n" +"[codeblock]\n" +"upnp.delete_port_mapping(port)\n" +"[/codeblock]" +msgstr "" + +#: modules/upnp/doc_classes/UPNP.xml:29 +msgid "Adds the given [UPNPDevice] to the list of discovered devices." +msgstr "" + +#: modules/upnp/doc_classes/UPNP.xml:46 +msgid "" +"Adds a mapping to forward the external [code]port[/code] (between 1 and " +"65535) on the default gateway (see [method get_gateway]) to the " +"[code]internal_port[/code] on the local machine for the given protocol " +"[code]proto[/code] (either [code]TCP[/code] or [code]UDP[/code], with UDP " +"being the default). If a port mapping for the given port and protocol " +"combination already exists on that gateway device, this method tries to " +"overwrite it. If that is not desired, you can retrieve the gateway manually " +"with [method get_gateway] and call [method add_port_mapping] on it, if any.\n" +"If [code]internal_port[/code] is [code]0[/code] (the default), the same port " +"number is used for both the external and the internal port (the [code]port[/" +"code] value).\n" +"The description ([code]desc[/code]) is shown in some router UIs and can be " +"used to point out which application added the mapping. The mapping's lease " +"duration can be limited by specifying a [code]duration[/code] (in seconds). " +"However, some routers are incompatible with one or both of these, so use " +"with caution and add fallback logic in case of errors to retry without them " +"if in doubt.\n" +"See [enum UPNPResult] for possible return values." +msgstr "" + +#: modules/upnp/doc_classes/UPNP.xml:56 +msgid "Clears the list of discovered devices." +msgstr "" + +#: modules/upnp/doc_classes/UPNP.xml:67 +msgid "" +"Deletes the port mapping for the given port and protocol combination on the " +"default gateway (see [method get_gateway]) if one exists. [code]port[/code] " +"must be a valid port between 1 and 65535, [code]proto[/code] can be either " +"[code]TCP[/code] or [code]UDP[/code]. See [enum UPNPResult] for possible " +"return values." +msgstr "" + +#: modules/upnp/doc_classes/UPNP.xml:80 +msgid "" +"Discovers local [UPNPDevice]s. Clears the list of previously discovered " +"devices.\n" +"Filters for IGD (InternetGatewayDevice) type devices by default, as those " +"manage port forwarding. [code]timeout[/code] is the time to wait for " +"responses in milliseconds. [code]ttl[/code] is the time-to-live; only touch " +"this if you know what you're doing.\n" +"See [enum UPNPResult] for possible return values." +msgstr "" + +#: modules/upnp/doc_classes/UPNP.xml:91 +msgid "Returns the [UPNPDevice] at the given [code]index[/code]." +msgstr "" + +#: modules/upnp/doc_classes/UPNP.xml:98 +msgid "Returns the number of discovered [UPNPDevice]s." +msgstr "" + +#: modules/upnp/doc_classes/UPNP.xml:105 +msgid "" +"Returns the default gateway. That is the first discovered [UPNPDevice] that " +"is also a valid IGD (InternetGatewayDevice)." +msgstr "" + +#: modules/upnp/doc_classes/UPNP.xml:112 +msgid "" +"Returns the external [IP] address of the default gateway (see [method " +"get_gateway]) as string. Returns an empty string on error." +msgstr "" + +#: modules/upnp/doc_classes/UPNP.xml:121 +msgid "" +"Removes the device at [code]index[/code] from the list of discovered devices." +msgstr "" + +#: modules/upnp/doc_classes/UPNP.xml:132 +msgid "" +"Sets the device at [code]index[/code] from the list of discovered devices to " +"[code]device[/code]." +msgstr "" + +#: modules/upnp/doc_classes/UPNP.xml:138 +msgid "If [code]true[/code], IPv6 is used for [UPNPDevice] discovery." +msgstr "" + +#: modules/upnp/doc_classes/UPNP.xml:141 +msgid "" +"If [code]0[/code], the local port to use for discovery is chosen " +"automatically by the system. If [code]1[/code], discovery will be done from " +"the source port 1900 (same as destination port). Otherwise, the value will " +"be used as the port." +msgstr "" + +#: modules/upnp/doc_classes/UPNP.xml:144 +msgid "" +"Multicast interface to use for discovery. Uses the default multicast " +"interface if empty." +msgstr "" + +#: modules/upnp/doc_classes/UPNP.xml:149 +msgid "UPNP command or discovery was successful." +msgstr "" + +#: modules/upnp/doc_classes/UPNP.xml:152 +msgid "" +"Not authorized to use the command on the [UPNPDevice]. May be returned when " +"the user disabled UPNP on their router." +msgstr "" + +#: modules/upnp/doc_classes/UPNP.xml:155 +msgid "" +"No port mapping was found for the given port, protocol combination on the " +"given [UPNPDevice]." +msgstr "" + +#: modules/upnp/doc_classes/UPNP.xml:158 +msgid "Inconsistent parameters." +msgstr "" + +#: modules/upnp/doc_classes/UPNP.xml:161 +msgid "" +"No such entry in array. May be returned if a given port, protocol " +"combination is not found on an [UPNPDevice]." +msgstr "" + +#: modules/upnp/doc_classes/UPNP.xml:164 +msgid "The action failed." +msgstr "" + +#: modules/upnp/doc_classes/UPNP.xml:167 +msgid "" +"The [UPNPDevice] does not allow wildcard values for the source IP address." +msgstr "" + +#: modules/upnp/doc_classes/UPNP.xml:170 +msgid "The [UPNPDevice] does not allow wildcard values for the external port." +msgstr "" + +#: modules/upnp/doc_classes/UPNP.xml:173 +msgid "The [UPNPDevice] does not allow wildcard values for the internal port." +msgstr "" + +#: modules/upnp/doc_classes/UPNP.xml:176 +msgid "The remote host value must be a wildcard." +msgstr "" + +#: modules/upnp/doc_classes/UPNP.xml:179 +msgid "The external port value must be a wildcard." +msgstr "" + +#: modules/upnp/doc_classes/UPNP.xml:182 +msgid "" +"No port maps are available. May also be returned if port mapping " +"functionality is not available." +msgstr "" + +#: modules/upnp/doc_classes/UPNP.xml:185 +msgid "" +"Conflict with other mechanism. May be returned instead of [constant " +"UPNP_RESULT_CONFLICT_WITH_OTHER_MAPPING] if a port mapping conflicts with an " +"existing one." +msgstr "" + +#: modules/upnp/doc_classes/UPNP.xml:188 +msgid "Conflict with an existing port mapping." +msgstr "" + +#: modules/upnp/doc_classes/UPNP.xml:191 +msgid "External and internal port values must be the same." +msgstr "" + +#: modules/upnp/doc_classes/UPNP.xml:194 +msgid "" +"Only permanent leases are supported. Do not use the [code]duration[/code] " +"parameter when adding port mappings." +msgstr "" + +#: modules/upnp/doc_classes/UPNP.xml:197 +msgid "Invalid gateway." +msgstr "" + +#: modules/upnp/doc_classes/UPNP.xml:200 +msgid "Invalid port." +msgstr "" + +#: modules/upnp/doc_classes/UPNP.xml:203 +msgid "Invalid protocol." +msgstr "" + +#: modules/upnp/doc_classes/UPNP.xml:206 +msgid "Invalid duration." +msgstr "" + +#: modules/upnp/doc_classes/UPNP.xml:209 +msgid "Invalid arguments." +msgstr "" + +#: modules/upnp/doc_classes/UPNP.xml:212 +msgid "Invalid response." +msgstr "" + +#: modules/upnp/doc_classes/UPNP.xml:215 +msgid "Invalid parameter." +msgstr "" + +#: modules/upnp/doc_classes/UPNP.xml:218 +#: modules/upnp/doc_classes/UPNPDevice.xml:80 +msgid "HTTP error." +msgstr "" + +#: modules/upnp/doc_classes/UPNP.xml:221 +msgid "Socket error." +msgstr "" + +#: modules/upnp/doc_classes/UPNP.xml:224 +msgid "Error allocating memory." +msgstr "" + +#: modules/upnp/doc_classes/UPNP.xml:227 +msgid "" +"No gateway available. You may need to call [method discover] first, or " +"discovery didn't detect any valid IGDs (InternetGatewayDevices)." +msgstr "" + +#: modules/upnp/doc_classes/UPNP.xml:230 +msgid "" +"No devices available. You may need to call [method discover] first, or " +"discovery didn't detect any valid [UPNPDevice]s." +msgstr "" + +#: modules/upnp/doc_classes/UPNP.xml:233 +#: modules/upnp/doc_classes/UPNPDevice.xml:104 +msgid "Unknown error." +msgstr "" + +#: modules/upnp/doc_classes/UPNPDevice.xml:4 +msgid "UPNP device." +msgstr "" + +#: modules/upnp/doc_classes/UPNPDevice.xml:7 +msgid "" +"UPNP device. See [UPNP] for UPNP discovery and utility functions. Provides " +"low-level access to UPNP control commands. Allows to manage port mappings " +"(port forwarding) and to query network information of the device (like local " +"and external IP address and status). Note that methods on this class are " +"synchronous and block the calling thread." +msgstr "" + +#: modules/upnp/doc_classes/UPNPDevice.xml:26 +msgid "" +"Adds a port mapping to forward the given external port on this [UPNPDevice] " +"for the given protocol to the local machine. See [method UPNP." +"add_port_mapping]." +msgstr "" + +#: modules/upnp/doc_classes/UPNPDevice.xml:37 +msgid "" +"Deletes the port mapping identified by the given port and protocol " +"combination on this device. See [method UPNP.delete_port_mapping]." +msgstr "" + +#: modules/upnp/doc_classes/UPNPDevice.xml:44 +msgid "" +"Returns [code]true[/code] if this is a valid IGD (InternetGatewayDevice) " +"which potentially supports port forwarding." +msgstr "" + +#: modules/upnp/doc_classes/UPNPDevice.xml:51 +msgid "" +"Returns the external IP address of this [UPNPDevice] or an empty string." +msgstr "" + +#: modules/upnp/doc_classes/UPNPDevice.xml:57 +msgid "URL to the device description." +msgstr "" + +#: modules/upnp/doc_classes/UPNPDevice.xml:60 +msgid "IDG control URL." +msgstr "" + +#: modules/upnp/doc_classes/UPNPDevice.xml:63 +msgid "" +"Address of the local machine in the network connecting it to this " +"[UPNPDevice]." +msgstr "" + +#: modules/upnp/doc_classes/UPNPDevice.xml:66 +msgid "IGD service type." +msgstr "" + +#: modules/upnp/doc_classes/UPNPDevice.xml:69 +msgid "IGD status. See [enum IGDStatus]." +msgstr "" + +#: modules/upnp/doc_classes/UPNPDevice.xml:72 +msgid "Service type." +msgstr "" + +#: modules/upnp/doc_classes/UPNPDevice.xml:77 +msgid "OK." +msgstr "" + +#: modules/upnp/doc_classes/UPNPDevice.xml:83 +msgid "Empty HTTP response." +msgstr "" + +#: modules/upnp/doc_classes/UPNPDevice.xml:86 +msgid "Returned response contained no URLs." +msgstr "" + +#: modules/upnp/doc_classes/UPNPDevice.xml:89 +msgid "Not a valid IGD." +msgstr "" + +#: modules/upnp/doc_classes/UPNPDevice.xml:92 +msgid "Disconnected." +msgstr "" + +#: modules/upnp/doc_classes/UPNPDevice.xml:95 +msgid "Unknown device." +msgstr "" + +#: modules/upnp/doc_classes/UPNPDevice.xml:98 +msgid "Invalid control." +msgstr "" + +#: modules/upnp/doc_classes/UPNPDevice.xml:101 +msgid "Memory allocation error." +msgstr "" + +#: doc/classes/Variant.xml:4 +msgid "The most important data type in Godot." +msgstr "" + +#: doc/classes/Variant.xml:7 +msgid "" +"In computer programming, a Variant class is a class that is designed to " +"store a variety of other types. Dynamic programming languages like PHP, Lua, " +"JavaScript and GDScript like to use them to store variables' data on the " +"backend. With these Variants, properties are able to change value types " +"freely.\n" +"[codeblock]\n" +"var foo = 2 # foo is dynamically an integer\n" +"foo = \"Now foo is a string!\"\n" +"foo = Reference.new() # foo is an Object\n" +"var bar: int = 2 # bar is a statically typed integer.\n" +"# bar = \"Uh oh! I can't make static variables become a different type!\"\n" +"[/codeblock]\n" +"Godot tracks all scripting API variables within Variants. Without even " +"realizing it, you use Variants all the time. When a particular language " +"enforces its own rules for keeping data typed, then that language is " +"applying its own custom logic over the base Variant scripting API.\n" +"- GDScript automatically wrap values in them. It keeps all data in plain " +"Variants by default and then optionally enforces custom static typing rules " +"on variable types.\n" +"- VisualScript tracks properties inside Variants as well, but it also uses " +"static typing. The GUI interface enforces that properties have a particular " +"type that doesn't change over time.\n" +"- C# is statically typed, but uses the Mono [code]object[/code] type in " +"place of Godot's Variant class when it needs to represent a dynamic value. " +"[code]object[/code] is the Mono runtime's equivalent of the same concept.\n" +"- The statically-typed language NativeScript C++ does not define a built-in " +"Variant-like class. Godot's GDNative bindings provide their own godot::" +"Variant class for users; Any point at which the C++ code starts interacting " +"with the Godot runtime is a place where you might have to start wrapping " +"data inside Variant objects.\n" +"The global [method @GDScript.typeof] function returns the enumerated value " +"of the Variant type stored in the current variable (see [enum Variant." +"Type]).\n" +"[codeblock]\n" +"var foo = 2\n" +"match typeof(foo):\n" +" TYPE_NIL:\n" +" print(\"foo is null\")\n" +" TYPE_INTEGER:\n" +" print(\"foo is an integer\")\n" +" TYPE_OBJECT:\n" +" # Note that Objects are their own special category.\n" +" # To get the name of the underlying Object type, you need the " +"`get_class()` method.\n" +" print(\"foo is a(n) %s\" % foo.get_class()) # inject the class name " +"into a formatted string.\n" +" # Note also that there is not yet any way to get a script's " +"`class_name` string easily.\n" +" # To fetch that value, you need to dig deeply into a hidden " +"ProjectSettings setting: an Array of Dictionaries called " +"\"_global_script_classes\".\n" +" # Open your project.godot file to see it up close.\n" +"[/codeblock]\n" +"A Variant takes up only 20 bytes and can store almost any engine datatype " +"inside of it. Variants are rarely used to hold information for long periods " +"of time. Instead, they are used mainly for communication, editing, " +"serialization and moving data around.\n" +"Godot has specifically invested in making its Variant class as flexible as " +"possible; so much so that it is used for a multitude of operations to " +"facilitate communication between all of Godot's systems.\n" +"A Variant:\n" +"- Can store almost any datatype.\n" +"- Can perform operations between many variants. GDScript uses Variant as its " +"atomic/native datatype.\n" +"- Can be hashed, so it can be compared quickly to other variants.\n" +"- Can be used to convert safely between datatypes.\n" +"- Can be used to abstract calling methods and their arguments. Godot exports " +"all its functions through variants.\n" +"- Can be used to defer calls or move data between threads.\n" +"- Can be serialized as binary and stored to disk, or transferred via " +"network.\n" +"- Can be serialized to text and use it for printing values and editable " +"settings.\n" +"- Can work as an exported property, so the editor can edit it universally.\n" +"- Can be used for dictionaries, arrays, parsers, etc.\n" +"[b]Containers (Array and Dictionary):[/b] Both are implemented using " +"variants. A [Dictionary] can match any datatype used as key to any other " +"datatype. An [Array] just holds an array of Variants. Of course, a Variant " +"can also hold a [Dictionary] and an [Array] inside, making it even more " +"flexible.\n" +"Modifications to a container will modify all references to it. A [Mutex] " +"should be created to lock it if multi-threaded access is desired." +msgstr "" + +#: doc/classes/Variant.xml:53 +msgid "" +"https://docs.godotengine.org/en/latest/development/cpp/variant_class.html" +msgstr "" + +#: doc/classes/VBoxContainer.xml:4 +msgid "Vertical box container." +msgstr "" + +#: doc/classes/VBoxContainer.xml:7 +msgid "Vertical box container. See [BoxContainer]." +msgstr "" + +#: doc/classes/VBoxContainer.xml:17 +msgid "The vertical space between the [VBoxContainer]'s elements." +msgstr "" + +#: doc/classes/Vector2.xml:4 +msgid "Vector used for 2D math using floating point coordinates." +msgstr "" + +#: doc/classes/Vector2.xml:7 +msgid "" +"2-element structure that can be used to represent positions in 2D space or " +"any other pair of numeric values.\n" +"It uses floating point coordinates." +msgstr "" + +#: doc/classes/Vector2.xml:20 +msgid "Constructs a new [Vector2] from [Vector2i]." +msgstr "" + +#: doc/classes/Vector2.xml:31 +msgid "" +"Constructs a new [Vector2] from the given [code]x[/code] and [code]y[/code]." +msgstr "" + +#: doc/classes/Vector2.xml:38 doc/classes/Vector3.xml:40 +msgid "" +"Returns a new vector with all components in absolute values (i.e. positive)." +msgstr "" + +#: doc/classes/Vector2.xml:45 +msgid "" +"Returns the vector's angle in radians with respect to the X axis, or [code]" +"(1, 0)[/code] vector.\n" +"Equivalent to the result of [method @GDScript.atan2] when called with the " +"vector's [member x] and [member y] as parameters: [code]atan2(x, y)[/code]." +msgstr "" + +#: doc/classes/Vector2.xml:55 +msgid "Returns the angle in radians between the two vectors." +msgstr "" + +#: doc/classes/Vector2.xml:64 +msgid "" +"Returns the angle in radians between the line connecting the two points and " +"the X coordinate." +msgstr "" + +#: doc/classes/Vector2.xml:71 +msgid "Returns the ratio of [member x] to [member y]." +msgstr "" + +#: doc/classes/Vector2.xml:80 doc/classes/Vector3.xml:58 +msgid "" +"Returns the vector \"bounced off\" from a plane defined by the given normal." +msgstr "" + +#: doc/classes/Vector2.xml:87 +msgid "Returns the vector with all components rounded up." +msgstr "" + +#: doc/classes/Vector2.xml:96 +msgid "Returns the vector with a maximum length." +msgstr "" + +#: doc/classes/Vector2.xml:105 +msgid "" +"Returns the 2-dimensional analog of the cross product with the given vector." +msgstr "" + +#: doc/classes/Vector2.xml:120 +msgid "" +"Cubically interpolates between this vector and [code]b[/code] using " +"[code]pre_a[/code] and [code]post_b[/code] as handles, and returns the " +"result at position [code]t[/code]. [code]t[/code] is in the range of " +"[code]0.0 - 1.0[/code], representing the amount of interpolation." +msgstr "" + +#: doc/classes/Vector2.xml:129 doc/classes/Vector3.xml:98 +msgid "" +"Returns the normalized vector pointing from this vector to [code]b[/code]." +msgstr "" + +#: doc/classes/Vector2.xml:138 +msgid "" +"Returns the squared distance to vector [code]b[/code]. Prefer this function " +"over [method distance_to] if you need to sort vectors or need the squared " +"distance for some formula." +msgstr "" + +#: doc/classes/Vector2.xml:147 +msgid "Returns the distance to vector [code]b[/code]." +msgstr "" + +#: doc/classes/Vector2.xml:156 +msgid "Returns the dot product with vector [code]b[/code]." +msgstr "" + +#: doc/classes/Vector2.xml:163 +msgid "Returns the vector with all components rounded down." +msgstr "" + +#: doc/classes/Vector2.xml:172 doc/classes/Vector3.xml:148 +msgid "" +"Returns [code]true[/code] if this vector and [code]v[/code] are " +"approximately equal, by running [method @GDScript.is_equal_approx] on each " +"component." +msgstr "" + +#: doc/classes/Vector2.xml:179 doc/classes/Vector3.xml:155 +msgid "Returns [code]true[/code] if the vector is normalized." +msgstr "" + +#: doc/classes/Vector2.xml:186 doc/classes/Vector3.xml:162 +msgid "Returns the vector's length." +msgstr "" + +#: doc/classes/Vector2.xml:193 +msgid "" +"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." +msgstr "" + +#: doc/classes/Vector2.xml:204 +msgid "" +"Returns the result of the linear interpolation between this vector and " +"[code]b[/code] by amount [code]t[/code]. [code]t[/code] is in the range of " +"[code]0.0 - 1.0[/code], representing the amount of interpolation." +msgstr "" + +#: doc/classes/Vector2.xml:215 doc/classes/Vector3.xml:205 +msgid "" +"Moves the vector toward [code]to[/code] by the fixed [code]delta[/code] " +"amount." +msgstr "" + +#: doc/classes/Vector2.xml:222 doc/classes/Vector3.xml:212 +msgid "" +"Returns the vector scaled to unit length. Equivalent to [code]v / v.length()" +"[/code]." +msgstr "" + +#: doc/classes/Vector2.xml:231 doc/classes/Vector3.xml:230 +msgid "" +"Returns a vector composed of the [code]fposmod[/code] of this vector's " +"components and [code]mod[/code]." +msgstr "" + +#: doc/classes/Vector2.xml:240 doc/classes/Vector3.xml:239 +msgid "" +"Returns a vector composed of the [code]fposmod[/code] of this vector's " +"components and [code]modv[/code]'s components." +msgstr "" + +#: doc/classes/Vector2.xml:249 doc/classes/Vector3.xml:248 +msgid "Returns the vector projected onto the vector [code]b[/code]." +msgstr "" + +#: doc/classes/Vector2.xml:258 doc/classes/Vector3.xml:257 +msgid "Returns the vector reflected from a plane defined by the given normal." +msgstr "" + +#: doc/classes/Vector2.xml:267 +msgid "" +"Returns the vector rotated by [code]phi[/code] radians. See also [method " +"@GDScript.deg2rad]." +msgstr "" + +#: doc/classes/Vector2.xml:274 doc/classes/Vector3.xml:275 +msgid "" +"Returns the vector with all components rounded to the nearest integer, with " +"halfway cases rounded away from zero." +msgstr "" + +#: doc/classes/Vector2.xml:281 doc/classes/Vector3.xml:282 +msgid "" +"Returns the vector with each component set to one or negative one, depending " +"on the signs of the components." +msgstr "" + +#: doc/classes/Vector2.xml:292 doc/classes/Vector3.xml:293 +msgid "" +"Returns the result of spherical linear interpolation between this vector and " +"[code]b[/code], by amount [code]t[/code]. [code]t[/code] is in the range of " +"[code]0.0 - 1.0[/code], representing the amount of interpolation.\n" +"[b]Note:[/b] Both vectors must be normalized." +msgstr "" + +#: doc/classes/Vector2.xml:302 doc/classes/Vector3.xml:303 +msgid "" +"Returns the component of the vector along a plane defined by the given " +"normal." +msgstr "" + +#: doc/classes/Vector2.xml:311 +msgid "Returns the vector snapped to a grid with the given size." +msgstr "" + +#: doc/classes/Vector2.xml:318 +msgid "Returns a perpendicular vector." +msgstr "" + +#: doc/classes/Vector2.xml:324 doc/classes/Vector3.xml:325 +msgid "" +"The vector's X component. Also accessible by using the index position [code]" +"[0][/code]." +msgstr "" + +#: doc/classes/Vector2.xml:327 doc/classes/Vector3.xml:328 +msgid "" +"The vector's Y component. Also accessible by using the index position [code]" +"[1][/code]." +msgstr "" + +#: doc/classes/Vector2.xml:332 doc/classes/Vector2i.xml:37 +#: doc/classes/Vector3i.xml:39 +msgid "Enumerated value for the X axis." +msgstr "" + +#: doc/classes/Vector2.xml:335 doc/classes/Vector2i.xml:40 +#: doc/classes/Vector3i.xml:42 +msgid "Enumerated value for the Y axis." +msgstr "" + +#: doc/classes/Vector2.xml:338 doc/classes/Vector2i.xml:43 +#: doc/classes/Vector3.xml:345 doc/classes/Vector3i.xml:48 +msgid "Zero vector." +msgstr "" + +#: doc/classes/Vector2.xml:341 doc/classes/Vector2i.xml:46 +#: doc/classes/Vector3.xml:348 doc/classes/Vector3i.xml:51 +msgid "One vector." +msgstr "" + +#: doc/classes/Vector2.xml:344 doc/classes/Vector3.xml:351 +msgid "Infinity vector." +msgstr "" + +#: doc/classes/Vector2.xml:347 doc/classes/Vector2i.xml:49 +#: doc/classes/Vector3.xml:354 doc/classes/Vector3i.xml:54 +msgid "Left unit vector." +msgstr "" + +#: doc/classes/Vector2.xml:350 doc/classes/Vector2i.xml:52 +#: doc/classes/Vector3.xml:357 doc/classes/Vector3i.xml:57 +msgid "Right unit vector." +msgstr "" + +#: doc/classes/Vector2.xml:353 doc/classes/Vector2i.xml:55 +#: doc/classes/Vector3.xml:360 doc/classes/Vector3i.xml:60 +msgid "Up unit vector." +msgstr "" + +#: doc/classes/Vector2.xml:356 doc/classes/Vector2i.xml:58 +#: doc/classes/Vector3.xml:363 doc/classes/Vector3i.xml:63 +msgid "Down unit vector." +msgstr "" + +#: doc/classes/Vector2i.xml:4 +msgid "Vector used for 2D math using integer coordinates." +msgstr "" + +#: doc/classes/Vector2i.xml:7 +msgid "" +"2-element structure that can be used to represent positions in 2D space or " +"any other pair of numeric values.\n" +"It uses integer coordinates." +msgstr "" + +#: doc/classes/Vector2i.xml:22 +msgid "" +"Constructs a new [Vector2i] from the given [code]x[/code] and [code]y[/code]." +msgstr "" + +#: doc/classes/Vector2i.xml:31 +msgid "" +"Constructs a new [Vector2i] from [Vector2]. The floating point coordinates " +"will be truncated." +msgstr "" + +#: doc/classes/Vector3.xml:4 +msgid "Vector used for 3D math using floating point coordinates." +msgstr "" + +#: doc/classes/Vector3.xml:7 +msgid "" +"3-element structure that can be used to represent positions in 3D space or " +"any other pair of numeric values.\n" +"It uses floating point coordinates." +msgstr "" + +#: doc/classes/Vector3.xml:20 +msgid "Constructs a new [Vector3] from [Vector3i]." +msgstr "" + +#: doc/classes/Vector3.xml:33 +msgid "Returns a [Vector3] with the given components." +msgstr "" + +#: doc/classes/Vector3.xml:49 +msgid "Returns the minimum angle to the given vector." +msgstr "" + +#: doc/classes/Vector3.xml:65 +msgid "Returns a new vector with all components rounded up." +msgstr "" + +#: doc/classes/Vector3.xml:74 +msgid "Returns the cross product with [code]b[/code]." +msgstr "" + +#: doc/classes/Vector3.xml:89 +msgid "" +"Performs a cubic interpolation between vectors [code]pre_a[/code], [code]a[/" +"code], [code]b[/code], [code]post_b[/code] ([code]a[/code] is current), by " +"the given amount [code]t[/code]. [code]t[/code] is in the range of [code]0.0 " +"- 1.0[/code], representing the amount of interpolation." +msgstr "" + +#: doc/classes/Vector3.xml:107 +msgid "" +"Returns the squared distance to [code]b[/code]. Prefer this function over " +"[method distance_to] if you need to sort vectors or need the squared " +"distance for some formula." +msgstr "" + +#: doc/classes/Vector3.xml:116 +msgid "Returns the distance to [code]b[/code]." +msgstr "" + +#: doc/classes/Vector3.xml:125 +msgid "Returns the dot product with [code]b[/code]." +msgstr "" + +#: doc/classes/Vector3.xml:132 +msgid "Returns a new vector with all components rounded down." +msgstr "" + +#: doc/classes/Vector3.xml:139 +msgid "" +"Returns the inverse of the vector. This is the same as [code]Vector3( 1.0 / " +"v.x, 1.0 / v.y, 1.0 / v.z )[/code]." +msgstr "" + +#: doc/classes/Vector3.xml:169 +msgid "" +"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." +msgstr "" + +#: doc/classes/Vector3.xml:180 +msgid "" +"Returns the result of the linear interpolation between this vector and " +"[code]b[/code] by amount [code]t[/code]. [code]t[/code] is in the range of " +"[code]0.0 - 1.0[/code], representing the amount of interpolation.." +msgstr "" + +#: doc/classes/Vector3.xml:187 +msgid "" +"Returns the axis of the vector's largest value. See [code]AXIS_*[/code] " +"constants." +msgstr "" + +#: doc/classes/Vector3.xml:194 +msgid "" +"Returns the axis of the vector's smallest value. See [code]AXIS_*[/code] " +"constants." +msgstr "" + +#: doc/classes/Vector3.xml:221 +msgid "Returns the outer product with [code]b[/code]." +msgstr "" + +#: doc/classes/Vector3.xml:268 +msgid "" +"Rotates the vector around a given axis by [code]phi[/code] radians. The axis " +"must be a normalized vector." +msgstr "" + +#: doc/classes/Vector3.xml:312 +msgid "Returns a copy of the vector snapped to the lowest neared multiple." +msgstr "" + +#: doc/classes/Vector3.xml:319 +msgid "Returns a diagonal matrix with the vector as main diagonal." +msgstr "" + +#: doc/classes/Vector3.xml:331 +msgid "" +"The vector's Z component. Also accessible by using the index position [code]" +"[2][/code]." +msgstr "" + +#: doc/classes/Vector3.xml:336 +msgid "" +"Enumerated value for the X axis. Returned by [method max_axis] and [method " +"min_axis]." +msgstr "" + +#: doc/classes/Vector3.xml:339 +msgid "" +"Enumerated value for the Y axis. Returned by [method max_axis] and [method " +"min_axis]." +msgstr "" + +#: doc/classes/Vector3.xml:342 +msgid "" +"Enumerated value for the Z axis. Returned by [method max_axis] and [method " +"min_axis]." +msgstr "" + +#: doc/classes/Vector3.xml:366 doc/classes/Vector3i.xml:66 +msgid "Forward unit vector." +msgstr "" + +#: doc/classes/Vector3.xml:369 doc/classes/Vector3i.xml:69 +msgid "Back unit vector." +msgstr "" + +#: doc/classes/Vector3i.xml:4 +msgid "Vector used for 3D math using integer coordinates." +msgstr "" + +#: doc/classes/Vector3i.xml:7 +msgid "" +"3-element structure that can be used to represent positions in 3D space or " +"any other pair of numeric values.\n" +"It uses integer coordinates." +msgstr "" + +#: doc/classes/Vector3i.xml:24 +msgid "Returns a [Vector3i] with the given components." +msgstr "" + +#: doc/classes/Vector3i.xml:33 +msgid "" +"Constructs a new [Vector3i] from [Vector3]. The floating point coordinates " +"will be truncated." +msgstr "" + +#: doc/classes/Vector3i.xml:45 +msgid "Enumerated value for the Z axis." +msgstr "" + +#: doc/classes/VehicleBody3D.xml:4 +msgid "Physics body that simulates the behavior of a car." +msgstr "" + +#: doc/classes/VehicleBody3D.xml:7 +msgid "" +"This node implements all the physics logic needed to simulate a car. It is " +"based on the raycast vehicle system commonly found in physics engines. You " +"will need to add a [CollisionShape3D] for the main body of your vehicle and " +"add [VehicleWheel3D] nodes for the wheels. You should also add a " +"[MeshInstance3D] to this node for the 3D model of your car but this model " +"should not include meshes for the wheels. You should control the vehicle by " +"using the [member brake], [member engine_force], and [member steering] " +"properties and not change the position or orientation of this node " +"directly.\n" +"[b]Note:[/b] The origin point of your VehicleBody3D will determine the " +"center of gravity of your vehicle so it is better to keep this low and move " +"the [CollisionShape3D] and [MeshInstance3D] upwards." +msgstr "" + +#: doc/classes/VehicleBody3D.xml:16 +msgid "" +"Slows down the vehicle by applying a braking force. The vehicle is only " +"slowed down if the wheels are in contact with a surface. The force you need " +"to apply to adequately slow down your vehicle depends on the [member " +"RigidBody3D.mass] of the vehicle. For a vehicle with a mass set to 1000, try " +"a value in the 25 - 30 range for hard braking." +msgstr "" + +#: doc/classes/VehicleBody3D.xml:19 +msgid "" +"Accelerates the vehicle by applying an engine force. The vehicle is only " +"speed up if the wheels that have [member VehicleWheel3D.use_as_traction] set " +"to [code]true[/code] and are in contact with a surface. The [member " +"RigidBody3D.mass] of the vehicle has an effect on the acceleration of the " +"vehicle. For a vehicle with a mass set to 1000, try a value in the 25 - 50 " +"range for acceleration.\n" +"[b]Note:[/b] The simulation does not take the effect of gears into account, " +"you will need to add logic for this if you wish to simulate gears.\n" +"A negative value will result in the vehicle reversing." +msgstr "" + +#: doc/classes/VehicleBody3D.xml:25 +msgid "" +"The steering angle for the vehicle. Setting this to a non-zero value will " +"result in the vehicle turning when it's moving. Wheels that have [member " +"VehicleWheel3D.use_as_steering] set to [code]true[/code] will automatically " +"be rotated." +msgstr "" + +#: doc/classes/VehicleWheel3D.xml:4 +msgid "Physics object that simulates the behavior of a wheel." +msgstr "" + +#: doc/classes/VehicleWheel3D.xml:7 +msgid "" +"This node needs to be used as a child node of [VehicleBody3D] and simulates " +"the behavior of one of its wheels. This node also acts as a collider to " +"detect if the wheel is touching a surface." +msgstr "" + +#: doc/classes/VehicleWheel3D.xml:16 +msgid "Returns the rotational speed of the wheel in revolutions per minute." +msgstr "" + +#: doc/classes/VehicleWheel3D.xml:23 +msgid "" +"Returns a value between 0.0 and 1.0 that indicates whether this wheel is " +"skidding. 0.0 is skidding (the wheel has lost grip, e.g. icy terrain), 1.0 " +"means not skidding (the wheel has full grip, e.g. dry asphalt road)." +msgstr "" + +#: doc/classes/VehicleWheel3D.xml:30 +msgid "Returns [code]true[/code] if this wheel is in contact with a surface." +msgstr "" + +#: doc/classes/VehicleWheel3D.xml:36 +msgid "" +"Slows down the wheel by applying a braking force. The wheel is only slowed " +"down if it is in contact with a surface. The force you need to apply to " +"adequately slow down your vehicle depends on the [member RigidBody3D.mass] " +"of the vehicle. For a vehicle with a mass set to 1000, try a value in the 25 " +"- 30 range for hard braking." +msgstr "" + +#: doc/classes/VehicleWheel3D.xml:39 +msgid "" +"The damping applied to the spring when the spring is being compressed. This " +"value should be between 0.0 (no damping) and 1.0. A value of 0.0 means the " +"car will keep bouncing as the spring keeps its energy. A good value for this " +"is around 0.3 for a normal car, 0.5 for a race car." +msgstr "" + +#: doc/classes/VehicleWheel3D.xml:42 +msgid "" +"The damping applied to the spring when relaxing. This value should be " +"between 0.0 (no damping) and 1.0. This value should always be slightly " +"higher than the [member damping_compression] property. For a [member " +"damping_compression] value of 0.3, try a relaxation value of 0.5." +msgstr "" + +#: doc/classes/VehicleWheel3D.xml:45 +msgid "" +"Accelerates the wheel by applying an engine force. The wheel is only speed " +"up if it is in contact with a surface. The [member RigidBody3D.mass] of the " +"vehicle has an effect on the acceleration of the vehicle. For a vehicle with " +"a mass set to 1000, try a value in the 25 - 50 range for acceleration.\n" +"[b]Note:[/b] The simulation does not take the effect of gears into account, " +"you will need to add logic for this if you wish to simulate gears.\n" +"A negative value will result in the wheel reversing." +msgstr "" + +#: doc/classes/VehicleWheel3D.xml:50 +msgid "" +"The steering angle for the wheel. Setting this to a non-zero value will " +"result in the vehicle turning when it's moving." +msgstr "" + +#: doc/classes/VehicleWheel3D.xml:53 +msgid "" +"The maximum force the spring can resist. This value should be higher than a " +"quarter of the [member RigidBody3D.mass] of the [VehicleBody3D] or the " +"spring will not carry the weight of the vehicle. Good results are often " +"obtained by a value that is about 3× to 4× this number." +msgstr "" + +#: doc/classes/VehicleWheel3D.xml:56 +msgid "" +"This value defines the stiffness of the suspension. Use a value lower than " +"50 for an off-road car, a value between 50 and 100 for a race car and try " +"something around 200 for something like a Formula 1 car." +msgstr "" + +#: doc/classes/VehicleWheel3D.xml:59 +msgid "" +"This is the distance the suspension can travel. As Godot units are " +"equivalent to meters, keep this setting relatively low. Try a value between " +"0.1 and 0.3 depending on the type of car." +msgstr "" + +#: doc/classes/VehicleWheel3D.xml:62 +msgid "" +"If [code]true[/code], this wheel will be turned when the car steers. This " +"value is used in conjunction with [member VehicleBody3D.steering] and " +"ignored if you are using the per-wheel [member steering] value instead." +msgstr "" + +#: doc/classes/VehicleWheel3D.xml:65 +msgid "" +"If [code]true[/code], this wheel transfers engine force to the ground to " +"propel the vehicle forward. This value is used in conjunction with [member " +"VehicleBody3D.engine_force] and ignored if you are using the per-wheel " +"[member engine_force] value instead." +msgstr "" + +#: doc/classes/VehicleWheel3D.xml:68 +msgid "" +"This determines how much grip this wheel has. It is combined with the " +"friction setting of the surface the wheel is in contact with. 0.0 means no " +"grip, 1.0 is normal grip. For a drift car setup, try setting the grip of the " +"rear wheels slightly lower than the front wheels, or use a lower value to " +"simulate tire wear.\n" +"It's best to set this to 1.0 when starting out." +msgstr "" + +#: doc/classes/VehicleWheel3D.xml:72 +msgid "The radius of the wheel in meters." +msgstr "" + +#: doc/classes/VehicleWheel3D.xml:75 +msgid "" +"This is the distance in meters the wheel is lowered from its origin point. " +"Don't set this to 0.0 and move the wheel into position, instead move the " +"origin point of your wheel (the gizmo in Godot) to the position the wheel " +"will take when bottoming out, then use the rest length to move the wheel " +"down to the position it should be in when the car is in rest." +msgstr "" + +#: doc/classes/VehicleWheel3D.xml:78 +msgid "" +"This value affects the roll of your vehicle. If set to 1.0 for all wheels, " +"your vehicle will be prone to rolling over, while a value of 0.0 will resist " +"body roll." +msgstr "" + +#: doc/classes/VideoPlayer.xml:4 +msgid "Control for playing video streams." +msgstr "" + +#: doc/classes/VideoPlayer.xml:7 +msgid "" +"Control node for playing video streams using [VideoStream] resources.\n" +"Supported video formats are [url=https://www.webmproject.org/]WebM[/url] " +"([VideoStreamWebm]), [url=https://www.theora.org/]Ogg Theora[/url] " +"([VideoStreamTheora]), and any format exposed via a GDNative plugin using " +"[VideoStreamGDNative]." +msgstr "" + +#: doc/classes/VideoPlayer.xml:17 +msgid "" +"Returns the video stream's name, or [code]\"<No Stream>\"[/code] if no video " +"stream is assigned." +msgstr "" + +#: doc/classes/VideoPlayer.xml:24 +msgid "Returns the current frame as a [Texture2D]." +msgstr "" + +#: doc/classes/VideoPlayer.xml:31 +msgid "" +"Returns [code]true[/code] if the video is playing.\n" +"[b]Note:[/b] The video is still considered playing if paused during playback." +msgstr "" + +#: doc/classes/VideoPlayer.xml:39 +msgid "" +"Starts the video playback from the beginning. If the video is paused, this " +"will not unpause the video." +msgstr "" + +#: doc/classes/VideoPlayer.xml:46 +msgid "" +"Stops the video playback and sets the stream position to 0.\n" +"[b]Note:[/b] Although the stream position will be set to 0, the first frame " +"of the video stream won't become the current frame." +msgstr "" + +#: doc/classes/VideoPlayer.xml:53 +msgid "The embedded audio track to play." +msgstr "" + +#: doc/classes/VideoPlayer.xml:56 +msgid "If [code]true[/code], playback starts when the scene loads." +msgstr "" + +#: doc/classes/VideoPlayer.xml:59 +msgid "Amount of time in milliseconds to store in buffer while playing." +msgstr "" + +#: doc/classes/VideoPlayer.xml:62 +msgid "Audio bus to use for sound playback." +msgstr "" + +#: doc/classes/VideoPlayer.xml:65 +msgid "" +"If [code]true[/code], the video scales to the control size. Otherwise, the " +"control minimum size will be automatically adjusted to match the video " +"stream's dimensions." +msgstr "" + +#: doc/classes/VideoPlayer.xml:68 +msgid "If [code]true[/code], the video is paused." +msgstr "" + +#: doc/classes/VideoPlayer.xml:71 +msgid "The assigned video stream. See description for supported formats." +msgstr "" + +#: doc/classes/VideoPlayer.xml:74 +msgid "The current position of the stream, in seconds." +msgstr "" + +#: doc/classes/VideoPlayer.xml:77 +msgid "Audio volume as a linear value." +msgstr "" + +#: doc/classes/VideoPlayer.xml:80 +msgid "Audio volume in dB." +msgstr "" + +#: doc/classes/VideoPlayer.xml:86 +msgid "Emitted when playback is finished." +msgstr "" + +#: doc/classes/VideoStream.xml:4 +msgid "Base resource for video streams." +msgstr "" + +#: doc/classes/VideoStream.xml:7 +msgid "" +"Base resource type for all video streams. Classes that derive from " +"[VideoStream] can all be used as resource types to play back videos in " +"[VideoPlayer]." +msgstr "" + +#: modules/gdnative/doc_classes/VideoStreamGDNative.xml:4 +msgid "[VideoStream] resource for for video formats implemented via GDNative." +msgstr "" + +#: modules/gdnative/doc_classes/VideoStreamGDNative.xml:7 +msgid "" +"[VideoStream] resource for for video formats implemented via GDNative.\n" +"It can be used via [url=https://github.com/KidRigger/godot-" +"videodecoder]godot-videodecoder[/url] which uses the [url=https://ffmpeg." +"org]FFmpeg[/url] library." +msgstr "" + +#: modules/gdnative/doc_classes/VideoStreamGDNative.xml:17 +msgid "Returns the video file handled by this [VideoStreamGDNative]." +msgstr "" + +#: modules/gdnative/doc_classes/VideoStreamGDNative.xml:26 +msgid "" +"Sets the video file that this [VideoStreamGDNative] resource handles. The " +"supported extensions depend on the GDNative plugins used to expose video " +"formats." +msgstr "" + +#: modules/theora/doc_classes/VideoStreamTheora.xml:4 +msgid "[VideoStream] resource for Ogg Theora videos." +msgstr "" + +#: modules/theora/doc_classes/VideoStreamTheora.xml:7 +msgid "" +"[VideoStream] resource handling the [url=https://www.theora.org/]Ogg Theora[/" +"url] video format with [code].ogv[/code] extension." +msgstr "" + +#: modules/theora/doc_classes/VideoStreamTheora.xml:16 +msgid "Returns the Ogg Theora video file handled by this [VideoStreamTheora]." +msgstr "" + +#: modules/theora/doc_classes/VideoStreamTheora.xml:25 +msgid "" +"Sets the Ogg Theora video file that this [VideoStreamTheora] resource " +"handles. The [code]file[/code] name should have the [code].o[/code] " +"extension." +msgstr "" + +#: modules/webm/doc_classes/VideoStreamWebm.xml:4 +msgid "[VideoStream] resource for WebM videos." +msgstr "" + +#: modules/webm/doc_classes/VideoStreamWebm.xml:7 +msgid "" +"[VideoStream] resource handling the [url=https://www.webmproject.org/]WebM[/" +"url] video format with [code].webm[/code] extension." +msgstr "" + +#: modules/webm/doc_classes/VideoStreamWebm.xml:16 +msgid "Returns the WebM video file handled by this [VideoStreamWebm]." +msgstr "" + +#: modules/webm/doc_classes/VideoStreamWebm.xml:25 +msgid "" +"Sets the WebM video file that this [VideoStreamWebm] resource handles. The " +"[code]file[/code] name should have the [code].webm[/code] extension." +msgstr "" + +#: doc/classes/Viewport.xml:4 +msgid "Creates a sub-view into the screen." +msgstr "" + +#: doc/classes/Viewport.xml:7 +msgid "" +"A Viewport creates a different view into the screen, or a sub-view inside " +"another viewport. Children 2D Nodes will display on it, and children " +"Camera3D 3D nodes will render on it too.\n" +"Optionally, a viewport can have its own 2D or 3D world, so they don't share " +"what they draw with other viewports.\n" +"If a viewport is a child of a [SubViewportContainer], it will automatically " +"take up its size, otherwise it must be set manually.\n" +"Viewports can also choose to be audio listeners, so they generate positional " +"audio depending on a 2D or 3D camera child of it.\n" +"Also, viewports can be assigned to different screens in case the devices " +"have multiple screens.\n" +"Finally, viewports can also behave as render targets, in which case they " +"will not be visible unless the associated texture is used to draw." +msgstr "" + +#: doc/classes/Viewport.xml:16 +msgid "https://docs.godotengine.org/en/latest/tutorials/viewports/index.html" +msgstr "" + +#: doc/classes/Viewport.xml:23 +msgid "" +"Returns the 3D world of the viewport, or if none the world of the parent " +"viewport." +msgstr "" + +#: doc/classes/Viewport.xml:30 +msgid "Returns the 2D world of the viewport." +msgstr "" + +#: doc/classes/Viewport.xml:37 +msgid "Returns the active 3D camera." +msgstr "" + +#: doc/classes/Viewport.xml:44 +msgid "Returns the total transform of the viewport." +msgstr "" + +#: doc/classes/Viewport.xml:51 +msgid "Returns the mouse position relative to the viewport." +msgstr "" + +#: doc/classes/Viewport.xml:60 +msgid "Returns information about the viewport from the rendering pipeline." +msgstr "" + +#: doc/classes/Viewport.xml:69 +msgid "Returns the [enum ShadowAtlasQuadrantSubdiv] of the specified quadrant." +msgstr "" + +#: doc/classes/Viewport.xml:76 +msgid "" +"Returns the viewport's texture.\n" +"[b]Note:[/b] Due to the way OpenGL works, the resulting [ViewportTexture] is " +"flipped vertically. You can use [method Image.flip_y] on the result of " +"[method Texture2D.get_data] to flip it back, for example:\n" +"[codeblock]\n" +"var img = get_viewport().get_texture().get_data()\n" +"img.flip_y()\n" +"[/codeblock]" +msgstr "" + +#: doc/classes/Viewport.xml:88 +msgid "Returns the viewport's RID from the [RenderingServer]." +msgstr "" + +#: doc/classes/Viewport.xml:95 +msgid "Returns the visible rectangle in global screen coordinates." +msgstr "" + +#: doc/classes/Viewport.xml:102 +msgid "" +"Returns the drag data from the GUI, that was previously returned by [method " +"Control.get_drag_data]." +msgstr "" + +#: doc/classes/Viewport.xml:109 +msgid "" +"Returns [code]true[/code] if the viewport is currently performing a drag " +"operation." +msgstr "" + +#: doc/classes/Viewport.xml:146 +msgid "Stops the input from propagating further down the [SceneTree]." +msgstr "" + +#: doc/classes/Viewport.xml:157 +msgid "" +"Sets the number of subdivisions to use in the specified quadrant. A higher " +"number of subdivisions allows you to have more shadows in the scene at once, " +"but reduces the quality of the shadows. A good practice is to have quadrants " +"with a varying number of subdivisions and to have as few subdivisions as " +"possible." +msgstr "" + +#: doc/classes/Viewport.xml:174 +msgid "Forces update of the 2D and 3D worlds." +msgstr "" + +#: doc/classes/Viewport.xml:183 +msgid "Warps the mouse to a position relative to the viewport." +msgstr "" + +#: doc/classes/Viewport.xml:189 +msgid "If [code]true[/code], the viewport will process 2D audio streams." +msgstr "" + +#: doc/classes/Viewport.xml:192 +msgid "If [code]true[/code], the viewport will process 3D audio streams." +msgstr "" + +#: 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:204 +msgid "The overlay mode for test rendered geometry in debug purposes." +msgstr "" + +#: 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:210 +msgid "If [code]true[/code], the viewport will not receive input event." +msgstr "" + +#: 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: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:223 +msgid "" +"If [code]true[/code], the viewport will use [World3D] defined in " +"[code]world[/code] property." +msgstr "" + +#: 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: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:235 +msgid "The subdivision amount of the second quadrant on the shadow atlas." +msgstr "" + +#: doc/classes/Viewport.xml:238 +msgid "The subdivision amount of the third quadrant on the shadow atlas." +msgstr "" + +#: doc/classes/Viewport.xml:241 +msgid "The subdivision amount of the fourth quadrant on the shadow atlas." +msgstr "" + +#: 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" +"[b]Note:[/b] If this is set to 0, shadows won't be visible. Since user-" +"created viewports default to a value of 0, this value must be set above 0 " +"manually." +msgstr "" + +#: doc/classes/Viewport.xml:248 +msgid "" +"If [code]true[/code], the viewport should render its background as " +"transparent." +msgstr "" + +#: doc/classes/Viewport.xml:251 +msgid "The custom [World3D] which can be used as 3D environment source." +msgstr "" + +#: doc/classes/Viewport.xml:254 +msgid "The custom [World2D] which can be used as 2D environment source." +msgstr "" + +#: doc/classes/Viewport.xml:262 +msgid "Emitted when a Control node grabs keyboard focus." +msgstr "" + +#: 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:273 +msgid "This quadrant will not be used." +msgstr "" + +#: doc/classes/Viewport.xml:276 +msgid "This quadrant will only be used by one shadow map." +msgstr "" + +#: 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:282 +msgid "This quadrant will be split 16 ways and used by up to 16 shadow maps." +msgstr "" + +#: 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: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: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:294 +msgid "Represents the size of the [enum ShadowAtlasQuadrantSubdiv] enum." +msgstr "" + +#: 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:300 +msgid "Use 2x Multisample Antialiasing." +msgstr "" + +#: doc/classes/Viewport.xml:303 +msgid "Use 4x Multisample Antialiasing." +msgstr "" + +#: doc/classes/Viewport.xml:306 +msgid "" +"Use 8x Multisample Antialiasing. Likely unsupported on low-end and older " +"hardware." +msgstr "" + +#: doc/classes/Viewport.xml:309 +msgid "" +"Use 16x Multisample Antialiasing. Likely unsupported on medium and low-end " +"hardware." +msgstr "" + +#: doc/classes/Viewport.xml:312 +msgid "Represents the size of the [enum MSAA] enum." +msgstr "" + +#: doc/classes/Viewport.xml:315 +msgid "Do not perform any antialiasing in the full screen post-process." +msgstr "" + +#: 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:321 +msgid "Represents the size of the [enum ScreenSpaceAA] enum." +msgstr "" + +#: doc/classes/Viewport.xml:324 +msgid "Amount of objects in frame." +msgstr "" + +#: 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 "Amount of draw calls in frame." +msgstr "" + +#: doc/classes/Viewport.xml:342 +msgid "Represents the size of the [enum RenderInfo] enum." +msgstr "" + +#: doc/classes/Viewport.xml:345 +msgid "Objects are displayed normally." +msgstr "" + +#: doc/classes/Viewport.xml:356 +msgid "Objects are displayed in wireframe style." +msgstr "" + +#: doc/classes/Viewport.xml:378 +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/Viewport.xml:384 +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, 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 +msgid "Texture which displays the content of a [Viewport]." +msgstr "" + +#: doc/classes/ViewportTexture.xml:7 +msgid "" +"Displays the content of a [Viewport] node as a dynamic [Texture2D]. This can " +"be used to mix controls, 2D, and 3D elements in the same scene.\n" +"To create a ViewportTexture in code, use the [method Viewport.get_texture] " +"method on the target viewport." +msgstr "" + +#: doc/classes/ViewportTexture.xml:17 +msgid "" +"The path to the [Viewport] node to display. This is relative to the scene " +"root, not to the node which uses the texture." +msgstr "" + +#: doc/classes/VisibilityEnabler2D.xml:4 doc/classes/VisibilityEnabler3D.xml:4 +msgid "Enables certain nodes only when approximately visible." +msgstr "" + +#: doc/classes/VisibilityEnabler2D.xml:7 +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" +"[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:20 +#: doc/classes/VisibilityEnabler3D.xml:20 +msgid "" +"Returns whether the enabler identified by given [enum Enabler] constant is " +"active." +msgstr "" + +#: 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:37 +msgid "If [code]true[/code], [RigidBody2D] nodes will be paused." +msgstr "" + +#: doc/classes/VisibilityEnabler2D.xml:40 +msgid "If [code]true[/code], [AnimatedSprite2D] nodes will be paused." +msgstr "" + +#: 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:46 +msgid "If [code]true[/code], [GPUParticles2D] nodes will be paused." +msgstr "" + +#: 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:52 +msgid "" +"If [code]true[/code], the parent's [method Node._process] will be stopped." +msgstr "" + +#: doc/classes/VisibilityEnabler2D.xml:57 +#: doc/classes/VisibilityEnabler3D.xml:45 +msgid "This enabler will pause [AnimationPlayer] nodes." +msgstr "" + +#: doc/classes/VisibilityEnabler2D.xml:60 +msgid "This enabler will freeze [RigidBody2D] nodes." +msgstr "" + +#: doc/classes/VisibilityEnabler2D.xml:63 +msgid "This enabler will stop [GPUParticles2D] nodes." +msgstr "" + +#: doc/classes/VisibilityEnabler2D.xml:66 +msgid "This enabler will stop the parent's _process function." +msgstr "" + +#: doc/classes/VisibilityEnabler2D.xml:69 +msgid "This enabler will stop the parent's _physics_process function." +msgstr "" + +#: doc/classes/VisibilityEnabler2D.xml:72 +msgid "This enabler will stop [AnimatedSprite2D] nodes animations." +msgstr "" + +#: doc/classes/VisibilityEnabler2D.xml:75 +#: doc/classes/VisibilityEnabler3D.xml:51 +msgid "Represents the size of the [enum Enabler] enum." +msgstr "" + +#: doc/classes/VisibilityEnabler3D.xml:7 +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" +"[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:37 +msgid "If [code]true[/code], [RigidBody3D] nodes will be paused." +msgstr "" + +#: 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 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.\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: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 " +"once added to the scene tree, so this method will return [code]false[/code] " +"right after it is instantiated, even if it will be on screen in the draw " +"pass." +msgstr "" + +#: doc/classes/VisibilityNotifier2D.xml:24 +msgid "The VisibilityNotifier2D's bounding rectangle." +msgstr "" + +#: doc/classes/VisibilityNotifier2D.xml:30 +msgid "Emitted when the VisibilityNotifier2D enters the screen." +msgstr "" + +#: doc/classes/VisibilityNotifier2D.xml:35 +msgid "Emitted when the VisibilityNotifier2D exits the screen." +msgstr "" + +#: doc/classes/VisibilityNotifier2D.xml:42 +msgid "Emitted when the VisibilityNotifier2D enters a [Viewport]'s view." +msgstr "" + +#: doc/classes/VisibilityNotifier2D.xml:49 +msgid "Emitted when the VisibilityNotifier2D exits a [Viewport]'s view." +msgstr "" + +#: doc/classes/VisibilityNotifier3D.xml:7 +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.\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: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 " +"once added to the scene tree, so this method will return [code]false[/code] " +"right after it is instantiated, even if it will be on screen in the draw " +"pass." +msgstr "" + +#: doc/classes/VisibilityNotifier3D.xml:24 +msgid "The VisibilityNotifier3D's bounding box." +msgstr "" + +#: doc/classes/VisibilityNotifier3D.xml:32 +msgid "Emitted when the VisibilityNotifier3D enters a [Camera3D]'s view." +msgstr "" + +#: doc/classes/VisibilityNotifier3D.xml:39 +msgid "Emitted when the VisibilityNotifier3D exits a [Camera3D]'s view." +msgstr "" + +#: doc/classes/VisibilityNotifier3D.xml:44 +msgid "Emitted when the VisibilityNotifier3D enters the screen." +msgstr "" + +#: doc/classes/VisibilityNotifier3D.xml:49 +msgid "Emitted when the VisibilityNotifier3D exits the screen." +msgstr "" + +#: doc/classes/VisualInstance3D.xml:4 +msgid "Parent of all visual 3D nodes." +msgstr "" + +#: doc/classes/VisualInstance3D.xml:7 +msgid "" +"The [VisualInstance3D] is used to connect a resource to a visual " +"representation. All visual 3D nodes inherit from the [VisualInstance3D]. In " +"general, you should not access the [VisualInstance3D] properties directly as " +"they are accessed and managed by the nodes that inherit from " +"[VisualInstance3D]. [VisualInstance3D] is the node representation of the " +"[RenderingServer] instance." +msgstr "" + +#: doc/classes/VisualInstance3D.xml:16 +msgid "" +"Returns the [AABB] (also known as the bounding box) for this " +"[VisualInstance3D]." +msgstr "" + +#: doc/classes/VisualInstance3D.xml:23 +msgid "" +"Returns the RID of the resource associated with this [VisualInstance3D]. For " +"example, if the Node is a [MeshInstance3D], this will return the RID of the " +"associated [Mesh]." +msgstr "" + +#: doc/classes/VisualInstance3D.xml:30 +msgid "" +"Returns the RID of this instance. This RID is the same as the RID returned " +"by [method RenderingServer.instance_create]. This RID is needed if you want " +"to call [RenderingServer] functions directly on this [VisualInstance3D]." +msgstr "" + +#: doc/classes/VisualInstance3D.xml:39 +msgid "" +"Returns [code]true[/code] when the specified layer is enabled in [member " +"layers] and [code]false[/code] otherwise." +msgstr "" + +#: doc/classes/VisualInstance3D.xml:46 +msgid "" +"Returns the transformed [AABB] (also known as the bounding box) for this " +"[VisualInstance3D].\n" +"Transformed in this case means the [AABB] plus the position, rotation, and " +"scale of the [Node3D]'s [Transform]." +msgstr "" + +#: doc/classes/VisualInstance3D.xml:56 +msgid "" +"Sets the resource that is instantiated by this [VisualInstance3D], which " +"changes how the engine handles the [VisualInstance3D] under the hood. " +"Equivalent to [method RenderingServer.instance_set_base]." +msgstr "" + +#: doc/classes/VisualInstance3D.xml:67 +msgid "Enables a particular layer in [member layers]." +msgstr "" + +#: doc/classes/VisualInstance3D.xml:73 +msgid "" +"The render layer(s) this [VisualInstance3D] is drawn on.\n" +"This object will only be visible for [Camera3D]s whose cull mask includes " +"the render object this [VisualInstance3D] is set to." +msgstr "" + +#: modules/visual_script/doc_classes/VisualScript.xml:4 +msgid "A script implemented in the Visual Script programming environment." +msgstr "" + +#: modules/visual_script/doc_classes/VisualScript.xml:7 +msgid "" +"A script implemented in the Visual Script programming environment. The " +"script extends the functionality of all objects that instance it.\n" +"[method Object.set_script] extends an existing object, if that object's " +"class matches one of the script's base classes.\n" +"You are most likely to use this class via the Visual Script editor or when " +"writing plugins for it." +msgstr "" + +#: modules/visual_script/doc_classes/VisualScript.xml:12 +msgid "" +"https://docs.godotengine.org/en/latest/getting_started/scripting/" +"visual_script/index.html" +msgstr "" + +#: modules/visual_script/doc_classes/VisualScript.xml:21 +msgid "Add a custom signal with the specified name to the VisualScript." +msgstr "" + +#: modules/visual_script/doc_classes/VisualScript.xml:30 +msgid "Add a function with the specified name to the VisualScript." +msgstr "" + +#: modules/visual_script/doc_classes/VisualScript.xml:45 +msgid "Add a node to a function of the VisualScript." +msgstr "" + +#: modules/visual_script/doc_classes/VisualScript.xml:58 +msgid "" +"Add a variable to the VisualScript, optionally giving it a default value or " +"marking it as exported." +msgstr "" + +#: modules/visual_script/doc_classes/VisualScript.xml:73 +msgid "" +"Add an argument to a custom signal added with [method add_custom_signal]." +msgstr "" + +#: modules/visual_script/doc_classes/VisualScript.xml:82 +msgid "Get the count of a custom signal's arguments." +msgstr "" + +#: modules/visual_script/doc_classes/VisualScript.xml:93 +msgid "Get the name of a custom signal's argument." +msgstr "" + +#: modules/visual_script/doc_classes/VisualScript.xml:104 +msgid "Get the type of a custom signal's argument." +msgstr "" + +#: modules/visual_script/doc_classes/VisualScript.xml:115 +msgid "Remove a specific custom signal's argument." +msgstr "" + +#: modules/visual_script/doc_classes/VisualScript.xml:128 +msgid "Rename a custom signal's argument." +msgstr "" + +#: modules/visual_script/doc_classes/VisualScript.xml:141 +msgid "Change the type of a custom signal's argument." +msgstr "" + +#: modules/visual_script/doc_classes/VisualScript.xml:154 +msgid "Swap two of the arguments of a custom signal." +msgstr "" + +#: modules/visual_script/doc_classes/VisualScript.xml:171 +msgid "" +"Connect two data ports. The value of [code]from_node[/code]'s " +"[code]from_port[/code] would be fed into [code]to_node[/code]'s " +"[code]to_port[/code]." +msgstr "" + +#: modules/visual_script/doc_classes/VisualScript.xml:188 +msgid "" +"Disconnect two data ports previously connected with [method data_connect]." +msgstr "" + +#: modules/visual_script/doc_classes/VisualScript.xml:197 +msgid "Returns the id of a function's entry point node." +msgstr "" + +#: modules/visual_script/doc_classes/VisualScript.xml:206 +msgid "Returns the position of the center of the screen for a given function." +msgstr "" + +#: modules/visual_script/doc_classes/VisualScript.xml:217 +msgid "Returns a node given its id and its function." +msgstr "" + +#: modules/visual_script/doc_classes/VisualScript.xml:228 +msgid "Returns a node's position in pixels." +msgstr "" + +#: modules/visual_script/doc_classes/VisualScript.xml:237 +msgid "Returns the default (initial) value of a variable." +msgstr "" + +#: modules/visual_script/doc_classes/VisualScript.xml:246 +msgid "Returns whether a variable is exported." +msgstr "" + +#: modules/visual_script/doc_classes/VisualScript.xml:255 +msgid "" +"Returns the information for a given variable as a dictionary. The " +"information includes its name, type, hint and usage." +msgstr "" + +#: modules/visual_script/doc_classes/VisualScript.xml:264 +msgid "Returns whether a signal exists with the specified name." +msgstr "" + +#: modules/visual_script/doc_classes/VisualScript.xml:281 +msgid "Returns whether the specified data ports are connected." +msgstr "" + +#: modules/visual_script/doc_classes/VisualScript.xml:290 +msgid "Returns whether a function exists with the specified name." +msgstr "" + +#: modules/visual_script/doc_classes/VisualScript.xml:301 +msgid "Returns whether a node exists with the given id." +msgstr "" + +#: modules/visual_script/doc_classes/VisualScript.xml:316 +msgid "Returns whether the specified sequence ports are connected." +msgstr "" + +#: modules/visual_script/doc_classes/VisualScript.xml:325 +msgid "Returns whether a variable exists with the specified name." +msgstr "" + +#: modules/visual_script/doc_classes/VisualScript.xml:334 +msgid "Remove a custom signal with the given name." +msgstr "" + +#: modules/visual_script/doc_classes/VisualScript.xml:343 +msgid "Remove a specific function and its nodes from the script." +msgstr "" + +#: modules/visual_script/doc_classes/VisualScript.xml:354 +msgid "Remove a specific node." +msgstr "" + +#: modules/visual_script/doc_classes/VisualScript.xml:363 +msgid "Remove a variable with the given name." +msgstr "" + +#: modules/visual_script/doc_classes/VisualScript.xml:374 +msgid "Change the name of a custom signal." +msgstr "" + +#: modules/visual_script/doc_classes/VisualScript.xml:385 +msgid "Change the name of a function." +msgstr "" + +#: modules/visual_script/doc_classes/VisualScript.xml:396 +msgid "Change the name of a variable." +msgstr "" + +#: modules/visual_script/doc_classes/VisualScript.xml:411 +msgid "" +"Connect two sequence ports. The execution will flow from of [code]from_node[/" +"code]'s [code]from_output[/code] into [code]to_node[/code].\n" +"Unlike [method data_connect], there isn't a [code]to_port[/code], since the " +"target node can have only one sequence port." +msgstr "" + +#: modules/visual_script/doc_classes/VisualScript.xml:427 +msgid "" +"Disconnect two sequence ports previously connected with [method " +"sequence_connect]." +msgstr "" + +#: modules/visual_script/doc_classes/VisualScript.xml:438 +msgid "Position the center of the screen for a function." +msgstr "" + +#: modules/visual_script/doc_classes/VisualScript.xml:447 +msgid "Set the base type of the script." +msgstr "" + +#: modules/visual_script/doc_classes/VisualScript.xml:460 +msgid "Position a node on the screen." +msgstr "" + +#: modules/visual_script/doc_classes/VisualScript.xml:471 +msgid "Change the default (initial) value of a variable." +msgstr "" + +#: modules/visual_script/doc_classes/VisualScript.xml:482 +msgid "Change whether a variable is exported." +msgstr "" + +#: modules/visual_script/doc_classes/VisualScript.xml:493 +msgid "" +"Set a variable's info, using the same format as [method get_variable_info]." +msgstr "" + +#: modules/visual_script/doc_classes/VisualScript.xml:504 +msgid "Emitted when the ports of a node are changed." +msgstr "" + +#: modules/visual_script/doc_classes/VisualScriptBasicTypeConstant.xml:4 +msgid "A Visual Script node representing a constant from the base types." +msgstr "" + +#: modules/visual_script/doc_classes/VisualScriptBasicTypeConstant.xml:7 +msgid "" +"A Visual Script node representing a constant from base types, such as " +"[constant Vector3.AXIS_X]." +msgstr "" + +#: modules/visual_script/doc_classes/VisualScriptBasicTypeConstant.xml:15 +msgid "The type to get the constant from." +msgstr "" + +#: modules/visual_script/doc_classes/VisualScriptBasicTypeConstant.xml:18 +msgid "The name of the constant to return." +msgstr "" + +#: modules/visual_script/doc_classes/VisualScriptBuiltinFunc.xml:4 +msgid "A Visual Script node used to call built-in functions." +msgstr "" + +#: modules/visual_script/doc_classes/VisualScriptBuiltinFunc.xml:7 +msgid "" +"A built-in function used inside a [VisualScript]. It is usually a math " +"function or an utility function.\n" +"See also [@GDScript], for the same functions in the GDScript language." +msgstr "" + +#: modules/visual_script/doc_classes/VisualScriptBuiltinFunc.xml:16 +msgid "The function to be executed." +msgstr "" + +#: modules/visual_script/doc_classes/VisualScriptBuiltinFunc.xml:21 +msgid "Return the sine of the input." +msgstr "" + +#: modules/visual_script/doc_classes/VisualScriptBuiltinFunc.xml:24 +msgid "Return the cosine of the input." +msgstr "" + +#: modules/visual_script/doc_classes/VisualScriptBuiltinFunc.xml:27 +msgid "Return the tangent of the input." +msgstr "" + +#: modules/visual_script/doc_classes/VisualScriptBuiltinFunc.xml:30 +msgid "Return the hyperbolic sine of the input." +msgstr "" + +#: modules/visual_script/doc_classes/VisualScriptBuiltinFunc.xml:33 +msgid "Return the hyperbolic cosine of the input." +msgstr "" + +#: modules/visual_script/doc_classes/VisualScriptBuiltinFunc.xml:36 +msgid "Return the hyperbolic tangent of the input." +msgstr "" + +#: modules/visual_script/doc_classes/VisualScriptBuiltinFunc.xml:39 +msgid "Return the arc sine of the input." +msgstr "" + +#: modules/visual_script/doc_classes/VisualScriptBuiltinFunc.xml:42 +msgid "Return the arc cosine of the input." +msgstr "" + +#: modules/visual_script/doc_classes/VisualScriptBuiltinFunc.xml:45 +msgid "Return the arc tangent of the input." +msgstr "" + +#: modules/visual_script/doc_classes/VisualScriptBuiltinFunc.xml:48 +msgid "" +"Return the arc tangent of the input, using the signs of both parameters to " +"determine the exact angle." +msgstr "" + +#: modules/visual_script/doc_classes/VisualScriptBuiltinFunc.xml:51 +msgid "Return the square root of the input." +msgstr "" + +#: modules/visual_script/doc_classes/VisualScriptBuiltinFunc.xml:54 +msgid "" +"Return the remainder of one input divided by the other, using floating-point " +"numbers." +msgstr "" + +#: modules/visual_script/doc_classes/VisualScriptBuiltinFunc.xml:57 +msgid "" +"Return the positive remainder of one input divided by the other, using " +"floating-point numbers." +msgstr "" + +#: modules/visual_script/doc_classes/VisualScriptBuiltinFunc.xml:60 +msgid "Return the input rounded down." +msgstr "" + +#: modules/visual_script/doc_classes/VisualScriptBuiltinFunc.xml:63 +msgid "Return the input rounded up." +msgstr "" + +#: modules/visual_script/doc_classes/VisualScriptBuiltinFunc.xml:66 +msgid "Return the input rounded to the nearest integer." +msgstr "" + +#: modules/visual_script/doc_classes/VisualScriptBuiltinFunc.xml:69 +msgid "Return the absolute value of the input." +msgstr "" + +#: modules/visual_script/doc_classes/VisualScriptBuiltinFunc.xml:72 +msgid "" +"Return the sign of the input, turning it into 1, -1, or 0. Useful to " +"determine if the input is positive or negative." +msgstr "" + +#: modules/visual_script/doc_classes/VisualScriptBuiltinFunc.xml:75 +msgid "Return the input raised to a given power." +msgstr "" + +#: modules/visual_script/doc_classes/VisualScriptBuiltinFunc.xml:78 +msgid "" +"Return the natural logarithm of the input. Note that this is not the typical " +"base-10 logarithm function calculators use." +msgstr "" + +#: modules/visual_script/doc_classes/VisualScriptBuiltinFunc.xml:81 +msgid "" +"Return the mathematical constant [b]e[/b] raised to the specified power of " +"the input. [b]e[/b] has an approximate value of 2.71828." +msgstr "" + +#: modules/visual_script/doc_classes/VisualScriptBuiltinFunc.xml:84 +msgid "" +"Return whether the input is NaN (Not a Number) or not. NaN is usually " +"produced by dividing 0 by 0, though other ways exist." +msgstr "" + +#: modules/visual_script/doc_classes/VisualScriptBuiltinFunc.xml:87 +msgid "" +"Return whether the input is an infinite floating-point number or not. " +"Infinity is usually produced by dividing a number by 0, though other ways " +"exist." +msgstr "" + +#: modules/visual_script/doc_classes/VisualScriptBuiltinFunc.xml:93 +msgid "" +"Return the number of digit places after the decimal that the first non-zero " +"digit occurs." +msgstr "" + +#: modules/visual_script/doc_classes/VisualScriptBuiltinFunc.xml:96 +msgid "Return the input snapped to a given step." +msgstr "" + +#: modules/visual_script/doc_classes/VisualScriptBuiltinFunc.xml:99 +msgid "" +"Return a number linearly interpolated between the first two inputs, based on " +"the third input. Uses the formula [code]a + (a - b) * t[/code]." +msgstr "" + +#: modules/visual_script/doc_classes/VisualScriptBuiltinFunc.xml:106 +msgid "Moves the number toward a value, based on the third input." +msgstr "" + +#: modules/visual_script/doc_classes/VisualScriptBuiltinFunc.xml:109 +msgid "" +"Return the result of [code]value[/code] decreased by [code]step[/code] * " +"[code]amount[/code]." +msgstr "" + +#: modules/visual_script/doc_classes/VisualScriptBuiltinFunc.xml:112 +msgid "" +"Randomize the seed (or the internal state) of the random number generator. " +"Current implementation reseeds using a number based on time." +msgstr "" + +#: modules/visual_script/doc_classes/VisualScriptBuiltinFunc.xml:115 +msgid "" +"Return a random 32 bits integer value. To obtain a random value between 0 to " +"N (where N is smaller than 2^32 - 1), you can use it with the remainder " +"function." +msgstr "" + +#: modules/visual_script/doc_classes/VisualScriptBuiltinFunc.xml:118 +msgid "" +"Return a random floating-point value between 0 and 1. To obtain a random " +"value between 0 to N, you can use it with multiplication." +msgstr "" + +#: modules/visual_script/doc_classes/VisualScriptBuiltinFunc.xml:121 +msgid "Return a random floating-point value between the two inputs." +msgstr "" + +#: modules/visual_script/doc_classes/VisualScriptBuiltinFunc.xml:124 +msgid "Set the seed for the random number generator." +msgstr "" + +#: modules/visual_script/doc_classes/VisualScriptBuiltinFunc.xml:127 +msgid "Return a random value from the given seed, along with the new seed." +msgstr "" + +#: modules/visual_script/doc_classes/VisualScriptBuiltinFunc.xml:130 +msgid "Convert the input from degrees to radians." +msgstr "" + +#: modules/visual_script/doc_classes/VisualScriptBuiltinFunc.xml:133 +msgid "Convert the input from radians to degrees." +msgstr "" + +#: modules/visual_script/doc_classes/VisualScriptBuiltinFunc.xml:136 +msgid "Convert the input from linear volume to decibel volume." +msgstr "" + +#: modules/visual_script/doc_classes/VisualScriptBuiltinFunc.xml:139 +msgid "Convert the input from decibel volume to linear volume." +msgstr "" + +#: modules/visual_script/doc_classes/VisualScriptBuiltinFunc.xml:152 +msgid "Return the greater of the two numbers, also known as their maximum." +msgstr "" + +#: modules/visual_script/doc_classes/VisualScriptBuiltinFunc.xml:155 +msgid "Return the lesser of the two numbers, also known as their minimum." +msgstr "" + +#: modules/visual_script/doc_classes/VisualScriptBuiltinFunc.xml:158 +msgid "" +"Return the input clamped inside the given range, ensuring the result is " +"never outside it. Equivalent to [code]min(max(input, range_low), range_high)" +"[/code]." +msgstr "" + +#: modules/visual_script/doc_classes/VisualScriptBuiltinFunc.xml:161 +msgid "Return the nearest power of 2 to the input." +msgstr "" + +#: modules/visual_script/doc_classes/VisualScriptBuiltinFunc.xml:164 +msgid "Create a [WeakRef] from the input." +msgstr "" + +#: modules/visual_script/doc_classes/VisualScriptBuiltinFunc.xml:167 +msgid "Create a [FuncRef] from the input." +msgstr "" + +#: modules/visual_script/doc_classes/VisualScriptBuiltinFunc.xml:170 +msgid "Convert between types." +msgstr "" + +#: modules/visual_script/doc_classes/VisualScriptBuiltinFunc.xml:173 +msgid "" +"Return the type of the input as an integer. Check [enum Variant.Type] for " +"the integers that might be returned." +msgstr "" + +#: modules/visual_script/doc_classes/VisualScriptBuiltinFunc.xml:176 +msgid "Checks if a type is registered in the [ClassDB]." +msgstr "" + +#: modules/visual_script/doc_classes/VisualScriptBuiltinFunc.xml:179 +msgid "Return a character with the given ascii value." +msgstr "" + +#: modules/visual_script/doc_classes/VisualScriptBuiltinFunc.xml:182 +msgid "Convert the input to a string." +msgstr "" + +#: modules/visual_script/doc_classes/VisualScriptBuiltinFunc.xml:185 +msgid "Print the given string to the output window." +msgstr "" + +#: modules/visual_script/doc_classes/VisualScriptBuiltinFunc.xml:188 +msgid "Print the given string to the standard error output." +msgstr "" + +#: modules/visual_script/doc_classes/VisualScriptBuiltinFunc.xml:191 +msgid "" +"Print the given string to the standard output, without adding a newline." +msgstr "" + +#: modules/visual_script/doc_classes/VisualScriptBuiltinFunc.xml:194 +msgid "Serialize a [Variant] to a string." +msgstr "" + +#: modules/visual_script/doc_classes/VisualScriptBuiltinFunc.xml:197 +msgid "" +"Deserialize a [Variant] from a string serialized using [constant VAR_TO_STR]." +msgstr "" + +#: modules/visual_script/doc_classes/VisualScriptBuiltinFunc.xml:200 +msgid "Serialize a [Variant] to a [PackedByteArray]." +msgstr "" + +#: modules/visual_script/doc_classes/VisualScriptBuiltinFunc.xml:203 +msgid "" +"Deserialize a [Variant] from a [PackedByteArray] serialized using [constant " +"VAR_TO_BYTES]." +msgstr "" + +#: modules/visual_script/doc_classes/VisualScriptBuiltinFunc.xml:206 +msgid "" +"Return the [Color] with the given name and alpha ranging from 0 to 1.\n" +"[b]Note:[/b] Names are defined in [code]color_names.inc[/code]." +msgstr "" + +#: modules/visual_script/doc_classes/VisualScriptBuiltinFunc.xml:210 +msgid "" +"Return a number smoothly interpolated between the first two inputs, based on " +"the third input. Similar to [constant MATH_LERP], but interpolates faster at " +"the beginning and slower at the end. Using Hermite interpolation formula:\n" +"[codeblock]\n" +"var t = clamp((weight - from) / (to - from), 0.0, 1.0)\n" +"return t * t * (3.0 - 2.0 * t)\n" +"[/codeblock]" +msgstr "" + +#: modules/visual_script/doc_classes/VisualScriptBuiltinFunc.xml:223 +msgid "Represents the size of the [enum BuiltinFunc] enum." +msgstr "" + +#: modules/visual_script/doc_classes/VisualScriptClassConstant.xml:4 +msgid "Gets a constant from a given class." +msgstr "" + +#: modules/visual_script/doc_classes/VisualScriptClassConstant.xml:7 +msgid "" +"This node returns a constant from a given class, such as [constant " +"TYPE_INT]. See the given class' documentation for available constants.\n" +"[b]Input Ports:[/b]\n" +"none\n" +"[b]Output Ports:[/b]\n" +"- Data (variant): [code]value[/code]" +msgstr "" + +#: modules/visual_script/doc_classes/VisualScriptClassConstant.xml:19 +msgid "The constant's parent class." +msgstr "" + +#: modules/visual_script/doc_classes/VisualScriptClassConstant.xml:22 +msgid "" +"The constant to return. See the given class for its available constants." +msgstr "" + +#: modules/visual_script/doc_classes/VisualScriptComment.xml:4 +msgid "A Visual Script node used to annotate the script." +msgstr "" + +#: modules/visual_script/doc_classes/VisualScriptComment.xml:7 +msgid "" +"A Visual Script node used to display annotations in the script, so that code " +"may be documented.\n" +"Comment nodes can be resized so they encompass a group of nodes." +msgstr "" + +#: modules/visual_script/doc_classes/VisualScriptComment.xml:16 +msgid "The text inside the comment node." +msgstr "" + +#: modules/visual_script/doc_classes/VisualScriptComment.xml:19 +msgid "The comment node's size (in pixels)." +msgstr "" + +#: modules/visual_script/doc_classes/VisualScriptComment.xml:22 +msgid "The comment node's title." +msgstr "" + +#: modules/visual_script/doc_classes/VisualScriptComposeArray.xml:4 +msgid "A Visual Script Node used to create array from a list of items." +msgstr "" + +#: modules/visual_script/doc_classes/VisualScriptComposeArray.xml:7 +msgid "" +"A Visual Script Node used to compose array from the list of elements " +"provided with custom in-graph UI hard coded in the VisualScript Editor." +msgstr "" + +#: modules/visual_script/doc_classes/VisualScriptCondition.xml:4 +msgid "A Visual Script node which branches the flow." +msgstr "" + +#: modules/visual_script/doc_classes/VisualScriptCondition.xml:7 +msgid "" +"A Visual Script node that checks a [bool] input port. If [code]true[/code], " +"it will exit via the \"true\" sequence port. If [code]false[/code], it will " +"exit via the \"false\" sequence port. After exiting either, it exits via the " +"\"done\" port. Sequence ports may be left disconnected.\n" +"[b]Input Ports:[/b]\n" +"- Sequence: [code]if (cond) is[/code]\n" +"- Data (boolean): [code]cond[/code]\n" +"[b]Output Ports:[/b]\n" +"- Sequence: [code]true[/code]\n" +"- Sequence: [code]false[/code]\n" +"- Sequence: [code]done[/code]" +msgstr "" + +#: modules/visual_script/doc_classes/VisualScriptConstant.xml:4 +msgid "Gets a contant's value." +msgstr "" + +#: modules/visual_script/doc_classes/VisualScriptConstant.xml:7 +msgid "" +"This node returns a constant's value.\n" +"[b]Input Ports:[/b]\n" +"none\n" +"[b]Output Ports:[/b]\n" +"- Data (variant): [code]get[/code]" +msgstr "" + +#: modules/visual_script/doc_classes/VisualScriptConstant.xml:19 +msgid "The constant's type." +msgstr "" + +#: modules/visual_script/doc_classes/VisualScriptConstant.xml:22 +msgid "The constant's value." +msgstr "" + +#: modules/visual_script/doc_classes/VisualScriptConstructor.xml:4 +msgid "A Visual Script node which calls a base type constructor." +msgstr "" + +#: modules/visual_script/doc_classes/VisualScriptConstructor.xml:7 +msgid "" +"A Visual Script node which calls a base type constructor. It can be used for " +"type conversion as well." +msgstr "" + +#: modules/visual_script/doc_classes/VisualScriptCustomNode.xml:4 +msgid "A scripted Visual Script node." +msgstr "" + +#: modules/visual_script/doc_classes/VisualScriptCustomNode.xml:7 +msgid "A custom Visual Script node which can be scripted in powerful ways." +msgstr "" + +#: modules/visual_script/doc_classes/VisualScriptCustomNode.xml:16 +msgid "Return the node's title." +msgstr "" + +#: modules/visual_script/doc_classes/VisualScriptCustomNode.xml:23 +msgid "Return the node's category." +msgstr "" + +#: modules/visual_script/doc_classes/VisualScriptCustomNode.xml:30 +msgid "Return the count of input value ports." +msgstr "" + +#: modules/visual_script/doc_classes/VisualScriptCustomNode.xml:39 +msgid "Return the specified input port's name." +msgstr "" + +#: modules/visual_script/doc_classes/VisualScriptCustomNode.xml:48 +msgid "" +"Return the specified input port's type. See the [enum Variant.Type] values." +msgstr "" + +#: modules/visual_script/doc_classes/VisualScriptCustomNode.xml:55 +msgid "Return the amount of output [b]sequence[/b] ports." +msgstr "" + +#: modules/visual_script/doc_classes/VisualScriptCustomNode.xml:64 +msgid "Return the specified [b]sequence[/b] output's name." +msgstr "" + +#: modules/visual_script/doc_classes/VisualScriptCustomNode.xml:71 +msgid "Return the amount of output value ports." +msgstr "" + +#: modules/visual_script/doc_classes/VisualScriptCustomNode.xml:80 +msgid "Return the specified output's name." +msgstr "" + +#: modules/visual_script/doc_classes/VisualScriptCustomNode.xml:89 +msgid "Return the specified output's type. See the [enum Variant.Type] values." +msgstr "" + +#: modules/visual_script/doc_classes/VisualScriptCustomNode.xml:96 +msgid "" +"Return the custom node's text, which is shown right next to the input " +"[b]sequence[/b] port (if there is none, on the place that is usually taken " +"by it)." +msgstr "" + +#: modules/visual_script/doc_classes/VisualScriptCustomNode.xml:103 +msgid "" +"Return the size of the custom node's working memory. See [method _step] for " +"more details." +msgstr "" + +#: modules/visual_script/doc_classes/VisualScriptCustomNode.xml:110 +msgid "Return whether the custom node has an input [b]sequence[/b] port." +msgstr "" + +#: modules/visual_script/doc_classes/VisualScriptCustomNode.xml:125 +msgid "" +"Execute the custom node's logic, returning the index of the output sequence " +"port to use or a [String] when there is an error.\n" +"The [code]inputs[/code] array contains the values of the input ports.\n" +"[code]outputs[/code] is an array whose indices should be set to the " +"respective outputs.\n" +"The [code]start_mode[/code] is usually [constant START_MODE_BEGIN_SEQUENCE], " +"unless you have used the [code]STEP_*[/code] constants.\n" +"[code]working_mem[/code] is an array which can be used to persist " +"information between runs of the custom node.\n" +"When returning, you can mask the returned value with one of the " +"[code]STEP_*[/code] constants." +msgstr "" + +#: modules/visual_script/doc_classes/VisualScriptCustomNode.xml:136 +msgid "The start mode used the first time when [method _step] is called." +msgstr "" + +#: modules/visual_script/doc_classes/VisualScriptCustomNode.xml:139 +msgid "" +"The start mode used when [method _step] is called after coming back from a " +"[constant STEP_PUSH_STACK_BIT]." +msgstr "" + +#: modules/visual_script/doc_classes/VisualScriptCustomNode.xml:142 +msgid "" +"The start mode used when [method _step] is called after resuming from " +"[constant STEP_YIELD_BIT]." +msgstr "" + +#: modules/visual_script/doc_classes/VisualScriptCustomNode.xml:145 +msgid "" +"Hint used by [method _step] to tell that control should return to it when " +"there is no other node left to execute.\n" +"This is used by [VisualScriptCondition] to redirect the sequence to the " +"\"Done\" port after the [code]true[/code]/[code]false[/code] branch has " +"finished execution." +msgstr "" + +#: modules/visual_script/doc_classes/VisualScriptCustomNode.xml:149 +msgid "" +"Hint used by [method _step] to tell that control should return back, either " +"hitting a previous [constant STEP_PUSH_STACK_BIT] or exiting the function." +msgstr "" + +#: modules/visual_script/doc_classes/VisualScriptCustomNode.xml:154 +msgid "" +"Hint used by [method _step] to tell that control should stop and exit the " +"function." +msgstr "" + +#: modules/visual_script/doc_classes/VisualScriptCustomNode.xml:157 +msgid "" +"Hint used by [method _step] to tell that the function should be yielded.\n" +"Using this requires you to have at least one working memory slot, which is " +"used for the [VisualScriptFunctionState]." +msgstr "" + +#: modules/visual_script/doc_classes/VisualScriptDeconstruct.xml:4 +#: modules/visual_script/doc_classes/VisualScriptDeconstruct.xml:7 +msgid "" +"A Visual Script node which deconstructs a base type instance into its parts." +msgstr "" + +#: modules/visual_script/doc_classes/VisualScriptDeconstruct.xml:15 +msgid "The type to deconstruct." +msgstr "" + +#: modules/visual_script/doc_classes/VisualScriptEditor.xml:20 +msgid "" +"Add a custom Visual Script node to the editor. It'll be placed under " +"\"Custom Nodes\" with the [code]category[/code] as the parameter." +msgstr "" + +#: modules/visual_script/doc_classes/VisualScriptEditor.xml:31 +msgid "" +"Remove a custom Visual Script node from the editor. Custom nodes already " +"placed on scripts won't be removed." +msgstr "" + +#: modules/visual_script/doc_classes/VisualScriptEditor.xml:38 +msgid "Emitted when a custom Visual Script node is added or removed." +msgstr "" + +#: modules/visual_script/doc_classes/VisualScriptEmitSignal.xml:4 +msgid "Emits a specified signal." +msgstr "" + +#: modules/visual_script/doc_classes/VisualScriptEmitSignal.xml:7 +msgid "" +"Emits a specified signal when it is executed.\n" +"[b]Input Ports:[/b]\n" +"- Sequence: [code]emit[/code]\n" +"[b]Output Ports:[/b]\n" +"- Sequence" +msgstr "" + +#: modules/visual_script/doc_classes/VisualScriptEmitSignal.xml:19 +msgid "The signal to emit." +msgstr "" + +#: modules/visual_script/doc_classes/VisualScriptEngineSingleton.xml:4 +#: modules/visual_script/doc_classes/VisualScriptEngineSingleton.xml:7 +msgid "A Visual Script node returning a singleton from [@GlobalScope]." +msgstr "" + +#: modules/visual_script/doc_classes/VisualScriptEngineSingleton.xml:15 +msgid "The singleton's name." +msgstr "" + +#: modules/visual_script/doc_classes/VisualScriptIterator.xml:4 +msgid "Steps through items in a given input." +msgstr "" + +#: modules/visual_script/doc_classes/VisualScriptIterator.xml:7 +msgid "" +"This node steps through each item in a given input. Input can be any " +"sequence data type, such as an [Array] or [String]. When each item has been " +"processed, execution passed out the [code]exit[/code] Sequence port.\n" +"[b]Input Ports:[/b]\n" +"- Sequence: [code]for (elem) in (input)[/code]\n" +"- Data (variant): [code]input[/code]\n" +"[b]Output Ports:[/b]\n" +"- Sequence: [code]each[/code]\n" +"- Sequence: [code]exit[/code]\n" +"- Data (variant): [code]elem[/code]" +msgstr "" + +#: modules/visual_script/doc_classes/VisualScriptLists.xml:4 +msgid "A Visual Script virtual class for in-graph editable nodes." +msgstr "" + +#: modules/visual_script/doc_classes/VisualScriptLists.xml:7 +msgid "" +"A Visual Script virtual class that defines the shape and the default " +"behaviour of the nodes that have to be in-graph editable nodes." +msgstr "" + +#: modules/visual_script/doc_classes/VisualScriptLocalVar.xml:4 +msgid "Gets a local variable's value." +msgstr "" + +#: modules/visual_script/doc_classes/VisualScriptLocalVar.xml:7 +msgid "" +"Returns a local variable's value. \"Var Name\" must be supplied, with an " +"optional type.\n" +"[b]Input Ports:[/b]\n" +"none\n" +"[b]Output Ports:[/b]\n" +"- Data (variant): [code]get[/code]" +msgstr "" + +#: modules/visual_script/doc_classes/VisualScriptLocalVar.xml:19 +#: modules/visual_script/doc_classes/VisualScriptLocalVarSet.xml:21 +msgid "The local variable's type." +msgstr "" + +#: modules/visual_script/doc_classes/VisualScriptLocalVar.xml:22 +#: modules/visual_script/doc_classes/VisualScriptLocalVarSet.xml:24 +msgid "The local variable's name." +msgstr "" + +#: modules/visual_script/doc_classes/VisualScriptLocalVarSet.xml:4 +msgid "Changes a local variable's value." +msgstr "" + +#: modules/visual_script/doc_classes/VisualScriptLocalVarSet.xml:7 +msgid "" +"Changes a local variable's value to the given input. The new value is also " +"provided on an output Data port.\n" +"[b]Input Ports:[/b]\n" +"- Sequence\n" +"- Data (variant): [code]set[/code]\n" +"[b]Output Ports:[/b]\n" +"- Sequence\n" +"- Data (variant): [code]get[/code]" +msgstr "" + +#: modules/visual_script/doc_classes/VisualScriptMathConstant.xml:4 +msgid "Commonly used mathematical constants." +msgstr "" + +#: modules/visual_script/doc_classes/VisualScriptMathConstant.xml:7 +msgid "" +"Provides common math constants, such as Pi, on an output Data port.\n" +"[b]Input Ports:[/b]\n" +"none\n" +"[b]Output Ports:[/b]\n" +"- Data (variant): [code]get[/code]" +msgstr "" + +#: modules/visual_script/doc_classes/VisualScriptMathConstant.xml:19 +msgid "The math constant." +msgstr "" + +#: modules/visual_script/doc_classes/VisualScriptMathConstant.xml:24 +msgid "Unity: [code]1[/code]." +msgstr "" + +#: modules/visual_script/doc_classes/VisualScriptMathConstant.xml:27 +msgid "Pi: [code]3.141593[/code]." +msgstr "" + +#: modules/visual_script/doc_classes/VisualScriptMathConstant.xml:30 +msgid "Pi divided by two: [code]1.570796[/code]." +msgstr "" + +#: modules/visual_script/doc_classes/VisualScriptMathConstant.xml:33 +msgid "Tau: [code]6.283185[/code]." +msgstr "" + +#: modules/visual_script/doc_classes/VisualScriptMathConstant.xml:36 +msgid "" +"Mathematical constant [code]e[/code], the natural log base: [code]2.718282[/" +"code]." +msgstr "" + +#: modules/visual_script/doc_classes/VisualScriptMathConstant.xml:39 +msgid "Square root of two: [code]1.414214[/code]." +msgstr "" + +#: modules/visual_script/doc_classes/VisualScriptMathConstant.xml:42 +msgid "Infinity: [code]inf[/code]." +msgstr "" + +#: modules/visual_script/doc_classes/VisualScriptMathConstant.xml:45 +msgid "Not a number: [code]nan[/code]." +msgstr "" + +#: modules/visual_script/doc_classes/VisualScriptMathConstant.xml:48 +msgid "Represents the size of the [enum MathConstant] enum." +msgstr "" + +#: modules/visual_script/doc_classes/VisualScriptNode.xml:4 +msgid "A node which is part of a [VisualScript]." +msgstr "" + +#: modules/visual_script/doc_classes/VisualScriptNode.xml:7 +msgid "" +"A node which is part of a [VisualScript]. Not to be confused with [Node], " +"which is a part of a [SceneTree]." +msgstr "" + +#: modules/visual_script/doc_classes/VisualScriptNode.xml:18 +msgid "" +"Returns the default value of a given port. The default value is used when " +"nothing is connected to the port." +msgstr "" + +#: modules/visual_script/doc_classes/VisualScriptNode.xml:25 +msgid "Returns the [VisualScript] instance the node is bound to." +msgstr "" + +#: modules/visual_script/doc_classes/VisualScriptNode.xml:32 +msgid "" +"Notify that the node's ports have changed. Usually used in conjunction with " +"[VisualScriptCustomNode] ." +msgstr "" + +#: modules/visual_script/doc_classes/VisualScriptNode.xml:43 +msgid "Change the default value of a given port." +msgstr "" + +#: modules/visual_script/doc_classes/VisualScriptNode.xml:50 +msgid "Emitted when the available input/output ports are changed." +msgstr "" + +#: modules/visual_script/doc_classes/VisualScriptOperator.xml:6 +msgid "" +"[b]Input Ports:[/b]\n" +"- Data (variant): [code]A[/code]\n" +"- Data (variant): [code]B[/code]\n" +"[b]Output Ports:[/b]\n" +"- Data (variant): [code]result[/code]" +msgstr "" + +#: modules/visual_script/doc_classes/VisualScriptPreload.xml:4 +msgid "Creates a new [Resource] or loads one from the filesystem." +msgstr "" + +#: modules/visual_script/doc_classes/VisualScriptPreload.xml:7 +msgid "" +"Creates a new [Resource] or loads one from the filesystem.\n" +"[b]Input Ports:[/b]\n" +"none\n" +"[b]Output Ports:[/b]\n" +"- Data (object): [code]res[/code]" +msgstr "" + +#: modules/visual_script/doc_classes/VisualScriptPreload.xml:19 +msgid "The [Resource] to load." +msgstr "" + +#: modules/visual_script/doc_classes/VisualScriptReturn.xml:4 +msgid "Exits a function and returns an optional value." +msgstr "" + +#: modules/visual_script/doc_classes/VisualScriptReturn.xml:7 +msgid "" +"Ends the execution of a function and returns control to the calling " +"function. Optionally, it can return a [Variant] value.\n" +"[b]Input Ports:[/b]\n" +"- Sequence\n" +"- Data (variant): [code]result[/code] (optional)\n" +"[b]Output Ports:[/b]\n" +"none" +msgstr "" + +#: modules/visual_script/doc_classes/VisualScriptReturn.xml:20 +msgid "If [code]true[/code], the [code]return[/code] input port is available." +msgstr "" + +#: modules/visual_script/doc_classes/VisualScriptReturn.xml:23 +msgid "The return value's data type." +msgstr "" + +#: modules/visual_script/doc_classes/VisualScriptSceneNode.xml:4 +msgid "Node reference." +msgstr "" + +#: modules/visual_script/doc_classes/VisualScriptSceneNode.xml:7 +msgid "" +"A direct reference to a node.\n" +"[b]Input Ports:[/b]\n" +"none\n" +"[b]Output Ports:[/b]\n" +"- Data: [code]node[/code] (obj)" +msgstr "" + +#: modules/visual_script/doc_classes/VisualScriptSceneNode.xml:19 +msgid "The node's path in the scene tree." +msgstr "" + +#: modules/visual_script/doc_classes/VisualScriptSelect.xml:4 +msgid "Chooses between two input values." +msgstr "" + +#: modules/visual_script/doc_classes/VisualScriptSelect.xml:7 +msgid "" +"Chooses between two input values based on a Boolean condition.\n" +"[b]Input Ports:[/b]\n" +"- Data (boolean): [code]cond[/code]\n" +"- Data (variant): [code]a[/code]\n" +"- Data (variant): [code]b[/code]\n" +"[b]Output Ports:[/b]\n" +"- Data (variant): [code]out[/code]" +msgstr "" + +#: modules/visual_script/doc_classes/VisualScriptSelect.xml:21 +msgid "The input variables' type." +msgstr "" + +#: modules/visual_script/doc_classes/VisualScriptSelf.xml:4 +msgid "Outputs a reference to the current instance." +msgstr "" + +#: modules/visual_script/doc_classes/VisualScriptSelf.xml:7 +msgid "" +"Provides a reference to the node running the visual script.\n" +"[b]Input Ports:[/b]\n" +"none\n" +"[b]Output Ports:[/b]\n" +"- Data (object): [code]instance[/code]" +msgstr "" + +#: modules/visual_script/doc_classes/VisualScriptSequence.xml:4 +msgid "Executes a series of Sequence ports." +msgstr "" + +#: modules/visual_script/doc_classes/VisualScriptSequence.xml:7 +msgid "" +"Steps through a series of one or more output Sequence ports. The " +"[code]current[/code] data port outputs the currently executing item.\n" +"[b]Input Ports:[/b]\n" +"- Sequence: [code]in order[/code]\n" +"[b]Output Ports:[/b]\n" +"- Sequence: [code]1[/code]\n" +"- Sequence: [code]2 - n[/code] (optional)\n" +"- Data (int): [code]current[/code]" +msgstr "" + +#: modules/visual_script/doc_classes/VisualScriptSequence.xml:21 +msgid "The number of steps in the sequence." +msgstr "" + +#: modules/visual_script/doc_classes/VisualScriptSwitch.xml:4 +msgid "Branches program flow based on a given input's value." +msgstr "" + +#: modules/visual_script/doc_classes/VisualScriptSwitch.xml:7 +msgid "" +"Branches the flow based on an input's value. Use [b]Case Count[/b] in the " +"Inspector to set the number of branches and each comparison's optional " +"type.\n" +"[b]Input Ports:[/b]\n" +"- Sequence: [code]'input' is[/code]\n" +"- Data (variant): [code]=[/code]\n" +"- Data (variant): [code]=[/code] (optional)\n" +"- Data (variant): [code]input[/code]\n" +"[b]Output Ports:[/b]\n" +"- Sequence\n" +"- Sequence (optional)\n" +"- Sequence: [code]done[/code]" +msgstr "" + +#: modules/visual_script/doc_classes/VisualScriptVariableGet.xml:4 +msgid "Gets a variable's value." +msgstr "" + +#: modules/visual_script/doc_classes/VisualScriptVariableGet.xml:7 +msgid "" +"Returns a variable's value. \"Var Name\" must be supplied, with an optional " +"type.\n" +"[b]Input Ports:[/b]\n" +"none\n" +"[b]Output Ports:[/b]\n" +"- Data (variant): [code]value[/code]" +msgstr "" + +#: modules/visual_script/doc_classes/VisualScriptVariableGet.xml:19 +#: modules/visual_script/doc_classes/VisualScriptVariableSet.xml:20 +msgid "The variable's name." +msgstr "" + +#: modules/visual_script/doc_classes/VisualScriptVariableSet.xml:4 +msgid "Changes a variable's value." +msgstr "" + +#: modules/visual_script/doc_classes/VisualScriptVariableSet.xml:7 +msgid "" +"Changes a variable's value to the given input.\n" +"[b]Input Ports:[/b]\n" +"- Sequence\n" +"- Data (variant): [code]set[/code]\n" +"[b]Output Ports:[/b]\n" +"- Sequence" +msgstr "" + +#: modules/visual_script/doc_classes/VisualScriptWhile.xml:4 +msgid "Conditional loop." +msgstr "" + +#: modules/visual_script/doc_classes/VisualScriptWhile.xml:7 +msgid "" +"Loops while a condition is [code]true[/code]. Execution continues out the " +"[code]exit[/code] Sequence port when the loop terminates.\n" +"[b]Input Ports:[/b]\n" +"- Sequence: [code]while(cond)[/code]\n" +"- Data (bool): [code]cond[/code]\n" +"[b]Output Ports:[/b]\n" +"- Sequence: [code]repeat[/code]\n" +"- Sequence: [code]exit[/code]" +msgstr "" + +#: doc/classes/VisualShader.xml:4 +msgid "A custom shader program with a visual editor." +msgstr "" + +#: doc/classes/VisualShader.xml:7 +msgid "" +"This class allows you to define a custom shader program that can be used for " +"various materials to render objects.\n" +"The visual shader editor creates the shader." +msgstr "" + +#: doc/classes/VisualShader.xml:25 +msgid "Adds the specified node to the shader." +msgstr "" + +#: doc/classes/VisualShader.xml:42 +msgid "" +"Returns [code]true[/code] if the specified nodes and ports can be connected " +"together." +msgstr "" + +#: doc/classes/VisualShader.xml:59 doc/classes/VisualShader.xml:93 +msgid "Connects the specified nodes and ports." +msgstr "" + +#: doc/classes/VisualShader.xml:76 +msgid "" +"Connects the specified nodes and ports, even if they can't be connected. " +"Such connection is invalid and will not function properly." +msgstr "" + +#: doc/classes/VisualShader.xml:104 +msgid "" +"Returns the shader node instance with specified [code]type[/code] and " +"[code]id[/code]." +msgstr "" + +#: doc/classes/VisualShader.xml:113 +msgid "Returns the list of connected nodes with the specified type." +msgstr "" + +#: doc/classes/VisualShader.xml:122 +msgid "Returns the list of all nodes in the shader with the specified type." +msgstr "" + +#: doc/classes/VisualShader.xml:133 +msgid "Returns the position of the specified node within the shader graph." +msgstr "" + +#: doc/classes/VisualShader.xml:158 +msgid "" +"Returns [code]true[/code] if the specified node and port connection exist." +msgstr "" + +#: doc/classes/VisualShader.xml:169 +msgid "Removes the specified node from the shader." +msgstr "" + +#: doc/classes/VisualShader.xml:178 +msgid "Sets the mode of this shader." +msgstr "" + +#: doc/classes/VisualShader.xml:191 +msgid "Sets the position of the specified node." +msgstr "" + +#: doc/classes/VisualShader.xml:198 +msgid "The offset vector of the whole graph." +msgstr "" + +#: doc/classes/VisualShader.xml:205 +msgid "A vertex shader, operating on vertices." +msgstr "" + +#: doc/classes/VisualShader.xml:208 +msgid "A fragment shader, operating on fragments (pixels)." +msgstr "" + +#: doc/classes/VisualShader.xml:211 +msgid "A shader for light calculations." +msgstr "" + +#: doc/classes/VisualShader.xml:214 +msgid "Represents the size of the [enum Type] enum." +msgstr "" + +#: doc/classes/VisualShaderNode.xml:4 +msgid "Base class for nodes in a visual shader graph." +msgstr "" + +#: doc/classes/VisualShaderNode.xml:9 +msgid "" +"https://docs.godotengine.org/en/latest/tutorials/shading/visual_shaders.html" +msgstr "" + +#: doc/classes/VisualShaderNode.xml:16 +msgid "" +"Returns an [Array] containing default values for all of the input ports of " +"the node in the form [code][index0, value0, index1, value1, ...][/code]." +msgstr "" + +#: doc/classes/VisualShaderNode.xml:25 +msgid "Returns the default value of the input [code]port[/code]." +msgstr "" + +#: doc/classes/VisualShaderNode.xml:34 +msgid "" +"Sets the default input ports values using an [Array] of the form [code]" +"[index0, value0, index1, value1, ...][/code]. For example: [code][0, " +"Vector3(0, 0, 0), 1, Vector3(0, 0, 0)][/code]." +msgstr "" + +#: doc/classes/VisualShaderNode.xml:45 +msgid "Sets the default value for the selected input [code]port[/code]." +msgstr "" + +#: doc/classes/VisualShaderNode.xml:51 +msgid "" +"Sets the output port index which will be showed for preview. If set to " +"[code]-1[/code] no port will be open for preview." +msgstr "" + +#: doc/classes/VisualShaderNode.xml:57 +msgid "" +"Emitted when the node requests an editor refresh. Currently called only in " +"setter of [member VisualShaderNodeTexture.source], " +"[VisualShaderNodeTexture], and [VisualShaderNodeCubemap] (and their " +"derivatives)." +msgstr "" + +#: doc/classes/VisualShaderNode.xml:63 +msgid "" +"Floating-point scalar. Translated to [code]float[/code] type in shader code." +msgstr "" + +#: doc/classes/VisualShaderNode.xml:66 +msgid "Integer scalar. Translated to [code]int[/code] type in shader code." +msgstr "" + +#: doc/classes/VisualShaderNode.xml:69 +msgid "" +"3D vector of floating-point values. Translated to [code]vec3[/code] type in " +"shader code." +msgstr "" + +#: doc/classes/VisualShaderNode.xml:72 +msgid "Boolean type. Translated to [code]bool[/code] type in shader code." +msgstr "" + +#: doc/classes/VisualShaderNode.xml:75 +msgid "Transform type. Translated to [code]mat4[/code] type in shader code." +msgstr "" + +#: doc/classes/VisualShaderNode.xml:78 +msgid "" +"Sampler type. Translated to reference of sampler uniform in shader code. Can " +"only be used for input ports in non-uniform nodes." +msgstr "" + +#: doc/classes/VisualShaderNode.xml:81 +msgid "Represents the size of the [enum PortType] enum." +msgstr "" + +#: doc/classes/VisualShaderNodeBooleanConstant.xml:4 +msgid "A boolean constant to be used within the visual shader graph." +msgstr "" + +#: doc/classes/VisualShaderNodeBooleanConstant.xml:7 +msgid "" +"Has only one output port and no inputs.\n" +"Translated to [code]bool[/code] in the shader language." +msgstr "" + +#: doc/classes/VisualShaderNodeBooleanConstant.xml:16 +msgid "A boolean constant which represents a state of this node." +msgstr "" + +#: doc/classes/VisualShaderNodeBooleanUniform.xml:4 +msgid "A boolean uniform to be used within the visual shader graph." +msgstr "" + +#: doc/classes/VisualShaderNodeBooleanUniform.xml:7 +msgid "Translated to [code]uniform bool[/code] in the shader language." +msgstr "" + +#: doc/classes/VisualShaderNodeColorConstant.xml:4 +msgid "A [Color] constant to be used within the visual shader graph." +msgstr "" + +#: doc/classes/VisualShaderNodeColorConstant.xml:7 +msgid "" +"Has two output ports representing RGB and alpha channels of [Color].\n" +"Translated to [code]vec3 rgb[/code] and [code]float alpha[/code] in the " +"shader language." +msgstr "" + +#: doc/classes/VisualShaderNodeColorConstant.xml:16 +msgid "A [Color] constant which represents a state of this node." +msgstr "" + +#: doc/classes/VisualShaderNodeColorFunc.xml:4 +msgid "A [Color] function to be used within the visual shader graph." +msgstr "" + +#: doc/classes/VisualShaderNodeColorFunc.xml:7 +msgid "" +"Accept a [Color] to the input port and transform it according to [member " +"function]." +msgstr "" + +#: doc/classes/VisualShaderNodeColorFunc.xml:15 +msgid "" +"A function to be applied to the input color. See [enum Function] for options." +msgstr "" + +#: doc/classes/VisualShaderNodeColorFunc.xml:20 +msgid "" +"Converts the color to grayscale using the following formula:\n" +"[codeblock]\n" +"vec3 c = input;\n" +"float max1 = max(c.r, c.g);\n" +"float max2 = max(max1, c.b);\n" +"float max3 = max(max1, max2);\n" +"return vec3(max3, max3, max3);\n" +"[/codeblock]" +msgstr "" + +#: doc/classes/VisualShaderNodeColorFunc.xml:30 +msgid "" +"Applies sepia tone effect using the following formula:\n" +"[codeblock]\n" +"vec3 c = input;\n" +"float r = (c.r * 0.393) + (c.g * 0.769) + (c.b * 0.189);\n" +"float g = (c.r * 0.349) + (c.g * 0.686) + (c.b * 0.168);\n" +"float b = (c.r * 0.272) + (c.g * 0.534) + (c.b * 0.131);\n" +"return vec3(r, g, b);\n" +"[/codeblock]" +msgstr "" + +#: doc/classes/VisualShaderNodeColorOp.xml:4 +msgid "A [Color] operator to be used within the visual shader graph." +msgstr "" + +#: doc/classes/VisualShaderNodeColorOp.xml:7 +msgid "Applies [member operator] to two color inputs." +msgstr "" + +#: doc/classes/VisualShaderNodeColorOp.xml:15 +#: doc/classes/VisualShaderNodeFloatOp.xml:15 +#: doc/classes/VisualShaderNodeIntOp.xml:15 +msgid "" +"An operator to be applied to the inputs. See [enum Operator] for options." +msgstr "" + +#: doc/classes/VisualShaderNodeColorOp.xml:20 +msgid "" +"Produce a screen effect with the following formula:\n" +"[codeblock]\n" +"result = vec3(1.0) - (vec3(1.0) - a) * (vec3(1.0) - b);\n" +"[/codeblock]" +msgstr "" + +#: doc/classes/VisualShaderNodeColorOp.xml:26 +msgid "" +"Produce a difference effect with the following formula:\n" +"[codeblock]\n" +"result = abs(a - b);\n" +"[/codeblock]" +msgstr "" + +#: doc/classes/VisualShaderNodeColorOp.xml:32 +msgid "" +"Produce a darken effect with the following formula:\n" +"[codeblock]\n" +"result = min(a, b);\n" +"[/codeblock]" +msgstr "" + +#: doc/classes/VisualShaderNodeColorOp.xml:38 +msgid "" +"Produce a lighten effect with the following formula:\n" +"[codeblock]\n" +"result = max(a, b);\n" +"[/codeblock]" +msgstr "" + +#: doc/classes/VisualShaderNodeColorOp.xml:44 +msgid "" +"Produce an overlay effect with the following formula:\n" +"[codeblock]\n" +"for (int i = 0; i < 3; i++) {\n" +" float base = a[i];\n" +" float blend = b[i];\n" +" if (base < 0.5) {\n" +" result[i] = 2.0 * base * blend;\n" +" } else {\n" +" result[i] = 1.0 - 2.0 * (1.0 - blend) * (1.0 - base);\n" +" }\n" +"}\n" +"[/codeblock]" +msgstr "" + +#: doc/classes/VisualShaderNodeColorOp.xml:58 +msgid "" +"Produce a dodge effect with the following formula:\n" +"[codeblock]\n" +"result = a / (vec3(1.0) - b);\n" +"[/codeblock]" +msgstr "" + +#: doc/classes/VisualShaderNodeColorOp.xml:64 +msgid "" +"Produce a burn effect with the following formula:\n" +"[codeblock]\n" +"result = vec3(1.0) - (vec3(1.0) - a) / b;\n" +"[/codeblock]" +msgstr "" + +#: doc/classes/VisualShaderNodeColorOp.xml:70 +msgid "" +"Produce a soft light effect with the following formula:\n" +"[codeblock]\n" +"for (int i = 0; i < 3; i++) {\n" +" float base = a[i];\n" +" float blend = b[i];\n" +" if (base < 0.5) {\n" +" result[i] = base * (blend + 0.5);\n" +" } else {\n" +" result[i] = 1.0 - (1.0 - base) * (1.0 - (blend - 0.5));\n" +" }\n" +"}\n" +"[/codeblock]" +msgstr "" + +#: doc/classes/VisualShaderNodeColorOp.xml:84 +msgid "" +"Produce a hard light effect with the following formula:\n" +"[codeblock]\n" +"for (int i = 0; i < 3; i++) {\n" +" float base = a[i];\n" +" float blend = b[i];\n" +" if (base < 0.5) {\n" +" result[i] = base * (2.0 * blend);\n" +" } else {\n" +" result[i] = 1.0 - (1.0 - base) * (1.0 - 2.0 * (blend - 0.5));\n" +" }\n" +"}\n" +"[/codeblock]" +msgstr "" + +#: doc/classes/VisualShaderNodeColorUniform.xml:4 +msgid "A [Color] uniform to be used within the visual shader graph." +msgstr "" + +#: doc/classes/VisualShaderNodeColorUniform.xml:7 +msgid "Translated to [code]uniform vec4[/code] in the shader language." +msgstr "" + +#: doc/classes/VisualShaderNodeCompare.xml:4 +msgid "A comparison function for common types within the visual shader graph." +msgstr "" + +#: doc/classes/VisualShaderNodeCompare.xml:7 +msgid "" +"Compares [code]a[/code] and [code]b[/code] of [member type] by [member " +"function]. Returns a boolean scalar. Translates to [code]if[/code] " +"instruction in shader code." +msgstr "" + +#: doc/classes/VisualShaderNodeCompare.xml:15 +msgid "" +"Extra condition which is applied if [member type] is set to [constant " +"CTYPE_VECTOR]." +msgstr "" + +#: doc/classes/VisualShaderNodeCompare.xml:18 +msgid "A comparison function. See [enum Function] for options." +msgstr "" + +#: doc/classes/VisualShaderNodeCompare.xml:21 +msgid "" +"The type to be used in the comparison. See [enum ComparisonType] for options." +msgstr "" + +#: doc/classes/VisualShaderNodeCompare.xml:26 +msgid "A floating-point scalar." +msgstr "" + +#: doc/classes/VisualShaderNodeCompare.xml:29 +msgid "An integer scalar." +msgstr "" + +#: doc/classes/VisualShaderNodeCompare.xml:32 +msgid "A 3D vector type." +msgstr "" + +#: doc/classes/VisualShaderNodeCompare.xml:35 +msgid "A boolean type." +msgstr "" + +#: doc/classes/VisualShaderNodeCompare.xml:38 +msgid "A transform ([code]mat4[/code]) type." +msgstr "" + +#: doc/classes/VisualShaderNodeCompare.xml:41 +msgid "Comparison for equality ([code]a == b[/code])." +msgstr "" + +#: doc/classes/VisualShaderNodeCompare.xml:44 +msgid "Comparison for inequality ([code]a != b[/code])." +msgstr "" + +#: doc/classes/VisualShaderNodeCompare.xml:47 +msgid "" +"Comparison for greater than ([code]a > b[/code]). Cannot be used if [member " +"type] set to [constant CTYPE_BOOLEAN] or [constant CTYPE_TRANSFORM]." +msgstr "" + +#: doc/classes/VisualShaderNodeCompare.xml:50 +msgid "" +"Comparison for greater than or equal ([code]a >= b[/code]). Cannot be used " +"if [member type] set to [constant CTYPE_BOOLEAN] or [constant " +"CTYPE_TRANSFORM]." +msgstr "" + +#: doc/classes/VisualShaderNodeCompare.xml:53 +msgid "" +"Comparison for less than ([code]a < b[/code]). Cannot be used if [member " +"type] set to [constant CTYPE_BOOLEAN] or [constant CTYPE_TRANSFORM]." +msgstr "" + +#: doc/classes/VisualShaderNodeCompare.xml:56 +msgid "" +"Comparison for less than or equal ([code]a <= b[/code]). Cannot be used if " +"[member type] set to [constant CTYPE_BOOLEAN] or [constant CTYPE_TRANSFORM]." +msgstr "" + +#: doc/classes/VisualShaderNodeCompare.xml:59 +msgid "" +"The result will be true if all of component in vector satisfy the comparison " +"condition." +msgstr "" + +#: doc/classes/VisualShaderNodeCompare.xml:62 +msgid "" +"The result will be true if any of component in vector satisfy the comparison " +"condition." +msgstr "" + +#: doc/classes/VisualShaderNodeCubemap.xml:4 +msgid "A [Cubemap] sampling node to be used within the visual shader graph." +msgstr "" + +#: doc/classes/VisualShaderNodeCubemap.xml:7 +msgid "" +"Translated to [code]texture(cubemap, vec3)[/code] in the shader language. " +"Returns a color vector and alpha channel as scalar." +msgstr "" + +#: doc/classes/VisualShaderNodeCubemap.xml:15 +msgid "" +"The [Cubemap] texture to sample when using [constant SOURCE_TEXTURE] as " +"[member source]." +msgstr "" + +#: doc/classes/VisualShaderNodeCubemap.xml:18 +msgid "" +"Defines which source should be used for the sampling. See [enum Source] for " +"options." +msgstr "" + +#: doc/classes/VisualShaderNodeCubemap.xml:21 +msgid "" +"Defines the type of data provided by the source texture. See [enum " +"TextureType] for options." +msgstr "" + +#: doc/classes/VisualShaderNodeCubemap.xml:26 +msgid "" +"Use the [Cubemap] set via [member cube_map]. If this is set to [member " +"source], the [code]samplerCube[/code] port is ignored." +msgstr "" + +#: doc/classes/VisualShaderNodeCubemap.xml:29 +msgid "" +"Use the [Cubemap] sampler reference passed via the [code]samplerCube[/code] " +"port. If this is set to [member source], the [member cube_map] texture is " +"ignored." +msgstr "" + +#: doc/classes/VisualShaderNodeCubemap.xml:32 +msgid "No hints are added to the uniform declaration." +msgstr "" + +#: doc/classes/VisualShaderNodeCubemap.xml:35 +msgid "" +"Adds [code]hint_albedo[/code] as hint to the uniform declaration for proper " +"sRGB to linear conversion." +msgstr "" + +#: doc/classes/VisualShaderNodeCubemap.xml:38 +msgid "" +"Adds [code]hint_normal[/code] as hint to the uniform declaration, which " +"internally converts the texture for proper usage as normal map." +msgstr "" + +#: doc/classes/VisualShaderNodeCubemapUniform.xml:4 +msgid "A [Cubemap] uniform node to be used within the visual shader graph." +msgstr "" + +#: doc/classes/VisualShaderNodeCubemapUniform.xml:7 +msgid "" +"Translated to [code]uniform samplerCube[/code] in the shader language. The " +"output value can be used as port for [VisualShaderNodeCubemap]." +msgstr "" + +#: doc/classes/VisualShaderNodeCustom.xml:4 +msgid "" +"Virtual class to define custom [VisualShaderNode]s for use in the Visual " +"Shader Editor." +msgstr "" + +#: doc/classes/VisualShaderNodeCustom.xml:7 +msgid "" +"By inheriting this class you can create a custom [VisualShader] script addon " +"which will be automatically added to the Visual Shader Editor. The " +"[VisualShaderNode]'s behavior is defined by overriding the provided virtual " +"methods.\n" +"In order for the node to be registered as an editor addon, you must use the " +"[code]tool[/code] keyword and provide a [code]class_name[/code] for your " +"custom script. For example:\n" +"[codeblock]\n" +"tool\n" +"extends VisualShaderNodeCustom\n" +"class_name VisualShaderNodeNoise\n" +"[/codeblock]" +msgstr "" + +#: doc/classes/VisualShaderNodeCustom.xml:16 +msgid "" +"https://docs.godotengine.org/en/latest/tutorials/plugins/editor/" +"visual_shader_plugins.html" +msgstr "" + +#: doc/classes/VisualShaderNodeCustom.xml:23 +msgid "" +"Override this method to define the path to the associated custom node in the " +"Visual Shader Editor's members dialog. The path may looks like " +"[code]\"MyGame/MyFunctions/Noise\"[/code].\n" +"Defining this method is [b]optional[/b]. If not overridden, the node will be " +"filed under the \"Addons\" category." +msgstr "" + +#: doc/classes/VisualShaderNodeCustom.xml:39 +msgid "" +"Override this method to define the actual shader code of the associated " +"custom node. The shader code should be returned as a string, which can have " +"multiple lines (the [code]\"\"\"[/code] multiline string construct can be " +"used for convenience).\n" +"The [code]input_vars[/code] and [code]output_vars[/code] arrays contain the " +"string names of the various input and output variables, as defined by " +"[code]_get_input_*[/code] and [code]_get_output_*[/code] virtual methods in " +"this class.\n" +"The output ports can be assigned values in the shader code. For example, " +"[code]return output_vars[0] + \" = \" + input_vars[0] + \";\"[/code].\n" +"You can customize the generated code based on the shader [code]mode[/code] " +"(see [enum Shader.Mode]) and/or [code]type[/code] (see [enum VisualShader." +"Type]).\n" +"Defining this method is [b]required[/b]." +msgstr "" + +#: doc/classes/VisualShaderNodeCustom.xml:50 +msgid "" +"Override this method to define the description of the associated custom node " +"in the Visual Shader Editor's members dialog.\n" +"Defining this method is [b]optional[/b]." +msgstr "" + +#: doc/classes/VisualShaderNodeCustom.xml:60 +msgid "" +"Override this method to add shader code on top of the global shader, to " +"define your own standard library of reusable methods, varyings, constants, " +"uniforms, etc. The shader code should be returned as a string, which can " +"have multiple lines (the [code]\"\"\"[/code] multiline string construct can " +"be used for convenience).\n" +"Be careful with this functionality as it can cause name conflicts with other " +"custom nodes, so be sure to give the defined entities unique names.\n" +"You can customize the generated code based on the shader [code]mode[/code] " +"(see [enum Shader.Mode]).\n" +"Defining this method is [b]optional[/b]." +msgstr "" + +#: doc/classes/VisualShaderNodeCustom.xml:70 +msgid "" +"Override this method to define the amount of input ports of the associated " +"custom node.\n" +"Defining this method is [b]required[/b]. If not overridden, the node has no " +"input ports." +msgstr "" + +#: doc/classes/VisualShaderNodeCustom.xml:80 +msgid "" +"Override this method to define the names of input ports of the associated " +"custom node. The names are used both for the input slots in the editor and " +"as identifiers in the shader code, and are passed in the [code]input_vars[/" +"code] array in [method _get_code].\n" +"Defining this method is [b]optional[/b], but recommended. If not overridden, " +"input ports are named as [code]\"in\" + str(port)[/code]." +msgstr "" + +#: doc/classes/VisualShaderNodeCustom.xml:90 +msgid "" +"Override this method to define the returned type of each input port of the " +"associated custom node (see [enum VisualShaderNode.PortType] for possible " +"types).\n" +"Defining this method is [b]optional[/b], but recommended. If not overridden, " +"input ports will return the [constant VisualShaderNode.PORT_TYPE_SCALAR] " +"type." +msgstr "" + +#: doc/classes/VisualShaderNodeCustom.xml:98 +msgid "" +"Override this method to define the name of the associated custom node in the " +"Visual Shader Editor's members dialog and graph.\n" +"Defining this method is [b]optional[/b], but recommended. If not overridden, " +"the node will be named as \"Unnamed\"." +msgstr "" + +#: doc/classes/VisualShaderNodeCustom.xml:106 +msgid "" +"Override this method to define the amount of output ports of the associated " +"custom node.\n" +"Defining this method is [b]required[/b]. If not overridden, the node has no " +"output ports." +msgstr "" + +#: doc/classes/VisualShaderNodeCustom.xml:116 +msgid "" +"Override this method to define the names of output ports of the associated " +"custom node. The names are used both for the output slots in the editor and " +"as identifiers in the shader code, and are passed in the [code]output_vars[/" +"code] array in [method _get_code].\n" +"Defining this method is [b]optional[/b], but recommended. If not overridden, " +"output ports are named as [code]\"out\" + str(port)[/code]." +msgstr "" + +#: doc/classes/VisualShaderNodeCustom.xml:126 +msgid "" +"Override this method to define the returned type of each output port of the " +"associated custom node (see [enum VisualShaderNode.PortType] for possible " +"types).\n" +"Defining this method is [b]optional[/b], but recommended. If not overridden, " +"output ports will return the [constant VisualShaderNode.PORT_TYPE_SCALAR] " +"type." +msgstr "" + +#: doc/classes/VisualShaderNodeCustom.xml:134 +msgid "" +"Override this method to define the return icon of the associated custom node " +"in the Visual Shader Editor's members dialog.\n" +"Defining this method is [b]optional[/b]. If not overridden, no return icon " +"is shown." +msgstr "" + +#: doc/classes/VisualShaderNodeCustom.xml:142 +msgid "" +"Override this method to enable high-end mark in the Visual Shader Editor's " +"members dialog.\n" +"Defining this method is [b]optional[/b]. If not overridden, it's false." +msgstr "" + +#: doc/classes/VisualShaderNodeDeterminant.xml:4 +msgid "" +"Calculates the determinant of a [Transform] within the visual shader graph." +msgstr "" + +#: doc/classes/VisualShaderNodeDeterminant.xml:7 +msgid "Translates to [code]deteminant(x)[/code] in the shader language." +msgstr "" + +#: doc/classes/VisualShaderNodeDotProduct.xml:4 +msgid "Calculates a dot product of two vectors within the visual shader graph." +msgstr "" + +#: doc/classes/VisualShaderNodeDotProduct.xml:7 +msgid "Translates to [code]dot(a, b)[/code] in the shader language." +msgstr "" + +#: doc/classes/VisualShaderNodeExpression.xml:4 +msgid "" +"A custom visual shader graph expression written in Godot Shading Language." +msgstr "" + +#: doc/classes/VisualShaderNodeExpression.xml:7 +msgid "" +"Custom Godot Shading Language expression, with a custom amount of input and " +"output ports.\n" +"The provided code is directly injected into the graph's matching shader " +"function ([code]vertex[/code], [code]fragment[/code], or [code]light[/" +"code]), so it cannot be used to to declare functions, varyings, uniforms, or " +"global constants. See [VisualShaderNodeGlobalExpression] for such global " +"definitions." +msgstr "" + +#: doc/classes/VisualShaderNodeExpression.xml:16 +msgid "" +"An expression in Godot Shading Language, which will be injected at the start " +"of the graph's matching shader function ([code]vertex[/code], " +"[code]fragment[/code], or [code]light[/code]), and thus cannot be used to " +"declare functions, varyings, uniforms, or global constants." +msgstr "" + +#: doc/classes/VisualShaderNodeFaceForward.xml:4 +msgid "" +"Returns the vector that points in the same direction as a reference vector " +"within the visual shader graph." +msgstr "" + +#: doc/classes/VisualShaderNodeFaceForward.xml:7 +msgid "" +"Translates to [code]faceforward(N, I, Nref)[/code] in the shader language. " +"The function has three vector parameters: [code]N[/code], the vector to " +"orient, [code]I[/code], the incident vector, and [code]Nref[/code], the " +"reference vector. If the dot product of [code]I[/code] and [code]Nref[/code] " +"is smaller than zero the return value is [code]N[/code]. Otherwise [code]-N[/" +"code] is returned." +msgstr "" + +#: doc/classes/VisualShaderNodeFloatConstant.xml:4 +msgid "" +"A scalar floating-point constant to be used within the visual shader graph." +msgstr "" + +#: doc/classes/VisualShaderNodeFloatConstant.xml:7 +msgid "Translated to [code]float[/code] in the shader language." +msgstr "" + +#: doc/classes/VisualShaderNodeFloatConstant.xml:15 +msgid "A floating-point constant which represents a state of this node." +msgstr "" + +#: doc/classes/VisualShaderNodeFloatFunc.xml:4 +msgid "" +"A scalar floating-point function to be used within the visual shader graph." +msgstr "" + +#: doc/classes/VisualShaderNodeFloatFunc.xml:7 +msgid "" +"Accept a floating-point scalar ([code]x[/code]) to the input port and " +"transform it according to [member function]." +msgstr "" + +#: doc/classes/VisualShaderNodeFloatFunc.xml:15 +#: doc/classes/VisualShaderNodeIntFunc.xml:15 +msgid "" +"A function to be applied to the scalar. See [enum Function] for options." +msgstr "" + +#: doc/classes/VisualShaderNodeFloatFunc.xml:20 +msgid "" +"Returns the sine of the parameter. Translates to [code]sin(x)[/code] in the " +"Godot Shader Language." +msgstr "" + +#: doc/classes/VisualShaderNodeFloatFunc.xml:23 +msgid "" +"Returns the cosine of the parameter. Translates to [code]cos(x)[/code] in " +"the Godot Shader Language." +msgstr "" + +#: doc/classes/VisualShaderNodeFloatFunc.xml:26 +msgid "" +"Returns the tangent of the parameter. Translates to [code]tan(x)[/code] in " +"the Godot Shader Language." +msgstr "" + +#: doc/classes/VisualShaderNodeFloatFunc.xml:29 +msgid "" +"Returns the arc-sine of the parameter. Translates to [code]asin(x)[/code] in " +"the Godot Shader Language." +msgstr "" + +#: doc/classes/VisualShaderNodeFloatFunc.xml:32 +msgid "" +"Returns the arc-cosine of the parameter. Translates to [code]acos(x)[/code] " +"in the Godot Shader Language." +msgstr "" + +#: doc/classes/VisualShaderNodeFloatFunc.xml:35 +msgid "" +"Returns the arc-tangent of the parameter. Translates to [code]atan(x)[/code] " +"in the Godot Shader Language." +msgstr "" + +#: doc/classes/VisualShaderNodeFloatFunc.xml:38 +msgid "" +"Returns the hyperbolic sine of the parameter. Translates to [code]sinh(x)[/" +"code] in the Godot Shader Language." +msgstr "" + +#: doc/classes/VisualShaderNodeFloatFunc.xml:41 +msgid "" +"Returns the hyperbolic cosine of the parameter. Translates to [code]cosh(x)[/" +"code] in the Godot Shader Language." +msgstr "" + +#: doc/classes/VisualShaderNodeFloatFunc.xml:44 +msgid "" +"Returns the hyperbolic tangent of the parameter. Translates to [code]tanh(x)" +"[/code] in the Godot Shader Language." +msgstr "" + +#: doc/classes/VisualShaderNodeFloatFunc.xml:47 +msgid "" +"Returns the natural logarithm of the parameter. Translates to [code]log(x)[/" +"code] in the Godot Shader Language." +msgstr "" + +#: doc/classes/VisualShaderNodeFloatFunc.xml:50 +msgid "" +"Returns the natural exponentiation of the parameter. Translates to " +"[code]exp(x)[/code] in the Godot Shader Language." +msgstr "" + +#: doc/classes/VisualShaderNodeFloatFunc.xml:53 +msgid "" +"Returns the square root of the parameter. Translates to [code]sqrt(x)[/code] " +"in the Godot Shader Language." +msgstr "" + +#: doc/classes/VisualShaderNodeFloatFunc.xml:56 +#: doc/classes/VisualShaderNodeIntFunc.xml:20 +msgid "" +"Returns the absolute value of the parameter. Translates to [code]abs(x)[/" +"code] in the Godot Shader Language." +msgstr "" + +#: doc/classes/VisualShaderNodeFloatFunc.xml:59 +#: doc/classes/VisualShaderNodeIntFunc.xml:29 +msgid "" +"Extracts the sign of the parameter. Translates to [code]sign(x)[/code] in " +"the Godot Shader Language." +msgstr "" + +#: doc/classes/VisualShaderNodeFloatFunc.xml:62 +msgid "" +"Finds the nearest integer less than or equal to the parameter. Translates to " +"[code]floor(x)[/code] in the Godot Shader Language." +msgstr "" + +#: doc/classes/VisualShaderNodeFloatFunc.xml:65 +msgid "" +"Finds the nearest integer to the parameter. Translates to [code]round(x)[/" +"code] in the Godot Shader Language." +msgstr "" + +#: doc/classes/VisualShaderNodeFloatFunc.xml:68 +msgid "" +"Finds the nearest integer that is greater than or equal to the parameter. " +"Translates to [code]ceil(x)[/code] in the Godot Shader Language." +msgstr "" + +#: doc/classes/VisualShaderNodeFloatFunc.xml:71 +msgid "" +"Computes the fractional part of the argument. Translates to [code]fract(x)[/" +"code] in the Godot Shader Language." +msgstr "" + +#: doc/classes/VisualShaderNodeFloatFunc.xml:74 +msgid "" +"Clamps the value between [code]0.0[/code] and [code]1.0[/code] using " +"[code]min(max(x, 0.0), 1.0)[/code]." +msgstr "" + +#: doc/classes/VisualShaderNodeFloatFunc.xml:77 +#: doc/classes/VisualShaderNodeIntFunc.xml:26 +msgid "Negates the [code]x[/code] using [code]-(x)[/code]." +msgstr "" + +#: doc/classes/VisualShaderNodeFloatFunc.xml:80 +msgid "" +"Returns the arc-hyperbolic-cosine of the parameter. Translates to " +"[code]acosh(x)[/code] in the Godot Shader Language." +msgstr "" + +#: doc/classes/VisualShaderNodeFloatFunc.xml:83 +msgid "" +"Returns the arc-hyperbolic-sine of the parameter. Translates to " +"[code]asinh(x)[/code] in the Godot Shader Language." +msgstr "" + +#: doc/classes/VisualShaderNodeFloatFunc.xml:86 +msgid "" +"Returns the arc-hyperbolic-tangent of the parameter. Translates to " +"[code]atanh(x)[/code] in the Godot Shader Language." +msgstr "" + +#: doc/classes/VisualShaderNodeFloatFunc.xml:89 +msgid "" +"Convert a quantity in radians to degrees. Translates to [code]degrees(x)[/" +"code] in the Godot Shader Language." +msgstr "" + +#: doc/classes/VisualShaderNodeFloatFunc.xml:92 +msgid "" +"Returns 2 raised by the power of the parameter. Translates to [code]exp2(x)[/" +"code] in the Godot Shader Language." +msgstr "" + +#: doc/classes/VisualShaderNodeFloatFunc.xml:95 +msgid "" +"Returns the inverse of the square root of the parameter. Translates to " +"[code]inversesqrt(x)[/code] in the Godot Shader Language." +msgstr "" + +#: doc/classes/VisualShaderNodeFloatFunc.xml:98 +msgid "" +"Returns the base 2 logarithm of the parameter. Translates to [code]log2(x)[/" +"code] in the Godot Shader Language." +msgstr "" + +#: doc/classes/VisualShaderNodeFloatFunc.xml:101 +msgid "" +"Convert a quantity in degrees to radians. Translates to [code]radians(x)[/" +"code] in the Godot Shader Language." +msgstr "" + +#: doc/classes/VisualShaderNodeFloatFunc.xml:104 +msgid "" +"Finds reciprocal value of dividing 1 by [code]x[/code] (i.e. [code]1 / x[/" +"code])." +msgstr "" + +#: doc/classes/VisualShaderNodeFloatFunc.xml:107 +msgid "" +"Finds the nearest even integer to the parameter. Translates to " +"[code]roundEven(x)[/code] in the Godot Shader Language." +msgstr "" + +#: doc/classes/VisualShaderNodeFloatFunc.xml:110 +msgid "" +"Returns a value equal to the nearest integer to [code]x[/code] whose " +"absolute value is not larger than the absolute value of [code]x[/code]. " +"Translates to [code]trunc(x)[/code] in the Godot Shader Language." +msgstr "" + +#: doc/classes/VisualShaderNodeFloatFunc.xml:113 +msgid "Subtracts scalar [code]x[/code] from 1 (i.e. [code]1 - x[/code])." +msgstr "" + +#: doc/classes/VisualShaderNodeFloatOp.xml:4 +msgid "" +"A floating-point scalar operator to be used within the visual shader graph." +msgstr "" + +#: doc/classes/VisualShaderNodeFloatOp.xml:7 +msgid "" +"Applies [member operator] to two floating-point inputs: [code]a[/code] and " +"[code]b[/code]." +msgstr "" + +#: doc/classes/VisualShaderNodeFloatOp.xml:20 +#: doc/classes/VisualShaderNodeIntOp.xml:20 +msgid "Sums two numbers using [code]a + b[/code]." +msgstr "" + +#: doc/classes/VisualShaderNodeFloatOp.xml:23 +#: doc/classes/VisualShaderNodeIntOp.xml:23 +msgid "Subtracts two numbers using [code]a - b[/code]." +msgstr "" + +#: doc/classes/VisualShaderNodeFloatOp.xml:26 +#: doc/classes/VisualShaderNodeIntOp.xml:26 +msgid "Multiplies two numbers using [code]a * b[/code]." +msgstr "" + +#: doc/classes/VisualShaderNodeFloatOp.xml:29 +#: doc/classes/VisualShaderNodeIntOp.xml:29 +msgid "Divides two numbers using [code]a / b[/code]." +msgstr "" + +#: doc/classes/VisualShaderNodeFloatOp.xml:32 +msgid "" +"Calculates the remainder of two numbers. Translates to [code]mod(a, b)[/" +"code] in the Godot Shader Language." +msgstr "" + +#: doc/classes/VisualShaderNodeFloatOp.xml:35 +msgid "" +"Raises the [code]a[/code] to the power of [code]b[/code]. Translates to " +"[code]pow(a, b)[/code] in the Godot Shader Language." +msgstr "" + +#: doc/classes/VisualShaderNodeFloatOp.xml:38 +#: doc/classes/VisualShaderNodeIntOp.xml:35 +msgid "" +"Returns the greater of two numbers. Translates to [code]max(a, b)[/code] in " +"the Godot Shader Language." +msgstr "" + +#: doc/classes/VisualShaderNodeFloatOp.xml:41 +msgid "" +"Returns the lesser of two numbers. Translates to [code]min(a, b)[/code] in " +"the Godot Shader Language." +msgstr "" + +#: doc/classes/VisualShaderNodeFloatOp.xml:44 +msgid "" +"Returns the arc-tangent of the parameters. Translates to [code]atan(a, b)[/" +"code] in the Godot Shader Language." +msgstr "" + +#: doc/classes/VisualShaderNodeFloatOp.xml:47 +msgid "" +"Generates a step function by comparing [code]b[/code](x) to [code]a[/code]" +"(edge). Returns 0.0 if [code]x[/code] is smaller than [code]edge[/code] and " +"otherwise 1.0. Translates to [code]step(a, b)[/code] in the Godot Shader " +"Language." +msgstr "" + +#: doc/classes/VisualShaderNodeFloatUniform.xml:4 +msgid "A scalar float uniform to be used within the visual shader graph." +msgstr "" + +#: doc/classes/VisualShaderNodeFloatUniform.xml:7 +msgid "Translated to [code]uniform float[/code] in the shader language." +msgstr "" + +#: doc/classes/VisualShaderNodeFloatUniform.xml:15 +#: doc/classes/VisualShaderNodeIntUniform.xml:15 +msgid "" +"A hint applied to the uniform, which controls the values it can take when " +"set through the inspector." +msgstr "" + +#: doc/classes/VisualShaderNodeFloatUniform.xml:18 +#: doc/classes/VisualShaderNodeIntUniform.xml:18 +msgid "" +"Minimum value for range hints. Used if [member hint] is set to [constant " +"HINT_RANGE] or [constant HINT_RANGE_STEP]." +msgstr "" + +#: doc/classes/VisualShaderNodeFloatUniform.xml:21 +#: doc/classes/VisualShaderNodeIntUniform.xml:21 +msgid "" +"Maximum value for range hints. Used if [member hint] is set to [constant " +"HINT_RANGE] or [constant HINT_RANGE_STEP]." +msgstr "" + +#: doc/classes/VisualShaderNodeFloatUniform.xml:24 +#: doc/classes/VisualShaderNodeIntUniform.xml:24 +msgid "" +"Step (increment) value for the range hint with step. Used if [member hint] " +"is set to [constant HINT_RANGE_STEP]." +msgstr "" + +#: doc/classes/VisualShaderNodeFloatUniform.xml:29 +#: doc/classes/VisualShaderNodeIntUniform.xml:29 +msgid "No hint used." +msgstr "" + +#: doc/classes/VisualShaderNodeFloatUniform.xml:32 +#: doc/classes/VisualShaderNodeIntUniform.xml:32 +msgid "" +"A range hint for scalar value, which limits possible input values between " +"[member min] and [member max]. Translated to [code]hint_range(min, max)[/" +"code] in shader code." +msgstr "" + +#: doc/classes/VisualShaderNodeFloatUniform.xml:35 +#: doc/classes/VisualShaderNodeIntUniform.xml:35 +msgid "" +"A range hint for scalar value with step, which limits possible input values " +"between [member min] and [member max], with a step (increment) of [member " +"step]). Translated to [code]hint_range(min, max, step)[/code] in shader code." +msgstr "" + +#: doc/classes/VisualShaderNodeFresnel.xml:4 +msgid "A Fresnel effect to be used within the visual shader graph." +msgstr "" + +#: doc/classes/VisualShaderNodeFresnel.xml:7 +msgid "" +"Returns falloff based on the dot product of surface normal and view " +"direction of camera (pass associated inputs to it)." +msgstr "" + +#: doc/classes/VisualShaderNodeGlobalExpression.xml:4 +msgid "" +"A custom global visual shader graph expression written in Godot Shading " +"Language." +msgstr "" + +#: doc/classes/VisualShaderNodeGlobalExpression.xml:7 +msgid "" +"Custom Godot Shader Language expression, which is placed on top of the " +"generated shader. You can place various function definitions inside to call " +"later in [VisualShaderNodeExpression]s (which are injected in the main " +"shader functions). You can also declare varyings, uniforms and global " +"constants." +msgstr "" + +#: doc/classes/VisualShaderNodeGroupBase.xml:4 +msgid "" +"Base class for a family of nodes with variable amount of input and output " +"ports within the visual shader graph." +msgstr "" + +#: doc/classes/VisualShaderNodeGroupBase.xml:7 +msgid "Currently, has no direct usage, use the derived classes instead." +msgstr "" + +#: doc/classes/VisualShaderNodeGroupBase.xml:22 +msgid "" +"Adds an input port with the specified [code]type[/code] (see [enum " +"VisualShaderNode.PortType]) and [code]name[/code]." +msgstr "" + +#: doc/classes/VisualShaderNodeGroupBase.xml:35 +msgid "" +"Adds an output port with the specified [code]type[/code] (see [enum " +"VisualShaderNode.PortType]) and [code]name[/code]." +msgstr "" + +#: doc/classes/VisualShaderNodeGroupBase.xml:42 +msgid "Removes all previously specified input ports." +msgstr "" + +#: doc/classes/VisualShaderNodeGroupBase.xml:49 +msgid "Removes all previously specified output ports." +msgstr "" + +#: doc/classes/VisualShaderNodeGroupBase.xml:56 +msgid "" +"Returns a free input port ID which can be used in [method add_input_port]." +msgstr "" + +#: doc/classes/VisualShaderNodeGroupBase.xml:63 +msgid "" +"Returns a free output port ID which can be used in [method add_output_port]." +msgstr "" + +#: doc/classes/VisualShaderNodeGroupBase.xml:70 +msgid "" +"Returns the number of input ports in use. Alternative for [method " +"get_free_input_port_id]." +msgstr "" + +#: doc/classes/VisualShaderNodeGroupBase.xml:77 +msgid "" +"Returns a [String] description of the input ports as as colon-separated list " +"using the format [code]id,type,name;[/code] (see [method add_input_port])." +msgstr "" + +#: doc/classes/VisualShaderNodeGroupBase.xml:84 +msgid "" +"Returns the number of output ports in use. Alternative for [method " +"get_free_output_port_id]." +msgstr "" + +#: doc/classes/VisualShaderNodeGroupBase.xml:91 +msgid "" +"Returns a [String] description of the output ports as as colon-separated " +"list using the format [code]id,type,name;[/code] (see [method " +"add_output_port])." +msgstr "" + +#: doc/classes/VisualShaderNodeGroupBase.xml:100 +msgid "Returns [code]true[/code] if the specified input port exists." +msgstr "" + +#: doc/classes/VisualShaderNodeGroupBase.xml:109 +msgid "Returns [code]true[/code] if the specified output port exists." +msgstr "" + +#: doc/classes/VisualShaderNodeGroupBase.xml:118 +msgid "" +"Returns [code]true[/code] if the specified port name does not override an " +"existed port name and is valid within the shader." +msgstr "" + +#: doc/classes/VisualShaderNodeGroupBase.xml:127 +msgid "Removes the specified input port." +msgstr "" + +#: doc/classes/VisualShaderNodeGroupBase.xml:136 +msgid "Removes the specified output port." +msgstr "" + +#: doc/classes/VisualShaderNodeGroupBase.xml:147 +msgid "Renames the specified input port." +msgstr "" + +#: doc/classes/VisualShaderNodeGroupBase.xml:158 +msgid "" +"Sets the specified input port's type (see [enum VisualShaderNode.PortType])." +msgstr "" + +#: doc/classes/VisualShaderNodeGroupBase.xml:167 +msgid "" +"Defines all input ports using a [String] formatted as a colon-separated " +"list: [code]id,type,name;[/code] (see [method add_input_port])." +msgstr "" + +#: doc/classes/VisualShaderNodeGroupBase.xml:178 +msgid "Renames the specified output port." +msgstr "" + +#: doc/classes/VisualShaderNodeGroupBase.xml:189 +msgid "" +"Sets the specified output port's type (see [enum VisualShaderNode.PortType])." +msgstr "" + +#: doc/classes/VisualShaderNodeGroupBase.xml:198 +msgid "" +"Defines all output ports using a [String] formatted as a colon-separated " +"list: [code]id,type,name;[/code] (see [method add_output_port])." +msgstr "" + +#: doc/classes/VisualShaderNodeGroupBase.xml:204 +msgid "The size of the node in the visual shader graph." +msgstr "" + +#: doc/classes/VisualShaderNodeIf.xml:4 +msgid "" +"Compares two floating-point numbers in order to return a required vector " +"within the visual shader graph." +msgstr "" + +#: doc/classes/VisualShaderNodeIf.xml:7 +msgid "" +"First two ports are scalar floatin-point numbers to compare, third is " +"tolerance comparison amount and last three ports represents a vectors " +"returned if [code]a == b[/code], [code]a > b[/code] and [code]a < b[/code] " +"respectively." +msgstr "" + +#: doc/classes/VisualShaderNodeInput.xml:4 +msgid "Represents the input shader parameter within the visual shader graph." +msgstr "" + +#: doc/classes/VisualShaderNodeInput.xml:15 +msgid "" +"Returns a translated name of the current constant in the Godot Shader " +"Language. eg. [code]\"ALBEDO\"[/code] if the [member input_name] equal to " +"[code]\"albedo\"[/code]." +msgstr "" + +#: doc/classes/VisualShaderNodeInput.xml:21 +msgid "" +"One of the several input constants in lower-case style like: \"vertex\"([/" +"code]VERTEX[code]) or \"point_size\"([code]POINT_SIZE[/code])." +msgstr "" + +#: doc/classes/VisualShaderNodeInput.xml:27 +msgid "Emitted when input is changed via [member input_name]." +msgstr "" + +#: doc/classes/VisualShaderNodeIntConstant.xml:4 +msgid "A scalar integer constant to be used within the visual shader graph." +msgstr "" + +#: doc/classes/VisualShaderNodeIntConstant.xml:7 +msgid "Translated to [code]int[/code] in the shader language." +msgstr "" + +#: doc/classes/VisualShaderNodeIntConstant.xml:15 +msgid "An integer constant which represents a state of this node." +msgstr "" + +#: doc/classes/VisualShaderNodeIntFunc.xml:4 +msgid "A scalar integer function to be used within the visual shader graph." +msgstr "" + +#: doc/classes/VisualShaderNodeIntFunc.xml:7 +msgid "" +"Accept an integer scalar ([code]x[/code]) to the input port and transform it " +"according to [member function]." +msgstr "" + +#: doc/classes/VisualShaderNodeIntFunc.xml:23 +msgid "" +"Constrains a parameter between [code]min[/code] and [code]max[/code]. " +"Translates to [code]clamp(x, min, max)[/code] in the Godot Shader Language." +msgstr "" + +#: doc/classes/VisualShaderNodeIntOp.xml:4 +msgid "An integer scalar operator to be used within the visual shader graph." +msgstr "" + +#: doc/classes/VisualShaderNodeIntOp.xml:7 +msgid "" +"Applies [member operator] to two integer inputs: [code]a[/code] and [code]b[/" +"code]." +msgstr "" + +#: doc/classes/VisualShaderNodeIntOp.xml:32 +msgid "Calculates the remainder of two numbers using [code]a % b[/code]." +msgstr "" + +#: doc/classes/VisualShaderNodeIntOp.xml:38 +msgid "" +"Returns the lesser of two numbers. Translates to [code]max(a, b)[/code] in " +"the Godot Shader Language." +msgstr "" + +#: doc/classes/VisualShaderNodeIntUniform.xml:4 +msgid "A scalar integer uniform to be used within the visual shader graph." +msgstr "" + +#: doc/classes/VisualShaderNodeIntUniform.xml:7 +msgid "Translated to [code]uniform int[/code] in the shader language." +msgstr "" + +#: doc/classes/VScrollBar.xml:4 +msgid "Vertical scroll bar." +msgstr "" + +#: doc/classes/VScrollBar.xml:7 +msgid "" +"Vertical version of [ScrollBar], which goes from top (min) to bottom (max)." +msgstr "" + +#: doc/classes/VScrollBar.xml:21 +msgid "" +"Icon used as a button to scroll the [ScrollBar] up. Supports custom step " +"using the [member ScrollBar.custom_step] property." +msgstr "" + +#: doc/classes/VScrollBar.xml:36 +msgid "" +"Icon used as a button to scroll the [ScrollBar] down. Supports custom step " +"using the [member ScrollBar.custom_step] property." +msgstr "" + +#: doc/classes/VSeparator.xml:4 +msgid "Vertical version of [Separator]." +msgstr "" + +#: doc/classes/VSeparator.xml:7 +msgid "" +"Vertical version of [Separator]. Even though it looks vertical, it is used " +"to separate objects horizontally." +msgstr "" + +#: doc/classes/VSeparator.xml:17 +msgid "" +"The width of the area covered by the separator. Effectively works like a " +"minimum width." +msgstr "" + +#: doc/classes/VSeparator.xml:20 +msgid "" +"The style for the separator line. Works best with [StyleBoxLine] (remember " +"to enable [member StyleBoxLine.vertical])." +msgstr "" + +#: doc/classes/VSlider.xml:4 +msgid "Vertical slider." +msgstr "" + +#: doc/classes/VSlider.xml:7 +msgid "" +"Vertical slider. See [Slider]. This one goes from bottom (min) to top (max)." +msgstr "" + +#: doc/classes/VSlider.xml:24 +msgid "The background of the area below the grabber." +msgstr "" + +#: doc/classes/VSlider.xml:35 +msgid "" +"The background for the whole slider. Determines the width of the " +"[code]grabber_area[/code]." +msgstr "" + +#: doc/classes/VSplitContainer.xml:4 +msgid "Vertical split container." +msgstr "" + +#: doc/classes/VSplitContainer.xml:7 +msgid "" +"Vertical split container. See [SplitContainer]. This goes from top to bottom." +msgstr "" + +#: doc/classes/WeakRef.xml:4 +msgid "" +"Holds an [Object], but does not contribute to the reference count if the " +"object is a reference." +msgstr "" + +#: doc/classes/WeakRef.xml:7 +msgid "" +"A weakref can hold a [Reference], without contributing to the reference " +"counter. A weakref can be created from an [Object] using [method @GDScript." +"weakref]. If this object is not a reference, weakref still works, however, " +"it does not have any effect on the object. Weakrefs are useful in cases " +"where multiple classes have variables that refer to each other. Without " +"weakrefs, using these classes could lead to memory leaks, since both " +"references keep each other from being released. Making part of the variables " +"a weakref can prevent this cyclic dependency, and allows the references to " +"be released." +msgstr "" + +#: doc/classes/WeakRef.xml:16 +msgid "Returns the [Object] this weakref is referring to." +msgstr "" + +#: modules/webrtc/doc_classes/WebRTCDataChannel.xml:14 +msgid "Closes this data channel, notifying the other peer." +msgstr "" + +#: modules/webrtc/doc_classes/WebRTCDataChannel.xml:21 +msgid "" +"Returns the id assigned to this channel during creation (or auto-assigned " +"during negotiation).\n" +"If the channel is not negotiated out-of-band the id will only be available " +"after the connection is established (will return [code]65535[/code] until " +"then)." +msgstr "" + +#: modules/webrtc/doc_classes/WebRTCDataChannel.xml:29 +msgid "Returns the label assigned to this channel during creation." +msgstr "" + +#: modules/webrtc/doc_classes/WebRTCDataChannel.xml:36 +msgid "" +"Returns the [code]maxPacketLifeTime[/code] value assigned to this channel " +"during creation.\n" +"Will be [code]65535[/code] if not specified." +msgstr "" + +#: modules/webrtc/doc_classes/WebRTCDataChannel.xml:44 +msgid "" +"Returns the [code]maxRetransmits[/code] value assigned to this channel " +"during creation.\n" +"Will be [code]65535[/code] if not specified." +msgstr "" + +#: modules/webrtc/doc_classes/WebRTCDataChannel.xml:52 +msgid "" +"Returns the sub-protocol assigned to this channel during creation. An empty " +"string if not specified." +msgstr "" + +#: modules/webrtc/doc_classes/WebRTCDataChannel.xml:59 +msgid "Returns the current state of this channel, see [enum ChannelState]." +msgstr "" + +#: modules/webrtc/doc_classes/WebRTCDataChannel.xml:66 +msgid "" +"Returns [code]true[/code] if this channel was created with out-of-band " +"configuration." +msgstr "" + +#: modules/webrtc/doc_classes/WebRTCDataChannel.xml:73 +msgid "" +"Returns [code]true[/code] if this channel was created with ordering enabled " +"(default)." +msgstr "" + +#: modules/webrtc/doc_classes/WebRTCDataChannel.xml:80 +msgid "Reserved, but not used for now." +msgstr "" + +#: modules/webrtc/doc_classes/WebRTCDataChannel.xml:87 +msgid "" +"Returns [code]true[/code] if the last received packet was transferred as " +"text. See [member write_mode]." +msgstr "" + +#: modules/webrtc/doc_classes/WebRTCDataChannel.xml:93 +msgid "" +"The transfer mode to use when sending outgoing packet. Either text or binary." +msgstr "" + +#: modules/webrtc/doc_classes/WebRTCDataChannel.xml:98 +msgid "" +"Tells the channel to send data over this channel as text. An external peer " +"(non-Godot) would receive this as a string." +msgstr "" + +#: modules/webrtc/doc_classes/WebRTCDataChannel.xml:101 +msgid "" +"Tells the channel to send data over this channel as binary. An external peer " +"(non-Godot) would receive this as array buffer or blob." +msgstr "" + +#: modules/webrtc/doc_classes/WebRTCDataChannel.xml:104 +msgid "The channel was created, but it's still trying to connect." +msgstr "" + +#: modules/webrtc/doc_classes/WebRTCDataChannel.xml:107 +msgid "The channel is currently open, and data can flow over it." +msgstr "" + +#: modules/webrtc/doc_classes/WebRTCDataChannel.xml:110 +msgid "" +"The channel is being closed, no new messages will be accepted, but those " +"already in queue will be flushed." +msgstr "" + +#: modules/webrtc/doc_classes/WebRTCDataChannel.xml:113 +msgid "The channel was closed, or connection failed." +msgstr "" + +#: modules/webrtc/doc_classes/WebRTCMultiplayer.xml:4 +msgid "" +"A simple interface to create a peer-to-peer mesh network composed of " +"[WebRTCPeerConnection] that is compatible with the [MultiplayerAPI]." +msgstr "" + +#: modules/webrtc/doc_classes/WebRTCMultiplayer.xml:7 +msgid "" +"This class constructs a full mesh of [WebRTCPeerConnection] (one connection " +"for each peer) that can be used as a [member MultiplayerAPI.network_peer].\n" +"You can add each [WebRTCPeerConnection] via [method add_peer] or remove them " +"via [method remove_peer]. Peers must be added in [constant " +"WebRTCPeerConnection.STATE_NEW] state to allow it to create the appropriate " +"channels. This class will not create offers nor set descriptions, it will " +"only poll them, and notify connections and disconnections.\n" +"[signal NetworkedMultiplayerPeer.connection_succeeded] and [signal " +"NetworkedMultiplayerPeer.server_disconnected] will not be emitted unless " +"[code]server_compatibility[/code] is [code]true[/code] in [method " +"initialize]. Beside that data transfer works like in a " +"[NetworkedMultiplayerPeer]." +msgstr "" + +#: modules/webrtc/doc_classes/WebRTCMultiplayer.xml:24 +msgid "" +"Add a new peer to the mesh with the given [code]peer_id[/code]. The " +"[WebRTCPeerConnection] must be in state [constant WebRTCPeerConnection." +"STATE_NEW].\n" +"Three channels will be created for reliable, unreliable, and ordered " +"transport. The value of [code]unreliable_lifetime[/code] will be passed to " +"the [code]maxPacketLifetime[/code] option when creating unreliable and " +"ordered channels (see [method WebRTCPeerConnection.create_data_channel])." +msgstr "" + +#: modules/webrtc/doc_classes/WebRTCMultiplayer.xml:32 +msgid "Close all the add peer connections and channels, freeing all resources." +msgstr "" + +#: modules/webrtc/doc_classes/WebRTCMultiplayer.xml:41 +msgid "" +"Return a dictionary representation of the peer with given [code]peer_id[/" +"code] with three keys. [code]connection[/code] containing the " +"[WebRTCPeerConnection] to this peer, [code]channels[/code] an array of three " +"[WebRTCDataChannel], and [code]connected[/code] a boolean representing if " +"the peer connection is currently connected (all three channels are open)." +msgstr "" + +#: modules/webrtc/doc_classes/WebRTCMultiplayer.xml:48 +msgid "" +"Returns a dictionary which keys are the peer ids and values the peer " +"representation as in [method get_peer]." +msgstr "" + +#: modules/webrtc/doc_classes/WebRTCMultiplayer.xml:57 +msgid "" +"Returns [code]true[/code] if the given [code]peer_id[/code] is in the peers " +"map (it might not be connected though)." +msgstr "" + +#: modules/webrtc/doc_classes/WebRTCMultiplayer.xml:68 +msgid "" +"Initialize the multiplayer peer with the given [code]peer_id[/code] (must be " +"between 1 and 2147483647).\n" +"If [code]server_compatibilty[/code] is [code]false[/code] (default), the " +"multiplayer peer will be immediately in state [constant " +"NetworkedMultiplayerPeer.CONNECTION_CONNECTED] and [signal " +"NetworkedMultiplayerPeer.connection_succeeded] will not be emitted.\n" +"If [code]server_compatibilty[/code] is [code]true[/code] the peer will " +"suppress all [signal NetworkedMultiplayerPeer.peer_connected] signals until " +"a peer with id [constant NetworkedMultiplayerPeer.TARGET_PEER_SERVER] " +"connects and then emit [signal NetworkedMultiplayerPeer." +"connection_succeeded]. After that the signal [signal " +"NetworkedMultiplayerPeer.peer_connected] will be emitted for every already " +"connected peer, and any new peer that might connect. If the server peer " +"disconnects after that, signal [signal NetworkedMultiplayerPeer." +"server_disconnected] will be emitted and state will become [constant " +"NetworkedMultiplayerPeer.CONNECTION_CONNECTED]." +msgstr "" + +#: modules/webrtc/doc_classes/WebRTCMultiplayer.xml:79 +msgid "" +"Remove the peer with given [code]peer_id[/code] from the mesh. If the peer " +"was connected, and [signal NetworkedMultiplayerPeer.peer_connected] was " +"emitted for it, then [signal NetworkedMultiplayerPeer.peer_disconnected] " +"will be emitted." +msgstr "" + +#: modules/webrtc/doc_classes/WebRTCPeerConnection.xml:4 +msgid "Interface to a WebRTC peer connection." +msgstr "" + +#: modules/webrtc/doc_classes/WebRTCPeerConnection.xml:7 +msgid "" +"A WebRTC connection between the local computer and a remote peer. Provides " +"an interface to connect, maintain and monitor the connection.\n" +"Setting up a WebRTC connection between two peers from now on) may not seem a " +"trivial task, but it can be broken down into 3 main steps:\n" +"- The peer that wants to initiate the connection ([code]A[/code] from now " +"on) creates an offer and send it to the other peer ([code]B[/code] from now " +"on).\n" +"- [code]B[/code] receives the offer, generate and answer, and sends it to " +"[code]A[/code]).\n" +"- [code]A[/code] and [code]B[/code] then generates and exchange ICE " +"candidates with each other.\n" +"After these steps, the connection should become connected. Keep on reading " +"or look into the tutorial for more information." +msgstr "" + +#: modules/webrtc/doc_classes/WebRTCPeerConnection.xml:27 +msgid "" +"Add an ice candidate generated by a remote peer (and received over the " +"signaling server). See [signal ice_candidate_created]." +msgstr "" + +#: modules/webrtc/doc_classes/WebRTCPeerConnection.xml:34 +msgid "" +"Close the peer connection and all data channels associated with it. Note, " +"you cannot reuse this object for a new connection unless you call [method " +"initialize]." +msgstr "" + +#: modules/webrtc/doc_classes/WebRTCPeerConnection.xml:47 +msgid "" +"Returns a new [WebRTCDataChannel] (or [code]null[/code] on failure) with " +"given [code]label[/code] and optionally configured via the [code]options[/" +"code] dictionary. This method can only be called when the connection is in " +"state [constant STATE_NEW].\n" +"There are two ways to create a working data channel: either call [method " +"create_data_channel] on only one of the peer and listen to [signal " +"data_channel_received] on the other, or call [method create_data_channel] on " +"both peers, with the same values, and the [code]negotiated[/code] option set " +"to [code]true[/code].\n" +"Valid [code]options[/code] are:\n" +"[codeblock]\n" +"{\n" +" \"negotiated\": true, # When set to true (default off), means the " +"channel is negotiated out of band. \"id\" must be set too. " +"data_channel_received will not be called.\n" +" \"id\": 1, # When \"negotiated\" is true this value must also be set to " +"the same value on both peer.\n" +"\n" +" # Only one of maxRetransmits and maxPacketLifeTime can be specified, not " +"both. They make the channel unreliable (but also better at real time).\n" +" \"maxRetransmits\": 1, # Specify the maximum number of attempt the peer " +"will make to retransmits packets if they are not acknowledged.\n" +" \"maxPacketLifeTime\": 100, # Specify the maximum amount of time before " +"giving up retransmitions of unacknowledged packets (in milliseconds).\n" +" \"ordered\": true, # When in unreliable mode (i.e. either " +"\"maxRetransmits\" or \"maxPacketLifetime\" is set), \"ordered\" (true by " +"default) specify if packet ordering is to be enforced.\n" +"\n" +" \"protocol\": \"my-custom-protocol\", # A custom sub-protocol string for " +"this channel.\n" +"}\n" +"[/codeblock]\n" +"[b]Note:[/b] You must keep a reference to channels created this way, or it " +"will be closed." +msgstr "" + +#: modules/webrtc/doc_classes/WebRTCPeerConnection.xml:70 +msgid "" +"Creates a new SDP offer to start a WebRTC connection with a remote peer. At " +"least one [WebRTCDataChannel] must have been created before calling this " +"method.\n" +"If this functions returns [constant OK], [signal " +"session_description_created] will be called when the session is ready to be " +"sent." +msgstr "" + +#: modules/webrtc/doc_classes/WebRTCPeerConnection.xml:78 +msgid "Returns the connection state. See [enum ConnectionState]." +msgstr "" + +#: modules/webrtc/doc_classes/WebRTCPeerConnection.xml:89 +msgid "" +"Re-initialize this peer connection, closing any previously active " +"connection, and going back to state [constant STATE_NEW]. A dictionary of " +"[code]options[/code] can be passed to configure the peer connection.\n" +"Valid [code]options[/code] are:\n" +"[codeblock]\n" +"{\n" +" \"iceServers\": [\n" +" {\n" +" \"urls\": [ \"stun:stun.example.com:3478\" ], # One or more STUN " +"servers.\n" +" },\n" +" {\n" +" \"urls\": [ \"turn:turn.example.com:3478\" ], # One or more TURN " +"servers.\n" +" \"username\": \"a_username\", # Optional username for the TURN " +"server.\n" +" \"credentials\": \"a_password\", # Optional password for the " +"TURN server.\n" +" }\n" +" ]\n" +"}\n" +"[/codeblock]" +msgstr "" + +#: modules/webrtc/doc_classes/WebRTCPeerConnection.xml:111 +msgid "" +"Call this method frequently (e.g. in [method Node._process] or [method Node." +"_physics_process]) to properly receive signals." +msgstr "" + +#: modules/webrtc/doc_classes/WebRTCPeerConnection.xml:122 +msgid "" +"Sets the SDP description of the local peer. This should be called in " +"response to [signal session_description_created].\n" +"If [code]type[/code] is [code]answer[/code] the peer will start emitting " +"[signal ice_candidate_created]." +msgstr "" + +#: modules/webrtc/doc_classes/WebRTCPeerConnection.xml:134 +msgid "" +"Sets the SDP description of the remote peer. This should be called with the " +"values generated by a remote peer and received over the signaling server.\n" +"If [code]type[/code] is [code]offer[/code] the peer will emit [signal " +"session_description_created] with the appropriate answer.\n" +"If [code]type[/code] is [code]answer[/code] the peer will start emitting " +"[signal ice_candidate_created]." +msgstr "" + +#: modules/webrtc/doc_classes/WebRTCPeerConnection.xml:145 +msgid "" +"Emitted when a new in-band channel is received, i.e. when the channel was " +"created with [code]negotiated: false[/code] (default).\n" +"The object will be an instance of [WebRTCDataChannel]. You must keep a " +"reference of it or it will be closed automatically. See [method " +"create_data_channel]." +msgstr "" + +#: modules/webrtc/doc_classes/WebRTCPeerConnection.xml:157 +msgid "" +"Emitted when a new ICE candidate has been created. The three parameters are " +"meant to be passed to the remote peer over the signaling server." +msgstr "" + +#: modules/webrtc/doc_classes/WebRTCPeerConnection.xml:166 +msgid "" +"Emitted after a successful call to [method create_offer] or [method " +"set_remote_description] (when it generates an answer). The parameters are " +"meant to be passed to [method set_local_description] on this object, and " +"sent to the remote peer over the signaling server." +msgstr "" + +#: modules/webrtc/doc_classes/WebRTCPeerConnection.xml:172 +msgid "" +"The connection is new, data channels and an offer can be created in this " +"state." +msgstr "" + +#: modules/webrtc/doc_classes/WebRTCPeerConnection.xml:175 +msgid "" +"The peer is connecting, ICE is in progress, none of the transports has " +"failed." +msgstr "" + +#: modules/webrtc/doc_classes/WebRTCPeerConnection.xml:178 +msgid "The peer is connected, all ICE transports are connected." +msgstr "" + +#: modules/webrtc/doc_classes/WebRTCPeerConnection.xml:181 +msgid "At least one ICE transport is disconnected." +msgstr "" + +#: modules/webrtc/doc_classes/WebRTCPeerConnection.xml:184 +msgid "One or more of the ICE transports failed." +msgstr "" + +#: modules/webrtc/doc_classes/WebRTCPeerConnection.xml:187 +msgid "" +"The peer connection is closed (after calling [method close] for example)." +msgstr "" + +#: modules/websocket/doc_classes/WebSocketClient.xml:4 +msgid "A WebSocket client implementation." +msgstr "" + +#: modules/websocket/doc_classes/WebSocketClient.xml:7 +msgid "" +"This class implements a WebSocket client compatible with any RFC 6455-" +"compliant WebSocket server.\n" +"This client can be optionally used as a network peer for the " +"[MultiplayerAPI].\n" +"After starting the client ([method connect_to_url]), you will need to " +"[method NetworkedMultiplayerPeer.poll] it at regular intervals (e.g. inside " +"[method Node._process]).\n" +"You will receive appropriate signals when connecting, disconnecting, or when " +"new data is available." +msgstr "" + +#: modules/websocket/doc_classes/WebSocketClient.xml:27 +msgid "" +"Connects to the given URL requesting one of the given [code]protocols[/code] " +"as sub-protocol. If the list empty (default), no sub-protocol will be " +"requested.\n" +"If [code]true[/code] is passed as [code]gd_mp_api[/code], the client will " +"behave like a network peer for the [MultiplayerAPI], connections to non-" +"Godot servers will not work, and [signal data_received] will not be " +"emitted.\n" +"If [code]false[/code] is passed instead (default), you must call " +"[PacketPeer] functions ([code]put_packet[/code], [code]get_packet[/code], " +"etc.) on the [WebSocketPeer] returned via [code]get_peer(1)[/code] and not " +"on this object directly (e.g. [code]get_peer(1).put_packet(data)[/code]).\n" +"You can optionally pass a list of [code]custom_headers[/code] to be added to " +"the handshake HTTP request.\n" +"[b]Note:[/b] Specifying [code]custom_headers[/code] is not supported in " +"HTML5 exports due to browsers restrictions." +msgstr "" + +#: modules/websocket/doc_classes/WebSocketClient.xml:42 +msgid "" +"Disconnects this client from the connected host. See [method WebSocketPeer." +"close] for more information." +msgstr "" + +#: modules/websocket/doc_classes/WebSocketClient.xml:49 +msgid "Return the IP address of the currently connected host." +msgstr "" + +#: modules/websocket/doc_classes/WebSocketClient.xml:56 +msgid "Return the IP port of the currently connected host." +msgstr "" + +#: modules/websocket/doc_classes/WebSocketClient.xml:62 +msgid "" +"If specified, this [X509Certificate] will be the only one accepted when " +"connecting to an SSL host. Any other certificate provided by the server will " +"be regarded as invalid.\n" +"[b]Note:[/b] Specifying a custom [code]trusted_ssl_certificate[/code] is not " +"supported in HTML5 exports due to browsers restrictions." +msgstr "" + +#: modules/websocket/doc_classes/WebSocketClient.xml:66 +msgid "" +"If [code]true[/code], SSL certificate verification is enabled.\n" +"[b]Note:[/b] You must specify the certificates to be used in the Project " +"Settings for it to work when exported." +msgstr "" + +#: modules/websocket/doc_classes/WebSocketClient.xml:75 +msgid "" +"Emitted when the connection to the server is closed. [code]was_clean_close[/" +"code] will be [code]true[/code] if the connection was shutdown cleanly." +msgstr "" + +#: modules/websocket/doc_classes/WebSocketClient.xml:80 +msgid "Emitted when the connection to the server fails." +msgstr "" + +#: modules/websocket/doc_classes/WebSocketClient.xml:87 +msgid "" +"Emitted when a connection with the server is established, [code]protocol[/" +"code] will contain the sub-protocol agreed with the server." +msgstr "" + +#: modules/websocket/doc_classes/WebSocketClient.xml:92 +msgid "" +"Emitted when a WebSocket message is received.\n" +"[b]Note:[/b] This signal is [i]not[/i] emitted when used as high-level " +"multiplayer peer." +msgstr "" + +#: modules/websocket/doc_classes/WebSocketClient.xml:102 +msgid "" +"Emitted when the server requests a clean close. You should keep polling " +"until you get a [signal connection_closed] signal to achieve the clean " +"close. See [method WebSocketPeer.close] for more details." +msgstr "" + +#: modules/websocket/doc_classes/WebSocketMultiplayerPeer.xml:4 +msgid "Base class for WebSocket server and client." +msgstr "" + +#: modules/websocket/doc_classes/WebSocketMultiplayerPeer.xml:7 +msgid "" +"Base class for WebSocket server and client, allowing them to be used as " +"network peer for the [MultiplayerAPI]." +msgstr "" + +#: modules/websocket/doc_classes/WebSocketMultiplayerPeer.xml:18 +msgid "" +"Returns the [WebSocketPeer] associated to the given [code]peer_id[/code]." +msgstr "" + +#: modules/websocket/doc_classes/WebSocketMultiplayerPeer.xml:33 +msgid "" +"Configures the buffer sizes for this WebSocket peer. Default values can be " +"specified in the Project Settings under [code]network/limits[/code]. For " +"server, values are meant per connected peer.\n" +"The first two parameters define the size and queued packets limits of the " +"input buffer, the last two of the output buffer.\n" +"Buffer sizes are expressed in KiB, so [code]4 = 2^12 = 4096 bytes[/code]. " +"All parameters will be rounded up to the nearest power of two.\n" +"[b]Note:[/b] HTML5 exports only use the input buffer since the output one is " +"managed by browsers." +msgstr "" + +#: modules/websocket/doc_classes/WebSocketMultiplayerPeer.xml:49 +msgid "" +"Emitted when a packet is received from a peer.\n" +"[b]Note:[/b] This signal is only emitted when the client or server is " +"configured to use Godot multiplayer API." +msgstr "" + +#: modules/websocket/doc_classes/WebSocketPeer.xml:4 +msgid "A class representing a specific WebSocket connection." +msgstr "" + +#: modules/websocket/doc_classes/WebSocketPeer.xml:7 +msgid "" +"This class represent a specific WebSocket connection, you can do lower level " +"operations with it.\n" +"You can choose to write to the socket in binary or text mode, and you can " +"recognize the mode used for writing by the other peer." +msgstr "" + +#: modules/websocket/doc_classes/WebSocketPeer.xml:21 +msgid "" +"Closes this WebSocket connection. [code]code[/code] is the status code for " +"the closure (see RFC 6455 section 7.4 for a list of valid status codes). " +"[code]reason[/code] is the human readable reason for closing the connection " +"(can be any UTF-8 string that's smaller than 123 bytes).\n" +"[b]Note:[/b] To achieve a clean close, you will need to keep polling until " +"either [signal WebSocketClient.connection_closed] or [signal WebSocketServer." +"client_disconnected] is received.\n" +"[b]Note:[/b] The HTML5 export might not support all status codes. Please " +"refer to browser-specific documentation for more details." +msgstr "" + +#: modules/websocket/doc_classes/WebSocketPeer.xml:30 +msgid "" +"Returns the IP address of the connected peer.\n" +"[b]Note:[/b] Not available in the HTML5 export." +msgstr "" + +#: modules/websocket/doc_classes/WebSocketPeer.xml:38 +msgid "" +"Returns the remote port of the connected peer.\n" +"[b]Note:[/b] Not available in the HTML5 export." +msgstr "" + +#: modules/websocket/doc_classes/WebSocketPeer.xml:46 +msgid "Gets the current selected write mode. See [enum WriteMode]." +msgstr "" + +#: modules/websocket/doc_classes/WebSocketPeer.xml:53 +msgid "Returns [code]true[/code] if this peer is currently connected." +msgstr "" + +#: modules/websocket/doc_classes/WebSocketPeer.xml:62 +msgid "" +"Disable Nagle's algorithm on the underling TCP socket (default). See [method " +"StreamPeerTCP.set_no_delay] for more information.\n" +"[b]Note:[/b] Not available in the HTML5 export." +msgstr "" + +#: modules/websocket/doc_classes/WebSocketPeer.xml:72 +msgid "Sets the socket to use the given [enum WriteMode]." +msgstr "" + +#: modules/websocket/doc_classes/WebSocketPeer.xml:79 +msgid "" +"Returns [code]true[/code] if the last received packet was sent as a text " +"payload. See [enum WriteMode]." +msgstr "" + +#: modules/websocket/doc_classes/WebSocketPeer.xml:85 +msgid "" +"Specifies that WebSockets messages should be transferred as text payload " +"(only valid UTF-8 is allowed)." +msgstr "" + +#: modules/websocket/doc_classes/WebSocketPeer.xml:88 +msgid "" +"Specifies that WebSockets messages should be transferred as binary payload " +"(any byte combination is allowed)." +msgstr "" + +#: modules/websocket/doc_classes/WebSocketServer.xml:4 +msgid "A WebSocket server implementation." +msgstr "" + +#: modules/websocket/doc_classes/WebSocketServer.xml:7 +msgid "" +"This class implements a WebSocket server that can also support the high-" +"level multiplayer API.\n" +"After starting the server ([method listen]), you will need to [method " +"NetworkedMultiplayerPeer.poll] it at regular intervals (e.g. inside [method " +"Node._process]). When clients connect, disconnect, or send data, you will " +"receive the appropriate signal.\n" +"[b]Note:[/b] Not available in HTML5 exports." +msgstr "" + +#: modules/websocket/doc_classes/WebSocketServer.xml:24 +msgid "" +"Disconnects the peer identified by [code]id[/code] from the server. See " +"[method WebSocketPeer.close] for more information." +msgstr "" + +#: modules/websocket/doc_classes/WebSocketServer.xml:51 +msgid "Returns [code]true[/code] if a peer with the given ID is connected." +msgstr "" + +#: modules/websocket/doc_classes/WebSocketServer.xml:58 +msgid "" +"Returns [code]true[/code] if the server is actively listening on a port." +msgstr "" + +#: modules/websocket/doc_classes/WebSocketServer.xml:71 +msgid "" +"Starts listening on the given port.\n" +"You can specify the desired subprotocols via the \"protocols\" array. If the " +"list empty (default), no sub-protocol will be requested.\n" +"If [code]true[/code] is passed as [code]gd_mp_api[/code], the server will " +"behave like a network peer for the [MultiplayerAPI], connections from non-" +"Godot clients will not work, and [signal data_received] will not be " +"emitted.\n" +"If [code]false[/code] is passed instead (default), you must call " +"[PacketPeer] functions ([code]put_packet[/code], [code]get_packet[/code], " +"etc.), on the [WebSocketPeer] returned via [code]get_peer(id)[/code] to " +"communicate with the peer with given [code]id[/code] (e.g. " +"[code]get_peer(id).get_available_packet_count[/code])." +msgstr "" + +#: modules/websocket/doc_classes/WebSocketServer.xml:81 +msgid "Stops the server and clear its state." +msgstr "" + +#: modules/websocket/doc_classes/WebSocketServer.xml:87 +msgid "" +"When not set to [code]*[/code] will restrict incoming connections to the " +"specified IP address. Setting [code]bind_ip[/code] to [code]127.0.0.1[/code] " +"will cause the server to listen only to the local host." +msgstr "" + +#: modules/websocket/doc_classes/WebSocketServer.xml:90 +msgid "" +"When using SSL (see [member private_key] and [member ssl_certificate]), you " +"can set this to a valid [X509Certificate] to be provided as additional CA " +"chain information during the SSL handshake." +msgstr "" + +#: modules/websocket/doc_classes/WebSocketServer.xml:93 +msgid "" +"When set to a valid [CryptoKey] (along with [member ssl_certificate]) will " +"cause the server to require SSL instead of regular TCP (i.e. the [code]wss://" +"[/code] protocol)." +msgstr "" + +#: modules/websocket/doc_classes/WebSocketServer.xml:96 +msgid "" +"When set to a valid [X509Certificate] (along with [member private_key]) will " +"cause the server to require SSL instead of regular TCP (i.e. the [code]wss://" +"[/code] protocol)." +msgstr "" + +#: modules/websocket/doc_classes/WebSocketServer.xml:108 +msgid "" +"Emitted when a client requests a clean close. You should keep polling until " +"you get a [signal client_disconnected] signal with the same [code]id[/code] " +"to achieve the clean close. See [method WebSocketPeer.close] for more " +"details." +msgstr "" + +#: modules/websocket/doc_classes/WebSocketServer.xml:117 +msgid "" +"Emitted when a new client connects. \"protocol\" will be the sub-protocol " +"agreed with the client." +msgstr "" + +#: modules/websocket/doc_classes/WebSocketServer.xml:126 +msgid "" +"Emitted when a client disconnects. [code]was_clean_close[/code] will be " +"[code]true[/code] if the connection was shutdown cleanly." +msgstr "" + +#: modules/websocket/doc_classes/WebSocketServer.xml:133 +msgid "" +"Emitted when a new message is received.\n" +"[b]Note:[/b] This signal is [i]not[/i] emitted when used as high-level " +"multiplayer peer." +msgstr "" + +#: doc/classes/World2D.xml:4 +msgid "Class that has everything pertaining to a 2D world." +msgstr "" + +#: doc/classes/World2D.xml:7 +msgid "" +"Class that has everything pertaining to a 2D world. A physics space, a " +"visual scenario and a sound space. 2D nodes register their resources into " +"the current 2D world." +msgstr "" + +#: doc/classes/World2D.xml:16 +msgid "" +"The [RID] of this world's canvas resource. Used by the [RenderingServer] for " +"2D drawing." +msgstr "" + +#: doc/classes/World2D.xml:19 +msgid "" +"The state of this world's physics space. This allows arbitrary querying for " +"collision." +msgstr "" + +#: doc/classes/World2D.xml:22 +msgid "" +"The [RID] of this world's physics space resource. Used by the " +"[PhysicsServer2D] for 2D physics, treating it as both a space and an area." +msgstr "" + +#: doc/classes/World3D.xml:4 +msgid "Class that has everything pertaining to a world." +msgstr "" + +#: doc/classes/World3D.xml:7 +msgid "" +"Class that has everything pertaining to a world. A physics space, a visual " +"scenario and a sound space. Node3D nodes register their resources into the " +"current world." +msgstr "" + +#: doc/classes/World3D.xml:18 +msgid "" +"The World3D's physics direct space state, used for making various queries. " +"Might be used only during [code]_physics_process[/code]." +msgstr "" + +#: doc/classes/World3D.xml:21 +msgid "The World3D's [Environment]." +msgstr "" + +#: doc/classes/World3D.xml:24 +msgid "" +"The World3D's fallback_environment will be used if the World3D's " +"[Environment] fails or is missing." +msgstr "" + +#: doc/classes/World3D.xml:27 +msgid "The World3D's visual scenario." +msgstr "" + +#: doc/classes/World3D.xml:30 +msgid "The World3D's physics space." +msgstr "" + +#: doc/classes/WorldEnvironment.xml:4 +msgid "" +"Default environment properties for the entire scene (post-processing " +"effects, lighting and background settings)." +msgstr "" + +#: doc/classes/WorldEnvironment.xml:7 +msgid "" +"The [WorldEnvironment] node is used to configure the default [Environment] " +"for the scene.\n" +"The parameters defined in the [WorldEnvironment] can be overridden by an " +"[Environment] node set on the current [Camera3D]. Additionally, only one " +"[WorldEnvironment] may be instanced in a given scene at a time.\n" +"The [WorldEnvironment] allows the user to specify default lighting " +"parameters (e.g. ambient lighting), various post-processing effects (e.g. " +"SSAO, DOF, Tonemapping), and how to draw the background (e.g. solid color, " +"skybox). Usually, these are added in order to improve the realism/color " +"balance of the scene." +msgstr "" + +#: doc/classes/WorldEnvironment.xml:20 +msgid "" +"The [Environment] resource used by this [WorldEnvironment], defining the " +"default properties." +msgstr "" + +#: doc/classes/WorldMarginShape3D.xml:4 +msgid "Infinite plane shape for 3D collisions." +msgstr "" + +#: doc/classes/WorldMarginShape3D.xml:7 +msgid "" +"An infinite plane shape for 3D collisions. Note that the [Plane]'s normal " +"matters; anything \"below\" the plane will collide with it. If the " +"[WorldMarginShape3D] is used in a [PhysicsBody3D], it will cause colliding " +"objects placed \"below\" it to teleport \"above\" the plane." +msgstr "" + +#: doc/classes/WorldMarginShape3D.xml:15 +msgid "The [Plane] used by the [WorldMarginShape3D] for collision." +msgstr "" + +#: doc/classes/X509Certificate.xml:4 +msgid "An X509 certificate (e.g. for SSL)." +msgstr "" + +#: doc/classes/X509Certificate.xml:7 +msgid "" +"The X509Certificate class represents an X509 certificate. Certificates can " +"be loaded and saved like any other [Resource].\n" +"They can be used as the server certificate in [method StreamPeerSSL." +"accept_stream] (along with the proper [CryptoKey]), and to specify the only " +"certificate that should be accepted when connecting to an SSL server via " +"[method StreamPeerSSL.connect_to_stream].\n" +"[b]Note:[/b] Not available in HTML5 exports." +msgstr "" + +#: doc/classes/X509Certificate.xml:20 +msgid "Loads a certificate from [code]path[/code] (\"*.crt\" file)." +msgstr "" + +#: doc/classes/X509Certificate.xml:29 +msgid "" +"Saves a certificate to the given [code]path[/code] (should be a \"*.crt\" " +"file)." +msgstr "" + +#: doc/classes/XMLParser.xml:4 +msgid "" +"Low-level class for creating parsers for [url=https://en.wikipedia.org/wiki/" +"XML]XML[/url] files." +msgstr "" + +#: doc/classes/XMLParser.xml:7 +msgid "" +"This class can serve as base to make custom XML parsers. Since XML is a very " +"flexible standard, this interface is low-level so it can be applied to any " +"possible schema." +msgstr "" + +#: doc/classes/XMLParser.xml:16 +msgid "Gets the amount of attributes in the current element." +msgstr "" + +#: doc/classes/XMLParser.xml:25 +msgid "" +"Gets the name of the attribute specified by the index in [code]idx[/code] " +"argument." +msgstr "" + +#: doc/classes/XMLParser.xml:34 +msgid "" +"Gets the value of the attribute specified by the index in [code]idx[/code] " +"argument." +msgstr "" + +#: doc/classes/XMLParser.xml:41 +msgid "Gets the current line in the parsed file (currently not implemented)." +msgstr "" + +#: doc/classes/XMLParser.xml:50 +msgid "" +"Gets the value of a certain attribute of the current element by name. This " +"will raise an error if the element has no such attribute." +msgstr "" + +#: doc/classes/XMLParser.xml:59 +msgid "" +"Gets the value of a certain attribute of the current element by name. This " +"will return an empty [String] if the attribute is not found." +msgstr "" + +#: doc/classes/XMLParser.xml:66 +msgid "" +"Gets the contents of a text node. This will raise an error in any other type " +"of node." +msgstr "" + +#: doc/classes/XMLParser.xml:73 +msgid "" +"Gets the name of the current element node. This will raise an error if the " +"current node type is neither [constant NODE_ELEMENT] nor [constant " +"NODE_ELEMENT_END]." +msgstr "" + +#: doc/classes/XMLParser.xml:80 +msgid "" +"Gets the byte offset of the current node since the beginning of the file or " +"buffer." +msgstr "" + +#: doc/classes/XMLParser.xml:87 +msgid "" +"Gets the type of the current node. Compare with [enum NodeType] constants." +msgstr "" + +#: doc/classes/XMLParser.xml:96 +msgid "Check whether the current element has a certain attribute." +msgstr "" + +#: doc/classes/XMLParser.xml:103 +msgid "" +"Check whether the current element is empty (this only works for completely " +"empty tags, e.g. [code]<element \\>[/code])." +msgstr "" + +#: doc/classes/XMLParser.xml:112 +msgid "Opens an XML file for parsing. This returns an error code." +msgstr "" + +#: doc/classes/XMLParser.xml:121 +msgid "Opens an XML raw buffer for parsing. This returns an error code." +msgstr "" + +#: doc/classes/XMLParser.xml:128 +msgid "Reads the next node of the file. This returns an error code." +msgstr "" + +#: doc/classes/XMLParser.xml:137 +msgid "" +"Moves the buffer cursor to a certain offset (since the beginning) and read " +"the next node there. This returns an error code." +msgstr "" + +#: doc/classes/XMLParser.xml:144 +msgid "" +"Skips the current section. If the node contains other elements, they will be " +"ignored and the cursor will go to the closing of the current element." +msgstr "" + +#: doc/classes/XMLParser.xml:150 +msgid "There's no node (no file or buffer opened)." +msgstr "" + +#: doc/classes/XMLParser.xml:153 +msgid "Element (tag)." +msgstr "" + +#: doc/classes/XMLParser.xml:156 +msgid "End of element." +msgstr "" + +#: doc/classes/XMLParser.xml:159 +msgid "Text node." +msgstr "" + +#: doc/classes/XMLParser.xml:162 +msgid "Comment node." +msgstr "" + +#: doc/classes/XMLParser.xml:165 +msgid "CDATA content." +msgstr "" + +#: doc/classes/XMLParser.xml:168 +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 "" + +#: doc/classes/YSort.xml:7 +msgid "" +"Sort all child nodes based on their Y positions. The child node must inherit " +"from [CanvasItem] for it to be sorted. Nodes that have a higher Y position " +"will be drawn later, so they will appear on top of nodes that have a lower Y " +"position.\n" +"Nesting of YSort nodes is possible. Children YSort nodes will be sorted in " +"the same space as the parent YSort, allowing to better organize a scene or " +"divide it in multiple ones, yet keep the unique sorting." +msgstr "" + +#: doc/classes/YSort.xml:16 +msgid "" +"If [code]true[/code], child nodes are sorted, otherwise sorting is disabled." +msgstr "" diff --git a/drivers/dummy/texture_loader_dummy.cpp b/drivers/dummy/texture_loader_dummy.cpp index 95876f5c7d..ddd2943720 100644 --- a/drivers/dummy/texture_loader_dummy.cpp +++ b/drivers/dummy/texture_loader_dummy.cpp @@ -35,7 +35,7 @@ #include <string.h> -RES ResourceFormatDummyTexture::load(const String &p_path, const String &p_original_path, Error *r_error, bool p_use_sub_threads, float *r_progress) { +RES ResourceFormatDummyTexture::load(const String &p_path, const String &p_original_path, Error *r_error, bool p_use_sub_threads, float *r_progress, bool p_no_cache) { unsigned int width = 8; unsigned int height = 8; @@ -67,10 +67,19 @@ RES ResourceFormatDummyTexture::load(const String &p_path, const String &p_origi } void ResourceFormatDummyTexture::get_recognized_extensions(List<String> *p_extensions) const { - p_extensions->push_back("png"); - p_extensions->push_back("hdr"); + p_extensions->push_back("bmp"); + p_extensions->push_back("dds"); + p_extensions->push_back("exr"); + p_extensions->push_back("jpeg"); p_extensions->push_back("jpg"); + p_extensions->push_back("hdr"); + p_extensions->push_back("pkm"); + p_extensions->push_back("png"); + p_extensions->push_back("pvr"); + p_extensions->push_back("svg"); + p_extensions->push_back("svgz"); p_extensions->push_back("tga"); + p_extensions->push_back("webp"); } bool ResourceFormatDummyTexture::handles_type(const String &p_type) const { @@ -79,7 +88,22 @@ bool ResourceFormatDummyTexture::handles_type(const String &p_type) const { String ResourceFormatDummyTexture::get_resource_type(const String &p_path) const { String extension = p_path.get_extension().to_lower(); - if (extension == "png" || extension == "hdr" || extension == "jpg" || extension == "tga") + if ( + extension == "bmp" || + extension == "dds" || + extension == "exr" || + extension == "jpeg" || + extension == "jpg" || + extension == "hdr" || + extension == "pkm" || + extension == "png" || + extension == "pvr" || + extension == "svg" || + extension == "svgz" || + extension == "tga" || + extension == "webp") { return "ImageTexture"; + } + return ""; } diff --git a/drivers/dummy/texture_loader_dummy.h b/drivers/dummy/texture_loader_dummy.h index 2a7d01dd78..ef9f3b13b6 100644 --- a/drivers/dummy/texture_loader_dummy.h +++ b/drivers/dummy/texture_loader_dummy.h @@ -36,7 +36,7 @@ class ResourceFormatDummyTexture : public ResourceFormatLoader { public: - virtual RES load(const String &p_path, const String &p_original_path = "", Error *r_error = nullptr, bool p_use_sub_threads = false, float *r_progress = nullptr); + virtual RES load(const String &p_path, const String &p_original_path = "", Error *r_error = nullptr, bool p_use_sub_threads = false, float *r_progress = nullptr, bool p_no_cache = false); virtual void get_recognized_extensions(List<String> *p_extensions) const; virtual bool handles_type(const String &p_type) const; virtual String get_resource_type(const String &p_path) const; 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/drivers/gles2/rasterizer_scene_gles2.cpp b/drivers/gles2/rasterizer_scene_gles2.cpp index 8d4c6e87fa..bdf0559f58 100644 --- a/drivers/gles2/rasterizer_scene_gles2.cpp +++ b/drivers/gles2/rasterizer_scene_gles2.cpp @@ -2501,16 +2501,16 @@ void RasterizerSceneGLES2::_render_render_list(RenderList::Element **p_elements, RasterizerStorageGLES2::Skeleton *skeleton = storage->skeleton_owner.getornull(e->instance->skeleton); if (skeleton != prev_skeleton) { - - if (skeleton) { - state.scene_shader.set_conditional(SceneShaderGLES2::USE_SKELETON, true); - state.scene_shader.set_conditional(SceneShaderGLES2::USE_SKELETON_SOFTWARE, storage->config.use_skeleton_software); - } else { - state.scene_shader.set_conditional(SceneShaderGLES2::USE_SKELETON, false); - state.scene_shader.set_conditional(SceneShaderGLES2::USE_SKELETON_SOFTWARE, false); + if ((prev_skeleton == nullptr) != (skeleton == nullptr)) { + if (skeleton) { + state.scene_shader.set_conditional(SceneShaderGLES2::USE_SKELETON, true); + state.scene_shader.set_conditional(SceneShaderGLES2::USE_SKELETON_SOFTWARE, storage->config.use_skeleton_software); + } else { + state.scene_shader.set_conditional(SceneShaderGLES2::USE_SKELETON, false); + state.scene_shader.set_conditional(SceneShaderGLES2::USE_SKELETON_SOFTWARE, false); + } + rebind = true; } - - rebind = true; } if (e->owner != prev_owner || e->geometry != prev_geometry || skeleton != prev_skeleton) { @@ -4045,7 +4045,7 @@ void RasterizerSceneGLES2::initialize() { //maximum compatibility, renderbuffer and RGBA shadow glGenRenderbuffers(1, &directional_shadow.depth); glBindRenderbuffer(GL_RENDERBUFFER, directional_shadow.depth); - glRenderbufferStorage(GL_RENDERBUFFER, storage->config.depth_internalformat, directional_shadow.size, directional_shadow.size); + glRenderbufferStorage(GL_RENDERBUFFER, storage->config.depth_buffer_internalformat, directional_shadow.size, directional_shadow.size); glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, GL_RENDERBUFFER, directional_shadow.depth); glGenTextures(1, &directional_shadow.color); diff --git a/drivers/gles2/rasterizer_storage_gles2.cpp b/drivers/gles2/rasterizer_storage_gles2.cpp index 409722ff82..b8c7815f6a 100644 --- a/drivers/gles2/rasterizer_storage_gles2.cpp +++ b/drivers/gles2/rasterizer_storage_gles2.cpp @@ -6252,7 +6252,7 @@ void RasterizerStorageGLES2::initialize() { #endif config.force_vertex_shading = GLOBAL_GET("rendering/quality/shading/force_vertex_shading"); - config.use_fast_texture_filter = GLOBAL_GET("rendering/quality/filters/use_nearest_mipmap_filter"); + config.use_fast_texture_filter = GLOBAL_GET("rendering/quality/texture_filters/use_nearest_mipmap_filter"); } void RasterizerStorageGLES2::finalize() { diff --git a/drivers/gles2/shader_compiler_gles2.cpp b/drivers/gles2/shader_compiler_gles2.cpp index 699d6e1484..92c1ada850 100644 --- a/drivers/gles2/shader_compiler_gles2.cpp +++ b/drivers/gles2/shader_compiler_gles2.cpp @@ -404,18 +404,19 @@ String ShaderCompilerGLES2::_dump_node_code(SL::Node *p_node, int p_level, Gener // constants - for (Map<StringName, SL::ShaderNode::Constant>::Element *E = snode->constants.front(); E; E = E->next()) { + for (int i = 0; i < snode->vconstants.size(); i++) { + const SL::ShaderNode::Constant &cnode = snode->vconstants[i]; String gcode; gcode += "const "; - gcode += _prestr(E->get().precision); - if (E->get().type == SL::TYPE_STRUCT) { - gcode += _mkid(E->get().type_str); + gcode += _prestr(cnode.precision); + if (cnode.type == SL::TYPE_STRUCT) { + gcode += _mkid(cnode.type_str); } else { - gcode += _typestr(E->get().type); + gcode += _typestr(cnode.type); } - gcode += " " + _mkid(E->key()); + gcode += " " + _mkid(String(cnode.name)); gcode += "="; - gcode += _dump_node_code(E->get().initializer, p_level, r_gen_code, p_actions, p_default_actions, p_assigning); + gcode += _dump_node_code(cnode.initializer, p_level, r_gen_code, p_actions, p_default_actions, p_assigning); gcode += ";\n"; vertex_global += gcode; fragment_global += gcode; diff --git a/drivers/vulkan/SCsub b/drivers/vulkan/SCsub index 7ffdac27d5..91d0e42f80 100644 --- a/drivers/vulkan/SCsub +++ b/drivers/vulkan/SCsub @@ -4,7 +4,25 @@ Import("env") env.add_source_files(env.drivers_sources, "*.cpp") -if env["builtin_vulkan"]: +if env["platform"] == "android": + # Use NDK Vulkan headers + thirdparty_dir = env["ANDROID_NDK_ROOT"] + "/sources/third_party/vulkan/src" + thirdparty_includes = [ + thirdparty_dir, + thirdparty_dir + "/include", + thirdparty_dir + "/layers", + thirdparty_dir + "/layers/generated", + ] + env.Prepend(CPPPATH=thirdparty_includes) + + # Build Vulkan memory allocator + env_thirdparty = env.Clone() + env_thirdparty.disable_warnings() + + thirdparty_dir = "#thirdparty/vulkan" + vma_sources = [thirdparty_dir + "/android/vk_mem_alloc.cpp"] + env_thirdparty.add_source_files(env.drivers_sources, vma_sources) +elif env["builtin_vulkan"]: # Use bundled Vulkan headers thirdparty_dir = "#thirdparty/vulkan" env.Prepend(CPPPATH=[thirdparty_dir, thirdparty_dir + "/include", thirdparty_dir + "/loader"]) diff --git a/drivers/vulkan/rendering_device_vulkan.cpp b/drivers/vulkan/rendering_device_vulkan.cpp index 69957d9939..23e9227a39 100644 --- a/drivers/vulkan/rendering_device_vulkan.cpp +++ b/drivers/vulkan/rendering_device_vulkan.cpp @@ -29,6 +29,7 @@ /*************************************************************************/ #include "rendering_device_vulkan.h" + #include "core/hashfuncs.h" #include "core/os/file_access.h" #include "core/os/os.h" @@ -1265,7 +1266,7 @@ Error RenderingDeviceVulkan::_buffer_free(Buffer *p_buffer) { ERR_FAIL_COND_V(p_buffer->size == 0, ERR_INVALID_PARAMETER); vmaDestroyBuffer(allocator, p_buffer->buffer, p_buffer->allocation); - p_buffer->buffer = nullptr; + p_buffer->buffer = VK_NULL_HANDLE; p_buffer->allocation = nullptr; p_buffer->size = 0; @@ -1564,11 +1565,21 @@ RID RenderingDeviceVulkan::texture_create(const TextureFormat &p_format, const T image_create_info.pNext = nullptr; image_create_info.flags = 0; - VkImageFormatListCreateInfoKHR format_list_create_info; - Vector<VkFormat> allowed_formats; +#ifndef _MSC_VER +#warning TODO check for support via RenderingDevice to enable on mobile when possible +#endif + +#ifndef ANDROID_ENABLED + // vkCreateImage fails with format list on Android (VK_ERROR_OUT_OF_HOST_MEMORY) + VkImageFormatListCreateInfoKHR format_list_create_info; //keep out of the if, needed for creation + Vector<VkFormat> allowed_formats; //keep out of the if, needed for creation +#endif if (p_format.shareable_formats.size()) { image_create_info.flags |= VK_IMAGE_CREATE_MUTABLE_FORMAT_BIT; + +#ifndef ANDROID_ENABLED + for (int i = 0; i < p_format.shareable_formats.size(); i++) { allowed_formats.push_back(vulkan_formats[p_format.shareable_formats[i]]); } @@ -1583,7 +1594,9 @@ RID RenderingDeviceVulkan::texture_create(const TextureFormat &p_format, const T "If supplied a list of shareable formats, the current format must be present in the list"); ERR_FAIL_COND_V_MSG(p_view.format_override != DATA_FORMAT_MAX && p_format.shareable_formats.find(p_view.format_override) == -1, RID(), "If supplied a list of shareable formats, the current view format override must be present in the list"); +#endif } + if (p_format.type == TEXTURE_TYPE_CUBE || p_format.type == TEXTURE_TYPE_CUBE_ARRAY) { image_create_info.flags |= VK_IMAGE_CREATE_CUBE_COMPATIBLE_BIT; } @@ -1759,6 +1772,8 @@ RID RenderingDeviceVulkan::texture_create(const TextureFormat &p_format, const T texture.depth = image_create_info.extent.depth; texture.layers = image_create_info.arrayLayers; texture.mipmaps = image_create_info.mipLevels; + texture.base_mipmap = 0; + texture.base_layer = 0; texture.usage_flags = p_format.usage_bits; texture.samples = p_format.samples; texture.allowed_shared_formats = p_format.shareable_formats; @@ -1999,6 +2014,8 @@ RID RenderingDeviceVulkan::texture_create_shared_from_slice(const TextureView &p get_image_format_required_size(texture.format, texture.width, texture.height, texture.depth, p_mipmap + 1, &texture.width, &texture.height); texture.mipmaps = 1; texture.layers = p_slice_type == TEXTURE_SLICE_CUBEMAP ? 6 : 1; + texture.base_mipmap = p_mipmap; + texture.base_layer = p_layer; VkImageViewCreateInfo image_view_create_info; image_view_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO; @@ -2659,6 +2676,159 @@ Error RenderingDeviceVulkan::texture_copy(RID p_from_texture, RID p_to_texture, return OK; } +Error RenderingDeviceVulkan::texture_resolve_multisample(RID p_from_texture, RID p_to_texture, bool p_sync_with_draw) { + _THREAD_SAFE_METHOD_ + + Texture *src_tex = texture_owner.getornull(p_from_texture); + ERR_FAIL_COND_V(!src_tex, ERR_INVALID_PARAMETER); + + ERR_FAIL_COND_V_MSG(p_sync_with_draw && src_tex->bound, ERR_INVALID_PARAMETER, + "Source texture can't be copied while a render pass that uses it is being created. Ensure render pass is finalized (and that it was created with RENDER_PASS_CONTENTS_FINISH) to unbind this texture."); + ERR_FAIL_COND_V_MSG(!(src_tex->usage_flags & TEXTURE_USAGE_CAN_COPY_FROM_BIT), ERR_INVALID_PARAMETER, + "Source texture requires the TEXTURE_USAGE_CAN_COPY_FROM_BIT in order to be retrieved."); + + ERR_FAIL_COND_V_MSG(src_tex->type != TEXTURE_TYPE_2D, ERR_INVALID_PARAMETER, "Source texture must be 2D (or a slice of a 3D/Cube texture)"); + ERR_FAIL_COND_V_MSG(src_tex->samples == TEXTURE_SAMPLES_1, ERR_INVALID_PARAMETER, "Source texture must be multisampled."); + + Texture *dst_tex = texture_owner.getornull(p_to_texture); + ERR_FAIL_COND_V(!dst_tex, ERR_INVALID_PARAMETER); + + ERR_FAIL_COND_V_MSG(p_sync_with_draw && dst_tex->bound, ERR_INVALID_PARAMETER, + "Destination texture can't be copied while a render pass that uses it is being created. Ensure render pass is finalized (and that it was created with RENDER_PASS_CONTENTS_FINISH) to unbind this texture."); + ERR_FAIL_COND_V_MSG(!(dst_tex->usage_flags & TEXTURE_USAGE_CAN_COPY_TO_BIT), ERR_INVALID_PARAMETER, + "Destination texture requires the TEXTURE_USAGE_CAN_COPY_TO_BIT in order to be retrieved."); + + ERR_FAIL_COND_V_MSG(dst_tex->type != TEXTURE_TYPE_2D, ERR_INVALID_PARAMETER, "Destination texture must be 2D (or a slice of a 3D/Cube texture)."); + ERR_FAIL_COND_V_MSG(dst_tex->samples != TEXTURE_SAMPLES_1, ERR_INVALID_PARAMETER, "Destination texture must not be multisampled."); + + ERR_FAIL_COND_V_MSG(src_tex->format != dst_tex->format, ERR_INVALID_PARAMETER, "Source and Destionation textures must be the same format."); + ERR_FAIL_COND_V_MSG(src_tex->width != dst_tex->width && src_tex->height != dst_tex->height && src_tex->depth != dst_tex->depth, ERR_INVALID_PARAMETER, "Source and Destionation textures must have the same dimensions."); + + ERR_FAIL_COND_V_MSG(src_tex->read_aspect_mask != dst_tex->read_aspect_mask, ERR_INVALID_PARAMETER, + "Source and destination texture must be of the same type (color or depth)."); + + VkCommandBuffer command_buffer = p_sync_with_draw ? frames[frame].draw_command_buffer : frames[frame].setup_command_buffer; + + { + + //PRE Copy the image + + { //Source + VkImageMemoryBarrier image_memory_barrier; + image_memory_barrier.sType = VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER; + image_memory_barrier.pNext = nullptr; + image_memory_barrier.srcAccessMask = 0; + image_memory_barrier.dstAccessMask = VK_ACCESS_TRANSFER_READ_BIT; + image_memory_barrier.oldLayout = src_tex->layout; + image_memory_barrier.newLayout = VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL; + + image_memory_barrier.srcQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED; + image_memory_barrier.dstQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED; + image_memory_barrier.image = src_tex->image; + image_memory_barrier.subresourceRange.aspectMask = src_tex->barrier_aspect_mask; + image_memory_barrier.subresourceRange.baseMipLevel = src_tex->base_mipmap; + image_memory_barrier.subresourceRange.levelCount = 1; + image_memory_barrier.subresourceRange.baseArrayLayer = src_tex->base_layer; + image_memory_barrier.subresourceRange.layerCount = 1; + + vkCmdPipelineBarrier(command_buffer, VK_PIPELINE_STAGE_TOP_OF_PIPE_BIT, VK_PIPELINE_STAGE_TRANSFER_BIT, 0, 0, nullptr, 0, nullptr, 1, &image_memory_barrier); + } + { //Dest + VkImageMemoryBarrier image_memory_barrier; + image_memory_barrier.sType = VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER; + image_memory_barrier.pNext = nullptr; + image_memory_barrier.srcAccessMask = 0; + image_memory_barrier.dstAccessMask = VK_ACCESS_TRANSFER_WRITE_BIT; + image_memory_barrier.oldLayout = dst_tex->layout; + image_memory_barrier.newLayout = VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL; + + image_memory_barrier.srcQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED; + image_memory_barrier.dstQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED; + image_memory_barrier.image = dst_tex->image; + image_memory_barrier.subresourceRange.aspectMask = dst_tex->read_aspect_mask; + image_memory_barrier.subresourceRange.baseMipLevel = dst_tex->base_mipmap; + image_memory_barrier.subresourceRange.levelCount = 1; + image_memory_barrier.subresourceRange.baseArrayLayer = dst_tex->base_layer; + image_memory_barrier.subresourceRange.layerCount = 1; + + vkCmdPipelineBarrier(command_buffer, VK_PIPELINE_STAGE_TOP_OF_PIPE_BIT, VK_PIPELINE_STAGE_TRANSFER_BIT, 0, 0, nullptr, 0, nullptr, 1, &image_memory_barrier); + } + + //COPY + + { + + VkImageResolve image_copy_region; + image_copy_region.srcSubresource.aspectMask = src_tex->read_aspect_mask; + image_copy_region.srcSubresource.baseArrayLayer = src_tex->base_layer; + image_copy_region.srcSubresource.layerCount = 1; + image_copy_region.srcSubresource.mipLevel = src_tex->base_mipmap; + image_copy_region.srcOffset.x = 0; + image_copy_region.srcOffset.y = 0; + image_copy_region.srcOffset.z = 0; + + image_copy_region.dstSubresource.aspectMask = dst_tex->read_aspect_mask; + image_copy_region.dstSubresource.baseArrayLayer = dst_tex->base_layer; + image_copy_region.dstSubresource.layerCount = 1; + image_copy_region.dstSubresource.mipLevel = dst_tex->base_mipmap; + image_copy_region.dstOffset.x = 0; + image_copy_region.dstOffset.y = 0; + image_copy_region.dstOffset.z = 0; + + image_copy_region.extent.width = src_tex->width; + image_copy_region.extent.height = src_tex->height; + image_copy_region.extent.depth = src_tex->depth; + + vkCmdResolveImage(command_buffer, src_tex->image, VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL, dst_tex->image, VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, 1, &image_copy_region); + } + + // RESTORE LAYOUT for SRC and DST + + { //restore src + VkImageMemoryBarrier image_memory_barrier; + image_memory_barrier.sType = VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER; + image_memory_barrier.pNext = nullptr; + image_memory_barrier.srcAccessMask = VK_ACCESS_TRANSFER_READ_BIT; + image_memory_barrier.dstAccessMask = VK_ACCESS_SHADER_READ_BIT | VK_ACCESS_SHADER_WRITE_BIT; + image_memory_barrier.oldLayout = VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL; + image_memory_barrier.newLayout = src_tex->layout; + image_memory_barrier.srcQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED; + image_memory_barrier.dstQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED; + image_memory_barrier.image = src_tex->image; + image_memory_barrier.subresourceRange.aspectMask = src_tex->barrier_aspect_mask; + image_memory_barrier.subresourceRange.baseMipLevel = src_tex->base_mipmap; + image_memory_barrier.subresourceRange.levelCount = 1; + image_memory_barrier.subresourceRange.baseArrayLayer = src_tex->base_layer; + image_memory_barrier.subresourceRange.layerCount = 1; + + vkCmdPipelineBarrier(command_buffer, VK_ACCESS_TRANSFER_WRITE_BIT, VK_PIPELINE_STAGE_VERTEX_SHADER_BIT | VK_PIPELINE_STAGE_COMPUTE_SHADER_BIT, 0, 0, nullptr, 0, nullptr, 1, &image_memory_barrier); + } + + { //make dst readable + + VkImageMemoryBarrier image_memory_barrier; + image_memory_barrier.sType = VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER; + image_memory_barrier.pNext = nullptr; + image_memory_barrier.srcAccessMask = VK_ACCESS_TRANSFER_WRITE_BIT; + image_memory_barrier.dstAccessMask = VK_ACCESS_SHADER_READ_BIT | VK_ACCESS_SHADER_WRITE_BIT; + image_memory_barrier.oldLayout = VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL; + image_memory_barrier.newLayout = dst_tex->layout; + + image_memory_barrier.srcQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED; + image_memory_barrier.dstQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED; + image_memory_barrier.image = dst_tex->image; + image_memory_barrier.subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT; + image_memory_barrier.subresourceRange.baseMipLevel = dst_tex->base_mipmap; + image_memory_barrier.subresourceRange.levelCount = 1; + image_memory_barrier.subresourceRange.baseArrayLayer = dst_tex->base_layer; + image_memory_barrier.subresourceRange.layerCount = 1; + + vkCmdPipelineBarrier(command_buffer, VK_PIPELINE_STAGE_TRANSFER_BIT, VK_PIPELINE_STAGE_VERTEX_SHADER_BIT | VK_PIPELINE_STAGE_COMPUTE_SHADER_BIT, 0, 0, nullptr, 0, nullptr, 1, &image_memory_barrier); + } + } + + return OK; +} Error RenderingDeviceVulkan::texture_clear(RID p_texture, const Color &p_color, uint32_t p_base_mipmap, uint32_t p_mipmaps, uint32_t p_base_layer, uint32_t p_layers, bool p_sync_with_draw) { @@ -2701,9 +2871,9 @@ Error RenderingDeviceVulkan::texture_clear(RID p_texture, const Color &p_color, image_memory_barrier.dstQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED; image_memory_barrier.image = src_tex->image; image_memory_barrier.subresourceRange.aspectMask = src_tex->read_aspect_mask; - image_memory_barrier.subresourceRange.baseMipLevel = p_base_mipmap; + image_memory_barrier.subresourceRange.baseMipLevel = src_tex->base_mipmap + p_base_mipmap; image_memory_barrier.subresourceRange.levelCount = p_mipmaps; - image_memory_barrier.subresourceRange.baseArrayLayer = p_base_layer; + image_memory_barrier.subresourceRange.baseArrayLayer = src_tex->base_layer + p_base_layer; image_memory_barrier.subresourceRange.layerCount = p_layers; layout = VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL; @@ -2718,9 +2888,9 @@ Error RenderingDeviceVulkan::texture_clear(RID p_texture, const Color &p_color, VkImageSubresourceRange range; range.aspectMask = src_tex->read_aspect_mask; - range.baseArrayLayer = p_base_layer; + range.baseArrayLayer = src_tex->base_layer + p_base_layer; range.layerCount = p_layers; - range.baseMipLevel = p_base_mipmap; + range.baseMipLevel = src_tex->base_mipmap + p_base_mipmap; range.levelCount = p_mipmaps; vkCmdClearColorImage(command_buffer, src_tex->image, layout, &clear_color, 1, &range); @@ -2739,9 +2909,9 @@ Error RenderingDeviceVulkan::texture_clear(RID p_texture, const Color &p_color, image_memory_barrier.dstQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED; image_memory_barrier.image = src_tex->image; image_memory_barrier.subresourceRange.aspectMask = src_tex->read_aspect_mask; - image_memory_barrier.subresourceRange.baseMipLevel = p_base_mipmap; + image_memory_barrier.subresourceRange.baseMipLevel = src_tex->base_mipmap + p_base_mipmap; image_memory_barrier.subresourceRange.levelCount = p_mipmaps; - image_memory_barrier.subresourceRange.baseArrayLayer = p_base_layer; + image_memory_barrier.subresourceRange.baseArrayLayer = src_tex->base_layer + p_base_layer; image_memory_barrier.subresourceRange.layerCount = p_layers; vkCmdPipelineBarrier(command_buffer, VK_PIPELINE_STAGE_TRANSFER_BIT, VK_PIPELINE_STAGE_VERTEX_SHADER_BIT | VK_PIPELINE_STAGE_COMPUTE_SHADER_BIT, 0, 0, nullptr, 0, nullptr, 1, &image_memory_barrier); @@ -2839,6 +3009,21 @@ VkRenderPass RenderingDeviceVulkan::_render_pass_create(const Vector<AttachmentF description.initialLayout = VK_IMAGE_LAYOUT_UNDEFINED; //don't care what is there } } break; + case INITIAL_ACTION_DROP: { + if (p_format[i].usage_flags & TEXTURE_USAGE_COLOR_ATTACHMENT_BIT) { + description.loadOp = VK_ATTACHMENT_LOAD_OP_DONT_CARE; + description.initialLayout = is_sampled ? VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL : (is_storage ? VK_IMAGE_LAYOUT_GENERAL : VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL); + description.stencilLoadOp = VK_ATTACHMENT_LOAD_OP_DONT_CARE; + } else if (p_format[i].usage_flags & TEXTURE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT) { + description.loadOp = VK_ATTACHMENT_LOAD_OP_DONT_CARE; + description.initialLayout = VK_IMAGE_LAYOUT_UNDEFINED; //don't care what is there + description.stencilLoadOp = VK_ATTACHMENT_LOAD_OP_DONT_CARE; + } else { + description.loadOp = VK_ATTACHMENT_LOAD_OP_DONT_CARE; + description.stencilLoadOp = VK_ATTACHMENT_LOAD_OP_DONT_CARE; + description.initialLayout = VK_IMAGE_LAYOUT_UNDEFINED; //don't care what is there + } + } break; case INITIAL_ACTION_CONTINUE: { if (p_format[i].usage_flags & TEXTURE_USAGE_COLOR_ATTACHMENT_BIT) { description.loadOp = VK_ATTACHMENT_LOAD_OP_LOAD; @@ -3142,7 +3327,7 @@ RID RenderingDeviceVulkan::vertex_buffer_create(uint32_t p_size_bytes, const Vec } // Internally reference counted, this ID is warranted to be unique for the same description, but needs to be freed as many times as it was allocated -RenderingDevice::VertexFormatID RenderingDeviceVulkan::vertex_format_create(const Vector<VertexDescription> &p_vertex_formats) { +RenderingDevice::VertexFormatID RenderingDeviceVulkan::vertex_format_create(const Vector<VertexAttribute> &p_vertex_formats) { _THREAD_SAFE_METHOD_ @@ -3217,7 +3402,7 @@ RID RenderingDeviceVulkan::vertex_array_create(uint32_t p_vertex_count, VertexFo //validate with buffer { - const VertexDescription &atf = vd.vertex_formats[i]; + const VertexAttribute &atf = vd.vertex_formats[i]; uint32_t element_size = get_format_vertex_size(atf.format); ERR_FAIL_COND_V(element_size == 0, RID()); //should never happens since this was prevalidated @@ -4250,7 +4435,7 @@ RID RenderingDeviceVulkan::uniform_set_create(const Vector<Uniform> &p_uniforms, VkWriteDescriptorSet write; //common header write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET; write.pNext = nullptr; - write.dstSet = nullptr; //will assign afterwards when everything is valid + write.dstSet = VK_NULL_HANDLE; //will assign afterwards when everything is valid write.dstBinding = set_uniform.binding; uint32_t type_size = 1; @@ -4318,6 +4503,10 @@ RID RenderingDeviceVulkan::uniform_set_create(const Vector<Uniform> &p_uniforms, attachable_textures.push_back(texture->owner.is_valid() ? texture->owner : uniform.ids[j + 1]); } + if (texture->usage_flags & TEXTURE_USAGE_STORAGE_BIT) { + //can also be used as storage, add to mutable sampled + mutable_sampled_textures.push_back(texture); + } if (texture->owner.is_valid()) { texture = texture_owner.getornull(texture->owner); ERR_FAIL_COND_V(!texture, RID()); //bug, should never happen @@ -4326,11 +4515,6 @@ RID RenderingDeviceVulkan::uniform_set_create(const Vector<Uniform> &p_uniforms, img_info.imageLayout = VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL; image_info.push_back(img_info); - - if (texture->usage_flags & TEXTURE_USAGE_STORAGE_BIT) { - //can also be used as storage, add to mutable sampled - mutable_sampled_textures.push_back(texture); - } } write.dstArrayElement = 0; @@ -4363,13 +4547,18 @@ RID RenderingDeviceVulkan::uniform_set_create(const Vector<Uniform> &p_uniforms, "Texture (binding: " + itos(uniform.binding) + ", index " + itos(j) + ") needs the TEXTURE_USAGE_SAMPLING_BIT usage flag set in order to be used as uniform."); VkDescriptorImageInfo img_info; - img_info.sampler = nullptr; + img_info.sampler = VK_NULL_HANDLE; img_info.imageView = texture->view; if (texture->usage_flags & (TEXTURE_USAGE_COLOR_ATTACHMENT_BIT | TEXTURE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT | TEXTURE_USAGE_RESOLVE_ATTACHMENT_BIT)) { attachable_textures.push_back(texture->owner.is_valid() ? texture->owner : uniform.ids[j]); } + if (texture->usage_flags & TEXTURE_USAGE_STORAGE_BIT) { + //can also be used as storage, add to mutable sampled + mutable_sampled_textures.push_back(texture); + } + if (texture->owner.is_valid()) { texture = texture_owner.getornull(texture->owner); ERR_FAIL_COND_V(!texture, RID()); //bug, should never happen @@ -4378,11 +4567,6 @@ RID RenderingDeviceVulkan::uniform_set_create(const Vector<Uniform> &p_uniforms, img_info.imageLayout = VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL; image_info.push_back(img_info); - - if (texture->usage_flags & TEXTURE_USAGE_STORAGE_BIT) { - //can also be used as storage, add to mutable sampled - mutable_sampled_textures.push_back(texture); - } } write.dstArrayElement = 0; @@ -4416,9 +4600,14 @@ RID RenderingDeviceVulkan::uniform_set_create(const Vector<Uniform> &p_uniforms, "Image (binding: " + itos(uniform.binding) + ", index " + itos(j) + ") needs the TEXTURE_USAGE_STORAGE_BIT usage flag set in order to be used as uniform."); VkDescriptorImageInfo img_info; - img_info.sampler = nullptr; + img_info.sampler = VK_NULL_HANDLE; img_info.imageView = texture->view; + if (texture->usage_flags & TEXTURE_USAGE_SAMPLING_BIT) { + //can also be used as storage, add to mutable sampled + mutable_storage_textures.push_back(texture); + } + if (texture->owner.is_valid()) { texture = texture_owner.getornull(texture->owner); ERR_FAIL_COND_V(!texture, RID()); //bug, should never happen @@ -4427,11 +4616,6 @@ RID RenderingDeviceVulkan::uniform_set_create(const Vector<Uniform> &p_uniforms, img_info.imageLayout = VK_IMAGE_LAYOUT_GENERAL; image_info.push_back(img_info); - - if (texture->usage_flags & TEXTURE_USAGE_SAMPLING_BIT) { - //can also be used as storage, add to mutable sampled - mutable_storage_textures.push_back(texture); - } } write.dstArrayElement = 0; @@ -4901,29 +5085,29 @@ RID RenderingDeviceVulkan::render_pipeline_create(RID p_shader, FramebufferForma depth_stencil_state_create_info.depthBoundsTestEnable = p_depth_stencil_state.enable_depth_range; depth_stencil_state_create_info.stencilTestEnable = p_depth_stencil_state.enable_stencil; - ERR_FAIL_INDEX_V(p_depth_stencil_state.stencil_operation_front.fail, STENCIL_OP_MAX, RID()); - depth_stencil_state_create_info.front.failOp = stencil_operations[p_depth_stencil_state.stencil_operation_front.fail]; - ERR_FAIL_INDEX_V(p_depth_stencil_state.stencil_operation_front.pass, STENCIL_OP_MAX, RID()); - depth_stencil_state_create_info.front.passOp = stencil_operations[p_depth_stencil_state.stencil_operation_front.pass]; - ERR_FAIL_INDEX_V(p_depth_stencil_state.stencil_operation_front.depth_fail, STENCIL_OP_MAX, RID()); - depth_stencil_state_create_info.front.depthFailOp = stencil_operations[p_depth_stencil_state.stencil_operation_front.depth_fail]; - ERR_FAIL_INDEX_V(p_depth_stencil_state.stencil_operation_front.compare, COMPARE_OP_MAX, RID()); - depth_stencil_state_create_info.front.compareOp = compare_operators[p_depth_stencil_state.stencil_operation_front.compare]; - depth_stencil_state_create_info.front.compareMask = p_depth_stencil_state.stencil_operation_front.compare_mask; - depth_stencil_state_create_info.front.writeMask = p_depth_stencil_state.stencil_operation_front.write_mask; - depth_stencil_state_create_info.front.reference = p_depth_stencil_state.stencil_operation_front.reference; - - ERR_FAIL_INDEX_V(p_depth_stencil_state.stencil_operation_back.fail, STENCIL_OP_MAX, RID()); - depth_stencil_state_create_info.back.failOp = stencil_operations[p_depth_stencil_state.stencil_operation_back.fail]; - ERR_FAIL_INDEX_V(p_depth_stencil_state.stencil_operation_back.pass, STENCIL_OP_MAX, RID()); - depth_stencil_state_create_info.back.passOp = stencil_operations[p_depth_stencil_state.stencil_operation_back.pass]; - ERR_FAIL_INDEX_V(p_depth_stencil_state.stencil_operation_back.depth_fail, STENCIL_OP_MAX, RID()); - depth_stencil_state_create_info.back.depthFailOp = stencil_operations[p_depth_stencil_state.stencil_operation_back.depth_fail]; - ERR_FAIL_INDEX_V(p_depth_stencil_state.stencil_operation_back.compare, COMPARE_OP_MAX, RID()); - depth_stencil_state_create_info.back.compareOp = compare_operators[p_depth_stencil_state.stencil_operation_back.compare]; - depth_stencil_state_create_info.back.compareMask = p_depth_stencil_state.stencil_operation_back.compare_mask; - depth_stencil_state_create_info.back.writeMask = p_depth_stencil_state.stencil_operation_back.write_mask; - depth_stencil_state_create_info.back.reference = p_depth_stencil_state.stencil_operation_back.reference; + ERR_FAIL_INDEX_V(p_depth_stencil_state.front_op.fail, STENCIL_OP_MAX, RID()); + depth_stencil_state_create_info.front.failOp = stencil_operations[p_depth_stencil_state.front_op.fail]; + ERR_FAIL_INDEX_V(p_depth_stencil_state.front_op.pass, STENCIL_OP_MAX, RID()); + depth_stencil_state_create_info.front.passOp = stencil_operations[p_depth_stencil_state.front_op.pass]; + ERR_FAIL_INDEX_V(p_depth_stencil_state.front_op.depth_fail, STENCIL_OP_MAX, RID()); + depth_stencil_state_create_info.front.depthFailOp = stencil_operations[p_depth_stencil_state.front_op.depth_fail]; + ERR_FAIL_INDEX_V(p_depth_stencil_state.front_op.compare, COMPARE_OP_MAX, RID()); + depth_stencil_state_create_info.front.compareOp = compare_operators[p_depth_stencil_state.front_op.compare]; + depth_stencil_state_create_info.front.compareMask = p_depth_stencil_state.front_op.compare_mask; + depth_stencil_state_create_info.front.writeMask = p_depth_stencil_state.front_op.write_mask; + depth_stencil_state_create_info.front.reference = p_depth_stencil_state.front_op.reference; + + ERR_FAIL_INDEX_V(p_depth_stencil_state.back_op.fail, STENCIL_OP_MAX, RID()); + depth_stencil_state_create_info.back.failOp = stencil_operations[p_depth_stencil_state.back_op.fail]; + ERR_FAIL_INDEX_V(p_depth_stencil_state.back_op.pass, STENCIL_OP_MAX, RID()); + depth_stencil_state_create_info.back.passOp = stencil_operations[p_depth_stencil_state.back_op.pass]; + ERR_FAIL_INDEX_V(p_depth_stencil_state.back_op.depth_fail, STENCIL_OP_MAX, RID()); + depth_stencil_state_create_info.back.depthFailOp = stencil_operations[p_depth_stencil_state.back_op.depth_fail]; + ERR_FAIL_INDEX_V(p_depth_stencil_state.back_op.compare, COMPARE_OP_MAX, RID()); + depth_stencil_state_create_info.back.compareOp = compare_operators[p_depth_stencil_state.back_op.compare]; + depth_stencil_state_create_info.back.compareMask = p_depth_stencil_state.back_op.compare_mask; + depth_stencil_state_create_info.back.writeMask = p_depth_stencil_state.back_op.write_mask; + depth_stencil_state_create_info.back.reference = p_depth_stencil_state.back_op.reference; depth_stencil_state_create_info.minDepthBounds = p_depth_stencil_state.depth_range_min; depth_stencil_state_create_info.maxDepthBounds = p_depth_stencil_state.depth_range_max; @@ -5048,11 +5232,11 @@ RID RenderingDeviceVulkan::render_pipeline_create(RID p_shader, FramebufferForma graphics_pipeline_create_info.renderPass = fb_format.render_pass; graphics_pipeline_create_info.subpass = 0; - graphics_pipeline_create_info.basePipelineHandle = nullptr; + graphics_pipeline_create_info.basePipelineHandle = VK_NULL_HANDLE; graphics_pipeline_create_info.basePipelineIndex = 0; RenderPipeline pipeline; - VkResult err = vkCreateGraphicsPipelines(device, nullptr, 1, &graphics_pipeline_create_info, nullptr, &pipeline.pipeline); + VkResult err = vkCreateGraphicsPipelines(device, VK_NULL_HANDLE, 1, &graphics_pipeline_create_info, nullptr, &pipeline.pipeline); ERR_FAIL_COND_V_MSG(err, RID(), "vkCreateGraphicsPipelines failed with error " + itos(err) + "."); pipeline.set_formats = shader->set_formats; @@ -5121,11 +5305,11 @@ RID RenderingDeviceVulkan::compute_pipeline_create(RID p_shader) { compute_pipeline_create_info.stage = shader->pipeline_stages[0]; compute_pipeline_create_info.layout = shader->pipeline_layout; - compute_pipeline_create_info.basePipelineHandle = nullptr; + compute_pipeline_create_info.basePipelineHandle = VK_NULL_HANDLE; compute_pipeline_create_info.basePipelineIndex = 0; ComputePipeline pipeline; - VkResult err = vkCreateComputePipelines(device, nullptr, 1, &compute_pipeline_create_info, nullptr, &pipeline.pipeline); + VkResult err = vkCreateComputePipelines(device, VK_NULL_HANDLE, 1, &compute_pipeline_create_info, nullptr, &pipeline.pipeline); ERR_FAIL_COND_V_MSG(err, RID(), "vkCreateComputePipelines failed with error " + itos(err) + "."); pipeline.set_formats = shader->set_formats; @@ -5152,17 +5336,19 @@ bool RenderingDeviceVulkan::compute_pipeline_is_valid(RID p_pipeline) { int RenderingDeviceVulkan::screen_get_width(DisplayServer::WindowID p_screen) const { _THREAD_SAFE_METHOD_ - + ERR_FAIL_COND_V_MSG(local_device.is_valid(), -1, "Local devices have no screen"); return context->window_get_width(p_screen); } int RenderingDeviceVulkan::screen_get_height(DisplayServer::WindowID p_screen) const { _THREAD_SAFE_METHOD_ + ERR_FAIL_COND_V_MSG(local_device.is_valid(), -1, "Local devices have no screen"); return context->window_get_height(p_screen); } RenderingDevice::FramebufferFormatID RenderingDeviceVulkan::screen_get_framebuffer_format() const { _THREAD_SAFE_METHOD_ + ERR_FAIL_COND_V_MSG(local_device.is_valid(), INVALID_ID, "Local devices have no screen"); //very hacky, but not used often per frame so I guess ok VkFormat vkformat = context->get_screen_format(); @@ -5192,6 +5378,7 @@ RenderingDevice::FramebufferFormatID RenderingDeviceVulkan::screen_get_framebuff RenderingDevice::DrawListID RenderingDeviceVulkan::draw_list_begin_for_screen(DisplayServer::WindowID p_screen, const Color &p_clear_color) { _THREAD_SAFE_METHOD_ + ERR_FAIL_COND_V_MSG(local_device.is_valid(), INVALID_ID, "Local devices have no screen"); ERR_FAIL_COND_V_MSG(draw_list != nullptr, INVALID_ID, "Only one draw list can be active at the same time."); ERR_FAIL_COND_V_MSG(compute_list != nullptr, INVALID_ID, "Only one draw/compute list can be active at the same time."); @@ -5856,7 +6043,7 @@ void RenderingDeviceVulkan::draw_list_set_line_width(DrawListID p_list, float p_ vkCmdSetLineWidth(dl->command_buffer, p_width); } -void RenderingDeviceVulkan::draw_list_set_push_constant(DrawListID p_list, void *p_data, uint32_t p_data_size) { +void RenderingDeviceVulkan::draw_list_set_push_constant(DrawListID p_list, const void *p_data, uint32_t p_data_size) { DrawList *dl = _get_draw_list_ptr(p_list); ERR_FAIL_COND(!dl); @@ -6199,9 +6386,9 @@ void RenderingDeviceVulkan::compute_list_bind_uniform_set(ComputeListID p_list, image_memory_barrier.dstQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED; image_memory_barrier.image = textures_to_sampled[i]->image; image_memory_barrier.subresourceRange.aspectMask = textures_to_sampled[i]->read_aspect_mask; - image_memory_barrier.subresourceRange.baseMipLevel = 0; + image_memory_barrier.subresourceRange.baseMipLevel = textures_to_sampled[i]->base_mipmap; image_memory_barrier.subresourceRange.levelCount = textures_to_sampled[i]->mipmaps; - image_memory_barrier.subresourceRange.baseArrayLayer = 0; + image_memory_barrier.subresourceRange.baseArrayLayer = textures_to_sampled[i]->base_layer; image_memory_barrier.subresourceRange.layerCount = textures_to_sampled[i]->layers; vkCmdPipelineBarrier(cl->command_buffer, VK_PIPELINE_STAGE_VERTEX_SHADER_BIT | VK_PIPELINE_STAGE_COMPUTE_SHADER_BIT, VK_PIPELINE_STAGE_COMPUTE_SHADER_BIT, 0, 0, nullptr, 0, nullptr, 1, &image_memory_barrier); @@ -6230,9 +6417,9 @@ void RenderingDeviceVulkan::compute_list_bind_uniform_set(ComputeListID p_list, image_memory_barrier.dstQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED; image_memory_barrier.image = textures_to_storage[i]->image; image_memory_barrier.subresourceRange.aspectMask = textures_to_storage[i]->read_aspect_mask; - image_memory_barrier.subresourceRange.baseMipLevel = 0; + image_memory_barrier.subresourceRange.baseMipLevel = textures_to_storage[i]->base_mipmap; image_memory_barrier.subresourceRange.levelCount = textures_to_storage[i]->mipmaps; - image_memory_barrier.subresourceRange.baseArrayLayer = 0; + image_memory_barrier.subresourceRange.baseArrayLayer = textures_to_storage[i]->base_layer; image_memory_barrier.subresourceRange.layerCount = textures_to_storage[i]->layers; vkCmdPipelineBarrier(cl->command_buffer, VK_PIPELINE_STAGE_COMPUTE_SHADER_BIT | VK_PIPELINE_STAGE_FRAGMENT_SHADER_BIT, VK_PIPELINE_STAGE_COMPUTE_SHADER_BIT, 0, 0, nullptr, 0, nullptr, 1, &image_memory_barrier); @@ -6259,7 +6446,7 @@ void RenderingDeviceVulkan::compute_list_bind_uniform_set(ComputeListID p_list, #endif } -void RenderingDeviceVulkan::compute_list_set_push_constant(ComputeListID p_list, void *p_data, uint32_t p_data_size) { +void RenderingDeviceVulkan::compute_list_set_push_constant(ComputeListID p_list, const void *p_data, uint32_t p_data_size) { ERR_FAIL_COND(p_list != ID_TYPE_COMPUTE_LIST); ERR_FAIL_COND(!compute_list); @@ -6362,9 +6549,9 @@ void RenderingDeviceVulkan::compute_list_end() { image_memory_barrier.dstQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED; image_memory_barrier.image = E->get()->image; image_memory_barrier.subresourceRange.aspectMask = E->get()->read_aspect_mask; - image_memory_barrier.subresourceRange.baseMipLevel = 0; + image_memory_barrier.subresourceRange.baseMipLevel = E->get()->base_mipmap; image_memory_barrier.subresourceRange.levelCount = E->get()->mipmaps; - image_memory_barrier.subresourceRange.baseArrayLayer = 0; + image_memory_barrier.subresourceRange.baseArrayLayer = E->get()->base_layer; image_memory_barrier.subresourceRange.layerCount = E->get()->layers; vkCmdPipelineBarrier(compute_list->command_buffer, VK_PIPELINE_STAGE_COMPUTE_SHADER_BIT, VK_PIPELINE_STAGE_VERTEX_SHADER_BIT | VK_PIPELINE_STAGE_COMPUTE_SHADER_BIT, 0, 0, nullptr, 0, nullptr, 1, &image_memory_barrier); @@ -6511,75 +6698,104 @@ void RenderingDeviceVulkan::free(RID p_id) { _free_dependencies(p_id); //recursively erase dependencies first, to avoid potential API problems _free_internal(p_id); } -void RenderingDeviceVulkan::swap_buffers() { - _THREAD_SAFE_METHOD_ +void RenderingDeviceVulkan::_finalize_command_bufers() { - { //finalize frame + if (draw_list) { + ERR_PRINT("Found open draw list at the end of the frame, this should never happen (further drawing will likely not work)."); + } - if (draw_list) { - ERR_PRINT("Found open draw list at the end of the frame, this should never happen (further drawing will likely not work)."); - } + if (compute_list) { + ERR_PRINT("Found open compute list at the end of the frame, this should never happen (further compute will likely not work)."); + } - if (compute_list) { - ERR_PRINT("Found open compute list at the end of the frame, this should never happen (further compute will likely not work)."); - } + { //complete the setup buffer (that needs to be processed before anything else) + vkEndCommandBuffer(frames[frame].setup_command_buffer); + vkEndCommandBuffer(frames[frame].draw_command_buffer); + } +} + +void RenderingDeviceVulkan::_begin_frame() { + + //erase pending resources + _free_pending_resources(frame); + + //create setup command buffer and set as the setup buffer + + { + VkCommandBufferBeginInfo cmdbuf_begin; + cmdbuf_begin.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO; + cmdbuf_begin.pNext = nullptr; + cmdbuf_begin.flags = VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT; + cmdbuf_begin.pInheritanceInfo = nullptr; + + VkResult err = vkResetCommandBuffer(frames[frame].setup_command_buffer, 0); + ERR_FAIL_COND_MSG(err, "vkResetCommandBuffer failed with error " + itos(err) + "."); - { //complete the setup buffer (that needs to be processed before anything else) - vkEndCommandBuffer(frames[frame].setup_command_buffer); - vkEndCommandBuffer(frames[frame].draw_command_buffer); + err = vkBeginCommandBuffer(frames[frame].setup_command_buffer, &cmdbuf_begin); + ERR_FAIL_COND_MSG(err, "vkBeginCommandBuffer failed with error " + itos(err) + "."); + err = vkBeginCommandBuffer(frames[frame].draw_command_buffer, &cmdbuf_begin); + ERR_FAIL_COND_MSG(err, "vkBeginCommandBuffer failed with error " + itos(err) + "."); + + if (local_device.is_null()) { + context->append_command_buffer(frames[frame].draw_command_buffer); + context->set_setup_buffer(frames[frame].setup_command_buffer); //append now so it's added before everything else } - screen_prepared = false; } - //swap buffers - context->swap_buffers(); + //advance current frame + frames_drawn++; + //advance staging buffer if used + if (staging_buffer_used) { + staging_buffer_current = (staging_buffer_current + 1) % staging_buffer_blocks.size(); + staging_buffer_used = false; + } - { //advance frame + if (frames[frame].timestamp_count) { + vkGetQueryPoolResults(device, frames[frame].timestamp_pool, 0, frames[frame].timestamp_count, sizeof(uint64_t) * max_timestamp_query_elements, frames[frame].timestamp_result_values, sizeof(uint64_t), VK_QUERY_RESULT_64_BIT); + SWAP(frames[frame].timestamp_names, frames[frame].timestamp_result_names); + SWAP(frames[frame].timestamp_cpu_values, frames[frame].timestamp_cpu_result_values); + } - frame = (frame + 1) % frame_count; + frames[frame].timestamp_result_count = frames[frame].timestamp_count; + frames[frame].timestamp_count = 0; + frames[frame].index = Engine::get_singleton()->get_frames_drawn(); +} - //erase pending resources - _free_pending_resources(frame); +void RenderingDeviceVulkan::swap_buffers() { - //create setup command buffer and set as the setup buffer + ERR_FAIL_COND_MSG(local_device.is_valid(), "Local devices can't swap buffers."); + _THREAD_SAFE_METHOD_ - { - VkCommandBufferBeginInfo cmdbuf_begin; - cmdbuf_begin.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO; - cmdbuf_begin.pNext = nullptr; - cmdbuf_begin.flags = VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT; - cmdbuf_begin.pInheritanceInfo = nullptr; + _finalize_command_bufers(); - VkResult err = vkResetCommandBuffer(frames[frame].setup_command_buffer, 0); - ERR_FAIL_COND_MSG(err, "vkResetCommandBuffer failed with error " + itos(err) + "."); + screen_prepared = false; + //swap buffers + context->swap_buffers(); - err = vkBeginCommandBuffer(frames[frame].setup_command_buffer, &cmdbuf_begin); - ERR_FAIL_COND_MSG(err, "vkBeginCommandBuffer failed with error " + itos(err) + "."); - context->set_setup_buffer(frames[frame].setup_command_buffer); //append now so it's added before everything else - err = vkBeginCommandBuffer(frames[frame].draw_command_buffer, &cmdbuf_begin); - ERR_FAIL_COND_MSG(err, "vkBeginCommandBuffer failed with error " + itos(err) + "."); - context->append_command_buffer(frames[frame].draw_command_buffer); - } + frame = (frame + 1) % frame_count; - //advance current frame - frames_drawn++; - //advance staging buffer if used - if (staging_buffer_used) { - staging_buffer_current = (staging_buffer_current + 1) % staging_buffer_blocks.size(); - staging_buffer_used = false; - } + _begin_frame(); +} - if (frames[frame].timestamp_count) { - vkGetQueryPoolResults(device, frames[frame].timestamp_pool, 0, frames[frame].timestamp_count, sizeof(uint64_t) * max_timestamp_query_elements, frames[frame].timestamp_result_values, sizeof(uint64_t), VK_QUERY_RESULT_64_BIT); - SWAP(frames[frame].timestamp_names, frames[frame].timestamp_result_names); - SWAP(frames[frame].timestamp_cpu_values, frames[frame].timestamp_cpu_result_values); - } +void RenderingDeviceVulkan::submit() { + ERR_FAIL_COND_MSG(local_device.is_null(), "Only local devices can submit and sync."); + ERR_FAIL_COND_MSG(local_device_processing, "device already submitted, call sync to wait until done."); - frames[frame].timestamp_result_count = frames[frame].timestamp_count; - frames[frame].timestamp_count = 0; - frames[frame].index = Engine::get_singleton()->get_frames_drawn(); - } + _finalize_command_bufers(); + + VkCommandBuffer command_buffers[2] = { frames[frame].setup_command_buffer, frames[frame].draw_command_buffer }; + context->local_device_push_command_buffers(local_device, command_buffers, 2); + local_device_processing = true; +} + +void RenderingDeviceVulkan::sync() { + + ERR_FAIL_COND_MSG(local_device.is_null(), "Only local devices can submit and sync."); + ERR_FAIL_COND_MSG(!local_device_processing, "sync can only be called after a submit"); + + context->local_device_sync(local_device); + _begin_frame(); } void RenderingDeviceVulkan::_free_pending_resources(int p_frame) { @@ -6698,14 +6914,21 @@ uint32_t RenderingDeviceVulkan::get_frame_delay() const { void RenderingDeviceVulkan::_flush(bool p_current_frame) { + if (local_device.is_valid() && !p_current_frame) { + return; //flushign previous frames has no effect with local device + } //not doing this crashes RADV (undefined behavior) if (p_current_frame) { vkEndCommandBuffer(frames[frame].setup_command_buffer); vkEndCommandBuffer(frames[frame].draw_command_buffer); } - context->flush(p_current_frame, p_current_frame); - //re-create the setup command - if (p_current_frame) { + + if (local_device.is_valid()) { + + VkCommandBuffer command_buffers[2] = { frames[frame].setup_command_buffer, frames[frame].draw_command_buffer }; + context->local_device_push_command_buffers(local_device, command_buffers, 2); + context->local_device_sync(local_device); + VkCommandBufferBeginInfo cmdbuf_begin; cmdbuf_begin.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO; cmdbuf_begin.pNext = nullptr; @@ -6714,27 +6937,48 @@ void RenderingDeviceVulkan::_flush(bool p_current_frame) { VkResult err = vkBeginCommandBuffer(frames[frame].setup_command_buffer, &cmdbuf_begin); ERR_FAIL_COND_MSG(err, "vkBeginCommandBuffer failed with error " + itos(err) + "."); - context->set_setup_buffer(frames[frame].setup_command_buffer); //append now so it's added before everything else - } + err = vkBeginCommandBuffer(frames[frame].draw_command_buffer, &cmdbuf_begin); + ERR_FAIL_COND_MSG(err, "vkBeginCommandBuffer failed with error " + itos(err) + "."); - if (p_current_frame) { - VkCommandBufferBeginInfo cmdbuf_begin; - cmdbuf_begin.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO; - cmdbuf_begin.pNext = nullptr; - cmdbuf_begin.flags = VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT; - cmdbuf_begin.pInheritanceInfo = nullptr; + } else { + context->flush(p_current_frame, p_current_frame); + //re-create the setup command + if (p_current_frame) { + VkCommandBufferBeginInfo cmdbuf_begin; + cmdbuf_begin.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO; + cmdbuf_begin.pNext = nullptr; + cmdbuf_begin.flags = VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT; + cmdbuf_begin.pInheritanceInfo = nullptr; - VkResult err = vkBeginCommandBuffer(frames[frame].draw_command_buffer, &cmdbuf_begin); - ERR_FAIL_COND_MSG(err, "vkBeginCommandBuffer failed with error " + itos(err) + "."); - context->append_command_buffer(frames[frame].draw_command_buffer); + VkResult err = vkBeginCommandBuffer(frames[frame].setup_command_buffer, &cmdbuf_begin); + ERR_FAIL_COND_MSG(err, "vkBeginCommandBuffer failed with error " + itos(err) + "."); + context->set_setup_buffer(frames[frame].setup_command_buffer); //append now so it's added before everything else + } + + if (p_current_frame) { + VkCommandBufferBeginInfo cmdbuf_begin; + cmdbuf_begin.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO; + cmdbuf_begin.pNext = nullptr; + cmdbuf_begin.flags = VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT; + cmdbuf_begin.pInheritanceInfo = nullptr; + + VkResult err = vkBeginCommandBuffer(frames[frame].draw_command_buffer, &cmdbuf_begin); + ERR_FAIL_COND_MSG(err, "vkBeginCommandBuffer failed with error " + itos(err) + "."); + context->append_command_buffer(frames[frame].draw_command_buffer); + } } } -void RenderingDeviceVulkan::initialize(VulkanContext *p_context) { +void RenderingDeviceVulkan::initialize(VulkanContext *p_context, bool p_local_device) { context = p_context; device = p_context->get_device(); - frame_count = p_context->get_swapchain_image_count() + 1; //always need one extra to ensure it's unused at any time, without having to use a fence for this. + if (p_local_device) { + frame_count = 1; + local_device = p_context->local_device_create(); + } else { + frame_count = p_context->get_swapchain_image_count() + 1; //always need one extra to ensure it's unused at any time, without having to use a fence for this. + } limits = p_context->get_device_limits(); max_timestamp_query_elements = 256; @@ -6815,11 +7059,13 @@ void RenderingDeviceVulkan::initialize(VulkanContext *p_context) { VkResult err = vkBeginCommandBuffer(frames[0].setup_command_buffer, &cmdbuf_begin); ERR_FAIL_COND_MSG(err, "vkBeginCommandBuffer failed with error " + itos(err) + "."); - context->set_setup_buffer(frames[0].setup_command_buffer); //append now so it's added before everything else err = vkBeginCommandBuffer(frames[0].draw_command_buffer, &cmdbuf_begin); ERR_FAIL_COND_MSG(err, "vkBeginCommandBuffer failed with error " + itos(err) + "."); - context->append_command_buffer(frames[0].draw_command_buffer); + if (local_device.is_null()) { + context->set_setup_buffer(frames[0].setup_command_buffer); //append now so it's added before everything else + context->append_command_buffer(frames[0].draw_command_buffer); + } } staging_buffer_block_size = GLOBAL_DEF("rendering/vulkan/staging_buffer/block_size_kb", 256); @@ -6928,9 +7174,42 @@ uint64_t RenderingDeviceVulkan::get_captured_timestamps_frame() const { return frames[frame].index; } +static void mult64to128(uint64_t u, uint64_t v, uint64_t &h, uint64_t &l) { + uint64_t u1 = (u & 0xffffffff); + uint64_t v1 = (v & 0xffffffff); + uint64_t t = (u1 * v1); + uint64_t w3 = (t & 0xffffffff); + uint64_t k = (t >> 32); + + u >>= 32; + t = (u * v1) + k; + k = (t & 0xffffffff); + uint64_t w1 = (t >> 32); + + v >>= 32; + t = (u1 * v) + k; + k = (t >> 32); + + h = (u * v) + w1 + k; + l = (t << 32) + w3; +} + uint64_t RenderingDeviceVulkan::get_captured_timestamp_gpu_time(uint32_t p_index) const { ERR_FAIL_UNSIGNED_INDEX_V(p_index, frames[frame].timestamp_result_count, 0); - return frames[frame].timestamp_result_values[p_index] * limits.timestampPeriod; + + // this sucks because timestampPeriod multiplier is a float, while the timestamp is 64 bits nanosecs. + // so, in cases like nvidia which give you enormous numbers and 1 as multiplier, multiplying is next to impossible + // need to do 128 bits fixed point multiplication to get the rigth value + + uint64_t shift_bits = 16; + + uint64_t h, l; + + mult64to128(frames[frame].timestamp_result_values[p_index], uint64_t(double(limits.timestampPeriod) * double(1 << shift_bits)), h, l); + l >>= shift_bits; + l |= h << (64 - shift_bits); + + return l; } uint64_t RenderingDeviceVulkan::get_captured_timestamp_cpu_time(uint32_t p_index) const { ERR_FAIL_UNSIGNED_INDEX_V(p_index, frames[frame].timestamp_result_count, 0); @@ -7048,6 +7327,19 @@ void RenderingDeviceVulkan::finalize() { for (int i = 0; i < staging_buffer_blocks.size(); i++) { vmaDestroyBuffer(allocator, staging_buffer_blocks[i].buffer, staging_buffer_blocks[i].allocation); } + vmaDestroyAllocator(allocator); + + while (vertex_formats.size()) { + Map<VertexFormatID, VertexDescriptionCache>::Element *temp = vertex_formats.front(); + memdelete_arr(temp->get().bindings); + memdelete_arr(temp->get().attributes); + vertex_formats.erase(temp); + } + + for (int i = 0; i < framebuffer_formats.size(); i++) { + vkDestroyRenderPass(device, framebuffer_formats[i].render_pass, nullptr); + } + framebuffer_formats.clear(); //all these should be clear at this point ERR_FAIL_COND(descriptor_pools.size()); @@ -7055,6 +7347,19 @@ void RenderingDeviceVulkan::finalize() { ERR_FAIL_COND(reverse_dependency_map.size()); } +RenderingDevice *RenderingDeviceVulkan::create_local_device() { + RenderingDeviceVulkan *rd = memnew(RenderingDeviceVulkan); + rd->initialize(context, true); + return rd; +} + RenderingDeviceVulkan::RenderingDeviceVulkan() { screen_prepared = false; } + +RenderingDeviceVulkan::~RenderingDeviceVulkan() { + if (local_device.is_valid()) { + finalize(); + context->local_device_free(local_device); + } +} diff --git a/drivers/vulkan/rendering_device_vulkan.h b/drivers/vulkan/rendering_device_vulkan.h index 208109bba3..6432946fbe 100644 --- a/drivers/vulkan/rendering_device_vulkan.h +++ b/drivers/vulkan/rendering_device_vulkan.h @@ -37,8 +37,10 @@ #include "servers/rendering/rendering_device.h" #ifdef DEBUG_ENABLED +#ifndef _DEBUG #define _DEBUG #endif +#endif #include "vk_mem_alloc.h" #include <vulkan/vulkan.h> //todo: @@ -136,6 +138,8 @@ class RenderingDeviceVulkan : public RenderingDevice { uint32_t layers; uint32_t mipmaps; uint32_t usage_flags; + uint32_t base_mipmap; + uint32_t base_layer; Vector<DataFormat> allowed_shared_formats; @@ -207,7 +211,7 @@ class RenderingDeviceVulkan : public RenderingDevice { VkDescriptorBufferInfo buffer_info; //used for binding Buffer() { size = 0; - buffer = nullptr; + buffer = VK_NULL_HANDLE; allocation = nullptr; } }; @@ -328,7 +332,7 @@ class RenderingDeviceVulkan : public RenderingDevice { RID_Owner<Buffer, true> vertex_buffer_owner; struct VertexDescriptionKey { - Vector<VertexDescription> vertex_formats; + Vector<VertexAttribute> vertex_formats; bool operator==(const VertexDescriptionKey &p_key) const { int vdc = vertex_formats.size(); int vdck = p_key.vertex_formats.size(); @@ -336,11 +340,11 @@ class RenderingDeviceVulkan : public RenderingDevice { if (vdc != vdck) { return false; } else { - const VertexDescription *a_ptr = vertex_formats.ptr(); - const VertexDescription *b_ptr = p_key.vertex_formats.ptr(); + const VertexAttribute *a_ptr = vertex_formats.ptr(); + const VertexAttribute *b_ptr = p_key.vertex_formats.ptr(); for (int i = 0; i < vdc; i++) { - const VertexDescription &a = a_ptr[i]; - const VertexDescription &b = b_ptr[i]; + const VertexAttribute &a = a_ptr[i]; + const VertexAttribute &b = b_ptr[i]; if (a.location != b.location) { return false; @@ -365,9 +369,9 @@ class RenderingDeviceVulkan : public RenderingDevice { uint32_t hash() const { int vdc = vertex_formats.size(); uint32_t h = hash_djb2_one_32(vdc); - const VertexDescription *ptr = vertex_formats.ptr(); + const VertexAttribute *ptr = vertex_formats.ptr(); for (int i = 0; i < vdc; i++) { - const VertexDescription &vd = ptr[i]; + const VertexAttribute &vd = ptr[i]; h = hash_djb2_one_32(vd.location, h); h = hash_djb2_one_32(vd.offset, h); h = hash_djb2_one_32(vd.format, h); @@ -389,7 +393,7 @@ class RenderingDeviceVulkan : public RenderingDevice { HashMap<VertexDescriptionKey, VertexFormatID, VertexDescriptionHash> vertex_format_cache; struct VertexDescriptionCache { - Vector<VertexDescription> vertex_formats; + Vector<VertexAttribute> vertex_formats; VkVertexInputBindingDescription *bindings; VkVertexInputAttributeDescription *attributes; VkPipelineVertexInputStateCreateInfo create_info; @@ -948,10 +952,12 @@ class RenderingDeviceVulkan : public RenderingDevice { uint32_t max_timestamp_query_elements; - Frame *frames; //frames available, they are cycled (usually 3) + Frame *frames; //frames available, for main device they are cycled (usually 3), for local devices only 1 int frame; //current frame int frame_count; //total amount of frames uint64_t frames_drawn; + RID local_device; + bool local_device_processing = false; void _free_pending_resources(int p_frame); @@ -967,6 +973,9 @@ class RenderingDeviceVulkan : public RenderingDevice { template <class T> void _free_rids(T &p_owner, const char *p_type); + void _finalize_command_bufers(); + void _begin_frame(); + public: virtual RID texture_create(const TextureFormat &p_format, const TextureView &p_view, const Vector<Vector<uint8_t>> &p_data = Vector<Vector<uint8_t>>()); virtual RID texture_create_shared(const TextureView &p_view, RID p_with_texture); @@ -981,6 +990,7 @@ public: virtual Error texture_copy(RID p_from_texture, RID p_to_texture, const Vector3 &p_from, const Vector3 &p_to, const Vector3 &p_size, uint32_t p_src_mipmap, uint32_t p_dst_mipmap, uint32_t p_src_layer, uint32_t p_dst_layer, bool p_sync_with_draw = false); virtual Error texture_clear(RID p_texture, const Color &p_color, uint32_t p_base_mipmap, uint32_t p_mipmaps, uint32_t p_base_layer, uint32_t p_layers, bool p_sync_with_draw = false); + virtual Error texture_resolve_multisample(RID p_from_texture, RID p_to_texture, bool p_sync_with_draw = false); /*********************/ /**** FRAMEBUFFER ****/ @@ -1006,7 +1016,7 @@ public: virtual RID vertex_buffer_create(uint32_t p_size_bytes, const Vector<uint8_t> &p_data = Vector<uint8_t>()); // Internally reference counted, this ID is warranted to be unique for the same description, but needs to be freed as many times as it was allocated - virtual VertexFormatID vertex_format_create(const Vector<VertexDescription> &p_vertex_formats); + virtual VertexFormatID vertex_format_create(const Vector<VertexAttribute> &p_vertex_formats); virtual RID vertex_array_create(uint32_t p_vertex_count, VertexFormatID p_vertex_format, const Vector<RID> &p_src_buffers); virtual RID index_buffer_create(uint32_t p_size_indices, IndexBufferFormat p_format, const Vector<uint8_t> &p_data = Vector<uint8_t>(), bool p_use_restart_indices = false); @@ -1070,7 +1080,7 @@ public: virtual void draw_list_bind_vertex_array(DrawListID p_list, RID p_vertex_array); virtual void draw_list_bind_index_array(DrawListID p_list, RID p_index_array); virtual void draw_list_set_line_width(DrawListID p_list, float p_width); - virtual void draw_list_set_push_constant(DrawListID p_list, void *p_data, uint32_t p_data_size); + virtual void draw_list_set_push_constant(DrawListID p_list, const void *p_data, uint32_t p_data_size); virtual void draw_list_draw(DrawListID p_list, bool p_use_indices, uint32_t p_instances = 1, uint32_t p_procedural_vertices = 0); @@ -1086,7 +1096,7 @@ public: virtual ComputeListID compute_list_begin(); virtual void compute_list_bind_compute_pipeline(ComputeListID p_list, RID p_compute_pipeline); virtual void compute_list_bind_uniform_set(ComputeListID p_list, RID p_uniform_set, uint32_t p_index); - virtual void compute_list_set_push_constant(ComputeListID p_list, void *p_data, uint32_t p_data_size); + virtual void compute_list_set_push_constant(ComputeListID p_list, const void *p_data, uint32_t p_data_size); virtual void compute_list_add_barrier(ComputeListID p_list); virtual void compute_list_dispatch(ComputeListID p_list, uint32_t p_x_groups, uint32_t p_y_groups, uint32_t p_z_groups); @@ -1116,14 +1126,20 @@ public: virtual int limit_get(Limit p_limit); virtual void prepare_screen_for_drawing(); - void initialize(VulkanContext *p_context); + void initialize(VulkanContext *p_context, bool p_local_device = false); void finalize(); - virtual void swap_buffers(); + virtual void swap_buffers(); //for main device + + virtual void submit(); //for local device + virtual void sync(); //for local device virtual uint32_t get_frame_delay() const; + virtual RenderingDevice *create_local_device(); + RenderingDeviceVulkan(); + ~RenderingDeviceVulkan(); }; #endif // RENDERING_DEVICE_VULKAN_H diff --git a/drivers/vulkan/vulkan_context.cpp b/drivers/vulkan/vulkan_context.cpp index d3666bca52..d293abdee3 100644 --- a/drivers/vulkan/vulkan_context.cpp +++ b/drivers/vulkan/vulkan_context.cpp @@ -165,16 +165,17 @@ VkBool32 VulkanContext::_check_layers(uint32_t check_count, const char **check_n Error VulkanContext::_create_validation_layers() { VkResult err; + const char *instance_validation_layers_alt1[] = { "VK_LAYER_KHRONOS_validation" }; + const char *instance_validation_layers_alt2[] = { "VK_LAYER_LUNARG_standard_validation" }; + const char *instance_validation_layers_alt3[] = { "VK_LAYER_GOOGLE_threading", "VK_LAYER_LUNARG_parameter_validation", "VK_LAYER_LUNARG_object_tracker", "VK_LAYER_LUNARG_core_validation", "VK_LAYER_GOOGLE_unique_objects" }; + uint32_t instance_layer_count = 0; - uint32_t validation_layer_count = 0; - const char *instance_validation_layers_alt1[] = { "VK_LAYER_LUNARG_standard_validation" }; - const char *instance_validation_layers_alt2[] = { "VK_LAYER_GOOGLE_threading", "VK_LAYER_LUNARG_parameter_validation", - "VK_LAYER_LUNARG_object_tracker", "VK_LAYER_LUNARG_core_validation", - "VK_LAYER_GOOGLE_unique_objects" }; - VkBool32 validation_found = 0; err = vkEnumerateInstanceLayerProperties(&instance_layer_count, nullptr); ERR_FAIL_COND_V(err, ERR_CANT_CREATE); - const char **instance_validation_layers = instance_validation_layers_alt1; + + VkBool32 validation_found = 0; + uint32_t validation_layer_count = 0; + const char **instance_validation_layers = nullptr; if (instance_layer_count > 0) { VkLayerProperties *instance_layers = (VkLayerProperties *)malloc(sizeof(VkLayerProperties) * instance_layer_count); err = vkEnumerateInstanceLayerProperties(&instance_layer_count, instance_layers); @@ -183,27 +184,33 @@ Error VulkanContext::_create_validation_layers() { ERR_FAIL_V(ERR_CANT_CREATE); } - validation_found = _check_layers(ARRAY_SIZE(instance_validation_layers_alt1), instance_validation_layers, - instance_layer_count, instance_layers); - if (validation_found) { - enabled_layer_count = ARRAY_SIZE(instance_validation_layers_alt1); - enabled_layers[0] = "VK_LAYER_LUNARG_standard_validation"; - validation_layer_count = 1; - } else { - // use alternative set of validation layers - instance_validation_layers = instance_validation_layers_alt2; - enabled_layer_count = ARRAY_SIZE(instance_validation_layers_alt2); - validation_found = _check_layers(ARRAY_SIZE(instance_validation_layers_alt2), instance_validation_layers, - instance_layer_count, instance_layers); + validation_layer_count = ARRAY_SIZE(instance_validation_layers_alt1); + instance_validation_layers = instance_validation_layers_alt1; + validation_found = _check_layers(validation_layer_count, instance_validation_layers, instance_layer_count, instance_layers); + + // use alternative (deprecated, removed in SDK 1.1.126.0) set of validation layers + if (!validation_found) { validation_layer_count = ARRAY_SIZE(instance_validation_layers_alt2); - for (uint32_t i = 0; i < validation_layer_count; i++) { - enabled_layers[i] = instance_validation_layers[i]; - } + instance_validation_layers = instance_validation_layers_alt2; + validation_found = _check_layers(validation_layer_count, instance_validation_layers, instance_layer_count, instance_layers); } + + // use alternative (deprecated, removed in SDK 1.1.121.1) set of validation layers + if (!validation_found) { + validation_layer_count = ARRAY_SIZE(instance_validation_layers_alt3); + instance_validation_layers = instance_validation_layers_alt3; + validation_found = _check_layers(validation_layer_count, instance_validation_layers, instance_layer_count, instance_layers); + } + free(instance_layers); } - if (!validation_found) { + if (validation_found) { + enabled_layer_count = validation_layer_count; + for (uint32_t i = 0; i < validation_layer_count; i++) { + enabled_layers[i] = instance_validation_layers[i]; + } + } else { return ERR_CANT_CREATE; } @@ -937,7 +944,7 @@ Error VulkanContext::_update_swap_chain(Window *window) { /*compositeAlpha*/ compositeAlpha, /*presentMode*/ swapchainPresentMode, /*clipped*/ true, - /*oldSwapchain*/ nullptr, + /*oldSwapchain*/ VK_NULL_HANDLE, }; err = fpCreateSwapchainKHR(device, &swapchain_ci, nullptr, &window->swapchain); @@ -1499,8 +1506,100 @@ VulkanContext::VulkanContext() { swapchainImageCount = 0; } +RID VulkanContext::local_device_create() { + LocalDevice ld; + + { //create device + VkResult err; + float queue_priorities[1] = { 0.0 }; + VkDeviceQueueCreateInfo queues[2]; + queues[0].sType = VK_STRUCTURE_TYPE_DEVICE_QUEUE_CREATE_INFO; + queues[0].pNext = nullptr; + queues[0].queueFamilyIndex = graphics_queue_family_index; + queues[0].queueCount = 1; + queues[0].pQueuePriorities = queue_priorities; + queues[0].flags = 0; + + VkDeviceCreateInfo sdevice = { + /*sType =*/VK_STRUCTURE_TYPE_DEVICE_CREATE_INFO, + /*pNext */ nullptr, + /*flags */ 0, + /*queueCreateInfoCount */ 1, + /*pQueueCreateInfos */ queues, + /*enabledLayerCount */ 0, + /*ppEnabledLayerNames */ nullptr, + /*enabledExtensionCount */ enabled_extension_count, + /*ppEnabledExtensionNames */ (const char *const *)extension_names, + /*pEnabledFeatures */ &physical_device_features, // If specific features are required, pass them in here + }; + err = vkCreateDevice(gpu, &sdevice, nullptr, &ld.device); + ERR_FAIL_COND_V(err, RID()); + } + + { //create graphics queue + + vkGetDeviceQueue(ld.device, graphics_queue_family_index, 0, &ld.queue); + } + + return local_device_owner.make_rid(ld); +} + +VkDevice VulkanContext::local_device_get_vk_device(RID p_local_device) { + LocalDevice *ld = local_device_owner.getornull(p_local_device); + return ld->device; +} + +void VulkanContext::local_device_push_command_buffers(RID p_local_device, const VkCommandBuffer *p_buffers, int p_count) { + + LocalDevice *ld = local_device_owner.getornull(p_local_device); + ERR_FAIL_COND(ld->waiting); + + VkSubmitInfo submit_info; + submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO; + submit_info.pNext = nullptr; + submit_info.pWaitDstStageMask = nullptr; + submit_info.waitSemaphoreCount = 0; + submit_info.pWaitSemaphores = nullptr; + submit_info.commandBufferCount = p_count; + submit_info.pCommandBuffers = p_buffers; + submit_info.signalSemaphoreCount = 0; + submit_info.pSignalSemaphores = nullptr; + + VkResult err = vkQueueSubmit(ld->queue, 1, &submit_info, VK_NULL_HANDLE); + ERR_FAIL_COND(err); + + ld->waiting = true; +} + +void VulkanContext::local_device_sync(RID p_local_device) { + + LocalDevice *ld = local_device_owner.getornull(p_local_device); + ERR_FAIL_COND(!ld->waiting); + + vkDeviceWaitIdle(ld->device); + ld->waiting = false; +} + +void VulkanContext::local_device_free(RID p_local_device) { + + LocalDevice *ld = local_device_owner.getornull(p_local_device); + vkDestroyDevice(ld->device, nullptr); + local_device_owner.free(p_local_device); +} + VulkanContext::~VulkanContext() { if (queue_props) { free(queue_props); } + for (uint32_t i = 0; i < FRAME_LAG; i++) { + vkDestroyFence(device, fences[i], nullptr); + vkDestroySemaphore(device, image_acquired_semaphores[i], nullptr); + vkDestroySemaphore(device, draw_complete_semaphores[i], nullptr); + if (separate_present_queue) { + vkDestroySemaphore(device, image_ownership_semaphores[i], nullptr); + } + } + DestroyDebugUtilsMessengerEXT(inst, dbg_messenger, nullptr); + vkDestroyDevice(device, nullptr); + vkDestroyInstance(inst, nullptr); } diff --git a/drivers/vulkan/vulkan_context.h b/drivers/vulkan/vulkan_context.h index 2f10fbfdef..51c3febb47 100644 --- a/drivers/vulkan/vulkan_context.h +++ b/drivers/vulkan/vulkan_context.h @@ -33,6 +33,8 @@ #include "core/error_list.h" #include "core/map.h" +#include "core/os/mutex.h" +#include "core/rid_owner.h" #include "core/ustring.h" #include "servers/display_server.h" #include <vulkan/vulkan.h> @@ -45,8 +47,6 @@ class VulkanContext { FRAME_LAG = 2 }; - bool use_validation_layers; - VkInstance inst; VkSurfaceKHR surface; VkPhysicalDevice gpu; @@ -107,6 +107,14 @@ class VulkanContext { } }; + struct LocalDevice { + bool waiting = false; + VkDevice device; + VkQueue queue; + }; + + RID_Owner<LocalDevice, true> local_device_owner; + Map<DisplayServer::WindowID, Window> windows; uint32_t swapchainImageCount; @@ -181,6 +189,8 @@ protected: bool buffers_prepared; + bool use_validation_layers; + public: VkDevice get_device(); VkPhysicalDevice get_physical_device(); @@ -194,6 +204,12 @@ public: VkFramebuffer window_get_framebuffer(DisplayServer::WindowID p_window = 0); VkRenderPass window_get_render_pass(DisplayServer::WindowID p_window = 0); + RID local_device_create(); + VkDevice local_device_get_vk_device(RID p_local_device); + void local_device_push_command_buffers(RID p_local_device, const VkCommandBuffer *p_buffers, int p_count); + void local_device_sync(RID p_local_device); + void local_device_free(RID p_local_device); + VkFormat get_screen_format() const; VkPhysicalDeviceLimits get_device_limits() const; 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.cpp b/editor/animation_track_editor.cpp index b393ff5fd4..09f55bea0c 100644 --- a/editor/animation_track_editor.cpp +++ b/editor/animation_track_editor.cpp @@ -31,7 +31,7 @@ #include "animation_track_editor.h" #include "animation_track_editor_plugins.h" -#include "core/input/input_filter.h" +#include "core/input/input.h" #include "core/os/keyboard.h" #include "editor/animation_bezier_editor.h" #include "editor/plugins/animation_player_editor_plugin.h" @@ -754,14 +754,17 @@ public: for (Map<int, List<float>>::Element *E = key_ofs_map.front(); E; E = E->next()) { + int key = 0; for (List<float>::Element *F = E->value().front(); F; F = F->next()) { float key_ofs = F->get(); - if (from != key_ofs) + if (from != key_ofs) { + key++; continue; + } int track = E->key(); - key_ofs_map[track][key_ofs] = to; + key_ofs_map[track][key] = to; if (setting) return; @@ -1402,7 +1405,7 @@ void AnimationTimelineEdit::_zoom_changed(double) { float AnimationTimelineEdit::get_zoom_scale() const { - float zv = zoom->get_value(); + float zv = zoom->get_max() - zoom->get_value(); if (zv < 1) { zv = 1.0 - zv; return Math::pow(1.0f + zv, 8.0f) * 100; @@ -4100,7 +4103,7 @@ bool AnimationTrackEditor::is_selection_active() const { } bool AnimationTrackEditor::is_snap_enabled() const { - return snap->is_pressed() ^ InputFilter::get_singleton()->is_key_pressed(KEY_CONTROL); + return snap->is_pressed() ^ Input::get_singleton()->is_key_pressed(KEY_CONTROL); } void AnimationTrackEditor::_update_tracks() { 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/code_editor.cpp b/editor/code_editor.cpp index 157a9cdca7..987d5649b1 100644 --- a/editor/code_editor.cpp +++ b/editor/code_editor.cpp @@ -30,7 +30,7 @@ #include "code_editor.h" -#include "core/input/input_filter.h" +#include "core/input/input.h" #include "core/os/keyboard.h" #include "core/string_builder.h" #include "editor/editor_scale.h" @@ -226,6 +226,10 @@ void FindReplaceBar::_replace_all() { text_edit->begin_complex_operation(); + if (selection_enabled && is_selection_only()) { + text_edit->cursor_set_line(selection_begin.width); + text_edit->cursor_set_column(selection_begin.height); + } if (search_current()) { do { // replace area @@ -243,7 +247,7 @@ void FindReplaceBar::_replace_all() { if (selection_enabled && is_selection_only()) { if (match_from < selection_begin || match_to > selection_end) { - continue; + break; // Done. } // Replace but adjust selection bounds. @@ -289,6 +293,10 @@ void FindReplaceBar::_get_search_from(int &r_line, int &r_col) { r_line = text_edit->cursor_get_line(); r_col = text_edit->cursor_get_column(); + if (text_edit->is_selection_active() && is_selection_only()) { + return; + } + if (r_line == result_line && r_col >= result_col && r_col <= result_col + get_search_text().length()) { r_col = result_col; } @@ -505,7 +513,7 @@ void FindReplaceBar::_search_text_changed(const String &p_text) { void FindReplaceBar::_search_text_entered(const String &p_text) { - if (InputFilter::get_singleton()->is_key_pressed(KEY_SHIFT)) { + if (Input::get_singleton()->is_key_pressed(KEY_SHIFT)) { search_prev(); } else { search_next(); @@ -517,7 +525,7 @@ void FindReplaceBar::_replace_text_entered(const String &p_text) { if (selection_only->is_pressed() && text_edit->is_selection_active()) { _replace_all(); _hide_bar(); - } else if (InputFilter::get_singleton()->is_key_pressed(KEY_SHIFT)) { + } else if (Input::get_singleton()->is_key_pressed(KEY_SHIFT)) { _replace(); search_prev(); } else { 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 1971abadc4..81a7d85b18 100644 --- a/editor/debugger/script_editor_debugger.cpp +++ b/editor/debugger/script_editor_debugger.cpp @@ -149,39 +149,74 @@ void ScriptEditorDebugger::save_node(ObjectID p_id, const String &p_file) { } void ScriptEditorDebugger::_file_selected(const String &p_file) { - Error err; - FileAccessRef file = FileAccess::open(p_file, FileAccess::WRITE, &err); - if (err != OK) { - ERR_PRINT("Failed to open " + p_file); - return; - } - Vector<String> line; - line.resize(Performance::MONITOR_MAX); + switch (file_dialog_purpose) { + case SAVE_MONITORS_CSV: { + Error err; + FileAccessRef file = FileAccess::open(p_file, FileAccess::WRITE, &err); - // signatures - for (int i = 0; i < Performance::MONITOR_MAX; i++) { - line.write[i] = Performance::get_singleton()->get_monitor_name(Performance::Monitor(i)); - } - file->store_csv_line(line); + if (err != OK) { + ERR_PRINT("Failed to open " + p_file); + return; + } + Vector<String> line; + line.resize(Performance::MONITOR_MAX); - // values - List<Vector<float>>::Element *E = perf_history.back(); - while (E) { + // signatures + for (int i = 0; i < Performance::MONITOR_MAX; i++) { + line.write[i] = Performance::get_singleton()->get_monitor_name(Performance::Monitor(i)); + } + file->store_csv_line(line); - Vector<float> &perf_data = E->get(); - for (int i = 0; i < perf_data.size(); i++) { + // values + List<Vector<float>>::Element *E = perf_history.back(); + while (E) { - line.write[i] = String::num_real(perf_data[i]); - } - file->store_csv_line(line); - E = E->prev(); - } - file->store_string("\n"); + Vector<float> &perf_data = E->get(); + for (int i = 0; i < perf_data.size(); i++) { + + line.write[i] = String::num_real(perf_data[i]); + } + file->store_csv_line(line); + E = E->prev(); + } + file->store_string("\n"); + + Vector<Vector<String>> profiler_data = profiler->get_data_as_csv(); + for (int i = 0; i < profiler_data.size(); i++) { + file->store_csv_line(profiler_data[i]); + } + } break; + case SAVE_VRAM_CSV: { + Error err; + FileAccessRef file = FileAccess::open(p_file, FileAccess::WRITE, &err); - Vector<Vector<String>> profiler_data = profiler->get_data_as_csv(); - for (int i = 0; i < profiler_data.size(); i++) { - file->store_csv_line(profiler_data[i]); + if (err != OK) { + ERR_PRINT("Failed to open " + p_file); + return; + } + + Vector<String> headers; + headers.resize(vmem_tree->get_columns()); + for (int i = 0; i < vmem_tree->get_columns(); ++i) { + headers.write[i] = vmem_tree->get_column_title(i); + } + file->store_csv_line(headers); + + if (vmem_tree->get_root()) { + TreeItem *ti = vmem_tree->get_root()->get_children(); + while (ti) { + Vector<String> values; + values.resize(vmem_tree->get_columns()); + for (int i = 0; i < vmem_tree->get_columns(); ++i) { + values.write[i] = ti->get_text(i); + } + file->store_csv_line(values); + + ti = ti->get_next(); + } + } + } break; } } @@ -233,6 +268,15 @@ void ScriptEditorDebugger::_video_mem_request() { _put_msg("core:memory", Array()); } +void ScriptEditorDebugger::_video_mem_export() { + + file_dialog->set_file_mode(EditorFileDialog::FILE_MODE_SAVE_FILE); + file_dialog->set_access(EditorFileDialog::ACCESS_FILESYSTEM); + file_dialog->clear_filters(); + file_dialog_purpose = SAVE_VRAM_CSV; + file_dialog->popup_centered_ratio(); +} + Size2 ScriptEditorDebugger::get_minimum_size() const { Size2 ms = MarginContainer::get_minimum_size(); @@ -766,6 +810,7 @@ void ScriptEditorDebugger::_notification(int p_what) { error_tree->connect("item_selected", callable_mp(this, &ScriptEditorDebugger::_error_selected)); error_tree->connect("item_activated", callable_mp(this, &ScriptEditorDebugger::_error_activated)); vmem_refresh->set_icon(get_theme_icon("Reload", "EditorIcons")); + vmem_export->set_icon(get_theme_icon("Save", "EditorIcons")); reason->add_theme_color_override("font_color", get_theme_color("error_color", "Editor")); @@ -840,6 +885,7 @@ void ScriptEditorDebugger::_notification(int p_what) { dobreak->set_icon(get_theme_icon("Pause", "EditorIcons")); docontinue->set_icon(get_theme_icon("DebugContinue", "EditorIcons")); vmem_refresh->set_icon(get_theme_icon("Reload", "EditorIcons")); + vmem_export->set_icon(get_theme_icon("Save", "EditorIcons")); } break; } } @@ -981,6 +1027,7 @@ void ScriptEditorDebugger::_export_csv() { file_dialog->set_file_mode(EditorFileDialog::FILE_MODE_SAVE_FILE); file_dialog->set_access(EditorFileDialog::ACCESS_FILESYSTEM); + file_dialog_purpose = SAVE_MONITORS_CSV; file_dialog->popup_centered_ratio(); } @@ -1701,8 +1748,12 @@ ScriptEditorDebugger::ScriptEditorDebugger(EditorNode *p_editor) { vmem_hb->add_child(vmem_total); vmem_refresh = memnew(ToolButton); vmem_hb->add_child(vmem_refresh); + vmem_export = memnew(ToolButton); + vmem_export->set_tooltip(TTR("Export list to a CSV file")); + vmem_hb->add_child(vmem_export); vmem_vb->add_child(vmem_hb); vmem_refresh->connect("pressed", callable_mp(this, &ScriptEditorDebugger::_video_mem_request)); + vmem_export->connect("pressed", callable_mp(this, &ScriptEditorDebugger::_video_mem_export)); VBoxContainer *vmmc = memnew(VBoxContainer); vmem_tree = memnew(Tree); diff --git a/editor/debugger/script_editor_debugger.h b/editor/debugger/script_editor_debugger.h index 9cb7dc2edf..a08a7c67c2 100644 --- a/editor/debugger/script_editor_debugger.h +++ b/editor/debugger/script_editor_debugger.h @@ -88,6 +88,11 @@ private: PopupMenu *item_menu; EditorFileDialog *file_dialog; + enum FileDialogPurpose { + SAVE_MONITORS_CSV, + SAVE_VRAM_CSV, + }; + FileDialogPurpose file_dialog_purpose; int error_count; int warning_count; @@ -121,6 +126,7 @@ private: Tree *vmem_tree; Button *vmem_refresh; + Button *vmem_export; LineEdit *vmem_total; Tree *stack_dump; @@ -160,6 +166,7 @@ private: void _remote_object_property_updated(ObjectID p_id, const String &p_property); void _video_mem_request(); + void _video_mem_export(); int _get_node_path_cache(const NodePath &p_path); diff --git a/editor/doc_data.cpp b/editor/doc_data.cpp index 096be1fe4b..310e78ee60 100644 --- a/editor/doc_data.cpp +++ b/editor/doc_data.cpp @@ -40,6 +40,9 @@ #include "core/version.h" #include "scene/resources/theme.h" +// Used for a hack preserving Mono properties on non-Mono builds. +#include "modules/modules_enabled.gen.h" + void DocData::merge_from(const DocData &p_data) { for (Map<String, ClassDoc>::Element *E = class_list.front(); E; E = E->next()) { @@ -154,6 +157,23 @@ void DocData::merge_from(const DocData &p_data) { break; } } + +#ifndef MODULE_MONO_ENABLED + // The Mono module defines some properties that we want to keep when + // re-generating docs with a non-Mono build, to prevent pointless diffs + // (and loss of descriptions) depending on the config of the doc writer. + // We use a horrible hack to force keeping the relevant properties, + // hardcoded below. At least it's an ad hoc hack... ¯\_(ツ)_/¯ + // Don't show this to your kids. + if (c.name == "@GlobalScope") { + // Retrieve GodotSharp singleton. + for (int j = 0; j < cf.properties.size(); j++) { + if (cf.properties[j].name == "GodotSharp") { + c.properties.push_back(cf.properties[j]); + } + } + } +#endif } } @@ -173,6 +193,8 @@ static void return_doc_from_retinfo(DocData::MethodDoc &p_method, const Property p_method.return_type = "int"; } else if (p_retinfo.class_name != StringName()) { p_method.return_type = p_retinfo.class_name; + } else if (p_retinfo.type == Variant::ARRAY && p_retinfo.hint == PROPERTY_HINT_ARRAY_TYPE) { + p_method.return_type = p_retinfo.hint_string + "[]"; } else if (p_retinfo.hint == PROPERTY_HINT_RESOURCE_TYPE) { p_method.return_type = p_retinfo.hint_string; } else if (p_retinfo.type == Variant::NIL && p_retinfo.usage & PROPERTY_USAGE_NIL_IS_VARIANT) { @@ -195,6 +217,8 @@ static void argument_doc_from_arginfo(DocData::ArgumentDoc &p_argument, const Pr p_argument.type = "int"; } else if (p_arginfo.class_name != StringName()) { p_argument.type = p_arginfo.class_name; + } else if (p_arginfo.type == Variant::ARRAY && p_arginfo.hint == PROPERTY_HINT_ARRAY_TYPE) { + p_argument.type = p_arginfo.hint_string + "[]"; } else if (p_arginfo.hint == PROPERTY_HINT_RESOURCE_TYPE) { p_argument.type = p_arginfo.hint_string; } else if (p_arginfo.type == Variant::NIL) { @@ -243,6 +267,12 @@ void DocData::generate(bool p_basic_types) { Set<StringName> setters_getters; String name = classes.front()->get(); + if (!ClassDB::is_class_exposed(name)) { + print_verbose(vformat("Class '%s' is not exposed, skipping.", name)); + classes.pop_front(); + continue; + } + String cname = name; if (cname.begins_with("_")) //proxy class cname = cname.substr(1, name.length()); @@ -271,7 +301,7 @@ void DocData::generate(bool p_basic_types) { EO = EO->next(); } - if (E->get().usage & PROPERTY_USAGE_GROUP || E->get().usage & PROPERTY_USAGE_CATEGORY || E->get().usage & PROPERTY_USAGE_INTERNAL) + if (E->get().usage & PROPERTY_USAGE_GROUP || E->get().usage & PROPERTY_USAGE_SUBGROUP || E->get().usage & PROPERTY_USAGE_CATEGORY || E->get().usage & PROPERTY_USAGE_INTERNAL) continue; PropertyDoc prop; @@ -328,6 +358,8 @@ void DocData::generate(bool p_basic_types) { prop.type = "int"; } else if (retinfo.class_name != StringName()) { prop.type = retinfo.class_name; + } else if (retinfo.type == Variant::ARRAY && retinfo.hint == PROPERTY_HINT_ARRAY_TYPE) { + prop.type = retinfo.hint_string + "[]"; } else if (retinfo.hint == PROPERTY_HINT_RESOURCE_TYPE) { prop.type = retinfo.hint_string; diff --git a/editor/editor_audio_buses.cpp b/editor/editor_audio_buses.cpp index 7e499facd5..c80ae5f21b 100644 --- a/editor/editor_audio_buses.cpp +++ b/editor/editor_audio_buses.cpp @@ -30,7 +30,7 @@ #include "editor_audio_buses.h" -#include "core/input/input_filter.h" +#include "core/input/input.h" #include "core/io/resource_saver.h" #include "core/os/keyboard.h" #include "editor_node.h" @@ -325,7 +325,7 @@ void EditorAudioBus::_volume_changed(float p_normalized) { const float p_db = this->_normalized_volume_to_scaled_db(p_normalized); - if (InputFilter::get_singleton()->is_key_pressed(KEY_CONTROL)) { + if (Input::get_singleton()->is_key_pressed(KEY_CONTROL)) { // Snap the value when holding Ctrl for easier editing. // To do so, it needs to be converted back to normalized volume (as the slider uses that unit). slider->set_value(_scaled_db_to_normalized_volume(Math::round(p_db))); @@ -386,7 +386,7 @@ float EditorAudioBus::_scaled_db_to_normalized_volume(float db) { void EditorAudioBus::_show_value(float slider_value) { float db; - if (InputFilter::get_singleton()->is_key_pressed(KEY_CONTROL)) { + if (Input::get_singleton()->is_key_pressed(KEY_CONTROL)) { // Display the correct (snapped) value when holding Ctrl db = Math::round(_normalized_volume_to_scaled_db(slider_value)); } else { diff --git a/editor/editor_autoload_settings.cpp b/editor/editor_autoload_settings.cpp index ed628ff620..6917b2b775 100644 --- a/editor/editor_autoload_settings.cpp +++ b/editor/editor_autoload_settings.cpp @@ -48,8 +48,6 @@ void EditorAutoloadSettings::_notification(int p_what) { ResourceLoader::get_recognized_extensions_for_type("Script", &afn); ResourceLoader::get_recognized_extensions_for_type("PackedScene", &afn); - EditorFileDialog *file_dialog = autoload_add_path->get_file_dialog(); - for (List<String>::Element *E = afn.front(); E; E = E->next()) { file_dialog->add_filter("*." + E->get()); @@ -61,6 +59,9 @@ void EditorAutoloadSettings::_notification(int p_what) { get_tree()->get_root()->call_deferred("add_child", info.node); } } + browse_button->set_icon(get_theme_icon("Folder", "EditorIcons")); + } else if (p_what == NOTIFICATION_THEME_CHANGED) { + browse_button->set_icon(get_theme_icon("Folder", "EditorIcons")); } } @@ -116,8 +117,8 @@ bool EditorAutoloadSettings::_autoload_name_is_valid(const String &p_name, Strin void EditorAutoloadSettings::_autoload_add() { - if (autoload_add(autoload_add_name->get_text(), autoload_add_path->get_line_edit()->get_text())) - autoload_add_path->get_line_edit()->set_text(""); + if (autoload_add(autoload_add_name->get_text(), autoload_add_path->get_text())) + autoload_add_path->set_text(""); autoload_add_name->set_text(""); add_autoload->set_disabled(true); @@ -326,7 +327,7 @@ void EditorAutoloadSettings::_autoload_file_callback(const String &p_path) { void EditorAutoloadSettings::_autoload_text_entered(const String p_name) { - if (autoload_add_path->get_line_edit()->get_text() != "" && _autoload_name_is_valid(p_name, nullptr)) { + if (autoload_add_path->get_text() != "" && _autoload_name_is_valid(p_name, nullptr)) { _autoload_add(); } } @@ -340,7 +341,7 @@ void EditorAutoloadSettings::_autoload_path_text_changed(const String p_path) { void EditorAutoloadSettings::_autoload_text_changed(const String p_name) { add_autoload->set_disabled( - autoload_add_path->get_line_edit()->get_text() == "" || !_autoload_name_is_valid(p_name, nullptr)); + autoload_add_path->get_text() == "" || !_autoload_name_is_valid(p_name, nullptr)); } Node *EditorAutoloadSettings::_create_autoload(const String &p_path) { @@ -823,13 +824,24 @@ EditorAutoloadSettings::EditorAutoloadSettings() { l->set_text(TTR("Path:")); hbc->add_child(l); - autoload_add_path = memnew(EditorLineEditFileChooser); - autoload_add_path->set_h_size_flags(SIZE_EXPAND_FILL); - autoload_add_path->get_file_dialog()->set_file_mode(EditorFileDialog::FILE_MODE_OPEN_FILE); - autoload_add_path->get_file_dialog()->connect("file_selected", callable_mp(this, &EditorAutoloadSettings::_autoload_file_callback)); - autoload_add_path->get_line_edit()->connect("text_changed", callable_mp(this, &EditorAutoloadSettings::_autoload_path_text_changed)); - + autoload_add_path = memnew(LineEdit); hbc->add_child(autoload_add_path); + autoload_add_path->set_h_size_flags(Control::SIZE_EXPAND_FILL); + autoload_add_path->connect("text_changed", callable_mp(this, &EditorAutoloadSettings::_autoload_path_text_changed)); + + browse_button = memnew(Button); + hbc->add_child(browse_button); + browse_button->connect("pressed", callable_mp(this, &EditorAutoloadSettings::_browse_autoload_add_path)); + + file_dialog = memnew(EditorFileDialog); + hbc->add_child(file_dialog); + file_dialog->connect("file_selected", callable_mp(this, &EditorAutoloadSettings::_set_autoload_add_path)); + file_dialog->connect("dir_selected", callable_mp(this, &EditorAutoloadSettings::_set_autoload_add_path)); + file_dialog->connect("files_selected", callable_mp(this, &EditorAutoloadSettings::_set_autoload_add_path)); + + hbc->set_h_size_flags(SIZE_EXPAND_FILL); + file_dialog->set_file_mode(EditorFileDialog::FILE_MODE_OPEN_FILE); + file_dialog->connect("file_selected", callable_mp(this, &EditorAutoloadSettings::_autoload_file_callback)); l = memnew(Label); l->set_text(TTR("Node Name:")); @@ -890,3 +902,14 @@ EditorAutoloadSettings::~EditorAutoloadSettings() { } } } + +void EditorAutoloadSettings::_set_autoload_add_path(const String &p_text) { + + autoload_add_path->set_text(p_text); + autoload_add_path->emit_signal("text_entered", p_text); +} + +void EditorAutoloadSettings::_browse_autoload_add_path() { + + file_dialog->popup_centered_ratio(); +}
\ No newline at end of file diff --git a/editor/editor_autoload_settings.h b/editor/editor_autoload_settings.h index 2716442ec9..94a581401c 100644 --- a/editor/editor_autoload_settings.h +++ b/editor/editor_autoload_settings.h @@ -74,9 +74,11 @@ class EditorAutoloadSettings : public VBoxContainer { String selected_autoload; Tree *tree; - EditorLineEditFileChooser *autoload_add_path; LineEdit *autoload_add_name; Button *add_autoload; + LineEdit *autoload_add_path; + Button *browse_button; + EditorFileDialog *file_dialog; bool _autoload_name_is_valid(const String &p_name, String *r_error = nullptr); @@ -96,6 +98,9 @@ class EditorAutoloadSettings : public VBoxContainer { bool can_drop_data_fw(const Point2 &p_point, const Variant &p_data, Control *p_control) const; void drop_data_fw(const Point2 &p_point, const Variant &p_data, Control *p_control); + void _set_autoload_add_path(const String &p_text); + void _browse_autoload_add_path(); + protected: void _notification(int p_what); static void _bind_methods(); diff --git a/editor/editor_data.cpp b/editor/editor_data.cpp index 942b4a8ee6..9c739474d1 100644 --- a/editor/editor_data.cpp +++ b/editor/editor_data.cpp @@ -1066,9 +1066,9 @@ Array EditorSelection::_get_transformable_selected_nodes() { return ret; } -Array EditorSelection::get_selected_nodes() { +TypedArray<Node> EditorSelection::get_selected_nodes() { - Array ret; + TypedArray<Node> ret; for (Map<Node *, Object *>::Element *E = selection.front(); E; E = E->next()) { diff --git a/editor/editor_data.h b/editor/editor_data.h index 4f5d68bfed..e4f4c67c8e 100644 --- a/editor/editor_data.h +++ b/editor/editor_data.h @@ -257,7 +257,7 @@ protected: static void _bind_methods(); public: - Array get_selected_nodes(); + TypedArray<Node> get_selected_nodes(); void add_node(Node *p_node); void remove_node(Node *p_node); bool is_selected(Node *) const; diff --git a/editor/editor_file_dialog.cpp b/editor/editor_file_dialog.cpp index 71ade56e39..6a06c6657e 100644 --- a/editor/editor_file_dialog.cpp +++ b/editor/editor_file_dialog.cpp @@ -1579,6 +1579,7 @@ EditorFileDialog::EditorFileDialog() { drives = memnew(OptionButton); drives->connect("item_selected", callable_mp(this, &EditorFileDialog::_select_drive)); + pathhb->add_child(drives); makedir = memnew(Button); makedir->set_text(TTR("Create Folder")); @@ -1733,42 +1734,3 @@ EditorFileDialog::~EditorFileDialog() { unregister_func(this); memdelete(dir_access); } - -void EditorLineEditFileChooser::_notification(int p_what) { - - if (p_what == NOTIFICATION_ENTER_TREE || p_what == NOTIFICATION_THEME_CHANGED) - button->set_icon(get_theme_icon("Folder", "EditorIcons")); -} - -void EditorLineEditFileChooser::_bind_methods() { - - ClassDB::bind_method(D_METHOD("get_button"), &EditorLineEditFileChooser::get_button); - ClassDB::bind_method(D_METHOD("get_line_edit"), &EditorLineEditFileChooser::get_line_edit); - ClassDB::bind_method(D_METHOD("get_file_dialog"), &EditorLineEditFileChooser::get_file_dialog); -} - -void EditorLineEditFileChooser::_chosen(const String &p_text) { - - line_edit->set_text(p_text); - line_edit->emit_signal("text_entered", p_text); -} - -void EditorLineEditFileChooser::_browse() { - - dialog->popup_centered_ratio(); -} - -EditorLineEditFileChooser::EditorLineEditFileChooser() { - - line_edit = memnew(LineEdit); - add_child(line_edit); - line_edit->set_h_size_flags(Control::SIZE_EXPAND_FILL); - button = memnew(Button); - add_child(button); - button->connect("pressed", callable_mp(this, &EditorLineEditFileChooser::_browse)); - dialog = memnew(EditorFileDialog); - add_child(dialog); - dialog->connect("file_selected", callable_mp(this, &EditorLineEditFileChooser::_chosen)); - dialog->connect("dir_selected", callable_mp(this, &EditorLineEditFileChooser::_chosen)); - dialog->connect("files_selected", callable_mp(this, &EditorLineEditFileChooser::_chosen)); -} diff --git a/editor/editor_file_dialog.h b/editor/editor_file_dialog.h index ed23f14ebe..8efb8f5368 100644 --- a/editor/editor_file_dialog.h +++ b/editor/editor_file_dialog.h @@ -245,28 +245,6 @@ public: ~EditorFileDialog(); }; -class EditorLineEditFileChooser : public HBoxContainer { - - GDCLASS(EditorLineEditFileChooser, HBoxContainer); - Button *button; - LineEdit *line_edit; - EditorFileDialog *dialog; - - void _chosen(const String &p_text); - void _browse(); - -protected: - void _notification(int p_what); - static void _bind_methods(); - -public: - Button *get_button() { return button; } - LineEdit *get_line_edit() { return line_edit; } - EditorFileDialog *get_file_dialog() { return dialog; } - - EditorLineEditFileChooser(); -}; - VARIANT_ENUM_CAST(EditorFileDialog::FileMode); VARIANT_ENUM_CAST(EditorFileDialog::Access); VARIANT_ENUM_CAST(EditorFileDialog::DisplayMode); diff --git a/editor/editor_fonts.cpp b/editor/editor_fonts.cpp index 8aadf02ea6..cf00c536a7 100644 --- a/editor/editor_fonts.cpp +++ b/editor/editor_fonts.cpp @@ -247,10 +247,12 @@ void editor_register_fonts(Ref<Theme> p_theme) { MAKE_BOLD_FONT(df_doc_bold, int(EDITOR_GET("text_editor/help/help_font_size")) * EDSCALE); MAKE_BOLD_FONT(df_doc_title, int(EDITOR_GET("text_editor/help/help_title_font_size")) * EDSCALE); MAKE_SOURCE_FONT(df_doc_code, int(EDITOR_GET("text_editor/help/help_source_font_size")) * EDSCALE); + MAKE_SOURCE_FONT(df_doc_kbd, (int(EDITOR_GET("text_editor/help/help_source_font_size")) - 1) * EDSCALE); p_theme->set_font("doc", "EditorFonts", df_doc); p_theme->set_font("doc_bold", "EditorFonts", df_doc_bold); p_theme->set_font("doc_title", "EditorFonts", df_doc_title); p_theme->set_font("doc_source", "EditorFonts", df_doc_code); + p_theme->set_font("doc_keyboard", "EditorFonts", df_doc_kbd); // Ruler font MAKE_DEFAULT_FONT(df_rulers, 8 * EDSCALE); diff --git a/editor/editor_help.cpp b/editor/editor_help.cpp index a36e2f360e..8089d463bd 100644 --- a/editor/editor_help.cpp +++ b/editor/editor_help.cpp @@ -30,7 +30,7 @@ #include "editor_help.h" -#include "core/input/input_filter.h" +#include "core/input/input.h" #include "core/os/keyboard.h" #include "doc_data_compressed.gen.h" #include "editor/plugins/script_editor_plugin.h" @@ -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,9 +196,14 @@ 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) { + if (t.ends_with("[]")) { + add_array = true; + t = t.replace("[]", ""); + } if (p_enum.empty()) { class_desc->push_meta("#" + t); //class } else { @@ -206,8 +211,15 @@ void EditorHelp::_add_type(const String &p_type, const String &p_enum) { } } class_desc->add_text(t); - if (can_ref) + if (can_ref) { class_desc->pop(); + if (add_array) { + class_desc->add_text(" "); + class_desc->push_meta("#Array"); //class + class_desc->add_text("[]"); + class_desc->pop(); + } + } class_desc->pop(); } @@ -1210,11 +1222,14 @@ static void _add_text_to_rt(const String &p_bbcode, RichTextLabel *p_rt) { Ref<Font> doc_font = p_rt->get_theme_font("doc", "EditorFonts"); Ref<Font> doc_bold_font = p_rt->get_theme_font("doc_bold", "EditorFonts"); Ref<Font> doc_code_font = p_rt->get_theme_font("doc_source", "EditorFonts"); + Ref<Font> doc_kbd_font = p_rt->get_theme_font("doc_keyboard", "EditorFonts"); Color font_color_hl = p_rt->get_theme_color("headline_color", "EditorHelp"); Color accent_color = p_rt->get_theme_color("accent_color", "Editor"); - Color link_color = accent_color.linear_interpolate(font_color_hl, 0.8); - Color code_color = accent_color.linear_interpolate(font_color_hl, 0.6); + Color property_color = p_rt->get_theme_color("property_color", "Editor"); + Color link_color = accent_color.lerp(font_color_hl, 0.8); + Color code_color = accent_color.lerp(font_color_hl, 0.6); + Color kbd_color = accent_color.lerp(property_color, 0.6); String bbcode = p_bbcode.dedent().replace("\t", "").replace("\r", "").strip_edges(); @@ -1325,6 +1340,14 @@ static void _add_text_to_rt(const String &p_bbcode, RichTextLabel *p_rt) { code_tag = true; pos = brk_end + 1; tag_stack.push_front(tag); + } else if (tag == "kbd") { + + //use keyboard font with custom color + p_rt->push_font(doc_kbd_font); + p_rt->push_color(kbd_color); + code_tag = true; // though not strictly a code tag, logic is similar + pos = brk_end + 1; + tag_stack.push_front(tag); } else if (tag == "center") { //align to center @@ -1832,7 +1855,7 @@ void FindBar::_search_text_changed(const String &p_text) { void FindBar::_search_text_entered(const String &p_text) { - if (InputFilter::get_singleton()->is_key_pressed(KEY_SHIFT)) { + if (Input::get_singleton()->is_key_pressed(KEY_SHIFT)) { search_prev(); } else { search_next(); diff --git a/editor/editor_help.h b/editor/editor_help.h index d9c7194003..2e053e674f 100644 --- a/editor/editor_help.h +++ b/editor/editor_help.h @@ -192,9 +192,9 @@ public: ~EditorHelp(); }; -class EditorHelpBit : public PanelContainer { +class EditorHelpBit : public MarginContainer { - GDCLASS(EditorHelpBit, PanelContainer); + GDCLASS(EditorHelpBit, MarginContainer); RichTextLabel *rich_text; void _go_to_help(String p_what); diff --git a/editor/editor_inspector.cpp b/editor/editor_inspector.cpp index c92d1d009d..8fcd5bacb6 100644 --- a/editor/editor_inspector.cpp +++ b/editor/editor_inspector.cpp @@ -66,6 +66,11 @@ Size2 EditorProperty::get_minimum_size() const { ms.width += key->get_width() + get_theme_constant("hseparator", "Tree"); } + if (deletable) { + Ref<Texture2D> key = get_theme_icon("Close", "EditorIcons"); + ms.width += key->get_width() + get_theme_constant("hseparator", "Tree"); + } + if (checkable) { Ref<Texture2D> check = get_theme_icon("checked", "CheckBox"); ms.width += check->get_width() + get_theme_constant("hseparation", "CheckBox") + get_theme_constant("hseparator", "Tree"); @@ -154,6 +159,18 @@ void EditorProperty::_notification(int p_what) { text_size -= key->get_width() + 4 * EDSCALE; } } + + if (deletable) { + Ref<Texture2D> close; + + close = get_theme_icon("Close", "EditorIcons"); + + rect.size.x -= close->get_width() + get_theme_constant("hseparator", "Tree"); + + if (no_children) { + text_size -= close->get_width() + 4 * EDSCALE; + } + } } //set children @@ -278,6 +295,25 @@ void EditorProperty::_notification(int p_what) { } else { keying_rect = Rect2(); } + + if (deletable) { + Ref<Texture2D> close; + + close = get_theme_icon("Close", "EditorIcons"); + + ofs = size.width - close->get_width() - get_theme_constant("hseparator", "Tree"); + + Color color2(1, 1, 1); + if (delete_hover) { + color2.r *= 1.2; + color2.g *= 1.2; + color2.b *= 1.2; + } + delete_rect = Rect2(ofs, ((size.height - close->get_height()) / 2), close->get_width(), close->get_height()); + draw_texture(close, delete_rect.position, color2); + } else { + delete_rect = Rect2(); + } } } @@ -547,6 +583,16 @@ void EditorProperty::set_keying(bool p_keying) { queue_sort(); } +void EditorProperty::set_deletable(bool p_deletable) { + deletable = p_deletable; + update(); + queue_sort(); +} + +bool EditorProperty::is_deletable() const { + return deletable; +} + bool EditorProperty::is_keying() const { return keying; } @@ -619,6 +665,12 @@ void EditorProperty::_gui_input(const Ref<InputEvent> &p_event) { update(); } + bool new_delete_hover = delete_rect.has_point(me->get_position()) && !button_left; + if (new_delete_hover != delete_hover) { + delete_hover = new_delete_hover; + update(); + } + bool new_revert_hover = revert_rect.has_point(me->get_position()) && !button_left; if (new_revert_hover != revert_hover) { revert_hover = new_revert_hover; @@ -662,6 +714,9 @@ void EditorProperty::_gui_input(const Ref<InputEvent> &p_event) { call_deferred("update_property"); } } + if (delete_rect.has_point(mb->get_position())) { + emit_signal("property_deleted", property); + } if (revert_rect.has_point(mb->get_position())) { @@ -821,6 +876,9 @@ void EditorProperty::_bind_methods() { ClassDB::bind_method(D_METHOD("set_keying", "keying"), &EditorProperty::set_keying); ClassDB::bind_method(D_METHOD("is_keying"), &EditorProperty::is_keying); + ClassDB::bind_method(D_METHOD("set_deletable", "deletable"), &EditorProperty::set_deletable); + ClassDB::bind_method(D_METHOD("is_deletable"), &EditorProperty::is_deletable); + ClassDB::bind_method(D_METHOD("get_edited_property"), &EditorProperty::get_edited_property); ClassDB::bind_method(D_METHOD("get_edited_object"), &EditorProperty::get_edited_object); @@ -839,9 +897,11 @@ void EditorProperty::_bind_methods() { ADD_PROPERTY(PropertyInfo(Variant::BOOL, "checked"), "set_checked", "is_checked"); ADD_PROPERTY(PropertyInfo(Variant::BOOL, "draw_red"), "set_draw_red", "is_draw_red"); ADD_PROPERTY(PropertyInfo(Variant::BOOL, "keying"), "set_keying", "is_keying"); + ADD_PROPERTY(PropertyInfo(Variant::BOOL, "deletable"), "set_deletable", "is_deletable"); ADD_SIGNAL(MethodInfo("property_changed", PropertyInfo(Variant::STRING_NAME, "property"), PropertyInfo(Variant::NIL, "value", PROPERTY_HINT_NONE, "", PROPERTY_USAGE_NIL_IS_VARIANT))); ADD_SIGNAL(MethodInfo("multiple_properties_changed", PropertyInfo(Variant::PACKED_STRING_ARRAY, "properties"), PropertyInfo(Variant::ARRAY, "value"))); ADD_SIGNAL(MethodInfo("property_keyed", PropertyInfo(Variant::STRING_NAME, "property"))); + ADD_SIGNAL(MethodInfo("property_deleted", PropertyInfo(Variant::STRING_NAME, "property"))); ADD_SIGNAL(MethodInfo("property_keyed_with_value", PropertyInfo(Variant::STRING_NAME, "property"), PropertyInfo(Variant::NIL, "value", PROPERTY_HINT_NONE, "", PROPERTY_USAGE_NIL_IS_VARIANT))); ADD_SIGNAL(MethodInfo("property_checked", PropertyInfo(Variant::STRING_NAME, "property"), PropertyInfo(Variant::STRING, "bool"))); ADD_SIGNAL(MethodInfo("resource_selected", PropertyInfo(Variant::STRING, "path"), PropertyInfo(Variant::OBJECT, "resource", PROPERTY_HINT_RESOURCE_TYPE, "Resource"))); @@ -865,6 +925,7 @@ EditorProperty::EditorProperty() { checked = false; draw_red = false; keying = false; + deletable = false; keying_hover = false; revert_hover = false; check_hover = false; @@ -926,7 +987,7 @@ void EditorInspectorPlugin::parse_category(Object *p_object, const String &p_par } } -bool EditorInspectorPlugin::parse_property(Object *p_object, Variant::Type p_type, const String &p_path, PropertyHint p_hint, const String &p_hint_text, int p_usage) { +bool EditorInspectorPlugin::parse_property(Object *p_object, Variant::Type p_type, const String &p_path, PropertyHint p_hint, const String &p_hint_text, int p_usage, bool p_wide) { if (get_script_instance()) { Variant arg[6] = { @@ -1276,11 +1337,11 @@ EditorInspectorSection::~EditorInspectorSection() { Ref<EditorInspectorPlugin> EditorInspector::inspector_plugins[MAX_PLUGINS]; int EditorInspector::inspector_plugin_count = 0; -EditorProperty *EditorInspector::instantiate_property_editor(Object *p_object, Variant::Type p_type, const String &p_path, PropertyHint p_hint, const String &p_hint_text, int p_usage) { +EditorProperty *EditorInspector::instantiate_property_editor(Object *p_object, Variant::Type p_type, const String &p_path, PropertyHint p_hint, const String &p_hint_text, int p_usage, bool p_wide) { for (int i = inspector_plugin_count - 1; i >= 0; i--) { - inspector_plugins[i]->parse_property(p_object, p_type, p_path, p_hint, p_hint_text, p_usage); + inspector_plugins[i]->parse_property(p_object, p_type, p_path, p_hint, p_hint_text, p_usage, p_wide); if (inspector_plugins[i]->added_editors.size()) { for (int j = 1; j < inspector_plugins[i]->added_editors.size(); j++) { //only keep first one memdelete(inspector_plugins[i]->added_editors[j].property_editor); @@ -1362,6 +1423,7 @@ void EditorInspector::_parse_added_editors(VBoxContainer *current_vbox, Ref<Edit ep->object = object; ep->connect("property_changed", callable_mp(this, &EditorInspector::_property_changed)); ep->connect("property_keyed", callable_mp(this, &EditorInspector::_property_keyed)); + ep->connect("property_deleted", callable_mp(this, &EditorInspector::_property_deleted), varray(), CONNECT_DEFERRED); ep->connect("property_keyed_with_value", callable_mp(this, &EditorInspector::_property_keyed_with_value)); ep->connect("property_checked", callable_mp(this, &EditorInspector::_property_checked)); ep->connect("selected", callable_mp(this, &EditorInspector::_property_selected)); @@ -1394,6 +1456,7 @@ void EditorInspector::_parse_added_editors(VBoxContainer *current_vbox, Ref<Edit ep->set_read_only(read_only); ep->update_property(); ep->update_reload_status(); + ep->set_deletable(deletable_properties); } } ped->added_editors.clear(); @@ -1478,6 +1541,8 @@ void EditorInspector::update_tree() { String filter = search_box ? search_box->get_text() : ""; String group; String group_base; + String subgroup; + String subgroup_base; VBoxContainer *category_vbox = nullptr; List<PropertyInfo> @@ -1503,10 +1568,19 @@ void EditorInspector::update_tree() { //make sure the property can be edited - if (p.usage & PROPERTY_USAGE_GROUP) { + if (p.usage & PROPERTY_USAGE_SUBGROUP) { + + subgroup = p.name; + subgroup_base = p.hint_string; + + continue; + + } else if (p.usage & PROPERTY_USAGE_GROUP) { group = p.name; group_base = p.hint_string; + subgroup = ""; + subgroup_base = ""; continue; @@ -1514,6 +1588,8 @@ void EditorInspector::update_tree() { group = ""; group_base = ""; + subgroup = ""; + subgroup_base = ""; if (!show_categories) continue; @@ -1577,18 +1653,33 @@ void EditorInspector::update_tree() { } String basename = p.name; + + if (subgroup != "") { + if (subgroup_base != "") { + if (basename.begins_with(subgroup_base)) { + basename = basename.replace_first(subgroup_base, ""); + } else if (subgroup_base.begins_with(basename)) { + //keep it, this is used pretty often + } else { + subgroup = ""; //no longer using subgroup base, clear + } + } + } if (group != "") { - if (group_base != "") { + if (group_base != "" && subgroup == "") { if (basename.begins_with(group_base)) { basename = basename.replace_first(group_base, ""); } else if (group_base.begins_with(basename)) { //keep it, this is used pretty often } else { group = ""; //no longer using group base, clear + subgroup = ""; } } } - + if (subgroup != "") { + basename = subgroup + "/" + basename; + } if (group != "") { basename = group + "/" + basename; } @@ -1734,7 +1825,7 @@ void EditorInspector::update_tree() { for (List<Ref<EditorInspectorPlugin>>::Element *E = valid_plugins.front(); E; E = E->next()) { Ref<EditorInspectorPlugin> ped = E->get(); - bool exclusive = ped->parse_property(object, p.type, p.name, p.hint, p.hint_string, p.usage); + bool exclusive = ped->parse_property(object, p.type, p.name, p.hint, p.hint_string, p.usage, wide_editors); List<EditorInspectorPlugin::AddedEditor> editors = ped->added_editors; //make a copy, since plugins may be used again in a sub-inspector ped->added_editors.clear(); @@ -1778,6 +1869,7 @@ void EditorInspector::update_tree() { ep->set_keying(keying); ep->set_read_only(read_only); + ep->set_deletable(deletable_properties); } current_vbox->add_child(F->get().property_editor); @@ -1789,6 +1881,7 @@ void EditorInspector::update_tree() { ep->connect("property_changed", callable_mp(this, &EditorInspector::_property_changed_update_all), varray(), CONNECT_DEFERRED); } ep->connect("property_keyed", callable_mp(this, &EditorInspector::_property_keyed)); + ep->connect("property_deleted", callable_mp(this, &EditorInspector::_property_deleted), varray(), CONNECT_DEFERRED); ep->connect("property_keyed_with_value", callable_mp(this, &EditorInspector::_property_keyed_with_value)); ep->connect("property_checked", callable_mp(this, &EditorInspector::_property_checked)); ep->connect("selected", callable_mp(this, &EditorInspector::_property_selected)); @@ -1972,6 +2065,10 @@ int EditorInspector::get_scroll_offset() const { return get_v_scroll(); } +void EditorInspector::set_use_wide_editors(bool p_enable) { + wide_editors = p_enable; +} + void EditorInspector::set_sub_inspector(bool p_enable) { sub_inspector = p_enable; @@ -1985,6 +2082,10 @@ void EditorInspector::set_sub_inspector(bool p_enable) { } } +void EditorInspector::set_use_deletable_properties(bool p_enabled) { + deletable_properties = p_enabled; +} + void EditorInspector::_edit_request_change(Object *p_object, const String &p_property) { if (object != p_object) //may be undoing/redoing for a non edited object, so ignore @@ -2117,6 +2218,15 @@ void EditorInspector::_property_keyed(const String &p_path, bool p_advance) { emit_signal("property_keyed", p_path, object->get(p_path), p_advance); //second param is deprecated } +void EditorInspector::_property_deleted(const String &p_path) { + + print_line("deleted pressed?"); + if (!object) + return; + + emit_signal("property_deleted", p_path); //second param is deprecated +} + void EditorInspector::_property_keyed_with_value(const String &p_path, const Variant &p_value, bool p_advance) { if (!object) @@ -2320,6 +2430,7 @@ void EditorInspector::_bind_methods() { ADD_SIGNAL(MethodInfo("property_selected", PropertyInfo(Variant::STRING, "property"))); ADD_SIGNAL(MethodInfo("property_keyed", PropertyInfo(Variant::STRING, "property"))); + ADD_SIGNAL(MethodInfo("property_deleted", PropertyInfo(Variant::STRING, "property"))); ADD_SIGNAL(MethodInfo("resource_selected", PropertyInfo(Variant::OBJECT, "res"), PropertyInfo(Variant::STRING, "prop"))); ADD_SIGNAL(MethodInfo("object_id_selected", PropertyInfo(Variant::INT, "id"))); ADD_SIGNAL(MethodInfo("property_edited", PropertyInfo(Variant::STRING, "property"))); @@ -2337,6 +2448,7 @@ EditorInspector::EditorInspector() { set_enable_h_scroll(false); set_enable_v_scroll(true); + wide_editors = false; show_categories = false; hide_script = true; use_doc_hints = false; @@ -2355,6 +2467,7 @@ EditorInspector::EditorInspector() { set_process(true); property_focusable = -1; sub_inspector = false; + deletable_properties = false; get_v_scrollbar()->connect("value_changed", callable_mp(this, &EditorInspector::_vscroll_changed)); update_scroll_request = -1; diff --git a/editor/editor_inspector.h b/editor/editor_inspector.h index b49a4424f6..c8c1ecc49a 100644 --- a/editor/editor_inspector.h +++ b/editor/editor_inspector.h @@ -64,6 +64,7 @@ private: bool checked; bool draw_red; bool keying; + bool deletable; Rect2 right_child_rect; Rect2 bottom_child_rect; @@ -74,6 +75,8 @@ private: bool revert_hover; Rect2 check_rect; bool check_hover; + Rect2 delete_rect; + bool delete_hover; bool can_revert; @@ -133,6 +136,8 @@ public: void set_keying(bool p_keying); bool is_keying() const; + void set_deletable(bool p_enable); + bool is_deletable() const; void add_focusable(Control *p_control); void select(int p_focusable = -1); void deselect(); @@ -190,7 +195,7 @@ public: virtual bool can_handle(Object *p_object); virtual void parse_begin(Object *p_object); virtual void parse_category(Object *p_object, const String &p_parse_category); - virtual bool parse_property(Object *p_object, Variant::Type p_type, const String &p_path, PropertyHint p_hint, const String &p_hint_text, int p_usage); + virtual bool parse_property(Object *p_object, Variant::Type p_type, const String &p_path, PropertyHint p_hint, const String &p_hint_text, int p_usage, bool p_wide = false); virtual void parse_end(); }; @@ -283,6 +288,8 @@ class EditorInspector : public ScrollContainer { bool read_only; bool keying; bool sub_inspector; + bool wide_editors; + bool deletable_properties; float refresh_countdown; bool update_tree_pending; @@ -307,6 +314,7 @@ class EditorInspector : public ScrollContainer { void _multiple_properties_changed(Vector<String> p_paths, Array p_values); void _property_keyed(const String &p_path, bool p_advance); void _property_keyed_with_value(const String &p_path, const Variant &p_value, bool p_advance); + void _property_deleted(const String &p_path); void _property_checked(const String &p_path, bool p_checked); @@ -337,7 +345,7 @@ public: static void remove_inspector_plugin(const Ref<EditorInspectorPlugin> &p_plugin); static void cleanup_plugins(); - static EditorProperty *instantiate_property_editor(Object *p_object, Variant::Type p_type, const String &p_path, PropertyHint p_hint, const String &p_hint_text, int p_usage); + static EditorProperty *instantiate_property_editor(Object *p_object, Variant::Type p_type, const String &p_path, PropertyHint p_hint, const String &p_hint_text, int p_usage, bool p_wide = false); void set_undo_redo(UndoRedo *p_undo_redo); @@ -380,8 +388,11 @@ public: void set_object_class(const String &p_class); String get_object_class() const; + void set_use_wide_editors(bool p_enable); void set_sub_inspector(bool p_enable); + void set_use_deletable_properties(bool p_enabled); + EditorInspector(); }; diff --git a/editor/editor_node.cpp b/editor/editor_node.cpp index e7c1eaf777..ea2009ab58 100644 --- a/editor/editor_node.cpp +++ b/editor/editor_node.cpp @@ -32,7 +32,7 @@ #include "core/bind/core_bind.h" #include "core/class_db.h" -#include "core/input/input_filter.h" +#include "core/input/input.h" #include "core/io/config_file.h" #include "core/io/image_loader.h" #include "core/io/resource_loader.h" @@ -64,6 +64,7 @@ #include "servers/navigation_server_2d.h" #include "servers/navigation_server_3d.h" #include "servers/physics_server_2d.h" +#include "servers/rendering/rendering_device.h" #include "editor/audio_stream_preview.h" #include "editor/debugger/editor_debugger_node.h" @@ -97,6 +98,7 @@ #include "editor/import/resource_importer_layered_texture.h" #include "editor/import/resource_importer_obj.h" #include "editor/import/resource_importer_scene.h" +#include "editor/import/resource_importer_shader_file.h" #include "editor/import/resource_importer_texture.h" #include "editor/import/resource_importer_texture_atlas.h" #include "editor/import/resource_importer_wav.h" @@ -147,6 +149,7 @@ #include "editor/plugins/script_editor_plugin.h" #include "editor/plugins/script_text_editor.h" #include "editor/plugins/shader_editor_plugin.h" +#include "editor/plugins/shader_file_editor_plugin.h" #include "editor/plugins/skeleton_2d_editor_plugin.h" #include "editor/plugins/skeleton_3d_editor_plugin.h" #include "editor/plugins/skeleton_ik_3d_editor_plugin.h" @@ -358,13 +361,13 @@ void EditorNode::_notification(int p_what) { scene_root->set_default_canvas_item_texture_repeat(tr); } - RS::DOFBokehShape dof_shape = RS::DOFBokehShape(int(GLOBAL_GET("rendering/quality/filters/depth_of_field_bokeh_shape"))); + RS::DOFBokehShape dof_shape = RS::DOFBokehShape(int(GLOBAL_GET("rendering/quality/depth_of_field/depth_of_field_bokeh_shape"))); RS::get_singleton()->camera_effects_set_dof_blur_bokeh_shape(dof_shape); - RS::DOFBlurQuality dof_quality = RS::DOFBlurQuality(int(GLOBAL_GET("rendering/quality/filters/depth_of_field_bokeh_quality"))); - bool dof_jitter = GLOBAL_GET("rendering/quality/filters/depth_of_field_use_jitter"); + RS::DOFBlurQuality dof_quality = RS::DOFBlurQuality(int(GLOBAL_GET("rendering/quality/depth_of_field/depth_of_field_bokeh_quality"))); + bool dof_jitter = GLOBAL_GET("rendering/quality/depth_of_field/depth_of_field_use_jitter"); RS::get_singleton()->camera_effects_set_dof_blur_quality(dof_quality, dof_jitter); RS::get_singleton()->environment_set_ssao_quality(RS::EnvironmentSSAOQuality(int(GLOBAL_GET("rendering/quality/ssao/quality"))), GLOBAL_GET("rendering/quality/ssao/half_size")); - RS::get_singleton()->screen_space_roughness_limiter_set_active(GLOBAL_GET("rendering/quality/filters/screen_space_roughness_limiter"), GLOBAL_GET("rendering/quality/filters/screen_space_roughness_limiter_curve")); + RS::get_singleton()->screen_space_roughness_limiter_set_active(GLOBAL_GET("rendering/quality/screen_filters/screen_space_roughness_limiter"), GLOBAL_GET("rendering/quality/screen_filters/screen_space_roughness_limiter_curve")); bool glow_bicubic = int(GLOBAL_GET("rendering/quality/glow/upscale_mode")) > 0; RS::get_singleton()->environment_glow_set_use_bicubic_upscale(glow_bicubic); RS::EnvironmentSSRRoughnessQuality ssr_roughness_quality = RS::EnvironmentSSRRoughnessQuality(int(GLOBAL_GET("rendering/quality/screen_space_reflection/roughness_quality"))); @@ -374,6 +377,10 @@ void EditorNode::_notification(int p_what) { float sss_scale = GLOBAL_GET("rendering/quality/subsurface_scattering/subsurface_scattering_scale"); float sss_depth_scale = GLOBAL_GET("rendering/quality/subsurface_scattering/subsurface_scattering_depth_scale"); RS::get_singleton()->sub_surface_scattering_set_scale(sss_scale, sss_depth_scale); + RS::ShadowQuality shadows_quality = RS::ShadowQuality(int(GLOBAL_GET("rendering/quality/shadows/soft_shadow_quality"))); + RS::get_singleton()->shadows_quality_set(shadows_quality); + RS::ShadowQuality directional_shadow_quality = RS::ShadowQuality(int(GLOBAL_GET("rendering/quality/directional_shadow/soft_shadow_quality"))); + RS::get_singleton()->directional_shadow_quality_set(directional_shadow_quality); } ResourceImporterTexture::get_singleton()->update_imports(); @@ -704,6 +711,11 @@ void EditorNode::_sources_changed(bool p_exist) { if (waiting_for_first_scan) { waiting_for_first_scan = false; + // Reload the global shader variables, but this time + // loading texures, as they are now properly imported. + print_line("done scanning, reload textures"); + RenderingServer::get_singleton()->global_variables_load_settings(true); + // Start preview thread now that it's safe. if (!singleton->cmdline_export_mode) { EditorResourcePreview::get_singleton()->start(); @@ -1183,8 +1195,6 @@ void EditorNode::_save_scene_with_preview(String p_file, int p_idx) { } img->convert(Image::FORMAT_RGB8); - img->flip_y(); - //save thumbnail directly, as thumbnailer may not update due to actual scene not changing md5 String temp_path = EditorSettings::get_singleton()->get_cache_dir(); String cache_base = ProjectSettings::get_singleton()->globalize_path(p_file).md5_text(); @@ -2354,7 +2364,7 @@ void EditorNode::_menu_option_confirm(int p_option, bool p_confirmed) { case EDIT_UNDO: { - if (InputFilter::get_singleton()->get_mouse_button_mask() & 0x7) { + if (Input::get_singleton()->get_mouse_button_mask() & 0x7) { log->add_message("Can't undo while mouse buttons are pressed.", EditorLog::MSG_TYPE_EDITOR); } else { String action = editor_data.get_undo_redo().get_current_action_name(); @@ -2368,7 +2378,7 @@ void EditorNode::_menu_option_confirm(int p_option, bool p_confirmed) { } break; case EDIT_REDO: { - if (InputFilter::get_singleton()->get_mouse_button_mask() & 0x7) { + if (Input::get_singleton()->get_mouse_button_mask() & 0x7) { log->add_message("Can't redo while mouse buttons are pressed.", EditorLog::MSG_TYPE_EDITOR); } else { if (!editor_data.get_undo_redo().redo()) { @@ -5554,7 +5564,7 @@ int EditorNode::execute_and_show_output(const String &p_title, const String &p_p EditorNode::EditorNode() { - InputFilter::get_singleton()->set_use_accumulated_input(true); + Input::get_singleton()->set_use_accumulated_input(true); Resource::_get_local_scene_func = _resource_get_edited_scene; RenderingServer::get_singleton()->set_debug_generate_wireframes(true); @@ -5570,7 +5580,7 @@ EditorNode::EditorNode() { ResourceLoader::clear_translation_remaps(); //no remaps using during editor ResourceLoader::clear_path_remaps(); - InputFilter *id = InputFilter::get_singleton(); + Input *id = Input::get_singleton(); if (id) { @@ -5581,7 +5591,7 @@ EditorNode::EditorNode() { } } - if (!found_touchscreen && InputFilter::get_singleton()) { + if (!found_touchscreen && Input::get_singleton()) { //only if no touchscreen ui hint, set emulation id->set_emulate_touch_from_mouse(false); //just disable just in case } @@ -5706,6 +5716,10 @@ EditorNode::EditorNode() { import_obj.instance(); ResourceFormatImporter::get_singleton()->add_importer(import_obj); + Ref<ResourceImporterShaderFile> import_shader_file; + import_shader_file.instance(); + ResourceFormatImporter::get_singleton()->add_importer(import_shader_file); + Ref<ResourceImporterScene> import_scene; import_scene.instance(); ResourceFormatImporter::get_singleton()->add_importer(import_scene); @@ -6623,6 +6637,7 @@ EditorNode::EditorNode() { add_editor_plugin(VersionControlEditorPlugin::get_singleton()); add_editor_plugin(memnew(ShaderEditorPlugin(this))); + add_editor_plugin(memnew(ShaderFileEditorPlugin(this))); add_editor_plugin(memnew(VisualShaderEditorPlugin(this))); add_editor_plugin(memnew(Camera3DEditorPlugin(this))); diff --git a/editor/editor_properties.cpp b/editor/editor_properties.cpp index 1f3ff1b332..5213d7ec15 100644 --- a/editor/editor_properties.cpp +++ b/editor/editor_properties.cpp @@ -1150,12 +1150,15 @@ void EditorPropertyVector2::setup(double p_min, double p_max, double p_step, boo } } -EditorPropertyVector2::EditorPropertyVector2() { +EditorPropertyVector2::EditorPropertyVector2(bool p_force_wide) { bool horizontal = EDITOR_GET("interface/inspector/horizontal_vector2_editing"); BoxContainer *bc; - if (horizontal) { + if (p_force_wide) { + bc = memnew(HBoxContainer); + add_child(bc); + } else if (horizontal) { bc = memnew(HBoxContainer); add_child(bc); set_bottom_editor(bc); @@ -1231,13 +1234,16 @@ void EditorPropertyRect2::setup(double p_min, double p_max, double p_step, bool } } -EditorPropertyRect2::EditorPropertyRect2() { +EditorPropertyRect2::EditorPropertyRect2(bool p_force_wide) { - bool horizontal = EDITOR_GET("interface/inspector/horizontal_vector_types_editing"); + bool horizontal = !p_force_wide && bool(EDITOR_GET("interface/inspector/horizontal_vector_types_editing")); BoxContainer *bc; - if (horizontal) { + if (p_force_wide) { + bc = memnew(HBoxContainer); + add_child(bc); + } else if (horizontal) { bc = memnew(HBoxContainer); add_child(bc); set_bottom_editor(bc); @@ -1311,12 +1317,15 @@ void EditorPropertyVector3::setup(double p_min, double p_max, double p_step, boo } } -EditorPropertyVector3::EditorPropertyVector3() { +EditorPropertyVector3::EditorPropertyVector3(bool p_force_wide) { bool horizontal = EDITOR_GET("interface/inspector/horizontal_vector_types_editing"); BoxContainer *bc; - if (horizontal) { + if (p_force_wide) { + bc = memnew(HBoxContainer); + add_child(bc); + } else if (horizontal) { bc = memnew(HBoxContainer); add_child(bc); set_bottom_editor(bc); @@ -1343,6 +1352,255 @@ EditorPropertyVector3::EditorPropertyVector3() { } setting = false; } + +///////////////////// VECTOR2i ///////////////////////// + +void EditorPropertyVector2i::_value_changed(double val, const String &p_name) { + if (setting) + return; + + Vector2i v2; + v2.x = spin[0]->get_value(); + v2.y = spin[1]->get_value(); + emit_changed(get_edited_property(), v2, p_name); +} + +void EditorPropertyVector2i::update_property() { + Vector2i val = get_edited_object()->get(get_edited_property()); + setting = true; + spin[0]->set_value(val.x); + spin[1]->set_value(val.y); + setting = false; +} + +void EditorPropertyVector2i::_notification(int p_what) { + if (p_what == NOTIFICATION_ENTER_TREE || p_what == NOTIFICATION_THEME_CHANGED) { + Color base = get_theme_color("accent_color", "Editor"); + for (int i = 0; i < 2; i++) { + + Color c = base; + c.set_hsv(float(i) / 3.0 + 0.05, c.get_s() * 0.75, c.get_v()); + spin[i]->set_custom_label_color(true, c); + } + } +} + +void EditorPropertyVector2i::_bind_methods() { +} + +void EditorPropertyVector2i::setup(int p_min, int p_max, bool p_no_slider) { + for (int i = 0; i < 2; i++) { + spin[i]->set_min(p_min); + spin[i]->set_max(p_max); + spin[i]->set_step(1); + spin[i]->set_hide_slider(p_no_slider); + spin[i]->set_allow_greater(true); + spin[i]->set_allow_lesser(true); + } +} + +EditorPropertyVector2i::EditorPropertyVector2i(bool p_force_wide) { + bool horizontal = EDITOR_GET("interface/inspector/horizontal_vector2_editing"); + + BoxContainer *bc; + + if (p_force_wide) { + bc = memnew(HBoxContainer); + add_child(bc); + } else if (horizontal) { + bc = memnew(HBoxContainer); + add_child(bc); + set_bottom_editor(bc); + } else { + bc = memnew(VBoxContainer); + add_child(bc); + } + + static const char *desc[2] = { "x", "y" }; + for (int i = 0; i < 2; i++) { + spin[i] = memnew(EditorSpinSlider); + spin[i]->set_flat(true); + spin[i]->set_label(desc[i]); + bc->add_child(spin[i]); + add_focusable(spin[i]); + spin[i]->connect("value_changed", callable_mp(this, &EditorPropertyVector2i::_value_changed), varray(desc[i])); + if (horizontal) { + spin[i]->set_h_size_flags(SIZE_EXPAND_FILL); + } + } + + if (!horizontal) { + set_label_reference(spin[0]); //show text and buttons around this + } + setting = false; +} + +///////////////////// RECT2 ///////////////////////// + +void EditorPropertyRect2i::_value_changed(double val, const String &p_name) { + if (setting) + return; + + Rect2i r2; + r2.position.x = spin[0]->get_value(); + r2.position.y = spin[1]->get_value(); + r2.size.x = spin[2]->get_value(); + r2.size.y = spin[3]->get_value(); + emit_changed(get_edited_property(), r2, p_name); +} + +void EditorPropertyRect2i::update_property() { + Rect2i val = get_edited_object()->get(get_edited_property()); + setting = true; + spin[0]->set_value(val.position.x); + spin[1]->set_value(val.position.y); + spin[2]->set_value(val.size.x); + spin[3]->set_value(val.size.y); + setting = false; +} +void EditorPropertyRect2i::_notification(int p_what) { + if (p_what == NOTIFICATION_ENTER_TREE || p_what == NOTIFICATION_THEME_CHANGED) { + Color base = get_theme_color("accent_color", "Editor"); + for (int i = 0; i < 4; i++) { + + Color c = base; + c.set_hsv(float(i % 2) / 3.0 + 0.05, c.get_s() * 0.75, c.get_v()); + spin[i]->set_custom_label_color(true, c); + } + } +} +void EditorPropertyRect2i::_bind_methods() { +} + +void EditorPropertyRect2i::setup(int p_min, int p_max, bool p_no_slider) { + for (int i = 0; i < 4; i++) { + spin[i]->set_min(p_min); + spin[i]->set_max(p_max); + spin[i]->set_step(1); + spin[i]->set_hide_slider(p_no_slider); + spin[i]->set_allow_greater(true); + spin[i]->set_allow_lesser(true); + } +} + +EditorPropertyRect2i::EditorPropertyRect2i(bool p_force_wide) { + + bool horizontal = EDITOR_GET("interface/inspector/horizontal_vector_types_editing"); + + BoxContainer *bc; + + if (p_force_wide) { + bc = memnew(HBoxContainer); + add_child(bc); + } else if (horizontal) { + bc = memnew(HBoxContainer); + add_child(bc); + set_bottom_editor(bc); + } else { + bc = memnew(VBoxContainer); + add_child(bc); + } + + static const char *desc[4] = { "x", "y", "w", "h" }; + for (int i = 0; i < 4; i++) { + spin[i] = memnew(EditorSpinSlider); + spin[i]->set_label(desc[i]); + spin[i]->set_flat(true); + bc->add_child(spin[i]); + add_focusable(spin[i]); + spin[i]->connect("value_changed", callable_mp(this, &EditorPropertyRect2i::_value_changed), varray(desc[i])); + if (horizontal) { + spin[i]->set_h_size_flags(SIZE_EXPAND_FILL); + } + } + + if (!horizontal) { + set_label_reference(spin[0]); //show text and buttons around this + } + setting = false; +} + +///////////////////// VECTOR3 ///////////////////////// + +void EditorPropertyVector3i::_value_changed(double val, const String &p_name) { + if (setting) + return; + + Vector3i v3; + v3.x = spin[0]->get_value(); + v3.y = spin[1]->get_value(); + v3.z = spin[2]->get_value(); + emit_changed(get_edited_property(), v3, p_name); +} + +void EditorPropertyVector3i::update_property() { + Vector3i val = get_edited_object()->get(get_edited_property()); + setting = true; + spin[0]->set_value(val.x); + spin[1]->set_value(val.y); + spin[2]->set_value(val.z); + setting = false; +} +void EditorPropertyVector3i::_notification(int p_what) { + if (p_what == NOTIFICATION_ENTER_TREE || p_what == NOTIFICATION_THEME_CHANGED) { + Color base = get_theme_color("accent_color", "Editor"); + for (int i = 0; i < 3; i++) { + + Color c = base; + c.set_hsv(float(i) / 3.0 + 0.05, c.get_s() * 0.75, c.get_v()); + spin[i]->set_custom_label_color(true, c); + } + } +} +void EditorPropertyVector3i::_bind_methods() { +} + +void EditorPropertyVector3i::setup(int p_min, int p_max, bool p_no_slider) { + for (int i = 0; i < 3; i++) { + spin[i]->set_min(p_min); + spin[i]->set_max(p_max); + spin[i]->set_step(1); + spin[i]->set_hide_slider(p_no_slider); + spin[i]->set_allow_greater(true); + spin[i]->set_allow_lesser(true); + } +} + +EditorPropertyVector3i::EditorPropertyVector3i(bool p_force_wide) { + bool horizontal = EDITOR_GET("interface/inspector/horizontal_vector_types_editing"); + + BoxContainer *bc; + if (p_force_wide) { + bc = memnew(HBoxContainer); + add_child(bc); + } else if (horizontal) { + bc = memnew(HBoxContainer); + add_child(bc); + set_bottom_editor(bc); + } else { + bc = memnew(VBoxContainer); + add_child(bc); + } + + static const char *desc[3] = { "x", "y", "z" }; + for (int i = 0; i < 3; i++) { + spin[i] = memnew(EditorSpinSlider); + spin[i]->set_flat(true); + spin[i]->set_label(desc[i]); + bc->add_child(spin[i]); + add_focusable(spin[i]); + spin[i]->connect("value_changed", callable_mp(this, &EditorPropertyVector3i::_value_changed), varray(desc[i])); + if (horizontal) { + spin[i]->set_h_size_flags(SIZE_EXPAND_FILL); + } + } + + if (!horizontal) { + set_label_reference(spin[0]); //show text and buttons around this + } + setting = false; +} + ///////////////////// PLANE ///////////////////////// void EditorPropertyPlane::_value_changed(double val, const String &p_name) { @@ -1391,13 +1649,16 @@ void EditorPropertyPlane::setup(double p_min, double p_max, double p_step, bool } } -EditorPropertyPlane::EditorPropertyPlane() { +EditorPropertyPlane::EditorPropertyPlane(bool p_force_wide) { bool horizontal = EDITOR_GET("interface/inspector/horizontal_vector_types_editing"); BoxContainer *bc; - if (horizontal) { + if (p_force_wide) { + bc = memnew(HBoxContainer); + add_child(bc); + } else if (horizontal) { bc = memnew(HBoxContainer); add_child(bc); set_bottom_editor(bc); @@ -2196,7 +2457,7 @@ void EditorPropertyResource::_menu_option(int p_which) { file_system_dock->navigate_to_path(res->get_path()); // Ensure that the FileSystem dock is visible. TabContainer *tab_container = (TabContainer *)file_system_dock->get_parent_control(); - tab_container->set_current_tab(file_system_dock->get_position_in_parent()); + tab_container->set_current_tab(file_system_dock->get_index()); } break; default: { @@ -2877,7 +3138,7 @@ void EditorInspectorDefaultPlugin::parse_begin(Object *p_object) { //do none } -bool EditorInspectorDefaultPlugin::parse_property(Object *p_object, Variant::Type p_type, const String &p_path, PropertyHint p_hint, const String &p_hint_text, int p_usage) { +bool EditorInspectorDefaultPlugin::parse_property(Object *p_object, Variant::Type p_type, const String &p_path, PropertyHint p_hint, const String &p_hint_text, int p_usage, bool p_wide) { float default_float_step = EDITOR_GET("interface/inspector/default_float_step"); @@ -3083,7 +3344,7 @@ bool EditorInspectorDefaultPlugin::parse_property(Object *p_object, Variant::Typ // math types case Variant::VECTOR2: { - EditorPropertyVector2 *editor = memnew(EditorPropertyVector2); + EditorPropertyVector2 *editor = memnew(EditorPropertyVector2(p_wide)); double min = -65535, max = 65535, step = default_float_step; bool hide_slider = true; @@ -3100,8 +3361,23 @@ bool EditorInspectorDefaultPlugin::parse_property(Object *p_object, Variant::Typ add_property_editor(p_path, editor); } break; + case Variant::VECTOR2I: { + EditorPropertyVector2i *editor = memnew(EditorPropertyVector2i(p_wide)); + int min = -65535, max = 65535; + bool hide_slider = true; + + if (p_hint == PROPERTY_HINT_RANGE && p_hint_text.get_slice_count(",") >= 2) { + min = p_hint_text.get_slice(",", 0).to_double(); + max = p_hint_text.get_slice(",", 1).to_double(); + hide_slider = false; + } + + editor->setup(min, max, hide_slider); + add_property_editor(p_path, editor); + + } break; case Variant::RECT2: { - EditorPropertyRect2 *editor = memnew(EditorPropertyRect2); + EditorPropertyRect2 *editor = memnew(EditorPropertyRect2(p_wide)); double min = -65535, max = 65535, step = default_float_step; bool hide_slider = true; @@ -3117,8 +3393,22 @@ bool EditorInspectorDefaultPlugin::parse_property(Object *p_object, Variant::Typ editor->setup(min, max, step, hide_slider); add_property_editor(p_path, editor); } break; + case Variant::RECT2I: { + EditorPropertyRect2i *editor = memnew(EditorPropertyRect2i(p_wide)); + int min = -65535, max = 65535; + bool hide_slider = true; + + if (p_hint == PROPERTY_HINT_RANGE && p_hint_text.get_slice_count(",") >= 2) { + min = p_hint_text.get_slice(",", 0).to_double(); + max = p_hint_text.get_slice(",", 1).to_double(); + hide_slider = false; + } + + editor->setup(min, max, hide_slider); + add_property_editor(p_path, editor); + } break; case Variant::VECTOR3: { - EditorPropertyVector3 *editor = memnew(EditorPropertyVector3); + EditorPropertyVector3 *editor = memnew(EditorPropertyVector3(p_wide)); double min = -65535, max = 65535, step = default_float_step; bool hide_slider = true; @@ -3135,6 +3425,22 @@ bool EditorInspectorDefaultPlugin::parse_property(Object *p_object, Variant::Typ add_property_editor(p_path, editor); } break; + case Variant::VECTOR3I: { + EditorPropertyVector3i *editor = memnew(EditorPropertyVector3i(p_wide)); + int min = -65535, max = 65535; + bool hide_slider = true; + + if (p_hint == PROPERTY_HINT_RANGE && p_hint_text.get_slice_count(",") >= 2) { + min = p_hint_text.get_slice(",", 0).to_double(); + max = p_hint_text.get_slice(",", 1).to_double(); + + hide_slider = false; + } + + editor->setup(min, max, hide_slider); + add_property_editor(p_path, editor); + + } break; case Variant::TRANSFORM2D: { EditorPropertyTransform2D *editor = memnew(EditorPropertyTransform2D); double min = -65535, max = 65535, step = default_float_step; @@ -3154,7 +3460,7 @@ bool EditorInspectorDefaultPlugin::parse_property(Object *p_object, Variant::Typ } break; case Variant::PLANE: { - EditorPropertyPlane *editor = memnew(EditorPropertyPlane); + EditorPropertyPlane *editor = memnew(EditorPropertyPlane(p_wide)); double min = -65535, max = 65535, step = default_float_step; bool hide_slider = true; diff --git a/editor/editor_properties.h b/editor/editor_properties.h index c5fc8aaf77..61c11f4534 100644 --- a/editor/editor_properties.h +++ b/editor/editor_properties.h @@ -361,7 +361,7 @@ protected: public: virtual void update_property(); void setup(double p_min, double p_max, double p_step, bool p_no_slider); - EditorPropertyVector2(); + EditorPropertyVector2(bool p_force_wide = false); }; class EditorPropertyRect2 : public EditorProperty { @@ -377,7 +377,7 @@ protected: public: virtual void update_property(); void setup(double p_min, double p_max, double p_step, bool p_no_slider); - EditorPropertyRect2(); + EditorPropertyRect2(bool p_force_wide = false); }; class EditorPropertyVector3 : public EditorProperty { @@ -393,7 +393,55 @@ protected: public: virtual void update_property(); void setup(double p_min, double p_max, double p_step, bool p_no_slider); - EditorPropertyVector3(); + EditorPropertyVector3(bool p_force_wide = false); +}; + +class EditorPropertyVector2i : public EditorProperty { + GDCLASS(EditorPropertyVector2i, EditorProperty); + EditorSpinSlider *spin[2]; + bool setting; + void _value_changed(double p_val, const String &p_name); + +protected: + void _notification(int p_what); + static void _bind_methods(); + +public: + virtual void update_property(); + void setup(int p_min, int p_max, bool p_no_slider); + EditorPropertyVector2i(bool p_force_wide = false); +}; + +class EditorPropertyRect2i : public EditorProperty { + GDCLASS(EditorPropertyRect2i, EditorProperty); + EditorSpinSlider *spin[4]; + bool setting; + void _value_changed(double p_val, const String &p_name); + +protected: + void _notification(int p_what); + static void _bind_methods(); + +public: + virtual void update_property(); + void setup(int p_min, int p_max, bool p_no_slider); + EditorPropertyRect2i(bool p_force_wide = false); +}; + +class EditorPropertyVector3i : public EditorProperty { + GDCLASS(EditorPropertyVector3i, EditorProperty); + EditorSpinSlider *spin[3]; + bool setting; + void _value_changed(double p_val, const String &p_name); + +protected: + void _notification(int p_what); + static void _bind_methods(); + +public: + virtual void update_property(); + void setup(int p_min, int p_max, bool p_no_slider); + EditorPropertyVector3i(bool p_force_wide = false); }; class EditorPropertyPlane : public EditorProperty { @@ -409,7 +457,7 @@ protected: public: virtual void update_property(); void setup(double p_min, double p_max, double p_step, bool p_no_slider); - EditorPropertyPlane(); + EditorPropertyPlane(bool p_force_wide = false); }; class EditorPropertyQuat : public EditorProperty { @@ -626,7 +674,7 @@ class EditorInspectorDefaultPlugin : public EditorInspectorPlugin { public: virtual bool can_handle(Object *p_object); virtual void parse_begin(Object *p_object); - virtual bool parse_property(Object *p_object, Variant::Type p_type, const String &p_path, PropertyHint p_hint, const String &p_hint_text, int p_usage); + virtual bool parse_property(Object *p_object, Variant::Type p_type, const String &p_path, PropertyHint p_hint, const String &p_hint_text, int p_usage, bool p_wide = false); virtual void parse_end(); }; diff --git a/editor/editor_properties_array_dict.cpp b/editor/editor_properties_array_dict.cpp index b4ce60171b..49cffb015f 100644 --- a/editor/editor_properties_array_dict.cpp +++ b/editor/editor_properties_array_dict.cpp @@ -412,8 +412,104 @@ void EditorPropertyArray::_remove_pressed(int p_index) { update_property(); } +void EditorPropertyArray::_button_draw() { + if (dropping) { + Color color = get_theme_color("accent_color", "Editor"); + edit->draw_rect(Rect2(Point2(), edit->get_size()), color, false); + } +} + +bool EditorPropertyArray::_is_drop_valid(const Dictionary &p_drag_data) const { + String allowed_type = Variant::get_type_name(subtype); + + Dictionary drag_data = p_drag_data; + + if (drag_data.has("type") && String(drag_data["type"]) == "files") { + + Vector<String> files = drag_data["files"]; + + for (int i = 0; i < files.size(); i++) { + String file = files[i]; + String ftype = EditorFileSystem::get_singleton()->get_file_type(file); + + for (int j = 0; j < allowed_type.get_slice_count(","); j++) { + String at = allowed_type.get_slice(",", j).strip_edges(); + // Fail if one of the files is not of allowed type + if (!ClassDB::is_parent_class(ftype, at)) { + return false; + } + } + } + + // If no files fail, drop is valid + return true; + } + + return false; +} + +bool EditorPropertyArray::can_drop_data_fw(const Point2 &p_point, const Variant &p_data, Control *p_from) const { + + return _is_drop_valid(p_data); +} + +void EditorPropertyArray::drop_data_fw(const Point2 &p_point, const Variant &p_data, Control *p_from) { + ERR_FAIL_COND(!_is_drop_valid(p_data)); + + Dictionary drag_data = p_data; + + if (drag_data.has("type") && String(drag_data["type"]) == "files") { + + Vector<String> files = drag_data["files"]; + + Variant array = object->get_array(); + + // Handle the case where array is not initialised yet + if (!array.is_array()) { + Callable::CallError ce; + array = Variant::construct(array_type, nullptr, 0, ce); + } + + // Loop the file array and add to existing array + for (int i = 0; i < files.size(); i++) { + String file = files[i]; + + RES res = ResourceLoader::load(file); + if (res.is_valid()) { + array.call("push_back", res); + } + } + + if (array.get_type() == Variant::ARRAY) { + array = array.call("duplicate"); + } + + emit_changed(get_edited_property(), array, "", false); + object->set_array(array); + + update_property(); + } +} + void EditorPropertyArray::_notification(int p_what) { + if (p_what == NOTIFICATION_DRAG_BEGIN) { + + if (is_visible_in_tree()) { + if (_is_drop_valid(get_viewport()->gui_get_drag_data())) { + dropping = true; + edit->update(); + } + } + } + + if (p_what == NOTIFICATION_DRAG_END) { + if (dropping) { + dropping = false; + edit->update(); + } + } } + void EditorPropertyArray::_edit_pressed() { Variant array = get_edited_object()->get(get_edited_property()); @@ -490,6 +586,8 @@ void EditorPropertyArray::setup(Variant::Type p_array_type, const String &p_hint } void EditorPropertyArray::_bind_methods() { + ClassDB::bind_method(D_METHOD("can_drop_data_fw"), &EditorPropertyArray::can_drop_data_fw); + ClassDB::bind_method(D_METHOD("drop_data_fw"), &EditorPropertyArray::drop_data_fw); } EditorPropertyArray::EditorPropertyArray() { @@ -503,6 +601,8 @@ EditorPropertyArray::EditorPropertyArray() { edit->set_clip_text(true); edit->connect("pressed", callable_mp(this, &EditorPropertyArray::_edit_pressed)); edit->set_toggle_mode(true); + edit->set_drag_forwarding(this); + edit->connect("draw", callable_mp(this, &EditorPropertyArray::_button_draw)); add_child(edit); add_focusable(edit); vbox = nullptr; @@ -524,6 +624,8 @@ EditorPropertyArray::EditorPropertyArray() { subtype = Variant::NIL; subtype_hint = PROPERTY_HINT_NONE; subtype_hint_string = ""; + + dropping = false; } ///////////////////// DICTIONARY /////////////////////////// @@ -742,6 +844,13 @@ void EditorPropertyDictionary::update_property() { prop = editor; } break; + case Variant::VECTOR2I: { + + EditorPropertyVector2i *editor = memnew(EditorPropertyVector2i); + editor->setup(-100000, 100000, true); + prop = editor; + + } break; case Variant::RECT2: { EditorPropertyRect2 *editor = memnew(EditorPropertyRect2); @@ -749,6 +858,13 @@ void EditorPropertyDictionary::update_property() { prop = editor; } break; + case Variant::RECT2I: { + + EditorPropertyRect2i *editor = memnew(EditorPropertyRect2i); + editor->setup(-100000, 100000, true); + prop = editor; + + } break; case Variant::VECTOR3: { EditorPropertyVector3 *editor = memnew(EditorPropertyVector3); @@ -756,6 +872,13 @@ void EditorPropertyDictionary::update_property() { prop = editor; } break; + case Variant::VECTOR3I: { + + EditorPropertyVector3i *editor = memnew(EditorPropertyVector3i); + editor->setup(-100000, 100000, true); + prop = editor; + + } break; case Variant::TRANSFORM2D: { EditorPropertyTransform2D *editor = memnew(EditorPropertyTransform2D); diff --git a/editor/editor_properties_array_dict.h b/editor/editor_properties_array_dict.h index 51a4be1b3a..d6f3c976f9 100644 --- a/editor/editor_properties_array_dict.h +++ b/editor/editor_properties_array_dict.h @@ -33,6 +33,7 @@ #include "editor/editor_inspector.h" #include "editor/editor_spin_slider.h" +#include "editor/filesystem_dock.h" #include "scene/gui/button.h" class EditorPropertyArrayObject : public Reference { @@ -82,6 +83,7 @@ class EditorPropertyArray : public EditorProperty { PopupMenu *change_type; bool updating; + bool dropping; Ref<EditorPropertyArrayObject> object; int page_len; @@ -107,6 +109,11 @@ class EditorPropertyArray : public EditorProperty { void _object_id_selected(const StringName &p_property, ObjectID p_id); void _remove_pressed(int p_index); + void _button_draw(); + bool _is_drop_valid(const Dictionary &p_drag_data) const; + bool can_drop_data_fw(const Point2 &p_point, const Variant &p_data, Control *p_from) const; + void drop_data_fw(const Point2 &p_point, const Variant &p_data, Control *p_from); + protected: static void _bind_methods(); void _notification(int p_what); diff --git a/editor/editor_settings.cpp b/editor/editor_settings.cpp index 5d5bb1242d..5e34913cf0 100644 --- a/editor/editor_settings.cpp +++ b/editor/editor_settings.cpp @@ -559,6 +559,10 @@ void EditorSettings::_load_defaults(Ref<ConfigFile> p_extra_config) { hints["editors/3d/navigation_feel/manipulation_translation_inertia"] = PropertyInfo(Variant::FLOAT, "editors/3d/navigation_feel/manipulation_translation_inertia", PROPERTY_HINT_RANGE, "0.0, 1, 0.01"); // 3D: Freelook + _initial_set("editors/3d/freelook/freelook_navigation_scheme", false); + hints["editors/3d/freelook/freelook_navigation_scheme"] = PropertyInfo(Variant::INT, "editors/3d/freelook/freelook_navigation_scheme", PROPERTY_HINT_ENUM, "Default,Partially Axis-Locked (id Tech),Fully Axis-Locked (Minecraft)"); + _initial_set("editors/3d/freelook/freelook_sensitivity", 0.4); + hints["editors/3d/freelook/freelook_sensitivity"] = PropertyInfo(Variant::FLOAT, "editors/3d/freelook/freelook_sensitivity", PROPERTY_HINT_RANGE, "0.0, 2, 0.01"); _initial_set("editors/3d/freelook/freelook_inertia", 0.1); hints["editors/3d/freelook/freelook_inertia"] = PropertyInfo(Variant::FLOAT, "editors/3d/freelook/freelook_inertia", PROPERTY_HINT_RANGE, "0.0, 1, 0.01"); _initial_set("editors/3d/freelook/freelook_base_speed", 5.0); diff --git a/editor/editor_spin_slider.cpp b/editor/editor_spin_slider.cpp index 4eefe844d2..1506c574dd 100644 --- a/editor/editor_spin_slider.cpp +++ b/editor/editor_spin_slider.cpp @@ -30,7 +30,7 @@ #include "editor_spin_slider.h" -#include "core/input/input_filter.h" +#include "core/input/input.h" #include "core/math/expression.h" #include "editor_node.h" #include "editor_scale.h" @@ -68,7 +68,7 @@ void EditorSpinSlider::_gui_input(const Ref<InputEvent> &p_event) { grabbing_spinner_dist_cache = 0; pre_grab_value = get_value(); grabbing_spinner = false; - grabbing_spinner_mouse_pos = InputFilter::get_singleton()->get_mouse_position(); + grabbing_spinner_mouse_pos = Input::get_singleton()->get_mouse_position(); } } else { @@ -76,8 +76,8 @@ void EditorSpinSlider::_gui_input(const Ref<InputEvent> &p_event) { if (grabbing_spinner) { - InputFilter::get_singleton()->set_mouse_mode(InputFilter::MOUSE_MODE_VISIBLE); - InputFilter::get_singleton()->warp_mouse_position(grabbing_spinner_mouse_pos); + Input::get_singleton()->set_mouse_mode(Input::MOUSE_MODE_VISIBLE); + Input::get_singleton()->warp_mouse_position(grabbing_spinner_mouse_pos); update(); } else { _focus_entered(); @@ -106,7 +106,7 @@ void EditorSpinSlider::_gui_input(const Ref<InputEvent> &p_event) { grabbing_spinner_dist_cache += diff_x; if (!grabbing_spinner && ABS(grabbing_spinner_dist_cache) > 4 * EDSCALE) { - InputFilter::get_singleton()->set_mouse_mode(InputFilter::MOUSE_MODE_CAPTURED); + Input::get_singleton()->set_mouse_mode(Input::MOUSE_MODE_CAPTURED); grabbing_spinner = true; } @@ -181,7 +181,7 @@ void EditorSpinSlider::_notification(int p_what) { p_what == NOTIFICATION_WM_FOCUS_IN || p_what == NOTIFICATION_EXIT_TREE) { if (grabbing_spinner) { - InputFilter::get_singleton()->set_mouse_mode(InputFilter::MOUSE_MODE_VISIBLE); + Input::get_singleton()->set_mouse_mode(Input::MOUSE_MODE_VISIBLE); grabbing_spinner = false; grabbing_spinner_attempt = false; } @@ -298,7 +298,7 @@ void EditorSpinSlider::_notification(int p_what) { grabber->set_position(get_global_position() + grabber_rect.position + grabber_rect.size * 0.5 - grabber->get_size() * 0.5); if (mousewheel_over_grabber) { - InputFilter::get_singleton()->warp_mouse_position(grabber->get_position() + grabber_rect.size); + Input::get_singleton()->warp_mouse_position(grabber->get_position() + grabber_rect.size); } grabber_range = width; @@ -317,7 +317,7 @@ void EditorSpinSlider::_notification(int p_what) { update(); } if (p_what == NOTIFICATION_FOCUS_ENTER) { - if ((InputFilter::get_singleton()->is_action_pressed("ui_focus_next") || InputFilter::get_singleton()->is_action_pressed("ui_focus_prev")) && !value_input_just_closed) { + if ((Input::get_singleton()->is_action_pressed("ui_focus_next") || Input::get_singleton()->is_action_pressed("ui_focus_prev")) && !value_input_just_closed) { _focus_entered(); } value_input_just_closed = false; diff --git a/editor/editor_themes.cpp b/editor/editor_themes.cpp index 663068b2b5..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); @@ -961,12 +961,14 @@ Ref<Theme> create_editor_theme(const Ref<Theme> p_theme) { theme->set_icon("grabber", "HSlider", theme->get_icon("GuiSliderGrabber", "EditorIcons")); theme->set_stylebox("slider", "HSlider", make_flat_stylebox(dark_color_3, 0, default_margin_size / 2, 0, default_margin_size / 2)); theme->set_stylebox("grabber_area", "HSlider", make_flat_stylebox(contrast_color_1, 0, default_margin_size / 2, 0, default_margin_size / 2)); + theme->set_stylebox("grabber_area_highlight", "HSlider", make_flat_stylebox(contrast_color_1, 0, default_margin_size / 2, 0, default_margin_size / 2)); // VSlider theme->set_icon("grabber", "VSlider", theme->get_icon("GuiSliderGrabber", "EditorIcons")); theme->set_icon("grabber_highlight", "VSlider", theme->get_icon("GuiSliderGrabberHl", "EditorIcons")); theme->set_stylebox("slider", "VSlider", make_flat_stylebox(dark_color_3, default_margin_size / 2, 0, default_margin_size / 2, 0)); theme->set_stylebox("grabber_area", "VSlider", make_flat_stylebox(contrast_color_1, default_margin_size / 2, 0, default_margin_size / 2, 0)); + theme->set_stylebox("grabber_area_highlight", "VSlider", make_flat_stylebox(contrast_color_1, default_margin_size / 2, 0, default_margin_size / 2, 0)); //RichTextLabel theme->set_color("default_color", "RichTextLabel", font_color); @@ -977,8 +979,6 @@ Ref<Theme> create_editor_theme(const Ref<Theme> p_theme) { theme->set_stylebox("focus", "RichTextLabel", make_empty_stylebox()); theme->set_stylebox("normal", "RichTextLabel", style_tree_bg); - theme->set_stylebox("panel", "EditorHelpBit", make_flat_stylebox(dark_color_1, 6, 4, 6, 4)); - theme->set_color("headline_color", "EditorHelp", mono_color); // Panel @@ -997,6 +997,9 @@ Ref<Theme> create_editor_theme(const Ref<Theme> p_theme) { // LinkButton theme->set_stylebox("focus", "LinkButton", style_empty); theme->set_color("font_color", "LinkButton", font_color); + theme->set_color("font_color_hover", "LinkButton", font_color_hl); + theme->set_color("font_color_pressed", "LinkButton", accent_color); + theme->set_color("font_color_disabled", "LinkButton", font_color_disabled); // TooltipPanel Ref<StyleBoxFlat> style_tooltip = style_popup->duplicate(); @@ -1121,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 @@ -1155,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; @@ -1180,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/export_template_manager.cpp b/editor/export_template_manager.cpp index 7cb18432a7..f0ee5d451f 100644 --- a/editor/export_template_manager.cpp +++ b/editor/export_template_manager.cpp @@ -30,7 +30,7 @@ #include "export_template_manager.h" -#include "core/input/input_filter.h" +#include "core/input/input.h" #include "core/io/json.h" #include "core/io/zip_io.h" #include "core/os/dir_access.h" @@ -446,7 +446,7 @@ void ExportTemplateManager::_http_download_templates_completed(int p_status, int void ExportTemplateManager::_begin_template_download(const String &p_url) { - if (InputFilter::get_singleton()->is_key_pressed(KEY_SHIFT)) { + if (Input::get_singleton()->is_key_pressed(KEY_SHIFT)) { OS::get_singleton()->shell_open(p_url); return; } diff --git a/editor/icons/AcceptDialog.svg b/editor/icons/AcceptDialog.svg index e0bf7b8336..07e54d722f 100644 --- a/editor/icons/AcceptDialog.svg +++ b/editor/icons/AcceptDialog.svg @@ -1 +1 @@ -<svg height="16" viewBox="0 0 16 16" width="16" xmlns="http://www.w3.org/2000/svg"><path d="m3 1c-1.1046 0-2 .8954-2 2v1h14v-1c0-1.1046-.89543-2-2-2zm9 1h1v1h-1zm-11 3v8c0 1.1046.89543 2 2 2h10c1.1046 0 2-.8954 2-2v-8zm9.4746 1.6367 1.4141 1.4141-4.9492 4.9492-2.8281-2.8281 1.4141-1.4141 1.4141 1.4141z" fill="#a5efac"/></svg>
\ No newline at end of file +<svg height="16" viewBox="0 0 16 16" width="16" xmlns="http://www.w3.org/2000/svg"><path d="m3 1c-1.1046 0-2 .8954-2 2v1h14v-1c0-1.1046-.89543-2-2-2zm9 1h1v1h-1zm-11 3v8c0 1.1046.89543 2 2 2h10c1.1046 0 2-.8954 2-2v-8zm9.4746 1.6367 1.4141 1.4141-4.9492 4.9492-2.8281-2.8281 1.4141-1.4141 1.4141 1.4141z" fill="#e0e0e0"/></svg>
\ No newline at end of file diff --git a/editor/icons/ConfirmationDialog.svg b/editor/icons/ConfirmationDialog.svg index d1f13fbb3b..2d6e45b51f 100644 --- a/editor/icons/ConfirmationDialog.svg +++ b/editor/icons/ConfirmationDialog.svg @@ -1 +1 @@ -<svg height="16" viewBox="0 0 16 16" width="16" xmlns="http://www.w3.org/2000/svg"><path d="m3 1c-1.1046 0-2 .8954-2 2v1h14v-1c0-1.1046-.89543-2-2-2zm9 1h1v1h-1zm-11 3v8c0 1.1046.89543 2 2 2h10c1.1046 0 2-.8954 2-2v-8zm6.9863 1.002c.34689-.0022844.6986.055762 1.0391.17969 1.3618.4956 2.1813 1.9126 1.9297 3.3398-.19105 1.0835-.96172 1.9461-1.9551 2.3008v.17773h-1-1v-.8418a1.0001 1.0001 0 0 1 1-1.1582c.49193 0 .89895-.34177.98438-.82617.085424-.4845-.18031-.94508-.64258-1.1133-.46227-.1683-.96106.013453-1.207.43945a1.0002 1.0002 0 0 1 -1.7324-1c.54346-.94148 1.5433-1.4912 2.584-1.498zm-.98633 6.998h2v1h-2z" fill="#a5efac"/></svg>
\ No newline at end of file +<svg height="16" viewBox="0 0 16 16" width="16" xmlns="http://www.w3.org/2000/svg"><path d="m3 1c-1.1046 0-2 .8954-2 2v1h14v-1c0-1.1046-.89543-2-2-2zm9 1h1v1h-1zm-11 3v8c0 1.1046.89543 2 2 2h10c1.1046 0 2-.8954 2-2v-8zm6.9863 1.002c.34689-.0022844.6986.055762 1.0391.17969 1.3618.4956 2.1813 1.9126 1.9297 3.3398-.19105 1.0835-.96172 1.9461-1.9551 2.3008v.17773h-1-1v-.8418a1.0001 1.0001 0 0 1 1-1.1582c.49193 0 .89895-.34177.98438-.82617.085424-.4845-.18031-.94508-.64258-1.1133-.46227-.1683-.96106.013453-1.207.43945a1.0002 1.0002 0 0 1 -1.7324-1c.54346-.94148 1.5433-1.4912 2.584-1.498zm-.98633 6.998h2v1h-2z" fill="#e0e0e0"/></svg>
\ No newline at end of file diff --git a/editor/icons/Decal.svg b/editor/icons/Decal.svg new file mode 100644 index 0000000000..fc7bfb8e2c --- /dev/null +++ b/editor/icons/Decal.svg @@ -0,0 +1 @@ +<svg height="16" viewBox="0 0 16 16" width="16" xmlns="http://www.w3.org/2000/svg"><path d="m8 2c-3.3137085 0-6 2.6862915-6 6 0 2.220299 1.2092804 4.153789 3.0019531 5.191406l8.9082029-6.1894529c-.476307-2.8374399-2.937354-5.0019531-5.910156-5.0019531z" fill="#fc9c9c"/><path d="m5.001954 13.191406 8.908202-6.1894529c-.882819-.510985-1.904638-.808594-2.998046-.808594-3.3137079 0-6 2.686292-6 5.9999999 0 .340906.03522.672663.08984.998047z" fill="#ff5d5d"/><path d="m13.910156 7.0019531-8.908202 6.1894529c.882819.510985 1.904638.808594 2.998046.808594 3.313708 0 6-2.686292 6-5.9999999 0-.340906-.03522-.672663-.08984-.998047z" fill="#fc9c9c" fill-opacity=".392157"/></svg>
\ No newline at end of file diff --git a/editor/icons/PopupDialog.svg b/editor/icons/EditorFileDialog.svg index d871e56a63..95906234ab 100644 --- a/editor/icons/PopupDialog.svg +++ b/editor/icons/EditorFileDialog.svg @@ -1 +1 @@ -<svg height="16" viewBox="0 0 16 16" width="16" xmlns="http://www.w3.org/2000/svg"><path d="m3 1c-1.1046 0-2 .8954-2 2v1h14v-1c0-1.1046-.89543-2-2-2zm9 1h1v1h-1zm-11 3v8c0 1.1046.89543 2 2 2h10c1.1046 0 2-.8954 2-2v-8zm6 1h2v5h-2zm0 6h2v2h-2z" fill="#a5efac"/></svg>
\ No newline at end of file +<svg height="16" viewBox="0 0 16 16" width="16" xmlns="http://www.w3.org/2000/svg"><path d="m3 1c-1.1046 0-2 .8954-2 2v1h14v-1c0-1.1046-.89543-2-2-2zm9 1h1v1h-1zm-11 3v8c0 1.1046.89543 2 2 2h10c1.1046 0 2-.8954 2-2v-8zm3 2h3c1 0 1 2 2 2h3v4h-8z" fill="#e0e0e0"/></svg>
\ No newline at end of file diff --git a/editor/icons/FileDialog.svg b/editor/icons/FileDialog.svg index 7708659c21..95906234ab 100644 --- a/editor/icons/FileDialog.svg +++ b/editor/icons/FileDialog.svg @@ -1 +1 @@ -<svg height="16" viewBox="0 0 16 16" width="16" xmlns="http://www.w3.org/2000/svg"><path d="m3 1c-1.1046 0-2 .8954-2 2v1h14v-1c0-1.1046-.89543-2-2-2zm9 1h1v1h-1zm-11 3v8c0 1.1046.89543 2 2 2h10c1.1046 0 2-.8954 2-2v-8zm3 2h3c1 0 1 2 2 2h3v4h-8z" fill="#a5efac"/></svg>
\ No newline at end of file +<svg height="16" viewBox="0 0 16 16" width="16" xmlns="http://www.w3.org/2000/svg"><path d="m3 1c-1.1046 0-2 .8954-2 2v1h14v-1c0-1.1046-.89543-2-2-2zm9 1h1v1h-1zm-11 3v8c0 1.1046.89543 2 2 2h10c1.1046 0 2-.8954 2-2v-8zm3 2h3c1 0 1 2 2 2h3v4h-8z" fill="#e0e0e0"/></svg>
\ No newline at end of file diff --git a/editor/icons/Popup.svg b/editor/icons/Popup.svg index 93f7e5000d..a497b7a7fc 100644 --- a/editor/icons/Popup.svg +++ b/editor/icons/Popup.svg @@ -1 +1 @@ -<svg height="16" viewBox="0 0 16 16" width="16" xmlns="http://www.w3.org/2000/svg"><path d="m3 1c-1.1046 0-2 .89543-2 2v10c0 1.1046.89543 2 2 2h10c1.1046 0 2-.89543 2-2v-10c0-1.1046-.89543-2-2-2zm4 2h2v6h-2zm0 8h2v2h-2z" fill="#a5efac"/></svg>
\ No newline at end of file +<svg height="16" viewBox="0 0 16 16" width="16" xmlns="http://www.w3.org/2000/svg"><path d="m3 1c-1.1046 0-2 .89543-2 2v10c0 1.1046.89543 2 2 2h10c1.1046 0 2-.89543 2-2v-10c0-1.1046-.89543-2-2-2zm4 2h2v6h-2zm0 8h2v2h-2z" fill="#e0e0e0"/></svg>
\ No newline at end of file diff --git a/editor/icons/PopupMenu.svg b/editor/icons/PopupMenu.svg index dd7b2bb0fd..ebf62208e0 100644 --- a/editor/icons/PopupMenu.svg +++ b/editor/icons/PopupMenu.svg @@ -1 +1 @@ -<svg height="16" viewBox="0 0 16 16" width="16" xmlns="http://www.w3.org/2000/svg"><path d="m1 1v4h6v-4zm1 1h4l-2 2zm0 4a1 1 0 0 0 -1 1v7a1 1 0 0 0 1 1h12a1 1 0 0 0 1-1v-7a1 1 0 0 0 -1-1zm1 2h10v2h-10zm0 3h10v2h-10z" fill="#a5efac"/></svg>
\ No newline at end of file +<svg height="16" viewBox="0 0 16 16" width="16" xmlns="http://www.w3.org/2000/svg"><path d="m1 1v4h6v-4zm1 1h4l-2 2zm0 4a1 1 0 0 0 -1 1v7a1 1 0 0 0 1 1h12a1 1 0 0 0 1-1v-7a1 1 0 0 0 -1-1zm1 2h10v2h-10zm0 3h10v2h-10z" fill="#e0e0e0"/></svg>
\ No newline at end of file diff --git a/editor/icons/PopupPanel.svg b/editor/icons/PopupPanel.svg index 47a5448f5b..b45a3c9c3c 100644 --- a/editor/icons/PopupPanel.svg +++ b/editor/icons/PopupPanel.svg @@ -1 +1 @@ -<svg height="16" viewBox="0 0 16 16" width="16" xmlns="http://www.w3.org/2000/svg"><path d="m1 1v4h6v-4zm1 1h4l-2 2zm0 4c-.55228 0-1 .44772-1 1v7c0 .55228.44772 1 1 1h12c.55228 0 1-.44772 1-1v-7c0-.55228-.44772-1-1-1z" fill="#a5efac"/></svg>
\ No newline at end of file +<svg height="16" viewBox="0 0 16 16" width="16" xmlns="http://www.w3.org/2000/svg"><path d="m1 1v4h6v-4zm1 1h4l-2 2zm0 4c-.55228 0-1 .44772-1 1v7c0 .55228.44772 1 1 1h12c.55228 0 1-.44772 1-1v-7c0-.55228-.44772-1-1-1z" fill="#e0e0e0"/></svg>
\ No newline at end of file diff --git a/editor/icons/ScriptCreateDialog.svg b/editor/icons/ScriptCreateDialog.svg index 751b799ba9..78a69c5e59 100644 --- a/editor/icons/ScriptCreateDialog.svg +++ b/editor/icons/ScriptCreateDialog.svg @@ -1 +1 @@ -<svg height="17.067" viewBox="0 0 16 16" width="17.067" xmlns="http://www.w3.org/2000/svg"><g transform="translate(0 -1036.4)"><path d="m6 1v1c-.55228 0-1 .44772-1 1v10h-1v-2h-2v2c.0002826.35698.19084.68674.5.86523.15194.088045.32439.13452.5.13477v1h6v-5l3-2v-3h3v-2c0-1.1046-.89543-2-2-2z" fill="#a5efac" transform="translate(0 1036.4)"/><path d="m6 1c-1.1046 0-2 .89543-2 2v7h-3v3c0 1.1046.89543 2 2 2s2-.89543 2-2v-10c0-.55228.44772-1 1-1s1 .44772 1 1v3h5v-1h-4v-2c0-1.1046-.89543-2-2-2zm-4 10h2v2c0 .55228-.44772 1-1 1s-1-.44772-1-1z" fill="#87e29f" transform="translate(0 1036.4)"/><circle cx="3" cy="1048.4" fill="#e0e0e0" r="0"/><g fill="#87e29f"><ellipse cx="12" cy="1048.4" rx=".5" ry="3"/><ellipse cx="913.91" cy="513.79" rx=".5" ry="3" transform="matrix(.5 .8660254 -.8660254 .5 0 0)"/><ellipse cx="901.91" cy="-534.57" rx=".5" ry="3" transform="matrix(-.5 .8660254 -.8660254 -.5 0 0)"/></g></g></svg>
\ No newline at end of file +<svg height="16" viewBox="0 0 16 16" width="16" xmlns="http://www.w3.org/2000/svg"><g fill="#e0e0e0"><path d="m3 1c-1.1046 0-2 .8954-2 2v1h14v-1c0-1.1046-.89543-2-2-2zm9 1h1v1h-1zm-11 3v8c0 1.1046.89543 2 2 2h10c1.1046 0 2-.8954 2-2v-8zm5.5722656 1h3.9980464a1.1426143 1.1426143 0 0 1 1.142579 1.1425781v1.1425781h-1.712891-2.2851562v-.5703124-.5722657c0-.6310659-.5115295-1.1425781-1.1425782-1.1425781zm0 .5722656c.3155215 0 .5703125.254791.5703125.5703125v.5722657.5703124.5722657h.5722657 2.2851562v3.9980471a1.1426143 1.1426143 0 0 1 -1.1425781 1.142578h-4c.6310487 0 1.1425781-.511529 1.1425781-1.142578v-5.7128909c0-.0785019.01823-.1545692.046875-.2226562v-.0019531c.02868-.0672829.0683226-.1266374.1191406-.1777344.00097-.00096.0029352-.0010048.0039063-.0019532.0513303-.0508898.1121075-.0944618.1796875-.1230468.0683505-.028909.1437752-.0429688.2226562-.0429688zm-2.2851562 5.1406254h1.1425781v1.142578c0 .315522-.2567441.572265-.5722656.572265-.0776611 0-.15125-.016852-.21875-.044922-.00206-.000799-.0038594-.003049-.0058594-.003906-.0656506-.028192-.1236101-.067817-.1738281-.117187a.57130715.57130715 0 0 1 -.0097656-.009766c-.0490902-.050487-.0893425-.107988-.1171876-.173828-.028908-.06835-.0449218-.143776-.0449218-.222656z"/><circle cx="-23.915255" cy="3.118624" r="0"/></g></svg>
\ No newline at end of file diff --git a/editor/icons/WindowDialog.svg b/editor/icons/Window.svg index 3c7be2a58d..a02a86d56a 100644 --- a/editor/icons/WindowDialog.svg +++ b/editor/icons/Window.svg @@ -1 +1 @@ -<svg height="16" viewBox="0 0 16 16" width="16" xmlns="http://www.w3.org/2000/svg"><path d="m3 1c-1.1046 0-2 .8954-2 2v1h14v-1c0-1.1046-.89543-2-2-2zm9 1h1v1h-1zm-11 3v8c0 1.1046.89543 2 2 2h10c1.1046 0 2-.8954 2-2v-8z" fill="#a5efac"/></svg>
\ No newline at end of file +<svg height="16" viewBox="0 0 16 16" width="16" xmlns="http://www.w3.org/2000/svg"><path d="m3 1c-1.1046 0-2 .8954-2 2v1h14v-1c0-1.1046-.89543-2-2-2zm9 1h1v1h-1zm-11 3v8c0 1.1046.89543 2 2 2h10c1.1046 0 2-.8954 2-2v-8z" fill="#e0e0e0"/></svg>
\ No newline at end of file diff --git a/editor/icons/ARVRAnchor.svg b/editor/icons/XRAnchor3D.svg index f1571b3fcc..f1571b3fcc 100644 --- a/editor/icons/ARVRAnchor.svg +++ b/editor/icons/XRAnchor3D.svg diff --git a/editor/icons/ARVRCamera.svg b/editor/icons/XRCamera3D.svg index f59a8c8b4a..f59a8c8b4a 100644 --- a/editor/icons/ARVRCamera.svg +++ b/editor/icons/XRCamera3D.svg diff --git a/editor/icons/ARVRController.svg b/editor/icons/XRController3D.svg index 40e5b8dce1..40e5b8dce1 100644 --- a/editor/icons/ARVRController.svg +++ b/editor/icons/XRController3D.svg diff --git a/editor/icons/ARVROrigin.svg b/editor/icons/XROrigin3D.svg index dbb93ba7a5..dbb93ba7a5 100644 --- a/editor/icons/ARVROrigin.svg +++ b/editor/icons/XROrigin3D.svg diff --git a/editor/import/editor_scene_importer_gltf.cpp b/editor/import/editor_scene_importer_gltf.cpp index 6ad2aa4142..45e376a2aa 100644 --- a/editor/import/editor_scene_importer_gltf.cpp +++ b/editor/import/editor_scene_importer_gltf.cpp @@ -1075,24 +1075,15 @@ Error EditorSceneImporterGLTF::_parse_meshes(GLTFState &state) { array[Mesh::ARRAY_INDEX] = indices; } - bool generated_tangents = false; - Variant erased_indices; + bool generate_tangents = (primitive == Mesh::PRIMITIVE_TRIANGLES && !a.has("TANGENT") && a.has("TEXCOORD_0") && a.has("NORMAL")); - if (primitive == Mesh::PRIMITIVE_TRIANGLES && !a.has("TANGENT") && a.has("TEXCOORD_0") && a.has("NORMAL")) { + if (generate_tangents) { //must generate mikktspace tangents.. ergh.. Ref<SurfaceTool> st; st.instance(); st->create_from_triangle_arrays(array); - if (!p.has("targets")) { - //morph targets should not be reindexed, as array size might differ - //removing indices is the best bet here - st->deindex(); - erased_indices = a[Mesh::ARRAY_INDEX]; - a[Mesh::ARRAY_INDEX] = Variant(); - } st->generate_tangents(); array = st->commit_to_arrays(); - generated_tangents = true; } Array morphs; @@ -1207,10 +1198,9 @@ Error EditorSceneImporterGLTF::_parse_meshes(GLTFState &state) { array_copy[Mesh::ARRAY_TANGENT] = tangents_v4; } - if (generated_tangents) { + if (generate_tangents) { Ref<SurfaceTool> st; st.instance(); - array_copy[Mesh::ARRAY_INDEX] = erased_indices; //needed for tangent generation, erased by deindex st->create_from_triangle_arrays(array_copy); st->deindex(); st->generate_tangents(); diff --git a/editor/import/resource_importer_scene.cpp b/editor/import/resource_importer_scene.cpp index b5766a48a0..239fae2268 100644 --- a/editor/import/resource_importer_scene.cpp +++ b/editor/import/resource_importer_scene.cpp @@ -1429,29 +1429,110 @@ Error ResourceImporterScene::import(const String &p_source_file, const String &p Map<Ref<ArrayMesh>, Transform> meshes; _find_meshes(scene, meshes); - if (light_bake_mode == 2) { + String file_id = src_path.get_file(); + String cache_file_path = base_path.plus_file(file_id + ".unwrap_cache"); - float texel_size = p_options["meshes/lightmap_texel_size"]; - texel_size = MAX(0.001, texel_size); + Vector<unsigned char> cache_data; - EditorProgress progress2("gen_lightmaps", TTR("Generating Lightmaps"), meshes.size()); - int step = 0; - for (Map<Ref<ArrayMesh>, Transform>::Element *E = meshes.front(); E; E = E->next()) { + if (FileAccess::exists(cache_file_path)) { + Error err2; + FileAccess *file = FileAccess::open(cache_file_path, FileAccess::READ, &err2); - Ref<ArrayMesh> mesh = E->key(); - String name = mesh->get_name(); - if (name == "") { //should not happen but.. - name = "Mesh " + itos(step); + if (err2) { + if (file) + memdelete(file); + } else { + int cache_size = file->get_len(); + cache_data.resize(cache_size); + file->get_buffer(cache_data.ptrw(), cache_size); + } + } + + float texel_size = p_options["meshes/lightmap_texel_size"]; + texel_size = MAX(0.001, texel_size); + + Map<String, unsigned int> used_unwraps; + + EditorProgress progress2("gen_lightmaps", TTR("Generating Lightmaps"), meshes.size()); + int step = 0; + for (Map<Ref<ArrayMesh>, Transform>::Element *E = meshes.front(); E; E = E->next()) { + + Ref<ArrayMesh> mesh = E->key(); + String name = mesh->get_name(); + if (name == "") { //should not happen but.. + name = "Mesh " + itos(step); + } + + progress2.step(TTR("Generating for Mesh: ") + name + " (" + itos(step) + "/" + itos(meshes.size()) + ")", step); + + int *ret_cache_data = (int *)cache_data.ptrw(); + unsigned int ret_cache_size = cache_data.size(); + bool ret_used_cache = true; // Tell the unwrapper to use the cache + Error err2 = mesh->lightmap_unwrap_cached(ret_cache_data, ret_cache_size, ret_used_cache, E->get(), texel_size); + + if (err2 != OK) { + EditorNode::add_io_error("Mesh '" + name + "' failed lightmap generation. Please fix geometry."); + } else { + + String hash = String::md5((unsigned char *)ret_cache_data); + used_unwraps.insert(hash, ret_cache_size); + + if (!ret_used_cache) { + // Cache was not used, add the generated entry to the current cache + if (cache_data.empty()) { + cache_data.resize(4 + ret_cache_size); + int *data = (int *)cache_data.ptrw(); + data[0] = 1; + memcpy(&data[1], ret_cache_data, ret_cache_size); + } else { + int current_size = cache_data.size(); + cache_data.resize(cache_data.size() + ret_cache_size); + unsigned char *ptrw = cache_data.ptrw(); + memcpy(&ptrw[current_size], ret_cache_data, ret_cache_size); + int *data = (int *)ptrw; + data[0] += 1; + } } + } + step++; + } - progress2.step(TTR("Generating for Mesh: ") + name + " (" + itos(step) + "/" + itos(meshes.size()) + ")", step); + Error err2; + FileAccess *file = FileAccess::open(cache_file_path, FileAccess::WRITE, &err2); - Error err2 = mesh->lightmap_unwrap(E->get(), texel_size); - if (err2 != OK) { - EditorNode::add_io_error("Mesh '" + name + "' failed lightmap generation. Please fix geometry."); + if (err2) { + if (file) + memdelete(file); + } else { + + // Store number of entries + file->store_32(used_unwraps.size()); + + // Store cache entries + const int *cache = (int *)cache_data.ptr(); + unsigned int r_idx = 1; + for (int i = 0; i < cache[0]; ++i) { + unsigned char *entry_start = (unsigned char *)&cache[r_idx]; + String entry_hash = String::md5(entry_start); + if (used_unwraps.has(entry_hash)) { + unsigned int entry_size = used_unwraps[entry_hash]; + file->store_buffer(entry_start, entry_size); } - step++; + + r_idx += 4; // hash + r_idx += 2; // size hint + + int vertex_count = cache[r_idx]; + r_idx += 1; // vertex count + r_idx += vertex_count; // vertex + r_idx += vertex_count * 2; // uvs + + int index_count = cache[r_idx]; + r_idx += 1; // index count + r_idx += index_count; // indices } + + file->close(); } } diff --git a/editor/import/resource_importer_shader_file.cpp b/editor/import/resource_importer_shader_file.cpp new file mode 100644 index 0000000000..a2f178de12 --- /dev/null +++ b/editor/import/resource_importer_shader_file.cpp @@ -0,0 +1,90 @@ +#include "resource_importer_shader_file.h" + +#include "core/io/marshalls.h" +#include "core/io/resource_saver.h" +#include "core/os/file_access.h" +#include "editor/editor_node.h" +#include "editor/plugins/shader_file_editor_plugin.h" +#include "servers/rendering/rendering_device_binds.h" + +String ResourceImporterShaderFile::get_importer_name() const { + + return "glsl"; +} + +String ResourceImporterShaderFile::get_visible_name() const { + + return "GLSL Shader File"; +} +void ResourceImporterShaderFile::get_recognized_extensions(List<String> *p_extensions) const { + + p_extensions->push_back("glsl"); +} +String ResourceImporterShaderFile::get_save_extension() const { + return "res"; +} + +String ResourceImporterShaderFile::get_resource_type() const { + + return "RDShaderFile"; +} + +int ResourceImporterShaderFile::get_preset_count() const { + return 0; +} +String ResourceImporterShaderFile::get_preset_name(int p_idx) const { + + return String(); +} + +void ResourceImporterShaderFile::get_import_options(List<ImportOption> *r_options, int p_preset) const { +} + +bool ResourceImporterShaderFile::get_option_visibility(const String &p_option, const Map<StringName, Variant> &p_options) const { + return true; +} +static String _include_function(const String &p_path, void *userpointer) { + Error err; + + String *base_path = (String *)userpointer; + + String include = p_path; + if (include.is_rel_path()) { + include = base_path->plus_file(include); + } + + FileAccessRef file_inc = FileAccess::open(include, FileAccess::READ, &err); + if (err != OK) { + return String(); + } + return file_inc->get_as_utf8_string(); +} + +Error ResourceImporterShaderFile::import(const String &p_source_file, const String &p_save_path, const Map<StringName, Variant> &p_options, List<String> *r_platform_variants, List<String> *r_gen_files, Variant *r_metadata) { + + /* STEP 1, Read shader code */ + + Error err; + FileAccessRef file = FileAccess::open(p_source_file, FileAccess::READ, &err); + ERR_FAIL_COND_V(err != OK, ERR_CANT_OPEN); + ERR_FAIL_COND_V(!file.operator->(), ERR_CANT_OPEN); + + String file_txt = file->get_as_utf8_string(); + Ref<RDShaderFile> shader_file; + shader_file.instance(); + String base_path = p_source_file.get_base_dir(); + err = shader_file->parse_versions_from_text(file_txt, _include_function, &base_path); + + if (err != OK) { + if (!ShaderFileEditor::singleton->is_visible_in_tree()) { + EditorNode::get_singleton()->add_io_error(vformat(TTR("Error importing GLSL shader file: '%s'. Open the file in the filesystem dock in order to see the reason."), p_source_file)); + } + } + + ResourceSaver::save(p_save_path + ".res", shader_file); + + return OK; +} + +ResourceImporterShaderFile::ResourceImporterShaderFile() { +} diff --git a/editor/import/resource_importer_shader_file.h b/editor/import/resource_importer_shader_file.h new file mode 100644 index 0000000000..f6b50bee9e --- /dev/null +++ b/editor/import/resource_importer_shader_file.h @@ -0,0 +1,27 @@ +#ifndef RESOURCE_IMPORTER_SHADER_FILE_H +#define RESOURCE_IMPORTER_SHADER_FILE_H + +#include "core/io/resource_importer.h" + +class ResourceImporterShaderFile : public ResourceImporter { + GDCLASS(ResourceImporterShaderFile, ResourceImporter); + +public: + virtual String get_importer_name() const; + virtual String get_visible_name() const; + virtual void get_recognized_extensions(List<String> *p_extensions) const; + virtual String get_save_extension() const; + virtual String get_resource_type() const; + + virtual int get_preset_count() const; + virtual String get_preset_name(int p_idx) const; + + virtual void get_import_options(List<ImportOption> *r_options, int p_preset = 0) const; + virtual bool get_option_visibility(const String &p_option, const Map<StringName, Variant> &p_options) const; + + virtual Error import(const String &p_source_file, const String &p_save_path, const Map<StringName, Variant> &p_options, List<String> *r_platform_variants, List<String> *r_gen_files = nullptr, Variant *r_metadata = nullptr); + + ResourceImporterShaderFile(); +}; + +#endif // RESOURCE_IMPORTER_SHADER_FILE_H diff --git a/editor/import_dock.cpp b/editor/import_dock.cpp index 23be42aaea..22f6aedeaa 100644 --- a/editor/import_dock.cpp +++ b/editor/import_dock.cpp @@ -450,8 +450,8 @@ void ImportDock::_reimport() { String importer_name = params->importer->get_importer_name(); - if (params->checking) { - //update only what edited (checkboxes) + if (params->checking && config->get_value("remap", "importer") == params->importer->get_importer_name()) { + //update only what is edited (checkboxes) if the importer is the same for (List<PropertyInfo>::Element *E = params->properties.front(); E; E = E->next()) { if (params->checked.has(E->get().name)) { config->set_value("params", E->get().name, params->values[E->get().name]); @@ -558,7 +558,7 @@ ImportDock::ImportDock() { hb->add_spacer(); reimport_confirm = memnew(ConfirmationDialog); - reimport_confirm->get_ok()->set_text(TTR("Save scenes, re-import and restart")); + reimport_confirm->get_ok()->set_text(TTR("Save Scenes, Re-Import, and Restart")); add_child(reimport_confirm); reimport_confirm->connect("confirmed", callable_mp(this, &ImportDock::_reimport_and_restart)); diff --git a/editor/node_3d_editor_gizmos.cpp b/editor/node_3d_editor_gizmos.cpp index ab43e45af7..5fcc783644 100644 --- a/editor/node_3d_editor_gizmos.cpp +++ b/editor/node_3d_editor_gizmos.cpp @@ -37,6 +37,7 @@ #include "scene/3d/collision_polygon_3d.h" #include "scene/3d/collision_shape_3d.h" #include "scene/3d/cpu_particles_3d.h" +#include "scene/3d/decal.h" #include "scene/3d/gi_probe.h" #include "scene/3d/gpu_particles_3d.h" #include "scene/3d/light_3d.h" @@ -485,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; } } @@ -796,7 +798,7 @@ Vector3 EditorNode3DGizmo::get_handle_pos(int p_idx) const { //// light gizmo -LightNode3DGizmoPlugin::LightNode3DGizmoPlugin() { +Light3DGizmoPlugin::Light3DGizmoPlugin() { // Enable vertex colors for the materials below as the gizmo color depends on the light color. create_material("lines_primary", Color(1, 1, 1), false, false, true); @@ -811,19 +813,19 @@ LightNode3DGizmoPlugin::LightNode3DGizmoPlugin() { create_handle_material("handles_billboard", true); } -bool LightNode3DGizmoPlugin::has_gizmo(Node3D *p_spatial) { +bool Light3DGizmoPlugin::has_gizmo(Node3D *p_spatial) { return Object::cast_to<Light3D>(p_spatial) != nullptr; } -String LightNode3DGizmoPlugin::get_name() const { - return "Lights"; +String Light3DGizmoPlugin::get_name() const { + return "Light3D"; } -int LightNode3DGizmoPlugin::get_priority() const { +int Light3DGizmoPlugin::get_priority() const { return -1; } -String LightNode3DGizmoPlugin::get_handle_name(const EditorNode3DGizmo *p_gizmo, int p_idx) const { +String Light3DGizmoPlugin::get_handle_name(const EditorNode3DGizmo *p_gizmo, int p_idx) const { if (p_idx == 0) return "Radius"; @@ -831,7 +833,7 @@ String LightNode3DGizmoPlugin::get_handle_name(const EditorNode3DGizmo *p_gizmo, return "Aperture"; } -Variant LightNode3DGizmoPlugin::get_handle_value(EditorNode3DGizmo *p_gizmo, int p_idx) const { +Variant Light3DGizmoPlugin::get_handle_value(EditorNode3DGizmo *p_gizmo, int p_idx) const { Light3D *light = Object::cast_to<Light3D>(p_gizmo->get_spatial_node()); if (p_idx == 0) @@ -871,7 +873,7 @@ static float _find_closest_angle_to_half_pi_arc(const Vector3 &p_from, const Vec return a * 180.0 / Math_PI; } -void LightNode3DGizmoPlugin::set_handle(EditorNode3DGizmo *p_gizmo, int p_idx, Camera3D *p_camera, const Point2 &p_point) { +void Light3DGizmoPlugin::set_handle(EditorNode3DGizmo *p_gizmo, int p_idx, Camera3D *p_camera, const Point2 &p_point) { Light3D *light = Object::cast_to<Light3D>(p_gizmo->get_spatial_node()); Transform gt = light->get_global_transform(); @@ -919,7 +921,7 @@ void LightNode3DGizmoPlugin::set_handle(EditorNode3DGizmo *p_gizmo, int p_idx, C } } -void LightNode3DGizmoPlugin::commit_handle(EditorNode3DGizmo *p_gizmo, int p_idx, const Variant &p_restore, bool p_cancel) { +void Light3DGizmoPlugin::commit_handle(EditorNode3DGizmo *p_gizmo, int p_idx, const Variant &p_restore, bool p_cancel) { Light3D *light = Object::cast_to<Light3D>(p_gizmo->get_spatial_node()); if (p_cancel) { @@ -943,7 +945,7 @@ void LightNode3DGizmoPlugin::commit_handle(EditorNode3DGizmo *p_gizmo, int p_idx } } -void LightNode3DGizmoPlugin::redraw(EditorNode3DGizmo *p_gizmo) { +void Light3DGizmoPlugin::redraw(EditorNode3DGizmo *p_gizmo) { Light3D *light = Object::cast_to<Light3D>(p_gizmo->get_spatial_node()); @@ -1086,7 +1088,7 @@ void LightNode3DGizmoPlugin::redraw(EditorNode3DGizmo *p_gizmo) { ////// //// player gizmo -AudioStreamPlayer3DNode3DGizmoPlugin::AudioStreamPlayer3DNode3DGizmoPlugin() { +AudioStreamPlayer3DGizmoPlugin::AudioStreamPlayer3DGizmoPlugin() { Color gizmo_color = EDITOR_DEF("editors/3d_gizmos/gizmo_colors/stream_player_3d", Color(0.4, 0.8, 1)); @@ -1096,29 +1098,29 @@ AudioStreamPlayer3DNode3DGizmoPlugin::AudioStreamPlayer3DNode3DGizmoPlugin() { create_handle_material("handles"); } -bool AudioStreamPlayer3DNode3DGizmoPlugin::has_gizmo(Node3D *p_spatial) { +bool AudioStreamPlayer3DGizmoPlugin::has_gizmo(Node3D *p_spatial) { return Object::cast_to<AudioStreamPlayer3D>(p_spatial) != nullptr; } -String AudioStreamPlayer3DNode3DGizmoPlugin::get_name() const { +String AudioStreamPlayer3DGizmoPlugin::get_name() const { return "AudioStreamPlayer3D"; } -int AudioStreamPlayer3DNode3DGizmoPlugin::get_priority() const { +int AudioStreamPlayer3DGizmoPlugin::get_priority() const { return -1; } -String AudioStreamPlayer3DNode3DGizmoPlugin::get_handle_name(const EditorNode3DGizmo *p_gizmo, int p_idx) const { +String AudioStreamPlayer3DGizmoPlugin::get_handle_name(const EditorNode3DGizmo *p_gizmo, int p_idx) const { return "Emission Radius"; } -Variant AudioStreamPlayer3DNode3DGizmoPlugin::get_handle_value(EditorNode3DGizmo *p_gizmo, int p_idx) const { +Variant AudioStreamPlayer3DGizmoPlugin::get_handle_value(EditorNode3DGizmo *p_gizmo, int p_idx) const { AudioStreamPlayer3D *player = Object::cast_to<AudioStreamPlayer3D>(p_gizmo->get_spatial_node()); return player->get_emission_angle(); } -void AudioStreamPlayer3DNode3DGizmoPlugin::set_handle(EditorNode3DGizmo *p_gizmo, int p_idx, Camera3D *p_camera, const Point2 &p_point) { +void AudioStreamPlayer3DGizmoPlugin::set_handle(EditorNode3DGizmo *p_gizmo, int p_idx, Camera3D *p_camera, const Point2 &p_point) { AudioStreamPlayer3D *player = Object::cast_to<AudioStreamPlayer3D>(p_gizmo->get_spatial_node()); @@ -1157,7 +1159,7 @@ void AudioStreamPlayer3DNode3DGizmoPlugin::set_handle(EditorNode3DGizmo *p_gizmo } } -void AudioStreamPlayer3DNode3DGizmoPlugin::commit_handle(EditorNode3DGizmo *p_gizmo, int p_idx, const Variant &p_restore, bool p_cancel) { +void AudioStreamPlayer3DGizmoPlugin::commit_handle(EditorNode3DGizmo *p_gizmo, int p_idx, const Variant &p_restore, bool p_cancel) { AudioStreamPlayer3D *player = Object::cast_to<AudioStreamPlayer3D>(p_gizmo->get_spatial_node()); @@ -1175,7 +1177,7 @@ void AudioStreamPlayer3DNode3DGizmoPlugin::commit_handle(EditorNode3DGizmo *p_gi } } -void AudioStreamPlayer3DNode3DGizmoPlugin::redraw(EditorNode3DGizmo *p_gizmo) { +void AudioStreamPlayer3DGizmoPlugin::redraw(EditorNode3DGizmo *p_gizmo) { const AudioStreamPlayer3D *player = Object::cast_to<AudioStreamPlayer3D>(p_gizmo->get_spatial_node()); @@ -1233,7 +1235,7 @@ void AudioStreamPlayer3DNode3DGizmoPlugin::redraw(EditorNode3DGizmo *p_gizmo) { ////// -CameraNode3DGizmoPlugin::CameraNode3DGizmoPlugin() { +Camera3DGizmoPlugin::Camera3DGizmoPlugin() { Color gizmo_color = EDITOR_DEF("editors/3d_gizmos/gizmo_colors/camera", Color(0.8, 0.4, 0.8)); @@ -1241,19 +1243,19 @@ CameraNode3DGizmoPlugin::CameraNode3DGizmoPlugin() { create_handle_material("handles"); } -bool CameraNode3DGizmoPlugin::has_gizmo(Node3D *p_spatial) { +bool Camera3DGizmoPlugin::has_gizmo(Node3D *p_spatial) { return Object::cast_to<Camera3D>(p_spatial) != nullptr; } -String CameraNode3DGizmoPlugin::get_name() const { +String Camera3DGizmoPlugin::get_name() const { return "Camera3D"; } -int CameraNode3DGizmoPlugin::get_priority() const { +int Camera3DGizmoPlugin::get_priority() const { return -1; } -String CameraNode3DGizmoPlugin::get_handle_name(const EditorNode3DGizmo *p_gizmo, int p_idx) const { +String Camera3DGizmoPlugin::get_handle_name(const EditorNode3DGizmo *p_gizmo, int p_idx) const { Camera3D *camera = Object::cast_to<Camera3D>(p_gizmo->get_spatial_node()); @@ -1264,7 +1266,7 @@ String CameraNode3DGizmoPlugin::get_handle_name(const EditorNode3DGizmo *p_gizmo } } -Variant CameraNode3DGizmoPlugin::get_handle_value(EditorNode3DGizmo *p_gizmo, int p_idx) const { +Variant Camera3DGizmoPlugin::get_handle_value(EditorNode3DGizmo *p_gizmo, int p_idx) const { Camera3D *camera = Object::cast_to<Camera3D>(p_gizmo->get_spatial_node()); @@ -1276,7 +1278,7 @@ Variant CameraNode3DGizmoPlugin::get_handle_value(EditorNode3DGizmo *p_gizmo, in } } -void CameraNode3DGizmoPlugin::set_handle(EditorNode3DGizmo *p_gizmo, int p_idx, Camera3D *p_camera, const Point2 &p_point) { +void Camera3DGizmoPlugin::set_handle(EditorNode3DGizmo *p_gizmo, int p_idx, Camera3D *p_camera, const Point2 &p_point) { Camera3D *camera = Object::cast_to<Camera3D>(p_gizmo->get_spatial_node()); @@ -1307,7 +1309,7 @@ void CameraNode3DGizmoPlugin::set_handle(EditorNode3DGizmo *p_gizmo, int p_idx, } } -void CameraNode3DGizmoPlugin::commit_handle(EditorNode3DGizmo *p_gizmo, int p_idx, const Variant &p_restore, bool p_cancel) { +void Camera3DGizmoPlugin::commit_handle(EditorNode3DGizmo *p_gizmo, int p_idx, const Variant &p_restore, bool p_cancel) { Camera3D *camera = Object::cast_to<Camera3D>(p_gizmo->get_spatial_node()); @@ -1339,7 +1341,7 @@ void CameraNode3DGizmoPlugin::commit_handle(EditorNode3DGizmo *p_gizmo, int p_id } } -void CameraNode3DGizmoPlugin::redraw(EditorNode3DGizmo *p_gizmo) { +void Camera3DGizmoPlugin::redraw(EditorNode3DGizmo *p_gizmo) { Camera3D *camera = Object::cast_to<Camera3D>(p_gizmo->get_spatial_node()); @@ -1489,26 +1491,26 @@ void CameraNode3DGizmoPlugin::redraw(EditorNode3DGizmo *p_gizmo) { ////// -MeshInstanceNode3DGizmoPlugin::MeshInstanceNode3DGizmoPlugin() { +MeshInstance3DGizmoPlugin::MeshInstance3DGizmoPlugin() { } -bool MeshInstanceNode3DGizmoPlugin::has_gizmo(Node3D *p_spatial) { +bool MeshInstance3DGizmoPlugin::has_gizmo(Node3D *p_spatial) { return Object::cast_to<MeshInstance3D>(p_spatial) != nullptr && Object::cast_to<SoftBody3D>(p_spatial) == nullptr; } -String MeshInstanceNode3DGizmoPlugin::get_name() const { +String MeshInstance3DGizmoPlugin::get_name() const { return "MeshInstance3D"; } -int MeshInstanceNode3DGizmoPlugin::get_priority() const { +int MeshInstance3DGizmoPlugin::get_priority() const { return -1; } -bool MeshInstanceNode3DGizmoPlugin::can_be_hidden() const { +bool MeshInstance3DGizmoPlugin::can_be_hidden() const { return false; } -void MeshInstanceNode3DGizmoPlugin::redraw(EditorNode3DGizmo *p_gizmo) { +void MeshInstance3DGizmoPlugin::redraw(EditorNode3DGizmo *p_gizmo) { MeshInstance3D *mesh = Object::cast_to<MeshInstance3D>(p_gizmo->get_spatial_node()); @@ -1526,26 +1528,26 @@ void MeshInstanceNode3DGizmoPlugin::redraw(EditorNode3DGizmo *p_gizmo) { } ///// -Sprite3DNode3DGizmoPlugin::Sprite3DNode3DGizmoPlugin() { +Sprite3DGizmoPlugin::Sprite3DGizmoPlugin() { } -bool Sprite3DNode3DGizmoPlugin::has_gizmo(Node3D *p_spatial) { +bool Sprite3DGizmoPlugin::has_gizmo(Node3D *p_spatial) { return Object::cast_to<Sprite3D>(p_spatial) != nullptr; } -String Sprite3DNode3DGizmoPlugin::get_name() const { +String Sprite3DGizmoPlugin::get_name() const { return "Sprite3D"; } -int Sprite3DNode3DGizmoPlugin::get_priority() const { +int Sprite3DGizmoPlugin::get_priority() const { return -1; } -bool Sprite3DNode3DGizmoPlugin::can_be_hidden() const { +bool Sprite3DGizmoPlugin::can_be_hidden() const { return false; } -void Sprite3DNode3DGizmoPlugin::redraw(EditorNode3DGizmo *p_gizmo) { +void Sprite3DGizmoPlugin::redraw(EditorNode3DGizmo *p_gizmo) { Sprite3D *sprite = Object::cast_to<Sprite3D>(p_gizmo->get_spatial_node()); @@ -1559,7 +1561,7 @@ void Sprite3DNode3DGizmoPlugin::redraw(EditorNode3DGizmo *p_gizmo) { /// -Position3DNode3DGizmoPlugin::Position3DNode3DGizmoPlugin() { +Position3DGizmoPlugin::Position3DGizmoPlugin() { pos3d_mesh = Ref<ArrayMesh>(memnew(ArrayMesh)); cursor_points = Vector<Vector3>(); @@ -1592,19 +1594,19 @@ Position3DNode3DGizmoPlugin::Position3DNode3DGizmoPlugin() { pos3d_mesh->surface_set_material(0, mat); } -bool Position3DNode3DGizmoPlugin::has_gizmo(Node3D *p_spatial) { +bool Position3DGizmoPlugin::has_gizmo(Node3D *p_spatial) { return Object::cast_to<Position3D>(p_spatial) != nullptr; } -String Position3DNode3DGizmoPlugin::get_name() const { +String Position3DGizmoPlugin::get_name() const { return "Position3D"; } -int Position3DNode3DGizmoPlugin::get_priority() const { +int Position3DGizmoPlugin::get_priority() const { return -1; } -void Position3DNode3DGizmoPlugin::redraw(EditorNode3DGizmo *p_gizmo) { +void Position3DGizmoPlugin::redraw(EditorNode3DGizmo *p_gizmo) { p_gizmo->clear(); p_gizmo->add_mesh(pos3d_mesh); @@ -1613,25 +1615,25 @@ void Position3DNode3DGizmoPlugin::redraw(EditorNode3DGizmo *p_gizmo) { ///// -SkeletonNode3DGizmoPlugin::SkeletonNode3DGizmoPlugin() { +Skeleton3DGizmoPlugin::Skeleton3DGizmoPlugin() { Color gizmo_color = EDITOR_DEF("editors/3d_gizmos/gizmo_colors/skeleton", Color(1, 0.8, 0.4)); create_material("skeleton_material", gizmo_color); } -bool SkeletonNode3DGizmoPlugin::has_gizmo(Node3D *p_spatial) { +bool Skeleton3DGizmoPlugin::has_gizmo(Node3D *p_spatial) { return Object::cast_to<Skeleton3D>(p_spatial) != nullptr; } -String SkeletonNode3DGizmoPlugin::get_name() const { +String Skeleton3DGizmoPlugin::get_name() const { return "Skeleton3D"; } -int SkeletonNode3DGizmoPlugin::get_priority() const { +int Skeleton3DGizmoPlugin::get_priority() const { return -1; } -void SkeletonNode3DGizmoPlugin::redraw(EditorNode3DGizmo *p_gizmo) { +void Skeleton3DGizmoPlugin::redraw(EditorNode3DGizmo *p_gizmo) { Skeleton3D *skel = Object::cast_to<Skeleton3D>(p_gizmo->get_spatial_node()); @@ -1822,23 +1824,23 @@ void SkeletonNode3DGizmoPlugin::redraw(EditorNode3DGizmo *p_gizmo) { //// -PhysicalBoneNode3DGizmoPlugin::PhysicalBoneNode3DGizmoPlugin() { +PhysicalBone3DGizmoPlugin::PhysicalBone3DGizmoPlugin() { create_material("joint_material", EDITOR_DEF("editors/3d_gizmos/gizmo_colors/joint", Color(0.5, 0.8, 1))); } -bool PhysicalBoneNode3DGizmoPlugin::has_gizmo(Node3D *p_spatial) { +bool PhysicalBone3DGizmoPlugin::has_gizmo(Node3D *p_spatial) { return Object::cast_to<PhysicalBone3D>(p_spatial) != nullptr; } -String PhysicalBoneNode3DGizmoPlugin::get_name() const { - return "PhysicalBones"; +String PhysicalBone3DGizmoPlugin::get_name() const { + return "PhysicalBone3D"; } -int PhysicalBoneNode3DGizmoPlugin::get_priority() const { +int PhysicalBone3DGizmoPlugin::get_priority() const { return -1; } -void PhysicalBoneNode3DGizmoPlugin::redraw(EditorNode3DGizmo *p_gizmo) { +void PhysicalBone3DGizmoPlugin::redraw(EditorNode3DGizmo *p_gizmo) { p_gizmo->clear(); @@ -1864,12 +1866,12 @@ void PhysicalBoneNode3DGizmoPlugin::redraw(EditorNode3DGizmo *p_gizmo) { switch (physical_bone->get_joint_type()) { case PhysicalBone3D::JOINT_TYPE_PIN: { - JointNode3DGizmoPlugin::CreatePinJointGizmo(physical_bone->get_joint_offset(), points); + Joint3DGizmoPlugin::CreatePinJointGizmo(physical_bone->get_joint_offset(), points); } break; case PhysicalBone3D::JOINT_TYPE_CONE: { const PhysicalBone3D::ConeJointData *cjd(static_cast<const PhysicalBone3D::ConeJointData *>(physical_bone->get_joint_data())); - JointNode3DGizmoPlugin::CreateConeTwistJointGizmo( + Joint3DGizmoPlugin::CreateConeTwistJointGizmo( physical_bone->get_joint_offset(), physical_bone->get_global_transform() * physical_bone->get_joint_offset(), pb->get_global_transform(), @@ -1882,7 +1884,7 @@ void PhysicalBoneNode3DGizmoPlugin::redraw(EditorNode3DGizmo *p_gizmo) { case PhysicalBone3D::JOINT_TYPE_HINGE: { const PhysicalBone3D::HingeJointData *hjd(static_cast<const PhysicalBone3D::HingeJointData *>(physical_bone->get_joint_data())); - JointNode3DGizmoPlugin::CreateHingeJointGizmo( + Joint3DGizmoPlugin::CreateHingeJointGizmo( physical_bone->get_joint_offset(), physical_bone->get_global_transform() * physical_bone->get_joint_offset(), pb->get_global_transform(), @@ -1897,7 +1899,7 @@ void PhysicalBoneNode3DGizmoPlugin::redraw(EditorNode3DGizmo *p_gizmo) { case PhysicalBone3D::JOINT_TYPE_SLIDER: { const PhysicalBone3D::SliderJointData *sjd(static_cast<const PhysicalBone3D::SliderJointData *>(physical_bone->get_joint_data())); - JointNode3DGizmoPlugin::CreateSliderJointGizmo( + Joint3DGizmoPlugin::CreateSliderJointGizmo( physical_bone->get_joint_offset(), physical_bone->get_global_transform() * physical_bone->get_joint_offset(), pb->get_global_transform(), @@ -1913,7 +1915,7 @@ void PhysicalBoneNode3DGizmoPlugin::redraw(EditorNode3DGizmo *p_gizmo) { case PhysicalBone3D::JOINT_TYPE_6DOF: { const PhysicalBone3D::SixDOFJointData *sdofjd(static_cast<const PhysicalBone3D::SixDOFJointData *>(physical_bone->get_joint_data())); - JointNode3DGizmoPlugin::CreateGeneric6DOFJointGizmo( + Joint3DGizmoPlugin::CreateGeneric6DOFJointGizmo( physical_bone->get_joint_offset(), physical_bone->get_global_transform() * physical_bone->get_joint_offset(), @@ -1957,7 +1959,7 @@ void PhysicalBoneNode3DGizmoPlugin::redraw(EditorNode3DGizmo *p_gizmo) { ///// -RayCastNode3DGizmoPlugin::RayCastNode3DGizmoPlugin() { +RayCast3DGizmoPlugin::RayCast3DGizmoPlugin() { const Color gizmo_color = EDITOR_DEF("editors/3d_gizmos/gizmo_colors/shape", Color(0.5, 0.7, 1)); create_material("shape_material", gizmo_color); @@ -1966,19 +1968,19 @@ RayCastNode3DGizmoPlugin::RayCastNode3DGizmoPlugin() { create_material("shape_material_disabled", gizmo_color_disabled); } -bool RayCastNode3DGizmoPlugin::has_gizmo(Node3D *p_spatial) { +bool RayCast3DGizmoPlugin::has_gizmo(Node3D *p_spatial) { return Object::cast_to<RayCast3D>(p_spatial) != nullptr; } -String RayCastNode3DGizmoPlugin::get_name() const { +String RayCast3DGizmoPlugin::get_name() const { return "RayCast3D"; } -int RayCastNode3DGizmoPlugin::get_priority() const { +int RayCast3DGizmoPlugin::get_priority() const { return -1; } -void RayCastNode3DGizmoPlugin::redraw(EditorNode3DGizmo *p_gizmo) { +void RayCast3DGizmoPlugin::redraw(EditorNode3DGizmo *p_gizmo) { RayCast3D *raycast = Object::cast_to<RayCast3D>(p_gizmo->get_spatial_node()); @@ -1998,7 +2000,7 @@ void RayCastNode3DGizmoPlugin::redraw(EditorNode3DGizmo *p_gizmo) { ///// -void SpringArmNode3DGizmoPlugin::redraw(EditorNode3DGizmo *p_gizmo) { +void SpringArm3DGizmoPlugin::redraw(EditorNode3DGizmo *p_gizmo) { SpringArm3D *spring_arm = Object::cast_to<SpringArm3D>(p_gizmo->get_spatial_node()); @@ -2015,44 +2017,44 @@ void SpringArmNode3DGizmoPlugin::redraw(EditorNode3DGizmo *p_gizmo) { p_gizmo->add_collision_segments(lines); } -SpringArmNode3DGizmoPlugin::SpringArmNode3DGizmoPlugin() { +SpringArm3DGizmoPlugin::SpringArm3DGizmoPlugin() { Color gizmo_color = EDITOR_DEF("editors/3d_gizmos/gizmo_colors/shape", Color(0.5, 0.7, 1)); create_material("shape_material", gizmo_color); } -bool SpringArmNode3DGizmoPlugin::has_gizmo(Node3D *p_spatial) { +bool SpringArm3DGizmoPlugin::has_gizmo(Node3D *p_spatial) { return Object::cast_to<SpringArm3D>(p_spatial) != nullptr; } -String SpringArmNode3DGizmoPlugin::get_name() const { +String SpringArm3DGizmoPlugin::get_name() const { return "SpringArm3D"; } -int SpringArmNode3DGizmoPlugin::get_priority() const { +int SpringArm3DGizmoPlugin::get_priority() const { return -1; } ///// -VehicleWheelNode3DGizmoPlugin::VehicleWheelNode3DGizmoPlugin() { +VehicleWheel3DGizmoPlugin::VehicleWheel3DGizmoPlugin() { Color gizmo_color = EDITOR_DEF("editors/3d_gizmos/gizmo_colors/shape", Color(0.5, 0.7, 1)); create_material("shape_material", gizmo_color); } -bool VehicleWheelNode3DGizmoPlugin::has_gizmo(Node3D *p_spatial) { +bool VehicleWheel3DGizmoPlugin::has_gizmo(Node3D *p_spatial) { return Object::cast_to<VehicleWheel3D>(p_spatial) != nullptr; } -String VehicleWheelNode3DGizmoPlugin::get_name() const { +String VehicleWheel3DGizmoPlugin::get_name() const { return "VehicleWheel3D"; } -int VehicleWheelNode3DGizmoPlugin::get_priority() const { +int VehicleWheel3DGizmoPlugin::get_priority() const { return -1; } -void VehicleWheelNode3DGizmoPlugin::redraw(EditorNode3DGizmo *p_gizmo) { +void VehicleWheel3DGizmoPlugin::redraw(EditorNode3DGizmo *p_gizmo) { VehicleWheel3D *car_wheel = Object::cast_to<VehicleWheel3D>(p_gizmo->get_spatial_node()); @@ -2108,29 +2110,29 @@ void VehicleWheelNode3DGizmoPlugin::redraw(EditorNode3DGizmo *p_gizmo) { /////////// -SoftBodyNode3DGizmoPlugin::SoftBodyNode3DGizmoPlugin() { +SoftBody3DGizmoPlugin::SoftBody3DGizmoPlugin() { Color gizmo_color = EDITOR_DEF("editors/3d_gizmos/gizmo_colors/shape", Color(0.5, 0.7, 1)); create_material("shape_material", gizmo_color); create_handle_material("handles"); } -bool SoftBodyNode3DGizmoPlugin::has_gizmo(Node3D *p_spatial) { +bool SoftBody3DGizmoPlugin::has_gizmo(Node3D *p_spatial) { return Object::cast_to<SoftBody3D>(p_spatial) != nullptr; } -String SoftBodyNode3DGizmoPlugin::get_name() const { +String SoftBody3DGizmoPlugin::get_name() const { return "SoftBody3D"; } -int SoftBodyNode3DGizmoPlugin::get_priority() const { +int SoftBody3DGizmoPlugin::get_priority() const { return -1; } -bool SoftBodyNode3DGizmoPlugin::is_selectable_when_hidden() const { +bool SoftBody3DGizmoPlugin::is_selectable_when_hidden() const { return true; } -void SoftBodyNode3DGizmoPlugin::redraw(EditorNode3DGizmo *p_gizmo) { +void SoftBody3DGizmoPlugin::redraw(EditorNode3DGizmo *p_gizmo) { SoftBody3D *soft_body = Object::cast_to<SoftBody3D>(p_gizmo->get_spatial_node()); p_gizmo->clear(); @@ -2161,28 +2163,28 @@ void SoftBodyNode3DGizmoPlugin::redraw(EditorNode3DGizmo *p_gizmo) { p_gizmo->add_collision_triangles(tm); } -String SoftBodyNode3DGizmoPlugin::get_handle_name(const EditorNode3DGizmo *p_gizmo, int p_idx) const { +String SoftBody3DGizmoPlugin::get_handle_name(const EditorNode3DGizmo *p_gizmo, int p_idx) const { return "SoftBody3D pin point"; } -Variant SoftBodyNode3DGizmoPlugin::get_handle_value(EditorNode3DGizmo *p_gizmo, int p_idx) const { +Variant SoftBody3DGizmoPlugin::get_handle_value(EditorNode3DGizmo *p_gizmo, int p_idx) const { SoftBody3D *soft_body = Object::cast_to<SoftBody3D>(p_gizmo->get_spatial_node()); return Variant(soft_body->is_point_pinned(p_idx)); } -void SoftBodyNode3DGizmoPlugin::commit_handle(EditorNode3DGizmo *p_gizmo, int p_idx, const Variant &p_restore, bool p_cancel) { +void SoftBody3DGizmoPlugin::commit_handle(EditorNode3DGizmo *p_gizmo, int p_idx, const Variant &p_restore, bool p_cancel) { SoftBody3D *soft_body = Object::cast_to<SoftBody3D>(p_gizmo->get_spatial_node()); soft_body->pin_point_toggle(p_idx); } -bool SoftBodyNode3DGizmoPlugin::is_handle_highlighted(const EditorNode3DGizmo *p_gizmo, int idx) const { +bool SoftBody3DGizmoPlugin::is_handle_highlighted(const EditorNode3DGizmo *p_gizmo, int idx) const { SoftBody3D *soft_body = Object::cast_to<SoftBody3D>(p_gizmo->get_spatial_node()); return soft_body->is_point_pinned(idx); } /////////// -VisibilityNotifierGizmoPlugin::VisibilityNotifierGizmoPlugin() { +VisibilityNotifier3DGizmoPlugin::VisibilityNotifier3DGizmoPlugin() { Color gizmo_color = EDITOR_DEF("editors/3d_gizmos/gizmo_colors/visibility_notifier", Color(0.8, 0.5, 0.7)); create_material("visibility_notifier_material", gizmo_color); gizmo_color.a = 0.1; @@ -2190,19 +2192,19 @@ VisibilityNotifierGizmoPlugin::VisibilityNotifierGizmoPlugin() { create_handle_material("handles"); } -bool VisibilityNotifierGizmoPlugin::has_gizmo(Node3D *p_spatial) { +bool VisibilityNotifier3DGizmoPlugin::has_gizmo(Node3D *p_spatial) { return Object::cast_to<VisibilityNotifier3D>(p_spatial) != nullptr; } -String VisibilityNotifierGizmoPlugin::get_name() const { +String VisibilityNotifier3DGizmoPlugin::get_name() const { return "VisibilityNotifier3D"; } -int VisibilityNotifierGizmoPlugin::get_priority() const { +int VisibilityNotifier3DGizmoPlugin::get_priority() const { return -1; } -String VisibilityNotifierGizmoPlugin::get_handle_name(const EditorNode3DGizmo *p_gizmo, int p_idx) const { +String VisibilityNotifier3DGizmoPlugin::get_handle_name(const EditorNode3DGizmo *p_gizmo, int p_idx) const { switch (p_idx) { case 0: return "Size X"; @@ -2216,12 +2218,12 @@ String VisibilityNotifierGizmoPlugin::get_handle_name(const EditorNode3DGizmo *p return ""; } -Variant VisibilityNotifierGizmoPlugin::get_handle_value(EditorNode3DGizmo *p_gizmo, int p_idx) const { +Variant VisibilityNotifier3DGizmoPlugin::get_handle_value(EditorNode3DGizmo *p_gizmo, int p_idx) const { VisibilityNotifier3D *notifier = Object::cast_to<VisibilityNotifier3D>(p_gizmo->get_spatial_node()); return notifier->get_aabb(); } -void VisibilityNotifierGizmoPlugin::set_handle(EditorNode3DGizmo *p_gizmo, int p_idx, Camera3D *p_camera, const Point2 &p_point) { +void VisibilityNotifier3DGizmoPlugin::set_handle(EditorNode3DGizmo *p_gizmo, int p_idx, Camera3D *p_camera, const Point2 &p_point) { VisibilityNotifier3D *notifier = Object::cast_to<VisibilityNotifier3D>(p_gizmo->get_spatial_node()); @@ -2274,7 +2276,7 @@ void VisibilityNotifierGizmoPlugin::set_handle(EditorNode3DGizmo *p_gizmo, int p } } -void VisibilityNotifierGizmoPlugin::commit_handle(EditorNode3DGizmo *p_gizmo, int p_idx, const Variant &p_restore, bool p_cancel) { +void VisibilityNotifier3DGizmoPlugin::commit_handle(EditorNode3DGizmo *p_gizmo, int p_idx, const Variant &p_restore, bool p_cancel) { VisibilityNotifier3D *notifier = Object::cast_to<VisibilityNotifier3D>(p_gizmo->get_spatial_node()); @@ -2290,7 +2292,7 @@ void VisibilityNotifierGizmoPlugin::commit_handle(EditorNode3DGizmo *p_gizmo, in ur->commit_action(); } -void VisibilityNotifierGizmoPlugin::redraw(EditorNode3DGizmo *p_gizmo) { +void VisibilityNotifier3DGizmoPlugin::redraw(EditorNode3DGizmo *p_gizmo) { VisibilityNotifier3D *notifier = Object::cast_to<VisibilityNotifier3D>(p_gizmo->get_spatial_node()); @@ -2718,7 +2720,143 @@ void ReflectionProbeGizmoPlugin::redraw(EditorNode3DGizmo *p_gizmo) { p_gizmo->add_unscaled_billboard(icon, 0.05); p_gizmo->add_handles(handles, get_material("handles")); } +/////////////////////////////// +//// + +DecalGizmoPlugin::DecalGizmoPlugin() { + Color gizmo_color = EDITOR_DEF("editors/3d_gizmos/gizmo_colors/decal", Color(0.6, 0.5, 1.0)); + + create_material("decal_material", gizmo_color); + + create_handle_material("handles"); +} + +bool DecalGizmoPlugin::has_gizmo(Node3D *p_spatial) { + return Object::cast_to<Decal>(p_spatial) != nullptr; +} + +String DecalGizmoPlugin::get_name() const { + return "Decal"; +} + +int DecalGizmoPlugin::get_priority() const { + return -1; +} + +String DecalGizmoPlugin::get_handle_name(const EditorNode3DGizmo *p_gizmo, int p_idx) const { + + switch (p_idx) { + case 0: return "Extents X"; + case 1: return "Extents Y"; + case 2: return "Extents Z"; + } + + return ""; +} +Variant DecalGizmoPlugin::get_handle_value(EditorNode3DGizmo *p_gizmo, int p_idx) const { + + Decal *decal = Object::cast_to<Decal>(p_gizmo->get_spatial_node()); + return decal->get_extents(); +} +void DecalGizmoPlugin::set_handle(EditorNode3DGizmo *p_gizmo, int p_idx, Camera3D *p_camera, const Point2 &p_point) { + + Decal *decal = Object::cast_to<Decal>(p_gizmo->get_spatial_node()); + Transform gt = decal->get_global_transform(); + + Transform gi = gt.affine_inverse(); + + Vector3 extents = decal->get_extents(); + + Vector3 ray_from = p_camera->project_ray_origin(p_point); + Vector3 ray_dir = p_camera->project_ray_normal(p_point); + + Vector3 sg[2] = { gi.xform(ray_from), gi.xform(ray_from + ray_dir * 16384) }; + + Vector3 axis; + axis[p_idx] = 1.0; + + Vector3 ra, rb; + Geometry::get_closest_points_between_segments(Vector3(), axis * 16384, sg[0], sg[1], ra, rb); + float d = ra[p_idx]; + if (Node3DEditor::get_singleton()->is_snap_enabled()) { + d = Math::stepify(d, Node3DEditor::get_singleton()->get_translate_snap()); + } + + if (d < 0.001) + d = 0.001; + + extents[p_idx] = d; + decal->set_extents(extents); +} + +void DecalGizmoPlugin::commit_handle(EditorNode3DGizmo *p_gizmo, int p_idx, const Variant &p_restore, bool p_cancel) { + + Decal *decal = Object::cast_to<Decal>(p_gizmo->get_spatial_node()); + + Vector3 restore = p_restore; + + if (p_cancel) { + decal->set_extents(restore); + return; + } + + UndoRedo *ur = Node3DEditor::get_singleton()->get_undo_redo(); + ur->create_action(TTR("Change Decal Extents")); + ur->add_do_method(decal, "set_extents", decal->get_extents()); + ur->add_undo_method(decal, "set_extents", restore); + ur->commit_action(); +} + +void DecalGizmoPlugin::redraw(EditorNode3DGizmo *p_gizmo) { + + Decal *decal = Object::cast_to<Decal>(p_gizmo->get_spatial_node()); + + p_gizmo->clear(); + + Vector<Vector3> lines; + Vector3 extents = decal->get_extents(); + + AABB aabb; + aabb.position = -extents; + aabb.size = extents * 2; + + for (int i = 0; i < 12; i++) { + Vector3 a, b; + aabb.get_edge(i, a, b); + if (a.y == b.y) { + lines.push_back(a); + lines.push_back(b); + } else { + Vector3 ah = a.lerp(b, 0.2); + lines.push_back(a); + lines.push_back(ah); + Vector3 bh = b.lerp(a, 0.2); + lines.push_back(b); + lines.push_back(bh); + } + } + + lines.push_back(Vector3(0, extents.y, 0)); + lines.push_back(Vector3(0, extents.y * 1.2, 0)); + + Vector<Vector3> handles; + + for (int i = 0; i < 3; i++) { + + Vector3 ax; + ax[i] = aabb.position[i] + aabb.size[i]; + handles.push_back(ax); + } + + Ref<Material> material = get_material("decal_material", p_gizmo); + + p_gizmo->add_lines(lines, material); + + p_gizmo->add_handles(handles, get_material("handles")); +} + +/////////////////////////////// GIProbeGizmoPlugin::GIProbeGizmoPlugin() { Color gizmo_color = EDITOR_DEF("editors/3d_gizmos/gizmo_colors/gi_probe", Color(0.5, 1, 0.6)); @@ -3034,7 +3172,7 @@ void BakedIndirectLightGizmoPlugin::redraw(EditorNode3DGizmo *p_gizmo) { #endif //// -CollisionShapeNode3DGizmoPlugin::CollisionShapeNode3DGizmoPlugin() { +CollisionShape3DGizmoPlugin::CollisionShape3DGizmoPlugin() { const Color gizmo_color = EDITOR_DEF("editors/3d_gizmos/gizmo_colors/shape", Color(0.5, 0.7, 1)); create_material("shape_material", gizmo_color); const float gizmo_value = gizmo_color.get_v(); @@ -3043,19 +3181,19 @@ CollisionShapeNode3DGizmoPlugin::CollisionShapeNode3DGizmoPlugin() { create_handle_material("handles"); } -bool CollisionShapeNode3DGizmoPlugin::has_gizmo(Node3D *p_spatial) { +bool CollisionShape3DGizmoPlugin::has_gizmo(Node3D *p_spatial) { return Object::cast_to<CollisionShape3D>(p_spatial) != nullptr; } -String CollisionShapeNode3DGizmoPlugin::get_name() const { +String CollisionShape3DGizmoPlugin::get_name() const { return "CollisionShape3D"; } -int CollisionShapeNode3DGizmoPlugin::get_priority() const { +int CollisionShape3DGizmoPlugin::get_priority() const { return -1; } -String CollisionShapeNode3DGizmoPlugin::get_handle_name(const EditorNode3DGizmo *p_gizmo, int p_idx) const { +String CollisionShape3DGizmoPlugin::get_handle_name(const EditorNode3DGizmo *p_gizmo, int p_idx) const { const CollisionShape3D *cs = Object::cast_to<CollisionShape3D>(p_gizmo->get_spatial_node()); @@ -3091,7 +3229,7 @@ String CollisionShapeNode3DGizmoPlugin::get_handle_name(const EditorNode3DGizmo return ""; } -Variant CollisionShapeNode3DGizmoPlugin::get_handle_value(EditorNode3DGizmo *p_gizmo, int p_idx) const { +Variant CollisionShape3DGizmoPlugin::get_handle_value(EditorNode3DGizmo *p_gizmo, int p_idx) const { CollisionShape3D *cs = Object::cast_to<CollisionShape3D>(p_gizmo->get_spatial_node()); @@ -3131,7 +3269,7 @@ Variant CollisionShapeNode3DGizmoPlugin::get_handle_value(EditorNode3DGizmo *p_g return Variant(); } -void CollisionShapeNode3DGizmoPlugin::set_handle(EditorNode3DGizmo *p_gizmo, int p_idx, Camera3D *p_camera, const Point2 &p_point) { +void CollisionShape3DGizmoPlugin::set_handle(EditorNode3DGizmo *p_gizmo, int p_idx, Camera3D *p_camera, const Point2 &p_point) { CollisionShape3D *cs = Object::cast_to<CollisionShape3D>(p_gizmo->get_spatial_node()); @@ -3244,7 +3382,7 @@ void CollisionShapeNode3DGizmoPlugin::set_handle(EditorNode3DGizmo *p_gizmo, int cs2->set_height(d * 2.0); } } -void CollisionShapeNode3DGizmoPlugin::commit_handle(EditorNode3DGizmo *p_gizmo, int p_idx, const Variant &p_restore, bool p_cancel) { +void CollisionShape3DGizmoPlugin::commit_handle(EditorNode3DGizmo *p_gizmo, int p_idx, const Variant &p_restore, bool p_cancel) { CollisionShape3D *cs = Object::cast_to<CollisionShape3D>(p_gizmo->get_spatial_node()); @@ -3351,7 +3489,7 @@ void CollisionShapeNode3DGizmoPlugin::commit_handle(EditorNode3DGizmo *p_gizmo, ur->commit_action(); } } -void CollisionShapeNode3DGizmoPlugin::redraw(EditorNode3DGizmo *p_gizmo) { +void CollisionShape3DGizmoPlugin::redraw(EditorNode3DGizmo *p_gizmo) { CollisionShape3D *cs = Object::cast_to<CollisionShape3D>(p_gizmo->get_spatial_node()); @@ -3663,7 +3801,7 @@ void CollisionShapeNode3DGizmoPlugin::redraw(EditorNode3DGizmo *p_gizmo) { ///// -CollisionPolygonNode3DGizmoPlugin::CollisionPolygonNode3DGizmoPlugin() { +CollisionPolygon3DGizmoPlugin::CollisionPolygon3DGizmoPlugin() { const Color gizmo_color = EDITOR_DEF("editors/3d_gizmos/gizmo_colors/shape", Color(0.5, 0.7, 1)); create_material("shape_material", gizmo_color); const float gizmo_value = gizmo_color.get_v(); @@ -3671,19 +3809,19 @@ CollisionPolygonNode3DGizmoPlugin::CollisionPolygonNode3DGizmoPlugin() { create_material("shape_material_disabled", gizmo_color_disabled); } -bool CollisionPolygonNode3DGizmoPlugin::has_gizmo(Node3D *p_spatial) { +bool CollisionPolygon3DGizmoPlugin::has_gizmo(Node3D *p_spatial) { return Object::cast_to<CollisionPolygon3D>(p_spatial) != nullptr; } -String CollisionPolygonNode3DGizmoPlugin::get_name() const { +String CollisionPolygon3DGizmoPlugin::get_name() const { return "CollisionPolygon3D"; } -int CollisionPolygonNode3DGizmoPlugin::get_priority() const { +int CollisionPolygon3DGizmoPlugin::get_priority() const { return -1; } -void CollisionPolygonNode3DGizmoPlugin::redraw(EditorNode3DGizmo *p_gizmo) { +void CollisionPolygon3DGizmoPlugin::redraw(EditorNode3DGizmo *p_gizmo) { CollisionPolygon3D *polygon = Object::cast_to<CollisionPolygon3D>(p_gizmo->get_spatial_node()); @@ -3713,26 +3851,26 @@ void CollisionPolygonNode3DGizmoPlugin::redraw(EditorNode3DGizmo *p_gizmo) { //// -NavigationMeshNode3DGizmoPlugin::NavigationMeshNode3DGizmoPlugin() { +NavigationRegion3DGizmoPlugin::NavigationRegion3DGizmoPlugin() { create_material("navigation_edge_material", EDITOR_DEF("editors/3d_gizmos/gizmo_colors/navigation_edge", Color(0.5, 1, 1))); create_material("navigation_edge_material_disabled", EDITOR_DEF("editors/3d_gizmos/gizmo_colors/navigation_edge_disabled", Color(0.7, 0.7, 0.7))); create_material("navigation_solid_material", EDITOR_DEF("editors/3d_gizmos/gizmo_colors/navigation_solid", Color(0.5, 1, 1, 0.4))); create_material("navigation_solid_material_disabled", EDITOR_DEF("editors/3d_gizmos/gizmo_colors/navigation_solid_disabled", Color(0.7, 0.7, 0.7, 0.4))); } -bool NavigationMeshNode3DGizmoPlugin::has_gizmo(Node3D *p_spatial) { +bool NavigationRegion3DGizmoPlugin::has_gizmo(Node3D *p_spatial) { return Object::cast_to<NavigationRegion3D>(p_spatial) != nullptr; } -String NavigationMeshNode3DGizmoPlugin::get_name() const { +String NavigationRegion3DGizmoPlugin::get_name() const { return "NavigationRegion3D"; } -int NavigationMeshNode3DGizmoPlugin::get_priority() const { +int NavigationRegion3DGizmoPlugin::get_priority() const { return -1; } -void NavigationMeshNode3DGizmoPlugin::redraw(EditorNode3DGizmo *p_gizmo) { +void NavigationRegion3DGizmoPlugin::redraw(EditorNode3DGizmo *p_gizmo) { NavigationRegion3D *navmesh = Object::cast_to<NavigationRegion3D>(p_gizmo->get_spatial_node()); @@ -4078,25 +4216,40 @@ void JointGizmosDrawer::draw_cone(const Transform &p_offset, const Basis &p_base //// -JointNode3DGizmoPlugin::JointNode3DGizmoPlugin() { +Joint3DGizmoPlugin::Joint3DGizmoPlugin() { create_material("joint_material", EDITOR_DEF("editors/3d_gizmos/gizmo_colors/joint", Color(0.5, 0.8, 1))); create_material("joint_body_a_material", EDITOR_DEF("editors/3d_gizmos/gizmo_colors/joint_body_a", Color(0.6, 0.8, 1))); create_material("joint_body_b_material", EDITOR_DEF("editors/3d_gizmos/gizmo_colors/joint_body_b", Color(0.6, 0.9, 1))); + + update_timer = memnew(Timer); + update_timer->set_name("JointGizmoUpdateTimer"); + update_timer->set_wait_time(1.0 / 120.0); + update_timer->connect("timeout", callable_mp(this, &Joint3DGizmoPlugin::incremental_update_gizmos)); + update_timer->set_autostart(true); + EditorNode::get_singleton()->call_deferred("add_child", update_timer); +} + +void Joint3DGizmoPlugin::incremental_update_gizmos() { + if (!current_gizmos.empty()) { + update_idx++; + update_idx = update_idx % current_gizmos.size(); + redraw(current_gizmos[update_idx]); + } } -bool JointNode3DGizmoPlugin::has_gizmo(Node3D *p_spatial) { +bool Joint3DGizmoPlugin::has_gizmo(Node3D *p_spatial) { return Object::cast_to<Joint3D>(p_spatial) != nullptr; } -String JointNode3DGizmoPlugin::get_name() const { - return "Joints"; +String Joint3DGizmoPlugin::get_name() const { + return "Joint3D"; } -int JointNode3DGizmoPlugin::get_priority() const { +int Joint3DGizmoPlugin::get_priority() const { return -1; } -void JointNode3DGizmoPlugin::redraw(EditorNode3DGizmo *p_gizmo) { +void Joint3DGizmoPlugin::redraw(EditorNode3DGizmo *p_gizmo) { Joint3D *joint = Object::cast_to<Joint3D>(p_gizmo->get_spatial_node()); p_gizmo->clear(); @@ -4242,7 +4395,7 @@ void JointNode3DGizmoPlugin::redraw(EditorNode3DGizmo *p_gizmo) { } } -void JointNode3DGizmoPlugin::CreatePinJointGizmo(const Transform &p_offset, Vector<Vector3> &r_cursor_points) { +void Joint3DGizmoPlugin::CreatePinJointGizmo(const Transform &p_offset, Vector<Vector3> &r_cursor_points) { float cs = 0.25; r_cursor_points.push_back(p_offset.translated(Vector3(+cs, 0, 0)).origin); @@ -4253,7 +4406,7 @@ void JointNode3DGizmoPlugin::CreatePinJointGizmo(const Transform &p_offset, Vect r_cursor_points.push_back(p_offset.translated(Vector3(0, 0, -cs)).origin); } -void JointNode3DGizmoPlugin::CreateHingeJointGizmo(const Transform &p_offset, const Transform &p_trs_joint, const Transform &p_trs_body_a, const Transform &p_trs_body_b, real_t p_limit_lower, real_t p_limit_upper, bool p_use_limit, Vector<Vector3> &r_common_points, Vector<Vector3> *r_body_a_points, Vector<Vector3> *r_body_b_points) { +void Joint3DGizmoPlugin::CreateHingeJointGizmo(const Transform &p_offset, const Transform &p_trs_joint, const Transform &p_trs_body_a, const Transform &p_trs_body_b, real_t p_limit_lower, real_t p_limit_upper, bool p_use_limit, Vector<Vector3> &r_common_points, Vector<Vector3> *r_body_a_points, Vector<Vector3> *r_body_b_points) { r_common_points.push_back(p_offset.translated(Vector3(0, 0, 0.5)).origin); r_common_points.push_back(p_offset.translated(Vector3(0, 0, -0.5)).origin); @@ -4285,7 +4438,7 @@ void JointNode3DGizmoPlugin::CreateHingeJointGizmo(const Transform &p_offset, co } } -void JointNode3DGizmoPlugin::CreateSliderJointGizmo(const Transform &p_offset, const Transform &p_trs_joint, const Transform &p_trs_body_a, const Transform &p_trs_body_b, real_t p_angular_limit_lower, real_t p_angular_limit_upper, real_t p_linear_limit_lower, real_t p_linear_limit_upper, Vector<Vector3> &r_points, Vector<Vector3> *r_body_a_points, Vector<Vector3> *r_body_b_points) { +void Joint3DGizmoPlugin::CreateSliderJointGizmo(const Transform &p_offset, const Transform &p_trs_joint, const Transform &p_trs_body_a, const Transform &p_trs_body_b, real_t p_angular_limit_lower, real_t p_angular_limit_upper, real_t p_linear_limit_lower, real_t p_linear_limit_upper, Vector<Vector3> &r_points, Vector<Vector3> *r_body_a_points, Vector<Vector3> *r_body_b_points) { p_linear_limit_lower = -p_linear_limit_lower; p_linear_limit_upper = -p_linear_limit_upper; @@ -4345,7 +4498,7 @@ void JointNode3DGizmoPlugin::CreateSliderJointGizmo(const Transform &p_offset, c true); } -void JointNode3DGizmoPlugin::CreateConeTwistJointGizmo(const Transform &p_offset, const Transform &p_trs_joint, const Transform &p_trs_body_a, const Transform &p_trs_body_b, real_t p_swing, real_t p_twist, Vector<Vector3> *r_body_a_points, Vector<Vector3> *r_body_b_points) { +void Joint3DGizmoPlugin::CreateConeTwistJointGizmo(const Transform &p_offset, const Transform &p_trs_joint, const Transform &p_trs_body_a, const Transform &p_trs_body_b, real_t p_swing, real_t p_twist, Vector<Vector3> *r_body_a_points, Vector<Vector3> *r_body_b_points) { if (r_body_a_points) JointGizmosDrawer::draw_cone( @@ -4364,7 +4517,7 @@ void JointNode3DGizmoPlugin::CreateConeTwistJointGizmo(const Transform &p_offset *r_body_b_points); } -void JointNode3DGizmoPlugin::CreateGeneric6DOFJointGizmo( +void Joint3DGizmoPlugin::CreateGeneric6DOFJointGizmo( const Transform &p_offset, const Transform &p_trs_joint, const Transform &p_trs_body_a, diff --git a/editor/node_3d_editor_gizmos.h b/editor/node_3d_editor_gizmos.h index f8339b4c6c..6432feeecb 100644 --- a/editor/node_3d_editor_gizmos.h +++ b/editor/node_3d_editor_gizmos.h @@ -36,9 +36,9 @@ class Camera3D; -class LightNode3DGizmoPlugin : public EditorNode3DGizmoPlugin { +class Light3DGizmoPlugin : public EditorNode3DGizmoPlugin { - GDCLASS(LightNode3DGizmoPlugin, EditorNode3DGizmoPlugin); + GDCLASS(Light3DGizmoPlugin, EditorNode3DGizmoPlugin); public: bool has_gizmo(Node3D *p_spatial); @@ -51,12 +51,12 @@ public: void commit_handle(EditorNode3DGizmo *p_gizmo, int p_idx, const Variant &p_restore, bool p_cancel = false); void redraw(EditorNode3DGizmo *p_gizmo); - LightNode3DGizmoPlugin(); + Light3DGizmoPlugin(); }; -class AudioStreamPlayer3DNode3DGizmoPlugin : public EditorNode3DGizmoPlugin { +class AudioStreamPlayer3DGizmoPlugin : public EditorNode3DGizmoPlugin { - GDCLASS(AudioStreamPlayer3DNode3DGizmoPlugin, EditorNode3DGizmoPlugin); + GDCLASS(AudioStreamPlayer3DGizmoPlugin, EditorNode3DGizmoPlugin); public: bool has_gizmo(Node3D *p_spatial); @@ -69,12 +69,12 @@ public: void commit_handle(EditorNode3DGizmo *p_gizmo, int p_idx, const Variant &p_restore, bool p_cancel = false); void redraw(EditorNode3DGizmo *p_gizmo); - AudioStreamPlayer3DNode3DGizmoPlugin(); + AudioStreamPlayer3DGizmoPlugin(); }; -class CameraNode3DGizmoPlugin : public EditorNode3DGizmoPlugin { +class Camera3DGizmoPlugin : public EditorNode3DGizmoPlugin { - GDCLASS(CameraNode3DGizmoPlugin, EditorNode3DGizmoPlugin); + GDCLASS(Camera3DGizmoPlugin, EditorNode3DGizmoPlugin); public: bool has_gizmo(Node3D *p_spatial); @@ -87,12 +87,12 @@ public: void commit_handle(EditorNode3DGizmo *p_gizmo, int p_idx, const Variant &p_restore, bool p_cancel = false); void redraw(EditorNode3DGizmo *p_gizmo); - CameraNode3DGizmoPlugin(); + Camera3DGizmoPlugin(); }; -class MeshInstanceNode3DGizmoPlugin : public EditorNode3DGizmoPlugin { +class MeshInstance3DGizmoPlugin : public EditorNode3DGizmoPlugin { - GDCLASS(MeshInstanceNode3DGizmoPlugin, EditorNode3DGizmoPlugin); + GDCLASS(MeshInstance3DGizmoPlugin, EditorNode3DGizmoPlugin); public: bool has_gizmo(Node3D *p_spatial); @@ -101,12 +101,12 @@ public: bool can_be_hidden() const; void redraw(EditorNode3DGizmo *p_gizmo); - MeshInstanceNode3DGizmoPlugin(); + MeshInstance3DGizmoPlugin(); }; -class Sprite3DNode3DGizmoPlugin : public EditorNode3DGizmoPlugin { +class Sprite3DGizmoPlugin : public EditorNode3DGizmoPlugin { - GDCLASS(Sprite3DNode3DGizmoPlugin, EditorNode3DGizmoPlugin); + GDCLASS(Sprite3DGizmoPlugin, EditorNode3DGizmoPlugin); public: bool has_gizmo(Node3D *p_spatial); @@ -115,12 +115,12 @@ public: bool can_be_hidden() const; void redraw(EditorNode3DGizmo *p_gizmo); - Sprite3DNode3DGizmoPlugin(); + Sprite3DGizmoPlugin(); }; -class Position3DNode3DGizmoPlugin : public EditorNode3DGizmoPlugin { +class Position3DGizmoPlugin : public EditorNode3DGizmoPlugin { - GDCLASS(Position3DNode3DGizmoPlugin, EditorNode3DGizmoPlugin); + GDCLASS(Position3DGizmoPlugin, EditorNode3DGizmoPlugin); Ref<ArrayMesh> pos3d_mesh; Vector<Vector3> cursor_points; @@ -131,12 +131,12 @@ public: int get_priority() const; void redraw(EditorNode3DGizmo *p_gizmo); - Position3DNode3DGizmoPlugin(); + Position3DGizmoPlugin(); }; -class SkeletonNode3DGizmoPlugin : public EditorNode3DGizmoPlugin { +class Skeleton3DGizmoPlugin : public EditorNode3DGizmoPlugin { - GDCLASS(SkeletonNode3DGizmoPlugin, EditorNode3DGizmoPlugin); + GDCLASS(Skeleton3DGizmoPlugin, EditorNode3DGizmoPlugin); public: bool has_gizmo(Node3D *p_spatial); @@ -144,12 +144,12 @@ public: int get_priority() const; void redraw(EditorNode3DGizmo *p_gizmo); - SkeletonNode3DGizmoPlugin(); + Skeleton3DGizmoPlugin(); }; -class PhysicalBoneNode3DGizmoPlugin : public EditorNode3DGizmoPlugin { +class PhysicalBone3DGizmoPlugin : public EditorNode3DGizmoPlugin { - GDCLASS(PhysicalBoneNode3DGizmoPlugin, EditorNode3DGizmoPlugin); + GDCLASS(PhysicalBone3DGizmoPlugin, EditorNode3DGizmoPlugin); public: bool has_gizmo(Node3D *p_spatial); @@ -157,12 +157,12 @@ public: int get_priority() const; void redraw(EditorNode3DGizmo *p_gizmo); - PhysicalBoneNode3DGizmoPlugin(); + PhysicalBone3DGizmoPlugin(); }; -class RayCastNode3DGizmoPlugin : public EditorNode3DGizmoPlugin { +class RayCast3DGizmoPlugin : public EditorNode3DGizmoPlugin { - GDCLASS(RayCastNode3DGizmoPlugin, EditorNode3DGizmoPlugin); + GDCLASS(RayCast3DGizmoPlugin, EditorNode3DGizmoPlugin); public: bool has_gizmo(Node3D *p_spatial); @@ -170,12 +170,12 @@ public: int get_priority() const; void redraw(EditorNode3DGizmo *p_gizmo); - RayCastNode3DGizmoPlugin(); + RayCast3DGizmoPlugin(); }; -class SpringArmNode3DGizmoPlugin : public EditorNode3DGizmoPlugin { +class SpringArm3DGizmoPlugin : public EditorNode3DGizmoPlugin { - GDCLASS(SpringArmNode3DGizmoPlugin, EditorNode3DGizmoPlugin); + GDCLASS(SpringArm3DGizmoPlugin, EditorNode3DGizmoPlugin); public: bool has_gizmo(Node3D *p_spatial); @@ -183,12 +183,12 @@ public: int get_priority() const; void redraw(EditorNode3DGizmo *p_gizmo); - SpringArmNode3DGizmoPlugin(); + SpringArm3DGizmoPlugin(); }; -class VehicleWheelNode3DGizmoPlugin : public EditorNode3DGizmoPlugin { +class VehicleWheel3DGizmoPlugin : public EditorNode3DGizmoPlugin { - GDCLASS(VehicleWheelNode3DGizmoPlugin, EditorNode3DGizmoPlugin); + GDCLASS(VehicleWheel3DGizmoPlugin, EditorNode3DGizmoPlugin); public: bool has_gizmo(Node3D *p_spatial); @@ -196,12 +196,12 @@ public: int get_priority() const; void redraw(EditorNode3DGizmo *p_gizmo); - VehicleWheelNode3DGizmoPlugin(); + VehicleWheel3DGizmoPlugin(); }; -class SoftBodyNode3DGizmoPlugin : public EditorNode3DGizmoPlugin { +class SoftBody3DGizmoPlugin : public EditorNode3DGizmoPlugin { - GDCLASS(SoftBodyNode3DGizmoPlugin, EditorNode3DGizmoPlugin); + GDCLASS(SoftBody3DGizmoPlugin, EditorNode3DGizmoPlugin); public: bool has_gizmo(Node3D *p_spatial); @@ -215,12 +215,12 @@ public: void commit_handle(EditorNode3DGizmo *p_gizmo, int p_idx, const Variant &p_restore, bool p_cancel); bool is_handle_highlighted(const EditorNode3DGizmo *p_gizmo, int idx) const; - SoftBodyNode3DGizmoPlugin(); + SoftBody3DGizmoPlugin(); }; -class VisibilityNotifierGizmoPlugin : public EditorNode3DGizmoPlugin { +class VisibilityNotifier3DGizmoPlugin : public EditorNode3DGizmoPlugin { - GDCLASS(VisibilityNotifierGizmoPlugin, EditorNode3DGizmoPlugin); + GDCLASS(VisibilityNotifier3DGizmoPlugin, EditorNode3DGizmoPlugin); public: bool has_gizmo(Node3D *p_spatial); @@ -233,7 +233,7 @@ public: void set_handle(EditorNode3DGizmo *p_gizmo, int p_idx, Camera3D *p_camera, const Point2 &p_point); void commit_handle(EditorNode3DGizmo *p_gizmo, int p_idx, const Variant &p_restore, bool p_cancel = false); - VisibilityNotifierGizmoPlugin(); + VisibilityNotifier3DGizmoPlugin(); }; class CPUParticles3DGizmoPlugin : public EditorNode3DGizmoPlugin { @@ -285,6 +285,24 @@ public: ReflectionProbeGizmoPlugin(); }; +class DecalGizmoPlugin : public EditorNode3DGizmoPlugin { + + GDCLASS(DecalGizmoPlugin, EditorNode3DGizmoPlugin); + +public: + bool has_gizmo(Node3D *p_spatial); + String get_name() const; + int get_priority() const; + void redraw(EditorNode3DGizmo *p_gizmo); + + String get_handle_name(const EditorNode3DGizmo *p_gizmo, int p_idx) const; + Variant get_handle_value(EditorNode3DGizmo *p_gizmo, int p_idx) const; + void set_handle(EditorNode3DGizmo *p_gizmo, int p_idx, Camera3D *p_camera, const Point2 &p_point); + void commit_handle(EditorNode3DGizmo *p_gizmo, int p_idx, const Variant &p_restore, bool p_cancel = false); + + DecalGizmoPlugin(); +}; + class GIProbeGizmoPlugin : public EditorNode3DGizmoPlugin { GDCLASS(GIProbeGizmoPlugin, EditorNode3DGizmoPlugin); @@ -322,9 +340,9 @@ public: BakedIndirectLightGizmoPlugin(); }; #endif -class CollisionShapeNode3DGizmoPlugin : public EditorNode3DGizmoPlugin { +class CollisionShape3DGizmoPlugin : public EditorNode3DGizmoPlugin { - GDCLASS(CollisionShapeNode3DGizmoPlugin, EditorNode3DGizmoPlugin); + GDCLASS(CollisionShape3DGizmoPlugin, EditorNode3DGizmoPlugin); public: bool has_gizmo(Node3D *p_spatial); @@ -337,23 +355,23 @@ public: void set_handle(EditorNode3DGizmo *p_gizmo, int p_idx, Camera3D *p_camera, const Point2 &p_point); void commit_handle(EditorNode3DGizmo *p_gizmo, int p_idx, const Variant &p_restore, bool p_cancel = false); - CollisionShapeNode3DGizmoPlugin(); + CollisionShape3DGizmoPlugin(); }; -class CollisionPolygonNode3DGizmoPlugin : public EditorNode3DGizmoPlugin { - GDCLASS(CollisionPolygonNode3DGizmoPlugin, EditorNode3DGizmoPlugin); +class CollisionPolygon3DGizmoPlugin : public EditorNode3DGizmoPlugin { + GDCLASS(CollisionPolygon3DGizmoPlugin, EditorNode3DGizmoPlugin); public: bool has_gizmo(Node3D *p_spatial); String get_name() const; int get_priority() const; void redraw(EditorNode3DGizmo *p_gizmo); - CollisionPolygonNode3DGizmoPlugin(); + CollisionPolygon3DGizmoPlugin(); }; -class NavigationMeshNode3DGizmoPlugin : public EditorNode3DGizmoPlugin { +class NavigationRegion3DGizmoPlugin : public EditorNode3DGizmoPlugin { - GDCLASS(NavigationMeshNode3DGizmoPlugin, EditorNode3DGizmoPlugin); + GDCLASS(NavigationRegion3DGizmoPlugin, EditorNode3DGizmoPlugin); struct _EdgeKey { @@ -369,7 +387,7 @@ public: int get_priority() const; void redraw(EditorNode3DGizmo *p_gizmo); - NavigationMeshNode3DGizmoPlugin(); + NavigationRegion3DGizmoPlugin(); }; class JointGizmosDrawer { @@ -387,9 +405,14 @@ public: static void draw_cone(const Transform &p_offset, const Basis &p_base, real_t p_swing, real_t p_twist, Vector<Vector3> &r_points); }; -class JointNode3DGizmoPlugin : public EditorNode3DGizmoPlugin { +class Joint3DGizmoPlugin : public EditorNode3DGizmoPlugin { + + GDCLASS(Joint3DGizmoPlugin, EditorNode3DGizmoPlugin); + + Timer *update_timer; + uint64_t update_idx = 0; - GDCLASS(JointNode3DGizmoPlugin, EditorNode3DGizmoPlugin); + void incremental_update_gizmos(); public: bool has_gizmo(Node3D *p_spatial); @@ -428,7 +451,7 @@ public: Vector<Vector3> *r_body_a_points, Vector<Vector3> *r_body_b_points); - JointNode3DGizmoPlugin(); + Joint3DGizmoPlugin(); }; #endif // SPATIAL_EDITOR_GIZMOS_H diff --git a/editor/plugins/animation_blend_space_2d_editor.cpp b/editor/plugins/animation_blend_space_2d_editor.cpp index 4343535eb6..17cb68df3a 100644 --- a/editor/plugins/animation_blend_space_2d_editor.cpp +++ b/editor/plugins/animation_blend_space_2d_editor.cpp @@ -30,7 +30,7 @@ #include "animation_blend_space_2d_editor.h" -#include "core/input/input_filter.h" +#include "core/input/input.h" #include "core/io/resource_loader.h" #include "core/math/delaunay.h" #include "core/os/keyboard.h" diff --git a/editor/plugins/animation_blend_tree_editor_plugin.cpp b/editor/plugins/animation_blend_tree_editor_plugin.cpp index 54c60aba71..23e547f55d 100644 --- a/editor/plugins/animation_blend_tree_editor_plugin.cpp +++ b/editor/plugins/animation_blend_tree_editor_plugin.cpp @@ -30,7 +30,7 @@ #include "animation_blend_tree_editor_plugin.h" -#include "core/input/input_filter.h" +#include "core/input/input.h" #include "core/io/resource_loader.h" #include "core/os/keyboard.h" #include "core/project_settings.h" diff --git a/editor/plugins/animation_player_editor_plugin.cpp b/editor/plugins/animation_player_editor_plugin.cpp index d96a3b0bab..0a252cc0a3 100644 --- a/editor/plugins/animation_player_editor_plugin.cpp +++ b/editor/plugins/animation_player_editor_plugin.cpp @@ -30,7 +30,7 @@ #include "animation_player_editor_plugin.h" -#include "core/input/input_filter.h" +#include "core/input/input.h" #include "core/io/resource_loader.h" #include "core/io/resource_saver.h" #include "core/os/keyboard.h" @@ -433,7 +433,9 @@ void AnimationPlayerEditor::_animation_remove() { if (animation->get_item_count() == 0) return; - delete_dialog->set_text(TTR("Delete Animation?")); + String current = animation->get_item_text(animation->get_selected()); + + delete_dialog->set_text(TTR("Delete Animation '" + current + "'?")); delete_dialog->popup_centered(); } @@ -488,7 +490,7 @@ double AnimationPlayerEditor::_get_editor_step() const { ERR_FAIL_COND_V(!anim.is_valid(), 0.0); // Use more precise snapping when holding Shift - return InputFilter::get_singleton()->is_key_pressed(KEY_SHIFT) ? anim->get_step() * 0.25 : anim->get_step(); + return Input::get_singleton()->is_key_pressed(KEY_SHIFT) ? anim->get_step() * 0.25 : anim->get_step(); } return 0.0; @@ -1135,7 +1137,9 @@ void AnimationPlayerEditor::_animation_tool_menu(int p_option) { case TOOL_DUPLICATE_ANIM: { _animation_duplicate(); - } break; + + [[fallthrough]]; // Allow immediate rename after animation is duplicated + } case TOOL_RENAME_ANIM: { _animation_rename(); diff --git a/editor/plugins/animation_state_machine_editor.cpp b/editor/plugins/animation_state_machine_editor.cpp index c06f62a8c1..ed51a2d2cf 100644 --- a/editor/plugins/animation_state_machine_editor.cpp +++ b/editor/plugins/animation_state_machine_editor.cpp @@ -30,7 +30,7 @@ #include "animation_state_machine_editor.h" -#include "core/input/input_filter.h" +#include "core/input/input.h" #include "core/io/resource_loader.h" #include "core/math/delaunay.h" #include "core/os/keyboard.h" @@ -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/animation_tree_editor_plugin.cpp b/editor/plugins/animation_tree_editor_plugin.cpp index e771c5610f..9452c0f11b 100644 --- a/editor/plugins/animation_tree_editor_plugin.cpp +++ b/editor/plugins/animation_tree_editor_plugin.cpp @@ -34,7 +34,7 @@ #include "animation_blend_space_2d_editor.h" #include "animation_blend_tree_editor_plugin.h" #include "animation_state_machine_editor.h" -#include "core/input/input_filter.h" +#include "core/input/input.h" #include "core/io/resource_loader.h" #include "core/math/delaunay.h" #include "core/os/keyboard.h" diff --git a/editor/plugins/asset_library_editor_plugin.cpp b/editor/plugins/asset_library_editor_plugin.cpp index 14c44b7973..bb5147972c 100644 --- a/editor/plugins/asset_library_editor_plugin.cpp +++ b/editor/plugins/asset_library_editor_plugin.cpp @@ -30,7 +30,7 @@ #include "asset_library_editor_plugin.h" -#include "core/input/input_filter.h" +#include "core/input/input.h" #include "core/io/json.h" #include "core/os/keyboard.h" #include "core/version.h" diff --git a/editor/plugins/canvas_item_editor_plugin.cpp b/editor/plugins/canvas_item_editor_plugin.cpp index 2f7747d0ff..e882b3a8d7 100644 --- a/editor/plugins/canvas_item_editor_plugin.cpp +++ b/editor/plugins/canvas_item_editor_plugin.cpp @@ -30,7 +30,7 @@ #include "canvas_item_editor_plugin.h" -#include "core/input/input_filter.h" +#include "core/input/input.h" #include "core/os/keyboard.h" #include "core/print_string.h" #include "core/project_settings.h" @@ -334,7 +334,7 @@ Point2 CanvasItemEditor::snap_point(Point2 p_target, unsigned int p_modes, unsig snap_target[0] = SNAP_TARGET_NONE; snap_target[1] = SNAP_TARGET_NONE; - bool is_snap_active = smart_snap_active ^ InputFilter::get_singleton()->is_key_pressed(KEY_CONTROL); + bool is_snap_active = smart_snap_active ^ Input::get_singleton()->is_key_pressed(KEY_CONTROL); // Smart snap using the canvas position Vector2 output = p_target; @@ -462,7 +462,7 @@ Point2 CanvasItemEditor::snap_point(Point2 p_target, unsigned int p_modes, unsig } float CanvasItemEditor::snap_angle(float p_target, float p_start) const { - if (((smart_snap_active || snap_rotation) ^ InputFilter::get_singleton()->is_key_pressed(KEY_CONTROL)) && snap_rotation_step != 0) { + if (((smart_snap_active || snap_rotation) ^ Input::get_singleton()->is_key_pressed(KEY_CONTROL)) && snap_rotation_step != 0) { if (snap_relative) { return Math::stepify(p_target - snap_rotation_offset, snap_rotation_step) + snap_rotation_offset + (p_start - (int)(p_start / snap_rotation_step) * snap_rotation_step); } else { @@ -1284,7 +1284,7 @@ bool CanvasItemEditor::_gui_input_zoom_or_pan(const Ref<InputEvent> &p_event, bo // Pan the viewport Point2i relative; if (bool(EditorSettings::get_singleton()->get("editors/2d/warped_mouse_panning"))) { - relative = InputFilter::get_singleton()->warp_mouse_motion(m, viewport->get_global_rect()); + relative = Input::get_singleton()->warp_mouse_motion(m, viewport->get_global_rect()); } else { relative = m->get_relative(); } @@ -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++; } @@ -1912,13 +1912,14 @@ bool CanvasItemEditor::_gui_input_scale(const Ref<InputEvent> &p_event) { Transform2D simple_xform = (viewport->get_transform() * unscaled_transform).affine_inverse() * transform; bool uniform = m->get_shift(); - bool is_ctrl = InputFilter::get_singleton()->is_key_pressed(KEY_CONTROL); + bool is_ctrl = Input::get_singleton()->is_key_pressed(KEY_CONTROL); Point2 drag_from_local = simple_xform.xform(drag_from); Point2 drag_to_local = simple_xform.xform(drag_to); Point2 offset = drag_to_local - drag_from_local; Size2 scale = canvas_item->call("get_scale"); + Size2 original_scale = scale; float ratio = scale.y / scale.x; if (drag_type == DRAG_SCALE_BOTH) { Size2 scale_factor = drag_to_local / drag_from_local; @@ -1931,6 +1932,7 @@ bool CanvasItemEditor::_gui_input_scale(const Ref<InputEvent> &p_event) { Size2 scale_factor = Vector2(offset.x, -offset.y) / SCALE_HANDLE_DISTANCE; Size2 parent_scale = parent_xform.get_scale(); scale_factor *= Vector2(1.0 / parent_scale.x, 1.0 / parent_scale.y); + if (drag_type == DRAG_SCALE_X) { scale.x += scale_factor.x; if (uniform) { @@ -1945,8 +1947,13 @@ bool CanvasItemEditor::_gui_input_scale(const Ref<InputEvent> &p_event) { } if (snap_scale && !is_ctrl) { - scale.x = roundf(scale.x / snap_scale_step) * snap_scale_step; - scale.y = roundf(scale.y / snap_scale_step) * snap_scale_step; + if (snap_relative) { + scale.x = original_scale.x * (roundf((scale.x / original_scale.x) / snap_scale_step) * snap_scale_step); + scale.y = original_scale.y * (roundf((scale.y / original_scale.y) / snap_scale_step) * snap_scale_step); + } else { + scale.x = roundf(scale.x / snap_scale_step) * snap_scale_step; + scale.y = roundf(scale.y / snap_scale_step) * snap_scale_step; + } } canvas_item->call("set_scale", scale); @@ -2207,10 +2214,10 @@ bool CanvasItemEditor::_gui_input_move(const Ref<InputEvent> &p_event) { if (k.is_valid() && !k->is_pressed() && drag_type == DRAG_KEY_MOVE && tool == TOOL_SELECT && (k->get_keycode() == KEY_UP || k->get_keycode() == KEY_DOWN || k->get_keycode() == KEY_LEFT || k->get_keycode() == KEY_RIGHT)) { // Confirm canvas items move by arrow keys - if ((!InputFilter::get_singleton()->is_key_pressed(KEY_UP)) && - (!InputFilter::get_singleton()->is_key_pressed(KEY_DOWN)) && - (!InputFilter::get_singleton()->is_key_pressed(KEY_LEFT)) && - (!InputFilter::get_singleton()->is_key_pressed(KEY_RIGHT))) { + if ((!Input::get_singleton()->is_key_pressed(KEY_UP)) && + (!Input::get_singleton()->is_key_pressed(KEY_DOWN)) && + (!Input::get_singleton()->is_key_pressed(KEY_LEFT)) && + (!Input::get_singleton()->is_key_pressed(KEY_RIGHT))) { _commit_canvas_item_state(drag_selection, TTR("Move CanvasItem"), true); drag_type = DRAG_NONE; } @@ -2691,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"); @@ -3065,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); } @@ -3193,13 +3200,15 @@ void CanvasItemEditor::_draw_selection() { RID ci = viewport->get_canvas_item(); - List<CanvasItem *> selection = _get_edited_canvas_items(false, false); + List<CanvasItem *> selection = _get_edited_canvas_items(true, false); bool single = selection.size() == 1; for (List<CanvasItem *>::Element *E = selection.front(); E; E = E->next()) { CanvasItem *canvas_item = Object::cast_to<CanvasItem>(E->get()); CanvasItemEditorSelectedItem *se = editor_selection->get_node_editor_data<CanvasItemEditorSelectedItem>(canvas_item); + bool item_locked = canvas_item->has_meta("_edit_lock_"); + // Draw the previous position if we are dragging the node if (show_helpers && (drag_type == DRAG_MOVE || drag_type == DRAG_ROTATE || @@ -3239,6 +3248,10 @@ void CanvasItemEditor::_draw_selection() { Color c = Color(1, 0.6, 0.4, 0.7); + if (item_locked) { + c = Color(0.7, 0.7, 0.7, 0.7); + } + for (int i = 0; i < 4; i++) { viewport->draw_line(endpoints[i], endpoints[(i + 1) % 4], c, Math::round(2 * EDSCALE)); } @@ -3251,7 +3264,7 @@ void CanvasItemEditor::_draw_selection() { viewport->draw_set_transform_matrix(viewport->get_transform()); } - if (single && (tool == TOOL_SELECT || tool == TOOL_MOVE || tool == TOOL_SCALE || tool == TOOL_ROTATE || tool == TOOL_EDIT_PIVOT)) { //kind of sucks + if (single && !item_locked && (tool == TOOL_SELECT || tool == TOOL_MOVE || tool == TOOL_SCALE || tool == TOOL_ROTATE || tool == TOOL_EDIT_PIVOT)) { //kind of sucks // Draw the pivot if (canvas_item->_edit_use_pivot()) { @@ -3297,8 +3310,8 @@ void CanvasItemEditor::_draw_selection() { } // Draw the move handles - bool is_ctrl = InputFilter::get_singleton()->is_key_pressed(KEY_CONTROL); - bool is_alt = InputFilter::get_singleton()->is_key_pressed(KEY_ALT); + bool is_ctrl = Input::get_singleton()->is_key_pressed(KEY_CONTROL); + bool is_alt = Input::get_singleton()->is_key_pressed(KEY_ALT); if (tool == TOOL_MOVE && show_transformation_gizmos) { if (_is_node_movable(canvas_item)) { Transform2D unscaled_transform = (xform * canvas_item->get_transform().affine_inverse() * canvas_item->_edit_get_transform()).orthonormalized(); @@ -3334,7 +3347,7 @@ void CanvasItemEditor::_draw_selection() { Transform2D simple_xform = viewport->get_transform() * unscaled_transform; Size2 scale_factor = Size2(SCALE_HANDLE_DISTANCE, SCALE_HANDLE_DISTANCE); - bool uniform = InputFilter::get_singleton()->is_key_pressed(KEY_SHIFT); + bool uniform = Input::get_singleton()->is_key_pressed(KEY_SHIFT); Point2 offset = (simple_xform.affine_inverse().xform(drag_to) - simple_xform.affine_inverse().xform(drag_from)) * zoom; if (drag_type == DRAG_SCALE_X) { @@ -6191,8 +6204,8 @@ bool CanvasItemEditorViewport::_only_packed_scenes_selected() const { } void CanvasItemEditorViewport::drop_data(const Point2 &p_point, const Variant &p_data) { - bool is_shift = InputFilter::get_singleton()->is_key_pressed(KEY_SHIFT); - bool is_alt = InputFilter::get_singleton()->is_key_pressed(KEY_ALT); + bool is_shift = Input::get_singleton()->is_key_pressed(KEY_SHIFT); + bool is_alt = Input::get_singleton()->is_key_pressed(KEY_ALT); selected_files.clear(); Dictionary d = p_data; diff --git a/editor/plugins/collision_polygon_3d_editor_plugin.cpp b/editor/plugins/collision_polygon_3d_editor_plugin.cpp index 26adc5156b..1cee1a040f 100644 --- a/editor/plugins/collision_polygon_3d_editor_plugin.cpp +++ b/editor/plugins/collision_polygon_3d_editor_plugin.cpp @@ -31,7 +31,7 @@ #include "collision_polygon_3d_editor_plugin.h" #include "canvas_item_editor_plugin.h" -#include "core/input/input_filter.h" +#include "core/input/input.h" #include "core/os/file_access.h" #include "core/os/keyboard.h" #include "editor/editor_settings.h" @@ -342,7 +342,7 @@ bool CollisionPolygon3DEditor::forward_spatial_gui_input(Camera3D *p_camera, con Vector2 cpoint(spoint.x, spoint.y); - if (snap_ignore && !InputFilter::get_singleton()->is_key_pressed(KEY_CONTROL)) { + if (snap_ignore && !Input::get_singleton()->is_key_pressed(KEY_CONTROL)) { snap_ignore = false; } diff --git a/editor/plugins/cpu_particles_2d_editor_plugin.cpp b/editor/plugins/cpu_particles_2d_editor_plugin.cpp index b005519a5e..ef4d7d7646 100644 --- a/editor/plugins/cpu_particles_2d_editor_plugin.cpp +++ b/editor/plugins/cpu_particles_2d_editor_plugin.cpp @@ -262,9 +262,8 @@ CPUParticles2DEditorPlugin::CPUParticles2DEditorPlugin(EditorNode *p_node) { toolbar->add_child(memnew(VSeparator)); menu = memnew(MenuButton); - menu->get_popup()->add_item(TTR("Load Emission Mask"), MENU_LOAD_EMISSION_MASK); - menu->get_popup()->add_separator(); menu->get_popup()->add_item(TTR("Restart"), MENU_RESTART); + menu->get_popup()->add_item(TTR("Load Emission Mask"), MENU_LOAD_EMISSION_MASK); menu->set_text(TTR("CPUParticles2D")); menu->set_switch_on_hover(true); toolbar->add_child(menu); diff --git a/editor/plugins/cpu_particles_3d_editor_plugin.cpp b/editor/plugins/cpu_particles_3d_editor_plugin.cpp index 0c2fbaf62a..59a353a581 100644 --- a/editor/plugins/cpu_particles_3d_editor_plugin.cpp +++ b/editor/plugins/cpu_particles_3d_editor_plugin.cpp @@ -104,9 +104,8 @@ CPUParticles3DEditor::CPUParticles3DEditor() { particles_editor_hb->hide(); options->set_text(TTR("CPUParticles3D")); - options->get_popup()->add_item(TTR("Create Emission Points From Node"), MENU_OPTION_CREATE_EMISSION_VOLUME_FROM_NODE); - options->get_popup()->add_separator(); options->get_popup()->add_item(TTR("Restart"), MENU_OPTION_RESTART); + options->get_popup()->add_item(TTR("Create Emission Points From Node"), MENU_OPTION_CREATE_EMISSION_VOLUME_FROM_NODE); options->get_popup()->connect("id_pressed", callable_mp(this, &CPUParticles3DEditor::_menu_option)); } diff --git a/editor/plugins/curve_editor_plugin.cpp b/editor/plugins/curve_editor_plugin.cpp index 71c5a78e0b..9b5c6bae3b 100644 --- a/editor/plugins/curve_editor_plugin.cpp +++ b/editor/plugins/curve_editor_plugin.cpp @@ -32,7 +32,7 @@ #include "canvas_item_editor_plugin.h" #include "core/core_string_names.h" -#include "core/input/input_filter.h" +#include "core/input/input.h" #include "core/os/keyboard.h" #include "editor/editor_scale.h" @@ -210,7 +210,7 @@ void CurveEditor::on_gui_input(const Ref<InputEvent> &p_event) { else tangent = 9999 * (dir.y >= 0 ? 1 : -1); - bool link = !InputFilter::get_singleton()->is_key_pressed(KEY_SHIFT); + bool link = !Input::get_singleton()->is_key_pressed(KEY_SHIFT); if (_selected_tangent == TANGENT_LEFT) { curve.set_point_left_tangent(_selected_point, tangent); diff --git a/editor/plugins/gpu_particles_2d_editor_plugin.cpp b/editor/plugins/gpu_particles_2d_editor_plugin.cpp index 29c47a2b67..5c35285c22 100644 --- a/editor/plugins/gpu_particles_2d_editor_plugin.cpp +++ b/editor/plugins/gpu_particles_2d_editor_plugin.cpp @@ -371,14 +371,11 @@ GPUParticles2DEditorPlugin::GPUParticles2DEditorPlugin(EditorNode *p_node) { toolbar->add_child(memnew(VSeparator)); menu = memnew(MenuButton); + menu->get_popup()->add_item(TTR("Restart"), MENU_RESTART); menu->get_popup()->add_item(TTR("Generate Visibility Rect"), MENU_GENERATE_VISIBILITY_RECT); - menu->get_popup()->add_separator(); menu->get_popup()->add_item(TTR("Load Emission Mask"), MENU_LOAD_EMISSION_MASK); // menu->get_popup()->add_item(TTR("Clear Emission Mask"), MENU_CLEAR_EMISSION_MASK); - menu->get_popup()->add_separator(); menu->get_popup()->add_item(TTR("Convert to CPUParticles2D"), MENU_OPTION_CONVERT_TO_CPU_PARTICLES); - menu->get_popup()->add_separator(); - menu->get_popup()->add_item(TTR("Restart"), MENU_RESTART); menu->set_text(TTR("GPUParticles2D")); menu->set_switch_on_hover(true); toolbar->add_child(menu); diff --git a/editor/plugins/gpu_particles_3d_editor_plugin.cpp b/editor/plugins/gpu_particles_3d_editor_plugin.cpp index 534a228098..7f80acc176 100644 --- a/editor/plugins/gpu_particles_3d_editor_plugin.cpp +++ b/editor/plugins/gpu_particles_3d_editor_plugin.cpp @@ -433,13 +433,10 @@ GPUParticles3DEditor::GPUParticles3DEditor() { particles_editor_hb->hide(); options->set_text(TTR("GPUParticles3D")); + options->get_popup()->add_item(TTR("Restart"), MENU_OPTION_RESTART); options->get_popup()->add_item(TTR("Generate AABB"), MENU_OPTION_GENERATE_AABB); - options->get_popup()->add_separator(); options->get_popup()->add_item(TTR("Create Emission Points From Node"), MENU_OPTION_CREATE_EMISSION_VOLUME_FROM_NODE); - options->get_popup()->add_separator(); options->get_popup()->add_item(TTR("Convert to CPUParticles3D"), MENU_OPTION_CONVERT_TO_CPU_PARTICLES); - options->get_popup()->add_separator(); - options->get_popup()->add_item(TTR("Restart"), MENU_OPTION_RESTART); options->get_popup()->connect("id_pressed", callable_mp(this, &GPUParticles3DEditor::_menu_option)); diff --git a/editor/plugins/material_editor_plugin.cpp b/editor/plugins/material_editor_plugin.cpp index 00e8a05e4e..eb14495b9c 100644 --- a/editor/plugins/material_editor_plugin.cpp +++ b/editor/plugins/material_editor_plugin.cpp @@ -95,6 +95,7 @@ void MaterialEditor::_button_pressed(Node *p_button) { sphere_instance->hide(); box_switch->set_pressed(true); sphere_switch->set_pressed(false); + EditorSettings::get_singleton()->set_project_metadata("inspector_options", "material_preview_on_sphere", false); } if (p_button == sphere_switch) { @@ -102,6 +103,7 @@ void MaterialEditor::_button_pressed(Node *p_button) { sphere_instance->show(); box_switch->set_pressed(false); sphere_switch->set_pressed(true); + EditorSettings::get_singleton()->set_project_metadata("inspector_options", "material_preview_on_sphere", true); } } @@ -155,7 +157,6 @@ MaterialEditor::MaterialEditor() { sphere_instance->set_mesh(sphere_mesh); box_mesh.instance(); box_instance->set_mesh(box_mesh); - box_instance->hide(); set_custom_minimum_size(Size2(1, 150) * EDSCALE); @@ -194,6 +195,15 @@ MaterialEditor::MaterialEditor() { light_2_switch->connect("pressed", callable_mp(this, &MaterialEditor::_button_pressed), varray(light_2_switch)); first_enter = true; + + if (EditorSettings::get_singleton()->get_project_metadata("inspector_options", "material_preview_on_sphere", true)) { + box_instance->hide(); + } else { + box_instance->show(); + sphere_instance->hide(); + box_switch->set_pressed(true); + sphere_switch->set_pressed(false); + } } /////////////////////// diff --git a/editor/plugins/node_3d_editor_plugin.cpp b/editor/plugins/node_3d_editor_plugin.cpp index 2a27332051..60a49f72c0 100644 --- a/editor/plugins/node_3d_editor_plugin.cpp +++ b/editor/plugins/node_3d_editor_plugin.cpp @@ -30,7 +30,7 @@ #include "node_3d_editor_plugin.h" -#include "core/input/input_filter.h" +#include "core/input/input.h" #include "core/math/camera_matrix.h" #include "core/os/keyboard.h" #include "core/print_string.h" @@ -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); @@ -298,10 +298,10 @@ void Node3DEditorViewport::_update_camera(float p_interp_delta) { float zoom_inertia = EDITOR_GET("editors/3d/navigation_feel/zoom_inertia"); //determine if being manipulated - bool manipulated = InputFilter::get_singleton()->get_mouse_button_mask() & (2 | 4); - manipulated |= InputFilter::get_singleton()->is_key_pressed(KEY_SHIFT); - manipulated |= InputFilter::get_singleton()->is_key_pressed(KEY_ALT); - manipulated |= InputFilter::get_singleton()->is_key_pressed(KEY_CONTROL); + bool manipulated = Input::get_singleton()->get_mouse_button_mask() & (2 | 4); + manipulated |= Input::get_singleton()->is_key_pressed(KEY_SHIFT); + manipulated |= Input::get_singleton()->is_key_pressed(KEY_ALT); + manipulated |= Input::get_singleton()->is_key_pressed(KEY_CONTROL); float orbit_inertia = MAX(0.00001, manipulated ? manip_orbit_inertia : free_orbit_inertia); float translation_inertia = MAX(0.0001, manipulated ? manip_translation_inertia : free_translation_inertia); @@ -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))); } } @@ -347,7 +347,7 @@ void Node3DEditorViewport::_update_camera(float p_interp_delta) { if (orthogonal) { float half_fov = Math::deg2rad(get_fov()) / 2.0; float height = 2.0 * cursor.distance * Math::tan(half_fov); - camera->set_orthogonal(height, 0.1, 8192); + camera->set_orthogonal(height, get_znear(), get_zfar()); } else { camera->set_perspective(get_fov(), get_znear(), get_zfar()); } @@ -364,7 +364,7 @@ Transform Node3DEditorViewport::to_camera_transform(const Cursor &p_cursor) cons camera_transform.basis.rotate(Vector3(0, 1, 0), -p_cursor.y_rot); if (orthogonal) - camera_transform.translate(0, 0, 4096); + camera_transform.translate(0, 0, (get_zfar() - get_znear()) / 2.0); else camera_transform.translate(0, 0, p_cursor.distance); @@ -674,17 +674,13 @@ 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<Node *> selected; @@ -2166,7 +2162,7 @@ void Node3DEditorViewport::_nav_look(Ref<InputEventWithModifiers> p_event, const _menu_option(VIEW_PERSPECTIVE); } - real_t degrees_per_pixel = EditorSettings::get_singleton()->get("editors/3d/navigation_feel/orbit_sensitivity"); + real_t degrees_per_pixel = EditorSettings::get_singleton()->get("editors/3d/freelook/freelook_sensitivity"); real_t radians_per_pixel = Math::deg2rad(degrees_per_pixel); bool invert_y_axis = EditorSettings::get_singleton()->get("editors/3d/navigation/invert_y_axis"); @@ -2260,7 +2256,7 @@ void Node3DEditorViewport::scale_freelook_speed(real_t scale) { Point2i Node3DEditorViewport::_get_warped_mouse_motion(const Ref<InputEventMouseMotion> &p_ev_mouse_motion) const { Point2i relative; if (bool(EDITOR_DEF("editors/3d/navigation/warped_mouse_panning", false))) { - relative = InputFilter::get_singleton()->warp_mouse_motion(p_ev_mouse_motion, surface->get_global_rect()); + relative = Input::get_singleton()->warp_mouse_motion(p_ev_mouse_motion, surface->get_global_rect()); } else { relative = p_ev_mouse_motion->get_relative(); } @@ -2276,7 +2272,7 @@ static bool is_shortcut_pressed(const String &p_path) { if (k == nullptr) { return false; } - const InputFilter &input = *InputFilter::get_singleton(); + const Input &input = *Input::get_singleton(); int keycode = k->get_keycode(); return input.is_key_pressed(keycode); } @@ -2287,9 +2283,27 @@ void Node3DEditorViewport::_update_freelook(real_t delta) { return; } - const Vector3 forward = camera->get_transform().basis.xform(Vector3(0, 0, -1)); + const FreelookNavigationScheme navigation_scheme = (FreelookNavigationScheme)EditorSettings::get_singleton()->get("editors/3d/freelook/freelook_navigation_scheme").operator int(); + + Vector3 forward; + if (navigation_scheme == FREELOOK_FULLY_AXIS_LOCKED) { + // Forward/backward keys will always go straight forward/backward, never moving on the Y axis. + forward = Vector3(0, 0, -1).rotated(Vector3(0, 1, 0), camera->get_rotation().y); + } else { + // Forward/backward keys will be relative to the camera pitch. + forward = camera->get_transform().basis.xform(Vector3(0, 0, -1)); + } + const Vector3 right = camera->get_transform().basis.xform(Vector3(1, 0, 0)); - const Vector3 up = camera->get_transform().basis.xform(Vector3(0, 1, 0)); + + Vector3 up; + if (navigation_scheme == FREELOOK_PARTIALLY_AXIS_LOCKED || navigation_scheme == FREELOOK_FULLY_AXIS_LOCKED) { + // Up/down keys will always go up/down regardless of camera pitch. + up = Vector3(0, 1, 0); + } else { + // Up/down keys will be relative to the camera pitch. + up = camera->get_transform().basis.xform(Vector3(0, 1, 0)); + } Vector3 direction; @@ -2478,11 +2492,15 @@ void Node3DEditorViewport::_notification(int p_what) { //update msaa if changed - int msaa_mode = ProjectSettings::get_singleton()->get("rendering/quality/filters/msaa"); + int msaa_mode = ProjectSettings::get_singleton()->get("rendering/quality/screen_filters/msaa"); viewport->set_msaa(Viewport::MSAA(msaa_mode)); + int ssaa_mode = GLOBAL_GET("rendering/quality/screen_filters/screen_space_aa"); + viewport->set_screen_space_aa(Viewport::ScreenSpaceAA(ssaa_mode)); bool show_info = view_menu->get_popup()->is_item_checked(view_menu->get_popup()->get_item_index(VIEW_INFORMATION)); - info_label->set_visible(show_info); + if (show_info != info_label->is_visible()) { + info_label->set_visible(show_info); + } Camera3D *current_camera; @@ -2509,17 +2527,46 @@ void Node3DEditorViewport::_notification(int p_what) { text += TTR("Surface Changes") + ": " + itos(viewport->get_render_info(Viewport::RENDER_INFO_SURFACE_CHANGES_IN_FRAME)) + "\n"; text += TTR("Draw Calls") + ": " + itos(viewport->get_render_info(Viewport::RENDER_INFO_DRAW_CALLS_IN_FRAME)) + "\n"; text += TTR("Vertices") + ": " + itos(viewport->get_render_info(Viewport::RENDER_INFO_VERTICES_IN_FRAME)); + info_label->set_text(text); } // FPS Counter. - bool show_fps = view_menu->get_popup()->is_item_checked(view_menu->get_popup()->get_item_index(VIEW_FPS)); - fps_label->set_visible(show_fps); - + bool show_fps = view_menu->get_popup()->is_item_checked(view_menu->get_popup()->get_item_index(VIEW_FRAME_TIME)); + + if (show_fps != fps_label->is_visible()) { + fps_label->set_visible(show_fps); + RS::get_singleton()->viewport_set_measure_render_time(viewport->get_viewport_rid(), show_fps); + for (int i = 0; i < FRAME_TIME_HISTORY; i++) { + cpu_time_history[i] = 0; + gpu_time_history[i] = 0; + } + cpu_time_history_index = 0; + cpu_time_history_index = 0; + } if (show_fps) { + + cpu_time_history[cpu_time_history_index] = RS::get_singleton()->viewport_get_measured_render_time_cpu(viewport->get_viewport_rid()); + cpu_time_history_index = (cpu_time_history_index + 1) % FRAME_TIME_HISTORY; + float cpu_time = 0.0; + for (int i = 0; i < FRAME_TIME_HISTORY; i++) { + cpu_time += cpu_time_history[i]; + } + cpu_time /= FRAME_TIME_HISTORY; + + gpu_time_history[gpu_time_history_index] = RS::get_singleton()->viewport_get_measured_render_time_gpu(viewport->get_viewport_rid()); + gpu_time_history_index = (gpu_time_history_index + 1) % FRAME_TIME_HISTORY; + float gpu_time = 0.0; + for (int i = 0; i < FRAME_TIME_HISTORY; i++) { + gpu_time += gpu_time_history[i]; + } + gpu_time /= FRAME_TIME_HISTORY; + String text; - const float temp_fps = Engine::get_singleton()->get_frames_per_second(); - text += TTR(vformat("FPS: %d (%s ms)", temp_fps, String::num(1000.0f / temp_fps, 2))); + text += TTR("CPU Time") + ": " + String::num(cpu_time, 1) + " ms\n"; + text += TTR("GPU Time") + ": " + String::num(gpu_time, 1) + " ms\n"; + text += TTR("FPS") + ": " + itos(1000.0 / gpu_time); + fps_label->set_text(text); } @@ -2831,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: { @@ -2980,9 +3026,9 @@ void Node3DEditorViewport::_menu_option(int p_option) { view_menu->get_popup()->set_item_checked(idx, !current); } break; - case VIEW_FPS: { + case VIEW_FRAME_TIME: { - int idx = view_menu->get_popup()->get_item_index(VIEW_FPS); + int idx = view_menu->get_popup()->get_item_index(VIEW_FRAME_TIME); bool current = view_menu->get_popup()->is_item_checked(idx); view_menu->get_popup()->set_item_checked(idx, !current); @@ -3000,6 +3046,8 @@ void Node3DEditorViewport::_menu_option(int p_option) { case VIEW_DISPLAY_DEBUG_GIPROBE_EMISSION: case VIEW_DISPLAY_DEBUG_SCENE_LUMINANCE: case VIEW_DISPLAY_DEBUG_SSAO: + case VIEW_DISPLAY_DEBUG_PSSM_SPLITS: + case VIEW_DISPLAY_DEBUG_DECAL_ATLAS: case VIEW_DISPLAY_DEBUG_ROUGHNESS_LIMITER: { static const int display_options[] = { @@ -3018,6 +3066,8 @@ void Node3DEditorViewport::_menu_option(int p_option) { VIEW_DISPLAY_DEBUG_SCENE_LUMINANCE, VIEW_DISPLAY_DEBUG_SSAO, VIEW_DISPLAY_DEBUG_ROUGHNESS_LIMITER, + VIEW_DISPLAY_DEBUG_PSSM_SPLITS, + VIEW_DISPLAY_DEBUG_DECAL_ATLAS, VIEW_MAX }; static const Viewport::DebugDraw debug_draw_modes[] = { @@ -3036,6 +3086,8 @@ void Node3DEditorViewport::_menu_option(int p_option) { Viewport::DEBUG_DRAW_SCENE_LUMINANCE, Viewport::DEBUG_DRAW_SSAO, Viewport::DEBUG_DRAW_ROUGHNESS_LIMITER, + Viewport::DEBUG_DRAW_PSSM_SPLITS, + Viewport::DEBUG_DRAW_DECAL_ATLAS, }; int idx = 0; @@ -3335,12 +3387,12 @@ void Node3DEditorViewport::set_state(const Dictionary &p_state) { if (view_menu->get_popup()->is_item_checked(idx) != information) _menu_option(VIEW_INFORMATION); } - if (p_state.has("fps")) { - bool fps = p_state["fps"]; + if (p_state.has("frame_time")) { + bool fps = p_state["frame_time"]; - int idx = view_menu->get_popup()->get_item_index(VIEW_FPS); + int idx = view_menu->get_popup()->get_item_index(VIEW_FRAME_TIME); if (view_menu->get_popup()->is_item_checked(idx) != fps) - _menu_option(VIEW_FPS); + _menu_option(VIEW_FRAME_TIME); } if (p_state.has("half_res")) { bool half_res = p_state["half_res"]; @@ -3397,7 +3449,7 @@ Dictionary Node3DEditorViewport::get_state() const { d["doppler"] = view_menu->get_popup()->is_item_checked(view_menu->get_popup()->get_item_index(VIEW_AUDIO_DOPPLER)); d["gizmos"] = view_menu->get_popup()->is_item_checked(view_menu->get_popup()->get_item_index(VIEW_GIZMOS)); d["information"] = view_menu->get_popup()->is_item_checked(view_menu->get_popup()->get_item_index(VIEW_INFORMATION)); - d["fps"] = view_menu->get_popup()->is_item_checked(view_menu->get_popup()->get_item_index(VIEW_FPS)); + d["frame_time"] = view_menu->get_popup()->is_item_checked(view_menu->get_popup()->get_item_index(VIEW_FRAME_TIME)); d["half_res"] = subviewport_container->get_stretch_shrink() > 1; d["cinematic_preview"] = view_menu->get_popup()->is_item_checked(view_menu->get_popup()->get_item_index(VIEW_CINEMATIC_PREVIEW)); if (previewing) @@ -3771,7 +3823,7 @@ void Node3DEditorViewport::drop_data_fw(const Point2 &p_point, const Variant &p_ if (!can_drop_data_fw(p_point, p_data, p_from)) return; - bool is_shift = InputFilter::get_singleton()->is_key_pressed(KEY_SHIFT); + bool is_shift = Input::get_singleton()->is_key_pressed(KEY_SHIFT); selected_files.clear(); Dictionary d = p_data; @@ -3809,6 +3861,9 @@ void Node3DEditorViewport::drop_data_fw(const Point2 &p_point, const Variant &p_ Node3DEditorViewport::Node3DEditorViewport(Node3DEditor *p_spatial_editor, EditorNode *p_editor, int p_index) { + cpu_time_history_index = 0; + gpu_time_history_index = 0; + _edit.mode = TRANSFORM_NONE; _edit.plane = TRANSFORM_VIEW; _edit.edited_gizmo = 0; @@ -3887,11 +3942,15 @@ Node3DEditorViewport::Node3DEditorViewport(Node3DEditor *p_spatial_editor, Edito view_menu->get_popup()->add_radio_check_shortcut(ED_SHORTCUT("spatial_editor/view_display_lighting", TTR("Display Lighting")), VIEW_DISPLAY_LIGHTING); view_menu->get_popup()->add_radio_check_shortcut(ED_SHORTCUT("spatial_editor/view_display_unshaded", TTR("Display Unshaded")), VIEW_DISPLAY_SHADELESS); view_menu->get_popup()->set_item_checked(view_menu->get_popup()->get_item_index(VIEW_DISPLAY_NORMAL), true); + display_submenu->add_radio_check_item(TTR("Directional Shadow Splits"), VIEW_DISPLAY_DEBUG_PSSM_SPLITS); + display_submenu->add_separator(); display_submenu->add_radio_check_item(TTR("Normal Buffer"), VIEW_DISPLAY_NORMAL_BUFFER); display_submenu->add_separator(); display_submenu->add_radio_check_item(TTR("Shadow Atlas"), VIEW_DISPLAY_DEBUG_SHADOW_ATLAS); display_submenu->add_radio_check_item(TTR("Directional Shadow"), VIEW_DISPLAY_DEBUG_DIRECTIONAL_SHADOW_ATLAS); display_submenu->add_separator(); + display_submenu->add_radio_check_item(TTR("Decal Atlas"), VIEW_DISPLAY_DEBUG_DECAL_ATLAS); + display_submenu->add_separator(); display_submenu->add_radio_check_item(TTR("GIProbe Lighting"), VIEW_DISPLAY_DEBUG_GIPROBE_LIGHTING); display_submenu->add_radio_check_item(TTR("GIProbe Albedo"), VIEW_DISPLAY_DEBUG_GIPROBE_ALBEDO); display_submenu->add_radio_check_item(TTR("GIProbe Emission"), VIEW_DISPLAY_DEBUG_GIPROBE_EMISSION); @@ -3907,7 +3966,7 @@ Node3DEditorViewport::Node3DEditorViewport(Node3DEditor *p_spatial_editor, Edito view_menu->get_popup()->add_check_shortcut(ED_SHORTCUT("spatial_editor/view_environment", TTR("View Environment")), VIEW_ENVIRONMENT); view_menu->get_popup()->add_check_shortcut(ED_SHORTCUT("spatial_editor/view_gizmos", TTR("View Gizmos")), VIEW_GIZMOS); view_menu->get_popup()->add_check_shortcut(ED_SHORTCUT("spatial_editor/view_information", TTR("View Information")), VIEW_INFORMATION); - view_menu->get_popup()->add_check_shortcut(ED_SHORTCUT("spatial_editor/view_fps", TTR("View FPS")), VIEW_FPS); + view_menu->get_popup()->add_check_shortcut(ED_SHORTCUT("spatial_editor/view_fps", TTR("View Frame Time")), VIEW_FRAME_TIME); view_menu->get_popup()->set_item_checked(view_menu->get_popup()->get_item_index(VIEW_ENVIRONMENT), true); view_menu->get_popup()->add_separator(); view_menu->get_popup()->add_check_shortcut(ED_SHORTCUT("spatial_editor/view_half_resolution", TTR("Half Resolution")), VIEW_HALF_RESOLUTION); @@ -3984,7 +4043,7 @@ Node3DEditorViewport::Node3DEditorViewport(Node3DEditor *p_spatial_editor, Edito fps_label->set_anchor_and_margin(MARGIN_TOP, ANCHOR_BEGIN, 10 * EDSCALE); fps_label->set_anchor_and_margin(MARGIN_RIGHT, ANCHOR_END, -10 * EDSCALE); fps_label->set_h_grow_direction(GROW_DIRECTION_BEGIN); - fps_label->set_tooltip(TTR("Note: The FPS value displayed is the editor's framerate.\nIt cannot be used as a reliable indication of in-game performance.")); + fps_label->set_tooltip(TTR("Note: The FPS is estimated on a 60hz refresh rate.")); fps_label->set_mouse_filter(MOUSE_FILTER_PASS); // Otherwise tooltip doesn't show. surface->add_child(fps_label); fps_label->hide(); @@ -4506,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); } @@ -5721,7 +5780,7 @@ void Node3DEditor::_unhandled_key_input(Ref<InputEvent> p_event) { if (!is_visible_in_tree()) return; - snap_key_enabled = InputFilter::get_singleton()->is_key_pressed(KEY_CONTROL); + snap_key_enabled = Input::get_singleton()->is_key_pressed(KEY_CONTROL); } void Node3DEditor::_notification(int p_what) { @@ -5907,28 +5966,29 @@ void Node3DEditor::_node_removed(Node *p_node) { } void Node3DEditor::_register_all_gizmos() { - add_gizmo_plugin(Ref<CameraNode3DGizmoPlugin>(memnew(CameraNode3DGizmoPlugin))); - add_gizmo_plugin(Ref<LightNode3DGizmoPlugin>(memnew(LightNode3DGizmoPlugin))); - add_gizmo_plugin(Ref<AudioStreamPlayer3DNode3DGizmoPlugin>(memnew(AudioStreamPlayer3DNode3DGizmoPlugin))); - add_gizmo_plugin(Ref<MeshInstanceNode3DGizmoPlugin>(memnew(MeshInstanceNode3DGizmoPlugin))); - add_gizmo_plugin(Ref<SoftBodyNode3DGizmoPlugin>(memnew(SoftBodyNode3DGizmoPlugin))); - add_gizmo_plugin(Ref<Sprite3DNode3DGizmoPlugin>(memnew(Sprite3DNode3DGizmoPlugin))); - add_gizmo_plugin(Ref<SkeletonNode3DGizmoPlugin>(memnew(SkeletonNode3DGizmoPlugin))); - add_gizmo_plugin(Ref<Position3DNode3DGizmoPlugin>(memnew(Position3DNode3DGizmoPlugin))); - add_gizmo_plugin(Ref<RayCastNode3DGizmoPlugin>(memnew(RayCastNode3DGizmoPlugin))); - add_gizmo_plugin(Ref<SpringArmNode3DGizmoPlugin>(memnew(SpringArmNode3DGizmoPlugin))); - add_gizmo_plugin(Ref<VehicleWheelNode3DGizmoPlugin>(memnew(VehicleWheelNode3DGizmoPlugin))); - add_gizmo_plugin(Ref<VisibilityNotifierGizmoPlugin>(memnew(VisibilityNotifierGizmoPlugin))); + add_gizmo_plugin(Ref<Camera3DGizmoPlugin>(memnew(Camera3DGizmoPlugin))); + add_gizmo_plugin(Ref<Light3DGizmoPlugin>(memnew(Light3DGizmoPlugin))); + add_gizmo_plugin(Ref<AudioStreamPlayer3DGizmoPlugin>(memnew(AudioStreamPlayer3DGizmoPlugin))); + add_gizmo_plugin(Ref<MeshInstance3DGizmoPlugin>(memnew(MeshInstance3DGizmoPlugin))); + add_gizmo_plugin(Ref<SoftBody3DGizmoPlugin>(memnew(SoftBody3DGizmoPlugin))); + add_gizmo_plugin(Ref<Sprite3DGizmoPlugin>(memnew(Sprite3DGizmoPlugin))); + add_gizmo_plugin(Ref<Skeleton3DGizmoPlugin>(memnew(Skeleton3DGizmoPlugin))); + add_gizmo_plugin(Ref<Position3DGizmoPlugin>(memnew(Position3DGizmoPlugin))); + add_gizmo_plugin(Ref<RayCast3DGizmoPlugin>(memnew(RayCast3DGizmoPlugin))); + add_gizmo_plugin(Ref<SpringArm3DGizmoPlugin>(memnew(SpringArm3DGizmoPlugin))); + add_gizmo_plugin(Ref<VehicleWheel3DGizmoPlugin>(memnew(VehicleWheel3DGizmoPlugin))); + add_gizmo_plugin(Ref<VisibilityNotifier3DGizmoPlugin>(memnew(VisibilityNotifier3DGizmoPlugin))); add_gizmo_plugin(Ref<GPUParticles3DGizmoPlugin>(memnew(GPUParticles3DGizmoPlugin))); add_gizmo_plugin(Ref<CPUParticles3DGizmoPlugin>(memnew(CPUParticles3DGizmoPlugin))); add_gizmo_plugin(Ref<ReflectionProbeGizmoPlugin>(memnew(ReflectionProbeGizmoPlugin))); + add_gizmo_plugin(Ref<DecalGizmoPlugin>(memnew(DecalGizmoPlugin))); add_gizmo_plugin(Ref<GIProbeGizmoPlugin>(memnew(GIProbeGizmoPlugin))); // add_gizmo_plugin(Ref<BakedIndirectLightGizmoPlugin>(memnew(BakedIndirectLightGizmoPlugin))); - add_gizmo_plugin(Ref<CollisionShapeNode3DGizmoPlugin>(memnew(CollisionShapeNode3DGizmoPlugin))); - add_gizmo_plugin(Ref<CollisionPolygonNode3DGizmoPlugin>(memnew(CollisionPolygonNode3DGizmoPlugin))); - add_gizmo_plugin(Ref<NavigationMeshNode3DGizmoPlugin>(memnew(NavigationMeshNode3DGizmoPlugin))); - add_gizmo_plugin(Ref<JointNode3DGizmoPlugin>(memnew(JointNode3DGizmoPlugin))); - add_gizmo_plugin(Ref<PhysicalBoneNode3DGizmoPlugin>(memnew(PhysicalBoneNode3DGizmoPlugin))); + add_gizmo_plugin(Ref<CollisionShape3DGizmoPlugin>(memnew(CollisionShape3DGizmoPlugin))); + add_gizmo_plugin(Ref<CollisionPolygon3DGizmoPlugin>(memnew(CollisionPolygon3DGizmoPlugin))); + add_gizmo_plugin(Ref<NavigationRegion3DGizmoPlugin>(memnew(NavigationRegion3DGizmoPlugin))); + add_gizmo_plugin(Ref<Joint3DGizmoPlugin>(memnew(Joint3DGizmoPlugin))); + add_gizmo_plugin(Ref<PhysicalBone3DGizmoPlugin>(memnew(PhysicalBone3DGizmoPlugin))); } void Node3DEditor::_bind_methods() { @@ -6381,7 +6441,7 @@ Vector3 Node3DEditor::snap_point(Vector3 p_target, Vector3 p_start) const { float Node3DEditor::get_translate_snap() const { float snap_value; - if (InputFilter::get_singleton()->is_key_pressed(KEY_SHIFT)) { + if (Input::get_singleton()->is_key_pressed(KEY_SHIFT)) { snap_value = snap_translate->get_text().to_double() / 10.0; } else { snap_value = snap_translate->get_text().to_double(); @@ -6392,7 +6452,7 @@ float Node3DEditor::get_translate_snap() const { float Node3DEditor::get_rotate_snap() const { float snap_value; - if (InputFilter::get_singleton()->is_key_pressed(KEY_SHIFT)) { + if (Input::get_singleton()->is_key_pressed(KEY_SHIFT)) { snap_value = snap_rotate->get_text().to_double() / 3.0; } else { snap_value = snap_rotate->get_text().to_double(); @@ -6403,7 +6463,7 @@ float Node3DEditor::get_rotate_snap() const { float Node3DEditor::get_scale_snap() const { float snap_value; - if (InputFilter::get_singleton()->is_key_pressed(KEY_SHIFT)) { + if (Input::get_singleton()->is_key_pressed(KEY_SHIFT)) { snap_value = snap_scale->get_text().to_double() / 2.0; } else { snap_value = snap_scale->get_text().to_double(); diff --git a/editor/plugins/node_3d_editor_plugin.h b/editor/plugins/node_3d_editor_plugin.h index 552afb99e0..71da14ae1a 100644 --- a/editor/plugins/node_3d_editor_plugin.h +++ b/editor/plugins/node_3d_editor_plugin.h @@ -202,7 +202,7 @@ class Node3DEditorViewport : public Control { VIEW_AUDIO_DOPPLER, VIEW_GIZMOS, VIEW_INFORMATION, - VIEW_FPS, + VIEW_FRAME_TIME, VIEW_DISPLAY_NORMAL, VIEW_DISPLAY_WIREFRAME, VIEW_DISPLAY_OVERDRAW, @@ -218,6 +218,8 @@ class Node3DEditorViewport : public Control { VIEW_DISPLAY_DEBUG_SCENE_LUMINANCE, VIEW_DISPLAY_DEBUG_SSAO, VIEW_DISPLAY_DEBUG_ROUGHNESS_LIMITER, + VIEW_DISPLAY_DEBUG_PSSM_SPLITS, + VIEW_DISPLAY_DEBUG_DECAL_ATLAS, VIEW_LOCK_ROTATION, VIEW_CINEMATIC_PREVIEW, VIEW_AUTO_ORTHOGONAL, @@ -228,7 +230,9 @@ public: enum { GIZMO_BASE_LAYER = 27, GIZMO_EDIT_LAYER = 26, - GIZMO_GRID_LAYER = 25 + GIZMO_GRID_LAYER = 25, + + FRAME_TIME_HISTORY = 20, }; enum NavigationScheme { @@ -237,7 +241,18 @@ public: NAVIGATION_MODO, }; + enum FreelookNavigationScheme { + FREELOOK_DEFAULT, + FREELOOK_PARTIALLY_AXIS_LOCKED, + FREELOOK_FULLY_AXIS_LOCKED, + }; + private: + float cpu_time_history[FRAME_TIME_HISTORY]; + int cpu_time_history_index; + float gpu_time_history[FRAME_TIME_HISTORY]; + int gpu_time_history_index; + int index; String name; void _menu_option(int p_option); @@ -841,12 +856,11 @@ public: static const int HIDDEN = 1; static const int ON_TOP = 2; -private: +protected: int current_state; List<EditorNode3DGizmo *> current_gizmos; HashMap<String, Vector<Ref<StandardMaterial3D>>> materials; -protected: static void _bind_methods(); virtual bool has_gizmo(Node3D *p_spatial); virtual Ref<EditorNode3DGizmo> create_gizmo(Node3D *p_spatial); diff --git a/editor/plugins/path_3d_editor_plugin.cpp b/editor/plugins/path_3d_editor_plugin.cpp index 3ee8225418..d3ece9556d 100644 --- a/editor/plugins/path_3d_editor_plugin.cpp +++ b/editor/plugins/path_3d_editor_plugin.cpp @@ -34,7 +34,7 @@ #include "node_3d_editor_plugin.h" #include "scene/resources/curve.h" -String PathNode3DGizmo::get_handle_name(int p_idx) const { +String Path3DGizmo::get_handle_name(int p_idx) const { Ref<Curve3D> c = path->get_curve(); if (c.is_null()) @@ -57,7 +57,7 @@ String PathNode3DGizmo::get_handle_name(int p_idx) const { return n; } -Variant PathNode3DGizmo::get_handle_value(int p_idx) { +Variant Path3DGizmo::get_handle_value(int p_idx) { Ref<Curve3D> c = path->get_curve(); if (c.is_null()) @@ -84,7 +84,7 @@ Variant PathNode3DGizmo::get_handle_value(int p_idx) { return ofs; } -void PathNode3DGizmo::set_handle(int p_idx, Camera3D *p_camera, const Point2 &p_point) { +void Path3DGizmo::set_handle(int p_idx, Camera3D *p_camera, const Point2 &p_point) { Ref<Curve3D> c = path->get_curve(); if (c.is_null()) @@ -154,7 +154,7 @@ void PathNode3DGizmo::set_handle(int p_idx, Camera3D *p_camera, const Point2 &p_ } } -void PathNode3DGizmo::commit_handle(int p_idx, const Variant &p_restore, bool p_cancel) { +void Path3DGizmo::commit_handle(int p_idx, const Variant &p_restore, bool p_cancel) { Ref<Curve3D> c = path->get_curve(); if (c.is_null()) @@ -217,7 +217,7 @@ void PathNode3DGizmo::commit_handle(int p_idx, const Variant &p_restore, bool p_ } } -void PathNode3DGizmo::redraw() { +void Path3DGizmo::redraw() { clear(); @@ -286,7 +286,7 @@ void PathNode3DGizmo::redraw() { } } -PathNode3DGizmo::PathNode3DGizmo(Path3D *p_path) { +Path3DGizmo::Path3DGizmo(Path3D *p_path) { path = p_path; set_spatial_node(p_path); @@ -563,7 +563,7 @@ Path3DEditorPlugin::Path3DEditorPlugin(EditorNode *p_node) { mirror_handle_angle = true; mirror_handle_length = true; - Ref<PathNode3DGizmoPlugin> gizmo_plugin; + Ref<Path3DGizmoPlugin> gizmo_plugin; gizmo_plugin.instance(); Node3DEditor::get_singleton()->add_gizmo_plugin(gizmo_plugin); @@ -627,24 +627,24 @@ Path3DEditorPlugin::Path3DEditorPlugin(EditorNode *p_node) { Path3DEditorPlugin::~Path3DEditorPlugin() { } -Ref<EditorNode3DGizmo> PathNode3DGizmoPlugin::create_gizmo(Node3D *p_spatial) { - Ref<PathNode3DGizmo> ref; +Ref<EditorNode3DGizmo> Path3DGizmoPlugin::create_gizmo(Node3D *p_spatial) { + Ref<Path3DGizmo> ref; Path3D *path = Object::cast_to<Path3D>(p_spatial); - if (path) ref = Ref<PathNode3DGizmo>(memnew(PathNode3DGizmo(path))); + if (path) ref = Ref<Path3DGizmo>(memnew(Path3DGizmo(path))); return ref; } -String PathNode3DGizmoPlugin::get_name() const { +String Path3DGizmoPlugin::get_name() const { return "Path3D"; } -int PathNode3DGizmoPlugin::get_priority() const { +int Path3DGizmoPlugin::get_priority() const { return -1; } -PathNode3DGizmoPlugin::PathNode3DGizmoPlugin() { +Path3DGizmoPlugin::Path3DGizmoPlugin() { Color path_color = EDITOR_DEF("editors/3d_gizmos/gizmo_colors/path", Color(0.5, 0.5, 1.0, 0.8)); create_material("path_material", path_color); diff --git a/editor/plugins/path_3d_editor_plugin.h b/editor/plugins/path_3d_editor_plugin.h index 715f8d1bb5..3f18cadacd 100644 --- a/editor/plugins/path_3d_editor_plugin.h +++ b/editor/plugins/path_3d_editor_plugin.h @@ -34,9 +34,9 @@ #include "editor/node_3d_editor_gizmos.h" #include "scene/3d/path_3d.h" -class PathNode3DGizmo : public EditorNode3DGizmo { +class Path3DGizmo : public EditorNode3DGizmo { - GDCLASS(PathNode3DGizmo, EditorNode3DGizmo); + GDCLASS(Path3DGizmo, EditorNode3DGizmo); Path3D *path; mutable Vector3 original; @@ -50,12 +50,12 @@ public: virtual void commit_handle(int p_idx, const Variant &p_restore, bool p_cancel = false); virtual void redraw(); - PathNode3DGizmo(Path3D *p_path = nullptr); + Path3DGizmo(Path3D *p_path = nullptr); }; -class PathNode3DGizmoPlugin : public EditorNode3DGizmoPlugin { +class Path3DGizmoPlugin : public EditorNode3DGizmoPlugin { - GDCLASS(PathNode3DGizmoPlugin, EditorNode3DGizmoPlugin); + GDCLASS(Path3DGizmoPlugin, EditorNode3DGizmoPlugin); protected: Ref<EditorNode3DGizmo> create_gizmo(Node3D *p_spatial); @@ -63,7 +63,7 @@ protected: public: String get_name() const; int get_priority() const; - PathNode3DGizmoPlugin(); + Path3DGizmoPlugin(); }; class Path3DEditorPlugin : public EditorPlugin { diff --git a/editor/plugins/polygon_2d_editor_plugin.cpp b/editor/plugins/polygon_2d_editor_plugin.cpp index 1f7a5b9968..e15d8556e4 100644 --- a/editor/plugins/polygon_2d_editor_plugin.cpp +++ b/editor/plugins/polygon_2d_editor_plugin.cpp @@ -31,7 +31,7 @@ #include "polygon_2d_editor_plugin.h" #include "canvas_item_editor_plugin.h" -#include "core/input/input_filter.h" +#include "core/input/input.h" #include "core/os/file_access.h" #include "core/os/keyboard.h" #include "editor/editor_scale.h" @@ -810,7 +810,7 @@ void Polygon2DEditor::_uv_input(const Ref<InputEvent> &p_input) { if (mm.is_valid()) { - if ((mm->get_button_mask() & BUTTON_MASK_MIDDLE) || InputFilter::get_singleton()->is_key_pressed(KEY_SPACE)) { + if ((mm->get_button_mask() & BUTTON_MASK_MIDDLE) || Input::get_singleton()->is_key_pressed(KEY_SPACE)) { Vector2 drag(mm->get_relative().x, mm->get_relative().y); uv_hscroll->set_value(uv_hscroll->get_value() - drag.x); diff --git a/editor/plugins/root_motion_editor_plugin.cpp b/editor/plugins/root_motion_editor_plugin.cpp index 67e836082d..a7120c5d68 100644 --- a/editor/plugins/root_motion_editor_plugin.cpp +++ b/editor/plugins/root_motion_editor_plugin.cpp @@ -288,7 +288,7 @@ void EditorInspectorRootMotionPlugin::parse_begin(Object *p_object) { //do none } -bool EditorInspectorRootMotionPlugin::parse_property(Object *p_object, Variant::Type p_type, const String &p_path, PropertyHint p_hint, const String &p_hint_text, int p_usage) { +bool EditorInspectorRootMotionPlugin::parse_property(Object *p_object, Variant::Type p_type, const String &p_path, PropertyHint p_hint, const String &p_hint_text, int p_usage, bool p_wide) { if (p_path == "root_motion_track" && p_object->is_class("AnimationTree") && p_type == Variant::NODE_PATH) { EditorPropertyRootMotion *editor = memnew(EditorPropertyRootMotion); diff --git a/editor/plugins/root_motion_editor_plugin.h b/editor/plugins/root_motion_editor_plugin.h index 8a7691de5d..f72ad1ec05 100644 --- a/editor/plugins/root_motion_editor_plugin.h +++ b/editor/plugins/root_motion_editor_plugin.h @@ -65,7 +65,7 @@ class EditorInspectorRootMotionPlugin : public EditorInspectorPlugin { public: virtual bool can_handle(Object *p_object); virtual void parse_begin(Object *p_object); - virtual bool parse_property(Object *p_object, Variant::Type p_type, const String &p_path, PropertyHint p_hint, const String &p_hint_text, int p_usage); + virtual bool parse_property(Object *p_object, Variant::Type p_type, const String &p_path, PropertyHint p_hint, const String &p_hint_text, int p_usage, bool p_wide = false); virtual void parse_end(); }; diff --git a/editor/plugins/script_editor_plugin.cpp b/editor/plugins/script_editor_plugin.cpp index dd80fff008..35a08f2d1c 100644 --- a/editor/plugins/script_editor_plugin.cpp +++ b/editor/plugins/script_editor_plugin.cpp @@ -30,7 +30,7 @@ #include "script_editor_plugin.h" -#include "core/input/input_filter.h" +#include "core/input/input.h" #include "core/io/resource_loader.h" #include "core/os/file_access.h" #include "core/os/keyboard.h" @@ -1243,7 +1243,7 @@ void ScriptEditor::_menu_option(int p_option) { file_system_dock->navigate_to_path(path); // Ensure that the FileSystem dock is visible. TabContainer *tab_container = (TabContainer *)file_system_dock->get_parent_control(); - tab_container->set_current_tab(file_system_dock->get_position_in_parent()); + tab_container->set_current_tab(file_system_dock->get_index()); } } break; case CLOSE_DOCS: { @@ -1545,7 +1545,7 @@ void ScriptEditor::_help_overview_selected(int p_idx) { void ScriptEditor::_script_selected(int p_idx) { - grab_focus_block = !InputFilter::get_singleton()->is_mouse_button_pressed(1); //amazing hack, simply amazing + grab_focus_block = !Input::get_singleton()->is_mouse_button_pressed(1); //amazing hack, simply amazing _go_to_tab(script_list->get_item_metadata(p_idx)); grab_focus_block = false; @@ -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)); } } } @@ -1778,9 +1778,11 @@ void ScriptEditor::_update_script_names() { if (built_in) { name = path.get_file(); - String resource_name = se->get_edited_resource()->get_name(); + const String &resource_name = se->get_edited_resource()->get_name(); if (resource_name != "") { - name = name.substr(0, name.find("::", 0) + 2) + resource_name; + // If the built-in script has a custom resource name defined, + // display the built-in script name as follows: `ResourceName (scene_file.tscn)` + name = vformat("%s (%s)", resource_name, name.substr(0, name.find("::", 0))); } } else { @@ -1864,6 +1866,10 @@ void ScriptEditor::_update_script_names() { if (new_cur_tab == -1 && sedata[i].index == cur_tab) { new_cur_tab = i; } + // Update index of sd entries for sorted order + _ScriptEditorItemData sd = sedata[i]; + sd.index = i; + sedata.set(i, sd); } tab_container->set_current_tab(new_prev_tab); tab_container->set_current_tab(new_cur_tab); diff --git a/editor/plugins/script_text_editor.cpp b/editor/plugins/script_text_editor.cpp index 4b8383e1e5..1a77eeb9de 100644 --- a/editor/plugins/script_text_editor.cpp +++ b/editor/plugins/script_text_editor.cpp @@ -172,7 +172,7 @@ void ScriptTextEditor::_update_member_keywords() { for (List<PropertyInfo>::Element *E = plist.front(); E; E = E->next()) { String name = E->get().name; - if (E->get().usage & PROPERTY_USAGE_CATEGORY || E->get().usage & PROPERTY_USAGE_GROUP) + if (E->get().usage & PROPERTY_USAGE_CATEGORY || E->get().usage & PROPERTY_USAGE_GROUP || E->get().usage & PROPERTY_USAGE_SUBGROUP) continue; if (name.find("/") != -1) continue; diff --git a/editor/plugins/shader_editor_plugin.cpp b/editor/plugins/shader_editor_plugin.cpp index 2a36700105..9ef8148241 100644 --- a/editor/plugins/shader_editor_plugin.cpp +++ b/editor/plugins/shader_editor_plugin.cpp @@ -193,6 +193,12 @@ void ShaderTextEditor::_check_shader_mode() { } } +static ShaderLanguage::DataType _get_global_variable_type(const StringName &p_variable) { + + RS::GlobalVariableType gvt = RS::get_singleton()->global_variable_get_type(p_variable); + return RS::global_variable_type_get_shader_datatype(gvt); +} + void ShaderTextEditor::_code_complete_script(const String &p_code, List<ScriptCodeCompletionOption> *r_options) { _check_shader_mode(); @@ -200,7 +206,7 @@ void ShaderTextEditor::_code_complete_script(const String &p_code, List<ScriptCo ShaderLanguage sl; String calltip; - sl.complete(p_code, ShaderTypes::get_singleton()->get_functions(RenderingServer::ShaderMode(shader->get_mode())), ShaderTypes::get_singleton()->get_modes(RenderingServer::ShaderMode(shader->get_mode())), ShaderTypes::get_singleton()->get_types(), r_options, calltip); + sl.complete(p_code, ShaderTypes::get_singleton()->get_functions(RenderingServer::ShaderMode(shader->get_mode())), ShaderTypes::get_singleton()->get_modes(RenderingServer::ShaderMode(shader->get_mode())), ShaderTypes::get_singleton()->get_types(), _get_global_variable_type, r_options, calltip); get_text_edit()->set_code_hint(calltip); } @@ -215,7 +221,7 @@ void ShaderTextEditor::_validate_script() { ShaderLanguage sl; - Error err = sl.compile(code, ShaderTypes::get_singleton()->get_functions(RenderingServer::ShaderMode(shader->get_mode())), ShaderTypes::get_singleton()->get_modes(RenderingServer::ShaderMode(shader->get_mode())), ShaderTypes::get_singleton()->get_types()); + Error err = sl.compile(code, ShaderTypes::get_singleton()->get_functions(RenderingServer::ShaderMode(shader->get_mode())), ShaderTypes::get_singleton()->get_modes(RenderingServer::ShaderMode(shader->get_mode())), ShaderTypes::get_singleton()->get_types(), _get_global_variable_type); if (err != OK) { String error_text = "error(" + itos(sl.get_error_line()) + "): " + sl.get_error_text(); diff --git a/editor/plugins/shader_file_editor_plugin.cpp b/editor/plugins/shader_file_editor_plugin.cpp new file mode 100644 index 0000000000..296c7a01b6 --- /dev/null +++ b/editor/plugins/shader_file_editor_plugin.cpp @@ -0,0 +1,303 @@ +#include "shader_file_editor_plugin.h" + +#include "core/io/resource_loader.h" +#include "core/io/resource_saver.h" +#include "core/os/keyboard.h" +#include "core/os/os.h" +#include "editor/editor_node.h" +#include "editor/editor_scale.h" +#include "editor/editor_settings.h" +#include "editor/property_editor.h" +#include "servers/display_server.h" +#include "servers/rendering/shader_types.h" + +/*** SHADER SCRIPT EDITOR ****/ + +/*** SCRIPT EDITOR ******/ + +void ShaderFileEditor::_update_version(const StringName &p_version_txt, const RD::ShaderStage p_stage) { +} + +void ShaderFileEditor::_version_selected(int p_option) { + + int c = versions->get_current(); + StringName version_txt = versions->get_item_metadata(c); + + RD::ShaderStage stage = RD::SHADER_STAGE_MAX; + int first_found = -1; + + Ref<RDShaderBytecode> bytecode = shader_file->get_bytecode(version_txt); + ERR_FAIL_COND(bytecode.is_null()); + + for (int i = 0; i < RD::SHADER_STAGE_MAX; i++) { + if (bytecode->get_stage_bytecode(RD::ShaderStage(i)).empty() && bytecode->get_stage_compile_error(RD::ShaderStage(i)) == String()) { + stages[i]->set_icon(Ref<Texture2D>()); + continue; + } + + Ref<Texture2D> icon; + if (bytecode->get_stage_compile_error(RD::ShaderStage(i)) != String()) { + icon = get_theme_icon("ImportFail", "EditorIcons"); + } else { + icon = get_theme_icon("ImportCheck", "EditorIcons"); + } + stages[i]->set_icon(icon); + + if (first_found == -1) { + first_found = i; + } + + if (stages[i]->is_pressed()) { + stage = RD::ShaderStage(i); + break; + } + } + + error_text->clear(); + + if (stage == RD::SHADER_STAGE_MAX) { //need to change stage, does not have it + if (first_found == -1) { + error_text->add_text(TTR("No valid shader stages found.")); + return; //well you did not put any stage I guess? + } + stages[first_found]->set_pressed(true); + stage = RD::ShaderStage(first_found); + } + + String error = bytecode->get_stage_compile_error(stage); + + error_text->push_font(get_theme_font("source", "EditorFonts")); + + if (error == String()) { + error_text->add_text(TTR("Shader stage compiled without errors.")); + } else { + error_text->add_text(error); + } +} + +void ShaderFileEditor::_update_options() { + + ERR_FAIL_COND(shader_file.is_null()); + + if (shader_file->get_base_error() != String()) { + stage_hb->hide(); + versions->hide(); + error_text->clear(); + error_text->push_font(get_theme_font("source", "EditorFonts")); + error_text->add_text(vformat(TTR("File structure for '%s' contains unrecoverable errors:\n\n"), shader_file->get_path().get_file())); + error_text->add_text(shader_file->get_base_error()); + return; + } + + stage_hb->show(); + versions->show(); + + int c = versions->get_current(); + //remember current + versions->clear(); + Vector<StringName> version_list = shader_file->get_version_list(); + + if (c >= version_list.size()) { + c = version_list.size() - 1; + } + if (c < 0) { + c = 0; + } + + StringName current_version; + + for (int i = 0; i < version_list.size(); i++) { + String title = version_list[i]; + if (title == "") { + title = "default"; + } + + Ref<Texture2D> icon; + + Ref<RDShaderBytecode> bytecode = shader_file->get_bytecode(version_list[i]); + ERR_FAIL_COND(bytecode.is_null()); + + bool failed = false; + for (int j = 0; j < RD::SHADER_STAGE_MAX; j++) { + String error = bytecode->get_stage_compile_error(RD::ShaderStage(j)); + if (error != String()) { + failed = true; + } + } + + if (failed) { + icon = get_theme_icon("ImportFail", "EditorIcons"); + } else { + icon = get_theme_icon("ImportCheck", "EditorIcons"); + } + + versions->add_item(title, icon); + versions->set_item_metadata(i, version_list[i]); + + if (i == c) { + versions->select(i); + current_version = version_list[i]; + } + } + + if (version_list.size() == 0) { + for (int i = 0; i < RD::SHADER_STAGE_MAX; i++) { + stages[i]->set_disabled(true); + } + return; + } + + Ref<RDShaderBytecode> bytecode = shader_file->get_bytecode(current_version); + ERR_FAIL_COND(bytecode.is_null()); + int first_valid = -1; + int current = -1; + for (int i = 0; i < RD::SHADER_STAGE_MAX; i++) { + Vector<uint8_t> bc = bytecode->get_stage_bytecode(RD::ShaderStage(i)); + String error = bytecode->get_stage_compile_error(RD::ShaderStage(i)); + bool disable = error == String() && bc.empty(); + stages[i]->set_disabled(disable); + if (!disable) { + if (stages[i]->is_pressed()) { + current = i; + } + first_valid = i; + } + } + + if (current == -1 && first_valid != -1) { + stages[first_valid]->set_pressed(true); + } + + _version_selected(0); +} + +void ShaderFileEditor::_notification(int p_what) { + + if (p_what == NOTIFICATION_WM_FOCUS_IN) { + if (is_visible_in_tree() && shader_file.is_valid()) { + _update_options(); + } + } +} + +void ShaderFileEditor::_editor_settings_changed() { + + if (is_visible_in_tree() && shader_file.is_valid()) { + _update_options(); + } +} + +void ShaderFileEditor::_bind_methods() { +} + +void ShaderFileEditor::edit(const Ref<RDShaderFile> &p_shader) { + + if (p_shader.is_null()) { + if (shader_file.is_valid()) { + shader_file->disconnect("changed", callable_mp(this, &ShaderFileEditor::_shader_changed)); + } + return; + } + + if (shader_file == p_shader) + return; + + shader_file = p_shader; + + if (shader_file.is_valid()) { + shader_file->connect("changed", callable_mp(this, &ShaderFileEditor::_shader_changed)); + } + + _update_options(); +} + +void ShaderFileEditor::_shader_changed() { + + if (is_visible_in_tree()) { + _update_options(); + } +} + +ShaderFileEditor *ShaderFileEditor::singleton = nullptr; + +ShaderFileEditor::ShaderFileEditor(EditorNode *p_node) { + singleton = this; + HSplitContainer *main_hs = memnew(HSplitContainer); + + add_child(main_hs); + + versions = memnew(ItemList); + versions->connect("item_selected", callable_mp(this, &ShaderFileEditor::_version_selected)); + versions->set_custom_minimum_size(Size2i(200 * EDSCALE, 0)); + main_hs->add_child(versions); + + VBoxContainer *main_vb = memnew(VBoxContainer); + main_vb->set_h_size_flags(SIZE_EXPAND_FILL); + main_hs->add_child(main_vb); + + static const char *stage_str[RD::SHADER_STAGE_MAX] = { + "Vertex", + "Fragment", + "TessControl", + "TessEval", + "Compute" + }; + + stage_hb = memnew(HBoxContainer); + main_vb->add_child(stage_hb); + + Ref<ButtonGroup> bg; + bg.instance(); + for (int i = 0; i < RD::SHADER_STAGE_MAX; i++) { + Button *button = memnew(Button(stage_str[i])); + button->set_toggle_mode(true); + button->set_focus_mode(FOCUS_NONE); + stage_hb->add_child(button); + stages[i] = button; + button->set_button_group(bg); + button->connect("pressed", callable_mp(this, &ShaderFileEditor::_version_selected), varray(i)); + } + + error_text = memnew(RichTextLabel); + error_text->set_v_size_flags(SIZE_EXPAND_FILL); + main_vb->add_child(error_text); +} + +void ShaderFileEditorPlugin::edit(Object *p_object) { + + RDShaderFile *s = Object::cast_to<RDShaderFile>(p_object); + shader_editor->edit(s); +} + +bool ShaderFileEditorPlugin::handles(Object *p_object) const { + + RDShaderFile *shader = Object::cast_to<RDShaderFile>(p_object); + return shader != nullptr; +} + +void ShaderFileEditorPlugin::make_visible(bool p_visible) { + + if (p_visible) { + button->show(); + editor->make_bottom_panel_item_visible(shader_editor); + + } else { + + button->hide(); + if (shader_editor->is_visible_in_tree()) + editor->hide_bottom_panel(); + } +} + +ShaderFileEditorPlugin::ShaderFileEditorPlugin(EditorNode *p_node) { + + editor = p_node; + shader_editor = memnew(ShaderFileEditor(p_node)); + + shader_editor->set_custom_minimum_size(Size2(0, 300) * EDSCALE); + button = editor->add_bottom_panel_item(TTR("ShaderFile"), shader_editor); + button->hide(); +} + +ShaderFileEditorPlugin::~ShaderFileEditorPlugin() { +} diff --git a/editor/plugins/shader_file_editor_plugin.h b/editor/plugins/shader_file_editor_plugin.h new file mode 100644 index 0000000000..44d32de2f1 --- /dev/null +++ b/editor/plugins/shader_file_editor_plugin.h @@ -0,0 +1,64 @@ +#ifndef SHADER_FILE_EDITOR_PLUGIN_H +#define SHADER_FILE_EDITOR_PLUGIN_H + +#include "editor/code_editor.h" +#include "editor/editor_plugin.h" +#include "scene/gui/menu_button.h" +#include "scene/gui/panel_container.h" +#include "scene/gui/rich_text_label.h" +#include "scene/gui/tab_container.h" +#include "scene/gui/text_edit.h" +#include "scene/main/timer.h" +#include "servers/rendering/rendering_device_binds.h" + +class ShaderFileEditor : public PanelContainer { + + GDCLASS(ShaderFileEditor, PanelContainer); + + Ref<RDShaderFile> shader_file; + + HBoxContainer *stage_hb; + ItemList *versions; + Button *stages[RD::SHADER_STAGE_MAX]; + RichTextLabel *error_text; + + void _update_version(const StringName &p_version_txt, const RenderingDevice::ShaderStage p_stage); + void _version_selected(int p_stage); + void _editor_settings_changed(); + + void _update_options(); + void _shader_changed(); + +protected: + void _notification(int p_what); + static void _bind_methods(); + +public: + static ShaderFileEditor *singleton; + void edit(const Ref<RDShaderFile> &p_shader); + + ShaderFileEditor(EditorNode *p_node); +}; + +class ShaderFileEditorPlugin : public EditorPlugin { + + GDCLASS(ShaderFileEditorPlugin, EditorPlugin); + + ShaderFileEditor *shader_editor; + EditorNode *editor; + Button *button; + +public: + virtual String get_name() const { return "ShaderFile"; } + bool has_main_screen() const { return false; } + virtual void edit(Object *p_object); + virtual bool handles(Object *p_object) const; + virtual void make_visible(bool p_visible); + + ShaderFileEditor *get_shader_editor() const { return shader_editor; } + + ShaderFileEditorPlugin(EditorNode *p_node); + ~ShaderFileEditorPlugin(); +}; + +#endif // SHADER_FILE_EDITOR_PLUGIN_H 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/style_box_editor_plugin.cpp b/editor/plugins/style_box_editor_plugin.cpp index fbb6616dea..eb6e261305 100644 --- a/editor/plugins/style_box_editor_plugin.cpp +++ b/editor/plugins/style_box_editor_plugin.cpp @@ -45,7 +45,7 @@ void EditorInspectorPluginStyleBox::parse_begin(Object *p_object) { preview->edit(sb); add_custom_control(preview); } -bool EditorInspectorPluginStyleBox::parse_property(Object *p_object, Variant::Type p_type, const String &p_path, PropertyHint p_hint, const String &p_hint_text, int p_usage) { +bool EditorInspectorPluginStyleBox::parse_property(Object *p_object, Variant::Type p_type, const String &p_path, PropertyHint p_hint, const String &p_hint_text, int p_usage, bool p_wide) { return false; //do not want } void EditorInspectorPluginStyleBox::parse_end() { diff --git a/editor/plugins/style_box_editor_plugin.h b/editor/plugins/style_box_editor_plugin.h index f4a72d9d1c..1eea9260b2 100644 --- a/editor/plugins/style_box_editor_plugin.h +++ b/editor/plugins/style_box_editor_plugin.h @@ -62,7 +62,7 @@ class EditorInspectorPluginStyleBox : public EditorInspectorPlugin { public: virtual bool can_handle(Object *p_object); virtual void parse_begin(Object *p_object); - virtual bool parse_property(Object *p_object, Variant::Type p_type, const String &p_path, PropertyHint p_hint, const String &p_hint_text, int p_usage); + virtual bool parse_property(Object *p_object, Variant::Type p_type, const String &p_path, PropertyHint p_hint, const String &p_hint_text, int p_usage, bool p_wide = false); virtual void parse_end(); }; diff --git a/editor/plugins/texture_region_editor_plugin.cpp b/editor/plugins/texture_region_editor_plugin.cpp index cd69c1e6f9..099c9ceb5d 100644 --- a/editor/plugins/texture_region_editor_plugin.cpp +++ b/editor/plugins/texture_region_editor_plugin.cpp @@ -31,7 +31,7 @@ #include "texture_region_editor_plugin.h" #include "core/core_string_names.h" -#include "core/input/input_filter.h" +#include "core/input/input.h" #include "core/os/keyboard.h" #include "editor/editor_scale.h" #include "scene/gui/check_box.h" @@ -307,7 +307,7 @@ void TextureRegionEditor::_region_input(const Ref<InputEvent> &p_input) { for (List<Rect2>::Element *E = autoslice_cache.front(); E; E = E->next()) { if (E->get().has_point(point)) { rect = E->get(); - if (InputFilter::get_singleton()->is_key_pressed(KEY_CONTROL) && !(InputFilter::get_singleton()->is_key_pressed(KEY_SHIFT | KEY_ALT))) { + if (Input::get_singleton()->is_key_pressed(KEY_CONTROL) && !(Input::get_singleton()->is_key_pressed(KEY_SHIFT | KEY_ALT))) { Rect2 r; if (node_sprite) r = node_sprite->get_region_rect(); @@ -449,7 +449,7 @@ void TextureRegionEditor::_region_input(const Ref<InputEvent> &p_input) { if (mm.is_valid()) { - if (mm->get_button_mask() & BUTTON_MASK_MIDDLE || InputFilter::get_singleton()->is_key_pressed(KEY_SPACE)) { + if (mm->get_button_mask() & BUTTON_MASK_MIDDLE || Input::get_singleton()->is_key_pressed(KEY_SPACE)) { Vector2 dragged(mm->get_relative().x / draw_zoom, mm->get_relative().y / draw_zoom); hscroll->set_value(hscroll->get_value() - dragged.x); @@ -1030,6 +1030,7 @@ TextureRegionEditor::TextureRegionEditor(EditorNode *p_editor) { hscroll->connect("value_changed", callable_mp(this, &TextureRegionEditor::_scroll_changed)); updating_scroll = false; + autoslice_is_dirty = true; } void TextureRegionEditorPlugin::edit(Object *p_object) { diff --git a/editor/plugins/tile_map_editor_plugin.cpp b/editor/plugins/tile_map_editor_plugin.cpp index ce421ac0a5..e22e0cc052 100644 --- a/editor/plugins/tile_map_editor_plugin.cpp +++ b/editor/plugins/tile_map_editor_plugin.cpp @@ -31,7 +31,7 @@ #include "tile_map_editor_plugin.h" #include "canvas_item_editor_plugin.h" -#include "core/input/input_filter.h" +#include "core/input/input.h" #include "core/math/math_funcs.h" #include "core/os/keyboard.h" #include "editor/editor_scale.h" @@ -57,17 +57,18 @@ void TileMapEditor::_notification(int p_what) { } break; + case NOTIFICATION_ENTER_TREE: { + + get_tree()->connect("node_removed", callable_mp(this, &TileMapEditor::_node_removed)); + [[fallthrough]]; + } + case EditorSettings::NOTIFICATION_EDITOR_SETTINGS_CHANGED: { if (is_visible_in_tree()) { _update_palette(); } - [[fallthrough]]; - } - case NOTIFICATION_ENTER_TREE: { - - get_tree()->connect("node_removed", callable_mp(this, &TileMapEditor::_node_removed)); paint_button->set_icon(get_theme_icon("Edit", "EditorIcons")); bucket_fill_button->set_icon(get_theme_icon("Bucket", "EditorIcons")); picker_button->set_icon(get_theme_icon("ColorPick", "EditorIcons")); @@ -996,7 +997,7 @@ bool TileMapEditor::forward_gui_input(const Ref<InputEvent> &p_event) { if (mb->is_pressed()) { - if (InputFilter::get_singleton()->is_key_pressed(KEY_SPACE)) + if (Input::get_singleton()->is_key_pressed(KEY_SPACE)) return false; // Drag. if (tool == TOOL_NONE) { @@ -1377,7 +1378,7 @@ bool TileMapEditor::forward_gui_input(const Ref<InputEvent> &p_event) { return true; } - if (tool == TOOL_PICKING && InputFilter::get_singleton()->is_mouse_button_pressed(BUTTON_LEFT)) { + if (tool == TOOL_PICKING && Input::get_singleton()->is_mouse_button_pressed(BUTTON_LEFT)) { _pick_tile(over_tile); diff --git a/editor/plugins/tile_set_editor_plugin.cpp b/editor/plugins/tile_set_editor_plugin.cpp index d1dda68c1d..c393b15a97 100644 --- a/editor/plugins/tile_set_editor_plugin.cpp +++ b/editor/plugins/tile_set_editor_plugin.cpp @@ -30,7 +30,7 @@ #include "tile_set_editor_plugin.h" -#include "core/input/input_filter.h" +#include "core/input/input.h" #include "core/os/keyboard.h" #include "editor/editor_scale.h" #include "editor/plugins/canvas_item_editor_plugin.h" @@ -1113,7 +1113,7 @@ void TileSetEditor::_on_workspace_draw() { void TileSetEditor::_on_workspace_process() { - if (InputFilter::get_singleton()->is_key_pressed(KEY_ALT) || tools[VISIBLE_INFO]->is_pressed()) { + if (Input::get_singleton()->is_key_pressed(KEY_ALT) || tools[VISIBLE_INFO]->is_pressed()) { if (!tile_names_visible) { tile_names_visible = true; workspace_overlay->update(); @@ -1395,7 +1395,7 @@ void TileSetEditor::_on_workspace_input(const Ref<InputEvent> &p_ie) { if ((mb->get_button_index() == BUTTON_RIGHT || mb->get_button_index() == BUTTON_LEFT) && current_tile_region.has_point(mb->get_position())) { dragging = true; erasing = (mb->get_button_index() == BUTTON_RIGHT); - alternative = InputFilter::get_singleton()->is_key_pressed(KEY_SHIFT); + alternative = Input::get_singleton()->is_key_pressed(KEY_SHIFT); Vector2 coord((int)((mb->get_position().x - current_tile_region.position.x) / (spacing + size.x)), (int)((mb->get_position().y - current_tile_region.position.y) / (spacing + size.y))); Vector2 pos(coord.x * (spacing + size.x), coord.y * (spacing + size.y)); pos = mb->get_position() - (pos + current_tile_region.position); diff --git a/editor/plugins/visual_shader_editor_plugin.cpp b/editor/plugins/visual_shader_editor_plugin.cpp index b1bd6392d8..a7e737fdd2 100644 --- a/editor/plugins/visual_shader_editor_plugin.cpp +++ b/editor/plugins/visual_shader_editor_plugin.cpp @@ -30,7 +30,7 @@ #include "visual_shader_editor_plugin.h" -#include "core/input/input_filter.h" +#include "core/input/input.h" #include "core/io/resource_loader.h" #include "core/math/math_defs.h" #include "core/os/keyboard.h" @@ -556,6 +556,17 @@ void VisualShaderEditor::_update_graph() { uniform_name->connect("text_entered", callable_mp(this, &VisualShaderEditor::_line_edit_changed), varray(uniform_name, nodes[n_i])); uniform_name->connect("focus_exited", callable_mp(this, &VisualShaderEditor::_line_edit_focus_out), varray(uniform_name, nodes[n_i])); + String error = vsnode->get_warning(visual_shader->get_mode(), type); + if (error != String()) { + offset = memnew(Control); + offset->set_custom_minimum_size(Size2(0, 4 * EDSCALE)); + node->add_child(offset); + Label *error_label = memnew(Label); + error_label->add_theme_color_override("font_color", get_theme_color("error_color", "Editor")); + error_label->set_text(error); + node->add_child(error_label); + } + if (vsnode->get_input_port_count() == 0 && vsnode->get_output_port_count() == 1 && vsnode->get_output_port_name(0) == "") { //shortcut VisualShaderNode::PortType port_right = vsnode->get_output_port_type(0); @@ -1624,7 +1635,7 @@ void VisualShaderEditor::_graph_gui_input(const Ref<InputEvent> &p_event) { popup_menu->set_item_disabled(NodeMenuOptions::DELETE, to_change.empty()); popup_menu->set_item_disabled(NodeMenuOptions::DUPLICATE, to_change.empty()); menu_point = graph->get_local_mouse_position(); - Point2 gpos = InputFilter::get_singleton()->get_mouse_position(); + Point2 gpos = Input::get_singleton()->get_mouse_position(); popup_menu->set_position(gpos); popup_menu->popup(); } @@ -1637,7 +1648,7 @@ void VisualShaderEditor::_show_members_dialog(bool at_mouse_pos) { saved_node_pos_dirty = true; saved_node_pos = graph->get_local_mouse_position(); - Point2 gpos = InputFilter::get_singleton()->get_mouse_position(); + Point2 gpos = Input::get_singleton()->get_mouse_position(); members_dialog->popup(); members_dialog->set_position(gpos); } else { @@ -2250,6 +2261,12 @@ void VisualShaderEditor::_show_preview_text() { } } +static ShaderLanguage::DataType _get_global_variable_type(const StringName &p_variable) { + + RS::GlobalVariableType gvt = RS::get_singleton()->global_variable_get_type(p_variable); + return RS::global_variable_type_get_shader_datatype(gvt); +} + void VisualShaderEditor::_update_preview() { if (!preview_showed) { @@ -2263,7 +2280,7 @@ void VisualShaderEditor::_update_preview() { ShaderLanguage sl; - Error err = sl.compile(code, ShaderTypes::get_singleton()->get_functions(RenderingServer::ShaderMode(visual_shader->get_mode())), ShaderTypes::get_singleton()->get_modes(RenderingServer::ShaderMode(visual_shader->get_mode())), ShaderTypes::get_singleton()->get_types()); + Error err = sl.compile(code, ShaderTypes::get_singleton()->get_functions(RenderingServer::ShaderMode(visual_shader->get_mode())), ShaderTypes::get_singleton()->get_modes(RenderingServer::ShaderMode(visual_shader->get_mode())), ShaderTypes::get_singleton()->get_types(), _get_global_variable_type); for (int i = 0; i < preview_text->get_line_count(); i++) { preview_text->set_line_as_marked(i, false); @@ -3280,7 +3297,7 @@ void EditorInspectorShaderModePlugin::parse_begin(Object *p_object) { //do none } -bool EditorInspectorShaderModePlugin::parse_property(Object *p_object, Variant::Type p_type, const String &p_path, PropertyHint p_hint, const String &p_hint_text, int p_usage) { +bool EditorInspectorShaderModePlugin::parse_property(Object *p_object, Variant::Type p_type, const String &p_path, PropertyHint p_hint, const String &p_hint_text, int p_usage, bool p_wide) { if (p_path == "mode" && p_object->is_class("VisualShader") && p_type == Variant::INT) { diff --git a/editor/plugins/visual_shader_editor_plugin.h b/editor/plugins/visual_shader_editor_plugin.h index 473c1bb070..a495b09b5c 100644 --- a/editor/plugins/visual_shader_editor_plugin.h +++ b/editor/plugins/visual_shader_editor_plugin.h @@ -338,7 +338,7 @@ class EditorInspectorShaderModePlugin : public EditorInspectorPlugin { public: virtual bool can_handle(Object *p_object); virtual void parse_begin(Object *p_object); - virtual bool parse_property(Object *p_object, Variant::Type p_type, const String &p_path, PropertyHint p_hint, const String &p_hint_text, int p_usage); + virtual bool parse_property(Object *p_object, Variant::Type p_type, const String &p_path, PropertyHint p_hint, const String &p_hint_text, int p_usage, bool p_wide = false); virtual void parse_end(); }; diff --git a/editor/project_manager.cpp b/editor/project_manager.cpp index 0ca540a33f..c918a799e1 100644 --- a/editor/project_manager.cpp +++ b/editor/project_manager.cpp @@ -2779,6 +2779,8 @@ void ProjectListFilter::add_filter_option() { void ProjectListFilter::add_search_box() { search_box = memnew(LineEdit); search_box->set_placeholder(TTR("Search")); + search_box->set_tooltip( + TTR("The search box filters projects by name and last path component.\nTo filter projects by name and full path, the query must contain at least one `/` character.")); search_box->connect("text_changed", callable_mp(this, &ProjectListFilter::_search_text_changed)); search_box->set_h_size_flags(Control::SIZE_EXPAND_FILL); add_child(search_box); diff --git a/editor/project_settings_editor.cpp b/editor/project_settings_editor.cpp index 42493191a8..49c02dc895 100644 --- a/editor/project_settings_editor.cpp +++ b/editor/project_settings_editor.cpp @@ -2135,6 +2135,11 @@ ProjectSettingsEditor::ProjectSettingsEditor(EditorData *p_data) { tab_container->add_child(autoload_settings); autoload_settings->connect("autoload_changed", callable_mp(this, &ProjectSettingsEditor::_settings_changed)); + shaders_global_variables_editor = memnew(ShaderGlobalsEditor); + shaders_global_variables_editor->set_name(TTR("Shader Globals")); + tab_container->add_child(shaders_global_variables_editor); + shaders_global_variables_editor->connect("globals_changed", callable_mp(this, &ProjectSettingsEditor::_settings_changed)); + plugin_settings = memnew(EditorPluginSettings); plugin_settings->set_name(TTR("Plugins")); tab_container->add_child(plugin_settings); diff --git a/editor/project_settings_editor.h b/editor/project_settings_editor.h index 2cecb13198..5475bb5508 100644 --- a/editor/project_settings_editor.h +++ b/editor/project_settings_editor.h @@ -36,6 +36,7 @@ #include "editor/editor_data.h" #include "editor/editor_plugin_settings.h" #include "editor/editor_sectioned_inspector.h" +#include "editor/shader_globals_editor.h" #include "scene/gui/dialogs.h" #include "scene/gui/tab_container.h" @@ -85,6 +86,7 @@ class ProjectSettingsEditor : public AcceptDialog { OptionButton *device_index; Label *device_index_label; MenuButton *popup_copy_to_feature; + ShaderGlobalsEditor *shaders_global_variables_editor; LineEdit *action_name; Button *action_add; diff --git a/editor/property_editor.cpp b/editor/property_editor.cpp index 444cae42c5..60329fb7bc 100644 --- a/editor/property_editor.cpp +++ b/editor/property_editor.cpp @@ -31,7 +31,7 @@ #include "property_editor.h" #include "core/class_db.h" -#include "core/input/input_filter.h" +#include "core/input/input.h" #include "core/io/image_loader.h" #include "core/io/marshalls.h" #include "core/io/resource_loader.h" @@ -257,7 +257,7 @@ void CustomPropertyEditor::_menu_option(int p_which) { file_system_dock->navigate_to_path(r->get_path()); // Ensure that the FileSystem dock is visible. TabContainer *tab_container = (TabContainer *)file_system_dock->get_parent_control(); - tab_container->set_current_tab(file_system_dock->get_position_in_parent()); + tab_container->set_current_tab(file_system_dock->get_index()); } break; default: { @@ -1720,7 +1720,7 @@ real_t CustomPropertyEditor::_parse_real_expression(String text) { void CustomPropertyEditor::_emit_changed_whole_or_field() { - if (!InputFilter::get_singleton()->is_key_pressed(KEY_SHIFT)) { + if (!Input::get_singleton()->is_key_pressed(KEY_SHIFT)) { emit_signal("variant_changed"); } else { emit_signal("variant_field_changed", field_names[focused_value_editor]); diff --git a/editor/quick_open.cpp b/editor/quick_open.cpp index 4d9870235d..b872bc3dd4 100644 --- a/editor/quick_open.cpp +++ b/editor/quick_open.cpp @@ -113,12 +113,18 @@ void EditorQuickOpen::_sbox_input(const Ref<InputEvent> &p_ie) { float EditorQuickOpen::_path_cmp(String search, String path) const { + // Exact match. if (search == path) { return 1.2f; } - if (path.findn(search) != -1) { - return 1.1f; + + // Substring match, with positive bias for matches close to the end of the path. + int pos = path.rfindn(search); + if (pos != -1) { + return 1.1f + 0.09 / (path.length() - pos + 1); } + + // Similarity. return path.to_lower().similarity(search.to_lower()); } @@ -265,8 +271,7 @@ void EditorQuickOpen::_notification(int p_what) { connect("confirmed", callable_mp(this, &EditorQuickOpen::_confirmed)); search_box->set_clear_button_enabled(true); - [[fallthrough]]; - } + } break; case NOTIFICATION_EXIT_TREE: { disconnect("confirmed", callable_mp(this, &EditorQuickOpen::_confirmed)); } break; 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 eaefd04c6b..92f899a35d 100644 --- a/editor/scene_tree_dock.cpp +++ b/editor/scene_tree_dock.cpp @@ -30,7 +30,7 @@ #include "scene_tree_dock.h" -#include "core/input/input_filter.h" +#include "core/input/input.h" #include "core/io/resource_saver.h" #include "core/os/keyboard.h" #include "core/project_settings.h" @@ -1030,7 +1030,7 @@ void SceneTreeDock::_node_collapsed(Object *p_obj) { if (!ti) return; - if (InputFilter::get_singleton()->is_key_pressed(KEY_SHIFT)) { + if (Input::get_singleton()->is_key_pressed(KEY_SHIFT)) { _set_collapsed_recursive(ti, ti->is_collapsed()); } } @@ -1535,7 +1535,7 @@ void SceneTreeDock::_do_reparent(Node *p_new_parent, int p_position_in_parent, V if (p_nodes[ni] == p_new_parent) return; // Attempt to reparent to itself. - if (p_nodes[ni]->get_parent() != p_new_parent || p_position_in_parent + ni != p_nodes[ni]->get_position_in_parent()) + if (p_nodes[ni]->get_parent() != p_new_parent || p_position_in_parent + ni != p_nodes[ni]->get_index()) no_change = false; } @@ -1644,7 +1644,7 @@ void SceneTreeDock::_do_reparent(Node *p_new_parent, int p_position_in_parent, V owners.push_back(E->get()); } - int child_pos = node->get_position_in_parent(); + int child_pos = node->get_index(); editor_data->get_undo_redo().add_undo_method(node->get_parent(), "add_child", node); editor_data->get_undo_redo().add_undo_method(node->get_parent(), "move_child", node, child_pos); @@ -1918,7 +1918,7 @@ Node *SceneTreeDock::_get_selection_group_tail(Node *p_node, List<Node *> p_list Node *tail = p_node; Node *parent = tail->get_parent(); - for (int i = p_node->get_position_in_parent(); i < parent->get_child_count(); i++) { + for (int i = p_node->get_index(); i < parent->get_child_count(); i++) { Node *sibling = parent->get_child(i); if (p_list.find(sibling)) @@ -2346,7 +2346,7 @@ void SceneTreeDock::_nodes_dragged(Array p_nodes, NodePath p_to, int p_type) { int to_pos = -1; _normalize_drop(to_node, to_pos, p_type); - _do_reparent(to_node, to_pos, nodes, !InputFilter::get_singleton()->is_key_pressed(KEY_SHIFT)); + _do_reparent(to_node, to_pos, nodes, !Input::get_singleton()->is_key_pressed(KEY_SHIFT)); } void SceneTreeDock::_add_children_to_popup(Object *p_obj, int p_depth) { @@ -2867,6 +2867,7 @@ SceneTreeDock::SceneTreeDock(EditorNode *p_editor, Node *p_scene_root, EditorSel edit_local->set_h_size_flags(SIZE_EXPAND_FILL); edit_local->set_text(TTR("Local")); edit_local->set_toggle_mode(true); + edit_local->set_pressed(true); edit_local->connect("pressed", callable_mp(this, &SceneTreeDock::_local_tree_selected)); remote_tree = nullptr; diff --git a/editor/script_create_dialog.cpp b/editor/script_create_dialog.cpp index 82199fc1f1..12b21d871b 100644 --- a/editor/script_create_dialog.cpp +++ b/editor/script_create_dialog.cpp @@ -689,6 +689,8 @@ void ScriptCreateDialog::_update_dialog() { // Is Script created or loaded from existing file? + builtin_warning_label->set_visible(is_built_in); + if (is_built_in) { get_ok()->set_text(TTR("Create")); parent_name->set_editable(true); @@ -756,6 +758,13 @@ ScriptCreateDialog::ScriptCreateDialog() { path_error_label = memnew(Label); vb->add_child(path_error_label); + builtin_warning_label = memnew(Label); + builtin_warning_label->set_text( + TTR("Note: Built-in scripts have some limitations and can't be edited using an external editor.")); + vb->add_child(builtin_warning_label); + builtin_warning_label->set_autowrap(true); + builtin_warning_label->hide(); + status_panel = memnew(PanelContainer); status_panel->set_h_size_flags(Control::SIZE_FILL); status_panel->add_child(vb); diff --git a/editor/script_create_dialog.h b/editor/script_create_dialog.h index f164cd2a15..63a30eba88 100644 --- a/editor/script_create_dialog.h +++ b/editor/script_create_dialog.h @@ -49,6 +49,7 @@ class ScriptCreateDialog : public ConfirmationDialog { LineEdit *class_name; Label *error_label; Label *path_error_label; + Label *builtin_warning_label; PanelContainer *status_panel; LineEdit *parent_name; Button *parent_browse_button; diff --git a/editor/shader_globals_editor.cpp b/editor/shader_globals_editor.cpp new file mode 100644 index 0000000000..566ac54612 --- /dev/null +++ b/editor/shader_globals_editor.cpp @@ -0,0 +1,452 @@ +#include "shader_globals_editor.h" +#include "editor_node.h" + +static const char *global_var_type_names[RS::GLOBAL_VAR_TYPE_MAX] = { + "bool", + "bvec2", + "bvec3", + "bvec4", + "int", + "ivec2", + "ivec3", + "ivec4", + "rect2i", + "uint", + "uvec2", + "uvec3", + "uvec4", + "float", + "vec2", + "vec3", + "vec4", + "color", + "rect2", + "mat2", + "mat3", + "mat4", + "transform_2d", + "transform", + "sampler2D", + "sampler2DArray", + "sampler3D", + "samplerCube", +}; + +class ShaderGlobalsEditorInterface : public Object { + GDCLASS(ShaderGlobalsEditorInterface, Object) + + void _var_changed() { + emit_signal("var_changed"); + } + +protected: + static void _bind_methods() { + ClassDB::bind_method("_var_changed", &ShaderGlobalsEditorInterface::_var_changed); + ADD_SIGNAL(MethodInfo("var_changed")); + } + + bool _set(const StringName &p_name, const Variant &p_value) { + Variant existing = RS::get_singleton()->global_variable_get(p_name); + + if (existing.get_type() == Variant::NIL) { + return false; + } + + UndoRedo *undo_redo = EditorNode::get_singleton()->get_undo_redo(); + + undo_redo->create_action("Set Shader Global Variable"); + undo_redo->add_do_method(RS::get_singleton(), "global_variable_set", p_name, p_value); + undo_redo->add_undo_method(RS::get_singleton(), "global_variable_set", p_name, existing); + RS::GlobalVariableType type = RS::get_singleton()->global_variable_get_type(p_name); + Dictionary gv; + gv["type"] = global_var_type_names[type]; + if (type >= RS::GLOBAL_VAR_TYPE_SAMPLER2D) { + RES res = p_value; + if (res.is_valid()) { + gv["value"] = res->get_path(); + } else { + gv["value"] = ""; + } + } else { + gv["value"] = p_value; + } + + String path = "shader_globals/" + String(p_name); + undo_redo->add_do_property(ProjectSettings::get_singleton(), path, gv); + undo_redo->add_undo_property(ProjectSettings::get_singleton(), path, ProjectSettings::get_singleton()->get(path)); + undo_redo->add_do_method(this, "_var_changed"); + undo_redo->add_undo_method(this, "_var_changed"); + block_update = true; + undo_redo->commit_action(); + block_update = false; + + print_line("all good?"); + return true; + } + + bool _get(const StringName &p_name, Variant &r_ret) const { + r_ret = RS::get_singleton()->global_variable_get(p_name); + return r_ret.get_type() != Variant::NIL; + } + void _get_property_list(List<PropertyInfo> *p_list) const { + Vector<StringName> variables; + variables = RS::get_singleton()->global_variable_get_list(); + for (int i = 0; i < variables.size(); i++) { + PropertyInfo pinfo; + pinfo.name = variables[i]; + + switch (RS::get_singleton()->global_variable_get_type(variables[i])) { + case RS::GLOBAL_VAR_TYPE_BOOL: { + pinfo.type = Variant::BOOL; + } break; + case RS::GLOBAL_VAR_TYPE_BVEC2: { + pinfo.type = Variant::INT; + pinfo.hint = PROPERTY_HINT_FLAGS; + pinfo.hint_string = "x,y"; + } break; + case RS::GLOBAL_VAR_TYPE_BVEC3: { + pinfo.type = Variant::INT; + pinfo.hint = PROPERTY_HINT_FLAGS; + pinfo.hint_string = "x,y,z"; + } break; + case RS::GLOBAL_VAR_TYPE_BVEC4: { + pinfo.type = Variant::INT; + pinfo.hint = PROPERTY_HINT_FLAGS; + pinfo.hint_string = "x,y,z,w"; + } break; + case RS::GLOBAL_VAR_TYPE_INT: { + pinfo.type = Variant::INT; + } break; + case RS::GLOBAL_VAR_TYPE_IVEC2: { + pinfo.type = Variant::VECTOR2I; + } break; + case RS::GLOBAL_VAR_TYPE_IVEC3: { + pinfo.type = Variant::VECTOR3I; + } break; + case RS::GLOBAL_VAR_TYPE_IVEC4: { + pinfo.type = Variant::PACKED_INT32_ARRAY; + } break; + case RS::GLOBAL_VAR_TYPE_RECT2I: { + pinfo.type = Variant::RECT2I; + } break; + case RS::GLOBAL_VAR_TYPE_UINT: { + pinfo.type = Variant::INT; + } break; + case RS::GLOBAL_VAR_TYPE_UVEC2: { + pinfo.type = Variant::VECTOR2I; + } break; + case RS::GLOBAL_VAR_TYPE_UVEC3: { + pinfo.type = Variant::VECTOR3I; + } break; + case RS::GLOBAL_VAR_TYPE_UVEC4: { + pinfo.type = Variant::PACKED_INT32_ARRAY; + } break; + case RS::GLOBAL_VAR_TYPE_FLOAT: { + pinfo.type = Variant::FLOAT; + } break; + case RS::GLOBAL_VAR_TYPE_VEC2: { + pinfo.type = Variant::VECTOR2; + } break; + case RS::GLOBAL_VAR_TYPE_VEC3: { + pinfo.type = Variant::VECTOR3; + } break; + case RS::GLOBAL_VAR_TYPE_VEC4: { + pinfo.type = Variant::PLANE; + } break; + case RS::GLOBAL_VAR_TYPE_RECT2: { + pinfo.type = Variant::RECT2; + } break; + case RS::GLOBAL_VAR_TYPE_COLOR: { + pinfo.type = Variant::COLOR; + } break; + case RS::GLOBAL_VAR_TYPE_MAT2: { + pinfo.type = Variant::PACKED_INT32_ARRAY; + } break; + case RS::GLOBAL_VAR_TYPE_MAT3: { + pinfo.type = Variant::BASIS; + } break; + case RS::GLOBAL_VAR_TYPE_TRANSFORM_2D: { + pinfo.type = Variant::TRANSFORM2D; + } break; + case RS::GLOBAL_VAR_TYPE_TRANSFORM: { + pinfo.type = Variant::TRANSFORM; + } break; + case RS::GLOBAL_VAR_TYPE_MAT4: { + pinfo.type = Variant::PACKED_INT32_ARRAY; + } break; + case RS::GLOBAL_VAR_TYPE_SAMPLER2D: { + pinfo.type = Variant::OBJECT; + pinfo.hint = PROPERTY_HINT_RESOURCE_TYPE; + pinfo.hint_string = "Texture2D"; + } break; + case RS::GLOBAL_VAR_TYPE_SAMPLER2DARRAY: { + pinfo.type = Variant::OBJECT; + pinfo.hint = PROPERTY_HINT_RESOURCE_TYPE; + pinfo.hint_string = "Texture2DArray"; + } break; + case RS::GLOBAL_VAR_TYPE_SAMPLER3D: { + pinfo.type = Variant::OBJECT; + pinfo.hint = PROPERTY_HINT_RESOURCE_TYPE; + pinfo.hint_string = "Texture3D"; + } break; + case RS::GLOBAL_VAR_TYPE_SAMPLERCUBE: { + pinfo.type = Variant::OBJECT; + pinfo.hint = PROPERTY_HINT_RESOURCE_TYPE; + pinfo.hint_string = "Cubemap"; + } break; + default: { + + } break; + } + + p_list->push_back(pinfo); + } + } + +public: + bool block_update = false; + + ShaderGlobalsEditorInterface() { + } +}; + +static Variant create_var(RS::GlobalVariableType p_type) { + switch (p_type) { + case RS::GLOBAL_VAR_TYPE_BOOL: { + return false; + } + case RS::GLOBAL_VAR_TYPE_BVEC2: { + return 0; //bits + } + case RS::GLOBAL_VAR_TYPE_BVEC3: { + return 0; //bits + } + case RS::GLOBAL_VAR_TYPE_BVEC4: { + return 0; //bits + } + case RS::GLOBAL_VAR_TYPE_INT: { + return 0; //bits + } + case RS::GLOBAL_VAR_TYPE_IVEC2: { + return Vector2i(); + } + case RS::GLOBAL_VAR_TYPE_IVEC3: { + return Vector3i(); + } + case RS::GLOBAL_VAR_TYPE_IVEC4: { + Vector<int> v4; + v4.resize(4); + v4.write[0] = 0; + v4.write[1] = 0; + v4.write[2] = 0; + v4.write[3] = 0; + return v4; + } + case RS::GLOBAL_VAR_TYPE_RECT2I: { + return Rect2i(); + } + case RS::GLOBAL_VAR_TYPE_UINT: { + return 0; + } + case RS::GLOBAL_VAR_TYPE_UVEC2: { + return Vector2i(); + } + case RS::GLOBAL_VAR_TYPE_UVEC3: { + return Vector3i(); + } + case RS::GLOBAL_VAR_TYPE_UVEC4: { + return Rect2i(); + } + case RS::GLOBAL_VAR_TYPE_FLOAT: { + return 0.0; + } + case RS::GLOBAL_VAR_TYPE_VEC2: { + return Vector2(); + } + case RS::GLOBAL_VAR_TYPE_VEC3: { + return Vector3(); + } + case RS::GLOBAL_VAR_TYPE_VEC4: { + return Plane(); + } + case RS::GLOBAL_VAR_TYPE_RECT2: { + return Rect2(); + } + case RS::GLOBAL_VAR_TYPE_COLOR: { + return Color(); + } + case RS::GLOBAL_VAR_TYPE_MAT2: { + Vector<real_t> xform; + xform.resize(4); + xform.write[0] = 1; + xform.write[1] = 0; + xform.write[2] = 0; + xform.write[3] = 1; + return xform; + } + case RS::GLOBAL_VAR_TYPE_MAT3: { + return Basis(); + } + case RS::GLOBAL_VAR_TYPE_TRANSFORM_2D: { + return Transform2D(); + } + case RS::GLOBAL_VAR_TYPE_TRANSFORM: { + return Transform(); + } + case RS::GLOBAL_VAR_TYPE_MAT4: { + Vector<real_t> xform; + xform.resize(4); + xform.write[0] = 1; + xform.write[1] = 0; + xform.write[2] = 0; + xform.write[3] = 0; + + xform.write[4] = 0; + xform.write[5] = 1; + xform.write[6] = 0; + xform.write[7] = 0; + + xform.write[8] = 0; + xform.write[9] = 0; + xform.write[10] = 1; + xform.write[11] = 0; + + xform.write[12] = 0; + xform.write[13] = 0; + xform.write[14] = 0; + xform.write[15] = 1; + + return xform; + } + case RS::GLOBAL_VAR_TYPE_SAMPLER2D: { + return ""; + } + case RS::GLOBAL_VAR_TYPE_SAMPLER2DARRAY: { + return ""; + } + case RS::GLOBAL_VAR_TYPE_SAMPLER3D: { + return ""; + } + case RS::GLOBAL_VAR_TYPE_SAMPLERCUBE: { + return ""; + } + default: { + return Variant(); + } + } +} + +void ShaderGlobalsEditor::_variable_added() { + + String var = variable_name->get_text().strip_edges(); + if (var == "" || !var.is_valid_identifier()) { + EditorNode::get_singleton()->show_warning(TTR("Please specify a valid variable identifier name.")); + return; + } + + if (RenderingServer::get_singleton()->global_variable_get(var).get_type() != Variant::NIL) { + EditorNode::get_singleton()->show_warning(vformat(TTR("Global variable '%s' already exists'"), var)); + return; + } + + List<String> keywords; + ShaderLanguage::get_keyword_list(&keywords); + + if (keywords.find(var) != nullptr || var == "script") { + EditorNode::get_singleton()->show_warning(vformat(TTR("Name '%s' is a reserved shader language keyword."), var)); + return; + } + + UndoRedo *undo_redo = EditorNode::get_singleton()->get_undo_redo(); + + Variant value = create_var(RS::GlobalVariableType(variable_type->get_selected())); + + undo_redo->create_action("Add Shader Global Variable"); + undo_redo->add_do_method(RS::get_singleton(), "global_variable_add", var, RS::GlobalVariableType(variable_type->get_selected()), value); + undo_redo->add_undo_method(RS::get_singleton(), "global_variable_remove", var); + Dictionary gv; + gv["type"] = global_var_type_names[variable_type->get_selected()]; + gv["value"] = value; + + undo_redo->add_do_property(ProjectSettings::get_singleton(), "shader_globals/" + var, gv); + undo_redo->add_undo_property(ProjectSettings::get_singleton(), "shader_globals/" + var, Variant()); + undo_redo->add_do_method(this, "_changed"); + undo_redo->add_undo_method(this, "_changed"); + undo_redo->commit_action(); +} + +void ShaderGlobalsEditor::_variable_deleted(const String &p_variable) { + + print_line("deleted " + p_variable); + UndoRedo *undo_redo = EditorNode::get_singleton()->get_undo_redo(); + + undo_redo->create_action("Add Shader Global Variable"); + undo_redo->add_do_method(RS::get_singleton(), "global_variable_remove", p_variable); + undo_redo->add_undo_method(RS::get_singleton(), "global_variable_add", p_variable, RS::get_singleton()->global_variable_get_type(p_variable), RS::get_singleton()->global_variable_get(p_variable)); + + undo_redo->add_do_property(ProjectSettings::get_singleton(), "shader_globals/" + p_variable, Variant()); + undo_redo->add_undo_property(ProjectSettings::get_singleton(), "shader_globals/" + p_variable, ProjectSettings::get_singleton()->get("shader_globals/" + p_variable)); + undo_redo->add_do_method(this, "_changed"); + undo_redo->add_undo_method(this, "_changed"); + undo_redo->commit_action(); +} + +void ShaderGlobalsEditor::_changed() { + emit_signal("globals_changed"); + if (!interface->block_update) { + interface->_change_notify(); + } +} + +void ShaderGlobalsEditor::_bind_methods() { + ClassDB::bind_method("_changed", &ShaderGlobalsEditor::_changed); + ADD_SIGNAL(MethodInfo("globals_changed")); +} + +void ShaderGlobalsEditor::_notification(int p_what) { + if (p_what == NOTIFICATION_VISIBILITY_CHANGED) { + if (is_visible_in_tree()) { + print_line("OK load settings in globalseditor"); + inspector->edit(interface); + } + } +} + +ShaderGlobalsEditor::ShaderGlobalsEditor() { + + HBoxContainer *add_menu_hb = memnew(HBoxContainer); + add_child(add_menu_hb); + + add_menu_hb->add_child(memnew(Label(TTR("Name:")))); + variable_name = memnew(LineEdit); + variable_name->set_h_size_flags(SIZE_EXPAND_FILL); + add_menu_hb->add_child(variable_name); + + add_menu_hb->add_child(memnew(Label(TTR("Type:")))); + variable_type = memnew(OptionButton); + variable_type->set_h_size_flags(SIZE_EXPAND_FILL); + add_menu_hb->add_child(variable_type); + + for (int i = 0; i < RS::GLOBAL_VAR_TYPE_MAX; i++) { + variable_type->add_item(global_var_type_names[i]); + } + + variable_add = memnew(Button(TTR("Add"))); + add_menu_hb->add_child(variable_add); + variable_add->connect("pressed", callable_mp(this, &ShaderGlobalsEditor::_variable_added)); + + inspector = memnew(EditorInspector); + inspector->set_v_size_flags(SIZE_EXPAND_FILL); + add_child(inspector); + inspector->set_use_wide_editors(true); + inspector->set_enable_capitalize_paths(false); + inspector->set_use_deletable_properties(true); + inspector->connect("property_deleted", callable_mp(this, &ShaderGlobalsEditor::_variable_deleted), varray(), CONNECT_DEFERRED); + + interface = memnew(ShaderGlobalsEditorInterface); + interface->connect("var_changed", Callable(this, "_changed")); +} +ShaderGlobalsEditor::~ShaderGlobalsEditor() { + inspector->edit(NULL); + memdelete(interface); +} diff --git a/editor/shader_globals_editor.h b/editor/shader_globals_editor.h new file mode 100644 index 0000000000..59cdeddd8d --- /dev/null +++ b/editor/shader_globals_editor.h @@ -0,0 +1,38 @@ +#ifndef SHADER_GLOBALS_EDITOR_H +#define SHADER_GLOBALS_EDITOR_H + +#include "core/undo_redo.h" +#include "editor/editor_autoload_settings.h" +#include "editor/editor_data.h" +#include "editor/editor_plugin_settings.h" +#include "editor/editor_sectioned_inspector.h" +#include "scene/gui/dialogs.h" +#include "scene/gui/tab_container.h" + +class ShaderGlobalsEditorInterface; + +class ShaderGlobalsEditor : public VBoxContainer { + + GDCLASS(ShaderGlobalsEditor, VBoxContainer) + + ShaderGlobalsEditorInterface *interface; + EditorInspector *inspector; + + LineEdit *variable_name; + OptionButton *variable_type; + Button *variable_add; + + void _variable_added(); + void _variable_deleted(const String &p_variable); + void _changed(); + +protected: + static void _bind_methods(); + void _notification(int p_what); + +public: + ShaderGlobalsEditor(); + ~ShaderGlobalsEditor(); +}; + +#endif // SHADER_GLOBALS_EDITOR_H diff --git a/editor/translations/af.po b/editor/translations/af.po index 23afeb2e55..fb354fa199 100644 --- a/editor/translations/af.po +++ b/editor/translations/af.po @@ -1505,7 +1505,7 @@ msgstr "Skuif AutoLaai" msgid "Remove Autoload" msgstr "Hernoem AutoLaai" -#: editor/editor_autoload_settings.cpp +#: editor/editor_autoload_settings.cpp editor/editor_plugin_settings.cpp msgid "Enable" msgstr "Aktiveer" @@ -2974,7 +2974,11 @@ msgid "Q&A" msgstr "" #: editor/editor_node.cpp -msgid "Issue Tracker" +msgid "Report a Bug" +msgstr "" + +#: editor/editor_node.cpp +msgid "Send Docs Feedback" msgstr "" #: editor/editor_node.cpp editor/plugins/asset_library_editor_plugin.cpp @@ -4040,7 +4044,7 @@ msgid "Reimport" msgstr "" #: editor/import_dock.cpp -msgid "Save scenes, re-import and restart" +msgid "Save Scenes, Re-Import, and Restart" msgstr "" #: editor/import_dock.cpp @@ -6936,14 +6940,6 @@ msgid "Open Godot online documentation." msgstr "Opnoemings" #: editor/plugins/script_editor_plugin.cpp -msgid "Request Docs" -msgstr "" - -#: editor/plugins/script_editor_plugin.cpp -msgid "Help improve the Godot documentation by giving feedback." -msgstr "" - -#: editor/plugins/script_editor_plugin.cpp msgid "Search the reference documentation." msgstr "" @@ -7393,6 +7389,10 @@ msgid "This operation requires a single selected node." msgstr "" #: editor/plugins/spatial_editor_plugin.cpp +msgid "Auto Orthogonal Enabled" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp msgid "Lock View Rotation" msgstr "" @@ -7482,13 +7482,13 @@ msgid "Freelook Slow Modifier" msgstr "" #: editor/plugins/spatial_editor_plugin.cpp -msgid "" -"Note: The FPS value displayed is the editor's framerate.\n" -"It cannot be used as a reliable indication of in-game performance." +msgid "View Rotation Locked" msgstr "" #: editor/plugins/spatial_editor_plugin.cpp -msgid "View Rotation Locked" +msgid "" +"Note: The FPS value displayed is the editor's framerate.\n" +"It cannot be used as a reliable indication of in-game performance." msgstr "" #: editor/plugins/spatial_editor_plugin.cpp @@ -9944,6 +9944,13 @@ msgid "" "Would you like to explore official example projects in the Asset Library?" msgstr "" +#: editor/project_manager.cpp +msgid "" +"The search box filters projects by name and last path component.\n" +"To filter projects by name and full path, the query must contain at least " +"one `/` character." +msgstr "" + #: editor/project_settings_editor.cpp msgid "Key " msgstr "" @@ -10928,6 +10935,12 @@ msgid "Script file already exists." msgstr "AutoLaai '%s' bestaan reeds!" #: editor/script_create_dialog.cpp +msgid "" +"Note: Built-in scripts have some limitations and can't be edited using an " +"external editor." +msgstr "" + +#: editor/script_create_dialog.cpp #, fuzzy msgid "Class Name:" msgstr "Klas:" @@ -11057,6 +11070,10 @@ msgid "Total:" msgstr "" #: editor/script_editor_debugger.cpp +msgid "Export list to a CSV file" +msgstr "" + +#: editor/script_editor_debugger.cpp msgid "Resource Path" msgstr "" @@ -12592,6 +12609,10 @@ msgid "" "texture to some node for display." msgstr "" +#: scene/main/viewport.cpp +msgid "Viewport size must be greater than 0 to render anything." +msgstr "" + #: scene/resources/visual_shader_nodes.cpp msgid "Invalid source for preview." msgstr "" diff --git a/editor/translations/ar.po b/editor/translations/ar.po index 2cd523ec69..6181580a68 100644 --- a/editor/translations/ar.po +++ b/editor/translations/ar.po @@ -33,12 +33,14 @@ # traveller010 <manar.bushnaq.001@gmail.com>, 2019. # Ahmed Shahwan <dev.ahmed.shahwan@gmail.com>, 2019. # hshw <shw@tutanota.com>, 2020. +# Youssef Harmal <the.coder.crab@gmail.com>, 2020. +# Nabeel20 <nabeelandnizam@gmail.com>, 2020. msgid "" msgstr "" "Project-Id-Version: Godot Engine editor\n" "POT-Creation-Date: \n" -"PO-Revision-Date: 2020-01-16 22:23+0000\n" -"Last-Translator: hshw <shw@tutanota.com>\n" +"PO-Revision-Date: 2020-04-27 08:24+0000\n" +"Last-Translator: Nabeel20 <nabeelandnizam@gmail.com>\n" "Language-Team: Arabic <https://hosted.weblate.org/projects/godot-engine/" "godot/ar/>\n" "Language: ar\n" @@ -47,7 +49,7 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=6; plural=n==0 ? 0 : n==1 ? 1 : n==2 ? 2 : n%100>=3 " "&& n%100<=10 ? 3 : n%100>=11 ? 4 : 5;\n" -"X-Generator: Weblate 3.10.2-dev\n" +"X-Generator: Weblate 4.0.2-dev\n" #: core/math/expression.cpp modules/gdscript/gdscript_functions.cpp #: modules/visual_script/visual_script_builtin_funcs.cpp @@ -446,7 +448,7 @@ msgstr "لا يمكن Ø¥Ø¶Ø§ÙØ© مقطع جديد بدون جذر" #: editor/animation_track_editor.cpp msgid "Invalid track for Bezier (no suitable sub-properties)" -msgstr "" +msgstr "مقطع غير متواÙÙ‚ مع منØÙ†Ù‰ بيزير Bezier (خصائص ÙØ±Ø¹ÙŠØ© غير متواÙقة)" #: editor/animation_track_editor.cpp msgid "Add Bezier Track" @@ -708,9 +710,8 @@ 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." @@ -747,7 +748,7 @@ msgstr "معياري" #: editor/code_editor.cpp editor/plugins/script_editor_plugin.cpp msgid "Toggle Scripts Panel" -msgstr "" +msgstr "ØªØØ¯ÙŠØ¯ التبويب البرمجي" #: editor/code_editor.cpp editor/plugins/canvas_item_editor_plugin.cpp #: editor/plugins/texture_region_editor_plugin.cpp @@ -827,9 +828,8 @@ msgid "Extra Call Arguments:" msgstr "وسائط إستدعاء إضاÙية :" #: editor/connections_dialog.cpp -#, fuzzy msgid "Receiver Method:" -msgstr "إختر طريقة" +msgstr "الدالة Ø§Ù„Ù…ÙØªÙ„قنة:" #: editor/connections_dialog.cpp msgid "Advanced" @@ -876,7 +876,6 @@ msgid "Connect" msgstr "وصل" #: editor/connections_dialog.cpp -#, fuzzy msgid "Signal:" msgstr "إشارة:" @@ -915,7 +914,7 @@ msgstr "هل أنت(ÙŠ) متأكد(Ø©) أنك تود إزالة كل Ø§Ù„Ø¥ØªØµØ #: editor/connections_dialog.cpp editor/editor_help.cpp editor/node_dock.cpp msgid "Signals" -msgstr "إشارات" +msgstr "الإشارات" #: editor/connections_dialog.cpp msgid "Are you sure you want to remove all connections from this signal?" @@ -1212,9 +1211,8 @@ msgid "Error opening package file, not in ZIP format." msgstr "ØØ¯Ø« خطأ Ø¹Ù†Ø¯ÙØªØ Ù…Ù„Ù Ø§Ù„ØØ²Ù…Ø© بسبب أن المل٠ليس ÙÙŠ صيغة \"ZIP\"." #: editor/editor_asset_installer.cpp -#, fuzzy msgid "%s (Already Exists)" -msgstr "التØÙ…يل التلقائي '%s' موجود اصلا!" +msgstr "%s (موجود أصلاً!)" #: editor/editor_asset_installer.cpp msgid "Uncompressing Assets" @@ -1225,9 +1223,8 @@ msgid "The following files failed extraction from package:" msgstr "ÙØ´Ù„ استخراج Ø§Ù„Ù…Ù„ÙØ§Øª التالية من Ø§Ù„ØØ²Ù…Ø©:" #: editor/editor_asset_installer.cpp -#, fuzzy msgid "And %s more files." -msgstr "%d مزيد من Ø§Ù„Ù…Ù„ÙØ§Øª" +msgstr "Ùˆ %s أيضاً من Ø§Ù„Ù…Ù„ÙØ§Øª." #: editor/editor_asset_installer.cpp editor/project_manager.cpp msgid "Package installed successfully!" @@ -1239,9 +1236,8 @@ msgid "Success!" msgstr "تم بشكل ناجØ!" #: editor/editor_asset_installer.cpp -#, fuzzy msgid "Package Contents:" -msgstr "Ø§Ù„Ù…ØØªÙˆÙŠØ§Øª:" +msgstr "Ù…ØØªÙˆÙŠØ§Øª الرزمة:" #: editor/editor_asset_installer.cpp editor/editor_node.cpp msgid "Install" @@ -1381,9 +1377,8 @@ msgid "Invalid file, not an audio bus layout." msgstr "مل٠خطأ، ليس مل٠نسق بيوس الصوت." #: editor/editor_audio_buses.cpp -#, fuzzy msgid "Error saving file: %s" -msgstr "خطأ ÙÙŠ ØÙظ مجموعة البلاط!" +msgstr "خطأ !خطأ ÙÙŠ تسجيل الملÙ: s%" #: editor/editor_audio_buses.cpp msgid "Add Bus" @@ -1436,18 +1431,16 @@ msgid "Must not collide with an existing engine class name." msgstr "إسم غير ØµØ§Ù„ØØŒ يجب أن لا يتصادم مع أسم ÙØ¦Ø© خاصة Ø¨Ø§Ù„Ù…ØØ±Ùƒ." #: editor/editor_autoload_settings.cpp -#, fuzzy msgid "Must not collide with an existing built-in type name." -msgstr "إسم غير ØµØ§Ù„ØØŒ يجب أن لا يتصادم مع الأسماء المبنية تلقائياً الموجودة." +msgstr "اسم غير ØµØ§Ù„Ø ÙŠØ¬Ø¨ ألا يتضارب مع اسم موجود ومبني ضمناً Ø¨Ø§Ù„Ù…ØØ±Ùƒ." #: editor/editor_autoload_settings.cpp -#, fuzzy msgid "Must not collide with an existing global constant name." -msgstr "إسم غير ØµØ§Ù„ØØŒ ييجب ألاّ يتصادم مع إسم موجود لثابت عمومي." +msgstr "اإسم غير ØµØ§Ù„ØØŒ ييجب ألاّ يتضارب مع اسم ثابت عام موجود Ø³Ù„ÙØ§Ù‹." #: editor/editor_autoload_settings.cpp msgid "Keyword cannot be used as an autoload name." -msgstr "" +msgstr "لا يمكن استخدام الكلمة Ø§Ù„Ù…ÙØªØ§ØÙŠØ© كاسم التØÙ…يل التلقائي." #: editor/editor_autoload_settings.cpp msgid "Autoload '%s' already exists!" @@ -1469,7 +1462,7 @@ msgstr "نقل التØÙ…يل التلقائي" msgid "Remove Autoload" msgstr "ازالة التØÙ…يل التلقائي" -#: editor/editor_autoload_settings.cpp +#: editor/editor_autoload_settings.cpp editor/editor_plugin_settings.cpp msgid "Enable" msgstr "تمكين" @@ -1478,7 +1471,6 @@ msgid "Rearrange Autoloads" msgstr "اعادة ترتيب التØÙ…يلات التلقائية" #: editor/editor_autoload_settings.cpp editor/script_create_dialog.cpp -#, fuzzy msgid "Invalid path." msgstr "مسار غير صالØ." @@ -1540,9 +1532,8 @@ msgid "[unsaved]" msgstr "[غير Ù…ØÙوظ]" #: editor/editor_dir_dialog.cpp -#, fuzzy msgid "Please select a base directory first." -msgstr "من ÙØ¶Ù„Ùƒ ØØ¯Ø¯ الوجهة الأساسية أولاً" +msgstr "من ÙØ¶Ù„Ùƒ ØØ¯Ø¯ الوجهة الأساسية أولاً." #: editor/editor_dir_dialog.cpp msgid "Choose a Directory" @@ -1605,13 +1596,16 @@ msgid "" "Enable 'Import Etc' in Project Settings, or disable 'Driver Fallback " "Enabled'." msgstr "" +"تتطلب المنصة Ø§Ù„Ù…Ø³ØªÙ‡Ø¯ÙØ© ضغط الرسومات النقشية 'ETC' texture ليرجع المعرّ٠إلى " +"GLES2.\n" +"مكّن 'استيراد Etc' ÙÙŠ إعدادات المشروع، أو عطّل 'تمكين التواÙÙ‚ الرجعي Ù„Ù„ØªØ¹Ø±ÙŠÙØ§Øª " +"Driver Fallback Enabled'." #: editor/editor_export.cpp platform/android/export/export.cpp #: platform/iphone/export/export.cpp platform/javascript/export/export.cpp #: platform/osx/export/export.cpp platform/uwp/export/export.cpp -#, fuzzy msgid "Custom debug template not found." -msgstr "مل٠النموذج غير موجود:" +msgstr "نمودج تصØÙŠØ الأخطاء غير موجود." #: editor/editor_export.cpp platform/android/export/export.cpp #: platform/iphone/export/export.cpp platform/javascript/export/export.cpp @@ -1625,116 +1619,101 @@ msgstr "مل٠النموذج غير موجود:" #: editor/editor_export.cpp msgid "On 32-bit exports the embedded PCK cannot be bigger than 4 GiB." -msgstr "" +msgstr "لا يمكن Ù„Ù…ÙØµØ¯Ø±Ø§Øª 32-bit التي تتضمن PCK أن تكون أكبر من 4 GiB." #: editor/editor_feature_profile.cpp -#, fuzzy msgid "3D Editor" -msgstr "Ø§Ù„Ù…ÙØ¹Ø¯Ù„" +msgstr "Ù…ØØ±Ø± تلاثي الأبعاد" #: editor/editor_feature_profile.cpp -#, fuzzy msgid "Script Editor" -msgstr "ÙØªØ Ù…ÙØ¹Ø¯Ù„ الكود" +msgstr "Ù…ØØ±Ø± النص البرمجي" #: editor/editor_feature_profile.cpp msgid "Asset Library" -msgstr "مكتبة الأصول" +msgstr "مكتبة المÙÙ„ØÙ‚ات" #: editor/editor_feature_profile.cpp msgid "Scene Tree Editing" -msgstr "" +msgstr "تعديل شجرة المشهد" #: editor/editor_feature_profile.cpp -#, fuzzy msgid "Import Dock" -msgstr "إستيراد" +msgstr "رصي٠الاستيراد" #: editor/editor_feature_profile.cpp -#, fuzzy msgid "Node Dock" -msgstr "وضع Ø§Ù„ØªØØ±ÙŠÙƒ" +msgstr "رصي٠العÙقد" #: editor/editor_feature_profile.cpp -#, fuzzy msgid "FileSystem and Import Docks" -msgstr "نظام Ø§Ù„Ù…Ù„ÙØ§Øª" +msgstr "رصي٠نظام Ø§Ù„Ù…Ù„ÙØ§Øª Ùˆ الاستيراد" #: editor/editor_feature_profile.cpp -#, fuzzy msgid "Erase profile '%s'? (no undo)" -msgstr "إستبدال الكل" +msgstr "Ù…Ø³Ø Ø§Ù„Ù…Ù„Ù Ø§Ù„Ø´Ø®ØµÙŠ '%s'ØŸ (لا تراجع)" #: editor/editor_feature_profile.cpp msgid "Profile must be a valid filename and must not contain '.'" -msgstr "" +msgstr "ينبغي أن يكون المل٠الشخصي اسم Ù…Ù„Ù ØµØ§Ù„Ø ÙˆØ£Ù„Ù‘Ø§ ÙŠØØªÙˆÙŠ '.'" #: editor/editor_feature_profile.cpp -#, fuzzy msgid "Profile with this name already exists." -msgstr "مل٠أو مجلد مع هذا الأسم موجود Ø¨Ø§Ù„ÙØ¹Ù„." +msgstr "ملÙÙŒ بهذا الاسم موجود Ø¨Ø§Ù„ÙØ¹Ù„." #: editor/editor_feature_profile.cpp msgid "(Editor Disabled, Properties Disabled)" -msgstr "" +msgstr "(Ø§Ù„Ù…ØØ±Ø± Ù…ÙØ¹Ø·Ù‘Ù„ØŒ الخاصيات Ù…ÙØ¹Ø·Ù‘لة)" #: editor/editor_feature_profile.cpp -#, fuzzy msgid "(Properties Disabled)" -msgstr "خصائص Ùقط" +msgstr "(الخاصيات Ù…ÙØ¹Ø·Ù‘لة)" #: editor/editor_feature_profile.cpp -#, fuzzy msgid "(Editor Disabled)" -msgstr "معطّل" +msgstr "(Ø§Ù„Ù…ÙØØ±Ø± Ù…ÙØ¹Ø·Ù‘Ù„)" #: editor/editor_feature_profile.cpp -#, fuzzy msgid "Class Options:" -msgstr "وص٠الصÙ:" +msgstr "إعدادات الص٠Class:" #: editor/editor_feature_profile.cpp -#, fuzzy msgid "Enable Contextual Editor" -msgstr "ÙØªØ ÙÙŠ Ø§Ù„Ù…ÙØ¹Ø¯Ù„ التالي" +msgstr "مكّن Ø§Ù„Ù…ØØ±Ø± السياقي Contextual" #: editor/editor_feature_profile.cpp -#, fuzzy msgid "Enabled Properties:" -msgstr "خصائص:" +msgstr "الخصائص المÙمكّنة:" #: editor/editor_feature_profile.cpp msgid "Enabled Features:" -msgstr "الميزات Ø§Ù„Ù…ÙØ¹Ù„Ø©:" +msgstr "الميزات المÙمكّنة:" #: editor/editor_feature_profile.cpp -#, fuzzy msgid "Enabled Classes:" -msgstr "Ø¥Ø¨ØØ« ÙÙŠ الأصناÙ" +msgstr "الصÙو٠المÙمكّنة:" #: editor/editor_feature_profile.cpp msgid "File '%s' format is invalid, import aborted." -msgstr "" +msgstr "لاØÙ‚Ø© المل٠'%s' غير ØµØ§Ù„ØØ©ØŒ أجهض الإستيراد." #: editor/editor_feature_profile.cpp msgid "" "Profile '%s' already exists. Remove it first before importing, import " "aborted." -msgstr "" +msgstr "الملÙ'%s' موجود Ø³Ù„ÙØ§Ù‹ØŒ قم بإزالته بداية قبل الاستيراد، أجهض الإستيراد." #: editor/editor_feature_profile.cpp -#, fuzzy msgid "Error saving profile to path: '%s'." -msgstr "خطأ ÙÙŠ ØÙظ مجموعة البلاط!" +msgstr "خطأ ÙÙŠ ØÙظ المل٠إلى المسار: '%s'." #: editor/editor_feature_profile.cpp msgid "Unset" -msgstr "" +msgstr "غير Ù…ÙØØ¯Ø¯" #: editor/editor_feature_profile.cpp -#, fuzzy msgid "Current Profile:" -msgstr "النسخة Ø§Ù„ØØ§Ù„ية:" +msgstr "المل٠(النسخة) Ø§Ù„ØØ§Ù„ية:" #: editor/editor_feature_profile.cpp #, fuzzy @@ -1757,44 +1736,36 @@ msgid "Export" msgstr "تصدير" #: editor/editor_feature_profile.cpp -#, fuzzy msgid "Available Profiles:" -msgstr "خصائص:" +msgstr "Ø§Ù„Ù…Ù„ÙØ§Øª Ø§Ù„Ù…ØªÙˆØ§ÙØ±Ø©:" #: editor/editor_feature_profile.cpp -#, fuzzy msgid "Class Options" -msgstr "وص٠الصÙ" +msgstr "إعدادات الص٠Class" #: editor/editor_feature_profile.cpp -#, fuzzy msgid "New profile name:" -msgstr "إسم جديد:" +msgstr "اسم Ù…ÙŽÙ„Ù profile جديد:" #: editor/editor_feature_profile.cpp -#, fuzzy msgid "Erase Profile" -msgstr "زر Ø§Ù„ÙØ£Ø±Ø© الأيمن: Ù…Ø³Ø Ø§Ù„Ù†Ù‚Ø·Ø©." +msgstr "Ù…Ø³Ø Ø§Ù„Ù…Ù„Ù" #: editor/editor_feature_profile.cpp -#, fuzzy msgid "Godot Feature Profile" -msgstr "إدارة قوالب التصدير" +msgstr "Ù…Ù„ÙØ§Øª غودوت Ø§Ù„Ù…ÙØ±Ø´Ù‘ØØ©" #: editor/editor_feature_profile.cpp -#, fuzzy msgid "Import Profile(s)" -msgstr "%d مزيد من Ø§Ù„Ù…Ù„ÙØ§Øª" +msgstr "استيراد الملÙ(Ø§Ù„Ù…Ù„ÙØ§Øª)" #: editor/editor_feature_profile.cpp -#, fuzzy msgid "Export Profile" -msgstr "تصدير المشروع" +msgstr "تصدير الملÙ" #: editor/editor_feature_profile.cpp -#, fuzzy msgid "Manage Editor Feature Profiles" -msgstr "إدارة قوالب التصدير" +msgstr "تدبير Ù…ØØ±Ø± Ø§Ù„Ù…Ù„ÙØ§Øª Ø§Ù„Ù…ÙØ±Ø´ØØ©" #: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp msgid "Select Current Folder" @@ -1805,7 +1776,6 @@ msgid "File Exists, Overwrite?" msgstr "المل٠موجود، إستبدال؟" #: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp -#, fuzzy msgid "Select This Folder" msgstr "ØØ¯Ø¯ هذا المجلد" @@ -1814,13 +1784,11 @@ msgid "Copy Path" msgstr "نسخ المسار" #: editor/editor_file_dialog.cpp editor/filesystem_dock.cpp -#, fuzzy msgid "Open in File Manager" -msgstr "أظهر ÙÙŠ مدير Ø§Ù„Ù…Ù„ÙØ§Øª" +msgstr "Ø§ÙØªØ ÙÙŠ مدير Ø§Ù„Ù…Ù„ÙØ§Øª" #: editor/editor_file_dialog.cpp editor/editor_node.cpp #: editor/filesystem_dock.cpp editor/project_manager.cpp -#, fuzzy msgid "Show in File Manager" msgstr "أظهر ÙÙŠ مدير Ø§Ù„Ù…Ù„ÙØ§Øª" @@ -1970,7 +1938,7 @@ msgstr "ÙØØµ المصادر" msgid "" "There are multiple importers for different types pointing to file %s, import " "aborted" -msgstr "" +msgstr "هناك عدة مستوردات مخصوصة لعدة أنواع ØØ¯Ø¯Øª المل٠%sØŒ أجهض الإستيراد" #: editor/editor_file_system.cpp msgid "(Re)Importing Assets" @@ -1994,7 +1962,6 @@ msgid "Inherited by:" msgstr "مورث بواسطة:" #: editor/editor_help.cpp -#, fuzzy msgid "Description" msgstr "الوصÙ:" @@ -2009,7 +1976,7 @@ msgstr "خصائص" #: editor/editor_help.cpp msgid "override:" -msgstr "" +msgstr "يتجاوز:" #: editor/editor_help.cpp #, fuzzy @@ -2148,7 +2115,7 @@ msgstr "مجموعة" #: editor/editor_inspector.cpp msgid "Set Multiple:" -msgstr "" +msgstr "ØªØØ¯ÙŠØ¯ التكرار:" #: editor/editor_log.cpp msgid "Output:" @@ -2185,8 +2152,9 @@ msgid "Start" msgstr "بدء!" #: editor/editor_network_profiler.cpp +#, fuzzy msgid "%s/s" -msgstr "" +msgstr "%s/s" #: editor/editor_network_profiler.cpp #, fuzzy @@ -2203,19 +2171,19 @@ msgstr "عقدة" #: editor/editor_network_profiler.cpp msgid "Incoming RPC" -msgstr "" +msgstr "نداء إجراء بعيد وادر" #: editor/editor_network_profiler.cpp msgid "Incoming RSET" -msgstr "" +msgstr "RSET (ناقل Ø§Ù„ØØ§Ù„Ø© التمثيلية) وارد" #: editor/editor_network_profiler.cpp msgid "Outgoing RPC" -msgstr "" +msgstr "نداء الإجراء البعيد RPC صادر" #: editor/editor_network_profiler.cpp msgid "Outgoing RSET" -msgstr "" +msgstr "ناقل Ø§Ù„ØØ§Ù„Ø© التمثيلية RSET صادر" #: editor/editor_node.cpp editor/project_manager.cpp msgid "New Window" @@ -2223,7 +2191,7 @@ msgstr "Ù†Ø§ÙØ°Ø© جديدة" #: editor/editor_node.cpp msgid "Imported resources can't be saved." -msgstr "" +msgstr "لا يمكن ØÙظ الموارد المستوردة." #: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp #: scene/gui/dialogs.cpp @@ -2239,6 +2207,8 @@ msgid "" "This resource can't be saved because it does not belong to the edited scene. " "Make it unique first." msgstr "" +"لا يمكن ØÙظ هذا المورد كونه لا ينتمي إلى المشهد الذي تم ØªØØ±ÙŠØ±Ù‡. اجعله مميزاً " +"بداية." #: editor/editor_node.cpp editor/plugins/animation_player_editor_plugin.cpp msgid "Save Resource As..." @@ -2258,7 +2228,7 @@ msgstr "خطأ خلال الØÙظ." #: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp msgid "Can't open '%s'. The file could have been moved or deleted." -msgstr "" +msgstr "لا يمكن ÙØªØ '%s'. ربما تم ØØ°Ù المل٠أو نقله." #: editor/editor_node.cpp msgid "Error while parsing '%s'." @@ -2290,13 +2260,15 @@ msgstr "ينشئ الصورة المصغرة" #: editor/editor_node.cpp msgid "This operation can't be done without a tree root." -msgstr "هذه العملية لا يمكنها الإكتمال من غير جزر الشجرة." +msgstr "هذه العملية لا يمكنها الإكتمال من غير شجرة رئيسة." #: editor/editor_node.cpp msgid "" "This scene can't be saved because there is a cyclic instancing inclusion.\n" "Please resolve it and then attempt to save again." msgstr "" +"لا يمكن ØÙظ هذا المشهد كونخ يتضمن نمذجة دورية cyclic instancing.\n" +"من ÙØ¶Ù„Ùƒ قم بØÙ„ تلك المشكلة ومن ثمَّ ØØ§ÙˆÙ„ من جديد." #: editor/editor_node.cpp msgid "" @@ -2306,7 +2278,7 @@ msgstr "لا يمكن ØÙظ المشهد. على Ø§Ù„Ø£Ø±Ø¬Ø Ù„Ø§ يمكن Ø¥Ø #: editor/editor_node.cpp editor/scene_tree_dock.cpp msgid "Can't overwrite scene that is still open!" -msgstr "" +msgstr "لا يمكن الكتابة عنوة (استبدال overwrite ) المشهد كونه ما زال Ù…ÙØªÙˆØØ§Ù‹!" #: editor/editor_node.cpp msgid "Can't load MeshLibrary for merging!" @@ -2439,7 +2411,7 @@ msgstr "ÙØ´Ù„ تØÙ…يل المورد." #: editor/editor_node.cpp msgid "A root node is required to save the scene." -msgstr "" +msgstr "يتطلب ØÙظ المشهد ØªÙˆØ§ÙØ± عÙقدة رئيسة." #: editor/editor_node.cpp msgid "Save Scene As..." @@ -2668,7 +2640,7 @@ msgstr "أغلق الألسنة الاخرى" #: editor/editor_node.cpp msgid "Close Tabs to the Right" -msgstr "" +msgstr "أغلق التبويبات على اليمين" #: editor/editor_node.cpp #, fuzzy @@ -2808,11 +2780,11 @@ msgstr "النسخة:" #: editor/editor_node.cpp editor/plugins/version_control_editor_plugin.cpp msgid "Set Up Version Control" -msgstr "" +msgstr "إعداد التØÙƒÙ… بالنسخة" #: editor/editor_node.cpp msgid "Shut Down Version Control" -msgstr "" +msgstr "Ø¥Ø·ÙØ§Ø¡ التØÙƒÙ… بالنسخة Version Control" #: editor/editor_node.cpp #, fuzzy @@ -2821,7 +2793,7 @@ msgstr "تصدير" #: editor/editor_node.cpp msgid "Install Android Build Template..." -msgstr "" +msgstr "تØÙ…يل قالب البناء للأندرويد..." #: editor/editor_node.cpp #, fuzzy @@ -2970,7 +2942,7 @@ msgstr "إعدادات Ø§Ù„Ù…ÙØ¹Ø¯Ù„" #: editor/editor_node.cpp msgid "Open Editor Data Folder" -msgstr "" +msgstr "Ø§ÙØªØ مل٠بيانات Ø§Ù„Ù…ØØ±Ø±" #: editor/editor_node.cpp #, fuzzy @@ -3010,8 +2982,13 @@ msgid "Q&A" msgstr "الأسئلة Ùˆ الأجوبة" #: editor/editor_node.cpp -msgid "Issue Tracker" -msgstr "متتبع الأخطاء" +#, fuzzy +msgid "Report a Bug" +msgstr "إعادة إستيراد" + +#: editor/editor_node.cpp +msgid "Send Docs Feedback" +msgstr "إرسال مستندات التغذية الراجعة Feedback" #: editor/editor_node.cpp editor/plugins/asset_library_editor_plugin.cpp msgid "Community" @@ -3031,7 +3008,7 @@ msgstr "تشغيل" #: editor/editor_node.cpp msgid "Pause the scene execution for debugging." -msgstr "" +msgstr "إيقا٠جلسة المشهد من أجل ØªÙ†Ù‚ÙŠØ Ø§Ù„ÙƒØ¨ÙˆØ§Øª البرمجية debugging." #: editor/editor_node.cpp msgid "Pause Scene" @@ -3059,7 +3036,7 @@ msgstr "تشغيل المشهد المخصص" #: editor/editor_node.cpp msgid "Changing the video driver requires restarting the editor." -msgstr "" +msgstr "تعديل معرّ٠الÙيديو video driver يتطلب إعادة تشغيل Ø§Ù„Ù…ØØ±Ø±." #: editor/editor_node.cpp editor/project_settings_editor.cpp #: editor/settings_config_dialog.cpp @@ -3110,7 +3087,7 @@ msgstr "لا تØÙظ" #: editor/editor_node.cpp msgid "Android build template is missing, please install relevant templates." -msgstr "" +msgstr "قالب البناء الخاص بالأندرويد Ù…Ùقود، من ÙØ¶Ù„Ùƒ نزل قوالب ذات صلة." #: editor/editor_node.cpp #, fuzzy @@ -3127,6 +3104,13 @@ msgid "" "the \"Use Custom Build\" option should be enabled in the Android export " "preset." msgstr "" +"بهذه الطريقة سيتم إعداد المشروع الخاص بك لأجل نسخ بناء أندريد مخصوصة عن طريق " +"تنزيل قوالب المصدر البرمجي ÙÙŠ \"res://android/build\".\n" +"يمكنك تطبيق تعديلات الخاصة على نسخة البناء Ù„Ù„ØØµÙˆÙ„ على ØØ²Ù…Ø© تطبيق أندرويد APK " +"معدّلة عند التصدير (زيادة Ù…ÙÙ„ØÙ‚ات، تعديل مل٠AndroidManifest.xml إلخ..).\n" +"ضع ÙÙŠ بالك أنه من أجل إنشاء نسخ بناء مخصوصة بدلاً من Ø§Ù„ØØ²Ù… APKs المبنية Ø³Ù„ÙØ§Ù‹ØŒ " +"ينبغي أن يكون إعداد \"استخدام بناء مخصص\" ممكناً ÙÙŠ إعدادات تصدير الأندرويد " +"Android export preset." #: editor/editor_node.cpp msgid "" @@ -3135,6 +3119,9 @@ msgid "" "Remove the \"res://android/build\" directory manually before attempting this " "operation again." msgstr "" +"إن قالب البناء الخاص بالأندرويد تم تنزيله Ø³Ù„ÙØ§Ù‹ لأجل هذا المشروع ولا يمكنه " +"الكتابة Ùوق البيانات السابقة.\n" +"قم بإزالة \"res://android/build\" يدوياً قبل الشروع بهذه العملية مرة أخرى." #: editor/editor_node.cpp msgid "Import Templates From ZIP File" @@ -3277,7 +3264,7 @@ msgstr "ذاتي" #: editor/editor_profiler.cpp msgid "Frame #:" -msgstr "اطار #:" +msgstr "إطار #:" #: editor/editor_profiler.cpp msgid "Time" @@ -3285,32 +3272,31 @@ msgstr "الوقت" #: editor/editor_profiler.cpp msgid "Calls" -msgstr "ندائات" +msgstr "إستدعاءات" #: editor/editor_properties.cpp -#, fuzzy msgid "Edit Text:" -msgstr "الأعضاء" +msgstr "ØªØØ±ÙŠØ± النص:" #: editor/editor_properties.cpp editor/script_create_dialog.cpp msgid "On" -msgstr "" +msgstr "ÙØ¹Ù‘ال" #: editor/editor_properties.cpp msgid "Layer" -msgstr "" +msgstr "طبقة" #: editor/editor_properties.cpp msgid "Bit %d, value %d" -msgstr "" +msgstr "Bit %dØŒ القيمة %d" #: editor/editor_properties.cpp msgid "[Empty]" -msgstr "" +msgstr "[ÙØ§Ø±Øº]" #: editor/editor_properties.cpp editor/plugins/root_motion_editor_plugin.cpp msgid "Assign..." -msgstr "" +msgstr "Ø¥Ù„ØØ§Ù‚..." #: editor/editor_properties.cpp #, fuzzy @@ -3322,12 +3308,15 @@ msgid "" "The selected resource (%s) does not match any type expected for this " "property (%s)." msgstr "" +"يلا يتطابق نوع المورد المختار (%s) مع أي نوع متوقع لأجل هذه الخاصية (%s)." #: editor/editor_properties.cpp msgid "" "Can't create a ViewportTexture on resources saved as a file.\n" "Resource needs to belong to a scene." msgstr "" +"لا يمكن إنشاء نقشة إطار العرض ViewportTexture على مورد تم ØÙظه كملÙ.\n" +"ينبغي أن ينتمي المورد إلى مشهد ما." #: editor/editor_properties.cpp msgid "" @@ -3336,14 +3325,18 @@ msgid "" "Please switch on the 'local to scene' property on it (and all resources " "containing it up to a node)." msgstr "" +"لا يمكن إنشاء نقشة إطار العرض ViewportTexture اعتماداً على هذا المصدر كونه " +"ليس Ù…ØÙ„ياً بالنسبة للمشهد.\n" +"قم بتشغيل خاصية 'Ù…ØÙ„ÙŠ بالنسبة للمشهد local to scene' لذلك المورد (ولكل " +"الموارد التي تضمنتها وصولاً إلى العقدة)." #: editor/editor_properties.cpp editor/property_editor.cpp msgid "Pick a Viewport" -msgstr "" +msgstr "اختر إطار عرض" #: editor/editor_properties.cpp editor/property_editor.cpp msgid "New Script" -msgstr "" +msgstr "نص برمجي جديد" #: editor/editor_properties.cpp editor/scene_tree_dock.cpp #, fuzzy @@ -3352,7 +3345,7 @@ msgstr "ÙØªØ الكود" #: editor/editor_properties.cpp editor/property_editor.cpp msgid "New %s" -msgstr "" +msgstr "%s جديدة" #: editor/editor_properties.cpp editor/property_editor.cpp msgid "Make Unique" @@ -3370,7 +3363,7 @@ msgstr "إجعلة مميزاً" #: editor/plugins/tile_map_editor_plugin.cpp editor/property_editor.cpp #: scene/gui/line_edit.cpp scene/gui/text_edit.cpp msgid "Paste" -msgstr "" +msgstr "لصق" #: editor/editor_properties.cpp editor/property_editor.cpp msgid "Convert To %s" @@ -3378,20 +3371,20 @@ msgstr "تØÙˆÙŠÙ„ إلي %s" #: editor/editor_properties.cpp editor/property_editor.cpp msgid "Selected node is not a Viewport!" -msgstr "" +msgstr "العÙقدة المختارة ليست إطار عرض Viewport!" #: editor/editor_properties_array_dict.cpp msgid "Size: " -msgstr "" +msgstr "Ø§Ù„ØØ¬Ù…: " #: editor/editor_properties_array_dict.cpp msgid "Page: " -msgstr "" +msgstr "Ø§Ù„ØµÙØØ©: " #: editor/editor_properties_array_dict.cpp #: editor/plugins/theme_editor_plugin.cpp msgid "Remove Item" -msgstr "" +msgstr "إزالة عنصر" #: editor/editor_properties_array_dict.cpp #, fuzzy @@ -3405,7 +3398,7 @@ msgstr "إسم جديد:" #: editor/editor_properties_array_dict.cpp msgid "Add Key/Value Pair" -msgstr "" +msgstr "Ø¥Ø¶Ø§ÙØ© زوج Ù…ÙØªØ§Ø/قيمة" #: editor/editor_run_native.cpp msgid "" @@ -3445,7 +3438,7 @@ msgstr "إختيار عقدة(عقد) للإستيراد" #: editor/editor_sub_scene.cpp editor/project_manager.cpp msgid "Browse" -msgstr "" +msgstr "ØªØµÙØ" #: editor/editor_sub_scene.cpp msgid "Scene Path:" @@ -3475,7 +3468,7 @@ msgstr "تنزيل" #: editor/export_template_manager.cpp msgid "Official export templates aren't available for development builds." -msgstr "" +msgstr "قوالب التصدير الرسمية غير مدعومة لأجل البناء الخاص بالتطوير." #: editor/export_template_manager.cpp msgid "(Missing)" @@ -3520,11 +3513,13 @@ msgstr "يستورد:" #: editor/export_template_manager.cpp msgid "Error getting the list of mirrors." -msgstr "" +msgstr "هناك خطأ ÙÙŠ جلب قائمة المرايا mirrors." #: editor/export_template_manager.cpp msgid "Error parsing JSON of mirror list. Please report this issue!" msgstr "" +"ØØ¯Ø« خطأ ÙÙŠ ÙÙƒ (ØªÙØ³ÙŠØ± parsing) مل٠JSON الخاص بقائمة المرايا. من ÙØ¶Ù„Ùƒ بلّغ عن " +"هذه المشكلة!" #: editor/export_template_manager.cpp msgid "" @@ -3576,6 +3571,8 @@ msgid "" "Templates installation failed.\n" "The problematic templates archives can be found at '%s'." msgstr "" +"أخÙÙ‚ تنصيب القوالب.\n" +"يمكن إيجاد أرشي٠القوالب المعطوبة ÙÙŠ '%s'." #: editor/export_template_manager.cpp #, fuzzy @@ -3860,7 +3857,7 @@ msgstr "مل٠أو مجلد مع هذا الأسم موجود Ø¨Ø§Ù„ÙØ¹Ù„." #: editor/filesystem_dock.cpp msgid "Overwrite" -msgstr "" +msgstr "الكتابة Ø§Ù„Ù…ÙØªØ±Ø§ÙƒØ¨Ø© Overwrite" #: editor/filesystem_dock.cpp #, fuzzy @@ -3869,7 +3866,7 @@ msgstr "ØÙظ المشهد" #: editor/filesystem_dock.cpp editor/plugins/script_editor_plugin.cpp msgid "Create Script" -msgstr "" +msgstr "إنشاء نص برمجي" #: editor/find_in_files.cpp editor/plugins/script_editor_plugin.cpp #, fuzzy @@ -3896,15 +3893,17 @@ msgid "" "Include the files with the following extensions. Add or remove them in " "ProjectSettings." msgstr "" +"يتضمن Ø§Ù„Ù…Ù„ÙØ§Øª ذات Ø§Ù„Ø¥Ø¶Ø§ÙØ§Øª التالية. قم Ø¨Ø¥Ø¶Ø§ÙØªÙ‡Ù… أو إزالتهم ÙÙŠ إعدادات " +"المشروع." #: editor/find_in_files.cpp editor/plugins/script_editor_plugin.cpp #: editor/plugins/script_text_editor.cpp msgid "Find..." -msgstr "" +msgstr "Ø§Ø¨ØØ«..." #: editor/find_in_files.cpp editor/plugins/script_text_editor.cpp msgid "Replace..." -msgstr "" +msgstr "استبدال..." #: editor/find_in_files.cpp editor/progress_dialog.cpp scene/gui/dialogs.cpp msgid "Cancel" @@ -3975,7 +3974,7 @@ msgstr "Ø¥Ø¶Ø§ÙØ© إلي مجموعة" #: editor/groups_editor.cpp editor/scene_tree_dock.cpp #: editor/scene_tree_editor.cpp msgid "Filter nodes" -msgstr "" +msgstr "العÙقد Ø§Ù„Ù…ÙØ±Ø´ØØ© Filter nodes" #: editor/groups_editor.cpp #, fuzzy @@ -3984,7 +3983,7 @@ msgstr "Ø¥Ø¶Ø§ÙØ© إلي مجموعة" #: editor/groups_editor.cpp msgid "Empty groups will be automatically removed." -msgstr "" +msgstr "ستزال المجموعات Ø§Ù„ÙØ§Ø±ØºØ© بصورة تلقائية." #: editor/groups_editor.cpp #, fuzzy @@ -4074,9 +4073,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'" @@ -4100,17 +4098,17 @@ msgid "Reimport" msgstr "إعادة إستيراد" #: editor/import_dock.cpp -msgid "Save scenes, re-import and restart" -msgstr "" +msgid "Save Scenes, Re-Import, and Restart" +msgstr "اØÙظ المشاهد، إعادة-الإستيراد، وإعادة التشغيل" #: editor/import_dock.cpp msgid "Changing the type of an imported file requires editor restart." -msgstr "" +msgstr "يتطلب تعديل نوع Ø§Ù„Ù…Ù„ÙØ§Øª المستوردة إعادة تشغيل Ø§Ù„Ù…ØØ±Ø±." #: editor/import_dock.cpp msgid "" "WARNING: Assets exist that use this resource, they may stop loading properly." -msgstr "" +msgstr "ØªØØ°ÙŠØ±: هناك Ù…ÙÙ„ØÙ‚ات تستخدم هذا المورد، ربما سيتوق٠تØÙ…يلها بشكل صØÙŠØ." #: editor/inspector_dock.cpp msgid "Failed to load resource." @@ -4219,19 +4217,19 @@ msgstr "Ø¥Ø¶Ø§ÙØ§Øª" #: editor/plugin_config_dialog.cpp msgid "Subfolder:" -msgstr "" +msgstr "المجلد Ø§Ù„ÙØ±Ø¹ÙŠ:" #: editor/plugin_config_dialog.cpp editor/script_create_dialog.cpp msgid "Language:" -msgstr "" +msgstr "اللغة:" #: editor/plugin_config_dialog.cpp msgid "Script Name:" -msgstr "" +msgstr "اسم النص البرمجي:" #: editor/plugin_config_dialog.cpp msgid "Activate now?" -msgstr "" +msgstr "Ø§Ù„ØªÙØ¹ÙŠÙ„ الآن؟" #: editor/plugins/abstract_polygon_2d_editor.cpp #: editor/plugins/polygon_2d_editor_plugin.cpp @@ -4320,6 +4318,7 @@ msgstr "تغيير وقت الدمج" #: editor/plugins/animation_state_machine_editor.cpp msgid "This type of node can't be used. Only root nodes are allowed." msgstr "" +"لا يمكن استخدام هذا النوع من العÙقد. Ùقط العÙقد الرئيسة root nodes Ù…Ø³Ù…ÙˆØØ©." #: editor/plugins/animation_blend_space_1d_editor.cpp #: editor/plugins/animation_blend_space_2d_editor.cpp @@ -4334,13 +4333,12 @@ msgid "Add Animation Point" msgstr "Ø£Ø¶Ù ØØ±ÙƒØ©" #: editor/plugins/animation_blend_space_1d_editor.cpp -#, fuzzy msgid "Remove BlendSpace1D Point" -msgstr "Ù…Ø³Ø Ø§Ù„Ø¨ÙˆÙ„ÙŠ والنقطة" +msgstr "إزالة نقطة BlendSpace1D" #: editor/plugins/animation_blend_space_1d_editor.cpp msgid "Move BlendSpace1D Node Point" -msgstr "" +msgstr "ØØ±Ùƒ نقطعة العÙقدة BlendSpace1D" #: editor/plugins/animation_blend_space_1d_editor.cpp #: editor/plugins/animation_blend_space_2d_editor.cpp @@ -4350,95 +4348,92 @@ msgid "" "AnimationTree is inactive.\n" "Activate to enable playback, check node warnings if activation fails." msgstr "" +"شجرة الرسومات Ø§Ù„Ù…ØªØØ±ÙƒØ© غير ÙØ¹Ø§Ù„Ø©.\n" +"ÙØ¹Ù„ها لتتمكن من التشغيل playbackØŒ تÙقد التنبيه الذي تصدره العÙقدة إن ÙØ´Ù„ " +"Ø§Ù„ØªÙØ¹ÙŠÙ„." #: editor/plugins/animation_blend_space_1d_editor.cpp #: editor/plugins/animation_blend_space_2d_editor.cpp msgid "Set the blending position within the space" -msgstr "" +msgstr "ØØ¯Ø¯ مكان الخلط blending position ضمن Ø§Ù„ÙØ±Ø§Øº" #: editor/plugins/animation_blend_space_1d_editor.cpp #: editor/plugins/animation_blend_space_2d_editor.cpp msgid "Select and move points, create points with RMB." -msgstr "" +msgstr "ØØ¯Ø¯ ÙˆØØ±Ùƒ النقاط، أنشئ النقاط باستخدام RMB." #: editor/plugins/animation_blend_space_1d_editor.cpp #: editor/plugins/animation_blend_space_2d_editor.cpp scene/gui/graph_edit.cpp +#, fuzzy msgid "Enable snap and show grid." -msgstr "" +msgstr "تمكين Ø§Ù„Ù…ØØ§Ø°Ø§Ø© وإظهار الشبكة." #: editor/plugins/animation_blend_space_1d_editor.cpp #: editor/plugins/animation_blend_space_2d_editor.cpp msgid "Point" -msgstr "" +msgstr "نقطة" #: editor/plugins/animation_blend_space_1d_editor.cpp #: editor/plugins/animation_blend_space_2d_editor.cpp #: editor/plugins/animation_blend_tree_editor_plugin.cpp -#, fuzzy msgid "Open Editor" -msgstr "ÙØªØ Ø§Ù„Ù…ÙØ¹Ø¯Ù„ 2D" +msgstr "ÙØªØ Ø§Ù„Ù…ÙØØ±Ø± ثنائي الأبعاد 2D" #: editor/plugins/animation_blend_space_1d_editor.cpp #: editor/plugins/animation_blend_space_2d_editor.cpp #: editor/plugins/animation_blend_tree_editor_plugin.cpp #: editor/plugins/animation_state_machine_editor.cpp -#, fuzzy msgid "Open Animation Node" -msgstr "عقدة Ø§Ù„ØØ±ÙƒØ©" +msgstr "ÙØªØ عÙقدة الرسم Ø§Ù„Ù…ØªØØ±Ùƒ Animation" #: editor/plugins/animation_blend_space_2d_editor.cpp -#, fuzzy msgid "Triangle already exists." -msgstr "خطأ: إسم Ø§Ù„ØØ±ÙƒØ© موجود Ø¨Ø§Ù„ÙØ¹Ù„!" +msgstr "المثلثات موجودة Ø³Ù„ÙØ§Ù‹." #: editor/plugins/animation_blend_space_2d_editor.cpp -#, fuzzy msgid "Add Triangle" -msgstr "Ø¥Ø¶Ø§ÙØ© مسار" +msgstr "Ø¥Ø¶Ø§ÙØ© مثلث" #: editor/plugins/animation_blend_space_2d_editor.cpp -#, fuzzy msgid "Change BlendSpace2D Limits" -msgstr "تغيير وقت الدمج" +msgstr "تغيير ØØ¯ÙˆØ¯(إمكانيات) BlendSpace2D \"الدمج_Ø§Ù„ÙØ¶Ø§Ø¦ÙŠ_ثنائي Ø§Ù„Ø¨ÙØ¹Ø¯\"" #: editor/plugins/animation_blend_space_2d_editor.cpp -#, fuzzy msgid "Change BlendSpace2D Labels" -msgstr "تغيير وقت الدمج" +msgstr "تعديل لصاقات BlendSpace2D \"الدمج Ø§Ù„ÙØ¶Ø§Ø¦ÙŠ Ø«Ù†Ø§Ø¦ÙŠ Ø§Ù„Ø¨ÙØ¹Ø¯\"" #: editor/plugins/animation_blend_space_2d_editor.cpp -#, fuzzy msgid "Remove BlendSpace2D Point" -msgstr "Ù…Ø³Ø Ø§Ù„Ø¨ÙˆÙ„ÙŠ والنقطة" +msgstr "إزالة نقاط الدمج Ø§Ù„ÙØ¶Ø§Ø¦ÙŠ Ø«Ù†Ø§Ø¦ÙŠ Ø§Ù„Ø¨ÙØ¹Ø¯ BlendSpace2D" #: editor/plugins/animation_blend_space_2d_editor.cpp msgid "Remove BlendSpace2D Triangle" -msgstr "" +msgstr "إزالة مثلث الدمج Ø§Ù„ÙØ¶Ø§Ø¦ÙŠ Ø«Ù†Ø§Ø¦ÙŠ Ø§Ù„Ø¨ÙØ¹Ø¯ BlendSpace2D" #: editor/plugins/animation_blend_space_2d_editor.cpp msgid "BlendSpace2D does not belong to an AnimationTree node." msgstr "" +"إن BlendSpace2D لا ينتمي إلى عÙقدة شجرة الرسومات Ø§Ù„Ù…ØªØØ±ÙƒØ© AnimationTree." #: editor/plugins/animation_blend_space_2d_editor.cpp msgid "No triangles exist, so no blending can take place." -msgstr "" +msgstr "لا وجود لأي من المثلثات، لذا لا يمكن أن يتم الخلط." #: editor/plugins/animation_blend_space_2d_editor.cpp -#, fuzzy msgid "Toggle Auto Triangles" -msgstr "تبديل التØÙ…يل التلقائي العام" +msgstr "ØªÙØ¹ÙŠÙ„ المثلثات التلقائية" #: editor/plugins/animation_blend_space_2d_editor.cpp msgid "Create triangles by connecting points." -msgstr "" +msgstr "إنشاء المثلثات عن طريق وصل النقاط." #: editor/plugins/animation_blend_space_2d_editor.cpp msgid "Erase points and triangles." -msgstr "" +msgstr "Ù…Ø³Ø Ø§Ù„Ù†Ù‚Ø· والمثلثات." #: editor/plugins/animation_blend_space_2d_editor.cpp msgid "Generate blend triangles automatically (instead of manually)" -msgstr "" +msgstr "توليد مثلثات دمج بصورة تلقائية (بدلاً من اليدوية)" #: editor/plugins/animation_blend_space_2d_editor.cpp #: editor/plugins/animation_tree_player_editor_plugin.cpp @@ -4446,78 +4441,73 @@ msgid "Blend:" msgstr "الدمج:" #: editor/plugins/animation_blend_tree_editor_plugin.cpp -#, fuzzy msgid "Parameter Changed" -msgstr "ØªØØ¯ÙŠØ« التغييرات" +msgstr "لقد تم تغيير المَعلم" #: editor/plugins/animation_blend_tree_editor_plugin.cpp #: editor/plugins/animation_tree_player_editor_plugin.cpp msgid "Edit Filters" -msgstr "تعديل المصاÙÙŠ" +msgstr "تعديل Ø§Ù„Ù…ÙØ±Ø´ØØ§Øª" #: editor/plugins/animation_blend_tree_editor_plugin.cpp msgid "Output node can't be added to the blend tree." -msgstr "" +msgstr "لا يمكن Ø¥Ø¶Ø§ÙØ© عÙقدة المخرجات إلى شجرة الدمج." #: editor/plugins/animation_blend_tree_editor_plugin.cpp msgid "Add Node to BlendTree" -msgstr "" +msgstr "Ø¥Ø¶Ø§ÙØ© عÙقدة إلى شجرة الدمج BlendTree" #: editor/plugins/animation_blend_tree_editor_plugin.cpp #: editor/plugins/visual_shader_editor_plugin.cpp -#, fuzzy msgid "Node Moved" -msgstr "وضع Ø§Ù„ØªØØ±ÙŠÙƒ" +msgstr "لقد ØªØØ±ÙƒØª العÙقدة" #: editor/plugins/animation_blend_tree_editor_plugin.cpp msgid "Unable to connect, port may be in use or connection may be invalid." msgstr "" +"غير قادر على الاتصال، ربما البوابة قيد الاستخدام أو أن الإتصال غير صالØ." #: editor/plugins/animation_blend_tree_editor_plugin.cpp #: editor/plugins/visual_shader_editor_plugin.cpp -#, fuzzy msgid "Nodes Connected" -msgstr "متصل" +msgstr "العÙقد متصلة" #: editor/plugins/animation_blend_tree_editor_plugin.cpp #: editor/plugins/visual_shader_editor_plugin.cpp -#, fuzzy msgid "Nodes Disconnected" -msgstr "غير متصل" +msgstr "العÙقد غير متصلة" #: editor/plugins/animation_blend_tree_editor_plugin.cpp -#, fuzzy msgid "Set Animation" -msgstr "صورة Ù…ØªØØ±ÙƒØ©" +msgstr "ØªØØ¯ÙŠØ¯ الرسومية Ø§Ù„Ù…ØªØØ±ÙƒØ©" #: editor/plugins/animation_blend_tree_editor_plugin.cpp #: editor/plugins/visual_shader_editor_plugin.cpp -#, fuzzy msgid "Delete Node" -msgstr "إنشاء عقدة" +msgstr "ØØ°Ù العÙقدة" #: editor/plugins/animation_blend_tree_editor_plugin.cpp #: editor/scene_tree_dock.cpp msgid "Delete Node(s)" -msgstr "" +msgstr "ØØ°Ù عÙقدة (عÙقد)" #: editor/plugins/animation_blend_tree_editor_plugin.cpp -#, fuzzy msgid "Toggle Filter On/Off" -msgstr "تمكين/إيقا٠هذا المسار." +msgstr "تعديل Ø§Ù„Ù…ÙØ±Ø´ØØ§Øª تشغيل/إيقاÙ" #: editor/plugins/animation_blend_tree_editor_plugin.cpp -#, fuzzy msgid "Change Filter" -msgstr "تغيير خط Ø§Ù„ØØ±ÙƒØ©" +msgstr "تغيير Ø§Ù„Ù…ÙØ±Ø´Ø Filter" #: editor/plugins/animation_blend_tree_editor_plugin.cpp msgid "No animation player set, so unable to retrieve track names." msgstr "" +"لم يتم ØªØØ¯ÙŠØ¯ أي من الرسومات Ø§Ù„Ù…ØªØØ±ÙƒØ© للاعب، لذا لا يمكن استرجاع أسماء " +"المقاطع." #: editor/plugins/animation_blend_tree_editor_plugin.cpp msgid "Player path set is invalid, so unable to retrieve track names." -msgstr "" +msgstr "المسار Ø§Ù„Ù…ØØ¯Ø¯ للاعب غير مناسب، لا يمكن استرجاع أسماء المقاطع." #: editor/plugins/animation_blend_tree_editor_plugin.cpp #: editor/plugins/root_motion_editor_plugin.cpp @@ -4525,43 +4515,39 @@ msgid "" "Animation player has no valid root node path, so unable to retrieve track " "names." msgstr "" +"الرسومات Ø§Ù„Ù…ØªØØ±ÙƒØ© الخاصة باللاعب لا تملك مسار عÙقدة ØµØ§Ù„ØØŒ غير قادر على " +"استرجاع أسماء المقاطع." #: editor/plugins/animation_blend_tree_editor_plugin.cpp -#, fuzzy msgid "Anim Clips" -msgstr "مقاطع الرسوم Ø§Ù„Ù…ØªØØ±ÙƒØ©:" +msgstr "مقاطع الرسوم Ø§Ù„Ù…ØªØØ±ÙƒØ©" #: editor/plugins/animation_blend_tree_editor_plugin.cpp -#, fuzzy msgid "Audio Clips" -msgstr "مقاطع صوتية:" +msgstr "مقاطع صوتية" #: editor/plugins/animation_blend_tree_editor_plugin.cpp -#, fuzzy msgid "Functions" -msgstr "الإعدادات:" +msgstr "الوظائ٠البرمجية" #: editor/plugins/animation_blend_tree_editor_plugin.cpp #: editor/plugins/animation_state_machine_editor.cpp -#, fuzzy msgid "Node Renamed" -msgstr "إسم العقدة:" +msgstr "العÙقدة معادة التسمية" #: editor/plugins/animation_blend_tree_editor_plugin.cpp #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Add Node..." -msgstr "" +msgstr "Ø¥Ø¶Ø§ÙØ© عÙقدة..." #: editor/plugins/animation_blend_tree_editor_plugin.cpp #: editor/plugins/root_motion_editor_plugin.cpp -#, fuzzy msgid "Edit Filtered Tracks:" -msgstr "تعديل المصاÙÙŠ" +msgstr "ØªØØ±ÙŠØ± المقاطع Ø§Ù„Ù…ÙØ±Ø´ØØ© Filtered Tracks:" #: editor/plugins/animation_blend_tree_editor_plugin.cpp -#, fuzzy msgid "Enable Filtering" -msgstr "تغيير خط Ø§Ù„ØØ±ÙƒØ©" +msgstr "تمكين Ø§Ù„ØªØ±Ø´ÙŠØ Filtering" #: editor/plugins/animation_player_editor_plugin.cpp msgid "Toggle Autoplay" @@ -4621,27 +4607,24 @@ msgid "Duplicate Animation" msgstr "تكرير Ø§Ù„ØØ±ÙƒØ©" #: editor/plugins/animation_player_editor_plugin.cpp -#, fuzzy msgid "No animation to copy!" -msgstr "خطأ: لا ØØ±ÙƒØ© لنسخها!" +msgstr "لا ØØ±ÙƒØ© رسومية لنسخها!" #: editor/plugins/animation_player_editor_plugin.cpp -#, fuzzy msgid "No animation resource on clipboard!" -msgstr "خطأ: لا مصدر ØØ±ÙƒØ© علي Ø§Ù„ØØ§Ùظة!" +msgstr "لا يوجد مورد لرسومية Ù…ØªØØ±ÙƒØ© ÙÙŠ Ø§Ù„ØØ§Ùظة clipboard!" #: editor/plugins/animation_player_editor_plugin.cpp msgid "Pasted Animation" -msgstr "ØØ±ÙƒØ© Ù…Ùلصقة" +msgstr "Ø§Ù„ØØ±ÙƒØ© الرسومية المÙلصقة" #: editor/plugins/animation_player_editor_plugin.cpp msgid "Paste Animation" -msgstr "لصق Ø§Ù„ØØ±ÙƒØ©" +msgstr "لصق الرسوم Ø§Ù„Ù…ØªØØ±ÙƒØ©" #: editor/plugins/animation_player_editor_plugin.cpp -#, fuzzy msgid "No animation to edit!" -msgstr "خطأ: لا ØØ±ÙƒØ© لتعديلها!" +msgstr "لا رسومات Ù…ØªØØ±ÙƒØ© Ù„ØªØØ±ÙŠØ±Ù‡Ø§!" #: editor/plugins/animation_player_editor_plugin.cpp msgid "Play selected animation backwards from current pos. (A)" @@ -4680,14 +4663,12 @@ msgid "Animation" msgstr "صورة Ù…ØªØØ±ÙƒØ©" #: editor/plugins/animation_player_editor_plugin.cpp -#, fuzzy msgid "Edit Transitions..." -msgstr "تØÙˆÙŠÙ„ات" +msgstr "ØªØØ±ÙŠØ± الانتقالات..." #: editor/plugins/animation_player_editor_plugin.cpp -#, fuzzy msgid "Open in Inspector" -msgstr "Ù…ÙØ±Ø§Ù‚ب" +msgstr "Ø§ÙØªØ ÙÙŠ Ø§Ù„Ù…ÙØªØµÙØ" #: editor/plugins/animation_player_editor_plugin.cpp msgid "Display list of animations in player." @@ -4702,9 +4683,8 @@ msgid "Enable Onion Skinning" msgstr "ØªÙØ¹ÙŠÙ„ تقشير البصل" #: editor/plugins/animation_player_editor_plugin.cpp -#, fuzzy msgid "Onion Skinning Options" -msgstr "تقشير البصل" +msgstr "إعدادت Ø´ÙØ§Ùية طبقات البصل" #: editor/plugins/animation_player_editor_plugin.cpp msgid "Directions" @@ -4724,7 +4704,7 @@ msgstr "العمق" #: editor/plugins/animation_player_editor_plugin.cpp msgid "1 step" -msgstr "الخطوة 1" +msgstr "خطوة ÙˆØ§ØØ¯Ø©" #: editor/plugins/animation_player_editor_plugin.cpp msgid "2 steps" @@ -4747,9 +4727,8 @@ msgid "Include Gizmos (3D)" msgstr "تضمين جيزموس (3D)" #: editor/plugins/animation_player_editor_plugin.cpp -#, fuzzy msgid "Pin AnimationPlayer" -msgstr "لصق Ø§Ù„ØØ±ÙƒØ©" +msgstr "تثبيت Ù…ÙØ´ØºÙ‘Ù„ الرسوميات Ø§Ù„Ù…ØªØØ±ÙƒØ©" #: editor/plugins/animation_player_editor_plugin.cpp msgid "Create New Animation" @@ -4779,48 +4758,45 @@ msgid "Cross-Animation Blend Times" msgstr "وقت الدمج عبر Ø§Ù„ØØ±ÙƒØ©" #: editor/plugins/animation_state_machine_editor.cpp -#, fuzzy msgid "Move Node" -msgstr "وضع Ø§Ù„ØªØØ±ÙŠÙƒ" +msgstr "ØªØØ±ÙŠÙƒ العÙقدة" #: editor/plugins/animation_state_machine_editor.cpp -#, fuzzy msgid "Transition exists!" -msgstr "تØÙˆÙ„" +msgstr "الإنتقال موجود Ø³Ù„ÙØ§Ù‹!" #: editor/plugins/animation_state_machine_editor.cpp -#, fuzzy msgid "Add Transition" -msgstr "تØÙˆÙ„" +msgstr "Ø¥Ø¶Ø§ÙØ© انتقال" #: editor/plugins/animation_state_machine_editor.cpp #: modules/visual_script/visual_script_editor.cpp msgid "Add Node" -msgstr "" +msgstr "Ø¥Ø¶Ø§ÙØ© عÙقدة" #: editor/plugins/animation_state_machine_editor.cpp msgid "End" -msgstr "" +msgstr "النهاية" #: editor/plugins/animation_state_machine_editor.cpp msgid "Immediate" -msgstr "" +msgstr "Ùوري" #: editor/plugins/animation_state_machine_editor.cpp msgid "Sync" -msgstr "" +msgstr "مزامنة" #: editor/plugins/animation_state_machine_editor.cpp msgid "At End" -msgstr "" +msgstr "ÙÙŠ النهاية" #: editor/plugins/animation_state_machine_editor.cpp msgid "Travel" -msgstr "" +msgstr "Ø§Ù„Ø³ÙØ±" #: editor/plugins/animation_state_machine_editor.cpp msgid "Start and end nodes are needed for a sub-transition." -msgstr "" +msgstr "عÙقد البداية والنهاية مطلوبة لأجل الانتقال الجزيئ sub-transition." #: editor/plugins/animation_state_machine_editor.cpp #, fuzzy @@ -4839,7 +4815,7 @@ msgstr "عقدة التنقل" #: editor/plugins/animation_state_machine_editor.cpp msgid "Set Start Node (Autoplay)" -msgstr "" +msgstr "ØªØØ¯ÙŠØ¯ عÙقدة البداية (التشغيل التلقائي)" #: editor/plugins/animation_state_machine_editor.cpp msgid "" @@ -4847,6 +4823,9 @@ msgid "" "RMB to add new nodes.\n" "Shift+LMB to create connections." msgstr "" +"اختر ÙˆØØ±Ù‘Ùƒ العÙقد.\n" +"RMB (زر Ø§Ù„ÙØ£Ø±Ø© الأيمن) Ù„Ø¥Ø¶Ø§ÙØ© عÙقد جديدة.\n" +"LMB + Shift (زر Ø§Ù„ÙØ£Ø±Ø© الأيسر) لإنشاء الوصلات." #: editor/plugins/animation_state_machine_editor.cpp #, fuzzy @@ -4866,10 +4845,13 @@ msgstr "ازالة المسار Ø§Ù„Ù…ØØ¯Ø¯." #: editor/plugins/animation_state_machine_editor.cpp msgid "Toggle autoplay this animation on start, restart or seek to zero." msgstr "" +"تبديل (نعم/لا) التشغيل التلقائي لهذا الرسم Ø§Ù„Ù…ØªØØ±Ùƒ ليشتغل، يعيد التشغيل، أو " +"يسعى Ù„Ù„ØµÙØ±." #: editor/plugins/animation_state_machine_editor.cpp msgid "Set the end animation. This is useful for sub-transitions." msgstr "" +"ØªØØ¯ÙŠØ¯ الرسومية Ø§Ù„Ù…ØªØØ±ÙƒØ© الخاصة بالنهاية. سيكون ذلك Ù…Ùيداً Ù„Ù„ØØ±ÙƒØ§Øª Ø§Ù„ÙØ±Ø¹ÙŠØ©." #: editor/plugins/animation_state_machine_editor.cpp #, fuzzy @@ -5062,7 +5044,7 @@ msgstr "لا يمكن المسØ:" #: editor/plugins/asset_library_editor_plugin.cpp msgid "Write error." -msgstr "" +msgstr "كتابة خطأ." #: editor/plugins/asset_library_editor_plugin.cpp msgid "Request failed, too many redirects" @@ -5144,19 +5126,19 @@ msgstr "تØÙ…يل هذا الأصل قيد التنÙيذ أصلاً!" #: editor/plugins/asset_library_editor_plugin.cpp msgid "Recently Updated" -msgstr "" +msgstr "ØÙدّث منذ ÙØªØ±Ø© وجيزة" #: editor/plugins/asset_library_editor_plugin.cpp msgid "Least Recently Updated" -msgstr "" +msgstr "آخر ØªØØ¯ÙŠØ« قريب الأمد" #: editor/plugins/asset_library_editor_plugin.cpp msgid "Name (A-Z)" -msgstr "" +msgstr "الاسم (أل٠بائياً)" #: editor/plugins/asset_library_editor_plugin.cpp msgid "Name (Z-A)" -msgstr "" +msgstr "الاسم (ترتيب أل٠بائي معكوس)" #: editor/plugins/asset_library_editor_plugin.cpp #, fuzzy @@ -5184,7 +5166,7 @@ msgstr "التالي" #: editor/plugins/asset_library_editor_plugin.cpp msgid "Last" -msgstr "" +msgstr "الأخير" #: editor/plugins/asset_library_editor_plugin.cpp msgid "All" @@ -5192,7 +5174,7 @@ msgstr "الكل" #: editor/plugins/asset_library_editor_plugin.cpp msgid "No results for \"%s\"." -msgstr "" +msgstr "لا نتائج من أجل \"%s\"." #: editor/plugins/asset_library_editor_plugin.cpp #, fuzzy @@ -5263,12 +5245,12 @@ msgstr "لا يمكن انشاء خرائط الضوء, تاكد من ان ال٠#: editor/plugins/baked_lightmap_editor_plugin.cpp msgid "Bake Lightmaps" -msgstr "اعداد خرائط الضوء" +msgstr "إعداد خرائط الضوء" #: editor/plugins/camera_editor_plugin.cpp #: editor/plugins/spatial_editor_plugin.cpp editor/rename_dialog.cpp msgid "Preview" -msgstr "إستعراض" +msgstr "استعراض" #: editor/plugins/canvas_item_editor_plugin.cpp msgid "Configure Snap" @@ -5284,12 +5266,11 @@ msgstr "خطوة الشبكة:" #: editor/plugins/canvas_item_editor_plugin.cpp msgid "Primary Line Every:" -msgstr "" +msgstr "الأخط الأولي ÙƒÙÙ„:" #: editor/plugins/canvas_item_editor_plugin.cpp -#, fuzzy msgid "steps" -msgstr "خطوتان" +msgstr "خطوات" #: editor/plugins/canvas_item_editor_plugin.cpp msgid "Rotation Offset:" @@ -5300,42 +5281,34 @@ msgid "Rotation Step:" msgstr "خطوة الدوران:" #: editor/plugins/canvas_item_editor_plugin.cpp -#, fuzzy msgid "Scale Step:" -msgstr "تكبير/تصغير:" +msgstr "خطوة Ø§Ù„ØªØØ¬ÙŠÙ…:" #: editor/plugins/canvas_item_editor_plugin.cpp -#, fuzzy msgid "Move Vertical Guide" msgstr "ØªØØ±ÙŠÙƒ الموجه العمودي" #: editor/plugins/canvas_item_editor_plugin.cpp -#, fuzzy msgid "Create Vertical Guide" msgstr "إنشاء موجه عمودي جديد" #: editor/plugins/canvas_item_editor_plugin.cpp -#, fuzzy msgid "Remove Vertical Guide" msgstr "Ù…Ø³Ø Ø§Ù„Ù…ÙˆØ¬Ù‡ العمودي" #: editor/plugins/canvas_item_editor_plugin.cpp -#, fuzzy msgid "Move Horizontal Guide" msgstr "ØªØØ±ÙŠÙƒ الموجه الأÙقي" #: editor/plugins/canvas_item_editor_plugin.cpp -#, fuzzy msgid "Create Horizontal Guide" msgstr "إنشاء موجه Ø£Ùقي جديد" #: editor/plugins/canvas_item_editor_plugin.cpp -#, fuzzy msgid "Remove Horizontal Guide" msgstr "Ù…Ø³Ø Ø§Ù„Ù…ÙˆØ¬Ù‡ الأÙقي" #: editor/plugins/canvas_item_editor_plugin.cpp -#, fuzzy msgid "Create Horizontal and Vertical Guides" msgstr "إنشاء موجه عمودي وأÙقي جديد" @@ -5378,85 +5351,76 @@ msgid "" "When active, moving Control nodes changes their anchors instead of their " "margins." msgstr "" +"عندما يكون ÙØ¹Ø§Ù„اً، إن ØªØØ±ÙŠÙƒ عÙقد التØÙƒÙ… سيغير نقطة التثبيت anchors الخاص بها " +"بدلاً من الهوامش." #: editor/plugins/canvas_item_editor_plugin.cpp -#, fuzzy msgid "Top Left" -msgstr "وضع التدوير" +msgstr "ÙÙŠ الأعلى يساراً" #: editor/plugins/canvas_item_editor_plugin.cpp -#, fuzzy msgid "Top Right" -msgstr "وضع التدوير" +msgstr "ÙÙŠ الأعلى يميناً" #: editor/plugins/canvas_item_editor_plugin.cpp -#, fuzzy msgid "Bottom Right" -msgstr "وضع التدوير" +msgstr "ÙÙŠ الأسÙÙ„ يميناً" #: editor/plugins/canvas_item_editor_plugin.cpp -#, fuzzy msgid "Bottom Left" -msgstr "وضع التدوير" +msgstr "ÙÙŠ الأسÙÙ„ يساراً" #: editor/plugins/canvas_item_editor_plugin.cpp -#, fuzzy msgid "Center Left" -msgstr "Ù†ØµÙ Ø§Ù„Ù…ÙØØ¯Ø¯" +msgstr "ÙÙŠ المنتص٠يساراً" #: editor/plugins/canvas_item_editor_plugin.cpp -#, fuzzy msgid "Center Top" -msgstr "Ù†ØµÙ Ø§Ù„Ù…ÙØØ¯Ø¯" +msgstr "ÙÙŠ أعلى المنتصÙ" #: editor/plugins/canvas_item_editor_plugin.cpp -#, fuzzy msgid "Center Right" -msgstr "وضع التدوير" +msgstr "ÙÙŠ المنتص٠يميناً" #: editor/plugins/canvas_item_editor_plugin.cpp -#, fuzzy msgid "Center Bottom" -msgstr "Ù†ØµÙ Ø§Ù„Ù…ÙØØ¯Ø¯" +msgstr "ÙÙŠ أسÙÙ„ المنتصÙ" #: editor/plugins/canvas_item_editor_plugin.cpp msgid "Center" -msgstr "" +msgstr "المنتصÙ" #: editor/plugins/canvas_item_editor_plugin.cpp -#, fuzzy msgid "Left Wide" -msgstr "الخط الشمالي" +msgstr "بالعرض يساراً" #: editor/plugins/canvas_item_editor_plugin.cpp msgid "Top Wide" -msgstr "" +msgstr "بالعرض بالأعلى" #: editor/plugins/canvas_item_editor_plugin.cpp -#, fuzzy msgid "Right Wide" -msgstr "الخط اليميني" +msgstr "بالعرض يميناً" #: editor/plugins/canvas_item_editor_plugin.cpp msgid "Bottom Wide" -msgstr "" +msgstr "بالعرض بالأسÙÙ„" #: editor/plugins/canvas_item_editor_plugin.cpp msgid "VCenter Wide" -msgstr "" +msgstr "بالعرض بالمنتص٠شاقولياً" #: editor/plugins/canvas_item_editor_plugin.cpp msgid "HCenter Wide" -msgstr "" +msgstr "بالعرض بالمنتص٠أÙقياً" #: editor/plugins/canvas_item_editor_plugin.cpp msgid "Full Rect" -msgstr "" +msgstr "على كامل المستطيل" #: editor/plugins/canvas_item_editor_plugin.cpp -#, fuzzy msgid "Keep Ratio" -msgstr "نسبة التكبير:" +msgstr "نسبة التكبير" #: editor/plugins/canvas_item_editor_plugin.cpp msgid "Anchors only" @@ -5476,6 +5440,8 @@ msgid "" "Game Camera Override\n" "Overrides game camera with editor viewport camera." msgstr "" +"تجاوز كاميرا اللعبة.\n" +"تجاوز كاميرا اللعبة عن طريق كاميرا إطار العرض ÙÙŠ Ø§Ù„Ù…ØØ±Ø±." #: editor/plugins/canvas_item_editor_plugin.cpp #: editor/plugins/spatial_editor_plugin.cpp @@ -5483,48 +5449,44 @@ msgid "" "Game Camera Override\n" "No game instance running." msgstr "" +"تجاوز كاميرا اللعبة.\n" +"ليس هناك لعبة منمذجة قيد التشغيل." #: editor/plugins/canvas_item_editor_plugin.cpp #: editor/plugins/spatial_editor_plugin.cpp -#, fuzzy msgid "Lock Selected" -msgstr "ØØ¯Ø¯" +msgstr "ØÙدد القÙÙ„" #: editor/plugins/canvas_item_editor_plugin.cpp #: editor/plugins/spatial_editor_plugin.cpp msgid "Unlock Selected" -msgstr "" +msgstr "ØÙدد إلغاء القÙÙ„" #: editor/plugins/canvas_item_editor_plugin.cpp #: editor/plugins/spatial_editor_plugin.cpp -#, fuzzy msgid "Group Selected" -msgstr "ØØ°Ù Ø§Ù„Ù…ÙØØ¯Ø¯" +msgstr "ØÙدد التجميع" #: editor/plugins/canvas_item_editor_plugin.cpp #: editor/plugins/spatial_editor_plugin.cpp -#, fuzzy msgid "Ungroup Selected" -msgstr "ØØ°Ù Ø§Ù„Ù…ÙØØ¯Ø¯" +msgstr "ØÙدد إلغاء التجميع" #: editor/plugins/canvas_item_editor_plugin.cpp msgid "Paste Pose" msgstr "لصق الوضع" #: editor/plugins/canvas_item_editor_plugin.cpp -#, fuzzy msgid "Clear Guides" -msgstr "إخلاء الوضع" +msgstr "Ù…Ø³Ø Ø§Ù„Ù…ÙˆØ¬Ù‡Ø§Øª" #: editor/plugins/canvas_item_editor_plugin.cpp -#, fuzzy msgid "Create Custom Bone(s) from Node(s)" -msgstr "أنشئ نقاط إنبعاث من الشبكة" +msgstr "إنشاء عظمة (عظام) مخصوصة من عÙقدة (عÙقد)" #: editor/plugins/canvas_item_editor_plugin.cpp -#, fuzzy msgid "Clear Bones" -msgstr "إخلاء الوضع" +msgstr "Ù…Ø³Ø Ø§Ù„Ø¹Ø¸Ø§Ù…" #: editor/plugins/canvas_item_editor_plugin.cpp msgid "Make IK Chain" @@ -5579,9 +5541,8 @@ msgstr "وضع التدوير" #: editor/plugins/canvas_item_editor_plugin.cpp #: editor/plugins/spatial_editor_plugin.cpp -#, fuzzy msgid "Scale Mode" -msgstr "ØªØØ¯ÙŠØ¯ الوضع" +msgstr "وضع Ø§Ù„ØªØØ¬ÙŠÙ…" #: editor/plugins/canvas_item_editor_plugin.cpp #: editor/plugins/spatial_editor_plugin.cpp @@ -5601,91 +5562,77 @@ msgid "Pan Mode" msgstr "وضع Ø§Ù„Ø³ØØ¨" #: editor/plugins/canvas_item_editor_plugin.cpp -#, fuzzy msgid "Ruler Mode" -msgstr "ØªØØ¯ÙŠØ¯ الوضع" +msgstr "وضع المسطرة" #: editor/plugins/canvas_item_editor_plugin.cpp -#, fuzzy msgid "Toggle smart snapping." -msgstr "إلغاء/ØªÙØ¹ÙŠÙ„ الكبس" +msgstr "إلغاء/ØªÙØ¹ÙŠÙ„ Ù…ØØ§Ø°Ø§Ø© الشبكة بذكاء." #: editor/plugins/canvas_item_editor_plugin.cpp -#, fuzzy msgid "Use Smart Snap" -msgstr "إستخدم الكبس" +msgstr "استخدام Ø§Ù„Ù…ØØ§Ø°Ø§Ø© الذكية" #: editor/plugins/canvas_item_editor_plugin.cpp -#, fuzzy msgid "Toggle grid snapping." -msgstr "إلغاء/ØªÙØ¹ÙŠÙ„ الكبس" +msgstr "إلغاء/ØªÙØ¹ÙŠÙ„ Ø§Ù„Ù…ØØ§Ø°Ø§Ø© للشبكة." #: editor/plugins/canvas_item_editor_plugin.cpp -#, fuzzy msgid "Use Grid Snap" -msgstr "إستخدم الكبس" +msgstr "استخادم Ø§Ù„Ù…ØØ§Ø°Ø§Ø© للشبكة" #: editor/plugins/canvas_item_editor_plugin.cpp -#, fuzzy msgid "Snapping Options" -msgstr "إعدادات الكبس" +msgstr "إعدادت Ø§Ù„Ù…ØØ§Ø°Ø§Ø©" #: editor/plugins/canvas_item_editor_plugin.cpp msgid "Use Rotation Snap" -msgstr "إستعمال كبس التدوير" +msgstr "استعمال Ù…ØØ§Ø°Ø§Ø© التدوير" #: editor/plugins/canvas_item_editor_plugin.cpp -#, fuzzy msgid "Use Scale Snap" -msgstr "إستخدم الكبس" +msgstr "استخدام Ù…ØØ§Ø°Ø§Ø© Ø§Ù„ØªØØ¬ÙŠÙ…" #: editor/plugins/canvas_item_editor_plugin.cpp msgid "Snap Relative" -msgstr "نسبية الكبس" +msgstr "نسبية Ø§Ù„Ù…ØØ§Ø°Ø§Ø©" #: editor/plugins/canvas_item_editor_plugin.cpp msgid "Use Pixel Snap" msgstr "إستخدام كبس البكسل" #: editor/plugins/canvas_item_editor_plugin.cpp -#, fuzzy msgid "Smart Snapping" -msgstr "الكبس الذكي" +msgstr "Ø§Ù„Ù…ØØ§Ø°Ø§Ø© الذكية" #: editor/plugins/canvas_item_editor_plugin.cpp #: editor/plugins/spatial_editor_plugin.cpp msgid "Configure Snap..." -msgstr "تعديل الكبس..." +msgstr "تعديل Ø§Ù„Ù…ØØ§Ø°Ø§Ø©..." #: editor/plugins/canvas_item_editor_plugin.cpp -#, fuzzy msgid "Snap to Parent" -msgstr "الكبس إلي الطÙÙ„" +msgstr "Ø§Ù„Ù…ØØ§Ø°Ø§Ø© بالنسبة للأصل Parent" #: editor/plugins/canvas_item_editor_plugin.cpp -#, fuzzy msgid "Snap to Node Anchor" -msgstr "إكبس إلي مرتكز العقدة" +msgstr "ØØ§Ø°ÙŠ Ø¥Ù„ÙŠ مرتكز العقدة" #: editor/plugins/canvas_item_editor_plugin.cpp -#, fuzzy msgid "Snap to Node Sides" -msgstr "إكبس إلي جوانب العقدة" +msgstr "ØØ§Ø°ÙŠ Ø¥Ù„ÙŠ جوانب العقدة" #: editor/plugins/canvas_item_editor_plugin.cpp -#, fuzzy msgid "Snap to Node Center" -msgstr "إكبس إلي مرتكز العقدة" +msgstr "ØØ§Ø°ÙŠ Ø¥Ù„ÙŠ Ù…Ùنتص٠العقدة" #: editor/plugins/canvas_item_editor_plugin.cpp -#, fuzzy msgid "Snap to Other Nodes" -msgstr "إكبس إلي العقد الأخري" +msgstr "ØØ§Ø°ÙŠ Ø¥Ù„Ù‰ العقد الأخرى" #: editor/plugins/canvas_item_editor_plugin.cpp -#, fuzzy msgid "Snap to Guides" -msgstr "أكبس إلي الموجهات" +msgstr "ØØ§Ø°ÙŠ Ø¥Ù„Ù‰ الموجهات" #: editor/plugins/canvas_item_editor_plugin.cpp #: editor/plugins/spatial_editor_plugin.cpp @@ -5708,9 +5655,8 @@ msgid "Restores the object's children's ability to be selected." msgstr "إرجاع مقدرة ØªØØ¯ÙŠØ¯ الطÙÙ„ للعنصر." #: editor/plugins/canvas_item_editor_plugin.cpp -#, fuzzy msgid "Skeleton Options" -msgstr "Ø§Ù„ÙØ±Ø¯ÙŠØ©" +msgstr "إعدادات الهكيل العظمي" #: editor/plugins/canvas_item_editor_plugin.cpp msgid "Show Bones" @@ -5718,12 +5664,11 @@ msgstr "إظهار العظام" #: editor/plugins/canvas_item_editor_plugin.cpp msgid "Make Custom Bone(s) from Node(s)" -msgstr "" +msgstr "إنشاء عظمة (عظام) مخصوصة من عÙقدة (عÙقد)" #: editor/plugins/canvas_item_editor_plugin.cpp -#, fuzzy msgid "Clear Custom Bones" -msgstr "إخلاء العظام" +msgstr "Ù…Ø³Ø Ø§Ù„Ø¹Ø¸Ø§Ù… المخصوصة" #: editor/plugins/canvas_item_editor_plugin.cpp #: editor/plugins/spatial_editor_plugin.cpp @@ -5731,9 +5676,8 @@ msgid "View" msgstr "أظهر" #: editor/plugins/canvas_item_editor_plugin.cpp -#, fuzzy msgid "Always Show Grid" -msgstr "إظهار الشبكة" +msgstr "إظهار الشبكة دوماً" #: editor/plugins/canvas_item_editor_plugin.cpp msgid "Show Helpers" @@ -5757,7 +5701,7 @@ msgstr "أظهر الشاشة" #: editor/plugins/canvas_item_editor_plugin.cpp msgid "Show Group And Lock Icons" -msgstr "" +msgstr "إظهار أيقونات المجوعة والقÙÙ„" #: editor/plugins/canvas_item_editor_plugin.cpp msgid "Center Selection" @@ -5769,19 +5713,19 @@ msgstr "إملئ الشاشة Ø¨Ø§Ù„Ù…ØØ¯Ø¯" #: editor/plugins/canvas_item_editor_plugin.cpp msgid "Preview Canvas Scale" -msgstr "" +msgstr "إظهار ØªØØ¬ÙŠÙ… Ø§Ù„Ù„ÙˆØØ© Canvas" #: editor/plugins/canvas_item_editor_plugin.cpp msgid "Translation mask for inserting keys." -msgstr "" +msgstr "قناع الترجمة لأجل إدخال Ø§Ù„Ù…ÙØ§ØªÙŠØ." #: editor/plugins/canvas_item_editor_plugin.cpp msgid "Rotation mask for inserting keys." -msgstr "" +msgstr "قناع التدوير لأجل إدخال Ø§Ù„Ù…ÙØ§ØªÙŠØ." #: editor/plugins/canvas_item_editor_plugin.cpp msgid "Scale mask for inserting keys." -msgstr "" +msgstr "قناع Ø§Ù„ØªØØ¬ÙŠÙ… لأجل إدخال Ø§Ù„Ù…ÙØ§ØªÙŠØ." #: editor/plugins/canvas_item_editor_plugin.cpp #, fuzzy @@ -5795,16 +5739,18 @@ msgid "" "Keys are only added to existing tracks, no new tracks will be created.\n" "Keys must be inserted manually for the first time." msgstr "" +"إدخال تلقائي Ù„Ù„Ù…ÙØ§ØªÙŠØ عندما تترجم، ØªÙØ¯Ø§Ø± أو ØªØØ¬Ù… الأشياء objects (بناء على " +"القناع).\n" +"ØªÙØ¶Ø§Ù Ø§Ù„Ù…ÙØ§ØªÙŠØ Ùقط للمقاطع الموجودة Ø³Ù„ÙØ§Ù‹ØŒ Ùلا يتم إنشاء مقاطع جديدة.\n" +"يجب إدخال Ø§Ù„Ù…ÙØ§ØªÙŠØ يدوياً ÙÙŠ أول مرة." #: editor/plugins/canvas_item_editor_plugin.cpp -#, fuzzy msgid "Auto Insert Key" -msgstr "Ø£Ø¶Ù Ù…ÙØªØ§Ø Ø§Ù„ØØ±ÙƒØ©" +msgstr "Ù…ÙØªØ§Ø Ù…ÙØ¯Ø®Ù„ بصورة تلقائية" #: editor/plugins/canvas_item_editor_plugin.cpp -#, fuzzy msgid "Animation Key and Pose Options" -msgstr "مدة Ø§Ù„ØØ±ÙƒØ© (seconds)" +msgstr "إعدادت Ø§Ù„Ù…ÙØªØ§Ø والوضعية للرسومات Ø§Ù„Ù…ØªØØ±ÙƒØ©" #: editor/plugins/canvas_item_editor_plugin.cpp msgid "Insert Key (Existing Tracks)" @@ -5867,17 +5813,16 @@ msgstr "" "Ø³ØØ¨ Ùˆ إسقاط + Alt : تغيير نوع العقدة" #: editor/plugins/collision_polygon_editor_plugin.cpp -#, fuzzy msgid "Create Polygon3D" -msgstr "إنشاء بولي" +msgstr "إنشاء متعدد Ø³Ø·ÙˆØ Ø«Ù„Ø§Ø«ÙŠ الأبعاد" #: editor/plugins/collision_polygon_editor_plugin.cpp msgid "Edit Poly" -msgstr "تعديل البولي" +msgstr "تعديل Ù…ÙØªØ¹Ø¯Ø¯ السطوØ" #: editor/plugins/collision_polygon_editor_plugin.cpp msgid "Edit Poly (Remove Point)" -msgstr "تعديل البولي (Ù…Ø³Ø Ø§Ù„Ù†Ù‚Ø·Ø©)" +msgstr "تعديل متعدد Ø§Ù„Ø³Ø·ÙˆØ (Ù…Ø³Ø Ø§Ù„Ù†Ù‚Ø·Ø©)" #: editor/plugins/collision_shape_2d_editor_plugin.cpp msgid "Set Handle" @@ -5892,14 +5837,13 @@ msgstr "ØÙ…Ù„ قناع الانبعاث" #: editor/plugins/cpu_particles_editor_plugin.cpp #: editor/plugins/particles_2d_editor_plugin.cpp #: editor/plugins/particles_editor_plugin.cpp -#, fuzzy msgid "Restart" -msgstr "إعادة تشغيل (ثواني):" +msgstr "إعادة التشغيل" #: editor/plugins/cpu_particles_2d_editor_plugin.cpp #: editor/plugins/particles_2d_editor_plugin.cpp msgid "Clear Emission Mask" -msgstr "Ø¥Ù…Ø³Ø Ù‚Ù†Ø§Ø¹ الانبعاث" +msgstr "Ø§Ù…Ø³Ø Ù‚Ù†Ø§Ø¹ الانبعاث" #: editor/plugins/cpu_particles_2d_editor_plugin.cpp #: editor/plugins/particles_2d_editor_plugin.cpp @@ -5920,18 +5864,17 @@ msgstr "قناع الانبعاث" #: editor/plugins/cpu_particles_2d_editor_plugin.cpp #: editor/plugins/particles_2d_editor_plugin.cpp msgid "Solid Pixels" -msgstr "" +msgstr "البكسيلات الأساسية Solid Pixels" #: editor/plugins/cpu_particles_2d_editor_plugin.cpp #: editor/plugins/particles_2d_editor_plugin.cpp msgid "Border Pixels" -msgstr "" +msgstr "البكسلات المØÙŠØ·ÙŠØ© (Ø§Ù„ØØ¯ÙˆØ¯ÙŠØ©)" #: editor/plugins/cpu_particles_2d_editor_plugin.cpp #: editor/plugins/particles_2d_editor_plugin.cpp -#, fuzzy msgid "Directed Border Pixels" -msgstr "الوجهات ÙˆØ§Ù„Ù…Ù„ÙØ§Øª:" +msgstr "البكسلات المØÙŠØ·ÙŠØ© (Ø§Ù„ØØ¯ÙˆØ¯ÙŠØ©) الموجهة" #: editor/plugins/cpu_particles_2d_editor_plugin.cpp #: editor/plugins/particles_2d_editor_plugin.cpp @@ -5959,22 +5902,20 @@ msgid "Create Emission Points From Node" msgstr "أنشئ نقاط إنبعاث من العقدة" #: editor/plugins/curve_editor_plugin.cpp -#, fuzzy msgid "Flat 0" -msgstr "مسطØ0" +msgstr "Ø§Ù„Ø³Ø·Ø 0" #: editor/plugins/curve_editor_plugin.cpp -#, fuzzy msgid "Flat 1" -msgstr "مسطØ1" +msgstr "Ø§Ù„Ø³Ø·Ø 1" #: editor/plugins/curve_editor_plugin.cpp editor/property_editor.cpp msgid "Ease In" -msgstr "" +msgstr "دخول متسارع Ease In" #: editor/plugins/curve_editor_plugin.cpp editor/property_editor.cpp msgid "Ease Out" -msgstr "" +msgstr "تراجع Ù…ÙØªØ¨Ø§Ø·Ø¦ Ease Out" #: editor/plugins/curve_editor_plugin.cpp msgid "Smoothstep" @@ -5982,7 +5923,7 @@ msgstr "خطوة ناعمة" #: editor/plugins/curve_editor_plugin.cpp msgid "Modify Curve Point" -msgstr "نعديل نقطة الإنØÙ†Ø§Ø¡" +msgstr "تعديل نقطة الإنØÙ†Ø§Ø¡" #: editor/plugins/curve_editor_plugin.cpp msgid "Modify Curve Tangent" @@ -5993,22 +5934,18 @@ msgid "Load Curve Preset" msgstr "تØÙ…يل إعداد مسبق للإنØÙ†Ø§Ø¡" #: editor/plugins/curve_editor_plugin.cpp -#, fuzzy msgid "Add Point" msgstr "Ø¥Ø¶Ø§ÙØ© نقطة" #: editor/plugins/curve_editor_plugin.cpp -#, fuzzy msgid "Remove Point" msgstr "Ù…Ø³Ø Ø§Ù„Ù†Ù‚Ø·Ø©" #: editor/plugins/curve_editor_plugin.cpp -#, fuzzy msgid "Left Linear" -msgstr "الخط الشمالي" +msgstr "الخط اليساري" #: editor/plugins/curve_editor_plugin.cpp -#, fuzzy msgid "Right Linear" msgstr "الخط اليميني" @@ -6027,12 +5964,11 @@ msgstr "إلغاء/ØªÙØ¹ÙŠÙ„ مماس خط المنØÙ†ÙŠ" #: editor/plugins/curve_editor_plugin.cpp msgid "Hold Shift to edit tangents individually" -msgstr "إبقي ضاغطاً علي Shift لتعديل المماس ÙØ±Ø¯ÙŠØ§Ù‹" +msgstr "إبقى ضاغطاً على Shift لتعديل المماس ÙØ±Ø¯ÙŠØ§Ù‹" #: editor/plugins/curve_editor_plugin.cpp -#, fuzzy msgid "Right click to add point" -msgstr "إظغط: أض٠نقطة" +msgstr "اضغط بالزر الأيمن Ù„Ø¥Ø¶Ø§ÙØ© نقطة" #: editor/plugins/gi_probe_editor_plugin.cpp msgid "Bake GI Probe" @@ -6040,7 +5976,7 @@ msgstr "طبخ مجس GI" #: editor/plugins/gradient_editor_plugin.cpp msgid "Gradient Edited" -msgstr "" +msgstr "التدرج Ø§Ù„Ù…ÙØØ±Ø±" #: editor/plugins/item_list_editor_plugin.cpp msgid "Item %d" @@ -6063,9 +5999,8 @@ msgid "Mesh is empty!" msgstr "الميش ÙØ§Ø±Øº!" #: editor/plugins/mesh_instance_editor_plugin.cpp -#, fuzzy msgid "Couldn't create a Trimesh collision shape." -msgstr "إنشاء متصادم تراميش قريب" +msgstr "لا يمكن إنشاء شكل Trimesh تصادمي." #: editor/plugins/mesh_instance_editor_plugin.cpp msgid "Create Static Trimesh Body" @@ -6073,47 +6008,43 @@ msgstr "أنشئ جسم تراميش ثابت" #: editor/plugins/mesh_instance_editor_plugin.cpp msgid "This doesn't work on scene root!" -msgstr "هذا لا يعمل علي جزر المشهد!" +msgstr "لا يعمل هذا على المشهد الرئيس!" #: editor/plugins/mesh_instance_editor_plugin.cpp -#, fuzzy msgid "Create Trimesh Static Shape" -msgstr "أنشئ شكل تراميش" +msgstr "أنشئ شكل Trimesh ساكن" #: editor/plugins/mesh_instance_editor_plugin.cpp msgid "Can't create a single convex collision shape for the scene root." -msgstr "" +msgstr "لا يمكن إنشاء شكل تصادمي Ù…ÙØØ¯Ø¨ لأجل المشهد الرئيس." #: editor/plugins/mesh_instance_editor_plugin.cpp msgid "Couldn't create a single convex collision shape." -msgstr "" +msgstr "لم يتم إنشاء شكل Ù…ØØ¯Ø¨ تصادمي ÙˆØÙŠØ¯." #: editor/plugins/mesh_instance_editor_plugin.cpp -#, fuzzy msgid "Create Single Convex Shape" -msgstr "أنشئ شكل Ù…ØØ¯Ø¨" +msgstr "أنشئ شكل Ù…ØØ¯Ø¨ ÙˆØÙŠØ¯" #: editor/plugins/mesh_instance_editor_plugin.cpp msgid "Can't create multiple convex collision shapes for the scene root." -msgstr "" +msgstr "لا يمكن إنشاء أشكال تصادم Ù…ØØ¯Ø¨Ø© عديدة لأجل المشهد الرئيس." #: editor/plugins/mesh_instance_editor_plugin.cpp -#, fuzzy msgid "Couldn't create any collision shapes." -msgstr "لا يمكن إنشاء المجلد." +msgstr "لا يمكن إنشاء أي شكل تصادمي." #: editor/plugins/mesh_instance_editor_plugin.cpp -#, fuzzy msgid "Create Multiple Convex Shapes" -msgstr "أنشئ شكل Ù…ØØ¯Ø¨" +msgstr "أنشئ أشكال Ù…ØØ¯Ø¨Ø© متعددة" #: editor/plugins/mesh_instance_editor_plugin.cpp msgid "Create Navigation Mesh" -msgstr "أنشئ ميش التنقل" +msgstr "أنشئ Ø³Ø·Ø Mesh التنقل" #: editor/plugins/mesh_instance_editor_plugin.cpp msgid "Contained Mesh is not of type ArrayMesh." -msgstr "الميش المتضمن ليس من النوع الميش المتعدد." +msgstr "Ø§Ù„Ø³Ø·Ø Ø§Ù„Ù…ØªØ¶Ù…Ù† ليس نوعاً من مصÙÙˆÙØ© Ø§Ù„Ø³Ø·ÙˆØ ArrayMesh." #: editor/plugins/mesh_instance_editor_plugin.cpp msgid "UV Unwrap failed, mesh may not be manifold?" @@ -6161,6 +6092,8 @@ msgid "" "automatically.\n" "This is the most accurate (but slowest) option for collision detection." msgstr "" +"إنشاء جسم سكوني وقرنه مع جسم تصادمي شبيه Ø¨Ø§Ù„Ù…ÙØ¶Ù„ع تلقائياً.\n" +"هذا الخيار هو Ø§Ù„Ø£ÙØ¶Ù„ والأكثر دقة (ولكنه الأبطئ) لأجل الكش٠عن وجود تصادمات." #: editor/plugins/mesh_instance_editor_plugin.cpp msgid "Create Trimesh Collision Sibling" @@ -6171,6 +6104,8 @@ msgid "" "Creates a polygon-based collision shape.\n" "This is the most accurate (but slowest) option for collision detection." msgstr "" +"إنشاء شكل تصادمي Ù…ÙØ¶Ù„عي الشكل.\n" +"هذا هو الخيار الأكثر دقة (لكنه الأبطئ) لأجل للكش٠عن وقوع التصادم." #: editor/plugins/mesh_instance_editor_plugin.cpp #, fuzzy @@ -6182,6 +6117,8 @@ msgid "" "Creates a single convex collision shape.\n" "This is the fastest (but least accurate) option for collision detection." msgstr "" +"إنشاء شكل تصادمي ذو ØªØØ¯Ø¨ ÙˆØÙŠØ¯.\n" +"هذا هو الخيار الأسرع (لكنه الأقل دقة) للكش٠عن وقوع التصادم." #: editor/plugins/mesh_instance_editor_plugin.cpp #, fuzzy @@ -6193,6 +6130,8 @@ msgid "" "Creates a polygon-based collision shape.\n" "This is a performance middle-ground between the two above options." msgstr "" +"إنشاء شكل تصادمي Ù…ÙØ¶Ù„عي الهيئة.\n" +"هذا الخيار \\Ù…ÙØªÙˆØ³Ø· الأداء بين الخيارين أعلاه." #: editor/plugins/mesh_instance_editor_plugin.cpp msgid "Create Outline Mesh..." @@ -6228,7 +6167,7 @@ msgstr "ØØ¬Ù… الخطوط:" #: editor/plugins/mesh_instance_editor_plugin.cpp msgid "UV Channel Debug" -msgstr "" +msgstr "Ù…Ù†Ù‚Ø Ø£Ø®Ø·Ø§Ø¡ قناة UV" #: editor/plugins/mesh_library_editor_plugin.cpp msgid "Remove item %d?" @@ -6386,7 +6325,7 @@ msgstr "وقت التوليد (تانية):" #: editor/plugins/particles_editor_plugin.cpp msgid "The geometry's faces don't contain any area." -msgstr "" +msgstr "الوجوه الهندسية لا تتضمن أي منطقة." #: editor/plugins/particles_editor_plugin.cpp #, fuzzy @@ -6395,7 +6334,7 @@ msgstr "العقدة لا ØªØØªÙˆÙŠ Ø¹Ù„Ù‰ هندسة (الوجوه)." #: editor/plugins/particles_editor_plugin.cpp msgid "\"%s\" doesn't inherit from Spatial." -msgstr "" +msgstr "\"%s\" لا يرث Ø§Ù„ÙØ±Ø§ØºÙŠ Spatial." #: editor/plugins/particles_editor_plugin.cpp #, fuzzy @@ -6421,7 +6360,7 @@ msgstr "نقاط Ø§Ù„Ù…Ø³Ø§ØØ©" #: editor/plugins/particles_editor_plugin.cpp msgid "Surface Points+Normal (Directed)" -msgstr "" +msgstr "نقاط Ø§Ù„Ø³Ø·Ø + طبيعي (Ù…Ùوجّه)" #: editor/plugins/particles_editor_plugin.cpp msgid "Volume" @@ -6498,31 +6437,31 @@ msgstr "إظغط: أض٠نقطة" #: editor/plugins/path_2d_editor_plugin.cpp msgid "Left Click: Split Segment (in curve)" -msgstr "" +msgstr "بالزر الأيسر: ÙØµÙ„ القطعة (من المنØÙ†Ù‰)" #: editor/plugins/path_2d_editor_plugin.cpp #: editor/plugins/path_editor_plugin.cpp msgid "Right Click: Delete Point" -msgstr "" +msgstr "بالزر الأيمن: Ø§ØØ°Ù النقطة" #: editor/plugins/path_2d_editor_plugin.cpp msgid "Select Control Points (Shift+Drag)" -msgstr "" +msgstr "اختر العÙقد الآباء (Ø¨Ø§Ù„Ø³ØØ¨ + Shift)" #: editor/plugins/path_2d_editor_plugin.cpp #: editor/plugins/path_editor_plugin.cpp msgid "Add Point (in empty space)" -msgstr "" +msgstr "Ø¥Ø¶Ø§ÙØ© عÙقدة (ÙÙŠ ÙÙØ³ØØ© ÙØ§Ø±ØºØ©)" #: editor/plugins/path_2d_editor_plugin.cpp #: editor/plugins/path_editor_plugin.cpp msgid "Delete Point" -msgstr "" +msgstr "Ø§ØØ°Ù النقطة" #: editor/plugins/path_2d_editor_plugin.cpp #: editor/plugins/path_editor_plugin.cpp msgid "Close Curve" -msgstr "" +msgstr "إغلاق المنØÙ†Ù‰" #: editor/plugins/path_2d_editor_plugin.cpp #: editor/plugins/path_editor_plugin.cpp editor/plugins/theme_editor_plugin.cpp @@ -6533,16 +6472,16 @@ msgstr "الإعدادات" #: editor/plugins/path_2d_editor_plugin.cpp #: editor/plugins/path_editor_plugin.cpp msgid "Mirror Handle Angles" -msgstr "" +msgstr "زوايا مقبض المرآة" #: editor/plugins/path_2d_editor_plugin.cpp #: editor/plugins/path_editor_plugin.cpp msgid "Mirror Handle Lengths" -msgstr "" +msgstr "أطول مقابض المرآة" #: editor/plugins/path_editor_plugin.cpp msgid "Curve Point #" -msgstr "" +msgstr "Ù†Ùقطة المنØÙ†Ù‰ #" #: editor/plugins/path_editor_plugin.cpp msgid "Set Curve Point Position" @@ -6558,11 +6497,11 @@ msgstr "ØØ¯Ø¯ موقع خروج الإنØÙ†Ø§Ø¡" #: editor/plugins/path_editor_plugin.cpp msgid "Split Path" -msgstr "" +msgstr "ÙØµÙ„ المسار" #: editor/plugins/path_editor_plugin.cpp msgid "Remove Path Point" -msgstr "" +msgstr "إزالة Ù†Ùقطة المسار" #: editor/plugins/path_editor_plugin.cpp msgid "Remove Out-Control Point" @@ -6570,367 +6509,346 @@ msgstr "Ù…Ø³Ø Ù†Ù‚Ø·Ø© خروج التØÙƒÙ…" #: editor/plugins/path_editor_plugin.cpp msgid "Remove In-Control Point" -msgstr "" +msgstr "إزالة النÙقطة داخلية التØÙƒÙ… In-Control" #: editor/plugins/path_editor_plugin.cpp msgid "Split Segment (in curve)" -msgstr "" +msgstr "ÙØµÙ„ القطعة (من المÙÙ†ØÙ†Ù‰)" #: editor/plugins/physical_bone_plugin.cpp -#, fuzzy msgid "Move Joint" -msgstr "Ù…Ø³Ø Ø§Ù„Ù†Ù‚Ø·Ø©" +msgstr "ØªØØ±ÙŠÙƒ النÙقطة" #: editor/plugins/polygon_2d_editor_plugin.cpp msgid "" "The skeleton property of the Polygon2D does not point to a Skeleton2D node" msgstr "" +"إن خاصية الهيكل الخاص بالمضلع ثنائي الأبعاد لا تشير إلى عÙقدة هيكلية ثنائية " +"الأبعاد Skeleton2D" #: editor/plugins/polygon_2d_editor_plugin.cpp -#, fuzzy msgid "Sync Bones" -msgstr "إظهار العظام" +msgstr "Ù…ÙØ²Ø§Ù…نة العظام" #: editor/plugins/polygon_2d_editor_plugin.cpp msgid "" "No texture in this polygon.\n" "Set a texture to be able to edit UV." msgstr "" +"لا نقوش ÙÙŠ هذا Ø§Ù„Ù…ÙØ¶Ù„ع.\n" +"ØØ¯Ø¯ نقشاً لتتمكن من تعديل UV." #: editor/plugins/polygon_2d_editor_plugin.cpp msgid "Create UV Map" -msgstr "" +msgstr "إنشاء خريطة UV" #: editor/plugins/polygon_2d_editor_plugin.cpp msgid "" "Polygon 2D has internal vertices, so it can no longer be edited in the " "viewport." msgstr "" +"يمتلك Ø§Ù„Ù…ÙØ¶Ù„ع ثنائي الأبعاد رؤوساً داخلياً، لذا لا يمكن الاستمرار بتعديله ÙÙŠ " +"إطار العرض." #: editor/plugins/polygon_2d_editor_plugin.cpp -#, fuzzy msgid "Create Polygon & UV" -msgstr "إنشاء بولي" +msgstr "إنشاء Ù…ÙØ¶Ù„ع ÙˆUV" #: editor/plugins/polygon_2d_editor_plugin.cpp -#, fuzzy msgid "Create Internal Vertex" -msgstr "إنشاء موجه Ø£Ùقي جديد" +msgstr "إنشاء رأس داخلي" #: editor/plugins/polygon_2d_editor_plugin.cpp -#, fuzzy msgid "Remove Internal Vertex" -msgstr "Ù…Ø³Ø Ø§Ù„Ù…ÙˆØ¬Ù‡ العمودي" +msgstr "إزالة الرأس الداخلي" #: editor/plugins/polygon_2d_editor_plugin.cpp msgid "Invalid Polygon (need 3 different vertices)" -msgstr "" +msgstr "Ù…ÙØ¶Ù„ع غير ØµØ§Ù„Ø (ÙŠØØªØ§Ø¬ لثلاثة رؤوس Ù…Ø®ØªÙ„ÙØ©)" #: editor/plugins/polygon_2d_editor_plugin.cpp -#, fuzzy msgid "Add Custom Polygon" -msgstr "تعديل البولي" +msgstr "Ø¥Ø¶Ø§ÙØ© Ù…ÙØ¶Ù„ع مخصوص" #: editor/plugins/polygon_2d_editor_plugin.cpp -#, fuzzy msgid "Remove Custom Polygon" -msgstr "Ù…Ø³Ø Ø§Ù„Ø¨ÙˆÙ„ÙŠ والنقطة" +msgstr "إزالة Ø§Ù„Ù…ÙØ¶Ù„ع المخصوص" #: editor/plugins/polygon_2d_editor_plugin.cpp msgid "Transform UV Map" -msgstr "" +msgstr "إعادة تشكيل خريطة UV" #: editor/plugins/polygon_2d_editor_plugin.cpp -#, fuzzy msgid "Transform Polygon" -msgstr "إنشاء بولي" +msgstr "إعادة تشكيل Ø§Ù„Ù…ÙØ¶Ù„ع" #: editor/plugins/polygon_2d_editor_plugin.cpp msgid "Paint Bone Weights" -msgstr "" +msgstr "طلاء العظام وزنياً" #: editor/plugins/polygon_2d_editor_plugin.cpp -#, fuzzy msgid "Open Polygon 2D UV editor." -msgstr "ÙØªØ Ø§Ù„Ù…ÙØ¹Ø¯Ù„ 2D" +msgstr "ÙØªØ Ù…ÙØØ±Ø± UV الخاص Ø¨Ø§Ù„Ù…ÙØ¶Ù„عات ثنائية Ø§Ù„Ø¨ÙØ¹Ø¯." #: editor/plugins/polygon_2d_editor_plugin.cpp msgid "Polygon 2D UV Editor" -msgstr "" +msgstr "Ù…ÙØØ±Ø± UV الخاص Ø¨Ø§Ù„Ù…ÙØ¶Ù„عات ثنائية Ø§Ù„Ø¨ÙØ¹Ø¯" #: editor/plugins/polygon_2d_editor_plugin.cpp msgid "UV" -msgstr "" +msgstr "ال UV" #: editor/plugins/polygon_2d_editor_plugin.cpp -#, fuzzy msgid "Points" -msgstr "Ù…Ø³Ø Ø§Ù„Ù†Ù‚Ø·Ø©" +msgstr "النقاط" #: editor/plugins/polygon_2d_editor_plugin.cpp -#, fuzzy msgid "Polygons" -msgstr "تعديل البولي" +msgstr "Ø§Ù„Ù…ÙØ¶Ù„عات" #: editor/plugins/polygon_2d_editor_plugin.cpp -#, fuzzy msgid "Bones" -msgstr "أنشئ عظام" +msgstr "العظام" #: editor/plugins/polygon_2d_editor_plugin.cpp -#, fuzzy msgid "Move Points" -msgstr "Ù…Ø³Ø Ø§Ù„Ù†Ù‚Ø·Ø©" +msgstr "ØªØØ±ÙŠÙƒ النقاط" #: editor/plugins/polygon_2d_editor_plugin.cpp msgid "Ctrl: Rotate" -msgstr "" +msgstr "Ctrl: تدوير" #: editor/plugins/polygon_2d_editor_plugin.cpp msgid "Shift: Move All" -msgstr "" +msgstr "Shift: ØªØØ±ÙŠÙƒ الكÙÙ„" #: editor/plugins/polygon_2d_editor_plugin.cpp msgid "Shift+Ctrl: Scale" -msgstr "" +msgstr "Shift+Ctrl: ØªØØ¬ÙŠÙ…" #: editor/plugins/polygon_2d_editor_plugin.cpp msgid "Move Polygon" -msgstr "" +msgstr "ØªØØ±ÙŠÙƒ Ø§Ù„Ù…ÙØ¶Ù„ع" #: editor/plugins/polygon_2d_editor_plugin.cpp msgid "Rotate Polygon" -msgstr "" +msgstr "تدوير Ø§Ù„Ù…ÙØ¶Ù„ع" #: editor/plugins/polygon_2d_editor_plugin.cpp msgid "Scale Polygon" -msgstr "" +msgstr "ØªØØ¬ÙŠÙ… Ø§Ù„Ù…ÙØ¶Ù„ع" #: editor/plugins/polygon_2d_editor_plugin.cpp msgid "Create a custom polygon. Enables custom polygon rendering." -msgstr "" +msgstr "إنشاء Ù…ÙØ¶Ù„ع مخصوص. تمكين إخراج Ø§Ù„Ù…ÙØ¶Ù„ع المخصوص بصرياً." #: editor/plugins/polygon_2d_editor_plugin.cpp msgid "" "Remove a custom polygon. If none remain, custom polygon rendering is " "disabled." msgstr "" +"إزالة Ø§Ù„Ù…ÙØ¶Ù„ع المخصوص. إن لم يتبق شيء، سيتم تعطيل إخراج Ø§Ù„Ù…ÙØ¶Ù„ع المخصوص بصرياً." #: editor/plugins/polygon_2d_editor_plugin.cpp msgid "Paint weights with specified intensity." -msgstr "" +msgstr "طلاء الأوزان بشدات Ù…ØØ¯Ø¯Ø©." #: editor/plugins/polygon_2d_editor_plugin.cpp msgid "Unpaint weights with specified intensity." -msgstr "" +msgstr "إزالة طلاء الأوزان بشدات Ù…ØØ¯Ø¯Ø©." #: editor/plugins/polygon_2d_editor_plugin.cpp msgid "Radius:" -msgstr "" +msgstr "نص٠القطر:" #: editor/plugins/polygon_2d_editor_plugin.cpp msgid "Polygon->UV" -msgstr "" +msgstr "Ù…ÙØ¶Ù„ع > UV" #: editor/plugins/polygon_2d_editor_plugin.cpp msgid "UV->Polygon" -msgstr "" +msgstr "UV > Ù…ÙØ¶Ù„ع" #: editor/plugins/polygon_2d_editor_plugin.cpp msgid "Clear UV" -msgstr "" +msgstr "إزالة UV" #: editor/plugins/polygon_2d_editor_plugin.cpp -#, fuzzy msgid "Grid Settings" -msgstr "إعدادات Ø§Ù„Ù…ÙØ¹Ø¯Ù„" +msgstr "إعدادات الشبكة" #: editor/plugins/polygon_2d_editor_plugin.cpp msgid "Snap" -msgstr "" +msgstr "Ù…ØØ§Ø°Ø§Ø©" #: editor/plugins/polygon_2d_editor_plugin.cpp msgid "Enable Snap" -msgstr "" +msgstr "تمكين Ø§Ù„Ù…ØØ§Ø°Ø§Ø©" #: editor/plugins/polygon_2d_editor_plugin.cpp msgid "Grid" -msgstr "" +msgstr "الشبكة" #: editor/plugins/polygon_2d_editor_plugin.cpp msgid "Show Grid" msgstr "إظهار الشبكة" #: editor/plugins/polygon_2d_editor_plugin.cpp -#, fuzzy msgid "Configure Grid:" -msgstr "تعديل اللقطة" +msgstr "تهيئة الشكبة:" #: editor/plugins/polygon_2d_editor_plugin.cpp -#, fuzzy msgid "Grid Offset X:" -msgstr "معادل الشبكة:" +msgstr "معادل الشبكة على المØÙˆØ± الأÙقي X:" #: editor/plugins/polygon_2d_editor_plugin.cpp -#, fuzzy msgid "Grid Offset Y:" -msgstr "معادل الشبكة:" +msgstr "معادل الشبكة على المØÙˆØ± Y:" #: editor/plugins/polygon_2d_editor_plugin.cpp -#, fuzzy msgid "Grid Step X:" -msgstr "خطوة الشبكة:" +msgstr "خطوة الشبكة على المØÙˆØ± X:" #: editor/plugins/polygon_2d_editor_plugin.cpp -#, fuzzy msgid "Grid Step Y:" -msgstr "خطوة الشبكة:" +msgstr "خطوة الشبكة على المØÙˆØ± Y:" #: editor/plugins/polygon_2d_editor_plugin.cpp msgid "Sync Bones to Polygon" -msgstr "" +msgstr "مزامنة العظام مع Ø§Ù„Ù…ÙØ¶Ù„ع" #: editor/plugins/resource_preloader_editor_plugin.cpp msgid "ERROR: Couldn't load resource!" -msgstr "" +msgstr "خطأ: لا يمكن تØÙ…يل المورد!" #: editor/plugins/resource_preloader_editor_plugin.cpp msgid "Add Resource" -msgstr "" +msgstr "Ø¥Ø¶Ø§ÙØ© مورد" #: editor/plugins/resource_preloader_editor_plugin.cpp msgid "Rename Resource" -msgstr "" +msgstr "إعادة تسمية المورد" #: editor/plugins/resource_preloader_editor_plugin.cpp #: editor/plugins/sprite_frames_editor_plugin.cpp msgid "Delete Resource" -msgstr "" +msgstr "ØØ°Ù المورد" #: editor/plugins/resource_preloader_editor_plugin.cpp msgid "Resource clipboard is empty!" -msgstr "" +msgstr "ØØ§Ùظة الموارد ÙØ§Ø±ØºØ©!" #: editor/plugins/resource_preloader_editor_plugin.cpp msgid "Paste Resource" -msgstr "لصق الموارد" +msgstr "لصق المورد" #: editor/plugins/resource_preloader_editor_plugin.cpp #: editor/scene_tree_editor.cpp msgid "Instance:" -msgstr "" +msgstr "نمذجة:" #: editor/plugins/resource_preloader_editor_plugin.cpp #: editor/plugins/theme_editor_plugin.cpp editor/project_settings_editor.cpp #: editor/scene_tree_editor.cpp editor/script_editor_debugger.cpp #: modules/visual_script/visual_script_editor.cpp msgid "Type:" -msgstr "" +msgstr "نوع:" #: editor/plugins/resource_preloader_editor_plugin.cpp #: editor/scene_tree_dock.cpp editor/scene_tree_editor.cpp msgid "Open in Editor" -msgstr "" +msgstr "Ø§ÙØªØ ÙÙŠ Ø§Ù„Ù…ÙØØ±Ø±" #: editor/plugins/resource_preloader_editor_plugin.cpp msgid "Load Resource" -msgstr "" +msgstr "تØÙ…يل المورد" #: editor/plugins/resource_preloader_editor_plugin.cpp msgid "ResourcePreloader" -msgstr "Ù…ØØ¯Ø« مسبق للموارد" +msgstr "مورد Ù…ØÙ…Ù„ Ø³Ù„ÙØ§Ù‹" #: editor/plugins/root_motion_editor_plugin.cpp msgid "AnimationTree has no path set to an AnimationPlayer" -msgstr "" +msgstr "لا تملك شجرة الرسومات Ø§Ù„Ù…ØªØØ±ÙƒØ© مساراً لمشغل الرسومات Ø§Ù„Ù…ØªØØ±ÙƒØ©" #: editor/plugins/root_motion_editor_plugin.cpp -#, fuzzy msgid "Path to AnimationPlayer is invalid" -msgstr "شجرة Ø§Ù„ØØ±ÙƒØ© خاطئة." +msgstr "المسار لمشغل الرسومات Ø§Ù„Ù…ØªØØ±ÙƒØ© غير صالØ" #: editor/plugins/script_editor_plugin.cpp msgid "Clear Recent Files" -msgstr "" +msgstr "إزالة Ø§Ù„Ù…Ù„ÙØ§Øª Ø§Ù„ØØ¯ÙŠØ«Ø©" #: editor/plugins/script_editor_plugin.cpp msgid "Close and save changes?" -msgstr "" +msgstr "الإغلاق مع ØÙظ التعديلات؟" #: editor/plugins/script_editor_plugin.cpp -#, fuzzy msgid "Error writing TextFile:" -msgstr "خطأ ÙÙŠ ØÙظ مجموعة البلاط!" +msgstr "خطأ ÙÙŠ كتابة المل٠النصي TextFile:" #: editor/plugins/script_editor_plugin.cpp -#, fuzzy msgid "Could not load file at:" -msgstr "لا يمكن إنشاء المجلد." +msgstr "لا يمكن تØÙ…يل المجلد ÙÙŠ:" #: editor/plugins/script_editor_plugin.cpp -#, fuzzy msgid "Error saving file!" -msgstr "خطأ ÙÙŠ ØÙظ مجموعة البلاط!" +msgstr "خطأ ÙÙŠ ØÙظ الملÙ!" #: editor/plugins/script_editor_plugin.cpp -#, fuzzy msgid "Error while saving theme." -msgstr "خطأ خلال الØÙظ." +msgstr "خطأ أثناء ØÙظ الموضوع (Theme)." #: editor/plugins/script_editor_plugin.cpp -#, fuzzy msgid "Error Saving" -msgstr "خطأ ÙÙŠ ØªØØ±ÙŠÙƒ:" +msgstr "خطأ ÙÙŠ الØÙظ" #: editor/plugins/script_editor_plugin.cpp -#, fuzzy msgid "Error importing theme." -msgstr "خطأ ÙÙŠ ØªØØ±ÙŠÙƒ:" +msgstr "خطأ ÙÙŠ استيراد الموضوع (Theme)." #: editor/plugins/script_editor_plugin.cpp -#, fuzzy msgid "Error Importing" -msgstr "خطأ ÙÙŠ ØªØØ±ÙŠÙƒ:" +msgstr "خطأ ÙÙŠ الاستيراد" #: editor/plugins/script_editor_plugin.cpp -#, fuzzy msgid "New Text File..." -msgstr "مجلد جديد..." +msgstr "مل٠نصي جديد..." #: editor/plugins/script_editor_plugin.cpp -#, fuzzy msgid "Open File" -msgstr "Ø¥ÙØªØ ملÙ" +msgstr "Ø§ÙØªØ الملÙ" #: editor/plugins/script_editor_plugin.cpp -#, fuzzy msgid "Save File As..." -msgstr "ØÙظ باسم..." +msgstr "ØÙظ المل٠ك..." #: editor/plugins/script_editor_plugin.cpp msgid "Can't obtain the script for running." -msgstr "" +msgstr "لا يمكن Ø§Ù„ØØµÙˆÙ„ على النص البرمجي للتشغيل." #: editor/plugins/script_editor_plugin.cpp msgid "Script failed reloading, check console for errors." -msgstr "" +msgstr "أخÙÙ‚ تØÙ…يل النص البرمجي، تÙقد الأخطاء ÙÙŠ العارض console." #: editor/plugins/script_editor_plugin.cpp msgid "Script is not in tool mode, will not be able to run." -msgstr "" +msgstr "النص البرمجي ليس ÙÙŠ وضعية الأداة، لم ÙŠÙ†Ø¬Ø Ø§Ù„ØªØ´ØºÙŠÙ„." #: editor/plugins/script_editor_plugin.cpp msgid "" "To run this script, it must inherit EditorScript and be set to tool mode." msgstr "" +"ليتم تشغيل النص البرمجي، ينبغي أن يرث النص البرمجي Ù„Ù„Ù…ØØ±Ø± EditorScript وأن " +"ÙŠÙØ¶Ø¹ ÙÙŠ وضعية الأداة." #: editor/plugins/script_editor_plugin.cpp msgid "Import Theme" -msgstr "" +msgstr "استيراد الموضوع Theme" #: editor/plugins/script_editor_plugin.cpp msgid "Error while saving theme" -msgstr "" +msgstr "خطأ أثناء ØÙظ الموضوع Theme" #: editor/plugins/script_editor_plugin.cpp msgid "Error saving" @@ -6938,36 +6856,33 @@ msgstr "خطأ ÙÙŠ الØÙظ" #: editor/plugins/script_editor_plugin.cpp msgid "Save Theme As..." -msgstr "" +msgstr "ØÙظ الموضوع Theme Ùƒ..." #: editor/plugins/script_editor_plugin.cpp -#, fuzzy msgid "%s Class Reference" -msgstr " مرجع الصنÙ" +msgstr "%s مرجعية الص٠Class" #: editor/plugins/script_editor_plugin.cpp #: editor/plugins/script_text_editor.cpp msgid "Find Next" -msgstr "Ø¨ØØ« عن التالي" +msgstr "Ø§Ø¨ØØ« عن التالي" #: editor/plugins/script_editor_plugin.cpp #: editor/plugins/script_text_editor.cpp msgid "Find Previous" -msgstr "" +msgstr "إيجاد السابق" #: editor/plugins/script_editor_plugin.cpp -#, fuzzy msgid "Filter scripts" -msgstr "خصائص العنصر." +msgstr "ØªØ´Ø±ÙŠØ Ø§Ù„Ù†ØµÙˆØµ البرمجية" #: editor/plugins/script_editor_plugin.cpp msgid "Toggle alphabetical sorting of the method list." -msgstr "" +msgstr "ØªÙØ¹ÙŠÙ„ الترتيب Ø§Ù„Ø£Ù„ÙØ¨Ø§Ø¦ÙŠ Ù„Ù‚Ø§Ø¦Ù…Ø© الدوال." #: editor/plugins/script_editor_plugin.cpp -#, fuzzy msgid "Filter methods" -msgstr "وضع Ø§Ù„Ù…ÙØµÙÙŠ:" +msgstr "ØªØ±Ø´ÙŠØ Ø§Ù„Ø¯ÙˆØ§Ù„" #: editor/plugins/script_editor_plugin.cpp msgid "Sort" @@ -6987,25 +6902,23 @@ msgstr "ØªØØ±Ùƒ لأسÙÙ„" #: editor/plugins/script_editor_plugin.cpp msgid "Next script" -msgstr "" +msgstr "النص البرمجي التالي" #: editor/plugins/script_editor_plugin.cpp msgid "Previous script" -msgstr "" +msgstr "النص البرمجي السابق" #: editor/plugins/script_editor_plugin.cpp msgid "File" msgstr "ملÙ" #: editor/plugins/script_editor_plugin.cpp -#, fuzzy msgid "Open..." -msgstr "Ø¥ÙØªØ" +msgstr "Ø§ÙØªØ..." #: editor/plugins/script_editor_plugin.cpp -#, fuzzy msgid "Reopen Closed Script" -msgstr "ÙØªØ الكود" +msgstr "إعادة ÙØªØ النص البرمجي Ø§Ù„Ù…ÙØºÙ„Ù‚" #: editor/plugins/script_editor_plugin.cpp msgid "Save All" @@ -7013,125 +6926,115 @@ msgstr "اØÙظ الكل" #: editor/plugins/script_editor_plugin.cpp msgid "Soft Reload Script" -msgstr "" +msgstr "إعادة تØÙ…يل النص البرمجي بلطÙ" #: editor/plugins/script_editor_plugin.cpp msgid "Copy Script Path" -msgstr "نسخ مسار الكود" +msgstr "نسخ مسار النص البرمجي" #: editor/plugins/script_editor_plugin.cpp -#, fuzzy msgid "History Previous" -msgstr "التبويب السابق" +msgstr "التأريخ السابق" #: editor/plugins/script_editor_plugin.cpp msgid "History Next" -msgstr "" +msgstr "التأريخ التالي" #: editor/plugins/script_editor_plugin.cpp #: editor/plugins/theme_editor_plugin.cpp msgid "Theme" -msgstr "" +msgstr "الموضوع" #: editor/plugins/script_editor_plugin.cpp -#, fuzzy msgid "Import Theme..." -msgstr "ØØ§Ø±ÙŠ Ø¥Ø³ØªÙŠØ±Ø§Ø¯ المشهد..." +msgstr "استيراد الموضوع…" #: editor/plugins/script_editor_plugin.cpp msgid "Reload Theme" -msgstr "" +msgstr "إعادة تØÙ…يل الموضوع" #: editor/plugins/script_editor_plugin.cpp msgid "Save Theme" -msgstr "" +msgstr "اØÙظ الموضوع" #: editor/plugins/script_editor_plugin.cpp msgid "Close All" -msgstr "" +msgstr "إغلاق الكل" #: editor/plugins/script_editor_plugin.cpp msgid "Close Docs" -msgstr "" +msgstr "إغلاق المستندات" #: editor/plugins/script_editor_plugin.cpp editor/project_manager.cpp msgid "Run" -msgstr "" +msgstr "تشغيل" #: editor/plugins/script_editor_plugin.cpp editor/script_editor_debugger.cpp msgid "Step Into" -msgstr "" +msgstr "خطوة ضمن" #: editor/plugins/script_editor_plugin.cpp editor/script_editor_debugger.cpp msgid "Step Over" -msgstr "" +msgstr "خطوة متجاوزة" #: editor/plugins/script_editor_plugin.cpp editor/script_editor_debugger.cpp msgid "Break" -msgstr "" +msgstr "توقÙ" #: editor/plugins/script_editor_plugin.cpp editor/project_manager.cpp #: editor/script_editor_debugger.cpp msgid "Continue" -msgstr "" +msgstr "استمرار" #: editor/plugins/script_editor_plugin.cpp msgid "Keep Debugger Open" -msgstr "" +msgstr "إبقاء منÙÙ‚ØªØ Ø§Ù„Ø£Ø®Ø·Ø§Ø¡ البرمجية Ù…ÙØªÙˆØØ§Ù‹" #: editor/plugins/script_editor_plugin.cpp -#, fuzzy msgid "Debug with External Editor" -msgstr "ÙØªØ ÙÙŠ Ø§Ù„Ù…ÙØ¹Ø¯Ù„ التالي" +msgstr "ØªÙ†Ù‚ÙŠØ Ø§Ù„Ø£Ø®Ø·Ø§Ø¡ ÙÙŠ Ù…ØØ±Ø± خارجي" #: editor/plugins/script_editor_plugin.cpp -#, fuzzy msgid "Open Godot online documentation." -msgstr "ÙÙØªØ مؤخراً" - -#: editor/plugins/script_editor_plugin.cpp -msgid "Request Docs" -msgstr "" - -#: editor/plugins/script_editor_plugin.cpp -msgid "Help improve the Godot documentation by giving feedback." -msgstr "" +msgstr "Ø§ÙØªØ مستندات غودوت على الشبكة." #: editor/plugins/script_editor_plugin.cpp msgid "Search the reference documentation." -msgstr "" +msgstr "Ø§Ø¨ØØ« ÙÙŠ الوثائق المرجعية." #: editor/plugins/script_editor_plugin.cpp msgid "Go to previous edited document." -msgstr "" +msgstr "التوجه إلى المستند Ø§Ù„Ù…ÙØØ±Ø± السابق." #: editor/plugins/script_editor_plugin.cpp msgid "Go to next edited document." -msgstr "" +msgstr "التوجه إلى المستند Ø§Ù„Ù…ÙØØ±Ø± التالي." #: editor/plugins/script_editor_plugin.cpp msgid "Discard" -msgstr "" +msgstr "تجاهل" #: editor/plugins/script_editor_plugin.cpp msgid "" "The following files are newer on disk.\n" "What action should be taken?:" msgstr "" +"Ø§Ù„Ù…Ù„ÙØ§Øª التالية Ø£ØØ¯Ø« على القرص.\n" +"ما الإجراء الذي ينبغي اتخاذه؟:" #: editor/plugins/script_editor_plugin.cpp #: editor/plugins/shader_editor_plugin.cpp msgid "Reload" -msgstr "" +msgstr "إعادة تØÙ…يل" #: editor/plugins/script_editor_plugin.cpp #: editor/plugins/shader_editor_plugin.cpp msgid "Resave" -msgstr "" +msgstr "إعادة ØÙظ" #: editor/plugins/script_editor_plugin.cpp editor/script_editor_debugger.cpp msgid "Debugger" -msgstr "" +msgstr "Ù…ÙÙ†Ù‚Ø Ø§Ù„Ø£Ø®Ø·Ø§Ø¡" #: editor/plugins/script_editor_plugin.cpp #, fuzzy @@ -7155,7 +7058,7 @@ msgstr "مورد" #: editor/plugins/script_text_editor.cpp msgid "Target" -msgstr "" +msgstr "الهدÙ" #: editor/plugins/script_text_editor.cpp #, fuzzy @@ -7170,7 +7073,7 @@ msgstr "الخط:" #: editor/plugins/script_text_editor.cpp msgid "(ignore)" -msgstr "" +msgstr "(تجاهل)" #: editor/plugins/script_text_editor.cpp #, fuzzy @@ -7179,50 +7082,50 @@ msgstr "Ù…Ø³Ø Ø§Ù„Ù…Ù‡Ù…Ø©" #: editor/plugins/script_text_editor.cpp msgid "Only resources from filesystem can be dropped." -msgstr "" +msgstr "يمكن إسقاط موارد Ù…Ù„ÙØ§Øª النظام filesystem Ùقط." #: editor/plugins/script_text_editor.cpp #: modules/visual_script/visual_script_editor.cpp msgid "Can't drop nodes because script '%s' is not used in this scene." -msgstr "" +msgstr "لا يمكن إسقاط العÙقد لأن النص البرمجي '%s' غير Ù…ÙØ³ØªØ®Ø¯Ù… ÙÙŠ هذا المشهد." #: editor/plugins/script_text_editor.cpp msgid "Lookup Symbol" -msgstr "" +msgstr "رمز Ø§Ù„Ø¨ØØ«" #: editor/plugins/script_text_editor.cpp msgid "Pick Color" -msgstr "" +msgstr "اختر لوناً" #: editor/plugins/script_text_editor.cpp editor/plugins/text_editor.cpp msgid "Convert Case" -msgstr "" +msgstr "ØØ§Ù„Ø© التØÙˆÙŠÙ„" #: editor/plugins/script_text_editor.cpp editor/plugins/text_editor.cpp msgid "Uppercase" -msgstr "" +msgstr "Ø§Ù„Ø£ØØ±Ù الكبيرة (Uppercase)" #: editor/plugins/script_text_editor.cpp editor/plugins/text_editor.cpp msgid "Lowercase" -msgstr "" +msgstr "Ø§Ù„Ø£ØØ±Ù الصغيرة (Lowercase)" #: editor/plugins/script_text_editor.cpp editor/plugins/text_editor.cpp msgid "Capitalize" -msgstr "" +msgstr "تكبير Ø§Ù„ØØ±ÙˆÙ Capitalize" #: editor/plugins/script_text_editor.cpp editor/plugins/text_editor.cpp msgid "Syntax Highlighter" -msgstr "" +msgstr "Ù…ÙØ¹Ù„ّم التركيب Syntax" #: editor/plugins/script_text_editor.cpp #: editor/plugins/shader_editor_plugin.cpp editor/plugins/text_editor.cpp msgid "Go To" -msgstr "" +msgstr "التوجه إلى" #: editor/plugins/script_text_editor.cpp #: editor/plugins/shader_editor_plugin.cpp editor/plugins/text_editor.cpp msgid "Bookmarks" -msgstr "" +msgstr "المØÙوظات" #: editor/plugins/script_text_editor.cpp #, fuzzy @@ -7232,7 +7135,7 @@ msgstr "Ù…Ø³Ø Ø§Ù„Ù†Ù‚Ø§Ø·" #: editor/plugins/script_text_editor.cpp scene/gui/line_edit.cpp #: scene/gui/text_edit.cpp msgid "Cut" -msgstr "" +msgstr "قص" #: editor/plugins/script_text_editor.cpp scene/gui/line_edit.cpp #: scene/gui/text_edit.cpp @@ -7241,19 +7144,19 @@ msgstr "ØªØØ¯ÙŠØ¯ الكل" #: editor/plugins/script_text_editor.cpp msgid "Delete Line" -msgstr "" +msgstr "ØØ°Ù الخط" #: editor/plugins/script_text_editor.cpp msgid "Indent Left" -msgstr "" +msgstr "Ø§Ù„Ù…Ø³Ø§ÙØ© البادئة يساراً" #: editor/plugins/script_text_editor.cpp msgid "Indent Right" -msgstr "" +msgstr "Ø§Ù„Ù…Ø³Ø§ÙØ© البادئة يميناً" #: editor/plugins/script_text_editor.cpp msgid "Toggle Comment" -msgstr "" +msgstr "ØªÙØ¹ÙŠÙ„ Toggle التعليقات" #: editor/plugins/script_text_editor.cpp msgid "Fold/Unfold Line" @@ -7261,19 +7164,19 @@ msgstr "إلغاء/ØªÙØ¹ÙŠÙ„ طي الخط" #: editor/plugins/script_text_editor.cpp msgid "Fold All Lines" -msgstr "" +msgstr "طي جميع الخطوط" #: editor/plugins/script_text_editor.cpp msgid "Unfold All Lines" -msgstr "" +msgstr "كش٠جميع الخطوط" #: editor/plugins/script_text_editor.cpp msgid "Clone Down" -msgstr "" +msgstr "استنساخ أدناه" #: editor/plugins/script_text_editor.cpp msgid "Complete Symbol" -msgstr "" +msgstr "رمز التمام" #: editor/plugins/script_text_editor.cpp #, fuzzy @@ -7282,7 +7185,7 @@ msgstr "تكبير Ø§Ù„Ù…ØØ¯Ø¯" #: editor/plugins/script_text_editor.cpp msgid "Trim Trailing Whitespace" -msgstr "" +msgstr "تشذيب Ø§Ù„ÙØ±Ø§ØºØ§Øª البيضاء الزائدة" #: editor/plugins/script_text_editor.cpp #, fuzzy @@ -7296,7 +7199,7 @@ msgstr "تØÙˆÙŠÙ„ إلي %s" #: editor/plugins/script_text_editor.cpp msgid "Auto Indent" -msgstr "" +msgstr "Ù…Ø³Ø§ÙØ© بادئة تلقائية" #: editor/plugins/script_text_editor.cpp #, fuzzy @@ -7305,7 +7208,7 @@ msgstr "Ùلتر Ø§Ù„Ù…Ù„ÙØ§Øª..." #: editor/plugins/script_text_editor.cpp msgid "Contextual Help" -msgstr "" +msgstr "مساعدة سياقية" #: editor/plugins/script_text_editor.cpp #, fuzzy @@ -7340,11 +7243,11 @@ msgstr "إذهب إلي الخط" #: editor/plugins/script_text_editor.cpp #: modules/visual_script/visual_script_editor.cpp msgid "Toggle Breakpoint" -msgstr "" +msgstr "ØªÙØ¹ÙŠÙ„/إلغاء ØªÙØ¹ÙŠÙ„ نقطة التكسّر" #: editor/plugins/script_text_editor.cpp msgid "Remove All Breakpoints" -msgstr "" +msgstr "إزالة جميع نقاط التكسّر" #: editor/plugins/script_text_editor.cpp #, fuzzy @@ -7361,14 +7264,16 @@ msgid "" "This shader has been modified on on disk.\n" "What action should be taken?" msgstr "" +"لقد تم تعديل هذا Ø§Ù„Ù…ÙØ¸Ù„Ù„ على القرص.\n" +"ما الإجراء الذي ينبغي اتخاذه؟" #: editor/plugins/shader_editor_plugin.cpp msgid "Shader" -msgstr "" +msgstr "Ù…ÙØ¸Ù„Ù„" #: editor/plugins/skeleton_2d_editor_plugin.cpp msgid "This skeleton has no bones, create some children Bone2D nodes." -msgstr "" +msgstr "لا يملك هذا الهكيل أيّة عظام، أنشئ بعض عÙقد العظام ثنائية Ø§Ù„Ø¨ÙØ¹Ø¯ كأبناء." #: editor/plugins/skeleton_2d_editor_plugin.cpp #, fuzzy @@ -7377,20 +7282,19 @@ msgstr "أنشئ نقاط إنبعاث من الشبكة" #: editor/plugins/skeleton_2d_editor_plugin.cpp msgid "Set Rest Pose to Bones" -msgstr "" +msgstr "ØªØØ¯ÙŠØ¯ وضعية Ø§Ù„Ø±Ø§ØØ© على العظام" #: editor/plugins/skeleton_2d_editor_plugin.cpp -#, fuzzy msgid "Skeleton2D" -msgstr "Ø§Ù„ÙØ±Ø¯ÙŠØ©" +msgstr "هيكل ثنائي Ø§Ù„Ø¨ÙØ¹Ø¯" #: editor/plugins/skeleton_2d_editor_plugin.cpp msgid "Make Rest Pose (From Bones)" -msgstr "" +msgstr "إنشاء وضعية Ø§Ù„Ø±Ø§ØØ© (من العظام)" #: editor/plugins/skeleton_2d_editor_plugin.cpp msgid "Set Bones to Rest Pose" -msgstr "" +msgstr "ØªØØ¯ÙŠØ¯ العظام لتكون ÙÙŠ وضعية Ø§Ù„Ø±Ø§ØØ©" #: editor/plugins/skeleton_editor_plugin.cpp #, fuzzy @@ -7413,35 +7317,35 @@ msgstr "تشغيل" #: editor/plugins/spatial_editor_plugin.cpp msgid "Orthogonal" -msgstr "" +msgstr "متعامد" #: editor/plugins/spatial_editor_plugin.cpp msgid "Perspective" -msgstr "" +msgstr "منظوري" #: editor/plugins/spatial_editor_plugin.cpp msgid "Transform Aborted." -msgstr "" +msgstr "أجهض التØÙˆÙ„." #: editor/plugins/spatial_editor_plugin.cpp msgid "X-Axis Transform." -msgstr "" +msgstr "التØÙˆÙ‘Ù„ المØÙˆØ±ÙŠ X." #: editor/plugins/spatial_editor_plugin.cpp msgid "Y-Axis Transform." -msgstr "" +msgstr "التØÙˆÙ‘Ù„ المØÙˆØ±ÙŠ Y." #: editor/plugins/spatial_editor_plugin.cpp msgid "Z-Axis Transform." -msgstr "" +msgstr "التØÙˆÙ‘Ù„ المØÙˆØ±ÙŠ Z." #: editor/plugins/spatial_editor_plugin.cpp msgid "View Plane Transform." -msgstr "" +msgstr "إظهار تØÙˆÙ„ات المستوى." #: editor/plugins/spatial_editor_plugin.cpp msgid "Scaling: " -msgstr "" +msgstr "ÙŠÙØØ¬Ù…: " #: editor/plugins/spatial_editor_plugin.cpp msgid "Translating: " @@ -7449,119 +7353,123 @@ msgstr "يترجم: " #: editor/plugins/spatial_editor_plugin.cpp msgid "Rotating %s degrees." -msgstr "" +msgstr "ÙŠÙØ¯ÙŠØ± %s من الدرجات." #: editor/plugins/spatial_editor_plugin.cpp msgid "Keying is disabled (no key inserted)." -msgstr "" +msgstr "تم تعطيل تعيين Ø§Ù„Ù…ÙØ§ØªÙŠØ (لم يتم إدخال أيّة Ù…ÙØ§ØªÙŠØ)." #: editor/plugins/spatial_editor_plugin.cpp msgid "Animation Key Inserted." -msgstr "" +msgstr "Ø£ÙØ¯Ø®Ù„ Ù…ÙØªØ§Ø الرسوم Ø§Ù„Ù…ØªØØ±ÙƒØ©." #: editor/plugins/spatial_editor_plugin.cpp msgid "Pitch" -msgstr "" +msgstr "ØØ¯Ù‘Ø©" #: editor/plugins/spatial_editor_plugin.cpp msgid "Yaw" -msgstr "" +msgstr "Ø§Ù„Ø¥Ù†ØØ±Ø§Ù Yaw" #: editor/plugins/spatial_editor_plugin.cpp msgid "Objects Drawn" -msgstr "" +msgstr "كائنات مرسومة" #: editor/plugins/spatial_editor_plugin.cpp msgid "Material Changes" -msgstr "" +msgstr "ØªÙØºÙŠØ±Ø§Øª المادة" #: editor/plugins/spatial_editor_plugin.cpp msgid "Shader Changes" -msgstr "" +msgstr "تغيرات Ø§Ù„Ù…ÙØ¸Ù„Ù„" #: editor/plugins/spatial_editor_plugin.cpp msgid "Surface Changes" -msgstr "" +msgstr "تغيرات السطØ" #: editor/plugins/spatial_editor_plugin.cpp msgid "Draw Calls" -msgstr "" +msgstr "رسم الاستدعاءات" #: editor/plugins/spatial_editor_plugin.cpp msgid "Vertices" -msgstr "" +msgstr "القمم" #: editor/plugins/spatial_editor_plugin.cpp msgid "Top View." -msgstr "" +msgstr "الواجهة العلوية." #: editor/plugins/spatial_editor_plugin.cpp msgid "Bottom View." -msgstr "" +msgstr "الواجهة السÙلية." #: editor/plugins/spatial_editor_plugin.cpp msgid "Bottom" -msgstr "" +msgstr "الأسÙÙ„" #: editor/plugins/spatial_editor_plugin.cpp msgid "Left View." -msgstr "" +msgstr "الواجهة Ø§Ù„ÙŠÙØ³Ø±Ù‰." #: editor/plugins/spatial_editor_plugin.cpp msgid "Left" -msgstr "" +msgstr "اليسار" #: editor/plugins/spatial_editor_plugin.cpp msgid "Right View." -msgstr "" +msgstr "الواجهة اليÙمنى." #: editor/plugins/spatial_editor_plugin.cpp msgid "Right" -msgstr "" +msgstr "اليمين" #: editor/plugins/spatial_editor_plugin.cpp msgid "Front View." -msgstr "" +msgstr "الواجهة الأمامية." #: editor/plugins/spatial_editor_plugin.cpp msgid "Front" -msgstr "" +msgstr "الأمام" #: editor/plugins/spatial_editor_plugin.cpp msgid "Rear View." -msgstr "" +msgstr "الواجهة الخلÙية." #: editor/plugins/spatial_editor_plugin.cpp msgid "Rear" -msgstr "" +msgstr "الخلÙ" #: editor/plugins/spatial_editor_plugin.cpp msgid "Align Transform with View" -msgstr "" +msgstr "Ù…ØØ§Ø°Ø§Ø© التØÙˆÙ‘Ù„ مع الواجهة" #: editor/plugins/spatial_editor_plugin.cpp msgid "Align Rotation with View" -msgstr "" +msgstr "Ù…ØØ§Ø°Ø§Ø© التدوير مع الواجهة" #: editor/plugins/spatial_editor_plugin.cpp editor/scene_tree_dock.cpp msgid "No parent to instance a child at." -msgstr "لا أب للصق الطÙÙ„ عليه." +msgstr "لا أب لنمذجة ابن له." #: editor/plugins/spatial_editor_plugin.cpp editor/scene_tree_dock.cpp msgid "This operation requires a single selected node." msgstr "هذه العملية تتطلب عقدة ÙˆØ§ØØ¯Ø© Ù…ØØ¯Ø¯Ø©." #: editor/plugins/spatial_editor_plugin.cpp +msgid "Auto Orthogonal Enabled" +msgstr "الإسقاط العمودي Ù…Ùمكن تلقائياً" + +#: editor/plugins/spatial_editor_plugin.cpp msgid "Lock View Rotation" -msgstr "" +msgstr "Ù‚ÙÙ„ تدوير الواجهة" #: editor/plugins/spatial_editor_plugin.cpp msgid "Display Normal" -msgstr "" +msgstr "عرض الطبيعي" #: editor/plugins/spatial_editor_plugin.cpp msgid "Display Wireframe" -msgstr "" +msgstr "عرض Ø§Ù„Ù…ÙØ®Ø·Ø· Wireframe" #: editor/plugins/spatial_editor_plugin.cpp msgid "Display Overdraw" @@ -7569,31 +7477,31 @@ msgstr "" #: editor/plugins/spatial_editor_plugin.cpp msgid "Display Unshaded" -msgstr "" +msgstr "عرض من غير ظلال" #: editor/plugins/spatial_editor_plugin.cpp msgid "View Environment" -msgstr "" +msgstr "عرض البيئة" #: editor/plugins/spatial_editor_plugin.cpp msgid "View Gizmos" -msgstr "" +msgstr "إظهار الأدوات Gizmos" #: editor/plugins/spatial_editor_plugin.cpp msgid "View Information" -msgstr "" +msgstr "إظهار المعلومات" #: editor/plugins/spatial_editor_plugin.cpp msgid "View FPS" -msgstr "إظهار Ø§Ù„ÙØ±ÙŠÙ…/ثانية" +msgstr "إظهار عدد الإطارات بالثانية" #: editor/plugins/spatial_editor_plugin.cpp msgid "Half Resolution" -msgstr "Ù†ØµÙ ØØ¬Ù… الشاشة" +msgstr "نص٠دقة الشاشة" #: editor/plugins/spatial_editor_plugin.cpp msgid "Audio Listener" -msgstr "" +msgstr "المستمع الصوتي" #: editor/plugins/spatial_editor_plugin.cpp #, fuzzy @@ -7607,62 +7515,63 @@ msgstr "ÙŠÙنشئ مستعرضات الميش" #: editor/plugins/spatial_editor_plugin.cpp msgid "Not available when using the GLES2 renderer." -msgstr "" +msgstr "غير Ù…ØªÙˆØ§ÙØ± عند استخدام الخرج البصري GLES2 ." #: editor/plugins/spatial_editor_plugin.cpp msgid "Freelook Left" -msgstr "" +msgstr "الرؤية الØÙرة Freelook يساراً" #: editor/plugins/spatial_editor_plugin.cpp msgid "Freelook Right" -msgstr "" +msgstr "الرؤية Ø§Ù„ØØ±Ø© Freelook يميناً" #: editor/plugins/spatial_editor_plugin.cpp msgid "Freelook Forward" -msgstr "" +msgstr "الرؤية Ø§Ù„ØØ±Ø© Freelook Ù‚ÙØ¯Ù…اً" #: editor/plugins/spatial_editor_plugin.cpp msgid "Freelook Backwards" -msgstr "" +msgstr "الرؤية الØÙرة Freelook تراجعياً" #: editor/plugins/spatial_editor_plugin.cpp msgid "Freelook Up" -msgstr "" +msgstr "الرؤية الØÙرة Freelook للأعلى" #: editor/plugins/spatial_editor_plugin.cpp msgid "Freelook Down" -msgstr "" +msgstr "الرؤية الØÙرة للأسÙÙ„" #: editor/plugins/spatial_editor_plugin.cpp msgid "Freelook Speed Modifier" -msgstr "" +msgstr "Ù…ÙØ¹Ø¯Ù‘Ù„ سرعة الرؤية الØÙرة" #: editor/plugins/spatial_editor_plugin.cpp msgid "Freelook Slow Modifier" -msgstr "" +msgstr "Ù…ÙØ¹Ø¯Ù‘Ù„ تباطؤ الرؤية الØÙرة" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "View Rotation Locked" +msgstr "تدوير الرؤية مقÙول" #: editor/plugins/spatial_editor_plugin.cpp msgid "" "Note: The FPS value displayed is the editor's framerate.\n" "It cannot be used as a reliable indication of in-game performance." msgstr "" - -#: editor/plugins/spatial_editor_plugin.cpp -msgid "View Rotation Locked" -msgstr "" +"Ù…Ù„Ø§ØØ¸Ø©: إن قيمة عدد الإطارات بالثانية الظاهر هو Ù…ÙØ¹Ø¯Ù„ خاص Ø¨Ø§Ù„Ù…ØØ±Ø±.\n" +"لا يمكن الاعتماد على تلك القيمة كمؤشر لأداء اللعبة." #: editor/plugins/spatial_editor_plugin.cpp msgid "XForm Dialog" -msgstr "" +msgstr "Ù†Ø§ÙØ°Ø© XForm" #: editor/plugins/spatial_editor_plugin.cpp -#, fuzzy msgid "Snap Nodes To Floor" -msgstr "الكبس إلي الشبكة" +msgstr "Ù…ØØ§Ø°Ø§Ø© العÙقد إلى الأرضية" #: editor/plugins/spatial_editor_plugin.cpp msgid "Couldn't find a solid floor to snap the selection to." -msgstr "" +msgstr "لم يتم إيجاد أرضية صÙلبة Ù„Ù…ØØ§Ø°Ø§Ø© ما تم اختياره إليها." #: editor/plugins/spatial_editor_plugin.cpp msgid "" @@ -7670,63 +7579,66 @@ msgid "" "Alt+Drag: Move\n" "Alt+RMB: Depth list selection" msgstr "" +"Ø§Ù„Ø³ØØ¨: تدوير.\n" +"Alt+Ø§Ù„Ø³ØØ¨: ØªØØ±ÙŠÙƒ.\n" +"Alt+ كبسة الزر الأيمن Ù„Ù„ÙØ£Ø±Ø©RMB : اختيار قائمة العÙمق" #: editor/plugins/spatial_editor_plugin.cpp msgid "Use Local Space" -msgstr "" +msgstr "استخدام الØÙŠÙ‘ز المØÙ„ÙŠ" #: editor/plugins/spatial_editor_plugin.cpp msgid "Use Snap" -msgstr "إستخدم الكبس" +msgstr "استخدام Ø§Ù„Ù…ØØ§Ø°Ø§Ø©" #: editor/plugins/spatial_editor_plugin.cpp msgid "Bottom View" -msgstr "" +msgstr "الواجهة View السÙلية" #: editor/plugins/spatial_editor_plugin.cpp msgid "Top View" -msgstr "" +msgstr "الواجهة View العلوية" #: editor/plugins/spatial_editor_plugin.cpp msgid "Rear View" -msgstr "" +msgstr "الواجهة View الخلÙية" #: editor/plugins/spatial_editor_plugin.cpp msgid "Front View" -msgstr "" +msgstr "الواجهة View الأمامية" #: editor/plugins/spatial_editor_plugin.cpp msgid "Left View" -msgstr "" +msgstr "الواجهة View Ø§Ù„ÙŠÙØ³Ø±Ù‰" #: editor/plugins/spatial_editor_plugin.cpp msgid "Right View" -msgstr "" +msgstr "الواجهة View اليÙمنى" #: editor/plugins/spatial_editor_plugin.cpp msgid "Switch Perspective/Orthogonal View" -msgstr "" +msgstr "التبديل بين الرؤية المنظورية / الإسقاطية Orthogonal" #: editor/plugins/spatial_editor_plugin.cpp msgid "Insert Animation Key" -msgstr "" +msgstr "إدخال Ù…ÙØªØ§Ø للرسوميات Ø§Ù„Ù…ØªØØ±ÙƒØ©" #: editor/plugins/spatial_editor_plugin.cpp msgid "Focus Origin" -msgstr "" +msgstr "مصدر التركيز" #: editor/plugins/spatial_editor_plugin.cpp msgid "Focus Selection" -msgstr "" +msgstr "اختيار التركيز" #: editor/plugins/spatial_editor_plugin.cpp msgid "Toggle Freelook" -msgstr "إلغاء/ØªÙØ¹ÙŠÙ„ وضع النظرة Ø§Ù„ØØ±Ø©" +msgstr "إلغاء/ØªÙØ¹ÙŠÙ„ وضع الرؤية الØÙرة" #: editor/plugins/spatial_editor_plugin.cpp #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Transform" -msgstr "" +msgstr "التØÙˆÙ‘Ù„" #: editor/plugins/spatial_editor_plugin.cpp #, fuzzy @@ -7735,43 +7647,43 @@ msgstr "الكبس إلي الشبكة" #: editor/plugins/spatial_editor_plugin.cpp msgid "Transform Dialog..." -msgstr "" +msgstr "Ù†Ø§ÙØ°Ø© التØÙˆÙŠÙ„ات ..." #: editor/plugins/spatial_editor_plugin.cpp msgid "1 Viewport" -msgstr "" +msgstr "إطار عرض ÙˆØ§ØØ¯ 1" #: editor/plugins/spatial_editor_plugin.cpp msgid "2 Viewports" -msgstr "" +msgstr "إطاري عرض" #: editor/plugins/spatial_editor_plugin.cpp msgid "2 Viewports (Alt)" -msgstr "" +msgstr "إطاري عرض (Alt)" #: editor/plugins/spatial_editor_plugin.cpp msgid "3 Viewports" -msgstr "" +msgstr "3 إطارات عرض" #: editor/plugins/spatial_editor_plugin.cpp msgid "3 Viewports (Alt)" -msgstr "" +msgstr "3 إطارات عرض (Alt)" #: editor/plugins/spatial_editor_plugin.cpp msgid "4 Viewports" -msgstr "" +msgstr "4 إطارات عرض" #: editor/plugins/spatial_editor_plugin.cpp msgid "Gizmos" -msgstr "" +msgstr "الأدوات Gizmos" #: editor/plugins/spatial_editor_plugin.cpp msgid "View Origin" -msgstr "" +msgstr "إظهار الأصل (المصدر)" #: editor/plugins/spatial_editor_plugin.cpp msgid "View Grid" -msgstr "" +msgstr "إظهار الشبكة" #: editor/plugins/spatial_editor_plugin.cpp #: modules/gridmap/grid_map_editor_plugin.cpp @@ -7781,67 +7693,68 @@ msgstr "جاري الإعداد..." #: editor/plugins/spatial_editor_plugin.cpp msgid "Snap Settings" -msgstr "" +msgstr "إعدادات Ø§Ù„Ù…ØØ§Ø°Ø§Ø©" #: editor/plugins/spatial_editor_plugin.cpp msgid "Translate Snap:" -msgstr "" +msgstr "ترجمة Ø§Ù„Ù…ØØ§Ø°Ø§Ø©:" #: editor/plugins/spatial_editor_plugin.cpp msgid "Rotate Snap (deg.):" -msgstr "" +msgstr "تدوير Ø§Ù„Ù…ØØ§Ø°Ø§Ø© (بالدرجات):" #: editor/plugins/spatial_editor_plugin.cpp msgid "Scale Snap (%):" -msgstr "" +msgstr "ØªØØ¬ÙŠÙ… Ø§Ù„Ù…ØØ§Ø°Ø§Ø© (%):" #: editor/plugins/spatial_editor_plugin.cpp msgid "Viewport Settings" -msgstr "" +msgstr "إعدادات إطار العرض" #: editor/plugins/spatial_editor_plugin.cpp msgid "Perspective FOV (deg.):" -msgstr "" +msgstr "مجال الرؤية FOV المنظورية (بالدرجات):" #: editor/plugins/spatial_editor_plugin.cpp msgid "View Z-Near:" -msgstr "" +msgstr "إظهار Z-Near:" #: editor/plugins/spatial_editor_plugin.cpp +#, fuzzy msgid "View Z-Far:" -msgstr "" +msgstr "إظهار Z-Far:" #: editor/plugins/spatial_editor_plugin.cpp msgid "Transform Change" -msgstr "" +msgstr "تعديل التØÙˆÙ„ات" #: editor/plugins/spatial_editor_plugin.cpp msgid "Translate:" -msgstr "" +msgstr "الترجمة:" #: editor/plugins/spatial_editor_plugin.cpp msgid "Rotate (deg.):" -msgstr "" +msgstr "التدوير (بالدرجات):" #: editor/plugins/spatial_editor_plugin.cpp msgid "Scale (ratio):" -msgstr "" +msgstr "Ø§Ù„ØªØØ¬ÙŠÙ… (نسبةً):" #: editor/plugins/spatial_editor_plugin.cpp msgid "Transform Type" -msgstr "" +msgstr "نوع التØÙˆÙ‘Ù„" #: editor/plugins/spatial_editor_plugin.cpp msgid "Pre" -msgstr "" +msgstr "سابق" #: editor/plugins/spatial_editor_plugin.cpp msgid "Post" -msgstr "" +msgstr "لاØÙ‚" #: editor/plugins/spatial_editor_plugin.cpp msgid "Nameless gizmo" -msgstr "" +msgstr "أداة (gizmo) غير مسماة" #: editor/plugins/sprite_editor_plugin.cpp #, fuzzy @@ -7860,7 +7773,7 @@ msgstr "إنشاء بولي" #: editor/plugins/sprite_editor_plugin.cpp msgid "Polygon2D Preview" -msgstr "" +msgstr "Ù…ÙØ¹Ø§ÙŠÙ†Ø© Ø§Ù„Ù…ÙØ¶Ù„ع ثنائي الأبعاد" #: editor/plugins/sprite_editor_plugin.cpp #, fuzzy @@ -7890,10 +7803,12 @@ msgstr "الميش ÙØ§Ø±Øº!" #: editor/plugins/sprite_editor_plugin.cpp msgid "Can't convert a sprite using animation frames to mesh." msgstr "" +"لا يمكن تØÙˆÙŠÙ„ الرسومية (sprite) إلى Ø³Ø·Ø (mesh) باستخدام إطارات الرسوم " +"Ø§Ù„Ù…ØªØØ±ÙƒØ©." #: editor/plugins/sprite_editor_plugin.cpp msgid "Invalid geometry, can't replace by mesh." -msgstr "" +msgstr "هندسياً غير ØµØ§Ù„ØØŒ لا يمكن استبداله Ø¨Ø³Ø·Ø (mesh)." #: editor/plugins/sprite_editor_plugin.cpp #, fuzzy @@ -7902,7 +7817,7 @@ msgstr "تØÙˆÙŠÙ„ إلي %s" #: editor/plugins/sprite_editor_plugin.cpp msgid "Invalid geometry, can't create polygon." -msgstr "" +msgstr "هندسياصً غير ØµØ§Ù„ØØŒ لا يمكن إنشاء Ù…ÙØ¶Ù„ّع." #: editor/plugins/sprite_editor_plugin.cpp #, fuzzy @@ -7911,7 +7826,7 @@ msgstr "تØÙˆÙŠÙ„ إلي %s" #: editor/plugins/sprite_editor_plugin.cpp msgid "Invalid geometry, can't create collision polygon." -msgstr "" +msgstr "هندسياً غير ØµØ§Ù„ØØŒ لا يمكن إنشاء Ù…ÙØ¶Ù„ع تصادم." #: editor/plugins/sprite_editor_plugin.cpp #, fuzzy @@ -7920,7 +7835,7 @@ msgstr "إنشاء Ù…ÙØ¶Ù„ع التنقل" #: editor/plugins/sprite_editor_plugin.cpp msgid "Invalid geometry, can't create light occluder." -msgstr "" +msgstr "هندسياً غير ØµØ§Ù„ØØŒ لا يمكن إنشاء ØÙظار (occluder) الضوء." #: editor/plugins/sprite_editor_plugin.cpp #, fuzzy @@ -7929,19 +7844,19 @@ msgstr "أنشئ شكل Ù…ÙØ·Ø¨Ù‚" #: editor/plugins/sprite_editor_plugin.cpp msgid "Sprite" -msgstr "" +msgstr "رسومية" #: editor/plugins/sprite_editor_plugin.cpp msgid "Simplification: " -msgstr "" +msgstr "التبسيط: " #: editor/plugins/sprite_editor_plugin.cpp msgid "Shrink (Pixels): " -msgstr "" +msgstr "التقلص (Pixels): " #: editor/plugins/sprite_editor_plugin.cpp msgid "Grow (Pixels): " -msgstr "" +msgstr "التكبير (Pixels): " #: editor/plugins/sprite_editor_plugin.cpp #, fuzzy @@ -7949,79 +7864,72 @@ msgid "Update Preview" msgstr "إستعراض" #: editor/plugins/sprite_editor_plugin.cpp -#, fuzzy msgid "Settings:" -msgstr "إعدادات Ø§Ù„Ù…ÙØ¹Ø¯Ù„" +msgstr "الإعدادات:" #: editor/plugins/sprite_frames_editor_plugin.cpp -#, fuzzy msgid "No Frames Selected" -msgstr "إملئ الشاشة Ø¨Ø§Ù„Ù…ØØ¯Ø¯" +msgstr "لا إطارات Ù…ÙØØ¯Ø¯Ø©" #: editor/plugins/sprite_frames_editor_plugin.cpp msgid "Add %d Frame(s)" -msgstr "" +msgstr "Ø¥Ø¶Ø§ÙØ© %d إطار(ات)" #: editor/plugins/sprite_frames_editor_plugin.cpp msgid "Add Frame" -msgstr "" +msgstr "Ø¥Ø¶Ø§ÙØ© إطار" #: editor/plugins/sprite_frames_editor_plugin.cpp -#, fuzzy msgid "Unable to load images" -msgstr "ÙØ´Ù„ تØÙ…يل المورد." +msgstr "غير قادر على تØÙ…يل الصور" #: editor/plugins/sprite_frames_editor_plugin.cpp msgid "ERROR: Couldn't load frame resource!" -msgstr "" +msgstr "خطأ: لم يتم تØÙ…يل مورد الإطار!" #: editor/plugins/sprite_frames_editor_plugin.cpp msgid "Resource clipboard is empty or not a texture!" -msgstr "" +msgstr "إما أن تكون ØØ§Ùظة الموارد ÙØ§Ø±ØºØ© أو ليست نقشاً!" #: editor/plugins/sprite_frames_editor_plugin.cpp msgid "Paste Frame" -msgstr "" +msgstr "الصق إطاراً" #: editor/plugins/sprite_frames_editor_plugin.cpp msgid "Add Empty" -msgstr "" +msgstr "Ø¥Ø¶Ø§ÙØªÙ‡ ÙØ§Ø±ØºØ§Ù‹" #: editor/plugins/sprite_frames_editor_plugin.cpp msgid "Change Animation FPS" -msgstr "" +msgstr "تغيير Ù…ÙØ¹Ø¯Ù„ الإطارات ÙÙŠ الثانية FPS للرسوم Ø§Ù„Ù…ØªØØ±ÙƒØ©" #: editor/plugins/sprite_frames_editor_plugin.cpp msgid "(empty)" -msgstr "" +msgstr "(ÙØ§Ø±Øº)" #: editor/plugins/sprite_frames_editor_plugin.cpp -#, fuzzy msgid "Move Frame" -msgstr "وضع Ø§Ù„ØªØØ±ÙŠÙƒ" +msgstr "ØªØØ±ÙŠÙƒ الإطار" #: editor/plugins/sprite_frames_editor_plugin.cpp -#, fuzzy msgid "Animations:" -msgstr "صورة Ù…ØªØØ±ÙƒØ©" +msgstr "الرسومات Ø§Ù„Ù…ØªØØ±ÙƒØ©:" #: editor/plugins/sprite_frames_editor_plugin.cpp -#, fuzzy msgid "New Animation" -msgstr "صورة Ù…ØªØØ±ÙƒØ©" +msgstr "رسومية Ù…ØªØØ±ÙƒØ© جديدة" #: editor/plugins/sprite_frames_editor_plugin.cpp msgid "Speed (FPS):" -msgstr "" +msgstr "السرعة (إطار Ù. Ø«. FPS):" #: editor/plugins/sprite_frames_editor_plugin.cpp msgid "Loop" -msgstr "" +msgstr "ØÙ„قة Loop" #: editor/plugins/sprite_frames_editor_plugin.cpp -#, fuzzy msgid "Animation Frames:" -msgstr "إسم Ø§Ù„ØØ±ÙƒØ©:" +msgstr "إطارات الرسومات Ø§Ù„Ù…ØªØØ±ÙƒØ©:" #: editor/plugins/sprite_frames_editor_plugin.cpp #, fuzzy @@ -8030,15 +7938,15 @@ msgstr "التقط من البيكسل" #: editor/plugins/sprite_frames_editor_plugin.cpp msgid "Add Frames from a Sprite Sheet" -msgstr "" +msgstr "Ø¥Ø¶Ø§ÙØ© الإطارات من ورقة الرسوميات Sprite Sheet" #: editor/plugins/sprite_frames_editor_plugin.cpp msgid "Insert Empty (Before)" -msgstr "" +msgstr "Ø¥Ø¶Ø§ÙØªÙ‡ ÙØ§Ø±ØºØ§Ù‹ (قبل)" #: editor/plugins/sprite_frames_editor_plugin.cpp msgid "Insert Empty (After)" -msgstr "" +msgstr "Ø¥Ø¶Ø§ÙØªÙ‡ ÙØ§Ø±ØºØ§Ù‹ (بَعد)" #: editor/plugins/sprite_frames_editor_plugin.cpp msgid "Move (Before)" @@ -8055,61 +7963,60 @@ msgstr "ØªØØ¯ÙŠØ¯ الوضع" #: editor/plugins/sprite_frames_editor_plugin.cpp msgid "Horizontal:" -msgstr "" +msgstr "عَرضياً:" #: editor/plugins/sprite_frames_editor_plugin.cpp msgid "Vertical:" -msgstr "" +msgstr "شاقولياً:" #: editor/plugins/sprite_frames_editor_plugin.cpp msgid "Select/Clear All Frames" -msgstr "" +msgstr "اختيار / Ù…Ø³Ø Ø¬Ù…ÙŠØ¹ الإطارات" #: editor/plugins/sprite_frames_editor_plugin.cpp msgid "Create Frames from Sprite Sheet" -msgstr "" +msgstr "إنشاء الإطارات من ورقة الرسومية Sprite Sheet" #: editor/plugins/sprite_frames_editor_plugin.cpp msgid "SpriteFrames" -msgstr "" +msgstr "إطارات الرسوميات SpriteFrames" #: editor/plugins/texture_region_editor_plugin.cpp msgid "Set Region Rect" -msgstr "" +msgstr "ØªØØ¯ÙŠØ¯ مستطيل المنطقة" #: editor/plugins/texture_region_editor_plugin.cpp -#, fuzzy msgid "Set Margin" -msgstr "ØØ¯Ø¯ المعامل" +msgstr "ØªØØ¯ÙŠØ¯ الهامش" #: editor/plugins/texture_region_editor_plugin.cpp msgid "Snap Mode:" -msgstr "" +msgstr "وضع Ø§Ù„Ù…ØØ§Ø°Ø§Ø©:" #: editor/plugins/texture_region_editor_plugin.cpp #: scene/resources/visual_shader.cpp msgid "None" -msgstr "" +msgstr "لا شيء" #: editor/plugins/texture_region_editor_plugin.cpp msgid "Pixel Snap" -msgstr "" +msgstr "Ù…ØØ§Ø°Ø§Ø© البكسل" #: editor/plugins/texture_region_editor_plugin.cpp msgid "Grid Snap" -msgstr "" +msgstr "شبكة Ø§Ù„Ù…ØØ§Ø°Ø§Ø©" #: editor/plugins/texture_region_editor_plugin.cpp msgid "Auto Slice" -msgstr "" +msgstr "الاقتطاع التلقائي" #: editor/plugins/texture_region_editor_plugin.cpp msgid "Offset:" -msgstr "" +msgstr "Ø§Ù„Ù…ÙØ¹Ø§Ø¯Ù„:" #: editor/plugins/texture_region_editor_plugin.cpp msgid "Step:" -msgstr "" +msgstr "الخطوة:" #: editor/plugins/texture_region_editor_plugin.cpp msgid "Sep.:" @@ -8117,32 +8024,31 @@ msgstr "" #: editor/plugins/texture_region_editor_plugin.cpp msgid "TextureRegion" -msgstr "" +msgstr "منطقة النقش TextureRegion" #: editor/plugins/theme_editor_plugin.cpp msgid "Add All Items" -msgstr "" +msgstr "Ø¥Ø¶Ø§ÙØ© جميع العناصر" #: editor/plugins/theme_editor_plugin.cpp msgid "Add All" -msgstr "" +msgstr "Ø¥Ø¶Ø§ÙØ© الجميع" #: editor/plugins/theme_editor_plugin.cpp msgid "Remove All Items" -msgstr "" +msgstr "إزالة جميع العناصر" #: editor/plugins/theme_editor_plugin.cpp editor/project_manager.cpp msgid "Remove All" msgstr "Ù…Ø³Ø Ø§Ù„ÙƒÙ„" #: editor/plugins/theme_editor_plugin.cpp -#, fuzzy msgid "Edit Theme" -msgstr "الأعضاء" +msgstr "ØªØØ±ÙŠØ± الموضوع" #: editor/plugins/theme_editor_plugin.cpp msgid "Theme editing menu." -msgstr "" +msgstr "قائمة ØªØØ±ÙŠØ± الموضوع." #: editor/plugins/theme_editor_plugin.cpp msgid "Add Class Items" @@ -8154,15 +8060,15 @@ msgstr "ØØ°Ù بنود من الصنÙ" #: editor/plugins/theme_editor_plugin.cpp msgid "Create Empty Template" -msgstr "" +msgstr "إنشاء قالب ÙØ§Ø±Øº" #: editor/plugins/theme_editor_plugin.cpp msgid "Create Empty Editor Template" -msgstr "" +msgstr "إنشاء قالب Ù…ÙØØ±Ø± ÙØ§Ø±Øº" #: editor/plugins/theme_editor_plugin.cpp msgid "Create From Current Editor Theme" -msgstr "" +msgstr "إنشاء مستمد من موضوع Theme Ø§Ù„Ù…ØØ±Ø± Ø§Ù„ØØ§Ù„ÙŠ" #: editor/plugins/theme_editor_plugin.cpp #, fuzzy @@ -8205,7 +8111,7 @@ msgstr "" #: editor/plugins/theme_editor_plugin.cpp msgid "Submenu" -msgstr "" +msgstr "القائمة Ø§Ù„ÙØ±Ø¹ÙŠØ©" #: editor/plugins/theme_editor_plugin.cpp #, fuzzy @@ -8219,11 +8125,11 @@ msgstr "عنصر" #: editor/plugins/theme_editor_plugin.cpp msgid "Has" -msgstr "" +msgstr "يملك" #: editor/plugins/theme_editor_plugin.cpp msgid "Many" -msgstr "" +msgstr "العديد" #: editor/plugins/theme_editor_plugin.cpp #, fuzzy @@ -8249,7 +8155,7 @@ msgstr "عنصر انتقاء" #: editor/plugins/theme_editor_plugin.cpp msgid "Subtree" -msgstr "" +msgstr "الشجرة Ø§Ù„ÙØ±Ø¹ÙŠØ©" #: editor/plugins/theme_editor_plugin.cpp #, fuzzy @@ -8258,24 +8164,24 @@ msgstr "بكثير، خيارات عديدة،!" #: editor/plugins/theme_editor_plugin.cpp msgid "Data Type:" -msgstr "" +msgstr "نوع البيانات:" #: editor/plugins/theme_editor_plugin.cpp #: editor/plugins/tile_set_editor_plugin.cpp msgid "Icon" -msgstr "" +msgstr "الأيقونة" #: editor/plugins/theme_editor_plugin.cpp editor/rename_dialog.cpp msgid "Style" -msgstr "" +msgstr "الأسلوب" #: editor/plugins/theme_editor_plugin.cpp msgid "Font" -msgstr "" +msgstr "الخط" #: editor/plugins/theme_editor_plugin.cpp msgid "Color" -msgstr "" +msgstr "اللون" #: editor/plugins/theme_editor_plugin.cpp #, fuzzy @@ -8284,7 +8190,7 @@ msgstr "Ø¥ÙØªØ ملÙ" #: editor/plugins/tile_map_editor_plugin.cpp msgid "Erase Selection" -msgstr "" +msgstr "إزالة عملية الاختيار" #: editor/plugins/tile_map_editor_plugin.cpp #, fuzzy @@ -8299,23 +8205,23 @@ msgstr "Ù†ØµÙ Ø§Ù„Ù…ÙØØ¯Ø¯" #: editor/plugins/tile_map_editor_plugin.cpp msgid "Paint TileMap" -msgstr "" +msgstr "طلاء خريطة البلاط TileMap" #: editor/plugins/tile_map_editor_plugin.cpp msgid "Line Draw" -msgstr "" +msgstr "رسم الخط" #: editor/plugins/tile_map_editor_plugin.cpp msgid "Rectangle Paint" -msgstr "" +msgstr "مستطيل الطلاء" #: editor/plugins/tile_map_editor_plugin.cpp msgid "Bucket Fill" -msgstr "" +msgstr "وعاء التعبئة" #: editor/plugins/tile_map_editor_plugin.cpp msgid "Erase TileMap" -msgstr "" +msgstr "Ù…Ø³Ø Ø®Ø±ÙŠØ·Ø© البلاط TileMap" #: editor/plugins/tile_map_editor_plugin.cpp #, fuzzy @@ -8324,11 +8230,11 @@ msgstr "جد" #: editor/plugins/tile_map_editor_plugin.cpp msgid "Transpose" -msgstr "" +msgstr "المصÙÙˆÙØ© المنقولة Transpose" #: editor/plugins/tile_map_editor_plugin.cpp msgid "Disable Autotile" -msgstr "" +msgstr "تعطيل البلاط التلقائي Autotile" #: editor/plugins/tile_map_editor_plugin.cpp #, fuzzy @@ -8343,20 +8249,23 @@ msgstr "Ùلتر Ø§Ù„Ù…Ù„ÙØ§Øª..." #: editor/plugins/tile_map_editor_plugin.cpp msgid "Give a TileSet resource to this TileMap to use its tiles." msgstr "" +"Ù…Ù†Ø Ù…ÙˆØ±Ø¯ Ù…ÙØØ¯Ø¯ البلاطات TileSet لخريطة البلاط TileMap هذه كي تستخدم بلاطاتها." #: editor/plugins/tile_map_editor_plugin.cpp msgid "Paint Tile" -msgstr "" +msgstr "طلاء البلاط" #: editor/plugins/tile_map_editor_plugin.cpp msgid "" "Shift+LMB: Line Draw\n" "Shift+Ctrl+LMB: Rectangle Paint" msgstr "" +"Shift+ الزر الأيسر Ù„Ù„ÙØ£Ø±Ø©: الرسم خطياً\n" +"Shift+Ctrl+الزر الأيسر Ù„Ù„ÙØ£Ø±Ø©: طلاء المستطيلات" #: editor/plugins/tile_map_editor_plugin.cpp msgid "Pick Tile" -msgstr "" +msgstr "اختيار البلاط" #: editor/plugins/tile_map_editor_plugin.cpp #, fuzzy @@ -8370,11 +8279,11 @@ msgstr "وضع التدوير" #: editor/plugins/tile_map_editor_plugin.cpp msgid "Flip Horizontally" -msgstr "" +msgstr "القلب Ø£Ùقياً" #: editor/plugins/tile_map_editor_plugin.cpp msgid "Flip Vertically" -msgstr "" +msgstr "القلب شاقولياً" #: editor/plugins/tile_map_editor_plugin.cpp #, fuzzy @@ -8383,7 +8292,7 @@ msgstr "تØÙˆÙŠÙ„ تغيير Ø§Ù„ØªØØ±ÙŠÙƒ" #: editor/plugins/tile_set_editor_plugin.cpp msgid "Add Texture(s) to TileSet." -msgstr "" +msgstr "Ø¥Ø¶Ø§ÙØ© نقش(نقوش) إلى Ù…ÙØØ¯Ø¯ البلاط TileSet." #: editor/plugins/tile_set_editor_plugin.cpp #, fuzzy @@ -8392,15 +8301,15 @@ msgstr "Ù…Ø³Ø Ø§Ù„Ù…Ø¯Ø®Ù„Ø© Ø§Ù„ØØ§Ù„ية" #: editor/plugins/tile_set_editor_plugin.cpp msgid "Create from Scene" -msgstr "" +msgstr "إنشاء من المشهد" #: editor/plugins/tile_set_editor_plugin.cpp msgid "Merge from Scene" -msgstr "" +msgstr "دمج من المشهد" #: editor/plugins/tile_set_editor_plugin.cpp msgid "New Single Tile" -msgstr "" +msgstr "بلاطة Ù…ÙÙØ±Ø¯Ø© جديدة" #: editor/plugins/tile_set_editor_plugin.cpp #, fuzzy @@ -8409,15 +8318,15 @@ msgstr "إظهار Ø§Ù„Ù…Ù„ÙØ§Øª" #: editor/plugins/tile_set_editor_plugin.cpp msgid "New Atlas" -msgstr "" +msgstr "أطلس جديد" #: editor/plugins/tile_set_editor_plugin.cpp msgid "Next Coordinate" -msgstr "" +msgstr "Ø§Ù„Ø¥ØØ¯Ø§Ø«Ø§Øª التالية" #: editor/plugins/tile_set_editor_plugin.cpp msgid "Select the next shape, subtile, or Tile." -msgstr "" +msgstr "اختر الشكل أو البلاط Ø§Ù„ÙØ±Ø¹ÙŠ Ø£Ùˆ البلاط التالي." #: editor/plugins/tile_set_editor_plugin.cpp #, fuzzy @@ -8426,86 +8335,71 @@ msgstr "التبويب السابق" #: editor/plugins/tile_set_editor_plugin.cpp msgid "Select the previous shape, subtile, or Tile." -msgstr "" +msgstr "اختر الشكل أو البلاط Ø§Ù„ÙØ±Ø¹ÙŠ Ø£Ùˆ البلاط، السابق." #: editor/plugins/tile_set_editor_plugin.cpp -#, fuzzy msgid "Region" -msgstr "وضع التدوير" +msgstr "الإقليم" #: editor/plugins/tile_set_editor_plugin.cpp -#, fuzzy msgid "Collision" -msgstr "وضعية Ø§Ù„Ø£Ø³ØªÙŠÙØ§Ø¡" +msgstr "التصادم" #: editor/plugins/tile_set_editor_plugin.cpp -#, fuzzy msgid "Occlusion" -msgstr "تعديل البولي" +msgstr "الإطباق Occlusion" #: editor/plugins/tile_set_editor_plugin.cpp -#, fuzzy msgid "Navigation" -msgstr "أنشئ ميش التنقل" +msgstr "Ø§Ù„ØªØµÙØ" #: editor/plugins/tile_set_editor_plugin.cpp -#, fuzzy msgid "Bitmask" -msgstr "وضع التدوير" +msgstr "قناع Ø§Ù„Ø¨ÙØª Bitmask" #: editor/plugins/tile_set_editor_plugin.cpp -#, fuzzy msgid "Priority" -msgstr "تصدير المشروع" +msgstr "Ø§Ù„ØªÙØ§Ø¶Ù„ Priority" #: editor/plugins/tile_set_editor_plugin.cpp -#, fuzzy msgid "Z Index" -msgstr "وضع Ø§Ù„Ø³ØØ¨" +msgstr "تراتبية المØÙˆØ± Z" #: editor/plugins/tile_set_editor_plugin.cpp -#, fuzzy msgid "Region Mode" -msgstr "وضع التدوير" +msgstr "وضع الأقليم Region" #: editor/plugins/tile_set_editor_plugin.cpp -#, fuzzy msgid "Collision Mode" -msgstr "وضعية Ø§Ù„Ø£Ø³ØªÙŠÙØ§Ø¡" +msgstr "وضع التصادم" #: editor/plugins/tile_set_editor_plugin.cpp -#, fuzzy msgid "Occlusion Mode" -msgstr "تعديل البولي" +msgstr "وضع الإطباق Occlusion" #: editor/plugins/tile_set_editor_plugin.cpp -#, fuzzy msgid "Navigation Mode" -msgstr "أنشئ ميش التنقل" +msgstr "وضع Ø§Ù„ØªØµÙØ" #: editor/plugins/tile_set_editor_plugin.cpp -#, fuzzy msgid "Bitmask Mode" -msgstr "وضع التدوير" +msgstr "وضع Bitmask" #: editor/plugins/tile_set_editor_plugin.cpp -#, fuzzy msgid "Priority Mode" -msgstr "تصدير المشروع" +msgstr "وضع Ø§Ù„ØªÙØ§Ø¶Ù„ Priority" #: editor/plugins/tile_set_editor_plugin.cpp -#, fuzzy msgid "Icon Mode" -msgstr "وضع Ø§Ù„Ø³ØØ¨" +msgstr "وضع الأيقونة" #: editor/plugins/tile_set_editor_plugin.cpp -#, fuzzy msgid "Z Index Mode" -msgstr "وضع Ø§Ù„Ø³ØØ¨" +msgstr "وضع Z Index" #: editor/plugins/tile_set_editor_plugin.cpp msgid "Copy bitmask." -msgstr "" +msgstr "نسخ bitmask." #: editor/plugins/tile_set_editor_plugin.cpp #, fuzzy @@ -8523,84 +8417,86 @@ msgid "Create a new rectangle." msgstr "إنشاء %s جديد" #: editor/plugins/tile_set_editor_plugin.cpp -#, fuzzy msgid "Create a new polygon." -msgstr "أنشئ شكل جديد من لا شئ." +msgstr "إنشاء Ù…ÙØ¶Ù„ع جديد." #: editor/plugins/tile_set_editor_plugin.cpp msgid "Keep polygon inside region Rect." -msgstr "" +msgstr "إبقاء Ø§Ù„Ù…ÙØ¶Ù„ع داخل مستطيل المنطقة." #: editor/plugins/tile_set_editor_plugin.cpp msgid "Enable snap and show grid (configurable via the Inspector)." -msgstr "" +msgstr "تمكين Ø§Ù„Ù…ØØ§Ø°Ø§Ø© وإظهار الشبكة (التهيئة عبر Ø§Ù„Ù…ÙØªÙØØµ)." #: editor/plugins/tile_set_editor_plugin.cpp msgid "Display Tile Names (Hold Alt Key)" -msgstr "" +msgstr "تعطيل أسماء البلاطات (اضغط على زر Alt)" #: editor/plugins/tile_set_editor_plugin.cpp msgid "" "Add or select a texture on the left panel to edit the tiles bound to it." -msgstr "" +msgstr "أض٠أو اختر نقشاً من Ø§Ù„Ù„ÙˆØØ© على اليسار Ù„ØªØØ±ÙŠØ± البلاطات المقترنة بها." #: editor/plugins/tile_set_editor_plugin.cpp -#, fuzzy msgid "Remove selected texture? This will remove all tiles which use it." -msgstr "Ù…Ø³Ø Ø§Ù„Ù…Ø¯Ø®Ù„Ø© Ø§Ù„ØØ§Ù„ية" +msgstr "Ù…Ø³Ø Ø§Ù„Ù†Ù‚Ø´ Ø§Ù„Ù…ÙØ®ØªØ§Ø±ØŸ هذا سيزيل جميع البلاطات التي تستخدمه." #: editor/plugins/tile_set_editor_plugin.cpp msgid "You haven't selected a texture to remove." -msgstr "" +msgstr "لم تختر نقشاً لإزالته." #: editor/plugins/tile_set_editor_plugin.cpp msgid "Create from scene? This will overwrite all current tiles." msgstr "" +"إنشاء اعتماداً على مشهد؟ هذا سيكتب متجاوزاً overwrite جميع البلاطات Ø§Ù„ØØ§Ù„ية." #: editor/plugins/tile_set_editor_plugin.cpp msgid "Merge from scene?" -msgstr "" +msgstr "دمج من مشهد؟" #: editor/plugins/tile_set_editor_plugin.cpp -#, fuzzy msgid "Remove Texture" -msgstr "Ù…Ø³Ø Ø§Ù„Ù‚Ø§Ù„Ø¨" +msgstr "إزالة النقش" #: editor/plugins/tile_set_editor_plugin.cpp msgid "%s file(s) were not added because was already on the list." -msgstr "" +msgstr "%s الملÙ(ات) لم تض٠بسبب كونها موجودة Ø³Ù„ÙØ§Ù‹ بالقائمة." #: editor/plugins/tile_set_editor_plugin.cpp msgid "" "Drag handles to edit Rect.\n" "Click on another Tile to edit it." msgstr "" +"Ø§Ø³ØØ¨ المقابض Ù„ØªØØ±ÙŠØ± المستطيل.\n" +"اضغط على بلاطة أخرى Ù„ØªØØ±ÙŠØ±Ù‡Ø§." #: editor/plugins/tile_set_editor_plugin.cpp -#, fuzzy msgid "Delete selected Rect." -msgstr "Ø¥Ù…Ø³Ø Ø§Ù„Ù…Ù„ÙØ§Øª Ø§Ù„Ù…ØØ¯Ø¯Ø©ØŸ" +msgstr "Ù…Ø³Ø Ø§Ù„Ù…Ø³ØªØ·ÙŠÙ„Ø§Øª Ø§Ù„Ù…ØØ¯Ø¯Ø©." #: editor/plugins/tile_set_editor_plugin.cpp -#, fuzzy msgid "" "Select current edited sub-tile.\n" "Click on another Tile to edit it." -msgstr "ØÙظ العنوان Ø§Ù„ÙØ±Ø¹ÙŠ Ø§Ù„Ø°ÙŠ يتم تعديله ØØ§Ù„يا." +msgstr "" +"اختر البلاطات Ø§Ù„ÙØ±Ø¹ÙŠØ© Ø§Ù„Ù…ÙØØ¯Ø¯Ø© ØØ¯ÙŠØ«Ø§Ù‹.\n" +"اضغط على بلاطة أخرى Ù„ØªØØ±ÙŠØ±Ù‡Ø§." #: editor/plugins/tile_set_editor_plugin.cpp -#, fuzzy msgid "Delete polygon." -msgstr "Ù…Ø³Ø Ø§Ù„Ù†Ù‚Ø§Ø·" +msgstr "Ù…Ø³Ø Ø§Ù„Ù…ÙØ¶Ù„ع." #: editor/plugins/tile_set_editor_plugin.cpp -#, fuzzy msgid "" "LMB: Set bit on.\n" "RMB: Set bit off.\n" "Shift+LMB: Set wildcard bit.\n" "Click on another Tile to edit it." -msgstr "ØÙظ العنوان Ø§Ù„ÙØ±Ø¹ÙŠ Ø§Ù„Ø°ÙŠ يتم تعديله ØØ§Ù„يا." +msgstr "" +"الزر الأيسر Ù„Ù„ÙØ£Ø±Ø©: تشغيل bit.\n" +"الزر الأيمن Ù„Ù„ÙØ£Ø±Ø©: Ø¥Ø·ÙØ§Ø¡ bit.\n" +"Shift+الزر الأيسر Ù„Ù„ÙØ£Ø±Ø©: ØªØØ¯ÙŠØ¯ wildcard bit.\n" +"اضغط على بلاطة أخرى Ù„ØªØØ±ÙŠØ±Ù‡Ø§." #: editor/plugins/tile_set_editor_plugin.cpp msgid "" @@ -8608,210 +8504,189 @@ msgid "" "bindings.\n" "Click on another Tile to edit it." msgstr "" +"اختر بلاطة ÙØ±Ø¹ÙŠØ© لاستخدامها كأيقونة، ØÙŠØ« سيتم استخدامها ÙÙŠ قرن البلاط " +"التلقائي غير الصالØ.\n" +"اضغط على بلاطة أخرى Ù„ØªØØ±ÙŠØ±Ù‡Ø§." #: editor/plugins/tile_set_editor_plugin.cpp msgid "" "Select sub-tile to change its priority.\n" "Click on another Tile to edit it." msgstr "" +"اختر بلاطة ÙØ±Ø¹ÙŠØ© لتغير Ø§Ù„ØªÙØ§Ø¶Ù„ الخاص بها.\n" +"اختر بلاطة أخرى Ù„ØªØØ±ÙŠØ±Ù‡Ø§." #: editor/plugins/tile_set_editor_plugin.cpp -#, fuzzy msgid "" "Select sub-tile to change its z index.\n" "Click on another Tile to edit it." -msgstr "ØÙظ العنوان Ø§Ù„ÙØ±Ø¹ÙŠ Ø§Ù„Ø°ÙŠ يتم تعديله ØØ§Ù„يا." +msgstr "" +"اختر بلاطة ÙØ±Ø¹ÙŠØ© لتغير ترتيبها على المØÙˆØ± Z.\n" +"اضغط على بلاطة أخرى Ù„ØªØØ±ÙŠØ±Ù‡Ø§." #: editor/plugins/tile_set_editor_plugin.cpp msgid "Set Tile Region" -msgstr "" +msgstr "ØªØØ¯ÙŠØ¯ منطقة البلاط" #: editor/plugins/tile_set_editor_plugin.cpp -#, fuzzy msgid "Create Tile" -msgstr "أنشئ مجلد" +msgstr "إنشاء بلاط" #: editor/plugins/tile_set_editor_plugin.cpp msgid "Set Tile Icon" -msgstr "" +msgstr "ØªØØ¯ÙŠØ¯ أيقونة البلاط" #: editor/plugins/tile_set_editor_plugin.cpp -#, fuzzy msgid "Edit Tile Bitmask" -msgstr "تعديل المصاÙÙŠ" +msgstr "ØªØØ±ÙŠØ± قناع Ø§Ù„Ø¨ÙØª Bitmask البلاط" #: editor/plugins/tile_set_editor_plugin.cpp -#, fuzzy msgid "Edit Collision Polygon" -msgstr "تعديل الشكل الموجود Ø¨Ø§Ù„ÙØ¹Ù„:" +msgstr "تعديل Ù…ÙØ¶Ù„ع التصادم" #: editor/plugins/tile_set_editor_plugin.cpp -#, fuzzy msgid "Edit Occlusion Polygon" -msgstr "تعديل البولي" +msgstr "ØªØØ±ÙŠØ± Ù…ÙØ¶Ù„ع الإطباق" #: editor/plugins/tile_set_editor_plugin.cpp -#, fuzzy msgid "Edit Navigation Polygon" -msgstr "إنشاء Ù…ÙØ¶Ù„ع التنقل" +msgstr "ØªØØ±ÙŠØ± Ù…ÙØ¶Ù„ع Ø§Ù„ØªØµÙØ" #: editor/plugins/tile_set_editor_plugin.cpp -#, fuzzy msgid "Paste Tile Bitmask" -msgstr "لصق Ø§Ù„ØØ±ÙƒØ©" +msgstr "لصق قناع Ø¨ÙØª Bitmask البلاط" #: editor/plugins/tile_set_editor_plugin.cpp msgid "Clear Tile Bitmask" -msgstr "" +msgstr "Ù…Ø³Ø Ù‚Ù†Ø§Ø¹ Ø¨ÙØª Bitmask البلاط" #: editor/plugins/tile_set_editor_plugin.cpp msgid "Make Polygon Concave" -msgstr "" +msgstr "جعل Ø§Ù„Ù…ÙØ¶Ù„ع Ù…Ùقعراً" #: editor/plugins/tile_set_editor_plugin.cpp -#, fuzzy msgid "Make Polygon Convex" -msgstr "إنشاء بولي" +msgstr "جعل Ø§Ù„Ù…ÙØ¶Ù„ع Ù…ÙØØ¯Ù‘Ø¨Ø§Ù‹" #: editor/plugins/tile_set_editor_plugin.cpp -#, fuzzy msgid "Remove Tile" -msgstr "Ù…Ø³Ø Ø§Ù„Ù‚Ø§Ù„Ø¨" +msgstr "إزالة البلاط" #: editor/plugins/tile_set_editor_plugin.cpp -#, fuzzy msgid "Remove Collision Polygon" -msgstr "Ù…Ø³Ø Ø§Ù„Ø¨ÙˆÙ„ÙŠ والنقطة" +msgstr "إزالة Ù…ÙØ¶Ù„ع التصادم" #: editor/plugins/tile_set_editor_plugin.cpp -#, fuzzy msgid "Remove Occlusion Polygon" -msgstr "أنشئ شكل Ù…ÙØ·Ø¨Ù‚" +msgstr "إزالة Ù…ÙØ¶Ù„ع الإطباق" #: editor/plugins/tile_set_editor_plugin.cpp -#, fuzzy msgid "Remove Navigation Polygon" -msgstr "إنشاء Ù…ÙØ¶Ù„ع التنقل" +msgstr "إزالة Ù…ÙØ¶Ù„ع التنقل" #: editor/plugins/tile_set_editor_plugin.cpp -#, fuzzy msgid "Edit Tile Priority" -msgstr "تعديل المصاÙÙŠ" +msgstr "تعديل ØªÙØ§Ø¶Ù„ البلاط" #: editor/plugins/tile_set_editor_plugin.cpp msgid "Edit Tile Z Index" -msgstr "" +msgstr "تعديل تراتبية البلاط على المØÙˆØ± Z" #: editor/plugins/tile_set_editor_plugin.cpp -#, fuzzy msgid "Make Convex" -msgstr "إنشاء بولي" +msgstr "جعله Ù…ÙØØ¯Ø¨Ø§Ù‹" #: editor/plugins/tile_set_editor_plugin.cpp -#, fuzzy msgid "Make Concave" -msgstr "أنشئ عظام" +msgstr "جعله Ù…Ùقعراً" #: editor/plugins/tile_set_editor_plugin.cpp -#, fuzzy msgid "Create Collision Polygon" -msgstr "إنشاء Ù…ÙØ¶Ù„ع التنقل" +msgstr "إنشاء Ù…ÙØ¶Ù„ع التصادم" #: editor/plugins/tile_set_editor_plugin.cpp -#, fuzzy msgid "Create Occlusion Polygon" -msgstr "أنشئ شكل Ù…ÙØ·Ø¨Ù‚" +msgstr "إنشاء Ù…ÙØ¶Ù„ع الإطباق Occlusion" #: editor/plugins/tile_set_editor_plugin.cpp -#, fuzzy msgid "This property can't be changed." -msgstr "هذه العملية لا يمكن الإكتمال من غير مشهد." +msgstr "لا يمكن تعديل هذه الخاصية." #: editor/plugins/tile_set_editor_plugin.cpp -#, fuzzy msgid "TileSet" -msgstr "مجموعة البلاط" +msgstr "Ù…ÙØØ¯Ø¯ البلاط" #: editor/plugins/version_control_editor_plugin.cpp msgid "No VCS addons are available." -msgstr "" +msgstr "لا يوجد Ø¥Ø¶Ø§ÙØ§Øª VCS Ù…ØªÙˆØ§ÙØ±Ø©." #: editor/plugins/version_control_editor_plugin.cpp msgid "Error" -msgstr "" +msgstr "خطأ" #: editor/plugins/version_control_editor_plugin.cpp -#, fuzzy msgid "No commit message was provided" -msgstr "لا أسم Ù…Ùقدم" +msgstr "لم يتم تقديم رسالة ارتكاب commit" #: editor/plugins/version_control_editor_plugin.cpp msgid "No files added to stage" -msgstr "" +msgstr "لم يتم Ø¥Ø¶Ø§ÙØ© Ù…Ù„ÙØ§Øª إلى المرØÙ„Ø©" #: editor/plugins/version_control_editor_plugin.cpp -#, fuzzy msgid "Commit" -msgstr "المجتمع" +msgstr "ارتكاب" #: editor/plugins/version_control_editor_plugin.cpp msgid "VCS Addon is not initialized" -msgstr "" +msgstr "لم يتم تهيئة Ø¥Ø¶Ø§ÙØ§Øª VCS" #: editor/plugins/version_control_editor_plugin.cpp msgid "Version Control System" -msgstr "" +msgstr "نظام التØÙƒÙ… بالإصدار VCS" #: editor/plugins/version_control_editor_plugin.cpp msgid "Initialize" -msgstr "" +msgstr "الشروع" #: editor/plugins/version_control_editor_plugin.cpp msgid "Staging area" -msgstr "" +msgstr "ØÙŠØ² التدريج" #: editor/plugins/version_control_editor_plugin.cpp -#, fuzzy msgid "Detect new changes" -msgstr "إنشاء %s جديد" +msgstr "الكش٠عن التغيرات الجديدة" #: editor/plugins/version_control_editor_plugin.cpp -#, fuzzy msgid "Changes" -msgstr "تغير" +msgstr "التغيرات" #: editor/plugins/version_control_editor_plugin.cpp msgid "Modified" -msgstr "" +msgstr "Ù…ÙØ¹Ø¯Ù‘Ù„" #: editor/plugins/version_control_editor_plugin.cpp -#, fuzzy msgid "Renamed" -msgstr "إعادة التسمية" +msgstr "Ù…ÙØ¹Ø§Ø¯ تسميته" #: editor/plugins/version_control_editor_plugin.cpp -#, fuzzy msgid "Deleted" -msgstr "مسØ" +msgstr "Ù…ÙØ²Ø§Ù„" #: editor/plugins/version_control_editor_plugin.cpp -#, fuzzy msgid "Typechange" -msgstr "تغير" +msgstr "تعديل النوع" #: editor/plugins/version_control_editor_plugin.cpp -#, fuzzy msgid "Stage Selected" -msgstr "تكبير Ø§Ù„Ù…ØØ¯Ø¯" +msgstr "ØÙددت المرØÙ„Ø©" #: editor/plugins/version_control_editor_plugin.cpp -#, fuzzy msgid "Stage All" -msgstr "اØÙظ الكل" +msgstr "Ù…ÙØ¬Ù…Ù„ المراØÙ„" #: editor/plugins/version_control_editor_plugin.cpp msgid "Add a commit message" -msgstr "" +msgstr "Ø¥Ø¶Ø§ÙØ© رسالة إجراء" #: editor/plugins/version_control_editor_plugin.cpp #, fuzzy @@ -8821,11 +8696,11 @@ msgstr "مزامنة تغييرات الكود" #: editor/plugins/version_control_editor_plugin.cpp #: modules/gdnative/gdnative_library_singleton_editor.cpp msgid "Status" -msgstr "" +msgstr "Ø§Ù„ØØ§Ù„Ø©" #: editor/plugins/version_control_editor_plugin.cpp msgid "View file diffs before committing them to the latest version" -msgstr "" +msgstr "إظهار آخر تعديلات المل٠قبل قبولهم ÙÙŠ آخر نسخة." #: editor/plugins/version_control_editor_plugin.cpp msgid "No file diff is active" @@ -8837,172 +8712,152 @@ msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp msgid "(GLES3 only)" -msgstr "" +msgstr "(GLES3 Ùقط)" #: editor/plugins/visual_shader_editor_plugin.cpp -#, fuzzy msgid "Add Output" -msgstr "أض٠مدخله" +msgstr "Ø¥Ø¶Ø§ÙØ© Ù…ÙØ®Ø±Ø¬" #: editor/plugins/visual_shader_editor_plugin.cpp -#, fuzzy msgid "Scalar" -msgstr "تكبير/تصغير:" +msgstr "كمية قياسية Scalar" #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Vector" -msgstr "متجه" +msgstr "Ù…ÙØªØ¬Ù‡" #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Boolean" -msgstr "" +msgstr "منطق Boolean" #: editor/plugins/visual_shader_editor_plugin.cpp -#, fuzzy msgid "Sampler" msgstr "عينات (صوتية)" #: editor/plugins/visual_shader_editor_plugin.cpp -#, fuzzy msgid "Add input port" -msgstr "أض٠مدخله" +msgstr "أض٠بوابة Ø§Ù„Ù…ÙØ¯Ø®Ù„ات" #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Add output port" -msgstr "" +msgstr "Ø£Ø¶Ù Ù…Ù†ÙØ° Ø§Ù„Ù…ÙØ®Ø±Ø¬Ø§Øª" #: editor/plugins/visual_shader_editor_plugin.cpp -#, fuzzy msgid "Change input port type" -msgstr "غير النوع Ø§Ù„Ø¥ÙØªØ±Ø§Ø¶ÙŠ" +msgstr "غيّر نوع Ù…Ù†ÙØ° Ø§Ù„Ù…ÙØ¯Ø®Ù„ات" #: editor/plugins/visual_shader_editor_plugin.cpp -#, fuzzy msgid "Change output port type" -msgstr "غير النوع Ø§Ù„Ø¥ÙØªØ±Ø§Ø¶ÙŠ" +msgstr "غيّر نوع Ù…Ù†ÙØ° Ø§Ù„Ù…ÙØ®Ø±Ø¬Ø§Øª" #: editor/plugins/visual_shader_editor_plugin.cpp -#, fuzzy msgid "Change input port name" -msgstr "تغيير إسم Ø§Ù„ØØ±ÙƒØ©:" +msgstr "غيّر اسم Ù…Ù†ÙØ° Ø§Ù„Ù…ÙØ¯Ø®Ù„ات" #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Change output port name" -msgstr "" +msgstr "غيّر اسم Ù…Ù†ÙØ° Ø§Ù„Ù…ÙØ®Ø±Ø¬Ø§Øª" #: editor/plugins/visual_shader_editor_plugin.cpp -#, fuzzy msgid "Remove input port" -msgstr "Ù…Ø³Ø Ø§Ù„Ù†Ù‚Ø·Ø©" +msgstr "إزالة Ù…Ù†ÙØ° Ø§Ù„Ù…ÙØ¯Ø®Ù„ات" #: editor/plugins/visual_shader_editor_plugin.cpp -#, fuzzy msgid "Remove output port" -msgstr "Ù…Ø³Ø Ø§Ù„Ù†Ù‚Ø·Ø©" +msgstr "إزالة Ù…Ù†ÙØ° Ø§Ù„Ù…ÙØ®Ø±Ø¬Ø§Øª" #: editor/plugins/visual_shader_editor_plugin.cpp -#, fuzzy msgid "Set expression" -msgstr "النسخة Ø§Ù„ØØ§Ù„ية:" +msgstr "ØªØØ¯ÙŠØ¯ التعبير" #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Resize VisualShader node" -msgstr "" +msgstr "تغيير ØØ¬Ù… عÙقدة VisualShader (التظليل البصري)" #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Set Uniform Name" -msgstr "" +msgstr "ØªØØ¯ÙŠØ¯ اسم Ù…ÙˆØØ¯" #: editor/plugins/visual_shader_editor_plugin.cpp -#, fuzzy msgid "Set Input Default Port" -msgstr "ØØ¯Ø¯ ÙƒØ¥ÙØªØ±Ø§Ø¶ÙŠ Ù…Ù† أجل '%s'" +msgstr "ØªØØ¯ÙŠØ¯ Ù…Ù†ÙØ° المدخلات Ø§Ù„Ø§ÙØªØ±Ø§Ø¶ÙŠ" #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Add Node to Visual Shader" -msgstr "" +msgstr "Ø¥Ø¶Ø§ÙØ© عÙقدة للتظليل البصري Visual Shader" #: editor/plugins/visual_shader_editor_plugin.cpp -#, fuzzy msgid "Duplicate Nodes" -msgstr "Ù…ÙØ§ØªÙŠØ نسخ Ø§Ù„ØªØØ±ÙŠÙƒ" +msgstr "Ù…Ø¶Ø§Ø¹ÙØ© العÙقد" #: editor/plugins/visual_shader_editor_plugin.cpp #: modules/visual_script/visual_script_editor.cpp msgid "Paste Nodes" -msgstr "" +msgstr "لصق العÙقد" #: editor/plugins/visual_shader_editor_plugin.cpp -#, fuzzy msgid "Delete Nodes" -msgstr "إنشاء عقدة" +msgstr "ØØ°Ù العÙقد" #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Visual Shader Input Type Changed" -msgstr "" +msgstr "تعدل نوع Ù…ÙØ¯Ø®Ù„ات التظليل البصري Visual Shader" #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Vertex" -msgstr "" +msgstr "رأس" #: editor/plugins/visual_shader_editor_plugin.cpp -#, fuzzy msgid "Fragment" -msgstr "البراهين:" +msgstr "شظايا" #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Light" -msgstr "" +msgstr "ضوء" #: editor/plugins/visual_shader_editor_plugin.cpp -#, fuzzy msgid "Show resulted shader code." -msgstr "إنشاء عقدة" +msgstr "إظهار نص التظليل البرمجي الناتج." #: editor/plugins/visual_shader_editor_plugin.cpp -#, fuzzy msgid "Create Shader Node" -msgstr "إنشاء عقدة" +msgstr "إنشاء عÙقدة تظليل" #: editor/plugins/visual_shader_editor_plugin.cpp -#, fuzzy msgid "Color function." -msgstr "Ù…Ø³Ø Ø§Ù„Ù…Ù‡Ù…Ø©" +msgstr "Ø§Ù„ÙˆØ¸ÙŠÙØ© البرمجية للون." #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Color operator." -msgstr "" +msgstr "Ù…ÙØ´ØºÙ‘Ù„ اللون." #: editor/plugins/visual_shader_editor_plugin.cpp -#, fuzzy msgid "Grayscale function." -msgstr "إصنع دالة" +msgstr "ÙˆØ¸ÙŠÙØ© التدرج الرمادي." #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Converts HSV vector to RGB equivalent." -msgstr "" +msgstr "تØÙˆÙŠÙ„ Ù…ÙØªØ¬Ù‡ HSV إلى معادله من RGB." #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Converts RGB vector to HSV equivalent." -msgstr "" +msgstr "تØÙˆÙŠÙ„ Ù…ÙØªØ¬Ù‡ RGB إلى معادله من HSV." #: editor/plugins/visual_shader_editor_plugin.cpp -#, fuzzy msgid "Sepia function." -msgstr "إصنع دالة" +msgstr "ÙˆØ¸ÙŠÙØ© البÙني الداكن." #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Burn operator." -msgstr "" +msgstr "Ù…ÙØ´ØºÙ„ Ø§Ù„ØØ±Ù‚." #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Darken operator." -msgstr "" +msgstr "Ù…ÙØ´ØºÙ„ التعتيم." #: editor/plugins/visual_shader_editor_plugin.cpp -#, fuzzy msgid "Difference operator." -msgstr "Ø§Ù„Ø¥Ø®ØªÙ„Ø§ÙØ§Øª Ùقط" +msgstr "Ù…ÙØ´ØºÙ„ Ø§Ù„ÙØ§Ø±Ù‚." #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Dodge operator." @@ -9010,323 +8865,330 @@ msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp msgid "HardLight operator." -msgstr "" +msgstr "Ù…ÙØ´ØºÙ„ الضوء الساطع." #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Lighten operator." -msgstr "" +msgstr "Ù…ÙØ´ØºÙ„ Ø§Ù„ØªÙØªÙŠØ." #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Overlay operator." -msgstr "" +msgstr "Ù…ÙØ´ØºÙ„ التراكم." #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Screen operator." -msgstr "" +msgstr "Ù…ÙØ´ØºÙ„ الشاشة." #: editor/plugins/visual_shader_editor_plugin.cpp msgid "SoftLight operator." -msgstr "" +msgstr "Ù…ÙØ´ØºÙ„ الضوء Ø§Ù„Ø®Ø§ÙØª." #: editor/plugins/visual_shader_editor_plugin.cpp -#, fuzzy msgid "Color constant." -msgstr "ثابت" +msgstr "ثابت اللون." #: editor/plugins/visual_shader_editor_plugin.cpp -#, fuzzy msgid "Color uniform." -msgstr "تØÙˆÙŠÙ„ تغيير Ø§Ù„ØªØØ±ÙŠÙƒ" +msgstr "اللون المÙÙˆØØ¯." #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Returns the boolean result of the %s comparison between two parameters." -msgstr "" +msgstr "ÙŠÙØ±Ø¬Ø¹ المنطق الناتج عن مقارنة %s بين اثنين من Ø§Ù„Ù…ÙØ¹Ø§Ù…لات." #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Equal (==)" -msgstr "" +msgstr "ÙŠÙØ¹Ø§Ø¯Ù„ (==)" #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Greater Than (>)" -msgstr "" +msgstr "أكبر من (>)" #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Greater Than or Equal (>=)" -msgstr "" +msgstr "أكبر أو يساوي (>=)" #: editor/plugins/visual_shader_editor_plugin.cpp msgid "" "Returns an associated vector if the provided scalars are equal, greater or " "less." msgstr "" +"ÙŠÙØ±Ø¬Ø¹ Ø§Ù„Ù…ÙØªØ¬Ù‡ المقرون إذا كانت القيمة القياسية المÙقدمة مساوية، أكبر أو أصغر." #: editor/plugins/visual_shader_editor_plugin.cpp msgid "" "Returns the boolean result of the comparison between INF and a scalar " "parameter." msgstr "" +"ÙŠÙØ±Ø¬Ø¹ قيمة المنطق (صØ/خطأ) من المقارنة بين INF ومَعلم الكمية القياسية scalar " +"parameter." #: editor/plugins/visual_shader_editor_plugin.cpp msgid "" "Returns the boolean result of the comparison between NaN and a scalar " "parameter." msgstr "" +"ÙŠÙØ±Ø¬Ø¹ منطق المقارنة (صØÙŠØ/خاطئ) بين NaN (ليس عدداً) Ùˆ مَعلم الكمية القياسية " +"scalar parameter." #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Less Than (<)" -msgstr "" +msgstr "أصغر من (<)" #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Less Than or Equal (<=)" -msgstr "" +msgstr "أصغر أو يساوي (<=)" #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Not Equal (!=)" -msgstr "" +msgstr "لا ÙŠÙØ¹Ø§Ø¯Ù„ (!=)" #: editor/plugins/visual_shader_editor_plugin.cpp msgid "" "Returns an associated vector if the provided boolean value is true or false." -msgstr "" +msgstr "ÙŠÙØ±Ø¬Ø¹ المٌتجه المقرون إن كانت قيمة المنطق المزود صØÙŠØØ© أو خاطئة." #: editor/plugins/visual_shader_editor_plugin.cpp msgid "" "Returns an associated scalar if the provided boolean value is true or false." msgstr "" +"ÙŠÙØ±Ø¬Ø¹ قيمة الكمية القياسية scalar المقرونة إن كانت قيمة المنطق المزود صØÙŠØØ© " +"أو خاطئة." #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Returns the boolean result of the comparison between two parameters." -msgstr "" +msgstr "ÙŠÙØ±Ø¬Ø¹ نتيجة المنطق (صØÙŠØ/خاطئ) بعد المقارنة بين اثنين من المعالم." #: editor/plugins/visual_shader_editor_plugin.cpp msgid "" "Returns the boolean result of the comparison between INF (or NaN) and a " "scalar parameter." msgstr "" +"ÙŠÙØ±Ø¬Ø¹ نتيجة المنطق (صØÙŠØ/خاطئ) الناتج عن المقارنة ما بين INF (أو NaN \"ليس " +"عدداً\") Ùˆ مَعلم كمية قياسية scalar parameter." #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Boolean constant." -msgstr "" +msgstr "ثابت المنطق (صØÙŠØ/خاطئ)." #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Boolean uniform." -msgstr "" +msgstr "المنطق (صØÙŠØ/خاطئ) المÙÙˆØØ¯." #: editor/plugins/visual_shader_editor_plugin.cpp msgid "'%s' input parameter for all shader modes." -msgstr "" +msgstr "'%s' مَعلم Ø§Ù„Ù…ÙØ¯Ø®Ù„ لأجل جميع أساليب التظليل shader modes." #: editor/plugins/visual_shader_editor_plugin.cpp -#, fuzzy msgid "Input parameter." -msgstr "الكبس إلي الطÙÙ„" +msgstr "مَعلم Ø§Ù„Ù…ÙØ¯Ø®Ù„." #: editor/plugins/visual_shader_editor_plugin.cpp msgid "'%s' input parameter for vertex and fragment shader modes." -msgstr "" +msgstr "'%s' مَعلم Ø§Ù„Ù…ÙØ¯Ø®Ù„ لأجل أساليب تظليل الرأس والقطع." #: editor/plugins/visual_shader_editor_plugin.cpp msgid "'%s' input parameter for fragment and light shader modes." -msgstr "" +msgstr "'%s' مَعلم Ø§Ù„Ù…ÙØ¯Ø®Ù„ لأجل أساليب تظليل القطع والإضاءة." #: editor/plugins/visual_shader_editor_plugin.cpp msgid "'%s' input parameter for fragment shader mode." -msgstr "" +msgstr "'%s' مَعلم Ø§Ù„Ù…ÙØ¯Ø®Ù„ لأجل أساليب تظليل القطع." #: editor/plugins/visual_shader_editor_plugin.cpp msgid "'%s' input parameter for light shader mode." -msgstr "" +msgstr "'%s' مَعلم Ø§Ù„Ù…ÙØ¯Ø®Ù„ لأسلوب تظليل الإضاءة." #: editor/plugins/visual_shader_editor_plugin.cpp msgid "'%s' input parameter for vertex shader mode." -msgstr "" +msgstr "'%s' مَعلم Ø§Ù„Ù…ÙØ¯Ø®Ù„ لأجل تظليل الرأس vertex." #: editor/plugins/visual_shader_editor_plugin.cpp msgid "'%s' input parameter for vertex and fragment shader mode." -msgstr "" +msgstr "'%s' مَعلم Ø§Ù„Ù…ÙØ¯Ø®Ù„ لأجل أساليب تظليل الرأس ÙˆØ§Ù„Ù‚ÙØ·Ø¹." #: editor/plugins/visual_shader_editor_plugin.cpp -#, fuzzy msgid "Scalar function." -msgstr "تكبير Ø§Ù„Ù…ØØ¯Ø¯" +msgstr "ÙˆØ¸ÙŠÙØ© الكمية القياسية Scalar." #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Scalar operator." -msgstr "" +msgstr "Ù…ÙØ´ØºÙ„ الكمية القياسية Scalar." #: editor/plugins/visual_shader_editor_plugin.cpp msgid "E constant (2.718282). Represents the base of the natural logarithm." msgstr "" +"الثابت E وتعادل قيمته (2.718282)ØŒ وهو يمثل الأساس ÙÙŠ اللوغاريتم الطبيعي." #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Epsilon constant (0.00001). Smallest possible scalar number." -msgstr "" +msgstr "ثابت إيبسلون (0.00001)ØŒ أصغر الأعداد على الإطلاق." #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Phi constant (1.618034). Golden ratio." -msgstr "" +msgstr "ثابت ÙØ§ÙŠ (1.618034)ØŒ ويمثل النسبة الذهبية ذاتها." #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Pi/4 constant (0.785398) or 45 degrees." -msgstr "" +msgstr "ثابت باي/4 (0.785398) أو 45 درجة." #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Pi/2 constant (1.570796) or 90 degrees." -msgstr "" +msgstr "ثابت باي/2 (1.570796) أو 90 درجة." #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Pi constant (3.141593) or 180 degrees." -msgstr "" +msgstr "ثابت باي (3.141593) أو 180 درجة." #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Tau constant (6.283185) or 360 degrees." -msgstr "" +msgstr "ثابت تاو Tau وقيمته (6.283185) أو 360 درجة." #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Sqrt2 constant (1.414214). Square root of 2." -msgstr "" +msgstr "ثابت جذر-العدد2 (1.414214)ØŒ أي قيمة جذر العدد 2." #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Returns the absolute value of the parameter." -msgstr "" +msgstr "ÙŠØØ³Ø¨ القيمة المطلقة لقيمة المَعلم." #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Returns the arc-cosine of the parameter." -msgstr "" +msgstr "ÙŠÙØ±Ø¬Ø¹ قيمة جيب التمام \"arc-cosine\" للمَعلم." #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Returns the inverse hyperbolic cosine of the parameter." -msgstr "" +msgstr "ÙŠÙØ±Ø¬Ø¹ قيمة جيب تمام القطع الزائد العكسي للمَعلم." #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Returns the arc-sine of the parameter." -msgstr "" +msgstr "ÙŠÙØ±Ø¬Ø¹ قيمة الجيب العكسية للمَعلم." #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Returns the inverse hyperbolic sine of the parameter." -msgstr "" +msgstr "ÙŠÙØ±Ø¬Ø¹ قيمة جيب القطع الزائد العكسي للمَعلم." #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Returns the arc-tangent of the parameter." -msgstr "" +msgstr "ÙŠÙØ±Ø¬Ø¹ قيمة ظل الزاوية العكسية \"arc-tangent\" للمَعلم." #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Returns the arc-tangent of the parameters." -msgstr "" +msgstr "ÙŠÙØ±Ø¬Ø¹ قيمة ظل الزاوية العكسي \"arc-tangent\" للمعالم." #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Returns the inverse hyperbolic tangent of the parameter." msgstr "" +"ÙŠÙØ±Ø¬Ø¹ قيمة ظل الزاوية العكسي (قطع زائد) \"inverse hyperbolic tangent\" للمَعلم." #: editor/plugins/visual_shader_editor_plugin.cpp msgid "" "Finds the nearest integer that is greater than or equal to the parameter." -msgstr "" +msgstr "يجد أقرب رقم أكبر أو يساوي المَعلم." #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Constrains a value to lie between two further values." -msgstr "" +msgstr "ÙŠÙØ¬Ø¨Ø± قيمة على التوضع بين قيميتن إضاÙيتين." #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Returns the cosine of the parameter." -msgstr "" +msgstr "ÙŠÙØ±Ø¬Ø¹ جيب التمام \"cosine \" لقيمة المَعلم." #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Returns the hyperbolic cosine of the parameter." -msgstr "" +msgstr "ÙŠÙØ±Ø¬Ø¹ قيمة جيب التمام الزائدي \"hyperbolic cosine\" لقيمة المَعلم." #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Converts a quantity in radians to degrees." -msgstr "" +msgstr "ÙŠØÙˆÙ‘Ù„ قيمة (كمية) من الراديان إلى الدرجات." #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Base-e Exponential." -msgstr "" +msgstr "الدالة Base-e." #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Base-2 Exponential." -msgstr "" +msgstr "الدالة Base-2." #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Finds the nearest integer less than or equal to the parameter." -msgstr "" +msgstr "يجد أقرب رقم أصغر أو يساوي المَعلم." #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Computes the fractional part of the argument." -msgstr "" +msgstr "ÙŠØØ³Ø¨ الجزء الكسري من المعامل." #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Returns the inverse of the square root of the parameter." -msgstr "" +msgstr "ÙŠÙØ±Ø¬Ø¹ عكس قيمة الجذر التربيعي للمَعلم." #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Natural logarithm." -msgstr "" +msgstr "اللوغاريتم الطبيعي." #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Base-2 logarithm." -msgstr "" +msgstr "اللوغاريتم Base-2." #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Returns the greater of two values." -msgstr "" +msgstr "ÙŠÙØ±Ø¬Ø¹ القيمة Ø§Ù„ÙƒÙØ¨Ø±Ù‰ بين القيمتين." #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Returns the lesser of two values." -msgstr "" +msgstr "ÙŠÙØ±Ø¬Ø¹ القيمة الأصغر بين القيمتين." #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Linear interpolation between two scalars." -msgstr "" +msgstr "Ø§Ø³ØªÙŠÙØ§Ø¡ (استقراء داخلي interpolation ) خطي بين كميتين قياسيتين scalar." #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Returns the opposite value of the parameter." -msgstr "" +msgstr "ÙŠÙØ±Ø¬Ø¹ القيمة المعاكسة للمَعلم." #: editor/plugins/visual_shader_editor_plugin.cpp msgid "1.0 - scalar" -msgstr "" +msgstr "1.0 - الكمية القياسية" #: editor/plugins/visual_shader_editor_plugin.cpp msgid "" "Returns the value of the first parameter raised to the power of the second." -msgstr "" +msgstr "ÙŠÙØ±Ø¬Ø¹ قيمة المَعلم الأول مرÙوعاً إلى قوّة الثاني." #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Converts a quantity in degrees to radians." -msgstr "" +msgstr "ÙŠØÙˆÙ„ الكمية المقاسة بالدرجات إلى الراديان." #: editor/plugins/visual_shader_editor_plugin.cpp msgid "1.0 / scalar" -msgstr "" +msgstr "1.0 \\ الكمية القياسية" #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Finds the nearest integer to the parameter." -msgstr "" +msgstr "يوجد الرقم الأقرب للمَعلم." #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Finds the nearest even integer to the parameter." -msgstr "" +msgstr "يجد العدد الزوجي الأقرب لقيمة المَعلم." #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Clamps the value between 0.0 and 1.0." -msgstr "" +msgstr "ÙŠÙمخلب (ÙŠØØµØ±) القيمة بين 0.0 Ùˆ 1.0." #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Extracts the sign of the parameter." -msgstr "" +msgstr "يستخرج إشارة المَعلم." #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Returns the sine of the parameter." -msgstr "" +msgstr "ÙŠÙØ±Ø¬Ø¹ جيب sine المَعلم parameter." #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Returns the hyperbolic sine of the parameter." -msgstr "" +msgstr "ÙŠÙØ±Ø¬Ø¹ قيمة الجيب العكس hyperbolic sine للمَعلم." #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Returns the square root of the parameter." -msgstr "" +msgstr "ÙŠÙØ±Ø¬Ø¹ قيمة الجذر التربيعي للمَعلم." #: editor/plugins/visual_shader_editor_plugin.cpp msgid "" @@ -9336,6 +9198,12 @@ msgid "" "'edge1'. Otherwise the return value is interpolated between 0.0 and 1.0 " "using Hermite polynomials." msgstr "" +"Ø§Ù„ÙˆØ¸ÙŠÙØ© البرمجية \"الخطوة الناعمة\" SmoothStep وهي function( scalar(edge0), " +"scalar(edge1), scalar(x) ).\n" +"\n" +"ØªÙØ±Ø¬Ø¹ 0.0 إذا كان 'x' أصغر من 'edge0' Ùˆ 1.0 إذا كان x أكبر من 'edge1'. عدا " +"ذلك سيتم Ø§Ø³ØªÙŠÙØ§Ø¡ (استقراء داخلي interpolated) للقيمة ما بين 0.0 Ùˆ 1.0 " +"باستخدام متعددات Ø§Ù„ØØ¯ÙˆØ¯ لهيرمت Hermite polynomials." #: editor/plugins/visual_shader_editor_plugin.cpp msgid "" @@ -9343,42 +9211,45 @@ msgid "" "\n" "Returns 0.0 if 'x' is smaller than 'edge' and otherwise 1.0." msgstr "" +"Ø§Ù„ÙˆØ¸ÙŠÙØ© البرمجية \"الخطوة\" function( scalar(edge), scalar(x) ).\n" +"\n" +"ØªÙØ±Ø¬Ø¹ 0.0 إذا كان 'x' أصغر من 'edge' وعدا ذلك 1.0." #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Returns the tangent of the parameter." -msgstr "" +msgstr "ÙŠÙØ±Ø¬Ø¹ قيمة ظل الزاوية tangent للمَعلم." #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Returns the hyperbolic tangent of the parameter." -msgstr "" +msgstr "ÙŠÙØ±Ø¬Ø¹ قيمة ظل الزاوية العكسي hyperbolic tangent للمَعلم." #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Finds the truncated value of the parameter." -msgstr "" +msgstr "يجد قيمة الاقتطاع truncated للمَعلم." #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Adds scalar to scalar." -msgstr "" +msgstr "Ø¥Ø¶Ø§ÙØ© كمية قياسية إلى كمية قياسية." #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Divides scalar by scalar." -msgstr "" +msgstr "تقسيم كمية قياسية على كمية قياسية." #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Multiplies scalar by scalar." -msgstr "" +msgstr "الضرب الرياضي لكمية قياسية بكمية قياسية." #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Returns the remainder of the two scalars." -msgstr "" +msgstr "ÙŠÙØ±Ø¬Ø¹ باقي الكميتين القياسيتين." #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Subtracts scalar from scalar." -msgstr "" +msgstr "Ø·Ø±Ø ÙƒÙ…ÙŠØ© قياسية من كمية قياسية." #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Scalar constant." -msgstr "" +msgstr "ثابت الكمية القياسية Scalar constant." #: editor/plugins/visual_shader_editor_plugin.cpp #, fuzzy @@ -9387,28 +9258,28 @@ msgstr "تØÙˆÙŠÙ„ تغيير Ø§Ù„ØªØØ±ÙŠÙƒ" #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Perform the cubic texture lookup." -msgstr "" +msgstr "إجراء Ø§Ù„Ø¨ØØ« عن النقش المكعبي." #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Perform the texture lookup." -msgstr "" +msgstr "إجراء Ø§Ù„Ø¨ØØ« عن النقش." #: editor/plugins/visual_shader_editor_plugin.cpp +#, fuzzy msgid "Cubic texture uniform lookup." -msgstr "" +msgstr "Ø§Ù„Ø¨ØØ« عن النقش المكعبي Ø§Ù„Ù…ÙˆØØ¯." #: editor/plugins/visual_shader_editor_plugin.cpp msgid "2D texture uniform lookup." -msgstr "" +msgstr "Ø§Ù„Ø¨ØØ« عن النقش Ø§Ù„Ù…ÙˆØØ¯ ثنائي Ø§Ù„Ø¨ÙØ¹Ø¯." #: editor/plugins/visual_shader_editor_plugin.cpp msgid "2D texture uniform lookup with triplanar." msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp -#, fuzzy msgid "Transform function." -msgstr "إنشاء بولي" +msgstr "ÙˆØ¸ÙŠÙØ© التØÙˆÙŠÙ„." #: editor/plugins/visual_shader_editor_plugin.cpp msgid "" @@ -9423,70 +9294,67 @@ msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Composes transform from four vectors." -msgstr "" +msgstr "تألي٠التØÙˆÙ‘Ù„ من أربع Ù…ÙØªØ¬Ù‡Ø§Øª vectors." #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Decomposes transform to four vectors." -msgstr "" +msgstr "Ùكّ التØÙˆÙ‘Ù„ إلى أربع Ù…ÙØªØ¬Ù‡Ø§Øª vectors." #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Calculates the determinant of a transform." -msgstr "" +msgstr "ØØ³Ø§Ø¨ Ù…ÙØØ¯Ø¯ determinant التØÙˆÙ‘Ù„." #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Calculates the inverse of a transform." -msgstr "" +msgstr "ØØ³Ø§Ø¨ عكس التØÙˆÙ‘Ù„." #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Calculates the transpose of a transform." -msgstr "" +msgstr "ØØ³Ø§Ø¨ تبدل موضع التØÙˆÙ‘Ù„." #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Multiplies transform by transform." -msgstr "" +msgstr "Ù…Ø¶Ø§Ø¹ÙØ© التØÙˆÙ‘لات بالتØÙˆÙ‘Ù„." #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Multiplies vector by transform." -msgstr "" +msgstr "Ù…ÙØ¶Ø§Ø¹ÙØ© Ø§Ù„Ù…ÙØªØ¬Ù‡Ø§Øª بالتØÙˆÙ‘Ù„." #: editor/plugins/visual_shader_editor_plugin.cpp -#, fuzzy msgid "Transform constant." -msgstr "إنشاء بولي" +msgstr "ثابت التØÙˆÙ‘Ù„." #: editor/plugins/visual_shader_editor_plugin.cpp -#, fuzzy msgid "Transform uniform." -msgstr "إنشاء بولي" +msgstr "Ù…ÙÙˆØØ¯ التØÙˆÙ‘Ù„ Transform uniform." #: editor/plugins/visual_shader_editor_plugin.cpp -#, fuzzy msgid "Vector function." -msgstr "التعيين لتعمل." +msgstr "ÙˆØ¸ÙŠÙØ© Ø§Ù„Ù…ÙØªØ¬Ù‡ Vector ." #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Vector operator." -msgstr "" +msgstr "Ù…ÙØ´ØºÙ‘Ù„ Ø§Ù„Ù…ÙØªØ¬Ù‡." #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Composes vector from three scalars." -msgstr "" +msgstr "ØªØ£Ù„ÙŠÙ Ø§Ù„Ù…ÙØªØ¬Ù‡ من ثلاث كميات قياسية." #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Decomposes vector to three scalars." -msgstr "" +msgstr "Ùكّ تركيب Ø§Ù„Ù…ÙØªØ¬Ù‡ إلى ثلاث كميات قياسية." #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Calculates the cross product of two vectors." -msgstr "" +msgstr "ØØ³Ø§Ø¨ المنتوج الوسيط Ù„Ù„Ù…ÙØªØ¬Ù‡ÙŠÙ†." #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Returns the distance between two points." -msgstr "" +msgstr "ÙŠÙØ±Ø¬Ø¹ Ø§Ù„Ù…Ø³Ø§ÙØ© ما بين نقطتين." #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Calculates the dot product of two vectors." -msgstr "" +msgstr "ØØ³Ø§Ø¨ الجداء السلمي dot product Ù„Ù„Ù…ÙØªØ¬Ù‡ÙŠÙ† (الشعاعين)." #: editor/plugins/visual_shader_editor_plugin.cpp msgid "" @@ -9498,15 +9366,17 @@ msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Calculates the length of a vector." -msgstr "" +msgstr "ØØ³Ø§Ø¨ طول Ø§Ù„Ù…ÙØªØ¬Ù‡ (الشعاع)." #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Linear interpolation between two vectors." -msgstr "" +msgstr "Ø§Ù„Ø§Ø³ØªÙŠÙØ§Ø¡ (الاستقراء الداخلي interpolation ) بين Ù…ÙØªØ¬Ù‡ÙŠÙ†." #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Linear interpolation between two vectors using scalar." msgstr "" +"Ø§Ù„Ø§Ø³ØªÙŠÙØ§Ø¡ (الاستقراء الداخلي interpolation) بين Ù…ÙØªØ¬Ù‡ÙŠÙ† باستخدام الكمية " +"القياسية." #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Calculates the normalize product of vector." @@ -9658,43 +9528,43 @@ msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp msgid "VisualShader" -msgstr "" +msgstr "Ø§Ù„Ù…ÙØ¸Ù„Ù„ البصري" #: editor/plugins/visual_shader_editor_plugin.cpp -#, fuzzy msgid "Edit Visual Property" -msgstr "تعديل المصاÙÙŠ" +msgstr "ØªØØ±ÙŠØ± الخاصية البصرية" #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Visual Shader Mode Changed" -msgstr "" +msgstr "تغيير وضع Ø§Ù„Ù…ÙØ¸Ù„Ù„ البصري" #: editor/project_export.cpp msgid "Runnable" -msgstr "" +msgstr "قابل للتشغيل" #: editor/project_export.cpp -#, fuzzy msgid "Add initial export..." -msgstr "أض٠مدخله" +msgstr "Ø¥Ø¶Ø§ÙØ© تصدير مبدئي..." #: editor/project_export.cpp msgid "Add previous patches..." -msgstr "" +msgstr "Ø¥Ø¶Ø§ÙØ© الرÙقع السابقة..." #: editor/project_export.cpp msgid "Delete patch '%s' from list?" -msgstr "" +msgstr "ØØ°Ù رÙقعة '%s' من القائمة؟" #: editor/project_export.cpp msgid "Delete preset '%s'?" -msgstr "" +msgstr "ØØ°Ù Ø§Ù„Ù…ÙØ¹Ø¯ Ù…ÙØ³Ø¨Ù‚اً '%s'ØŸ" #: editor/project_export.cpp msgid "" "Failed to export the project for platform '%s'.\n" "Export templates seem to be missing or invalid." msgstr "" +"أخÙÙ‚ تصدير المشروع لمنصة '%s'.\n" +"على ما يبدو قوالب التصدير Ù…Ùقودة أو غير ØµØ§Ù„ØØ©." #: editor/project_export.cpp msgid "" @@ -9702,165 +9572,165 @@ msgid "" "This might be due to a configuration issue in the export preset or your " "export settings." msgstr "" +"أخÙÙ‚ تصدير المشروع لمنصة '%s'.\n" +"قد يعود ذلك إلى خلل تهيئة ÙÙŠ الإعدادات Ø§Ù„Ù…ÙØ¹Ø¯Ù‘Ø© Ø³Ù„ÙØ§Ù‹ أو إعدادات التصدير الخاصة " +"بك." #: editor/project_export.cpp msgid "Release" -msgstr "" +msgstr "الإصدار" #: editor/project_export.cpp -#, fuzzy msgid "Exporting All" -msgstr "التصدير كـ %s" +msgstr "تصدير الكÙÙ„" #: editor/project_export.cpp -#, fuzzy msgid "The given export path doesn't exist:" -msgstr "هذا المسار غير موجود." +msgstr "مسار التصدير Ø§Ù„Ù…ÙØ²ÙˆØ¯ غير موجود:" #: editor/project_export.cpp msgid "Export templates for this platform are missing/corrupted:" -msgstr "" +msgstr "قوالب تصدير هذه المنصة Ù…Ùقودة / ØªØ§Ù„ÙØ©:" #: editor/project_export.cpp msgid "Presets" -msgstr "" +msgstr "Ù…ÙØ¹Ø¯ Ø³Ù„ÙØ§Ù‹" #: editor/project_export.cpp editor/project_settings_editor.cpp msgid "Add..." -msgstr "" +msgstr "Ø¥Ø¶Ø§ÙØ©..." #: editor/project_export.cpp msgid "" "If checked, the preset will be available for use in one-click deploy.\n" "Only one preset per platform may be marked as runnable." msgstr "" +"إن تم ØªØØ¯Ø¯ÙŠÙ‡Ø§ØŒ ستتم Ø¥ØªØ§ØØ© Ø§Ù„Ù…ÙØ¹Ø¯Ù‘Ø© Ø³Ù„ÙØ§Ù‹ لتكون جاهزة للنشر deploy بضغط ÙˆØ§ØØ¯Ø©.\n" +"Ùقط ÙˆØ§ØØ¯Ø© من Ø§Ù„Ù…ÙØ¹Ø¯Ù‘Ø© Ø³Ù„ÙØ§Ù‹ preset لكل منصة ستوسم على أنها قابلة للتشغيل." #: editor/project_export.cpp -#, fuzzy msgid "Export Path" -msgstr "تصدير المشروع" +msgstr "مسار التصدير" #: editor/project_export.cpp msgid "Resources" -msgstr "" +msgstr "الموراد" #: editor/project_export.cpp msgid "Export all resources in the project" -msgstr "" +msgstr "تصدير جميع الموارد ÙÙŠ المشروع" #: editor/project_export.cpp msgid "Export selected scenes (and dependencies)" -msgstr "" +msgstr "تصدير المشاهد Ø§Ù„Ù…ÙØ®ØªØ§Ø±Ø© (وتبعاتها)" #: editor/project_export.cpp msgid "Export selected resources (and dependencies)" -msgstr "" +msgstr "تصدير الموارد Ø§Ù„Ù…ÙØ®ØªØ§Ø±Ø© (وتبعياتها)" #: editor/project_export.cpp msgid "Export Mode:" -msgstr "" +msgstr "وضع التصدير:" #: editor/project_export.cpp msgid "Resources to export:" -msgstr "" +msgstr "الموارد Ø§Ù„Ù…ÙØ¹Ø¯Ù‘Ø© للتصدير:" #: editor/project_export.cpp msgid "" "Filters to export non-resource files/folders\n" "(comma-separated, e.g: *.json, *.txt, docs/*)" msgstr "" +"Ù…ÙØ±Ø´ØØ§Øª Filters تصدير Ø§Ù„Ù…Ù„ÙØ§Øª / المجلدات من غير الموارد\n" +"(تلك Ø§Ù„Ù…ÙØµÙˆÙ„Ø© Ø¨Ø§Ù„ÙØ§ØµÙ„ة، على سبيل المثال: *.json, *.txt, docs/*)" #: editor/project_export.cpp msgid "" "Filters to exclude files/folders from project\n" "(comma-separated, e.g: *.json, *.txt, docs/*)" msgstr "" +"Ù…ÙØ±Ø´ØØ§Øª Filters تصدير Ø§Ù„Ù…Ù„ÙØ§Øª/Ø§Ù„Ù…ÙØ¬Ù„دات من المشروع\n" +"(Ø§Ù„Ù…ÙØµÙˆÙ„Ø© Ø¨ÙØ§ØµÙ„ة، مثلاً: *.json, *.txt, docs/*)" #: editor/project_export.cpp msgid "Patches" -msgstr "" +msgstr "الرÙقع Patches" #: editor/project_export.cpp msgid "Make Patch" -msgstr "" +msgstr "إنشاء رÙقعة Patch" #: editor/project_export.cpp -#, fuzzy msgid "Pack File" -msgstr " Ù…Ù„ÙØ§Øª" +msgstr "مل٠الØÙزمة" #: editor/project_export.cpp msgid "Features" -msgstr "" +msgstr "المزايا" #: editor/project_export.cpp msgid "Custom (comma-separated):" -msgstr "" +msgstr "Ù…ÙØ®ØµØµ (Ù…ÙØµÙˆÙ„ Ø¨ÙØ§ØµÙ„Ø©):" #: editor/project_export.cpp msgid "Feature List:" -msgstr "" +msgstr "قائمة المزايا:" #: editor/project_export.cpp -#, fuzzy msgid "Script" -msgstr "تشغيل الكود" +msgstr "النص البرمجي" #: editor/project_export.cpp -#, fuzzy msgid "Script Export Mode:" -msgstr "تصدير المشروع" +msgstr "وضع تصدير النص البرمجي:" #: editor/project_export.cpp msgid "Text" -msgstr "" +msgstr "نص" #: editor/project_export.cpp msgid "Compiled" -msgstr "" +msgstr "Ù…ÙØÙˆÙ„Ø© برمجياً" #: editor/project_export.cpp msgid "Encrypted (Provide Key Below)" -msgstr "" +msgstr "مشÙّرة (قدّم Ø§Ù„Ù…ÙØªØ§Ø أدناه)" #: editor/project_export.cpp msgid "Invalid Encryption Key (must be 64 characters long)" -msgstr "" +msgstr "Ù…ÙØªØ§Ø تشÙير غير ØµØ§Ù„Ø (ينبغي أن يكون طوله 46 ØØ±Ù)" #: editor/project_export.cpp msgid "Script Encryption Key (256-bits as hex):" -msgstr "" +msgstr "Ù…ÙØªØ§Ø تشÙير النص البرمجي (256-bits Ùƒ hex ):" #: editor/project_export.cpp msgid "Export PCK/Zip" -msgstr "" +msgstr "تصدير PCK/ مل٠مضغوط Zip" #: editor/project_export.cpp msgid "Export Project" msgstr "تصدير المشروع" #: editor/project_export.cpp -#, fuzzy msgid "Export mode?" -msgstr "تصدير المشروع" +msgstr "وضع التصدير؟" #: editor/project_export.cpp -#, fuzzy msgid "Export All" -msgstr "تصدير" +msgstr "تصدير الكÙÙ„" #: editor/project_export.cpp editor/project_manager.cpp -#, fuzzy msgid "ZIP File" -msgstr " Ù…Ù„ÙØ§Øª" +msgstr "المل٠المضغوط ZIP File" #: editor/project_export.cpp msgid "Godot Game Pack" -msgstr "" +msgstr "Ø±ÙØ²Ù…Ø© لعبة غودوت" #: editor/project_export.cpp msgid "Export templates for this platform are missing:" -msgstr "" +msgstr "قوالب التصدير لهذه المنصة Ù…Ùقودة:" #: editor/project_export.cpp msgid "Manage Export Templates" @@ -9868,47 +9738,44 @@ msgstr "إدارة قوالب التصدير" #: editor/project_export.cpp msgid "Export With Debug" -msgstr "" +msgstr "التصدير مع Ù…ÙÙ†Ù‚Ø Ø§Ù„Ø£Ø®Ø·Ø§Ø¡" #: editor/project_manager.cpp -#, fuzzy msgid "The path specified doesn't exist." -msgstr "هذا المسار غير موجود." +msgstr "المسار Ø§Ù„Ù…ÙØØ¯Ø¯ غير موجود." #: editor/project_manager.cpp -#, fuzzy msgid "Error opening package file (it's not in ZIP format)." msgstr "ØØ¯Ø« خطأ Ø¹Ù†Ø¯ÙØªØ Ù…Ù„Ù Ø§Ù„ØØ²Ù…Ø© بسبب أن المل٠ليس ÙÙŠ صيغة \"ZIP\"." #: editor/project_manager.cpp msgid "" "Invalid \".zip\" project file; it doesn't contain a \"project.godot\" file." -msgstr "" +msgstr "مل٠المشروع \".zip\" غير ØµØ§Ù„ØØ› لا ÙŠØÙˆÙŠ Ù…Ù„Ù \"project.godot\"." #: editor/project_manager.cpp msgid "Please choose an empty folder." -msgstr "" +msgstr "من ÙØ¶Ù„Ùƒ اختر Ù…ÙØ¬Ù„داً ÙØ§Ø±ØºØ§Ù‹." #: editor/project_manager.cpp msgid "Please choose a \"project.godot\" or \".zip\" file." -msgstr "" +msgstr "من ÙØ¶Ù„Ùƒ اختر مل٠\"project.godot\" أو \".zip\"." #: editor/project_manager.cpp msgid "This directory already contains a Godot project." -msgstr "" +msgstr "الدليل Ø§Ù„Ù…ÙØ®ØªØ§Ø± يتضمن Ø¨Ø§Ù„ÙØ¹Ù„ مشروعاً لغودوت." #: editor/project_manager.cpp msgid "New Game Project" -msgstr "" +msgstr "مشروع لعبة جديد" #: editor/project_manager.cpp msgid "Imported Project" -msgstr "" +msgstr "المشاريع المستوردة" #: editor/project_manager.cpp -#, fuzzy msgid "Invalid Project Name." -msgstr "اسم غير صالØ." +msgstr "اسم مشروع غير صالØ." #: editor/project_manager.cpp msgid "Couldn't create folder." @@ -9916,37 +9783,38 @@ msgstr "لا يمكن إنشاء المجلد." #: editor/project_manager.cpp msgid "There is already a folder in this path with the specified name." -msgstr "" +msgstr "يوجد Ù…Ù„Ù Ø¨Ø§Ù„ÙØ¹Ù„ بالمسار Ø§Ù„Ù…ÙØ®ØªØ§Ø± بذات الاسم Ø§Ù„Ù…ÙØ®ØªØ§Ø±." #: editor/project_manager.cpp msgid "It would be a good idea to name your project." -msgstr "" +msgstr "إنها Ù„Ùكرة جيدة أن تقوم بتسمية مشروعك." #: editor/project_manager.cpp msgid "Invalid project path (changed anything?)." -msgstr "" +msgstr "مسار مشروع غير ØµØ§Ù„Ø (أعدلت شيء؟)." #: editor/project_manager.cpp msgid "" "Couldn't load project.godot in project path (error %d). It may be missing or " "corrupted." msgstr "" +"لم يتم تØÙ…يل project.godot من مسار المشروع (خطأ %d). قد يكون Ù…Ùقوداً أو ØªØ§Ù„ÙØ§Ù‹." #: editor/project_manager.cpp msgid "Couldn't edit project.godot in project path." -msgstr "" +msgstr "لا قدرة على ØªØØ±ÙŠØ± project.godot ÙÙŠ مسار المشروع." #: editor/project_manager.cpp msgid "Couldn't create project.godot in project path." -msgstr "" +msgstr "لا قدرة على إنشاء project.godot ÙÙŠ مسار المشروع." #: editor/project_manager.cpp msgid "Rename Project" -msgstr "" +msgstr "إعادة تسمية المشروع" #: editor/project_manager.cpp msgid "Import Existing Project" -msgstr "" +msgstr "استيراد مشروع موجود" #: editor/project_manager.cpp msgid "Import & Edit" @@ -9954,7 +9822,7 @@ msgstr "إستيراد Ùˆ تعديل" #: editor/project_manager.cpp msgid "Create New Project" -msgstr "" +msgstr "إنشاء مشروع جديد" #: editor/project_manager.cpp msgid "Create & Edit" @@ -9962,7 +9830,7 @@ msgstr "إنشاء Ùˆ تعديل" #: editor/project_manager.cpp msgid "Install Project:" -msgstr "" +msgstr "تنصيب المشروع:" #: editor/project_manager.cpp msgid "Install & Edit" @@ -9970,23 +9838,23 @@ msgstr "تثبيت Ùˆ تعديل" #: editor/project_manager.cpp msgid "Project Name:" -msgstr "" +msgstr "اسم المشروع:" #: editor/project_manager.cpp msgid "Project Path:" -msgstr "" +msgstr "مسار المشروع:" #: editor/project_manager.cpp msgid "Project Installation Path:" -msgstr "" +msgstr "مسار تنصيب المشروع:" #: editor/project_manager.cpp msgid "Renderer:" -msgstr "" +msgstr "Ù…ÙØØ±Ùƒ الإخراج البصري:" #: editor/project_manager.cpp msgid "OpenGL ES 3.0" -msgstr "" +msgstr "OpenGL ES 3.0" #: editor/project_manager.cpp msgid "" @@ -9995,10 +9863,14 @@ msgid "" "Incompatible with older hardware\n" "Not recommended for web games" msgstr "" +"قيمة بصرية أعلى\n" +"جميع المزايا Ù…ØªÙˆØ§ÙØ±Ø©\n" +"غير متواÙÙ‚ مع العتاد القديم\n" +"ليس نصØÙŠØ© بالنسبة لألعاب الويب" #: editor/project_manager.cpp msgid "OpenGL ES 2.0" -msgstr "" +msgstr "OpenGL ES 2.0" #: editor/project_manager.cpp msgid "" @@ -10007,32 +9879,35 @@ msgid "" "Works on most hardware\n" "Recommended for web games" msgstr "" +"قيمة بصرية أقل\n" +"بعض المزايا غير Ù…ØªÙˆØ§ÙØ±Ø© \n" +"يعمل على أغلب العتاد\n" +"Ù†ØµÙŠØØ© لألعاب الويب" #: editor/project_manager.cpp msgid "Renderer can be changed later, but scenes may need to be adjusted." msgstr "" +"Ù…ÙØØ±Ùƒ الإخراج البصري يمكن تغييره لاØÙ‚اً، ولكن قد ØªØØªØ§Ø¬ إلى تعديل المشاهد." #: editor/project_manager.cpp msgid "Unnamed Project" -msgstr "" +msgstr "مشروع غير مسمى" #: editor/project_manager.cpp -#, fuzzy msgid "Missing Project" -msgstr "بناء المشروع" +msgstr "مشروع Ù…Ùقود" #: editor/project_manager.cpp msgid "Error: Project is missing on the filesystem." -msgstr "" +msgstr "خطأ: المشروع Ù…Ùقود ÙÙŠ Ù…Ù„ÙØ§Øª النظام." #: editor/project_manager.cpp -#, fuzzy msgid "Can't open project at '%s'." -msgstr "لا يمكن ÙØªØ المشروع" +msgstr "لا يمكن ÙØªØ المشروع ÙÙŠ '%s'." #: editor/project_manager.cpp msgid "Are you sure to open more than one project?" -msgstr "" +msgstr "هل أنت واثق من ÙØªØ أكثر من مشروع؟" #: editor/project_manager.cpp msgid "" @@ -10064,188 +9939,208 @@ msgid "" "The project settings were created by a newer engine version, whose settings " "are not compatible with this version." msgstr "" +"لقد تم إنشاء إعدادات المشروع هذا بإصدار Ø£ØØ¯Ø« من Ø§Ù„Ù…ÙØØ±ÙƒØŒ تلك الإعدادات غير " +"متواÙقة مع هذا الإصدار." #: editor/project_manager.cpp -#, fuzzy msgid "" "Can't run project: no main scene defined.\n" "Please edit the project and set the main scene in the Project Settings under " "the \"Application\" category." msgstr "" -"لا مشهد أساسي تم ØªØØ¯ÙŠØ¯Ù‡ØŒ ØØ¯Ø¯ ÙˆØ§ØØ¯ØŸ\n" -"يمكنك تغييره لاØÙ‚اً ÙÙŠ \"إعدادات المشروع\" ØªØØª قسم 'التطبيق'." +"لا يمكن تشغيل المشروع: لم يتم ØªØØ¯ÙŠØ¯ مشهد رئيس.\n" +"من ÙØ¶Ù„Ùƒ ØØ±Ø± المشروع ÙˆØØ¯Ø¯ مشهداً رئيساً ÙÙŠ إعدادات المشروع ØªØØª خيار \"التطبيق\"." #: editor/project_manager.cpp msgid "" "Can't run project: Assets need to be imported.\n" "Please edit the project to trigger the initial import." msgstr "" +"لا يمكن تشغيل المشروع: يجب استيراد المÙÙ„ØÙ‚ات.\n" +"من ÙØ¶Ù„Ùƒ ØØ±Ø± المشروع Ù„ØªØØ±ÙŠØ¶ الشروع بالاستيراد." #: editor/project_manager.cpp msgid "Are you sure to run %d projects at once?" -msgstr "" +msgstr "هل أنت متأكد من ÙØªØ %d مشاريع مرّة ÙˆØ§ØØ¯Ø©ØŸ" #: editor/project_manager.cpp msgid "" "Remove %d projects from the list?\n" "The project folders' contents won't be modified." msgstr "" +"إزالة %d مشاريع من القائمة؟\n" +"لن يتم تعديل Ù…ØØªÙˆÙŠØ§Øª Ù…ÙØ¬Ù„دات المشاريع." #: editor/project_manager.cpp msgid "" "Remove this project from the list?\n" "The project folder's contents won't be modified." msgstr "" +"إزالة هذا المشروع من القائمة؟\n" +"لن يتم تعديل Ù…ØØªÙˆÙ‰ Ù…ÙØ¬Ù„د المشروع." #: editor/project_manager.cpp msgid "" "Remove all missing projects from the list?\n" "The project folders' contents won't be modified." msgstr "" +"إزالة جميع المشاريع المÙقودة من القائمة؟\n" +"لن يتم تعديل Ù…ØØªÙˆÙ‰ Ù…ÙØ¬Ù„دات المشاريع." #: editor/project_manager.cpp msgid "" "Language changed.\n" "The interface will update after restarting the editor or project manager." msgstr "" +"تم تغيير Ø§Ù„Ù„ÙØºØ©.\n" +"Ø³ØªØªØØ¯Ø« الواجهة بعد إعادة تشغيل Ø§Ù„Ù…ÙØØ±Ø± أو Ù…ÙØ¯ÙŠØ± المشاريع." #: editor/project_manager.cpp msgid "" "Are you sure to scan %s folders for existing Godot projects?\n" "This could take a while." msgstr "" +"هل أنت متأكد من ÙØØµ %s من المجلدات Ø¨ØØ«Ø§Ù‹ عن مشاريع غودوت Ù…ØªÙˆØ§ÙØ±Ø©ØŸ\n" +"قد يستغرق وقتاً." #: editor/project_manager.cpp msgid "Project Manager" msgstr "مدير المشروع" #: editor/project_manager.cpp -#, fuzzy msgid "Projects" -msgstr "مشروع" +msgstr "المشاريع" #: editor/project_manager.cpp msgid "Last Modified" -msgstr "" +msgstr "آخر ما تم تعديله" #: editor/project_manager.cpp msgid "Scan" -msgstr "" +msgstr "ÙØØµ" #: editor/project_manager.cpp msgid "Select a Folder to Scan" -msgstr "" +msgstr "اختر Ù…ÙØ¬Ù„داً Ù„ÙØØµÙ‡" #: editor/project_manager.cpp msgid "New Project" -msgstr "" +msgstr "مشروع جديد" #: editor/project_manager.cpp -#, fuzzy msgid "Remove Missing" -msgstr "Ù…Ø³Ø Ø§Ù„Ù†Ù‚Ø·Ø©" +msgstr "إزالة المÙقود" #: editor/project_manager.cpp msgid "Templates" -msgstr "" +msgstr "القوالب" #: editor/project_manager.cpp msgid "Restart Now" -msgstr "" +msgstr "إعادة التشغيل الآن" #: editor/project_manager.cpp msgid "Can't run project" -msgstr "" +msgstr "غير قادر على تشغيل المشروع" #: editor/project_manager.cpp msgid "" "You currently don't have any projects.\n" "Would you like to explore official example projects in the Asset Library?" msgstr "" +"لا تملك ØØ§Ù„ياً أية مشاريع.\n" +"هل ترغب ÙÙŠ استكشا٠مشاريع الأمثلة الرسمية ÙÙŠ مكتبة المÙÙ„ØÙ‚ات؟" + +#: editor/project_manager.cpp +msgid "" +"The search box filters projects by name and last path component.\n" +"To filter projects by name and full path, the query must contain at least " +"one `/` character." +msgstr "" #: editor/project_settings_editor.cpp msgid "Key " -msgstr "" +msgstr "زر " #: editor/project_settings_editor.cpp msgid "Joy Button" -msgstr "" +msgstr "زر Joy" #: editor/project_settings_editor.cpp msgid "Joy Axis" -msgstr "" +msgstr "Ù…ØÙˆØ± Joy" #: editor/project_settings_editor.cpp msgid "Mouse Button" -msgstr "" +msgstr "زر Ø§Ù„ÙØ£Ø±Ø©" #: editor/project_settings_editor.cpp msgid "" "Invalid action name. it cannot be empty nor contain '/', ':', '=', '\\' or " "'\"'" msgstr "" +"اسم ÙØ¹Ø§Ù„ية غير صØÙŠØ. لا يمكن أن يكون ÙØ§Ø±ØºØ§Ù‹ أو أو يتضمن '/'ØŒ ':'ØŒ '='ØŒ '\\' " +"أو '\"'" #: editor/project_settings_editor.cpp -#, fuzzy msgid "An action with the name '%s' already exists." -msgstr "خطأ: إسم Ø§Ù„ØØ±ÙƒØ© موجود Ø¨Ø§Ù„ÙØ¹Ù„!" +msgstr "ÙØ¹Ø§Ù„ية action بهذا الاسم '%s' موجودة Ø³Ù„ÙØ§Ù‹." #: editor/project_settings_editor.cpp msgid "Rename Input Action Event" -msgstr "" +msgstr "إعادة تسمية ØØ¯Ø« ÙØ¹Ø§Ù„ية الإدخال" #: editor/project_settings_editor.cpp -#, fuzzy msgid "Change Action deadzone" -msgstr "تغيير إسم Ø§Ù„ØØ±ÙƒØ©:" +msgstr "تغيير المنطقة الميتة Ù„Ù„ÙØ¹Ø§Ù„ية Action deadzone" #: editor/project_settings_editor.cpp msgid "Add Input Action Event" -msgstr "" +msgstr "Ø¥Ø¶Ø§ÙØ© ØØ¯Ø« ÙØ¹Ø§Ù„ية الإدخال" #: editor/project_settings_editor.cpp msgid "All Devices" -msgstr "" +msgstr "جميع الأجهزة" #: editor/project_settings_editor.cpp msgid "Device" -msgstr "" +msgstr "الجهاز" #: editor/project_settings_editor.cpp editor/settings_config_dialog.cpp msgid "Press a Key..." -msgstr "" +msgstr "اضغط زراً..." #: editor/project_settings_editor.cpp msgid "Mouse Button Index:" -msgstr "" +msgstr "مؤشر Index زر Ø§Ù„ÙØ£Ø±Ø©:" #: editor/project_settings_editor.cpp msgid "Left Button" -msgstr "" +msgstr "الزر الأيسر" #: editor/project_settings_editor.cpp msgid "Right Button" -msgstr "" +msgstr "الزر الأيمن" #: editor/project_settings_editor.cpp msgid "Middle Button" -msgstr "" +msgstr "الزر الأوسط" #: editor/project_settings_editor.cpp msgid "Wheel Up Button" -msgstr "" +msgstr "زر العجلة للأعلى" #: editor/project_settings_editor.cpp msgid "Wheel Down Button" -msgstr "" +msgstr "زر العجلة للأسÙÙ„" #: editor/project_settings_editor.cpp msgid "Wheel Left Button" -msgstr "" +msgstr "زر العجلة يساراً" #: editor/project_settings_editor.cpp msgid "Wheel Right Button" -msgstr "" +msgstr "زر العجلة يميناً" #: editor/project_settings_editor.cpp msgid "X Button 1" @@ -10281,7 +10176,7 @@ msgstr "" #: editor/project_settings_editor.cpp msgid "Button" -msgstr "" +msgstr "زر" #: editor/project_settings_editor.cpp msgid "Left Button." @@ -10554,9 +10449,8 @@ msgid "Suffix" msgstr "" #: editor/rename_dialog.cpp -#, fuzzy msgid "Use Regular Expressions" -msgstr "النسخة Ø§Ù„ØØ§Ù„ية:" +msgstr "استخدام التعبيرات الاعتيادية Regular Expressions" #: editor/rename_dialog.cpp #, fuzzy @@ -10666,9 +10560,8 @@ msgid "Regular Expression Error" msgstr "" #: editor/rename_dialog.cpp -#, fuzzy msgid "At character %s" -msgstr "Ø§Ù„Ø£ØØ±Ù Ø§Ù„ØµØ§Ù„ØØ©:" +msgstr "عند Ø§Ù„ØØ±Ù %s" #: editor/reparent_dialog.cpp editor/scene_tree_dock.cpp msgid "Reparent Node" @@ -11166,6 +11059,12 @@ msgid "Script file already exists." msgstr "التØÙ…يل التلقائي '%s' موجود اصلا!" #: editor/script_create_dialog.cpp +msgid "" +"Note: Built-in scripts have some limitations and can't be edited using an " +"external editor." +msgstr "" + +#: editor/script_create_dialog.cpp #, fuzzy msgid "Class Name:" msgstr "إسم صنÙ" @@ -11270,9 +11169,8 @@ msgid "Profiler" msgstr "" #: editor/script_editor_debugger.cpp -#, fuzzy msgid "Network Profiler" -msgstr "تصدير المشروع" +msgstr "مل٠تعري٠الشبكة Network Profiler" #: editor/script_editor_debugger.cpp msgid "Monitor" @@ -11299,6 +11197,11 @@ msgid "Total:" msgstr "" #: editor/script_editor_debugger.cpp +#, fuzzy +msgid "Export list to a CSV file" +msgstr "تصدير الملÙ" + +#: editor/script_editor_debugger.cpp msgid "Resource Path" msgstr "" @@ -11378,7 +11281,7 @@ msgstr "" #: editor/spatial_editor_gizmos.cpp msgid "Change Camera Size" -msgstr "" +msgstr "غيّر ØØ¬Ù… الكاميرا" #: editor/spatial_editor_gizmos.cpp msgid "Change Notifier AABB" @@ -12156,80 +12059,88 @@ msgstr "إخلاء الكود" #: modules/visual_script/visual_script_property_selector.cpp msgid "Get %s" -msgstr "" +msgstr "جلب %s" #: modules/visual_script/visual_script_property_selector.cpp msgid "Set %s" -msgstr "" +msgstr "ØªØØ¯ÙŠØ¯ %s" #: platform/android/export/export.cpp msgid "Package name is missing." -msgstr "" +msgstr "اسم Ø§Ù„Ø±ÙØ²Ù…Ø© Ù…Ùقود." #: platform/android/export/export.cpp msgid "Package segments must be of non-zero length." -msgstr "" +msgstr "أقسام Ø§Ù„Ø±ÙØ²Ù…Ø© ينبغي أن تكون ذات Ù…Ø³Ø§ÙØ§Øª غير-ØµÙØ±ÙŠØ© non-zero length." #: platform/android/export/export.cpp msgid "The character '%s' is not allowed in Android application package names." -msgstr "" +msgstr "إن Ø§Ù„ØØ±Ù '%s' غير Ù…Ø³Ù…ÙˆØ ÙÙŠ أسماء ØÙزم تطبيقات الأندرويد." #: platform/android/export/export.cpp msgid "A digit cannot be the first character in a package segment." -msgstr "" +msgstr "لا يمكن أن يكون الرقم هو أول ØØ±Ù ÙÙŠ مقطع Ø§Ù„Ø±ÙØ²Ù…Ø©." #: platform/android/export/export.cpp msgid "The character '%s' cannot be the first character in a package segment." -msgstr "" +msgstr "Ø§Ù„ØØ±Ù '%s' لا يمكن أن يكون Ø§Ù„ØØ±Ù الأول من مقطع Ø§Ù„Ø±ÙØ²Ù…Ø©." #: platform/android/export/export.cpp msgid "The package must have at least one '.' separator." -msgstr "" +msgstr "يجب أن تتضمن الرزمة على الأقل ÙˆØ§ØØ¯ من الÙواصل '.' ." #: platform/android/export/export.cpp msgid "Select device from the list" -msgstr "اختار جهاز من القائمة" +msgstr "اختر جهازاً من القائمة" #: platform/android/export/export.cpp msgid "ADB executable not configured in the Editor Settings." -msgstr "" +msgstr "لم يتم تهيئة Ù…ÙÙ†Ùّذ ADB ÙÙŠ إعدادات Ø§Ù„Ù…ÙØØ±Ø±." #: platform/android/export/export.cpp msgid "OpenJDK jarsigner not configured in the Editor Settings." msgstr "" +"‌مÙوقّع Ù…Ù„ÙØ§Øª الجار jarsigner Ø§Ù„Ù…ÙØªÙˆØ الخاص Ø¨ØØ²Ù…Ø© التطوير OpenJDK غير Ù…Ùهيّئ ÙÙŠ " +"إعدادات Ø§Ù„Ù…ÙØØ±Ø±." #: platform/android/export/export.cpp msgid "Debug keystore not configured in the Editor Settings nor in the preset." msgstr "" +"Ù…ÙÙ†Ù‚Ø Ø£Ø®Ø·Ø§Ø¡ Ù…ÙØªØ§Ø المتجر keystore غير Ù…Ùهيئ ÙÙŠ إعدادت Ø§Ù„Ù…ÙØØ±Ø± أو ÙÙŠ الإعدادات " +"الموضوعة Ø³Ù„ÙØ§Ù‹." #: platform/android/export/export.cpp msgid "Custom build requires a valid Android SDK path in Editor Settings." msgstr "" +"البÙنى المخصوصة تتطلب مساراً Ù„ØØ²Ù…Ø© تطوير Android SDK ØµØ§Ù„ØØ© ÙÙŠ إعدادات Ø§Ù„Ù…ÙØØ±Ø±." #: platform/android/export/export.cpp msgid "Invalid Android SDK path for custom build in Editor Settings." msgstr "" +"مسار ØØ²Ù…Ø© تطوير Android SDK للبÙنى المخصوصة، غير ØµØ§Ù„Ø ÙÙŠ إعدادات Ø§Ù„Ù…ÙØØ±Ø±." #: platform/android/export/export.cpp msgid "" "Android build template not installed in the project. Install it from the " "Project menu." msgstr "" +"لم يتم تنزيل قالب بناء Android لهذا المشروع. نزّل ÙˆØ§ØØ¯Ø§Ù‹ من قائمة المشروع." #: platform/android/export/export.cpp msgid "Invalid public key for APK expansion." -msgstr "" +msgstr "Ù…ÙØªØ§Ø عام غير ØµØ§Ù„Ø Ù„Ø£Ø¬Ù„ تصدير ØØ²Ù…Ø© تطبيق أندرويد APK." #: platform/android/export/export.cpp -#, fuzzy msgid "Invalid package name:" -msgstr "إسم صن٠غير صالØ" +msgstr "اسم Ø±ÙØ²Ù…Ø© غير صالØ:" #: platform/android/export/export.cpp msgid "" "Trying to build from a custom built template, but no version info for it " "exists. Please reinstall from the 'Project' menu." msgstr "" +"تتم Ù…ØØ§ÙˆÙ„Ø© البناء من قالب بناء Ù…ÙØ®ØµØµØŒ ولكن لا تتواجد معلومات النسخة. من ÙØ¶Ù„Ùƒ " +"أعد التØÙ…يل من قائمة \"المشروع\"." #: platform/android/export/export.cpp msgid "" @@ -12238,45 +12149,52 @@ msgid "" " Godot Version: %s\n" "Please reinstall Android build template from 'Project' menu." msgstr "" +"نسخ بناء Android غير متواÙقة:\n" +"\tقوالب Ù…Ùنصبة: %s\n" +"\tإصدار غودوت: %s\n" +"من ÙØ¶Ù„Ùƒ أعد تنصيب قالب بناء الأندرويد Android من قائمة \"المشروع\"." #: platform/android/export/export.cpp msgid "Building Android Project (gradle)" -msgstr "" +msgstr "بناء مشروع الأندرويد (gradle)" #: platform/android/export/export.cpp msgid "" "Building of Android project failed, check output for the error.\n" "Alternatively visit docs.godotengine.org for Android build documentation." msgstr "" +"أخÙÙ‚ بناء مشروع الأندرويد، تÙقد Ø§Ù„Ù…ÙØ®Ø±Ø¬Ø§Øª للإطلاع على الخطأ.\n" +"بصورة بديلة يمكنك زيارة docs.godotengine.org لأجل مستندات البناء للأندرويد." #: platform/android/export/export.cpp msgid "No build apk generated at: " -msgstr "" +msgstr "لم يتم توليد ØØ²Ù…Ø© أندرويد apk ÙÙŠ: " #: platform/iphone/export/export.cpp msgid "Identifier is missing." -msgstr "" +msgstr "Ø§Ù„Ù…ÙØØ¯Ø¯ Ù…Ùقود." #: platform/iphone/export/export.cpp msgid "The character '%s' is not allowed in Identifier." -msgstr "" +msgstr "إن Ø§Ù„ØØ±Ù '%s' غير Ù…Ø³Ù…ÙˆØ ÙÙŠ Ø§Ù„Ù…ÙØØ¯Ø¯ Identifier." #: platform/iphone/export/export.cpp msgid "App Store Team ID not specified - cannot configure the project." msgstr "" +"لم يتم ØªØØ¯ÙŠØ¯ ID الÙÙØ±Ù‚ الخاص بمتجر التطبيقات - لا يمكن تهيئة configure " +"المشروع." #: platform/iphone/export/export.cpp -#, fuzzy msgid "Invalid Identifier:" -msgstr "ØØ¬Ù… الخط غير صالØ" +msgstr "Ù…ÙØØ¯Ø¯ غير صالØ:" #: platform/iphone/export/export.cpp msgid "Required icon is not specified in the preset." -msgstr "" +msgstr "الأيقونة المطلوبة لم ØªÙØØ¯Ø¯ ÙÙŠ الإعدادات Ø§Ù„Ù…ÙØ³Ø¨Ù‚Ø©." #: platform/javascript/export/export.cpp msgid "Stop HTTP Server" -msgstr "" +msgstr "Ø¥ÙŠÙ‚Ø§Ù Ù…ÙØ®Ø¯Ù… HTTP" #: platform/javascript/export/export.cpp msgid "Run in Browser" @@ -12308,65 +12226,59 @@ msgstr "لا يمكن قراءة مل٠الإقلاع الصوري:" #: platform/javascript/export/export.cpp msgid "Using default boot splash image." -msgstr "" +msgstr "استخدام الصورة Ø§Ù„Ø§ÙØªØ±Ø§Ø¶ÙŠØ© للشروع بالتشغيل." #: platform/uwp/export/export.cpp -#, fuzzy msgid "Invalid package short name." -msgstr "إسم صن٠غير صالØ" +msgstr "اسم Ø§Ù„Ø±ÙØ²Ù…Ø© القصير غير صالØ." #: platform/uwp/export/export.cpp -#, fuzzy msgid "Invalid package unique name." -msgstr "اسم غير صالØ." +msgstr "الاسم المميز Ù„Ù„Ø±ÙØ²Ù…Ø© غير صالØ." #: platform/uwp/export/export.cpp -#, fuzzy msgid "Invalid package publisher display name." -msgstr "اسم غير صالØ." +msgstr "اسم الناشر المعروض Ù„Ù„Ø±ÙØ²Ù…Ø© غير صالØ." #: platform/uwp/export/export.cpp -#, fuzzy msgid "Invalid product GUID." -msgstr "اسم غير صالØ." +msgstr "Ù…ÙØ¹Ø±Ù GUID (Ø§Ù„Ù…ÙØ¹Ø±Ù‘Ù Ø§Ù„ÙØ±ÙŠØ¯ العالمي) للمنتج غير صالØ." #: platform/uwp/export/export.cpp -#, fuzzy msgid "Invalid publisher GUID." -msgstr "مسار غير صالØ." +msgstr "Ø§Ù„Ù…ÙØ¹Ø±Ù Ø§Ù„ÙØ±ÙŠØ¯ العالمي للناشر GUID غير صالØ." #: platform/uwp/export/export.cpp -#, fuzzy msgid "Invalid background color." -msgstr "اسم غير صالØ." +msgstr "لون خلÙية غير صالØ." #: platform/uwp/export/export.cpp msgid "Invalid Store Logo image dimensions (should be 50x50)." -msgstr "" +msgstr "أبعاد صورة الشعار الخاص بالمتجر غير ØµØ§Ù„ØØ© (ينبغي أن تكون50 × 50)." #: platform/uwp/export/export.cpp msgid "Invalid square 44x44 logo image dimensions (should be 44x44)." -msgstr "" +msgstr "أبعاد صورة الشعار المربع 44×44 غير ØµØ§Ù„ØØ© (ينبغي أن تكون 44×44)." #: platform/uwp/export/export.cpp msgid "Invalid square 71x71 logo image dimensions (should be 71x71)." -msgstr "" +msgstr "أبعاد صورة شعار 71×71 غير ØµØ§Ù„ØØ© (ينبغي أن تكون 71×71)." #: platform/uwp/export/export.cpp msgid "Invalid square 150x150 logo image dimensions (should be 150x150)." -msgstr "" +msgstr "أبعاد صورة الشعار Ø§Ù„Ù…ÙØ±Ø¨Ø¹ 150×150 غير ØµØ§Ù„ØØ© (ينبغي أن تكون 150×150)." #: platform/uwp/export/export.cpp msgid "Invalid square 310x310 logo image dimensions (should be 310x310)." -msgstr "" +msgstr "أبعاد صورة الشعار Ø§Ù„Ù…ÙØ±Ø¨Ø¹ 310×310 غير ØµØ§Ù„ØØ© (ينبغي أن تكون 310×310)." #: platform/uwp/export/export.cpp msgid "Invalid wide 310x150 logo image dimensions (should be 310x150)." -msgstr "" +msgstr "أبعاد صورة الشعار المربع 310x150 غير ØµØ§Ù„ØØ© (ينبغي أن تكون 310x150)." #: platform/uwp/export/export.cpp msgid "Invalid splash screen image dimensions (should be 620x300)." -msgstr "" +msgstr "أبعاد شاشة البداية غير ØµØ§Ù„ØØ© (ينبغي أن تكون 620×300)." #: scene/2d/animated_sprite.cpp #, fuzzy @@ -12399,7 +12311,7 @@ msgstr "" #: scene/2d/collision_polygon_2d.cpp msgid "An empty CollisionPolygon2D has no effect on collision." -msgstr "" +msgstr "Ù…ÙØ¶Ù„ع تصادم ثنائي الأبعاد ÙØ§Ø±Øº ليس له أي تأثير على التصادم." #: scene/2d/collision_shape_2d.cpp msgid "" @@ -12491,6 +12403,8 @@ msgstr "" #: scene/2d/skeleton_2d.cpp msgid "This Bone2D chain should end at a Skeleton2D node." msgstr "" +"سلسلة العظم ثنائي Ø§Ù„Ø¨ÙØ¹Ø¯ Bone2D هذه، ينبغي أن تنتهي ÙÙŠ عÙقدة هيكل ثنائي Ø§Ù„Ø¨ÙØ¹Ø¯ " +"Skeleton2D." #: scene/2d/skeleton_2d.cpp msgid "A Bone2D only works with a Skeleton2D or another Bone2D as parent node." @@ -12544,11 +12458,11 @@ msgstr "" #: scene/3d/baked_lightmap.cpp msgid "%d%%" -msgstr "" +msgstr "%d%%" #: scene/3d/baked_lightmap.cpp msgid "(Time Left: %d:%02d s)" -msgstr "" +msgstr "(الوقت المتبقي: %d:%02d ثانية)" #: scene/3d/baked_lightmap.cpp msgid "Plotting Meshes: " @@ -12633,7 +12547,7 @@ msgstr "" #: scene/3d/light.cpp msgid "A SpotLight with an angle wider than 90 degrees cannot cast shadows." -msgstr "" +msgstr "بقعة الضوء بزاوية أكبر من 90 درجة لا يمكنها إلقاء الظلال." #: scene/3d/navigation_mesh.cpp msgid "A NavigationMesh resource must be set or created for this node to work." @@ -12665,7 +12579,7 @@ msgstr "" #: scene/3d/path.cpp msgid "PathFollow only works when set as a child of a Path node." -msgstr "" +msgstr "يعمل تتبع المسار PathFollow Ùقط عندما يكون ابناً لعÙقدة مسار Path." #: scene/3d/path.cpp msgid "" @@ -12688,7 +12602,7 @@ msgstr "" #: scene/3d/soft_body.cpp msgid "This body will be ignored until you set a mesh." -msgstr "" +msgstr "سيتم تجاهل هذا الجسم ØØªÙ‰ تضع ØªØØ¯Ø¯ Ø³Ø·ØØ§Ù‹ mesh." #: scene/3d/soft_body.cpp msgid "" @@ -12734,45 +12648,43 @@ msgid "On BlendTree node '%s', animation not found: '%s'" msgstr "" #: scene/animation/animation_blend_tree.cpp -#, fuzzy msgid "Animation not found: '%s'" -msgstr "أدوات Ø§Ù„ØØ±ÙƒØ©" +msgstr "لم يتم إيجاد الرسم Ø§Ù„Ù…ØªØØ±Ùƒ: '%s'" #: scene/animation/animation_tree.cpp msgid "In node '%s', invalid animation: '%s'." -msgstr "" +msgstr "ÙÙŠ العÙقدة '%s'ØŒ رسومية Ù…ØªØØ±ÙƒØ© غير ØµØ§Ù„ØØ©: '%s'." #: scene/animation/animation_tree.cpp -#, fuzzy msgid "Invalid animation: '%s'." -msgstr "خطأ: إسم ØØ±ÙƒØ© خاطئ!" +msgstr "رسومية Ù…ØªØØ±ÙƒØ© غير ØµØ§Ù„ØØ©: '%s'." #: scene/animation/animation_tree.cpp -#, fuzzy msgid "Nothing connected to input '%s' of node '%s'." -msgstr "قطع إتصال'%s' من '%s'" +msgstr "ليس هناك وصل بين أي من Ù…ÙØ¯Ø®Ù„ات '%s' للعÙقدة '%s'." #: scene/animation/animation_tree.cpp msgid "No root AnimationNode for the graph is set." -msgstr "" +msgstr "لم يتم ØªØØ¯ÙŠØ¯ عÙقدة رئيسة لعÙقدة الرسومات Ø§Ù„Ù…ØªØØ±ÙƒØ© لأجل الرسم graph." #: scene/animation/animation_tree.cpp -#, fuzzy msgid "Path to an AnimationPlayer node containing animations is not set." -msgstr "ØØ¯Ø¯ مشغل ØØ±ÙƒØ© من شجرة المشهد لكي تعدل Ø§Ù„ØØ±ÙƒØ©." +msgstr "لم يتم ØªØØ¯ÙŠØ¯ مسار ÙŠØØªÙˆÙŠ Ø§Ø±Ø³ÙˆÙ…Ø§Øª Ø§Ù„Ù…ØªØØ±ÙƒØ© لعÙقدة Ù…ÙØ´ØºÙ„ الرسومات Ø§Ù„Ù…ØªØØ±ÙƒØ©." #: scene/animation/animation_tree.cpp msgid "Path set for AnimationPlayer does not lead to an AnimationPlayer node." msgstr "" +"المسار Ø§Ù„Ù…ÙØØ¯Ø¯ Ù„Ù…ÙØ´ØºÙ„ الرسومات Ø§Ù„Ù…ØªØØ±ÙƒØ© لا يقود إلى عÙقدة Ù…ÙØ´ØºÙ„ رسومات Ù…ÙØªØØ±ÙƒØ©." #: scene/animation/animation_tree.cpp -#, fuzzy msgid "The AnimationPlayer root node is not a valid node." -msgstr "شجرة Ø§Ù„ØØ±ÙƒØ© خاطئة." +msgstr "العÙقدة الرئيسة Ù„Ù…ÙØ´ØºÙ„ الرسومات Ø§Ù„Ù…ØªØØ±ÙƒØ© ليست عÙقدة ØµØ§Ù„ØØ©." #: scene/animation/animation_tree_player.cpp msgid "This node has been deprecated. Use AnimationTree instead." msgstr "" +"لقد تم إهمال هذه العÙقدةز استخدم شجرة الرسومات Ø§Ù„Ù…ØªØØ±ÙƒØ© AnimationTree بدلاً عن " +"ذلك." #: scene/gui/color_picker.cpp msgid "" @@ -12780,27 +12692,29 @@ msgid "" "LMB: Set color\n" "RMB: Remove preset" msgstr "" +"اللون: #%s\n" +"الزر الأيسر Ù„Ù„ÙØ£Ø±Ø©: ØªØØ¯ÙŠØ¯ اللون\n" +"الزر الأيمن Ù„Ù„ÙØ£Ø±Ø©: إزالة اللون Ø§Ù„ØØ§Ù„ÙŠ" #: scene/gui/color_picker.cpp msgid "Pick a color from the editor window." -msgstr "" +msgstr "اختر لوناً من Ù†Ø§ÙØ°Ø© Ø§Ù„Ù…ÙØØ±Ø±." #: scene/gui/color_picker.cpp msgid "HSV" -msgstr "" +msgstr "HSV" #: scene/gui/color_picker.cpp msgid "Raw" -msgstr "" +msgstr "خام" #: scene/gui/color_picker.cpp msgid "Switch between hexadecimal and code values." -msgstr "" +msgstr "بدّل بين القيم البرمجية والسداسية العشرية." #: scene/gui/color_picker.cpp -#, fuzzy msgid "Add current color as a preset." -msgstr "أض٠اللون Ø§Ù„ØØ§Ù„ÙŠ كإعداد مسبق" +msgstr "أض٠اللون Ø§Ù„ØØ§Ù„ÙŠ كإعداد مسبق." #: scene/gui/container.cpp msgid "" @@ -12821,7 +12735,7 @@ msgstr "تنبيه!" #: scene/gui/dialogs.cpp msgid "Please Confirm..." -msgstr "يرجى التاكيد..." +msgstr "ÙŠÙØ±Ø¬Ù‰ التأكيد..." #: scene/gui/popup.cpp msgid "" @@ -12843,7 +12757,7 @@ msgstr "" #: scene/gui/tree.cpp msgid "(Other)" -msgstr "" +msgstr "(أخرى)" #: scene/main/scene_tree.cpp msgid "" @@ -12859,6 +12773,10 @@ msgid "" "texture to some node for display." msgstr "" +#: scene/main/viewport.cpp +msgid "Viewport size must be greater than 0 to render anything." +msgstr "ينبغي أن يكون ØØ¬Ù… إطار العرض أكبر من 0 ليتم الإخراج البصري لأي شيء." + #: scene/resources/visual_shader_nodes.cpp msgid "Invalid source for preview." msgstr "مصدر غير ØµØ§Ù„Ø Ù„Ù„Ù…Ø¹Ø§ÙŠÙ†Ø©." @@ -12869,11 +12787,11 @@ msgstr "مصدر غير ØµØ§Ù„Ø Ù„ØªØ¸Ù„ÙŠÙ„." #: scene/resources/visual_shader_nodes.cpp msgid "Invalid comparison function for that type." -msgstr "comparison function غير ØµØ§Ù„ØØ© لهذا النوع." +msgstr "ÙˆØ¸ÙŠÙØ© برمجية Ù…ÙقارÙنة غير ØµØ§Ù„ØØ© لأجل ذلك النوع." #: servers/visual/shader_language.cpp msgid "Assignment to function." -msgstr "التعيين لتعمل." +msgstr "تكليÙها Ù„ÙˆØ¸ÙŠÙØ© برمجية." #: servers/visual/shader_language.cpp msgid "Assignment to uniform." @@ -12887,6 +12805,9 @@ msgstr "يمكن تعيين المتغيرات Ùقط ÙÙŠ الذروة ." msgid "Constants cannot be modified." msgstr "لا يمكن تعديل الثوابت." +#~ msgid "Issue Tracker" +#~ msgstr "متتبع الأخطاء" + #~ msgid "Replaced %d occurrence(s)." #~ msgstr "Ø¥Ø³ØªØ¨ÙØ¯Ù„ %d ØØ§Ø¯Ø«Ø©(ØÙˆØ§Ø¯Ø«)." diff --git a/editor/translations/bg.po b/editor/translations/bg.po index 651776b6ab..c9be0c2c3f 100644 --- a/editor/translations/bg.po +++ b/editor/translations/bg.po @@ -6,14 +6,14 @@ # Иван Пенев (Ðдмирал ÐнимЕ) <aeternus.arcis@gmail.com>, 2016-2017. # Любомир ВаÑилев <lyubomirv@abv.bg>, 2018, 2020. # MaresPW <marespw206@gmail.com>, 2018. -# PakoSt <kokotekilata@gmail.com>, 2018. +# PakoSt <kokotekilata@gmail.com>, 2018, 2020. # Damyan Dichev <mwshock2@gmail.com>, 2019. msgid "" msgstr "" "Project-Id-Version: Godot Engine editor\n" "POT-Creation-Date: \n" -"PO-Revision-Date: 2020-02-28 13:33+0000\n" -"Last-Translator: Любомир ВаÑилев <lyubomirv@abv.bg>\n" +"PO-Revision-Date: 2020-03-27 15:42+0000\n" +"Last-Translator: PakoSt <kokotekilata@gmail.com>\n" "Language-Team: Bulgarian <https://hosted.weblate.org/projects/godot-engine/" "godot/bg/>\n" "Language: bg\n" @@ -42,11 +42,12 @@ msgstr "ÐедоÑтатъчно байтове за разкодиране ил #: core/math/expression.cpp msgid "Invalid input %i (not passed) in expression" -msgstr "" +msgstr "Ðеправилно въведени дани %i (не подаден) в израза" #: core/math/expression.cpp msgid "self can't be used because instance is null (not passed)" msgstr "" +"self не може да Ñе ползва, тъй като инÑтанциÑта е null (не е била подадена)" #: core/math/expression.cpp msgid "Invalid operands to operator %s, %s and %s." @@ -58,7 +59,7 @@ msgstr "Ðевалиден Ð¸Ð½Ð´ÐµÐºÑ Ð¾Ñ‚ тип %s за базов тип %s #: core/math/expression.cpp msgid "Invalid named index '%s' for base type %s" -msgstr "" +msgstr "Ðевалидно наименован Ð¸Ð½Ð´ÐµÐºÑ '%s' за базов тип %s" #: core/math/expression.cpp msgid "Invalid arguments to construct '%s'" @@ -66,7 +67,7 @@ msgstr "Ðеправилни аргументи за Ñъздаване на „ #: core/math/expression.cpp msgid "On call to '%s':" -msgstr "" +msgstr "При обаждане към '%s':" #: core/ustring.cpp msgid "B" @@ -118,15 +119,15 @@ msgstr "СтойноÑÑ‚:" #: editor/animation_bezier_editor.cpp msgid "Insert Key Here" -msgstr "" +msgstr "Вмъкване на ключ тук" #: editor/animation_bezier_editor.cpp msgid "Duplicate Selected Key(s)" -msgstr "" +msgstr "Копиране на избран(и) ключ(ове)" #: editor/animation_bezier_editor.cpp msgid "Delete Selected Key(s)" -msgstr "" +msgstr "Изтриване на избран(и) ключ(ове)" #: editor/animation_bezier_editor.cpp msgid "Add Bezier Point" @@ -138,31 +139,31 @@ msgstr "ПремеÑтване на точки на Безие" #: editor/animation_bezier_editor.cpp editor/animation_track_editor.cpp msgid "Anim Duplicate Keys" -msgstr "" +msgstr "Копиране на ключ(ове) (ÐнимациÑ)" #: editor/animation_bezier_editor.cpp editor/animation_track_editor.cpp msgid "Anim Delete Keys" -msgstr "" +msgstr "Изтриване на ключ(ове) (ÐнимациÑ)" #: editor/animation_track_editor.cpp msgid "Anim Change Keyframe Time" -msgstr "" +msgstr "ПромÑна на момент на ключов кадър (ÐнимациÑ)" #: editor/animation_track_editor.cpp msgid "Anim Change Transition" -msgstr "" +msgstr "ПромÑна на вид преход (ÐнимациÑ)" #: editor/animation_track_editor.cpp msgid "Anim Change Transform" -msgstr "" +msgstr "ПромÑна на транÑÑ„Ð¾Ñ€Ð¼Ð°Ñ†Ð¸Ñ (ÐнимациÑ)" #: editor/animation_track_editor.cpp msgid "Anim Change Keyframe Value" -msgstr "" +msgstr "ПромÑна на ÑтойноÑÑ‚ на ключов кадър (ÐнимациÑ)" #: editor/animation_track_editor.cpp msgid "Anim Change Call" -msgstr "" +msgstr "ПромÑна на повикана Ñ„ÑƒÐ½ÐºÑ†Ð¸Ñ (ÐнимациÑ)" #: editor/animation_track_editor.cpp msgid "Anim Multi Change Keyframe Time" @@ -1417,7 +1418,7 @@ msgstr "" msgid "Remove Autoload" msgstr "" -#: editor/editor_autoload_settings.cpp +#: editor/editor_autoload_settings.cpp editor/editor_plugin_settings.cpp msgid "Enable" msgstr "" @@ -2821,7 +2822,12 @@ msgid "Q&A" msgstr "" #: editor/editor_node.cpp -msgid "Issue Tracker" +#, fuzzy +msgid "Report a Bug" +msgstr "Повторно внаÑÑне" + +#: editor/editor_node.cpp +msgid "Send Docs Feedback" msgstr "" #: editor/editor_node.cpp editor/plugins/asset_library_editor_plugin.cpp @@ -3844,7 +3850,7 @@ msgid "Reimport" msgstr "Повторно внаÑÑне" #: editor/import_dock.cpp -msgid "Save scenes, re-import and restart" +msgid "Save Scenes, Re-Import, and Restart" msgstr "" #: editor/import_dock.cpp @@ -6694,14 +6700,6 @@ msgid "Open Godot online documentation." msgstr "ОтварÑне на документациÑта на Godot в Интернет." #: editor/plugins/script_editor_plugin.cpp -msgid "Request Docs" -msgstr "" - -#: editor/plugins/script_editor_plugin.cpp -msgid "Help improve the Godot documentation by giving feedback." -msgstr "" - -#: editor/plugins/script_editor_plugin.cpp msgid "Search the reference documentation." msgstr "" @@ -7139,6 +7137,10 @@ msgid "This operation requires a single selected node." msgstr "" #: editor/plugins/spatial_editor_plugin.cpp +msgid "Auto Orthogonal Enabled" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp msgid "Lock View Rotation" msgstr "" @@ -7230,13 +7232,13 @@ msgid "Freelook Slow Modifier" msgstr "Свободен Изглед Отпред" #: editor/plugins/spatial_editor_plugin.cpp -msgid "" -"Note: The FPS value displayed is the editor's framerate.\n" -"It cannot be used as a reliable indication of in-game performance." +msgid "View Rotation Locked" msgstr "" #: editor/plugins/spatial_editor_plugin.cpp -msgid "View Rotation Locked" +msgid "" +"Note: The FPS value displayed is the editor's framerate.\n" +"It cannot be used as a reliable indication of in-game performance." msgstr "" #: editor/plugins/spatial_editor_plugin.cpp @@ -9681,6 +9683,13 @@ msgid "" "Would you like to explore official example projects in the Asset Library?" msgstr "" +#: editor/project_manager.cpp +msgid "" +"The search box filters projects by name and last path component.\n" +"To filter projects by name and full path, the query must contain at least " +"one `/` character." +msgstr "" + #: editor/project_settings_editor.cpp msgid "Key " msgstr "" @@ -10656,6 +10665,12 @@ msgid "Script file already exists." msgstr "Група Ñ Ñ‚Ð¾Ð²Ð° име вече ÑъщеÑтвува." #: editor/script_create_dialog.cpp +msgid "" +"Note: Built-in scripts have some limitations and can't be edited using an " +"external editor." +msgstr "" + +#: editor/script_create_dialog.cpp #, fuzzy msgid "Class Name:" msgstr "КлаÑ:" @@ -10787,6 +10802,11 @@ msgid "Total:" msgstr "" #: editor/script_editor_debugger.cpp +#, fuzzy +msgid "Export list to a CSV file" +msgstr "ИзнаÑÑне на профила" + +#: editor/script_editor_debugger.cpp msgid "Resource Path" msgstr "" @@ -12375,6 +12395,10 @@ msgid "" "texture to some node for display." msgstr "" +#: scene/main/viewport.cpp +msgid "Viewport size must be greater than 0 to render anything." +msgstr "" + #: scene/resources/visual_shader_nodes.cpp msgid "Invalid source for preview." msgstr "" diff --git a/editor/translations/bn.po b/editor/translations/bn.po index 77ff28a113..3f5c140428 100644 --- a/editor/translations/bn.po +++ b/editor/translations/bn.po @@ -1537,7 +1537,7 @@ msgstr "Autoload সà§à¦¥à¦¾à¦¨à¦¾à¦¨à§à¦¤à¦° করà§à¦¨" msgid "Remove Autoload" msgstr "Autoload অপসারণ করà§à¦¨" -#: editor/editor_autoload_settings.cpp +#: editor/editor_autoload_settings.cpp editor/editor_plugin_settings.cpp msgid "Enable" msgstr "সকà§à¦°à¦¿à¦¯à¦¼ করà§à¦¨" @@ -3130,8 +3130,13 @@ msgid "Q&A" msgstr "Q&A" #: editor/editor_node.cpp -msgid "Issue Tracker" -msgstr "ইসà§à¦¯à§ টà§à¦°à§à¦¯à¦¾à¦•ার" +#, fuzzy +msgid "Report a Bug" +msgstr "পà§à¦¨-ইমà§à¦ªà§‹à¦°à§à¦Ÿ" + +#: editor/editor_node.cpp +msgid "Send Docs Feedback" +msgstr "" #: editor/editor_node.cpp editor/plugins/asset_library_editor_plugin.cpp msgid "Community" @@ -4291,7 +4296,7 @@ msgid "Reimport" msgstr "পà§à¦¨-ইমà§à¦ªà§‹à¦°à§à¦Ÿ" #: editor/import_dock.cpp -msgid "Save scenes, re-import and restart" +msgid "Save Scenes, Re-Import, and Restart" msgstr "" #: editor/import_dock.cpp @@ -7354,14 +7359,6 @@ msgid "Open Godot online documentation." msgstr "রেফারেনà§à¦¸à§‡à¦° ডকà§à¦®à§‡à¦¨à§à¦Ÿà§‡à¦¶à¦¨à§‡ খà§à¦à¦œà§à¦¨à¥¤" #: editor/plugins/script_editor_plugin.cpp -msgid "Request Docs" -msgstr "" - -#: editor/plugins/script_editor_plugin.cpp -msgid "Help improve the Godot documentation by giving feedback." -msgstr "" - -#: editor/plugins/script_editor_plugin.cpp msgid "Search the reference documentation." msgstr "রেফারেনà§à¦¸à§‡à¦° ডকà§à¦®à§‡à¦¨à§à¦Ÿà§‡à¦¶à¦¨à§‡ খà§à¦à¦œà§à¦¨à¥¤" @@ -7836,6 +7833,11 @@ msgstr "à¦à¦‡ কাজটি করার জনà§à¦¯ à¦à¦•টি à¦à¦•ক #: editor/plugins/spatial_editor_plugin.cpp #, fuzzy +msgid "Auto Orthogonal Enabled" +msgstr "সমকোণীয় (Orthogonal)" + +#: editor/plugins/spatial_editor_plugin.cpp +#, fuzzy msgid "Lock View Rotation" msgstr "তথà§à¦¯ দেখà§à¦¨" @@ -7935,17 +7937,17 @@ msgid "Freelook Slow Modifier" msgstr "ফà§à¦°à¦¿ লà§à¦• সà§à¦ªà¦¿à¦¡ মডিফায়ার" #: editor/plugins/spatial_editor_plugin.cpp +#, fuzzy +msgid "View Rotation Locked" +msgstr "তথà§à¦¯ দেখà§à¦¨" + +#: editor/plugins/spatial_editor_plugin.cpp msgid "" "Note: The FPS value displayed is the editor's framerate.\n" "It cannot be used as a reliable indication of in-game performance." msgstr "" #: editor/plugins/spatial_editor_plugin.cpp -#, fuzzy -msgid "View Rotation Locked" -msgstr "তথà§à¦¯ দেখà§à¦¨" - -#: editor/plugins/spatial_editor_plugin.cpp msgid "XForm Dialog" msgstr "XForm à¦à¦° সংলাপ" @@ -10557,6 +10559,13 @@ msgid "" "Would you like to explore official example projects in the Asset Library?" msgstr "" +#: editor/project_manager.cpp +msgid "" +"The search box filters projects by name and last path component.\n" +"To filter projects by name and full path, the query must contain at least " +"one `/` character." +msgstr "" + #: editor/project_settings_editor.cpp msgid "Key " msgstr "কী/চাবি " @@ -11620,6 +11629,12 @@ msgid "Script file already exists." msgstr "'%s' অà§à¦¯à¦¾à¦•শন ইতিমধà§à¦¯à§‡à¦‡ বিদà§à¦¯à¦®à¦¾à¦¨!" #: editor/script_create_dialog.cpp +msgid "" +"Note: Built-in scripts have some limitations and can't be edited using an " +"external editor." +msgstr "" + +#: editor/script_create_dialog.cpp #, fuzzy msgid "Class Name:" msgstr "কà§à¦²à¦¾à¦¸ নাম:" @@ -11756,6 +11771,11 @@ msgid "Total:" msgstr "সরà§à¦¬à¦®à§‹à¦Ÿ:" #: editor/script_editor_debugger.cpp +#, fuzzy +msgid "Export list to a CSV file" +msgstr "পà§à¦°à¦•লà§à¦ª à¦à¦•à§à¦¸à¦ªà§‹à¦°à§à¦Ÿ করà§à¦¨" + +#: editor/script_editor_debugger.cpp msgid "Resource Path" msgstr "রিসোরà§à¦¸-à¦à¦° পথ" @@ -13433,6 +13453,10 @@ msgstr "" "আকার ধারণ করতে পারে। অনà§à¦¯à¦¥à¦¾à§Ÿ, à¦à¦Ÿà¦¿à¦•ে à¦à¦•টি RenderTarget করà§à¦¨ à¦à¦¬à¦‚ à¦à¦° অà¦à§à¦¯à¦¨à§à¦¤à¦°à§€à¦£ " "দৃশà§à¦¯à¦¾à¦¬à¦²à¦¿à¦•ে (texture) দৃশà§à¦¯à¦®à¦¾à¦¨ করতে কোনো নোডে হসà§à¦¤à¦¾à¦¨à§à¦¤à¦° করà§à¦¨à¥¤" +#: scene/main/viewport.cpp +msgid "Viewport size must be greater than 0 to render anything." +msgstr "" + #: scene/resources/visual_shader_nodes.cpp #, fuzzy msgid "Invalid source for preview." @@ -13464,6 +13488,9 @@ msgstr "" msgid "Constants cannot be modified." msgstr "" +#~ msgid "Issue Tracker" +#~ msgstr "ইসà§à¦¯à§ টà§à¦°à§à¦¯à¦¾à¦•ার" + #~ msgid "Replaced %d occurrence(s)." #~ msgstr "%d সংখà§à¦¯à¦• সংঘটন পà§à¦°à¦¤à¦¿à¦¸à§à¦¥à¦¾à¦ªà¦¿à¦¤ হয়েছে ।" diff --git a/editor/translations/ca.po b/editor/translations/ca.po index 304fa8905b..a1577b5a15 100644 --- a/editor/translations/ca.po +++ b/editor/translations/ca.po @@ -1452,7 +1452,7 @@ msgstr "Mou l'AutoCà rrega" msgid "Remove Autoload" msgstr "Treu Autocà rrega" -#: editor/editor_autoload_settings.cpp +#: editor/editor_autoload_settings.cpp editor/editor_plugin_settings.cpp msgid "Enable" msgstr "Activa" @@ -2953,8 +2953,13 @@ msgid "Q&A" msgstr "Preguntes i Respostes" #: editor/editor_node.cpp -msgid "Issue Tracker" -msgstr "Seguiment d'Incidències" +#, fuzzy +msgid "Report a Bug" +msgstr "ReImportar" + +#: editor/editor_node.cpp +msgid "Send Docs Feedback" +msgstr "" #: editor/editor_node.cpp editor/plugins/asset_library_editor_plugin.cpp msgid "Community" @@ -4027,7 +4032,8 @@ msgid "Reimport" msgstr "ReImportar" #: editor/import_dock.cpp -msgid "Save scenes, re-import and restart" +#, fuzzy +msgid "Save Scenes, Re-Import, and Restart" msgstr "Guardar escenes, reimportar i reiniciar" #: editor/import_dock.cpp @@ -6956,15 +6962,6 @@ msgid "Open Godot online documentation." msgstr "Obrir la documentació en lÃnia de Godot." #: editor/plugins/script_editor_plugin.cpp -msgid "Request Docs" -msgstr "Sol·licitar Documentació" - -#: editor/plugins/script_editor_plugin.cpp -#, fuzzy -msgid "Help improve the Godot documentation by giving feedback." -msgstr "Ajudeu a millorar la documentació de Godot donant comentaris" - -#: editor/plugins/script_editor_plugin.cpp msgid "Search the reference documentation." msgstr "Cerca dins la documentació de referència." @@ -7416,6 +7413,11 @@ msgid "This operation requires a single selected node." msgstr "Aquesta operació requereix un únic node seleccionat." #: editor/plugins/spatial_editor_plugin.cpp +#, fuzzy +msgid "Auto Orthogonal Enabled" +msgstr "Ortogonal" + +#: editor/plugins/spatial_editor_plugin.cpp msgid "Lock View Rotation" msgstr "Bloquejar Rotació de la Vista" @@ -7507,6 +7509,10 @@ msgid "Freelook Slow Modifier" msgstr "Modificador de la Velocitat de la Vista Lliure" #: editor/plugins/spatial_editor_plugin.cpp +msgid "View Rotation Locked" +msgstr "Rotació de la Vista Bloquejada" + +#: editor/plugins/spatial_editor_plugin.cpp #, fuzzy msgid "" "Note: The FPS value displayed is the editor's framerate.\n" @@ -7516,10 +7522,6 @@ msgstr "" "No es pot utilitzar com una indicació fiable del rendiment en el joc." #: editor/plugins/spatial_editor_plugin.cpp -msgid "View Rotation Locked" -msgstr "Rotació de la Vista Bloquejada" - -#: editor/plugins/spatial_editor_plugin.cpp msgid "XForm Dialog" msgstr "Dià leg XForm" @@ -10187,6 +10189,13 @@ msgstr "" "Actualment no teniu cap projecte.\n" "Us agradaria explorar projectes d'exemple oficials a la biblioteca d'actius?" +#: editor/project_manager.cpp +msgid "" +"The search box filters projects by name and last path component.\n" +"To filter projects by name and full path, the query must contain at least " +"one `/` character." +msgstr "" + #: editor/project_settings_editor.cpp msgid "Key " msgstr "Tecla " @@ -11209,6 +11218,12 @@ msgid "Script file already exists." msgstr "L'Acció '%s' ja existeix!" #: editor/script_create_dialog.cpp +msgid "" +"Note: Built-in scripts have some limitations and can't be edited using an " +"external editor." +msgstr "" + +#: editor/script_create_dialog.cpp #, fuzzy msgid "Class Name:" msgstr "Nom de Classe" @@ -11343,6 +11358,11 @@ msgid "Total:" msgstr "Total:" #: editor/script_editor_debugger.cpp +#, fuzzy +msgid "Export list to a CSV file" +msgstr "Exportar Perfil" + +#: editor/script_editor_debugger.cpp msgid "Resource Path" msgstr "Camà de Recursos" @@ -13063,6 +13083,10 @@ msgstr "" "forma per tal d'obtenir-ne la mida. Altrament, establiu-la com a Destinació " "de Renderització i assigneu-ne la textura interna a algun node." +#: scene/main/viewport.cpp +msgid "Viewport size must be greater than 0 to render anything." +msgstr "" + #: scene/resources/visual_shader_nodes.cpp #, fuzzy msgid "Invalid source for preview." @@ -13093,6 +13117,16 @@ msgstr "" msgid "Constants cannot be modified." msgstr "Les constants no es poden modificar." +#~ msgid "Issue Tracker" +#~ msgstr "Seguiment d'Incidències" + +#~ msgid "Request Docs" +#~ msgstr "Sol·licitar Documentació" + +#, fuzzy +#~ msgid "Help improve the Godot documentation by giving feedback." +#~ msgstr "Ajudeu a millorar la documentació de Godot donant comentaris" + #~ msgid "Replaced %d occurrence(s)." #~ msgstr "%d ocurrència/es reemplaçades." diff --git a/editor/translations/cs.po b/editor/translations/cs.po index 595db1837f..566ff0c1e2 100644 --- a/editor/translations/cs.po +++ b/editor/translations/cs.po @@ -1455,7 +1455,7 @@ msgstr "PÅ™emÃstit Autoload" msgid "Remove Autoload" msgstr "Odstranit Autoload" -#: editor/editor_autoload_settings.cpp +#: editor/editor_autoload_settings.cpp editor/editor_plugin_settings.cpp msgid "Enable" msgstr "Povolit" @@ -2933,8 +2933,13 @@ msgid "Q&A" msgstr "Otázky a odpovÄ›di" #: editor/editor_node.cpp -msgid "Issue Tracker" -msgstr "Sledovánà chyb" +#, fuzzy +msgid "Report a Bug" +msgstr "Znovu importovat" + +#: editor/editor_node.cpp +msgid "Send Docs Feedback" +msgstr "" #: editor/editor_node.cpp editor/plugins/asset_library_editor_plugin.cpp msgid "Community" @@ -3972,7 +3977,7 @@ msgid "Reimport" msgstr "Znovu importovat" #: editor/import_dock.cpp -msgid "Save scenes, re-import and restart" +msgid "Save Scenes, Re-Import, and Restart" msgstr "" #: editor/import_dock.cpp @@ -6828,14 +6833,6 @@ msgid "Open Godot online documentation." msgstr "OtevÅ™Ãt online dokumentaci Godotu." #: editor/plugins/script_editor_plugin.cpp -msgid "Request Docs" -msgstr "Požádat o dokumentaci" - -#: editor/plugins/script_editor_plugin.cpp -msgid "Help improve the Godot documentation by giving feedback." -msgstr "" - -#: editor/plugins/script_editor_plugin.cpp msgid "Search the reference documentation." msgstr "Hledat v referenÄnà dokumentaci." @@ -7282,6 +7279,11 @@ msgstr "Tato operace vyžaduje jeden vybraný uzel." #: editor/plugins/spatial_editor_plugin.cpp #, fuzzy +msgid "Auto Orthogonal Enabled" +msgstr "OrtogonálnÃ" + +#: editor/plugins/spatial_editor_plugin.cpp +#, fuzzy msgid "Lock View Rotation" msgstr "Zobrazit informace" @@ -7372,17 +7374,17 @@ msgid "Freelook Slow Modifier" msgstr "Rychlost volného pohledu" #: editor/plugins/spatial_editor_plugin.cpp +#, fuzzy +msgid "View Rotation Locked" +msgstr "Zobrazit informace" + +#: editor/plugins/spatial_editor_plugin.cpp msgid "" "Note: The FPS value displayed is the editor's framerate.\n" "It cannot be used as a reliable indication of in-game performance." msgstr "" #: editor/plugins/spatial_editor_plugin.cpp -#, fuzzy -msgid "View Rotation Locked" -msgstr "Zobrazit informace" - -#: editor/plugins/spatial_editor_plugin.cpp msgid "XForm Dialog" msgstr "XForm Dialog" @@ -9914,6 +9916,13 @@ msgstr "" "V této chvÃli nemáte žádný projekt.\n" "PÅ™ejete si prozkoumat oficiálnà ukázkové projekty v knihovnÄ› assetů?" +#: editor/project_manager.cpp +msgid "" +"The search box filters projects by name and last path component.\n" +"To filter projects by name and full path, the query must contain at least " +"one `/` character." +msgstr "" + #: editor/project_settings_editor.cpp msgid "Key " msgstr "Klávesa " @@ -10904,6 +10913,12 @@ msgid "Script file already exists." msgstr "Soubor skriptu již existuje." #: editor/script_create_dialog.cpp +msgid "" +"Note: Built-in scripts have some limitations and can't be edited using an " +"external editor." +msgstr "" + +#: editor/script_create_dialog.cpp msgid "Class Name:" msgstr "Jméno tÅ™Ãdy:" @@ -11027,6 +11042,11 @@ msgid "Total:" msgstr "Celkem:" #: editor/script_editor_debugger.cpp +#, fuzzy +msgid "Export list to a CSV file" +msgstr "Exportovat profil" + +#: editor/script_editor_debugger.cpp msgid "Resource Path" msgstr "Cesta ke zdroji" @@ -12648,6 +12668,10 @@ msgstr "" "mohl zÃskat velikost. Jinak ho nastavte jako render target a pÅ™iÅ™aÄte jeho " "vnitÅ™nà texturu nÄ›jakému uzlu k zobrazenÃ." +#: scene/main/viewport.cpp +msgid "Viewport size must be greater than 0 to render anything." +msgstr "" + #: scene/resources/visual_shader_nodes.cpp #, fuzzy msgid "Invalid source for preview." @@ -12678,6 +12702,12 @@ msgstr "" msgid "Constants cannot be modified." msgstr "Konstanty nenà možné upravovat." +#~ msgid "Issue Tracker" +#~ msgstr "Sledovánà chyb" + +#~ msgid "Request Docs" +#~ msgstr "Požádat o dokumentaci" + #~ msgid "Replaced %d occurrence(s)." #~ msgstr "Nahrazeno %d výskytů." diff --git a/editor/translations/da.po b/editor/translations/da.po index 3d2c4cb48b..5e88313d95 100644 --- a/editor/translations/da.po +++ b/editor/translations/da.po @@ -1508,7 +1508,7 @@ msgstr "Flyt Autoload" msgid "Remove Autoload" msgstr "Fjern Autoload" -#: editor/editor_autoload_settings.cpp +#: editor/editor_autoload_settings.cpp editor/editor_plugin_settings.cpp msgid "Enable" msgstr "Aktivér" @@ -3041,8 +3041,13 @@ msgid "Q&A" msgstr "SpørgsmÃ¥l og Svar" #: editor/editor_node.cpp -msgid "Issue Tracker" -msgstr "Problem Tracker" +#, fuzzy +msgid "Report a Bug" +msgstr "Genimporter" + +#: editor/editor_node.cpp +msgid "Send Docs Feedback" +msgstr "" #: editor/editor_node.cpp editor/plugins/asset_library_editor_plugin.cpp msgid "Community" @@ -4132,7 +4137,7 @@ msgid "Reimport" msgstr "Genimporter" #: editor/import_dock.cpp -msgid "Save scenes, re-import and restart" +msgid "Save Scenes, Re-Import, and Restart" msgstr "" #: editor/import_dock.cpp @@ -7083,14 +7088,6 @@ msgid "Open Godot online documentation." msgstr "Ã…ben Seneste" #: editor/plugins/script_editor_plugin.cpp -msgid "Request Docs" -msgstr "" - -#: editor/plugins/script_editor_plugin.cpp -msgid "Help improve the Godot documentation by giving feedback." -msgstr "" - -#: editor/plugins/script_editor_plugin.cpp msgid "Search the reference documentation." msgstr "" @@ -7546,6 +7543,10 @@ msgid "This operation requires a single selected node." msgstr "" #: editor/plugins/spatial_editor_plugin.cpp +msgid "Auto Orthogonal Enabled" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp msgid "Lock View Rotation" msgstr "" @@ -7636,13 +7637,13 @@ msgid "Freelook Slow Modifier" msgstr "" #: editor/plugins/spatial_editor_plugin.cpp -msgid "" -"Note: The FPS value displayed is the editor's framerate.\n" -"It cannot be used as a reliable indication of in-game performance." +msgid "View Rotation Locked" msgstr "" #: editor/plugins/spatial_editor_plugin.cpp -msgid "View Rotation Locked" +msgid "" +"Note: The FPS value displayed is the editor's framerate.\n" +"It cannot be used as a reliable indication of in-game performance." msgstr "" #: editor/plugins/spatial_editor_plugin.cpp @@ -10148,6 +10149,13 @@ msgid "" "Would you like to explore official example projects in the Asset Library?" msgstr "" +#: editor/project_manager.cpp +msgid "" +"The search box filters projects by name and last path component.\n" +"To filter projects by name and full path, the query must contain at least " +"one `/` character." +msgstr "" + #: editor/project_settings_editor.cpp msgid "Key " msgstr "" @@ -11161,6 +11169,12 @@ msgid "Script file already exists." msgstr "Autoload '%s' eksisterer allerede!" #: editor/script_create_dialog.cpp +msgid "" +"Note: Built-in scripts have some limitations and can't be edited using an " +"external editor." +msgstr "" + +#: editor/script_create_dialog.cpp #, fuzzy msgid "Class Name:" msgstr "Klasse:" @@ -11296,6 +11310,11 @@ msgid "Total:" msgstr "" #: editor/script_editor_debugger.cpp +#, fuzzy +msgid "Export list to a CSV file" +msgstr "Eksporter Projekt" + +#: editor/script_editor_debugger.cpp msgid "Resource Path" msgstr "" @@ -12917,6 +12936,10 @@ msgstr "" "den kan opnÃ¥ en størrelse. Ellers gør den til en RenderTarget og tildel dens " "indre textur til en node sÃ¥ den kan vises." +#: scene/main/viewport.cpp +msgid "Viewport size must be greater than 0 to render anything." +msgstr "" + #: scene/resources/visual_shader_nodes.cpp #, fuzzy msgid "Invalid source for preview." @@ -12948,6 +12971,9 @@ msgstr "" msgid "Constants cannot be modified." msgstr "Konstanter kan ikke ændres." +#~ msgid "Issue Tracker" +#~ msgstr "Problem Tracker" + #~ msgid "Replaced %d occurrence(s)." #~ msgstr "Erstattede %d forekomst(er)." diff --git a/editor/translations/de.po b/editor/translations/de.po index 1520c3aa2a..86e7d09671 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-03-14 15:05+0000\n" -"Last-Translator: So Wieso <sowieso@dukun.de>\n" +"PO-Revision-Date: 2020-04-20 05:51+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-dev\n" +"X-Generator: Weblate 4.0.2-dev\n" #: core/math/expression.cpp modules/gdscript/gdscript_functions.cpp #: modules/visual_script/visual_script_builtin_funcs.cpp @@ -1494,7 +1494,7 @@ msgstr "Autoload verschieben" msgid "Remove Autoload" msgstr "Autoload entfernen" -#: editor/editor_autoload_settings.cpp +#: editor/editor_autoload_settings.cpp editor/editor_plugin_settings.cpp msgid "Enable" msgstr "Aktivieren" @@ -2992,8 +2992,12 @@ msgid "Q&A" msgstr "Fragen & Antworten" #: editor/editor_node.cpp -msgid "Issue Tracker" -msgstr "Problem-Melder" +msgid "Report a Bug" +msgstr "Fehler berichten" + +#: editor/editor_node.cpp +msgid "Send Docs Feedback" +msgstr "Dokumentationsvorschläge senden" #: editor/editor_node.cpp editor/plugins/asset_library_editor_plugin.cpp msgid "Community" @@ -4051,7 +4055,7 @@ msgid "Reimport" msgstr "Neuimport" #: editor/import_dock.cpp -msgid "Save scenes, re-import and restart" +msgid "Save Scenes, Re-Import, and Restart" msgstr "Szenen speichern, reimportieren und neu starten" #: editor/import_dock.cpp @@ -6920,15 +6924,6 @@ msgid "Open Godot online documentation." msgstr "Godot-Onlinedokumentation öffnen." #: editor/plugins/script_editor_plugin.cpp -msgid "Request Docs" -msgstr "Dokumentation anfragen" - -#: editor/plugins/script_editor_plugin.cpp -msgid "Help improve the Godot documentation by giving feedback." -msgstr "" -"Mithelfen die Godot-Dokumentation durch Meinungsäußerungen zu verbessern." - -#: editor/plugins/script_editor_plugin.cpp msgid "Search the reference documentation." msgstr "Durchsuche die Referenzdokumentation." @@ -7368,6 +7363,10 @@ msgid "This operation requires a single selected node." msgstr "Diese Aktion benötigt einen einzelnen ausgewählten Node." #: editor/plugins/spatial_editor_plugin.cpp +msgid "Auto Orthogonal Enabled" +msgstr "Auto-Orthogonal aktiviert" + +#: editor/plugins/spatial_editor_plugin.cpp msgid "Lock View Rotation" msgstr "Sichtrotation sperren" @@ -7456,6 +7455,10 @@ msgid "Freelook Slow Modifier" msgstr "Freisicht Trägheitsregler" #: editor/plugins/spatial_editor_plugin.cpp +msgid "View Rotation Locked" +msgstr "Sichtrotation gesperrt" + +#: editor/plugins/spatial_editor_plugin.cpp msgid "" "Note: The FPS value displayed is the editor's framerate.\n" "It cannot be used as a reliable indication of in-game performance." @@ -7464,10 +7467,6 @@ msgstr "" "Sie ist kein zuverlässiger Vergleichswert für die In-Spiel-Leistung." #: editor/plugins/spatial_editor_plugin.cpp -msgid "View Rotation Locked" -msgstr "Sichtrotation gesperrt" - -#: editor/plugins/spatial_editor_plugin.cpp msgid "XForm Dialog" msgstr "Transformationsdialog" @@ -9997,6 +9996,13 @@ msgstr "" "Sollen offizielle Beispielprojekte aus der Nutzerinhaltesammlung angezeigt " "werden?" +#: editor/project_manager.cpp +msgid "" +"The search box filters projects by name and last path component.\n" +"To filter projects by name and full path, the query must contain at least " +"one `/` character." +msgstr "" + #: editor/project_settings_editor.cpp msgid "Key " msgstr "Taste " @@ -10749,7 +10755,7 @@ msgstr "Node unter neues Node hängen" #: editor/scene_tree_dock.cpp msgid "Make Scene Root" -msgstr "Szenen-Wurzel erstellen" +msgstr "Als Szenen-Wurzel festlegen" #: editor/scene_tree_dock.cpp msgid "Merge From Scene" @@ -10989,6 +10995,14 @@ msgid "Script file already exists." msgstr "Skriptdatei existiert bereits." #: editor/script_create_dialog.cpp +msgid "" +"Note: Built-in scripts have some limitations and can't be edited using an " +"external editor." +msgstr "" +"Hinweis: Eingebettete Skripte unterliegen gewissen Einschränkungen und " +"können nicht mit einem externen Editor bearbeitet werden." + +#: editor/script_create_dialog.cpp msgid "Class Name:" msgstr "Klassenname:" @@ -11109,6 +11123,11 @@ msgid "Total:" msgstr "Insgesamt:" #: editor/script_editor_debugger.cpp +#, fuzzy +msgid "Export list to a CSV file" +msgstr "Profil exportieren" + +#: editor/script_editor_debugger.cpp msgid "Resource Path" msgstr "Ressourcenpfad" @@ -12797,6 +12816,11 @@ msgstr "" "Eigenschaft ‚Render Target‘ des Viewports aktiviert und seine Textur " "irgendeinem Node zum Anzeigen zugewiesen werden." +#: scene/main/viewport.cpp +msgid "Viewport size must be greater than 0 to render anything." +msgstr "" +"Die Größe des Viewports muss größer als 0 sein um etwas rendern zu können." + #: scene/resources/visual_shader_nodes.cpp msgid "Invalid source for preview." msgstr "Ungültige Quelle für Vorschau." @@ -12825,6 +12849,16 @@ msgstr "Varyings können nur in Vertex-Funktion zugewiesen werden." msgid "Constants cannot be modified." msgstr "Konstanten können nicht verändert werden." +#~ msgid "Issue Tracker" +#~ msgstr "Problem-Melder" + +#~ msgid "Request Docs" +#~ msgstr "Dokumentation anfragen" + +#~ msgid "Help improve the Godot documentation by giving feedback." +#~ msgstr "" +#~ "Mithelfen die Godot-Dokumentation durch Meinungsäußerungen zu verbessern." + #~ msgid "Replaced %d occurrence(s)." #~ msgstr "Suchbegriff wurde %d mal ersetzt." diff --git a/editor/translations/de_CH.po b/editor/translations/de_CH.po index 84e1dd1599..c86daa54dc 100644 --- a/editor/translations/de_CH.po +++ b/editor/translations/de_CH.po @@ -4,7 +4,6 @@ # This file is distributed under the same license as the Godot source code. # Christian Fisch <christian.fiesel@gmail.com>, 2016. # Nils <nfa106008@iet-gibb.ch>, 2020. -# anonymous <noreply@weblate.org>, 2020. # PagDev <pag.develop@gmail.com>, 2020. msgid "" msgstr "" @@ -1458,7 +1457,7 @@ msgstr "" msgid "Remove Autoload" msgstr "" -#: editor/editor_autoload_settings.cpp +#: editor/editor_autoload_settings.cpp editor/editor_plugin_settings.cpp msgid "Enable" msgstr "" @@ -2918,7 +2917,11 @@ msgid "Q&A" msgstr "" #: editor/editor_node.cpp -msgid "Issue Tracker" +msgid "Report a Bug" +msgstr "" + +#: editor/editor_node.cpp +msgid "Send Docs Feedback" msgstr "" #: editor/editor_node.cpp editor/plugins/asset_library_editor_plugin.cpp @@ -3992,7 +3995,7 @@ msgid "Reimport" msgstr "" #: editor/import_dock.cpp -msgid "Save scenes, re-import and restart" +msgid "Save Scenes, Re-Import, and Restart" msgstr "" #: editor/import_dock.cpp @@ -6925,14 +6928,6 @@ msgid "Open Godot online documentation." msgstr "" #: editor/plugins/script_editor_plugin.cpp -msgid "Request Docs" -msgstr "" - -#: editor/plugins/script_editor_plugin.cpp -msgid "Help improve the Godot documentation by giving feedback." -msgstr "" - -#: editor/plugins/script_editor_plugin.cpp msgid "Search the reference documentation." msgstr "" @@ -7378,6 +7373,10 @@ msgid "This operation requires a single selected node." msgstr "Bitte nur ein Node selektieren." #: editor/plugins/spatial_editor_plugin.cpp +msgid "Auto Orthogonal Enabled" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp msgid "Lock View Rotation" msgstr "" @@ -7468,13 +7467,13 @@ msgid "Freelook Slow Modifier" msgstr "" #: editor/plugins/spatial_editor_plugin.cpp -msgid "" -"Note: The FPS value displayed is the editor's framerate.\n" -"It cannot be used as a reliable indication of in-game performance." +msgid "View Rotation Locked" msgstr "" #: editor/plugins/spatial_editor_plugin.cpp -msgid "View Rotation Locked" +msgid "" +"Note: The FPS value displayed is the editor's framerate.\n" +"It cannot be used as a reliable indication of in-game performance." msgstr "" #: editor/plugins/spatial_editor_plugin.cpp @@ -9969,6 +9968,13 @@ msgid "" "Would you like to explore official example projects in the Asset Library?" msgstr "" +#: editor/project_manager.cpp +msgid "" +"The search box filters projects by name and last path component.\n" +"To filter projects by name and full path, the query must contain at least " +"one `/` character." +msgstr "" + #: editor/project_settings_editor.cpp msgid "Key " msgstr "Taste " @@ -10962,6 +10968,12 @@ msgid "Script file already exists." msgstr "" #: editor/script_create_dialog.cpp +msgid "" +"Note: Built-in scripts have some limitations and can't be edited using an " +"external editor." +msgstr "" + +#: editor/script_create_dialog.cpp msgid "Class Name:" msgstr "" @@ -11093,6 +11105,11 @@ msgid "Total:" msgstr "" #: editor/script_editor_debugger.cpp +#, fuzzy +msgid "Export list to a CSV file" +msgstr "Projekt exportieren" + +#: editor/script_editor_debugger.cpp msgid "Resource Path" msgstr "" @@ -12667,6 +12684,10 @@ msgid "" "texture to some node for display." msgstr "" +#: scene/main/viewport.cpp +msgid "Viewport size must be greater than 0 to render anything." +msgstr "" + #: scene/resources/visual_shader_nodes.cpp msgid "Invalid source for preview." msgstr "" diff --git a/editor/translations/editor.pot b/editor/translations/editor.pot index 232f6eb087..1302e33e47 100644 --- a/editor/translations/editor.pot +++ b/editor/translations/editor.pot @@ -1401,7 +1401,7 @@ msgstr "" msgid "Remove Autoload" msgstr "" -#: editor/editor_autoload_settings.cpp +#: editor/editor_autoload_settings.cpp editor/editor_plugin_settings.cpp msgid "Enable" msgstr "" @@ -2804,7 +2804,11 @@ msgid "Q&A" msgstr "" #: editor/editor_node.cpp -msgid "Issue Tracker" +msgid "Report a Bug" +msgstr "" + +#: editor/editor_node.cpp +msgid "Send Docs Feedback" msgstr "" #: editor/editor_node.cpp editor/plugins/asset_library_editor_plugin.cpp @@ -3825,7 +3829,7 @@ msgid "Reimport" msgstr "" #: editor/import_dock.cpp -msgid "Save scenes, re-import and restart" +msgid "Save Scenes, Re-Import, and Restart" msgstr "" #: editor/import_dock.cpp @@ -6607,14 +6611,6 @@ msgid "Open Godot online documentation." msgstr "" #: editor/plugins/script_editor_plugin.cpp -msgid "Request Docs" -msgstr "" - -#: editor/plugins/script_editor_plugin.cpp -msgid "Help improve the Godot documentation by giving feedback." -msgstr "" - -#: editor/plugins/script_editor_plugin.cpp msgid "Search the reference documentation." msgstr "" @@ -7044,6 +7040,10 @@ msgid "This operation requires a single selected node." msgstr "" #: editor/plugins/spatial_editor_plugin.cpp +msgid "Auto Orthogonal Enabled" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp msgid "Lock View Rotation" msgstr "" @@ -7132,13 +7132,13 @@ msgid "Freelook Slow Modifier" msgstr "" #: editor/plugins/spatial_editor_plugin.cpp -msgid "" -"Note: The FPS value displayed is the editor's framerate.\n" -"It cannot be used as a reliable indication of in-game performance." +msgid "View Rotation Locked" msgstr "" #: editor/plugins/spatial_editor_plugin.cpp -msgid "View Rotation Locked" +msgid "" +"Note: The FPS value displayed is the editor's framerate.\n" +"It cannot be used as a reliable indication of in-game performance." msgstr "" #: editor/plugins/spatial_editor_plugin.cpp @@ -9501,6 +9501,13 @@ msgid "" "Would you like to explore official example projects in the Asset Library?" msgstr "" +#: editor/project_manager.cpp +msgid "" +"The search box filters projects by name and last path component.\n" +"To filter projects by name and full path, the query must contain at least " +"one `/` character." +msgstr "" + #: editor/project_settings_editor.cpp msgid "Key " msgstr "" @@ -10456,6 +10463,12 @@ msgid "Script file already exists." msgstr "" #: editor/script_create_dialog.cpp +msgid "" +"Note: Built-in scripts have some limitations and can't be edited using an " +"external editor." +msgstr "" + +#: editor/script_create_dialog.cpp msgid "Class Name:" msgstr "" @@ -10576,6 +10589,10 @@ msgid "Total:" msgstr "" #: editor/script_editor_debugger.cpp +msgid "Export list to a CSV file" +msgstr "" + +#: editor/script_editor_debugger.cpp msgid "Resource Path" msgstr "" @@ -12069,6 +12086,10 @@ msgid "" "texture to some node for display." msgstr "" +#: scene/main/viewport.cpp +msgid "Viewport size must be greater than 0 to render anything." +msgstr "" + #: scene/resources/visual_shader_nodes.cpp msgid "Invalid source for preview." msgstr "" diff --git a/editor/translations/el.po b/editor/translations/el.po index fb9029a861..b01976c477 100644 --- a/editor/translations/el.po +++ b/editor/translations/el.po @@ -11,7 +11,7 @@ msgid "" msgstr "" "Project-Id-Version: Godot Engine editor\n" "POT-Creation-Date: \n" -"PO-Revision-Date: 2020-03-08 22:32+0000\n" +"PO-Revision-Date: 2020-04-20 05:51+0000\n" "Last-Translator: George Tsiamasiotis <gtsiam@windowslive.com>\n" "Language-Team: Greek <https://hosted.weblate.org/projects/godot-engine/godot/" "el/>\n" @@ -20,7 +20,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-dev\n" +"X-Generator: Weblate 4.0.2-dev\n" #: core/math/expression.cpp modules/gdscript/gdscript_functions.cpp #: modules/visual_script/visual_script_builtin_funcs.cpp @@ -1451,7 +1451,7 @@ msgstr "Μετακίνηση AutoLoad" msgid "Remove Autoload" msgstr "ΑφαίÏεση AutoLoad" -#: editor/editor_autoload_settings.cpp +#: editor/editor_autoload_settings.cpp editor/editor_plugin_settings.cpp msgid "Enable" msgstr "ΕνεÏγοποίηση" @@ -2951,8 +2951,12 @@ msgid "Q&A" msgstr "ΕÏωτήσεις & Απαντήσεις" #: editor/editor_node.cpp -msgid "Issue Tracker" -msgstr "ΔιαχείÏιση Ï€Ïοβλημάτων" +msgid "Report a Bug" +msgstr "ΑναφοÏά Σφάλματος" + +#: editor/editor_node.cpp +msgid "Send Docs Feedback" +msgstr "Αποστολή Σχολίων ΤεκμηÏίωσης" #: editor/editor_node.cpp editor/plugins/asset_library_editor_plugin.cpp msgid "Community" @@ -4013,8 +4017,8 @@ msgid "Reimport" msgstr "Επανεισαγωγή" #: editor/import_dock.cpp -msgid "Save scenes, re-import and restart" -msgstr "Αποθήκευση σκηνών, επανεισαγωγή και επανεκκίνηση" +msgid "Save Scenes, Re-Import, and Restart" +msgstr "Αποθήκευση Σκηνών, Επανεισαγωγή και Επανεκκίνηση" #: editor/import_dock.cpp msgid "Changing the type of an imported file requires editor restart." @@ -5992,9 +5996,8 @@ msgstr "" "Είναι η πιο ακÏιβής (αλλά αÏγότεÏη) επιλογή για εντοπισμό σÏγκÏουσης." #: editor/plugins/mesh_instance_editor_plugin.cpp -#, fuzzy msgid "Create Single Convex Collision Sibling" -msgstr "ΔημιουÏγία Μοναδικών ΚυÏτών Αδελφών ΣÏγκÏουσης" +msgstr "ΔημιουÏγία ÎœÎ¿Î½Î±Î´Î¹ÎºÎ¿Ï ÎšÏ…ÏÏ„Î¿Ï Î‘Î´ÎµÎ»Ï†Î¿Ï Î£ÏγκÏουσης" #: editor/plugins/mesh_instance_editor_plugin.cpp msgid "" @@ -6889,14 +6892,6 @@ msgid "Open Godot online documentation." msgstr "Άνοιγμα ηλεκτÏονικής τεκμηÏίωσης της Godot." #: editor/plugins/script_editor_plugin.cpp -msgid "Request Docs" -msgstr "Αίτηση ΤεκμηÏίωσης" - -#: editor/plugins/script_editor_plugin.cpp -msgid "Help improve the Godot documentation by giving feedback." -msgstr "Βοηθήστε στην βελτίωση της τεκμηÏίωσης σχολιάζοντας." - -#: editor/plugins/script_editor_plugin.cpp msgid "Search the reference documentation." msgstr "Αναζήτηση στην τεκμηÏίωση αναφοÏάς." @@ -7337,6 +7332,10 @@ msgid "This operation requires a single selected node." msgstr "Αυτή η λειτουÏγία απαιτεί Îναν μόνο επιλεγμÎνο κόμβο." #: editor/plugins/spatial_editor_plugin.cpp +msgid "Auto Orthogonal Enabled" +msgstr "Αυτόματη ΑξονομετÏική ΕνεÏγή" + +#: editor/plugins/spatial_editor_plugin.cpp msgid "Lock View Rotation" msgstr "Κλείδωμα ΠεÏιστÏοφής Î Ïοβολής" @@ -7425,6 +7424,10 @@ msgid "Freelook Slow Modifier" msgstr "ΑÏγός ΤÏοποποιητής ΕλεÏθεÏου Κοιτάγματος" #: editor/plugins/spatial_editor_plugin.cpp +msgid "View Rotation Locked" +msgstr "Κλείδωμα ΠεÏιστÏοφής" + +#: editor/plugins/spatial_editor_plugin.cpp msgid "" "Note: The FPS value displayed is the editor's framerate.\n" "It cannot be used as a reliable indication of in-game performance." @@ -7434,10 +7437,6 @@ msgstr "" "παιχνιδιοÏ." #: editor/plugins/spatial_editor_plugin.cpp -msgid "View Rotation Locked" -msgstr "Κλείδωμα ΠεÏιστÏοφής" - -#: editor/plugins/spatial_editor_plugin.cpp msgid "XForm Dialog" msgstr "Διάλογος XForm" @@ -9956,6 +9955,13 @@ msgstr "" "Δεν Îχετε κανÎνα ÎÏγο.\n" "ΘÎλετε να εξεÏευνήσετε μεÏικά επίσημα παÏαδείγματα στην βιβλιοθήκη πόÏων;" +#: editor/project_manager.cpp +msgid "" +"The search box filters projects by name and last path component.\n" +"To filter projects by name and full path, the query must contain at least " +"one `/` character." +msgstr "" + #: editor/project_settings_editor.cpp msgid "Key " msgstr "Κλειδί " @@ -10949,6 +10955,14 @@ msgid "Script file already exists." msgstr "ΥπαÏκτό αÏχείο δÎσμης ενεÏγειών." #: editor/script_create_dialog.cpp +msgid "" +"Note: Built-in scripts have some limitations and can't be edited using an " +"external editor." +msgstr "" +"Σημείωση: Οι ενσωματωμÎνες δÎσμες ενεÏγειών Îχουν πεÏιοÏισμοÏÏ‚ και δεν " +"μποÏοÏν να ανοιχτοÏν σε εξωτεÏικό επεξεÏγαστή." + +#: editor/script_create_dialog.cpp msgid "Class Name:" msgstr "Όνομα Κλάσης:" @@ -11071,6 +11085,11 @@ msgid "Total:" msgstr "Συνολικά:" #: editor/script_editor_debugger.cpp +#, fuzzy +msgid "Export list to a CSV file" +msgstr "Εξαγωγή Î Ïοφίλ" + +#: editor/script_editor_debugger.cpp msgid "Resource Path" msgstr "ΔιαδÏομή πόÏου" @@ -12446,6 +12465,8 @@ msgstr "" msgid "" "ConcavePolygonShape doesn't support RigidBody in another mode than static." msgstr "" +"Το ConcavePolygonShape δεν υποστηÏίζει το RigidBody εκτός της static " +"λειτουÏγίας." #: scene/3d/cpu_particles.cpp msgid "Nothing is visible because no mesh has been assigned." @@ -12749,6 +12770,12 @@ msgstr "" "μÎγεθος. Αλλιώς, κάντε το Îνα RenderTarget και οÏίστε το internal texture σε " "Îναν κόμβο για απεικόνιση." +#: scene/main/viewport.cpp +msgid "Viewport size must be greater than 0 to render anything." +msgstr "" +"Το μÎγεθος της οπτικής γωνίας Ï€ÏÎπει να είναι μεγαλÏτεÏο του 0 για να γίνει " +"απόδοση." + #: scene/resources/visual_shader_nodes.cpp msgid "Invalid source for preview." msgstr "ΆκυÏη πηγή για Ï€Ïοεπισκόπηση." @@ -12777,6 +12804,15 @@ msgstr "Τα «varying» μποÏοÏν να ανατεθοÏν μόνο στηΠmsgid "Constants cannot be modified." msgstr "Οι σταθεÏÎÏ‚ δεν μποÏοÏν να Ï„ÏοποποιηθοÏν." +#~ msgid "Issue Tracker" +#~ msgstr "ΔιαχείÏιση Ï€Ïοβλημάτων" + +#~ msgid "Request Docs" +#~ msgstr "Αίτηση ΤεκμηÏίωσης" + +#~ msgid "Help improve the Godot documentation by giving feedback." +#~ msgstr "Βοηθήστε στην βελτίωση της τεκμηÏίωσης σχολιάζοντας." + #~ msgid "Replaced %d occurrence(s)." #~ msgstr "Αντικαταστάθηκαν %d εμφανίσεις." diff --git a/editor/translations/eo.po b/editor/translations/eo.po index cd84f54a40..dc10209d18 100644 --- a/editor/translations/eo.po +++ b/editor/translations/eo.po @@ -1439,7 +1439,7 @@ msgstr "" msgid "Remove Autoload" msgstr "" -#: editor/editor_autoload_settings.cpp +#: editor/editor_autoload_settings.cpp editor/editor_plugin_settings.cpp msgid "Enable" msgstr "" @@ -2895,7 +2895,11 @@ msgid "Q&A" msgstr "" #: editor/editor_node.cpp -msgid "Issue Tracker" +msgid "Report a Bug" +msgstr "" + +#: editor/editor_node.cpp +msgid "Send Docs Feedback" msgstr "" #: editor/editor_node.cpp editor/plugins/asset_library_editor_plugin.cpp @@ -3929,7 +3933,7 @@ msgid "Reimport" msgstr "" #: editor/import_dock.cpp -msgid "Save scenes, re-import and restart" +msgid "Save Scenes, Re-Import, and Restart" msgstr "" #: editor/import_dock.cpp @@ -6727,15 +6731,6 @@ msgid "Open Godot online documentation." msgstr "" #: editor/plugins/script_editor_plugin.cpp -msgid "Request Docs" -msgstr "" - -#: editor/plugins/script_editor_plugin.cpp -#, fuzzy -msgid "Help improve the Godot documentation by giving feedback." -msgstr "Helpi plibonigi la Godotan dokumentadon per doni reagon." - -#: editor/plugins/script_editor_plugin.cpp #, fuzzy msgid "Search the reference documentation." msgstr "Serĉi la referencan dokumentadon." @@ -7167,6 +7162,10 @@ msgid "This operation requires a single selected node." msgstr "" #: editor/plugins/spatial_editor_plugin.cpp +msgid "Auto Orthogonal Enabled" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp msgid "Lock View Rotation" msgstr "" @@ -7255,13 +7254,13 @@ msgid "Freelook Slow Modifier" msgstr "" #: editor/plugins/spatial_editor_plugin.cpp -msgid "" -"Note: The FPS value displayed is the editor's framerate.\n" -"It cannot be used as a reliable indication of in-game performance." +msgid "View Rotation Locked" msgstr "" #: editor/plugins/spatial_editor_plugin.cpp -msgid "View Rotation Locked" +msgid "" +"Note: The FPS value displayed is the editor's framerate.\n" +"It cannot be used as a reliable indication of in-game performance." msgstr "" #: editor/plugins/spatial_editor_plugin.cpp @@ -9648,6 +9647,13 @@ msgid "" "Would you like to explore official example projects in the Asset Library?" msgstr "" +#: editor/project_manager.cpp +msgid "" +"The search box filters projects by name and last path component.\n" +"To filter projects by name and full path, the query must contain at least " +"one `/` character." +msgstr "" + #: editor/project_settings_editor.cpp msgid "Key " msgstr "" @@ -10606,6 +10612,12 @@ msgid "Script file already exists." msgstr "Grupa nomo jam ekzistas." #: editor/script_create_dialog.cpp +msgid "" +"Note: Built-in scripts have some limitations and can't be edited using an " +"external editor." +msgstr "" + +#: editor/script_create_dialog.cpp #, fuzzy msgid "Class Name:" msgstr "Nomo:" @@ -10732,6 +10744,10 @@ msgid "Total:" msgstr "" #: editor/script_editor_debugger.cpp +msgid "Export list to a CSV file" +msgstr "" + +#: editor/script_editor_debugger.cpp msgid "Resource Path" msgstr "" @@ -12237,6 +12253,10 @@ msgid "" "texture to some node for display." msgstr "" +#: scene/main/viewport.cpp +msgid "Viewport size must be greater than 0 to render anything." +msgstr "" + #: scene/resources/visual_shader_nodes.cpp #, fuzzy msgid "Invalid source for preview." @@ -12267,6 +12287,10 @@ msgstr "" msgid "Constants cannot be modified." msgstr "" +#, fuzzy +#~ msgid "Help improve the Godot documentation by giving feedback." +#~ msgstr "Helpi plibonigi la Godotan dokumentadon per doni reagon." + #~ msgid "Replaced %d occurrence(s)." #~ msgstr "AnstataÅigis %d apero(j)n." diff --git a/editor/translations/es.po b/editor/translations/es.po index 3bbe96bcb3..933cff80a4 100644 --- a/editor/translations/es.po +++ b/editor/translations/es.po @@ -43,11 +43,13 @@ # Dario <darlex259@gmail.com>, 2019. # Adolfo Jayme Barrientos <fitojb@ubuntu.com>, 2019. # Julián Luini <jluini@gmail.com>, 2020. +# Victor S. <victorstancioiu@gmail.com>, 2020. +# henry rujano herrera <rujhen@gmail.com>, 2020. msgid "" msgstr "" "Project-Id-Version: Godot Engine editor\n" "POT-Creation-Date: \n" -"PO-Revision-Date: 2020-03-11 12:20+0000\n" +"PO-Revision-Date: 2020-04-23 20:21+0000\n" "Last-Translator: Javier Ocampos <xavier.ocampos@gmail.com>\n" "Language-Team: Spanish <https://hosted.weblate.org/projects/godot-engine/" "godot/es/>\n" @@ -56,12 +58,13 @@ msgstr "" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=n != 1;\n" -"X-Generator: Weblate 4.0-dev\n" +"X-Generator: Weblate 4.0.2-dev\n" #: core/math/expression.cpp modules/gdscript/gdscript_functions.cpp #: modules/visual_script/visual_script_builtin_funcs.cpp msgid "Invalid type argument to convert(), use TYPE_* constants." -msgstr "Argumento de tipo inválido para convert(), utiliza constantes TYPE_*." +msgstr "" +"Tipo de argumento inválido para 'convert()', utiliza constantes TYPE_*." #: core/math/expression.cpp modules/gdscript/gdscript_functions.cpp msgid "Expected a string of length 1 (a character)." @@ -76,7 +79,7 @@ msgstr "" #: core/math/expression.cpp msgid "Invalid input %i (not passed) in expression" -msgstr "Entrada inválida %i (no pasó) en la expresión" +msgstr "Entrada inválida %i (no se pasó) en la expresión" #: core/math/expression.cpp msgid "self can't be used because instance is null (not passed)" @@ -1488,7 +1491,7 @@ msgstr "Mover Autoload" msgid "Remove Autoload" msgstr "Eliminar Autoload" -#: editor/editor_autoload_settings.cpp +#: editor/editor_autoload_settings.cpp editor/editor_plugin_settings.cpp msgid "Enable" msgstr "Activar" @@ -2990,8 +2993,12 @@ msgid "Q&A" msgstr "Preguntas y respuestas" #: editor/editor_node.cpp -msgid "Issue Tracker" -msgstr "Registro de problemas" +msgid "Report a Bug" +msgstr "Reportar un Bug" + +#: editor/editor_node.cpp +msgid "Send Docs Feedback" +msgstr "Enviar Feedback de la Documentación" #: editor/editor_node.cpp editor/plugins/asset_library_editor_plugin.cpp msgid "Community" @@ -4051,8 +4058,8 @@ msgid "Reimport" msgstr "Reimportar" #: editor/import_dock.cpp -msgid "Save scenes, re-import and restart" -msgstr "Guardar escenas, reimportar y reiniciar" +msgid "Save Scenes, Re-Import, and Restart" +msgstr "Guardar Escenas, Reimportar y Reiniciar" #: editor/import_dock.cpp msgid "Changing the type of an imported file requires editor restart." @@ -5264,8 +5271,8 @@ msgid "" "When active, moving Control nodes changes their anchors instead of their " "margins." msgstr "" -"Cuando esté activo, los nodos de Control en movimiento cambian sus anclas en " -"lugar de sus márgenes." +"Cuando está activo, el movimiento de los nodos de Control cambian sus " +"anclajes en lugar de sus márgenes." #: editor/plugins/canvas_item_editor_plugin.cpp msgid "Top Left" @@ -6921,14 +6928,6 @@ msgid "Open Godot online documentation." msgstr "Abrir la documentación en lÃnea de Godot." #: editor/plugins/script_editor_plugin.cpp -msgid "Request Docs" -msgstr "Solicitar Documentos" - -#: editor/plugins/script_editor_plugin.cpp -msgid "Help improve the Godot documentation by giving feedback." -msgstr "Ayuda a mejorar la documentación de Godot aportando retroalimentación." - -#: editor/plugins/script_editor_plugin.cpp msgid "Search the reference documentation." msgstr "Buscar en la documentación de referencia." @@ -7365,6 +7364,10 @@ msgid "This operation requires a single selected node." msgstr "Esta operación requiere un solo nodo seleccionado." #: editor/plugins/spatial_editor_plugin.cpp +msgid "Auto Orthogonal Enabled" +msgstr "Auto Ortogonal Activado" + +#: editor/plugins/spatial_editor_plugin.cpp msgid "Lock View Rotation" msgstr "Bloquear Rotación de Vista" @@ -7453,6 +7456,10 @@ msgid "Freelook Slow Modifier" msgstr "Modificador de Velocidad de Vista Libre" #: editor/plugins/spatial_editor_plugin.cpp +msgid "View Rotation Locked" +msgstr "Bloquear Rotación de Vista" + +#: editor/plugins/spatial_editor_plugin.cpp msgid "" "Note: The FPS value displayed is the editor's framerate.\n" "It cannot be used as a reliable indication of in-game performance." @@ -7461,10 +7468,6 @@ msgstr "" "No se puede utilizar como un indicador fiable del rendimiento en el juego." #: editor/plugins/spatial_editor_plugin.cpp -msgid "View Rotation Locked" -msgstr "Bloquear Rotación de Vista" - -#: editor/plugins/spatial_editor_plugin.cpp msgid "XForm Dialog" msgstr "Diálogo XForm" @@ -7823,7 +7826,7 @@ msgstr "Añadir Textura desde Archivo" #: editor/plugins/sprite_frames_editor_plugin.cpp msgid "Add Frames from a Sprite Sheet" -msgstr "Añadir Frames de un Sprite Sheet" +msgstr "Añadir Frames desde un Sprite Sheet" #: editor/plugins/sprite_frames_editor_plugin.cpp msgid "Insert Empty (Before)" @@ -8457,11 +8460,11 @@ msgstr "Editar Ãndice Z de Tile" #: editor/plugins/tile_set_editor_plugin.cpp msgid "Make Convex" -msgstr "Crear Convexo" +msgstr "Hacerlo Convexo" #: editor/plugins/tile_set_editor_plugin.cpp msgid "Make Concave" -msgstr "Crear Cóncavo" +msgstr "Hacerlo Cóncavo" #: editor/plugins/tile_set_editor_plugin.cpp msgid "Create Collision Polygon" @@ -9447,7 +9450,7 @@ msgstr "Editar Propiedad Visual" #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Visual Shader Mode Changed" -msgstr "Cambiar Modo de Visual Shader" +msgstr "El Modo de Visual Shader ha cambiado" #: editor/project_export.cpp msgid "Runnable" @@ -9518,7 +9521,7 @@ msgid "" "Only one preset per platform may be marked as runnable." msgstr "" "Si se selecciona, la plantilla estará disponible para su uso en un " -"despliegue con “un clickâ€.\n" +"despliegue con un clic.\n" "Sólo se puede marcar como ejecutable una plantilla por plataforma." #: editor/project_export.cpp @@ -9988,6 +9991,13 @@ msgstr "" "Actualmente no tienes ningún proyecto.\n" "¿Quieres explorar proyectos de ejemplo oficiales en la Biblioteca de Assets?" +#: editor/project_manager.cpp +msgid "" +"The search box filters projects by name and last path component.\n" +"To filter projects by name and full path, the query must contain at least " +"one `/` character." +msgstr "" + #: editor/project_settings_editor.cpp msgid "Key " msgstr "Tecla " @@ -10977,6 +10987,14 @@ msgid "Script file already exists." msgstr "El archivo de script ya existe." #: editor/script_create_dialog.cpp +msgid "" +"Note: Built-in scripts have some limitations and can't be edited using an " +"external editor." +msgstr "" +"Nota: Los scripts integrados tienen algunas limitaciones y no pueden ser " +"editados usando un editor externo." + +#: editor/script_create_dialog.cpp msgid "Class Name:" msgstr "Nombre de Clase:" @@ -11097,6 +11115,11 @@ msgid "Total:" msgstr "Total:" #: editor/script_editor_debugger.cpp +#, fuzzy +msgid "Export list to a CSV file" +msgstr "Exportar Perfil" + +#: editor/script_editor_debugger.cpp msgid "Resource Path" msgstr "Ruta de Recursos" @@ -12020,7 +12043,7 @@ msgid "" "Trying to build from a custom built template, but no version info for it " "exists. Please reinstall from the 'Project' menu." msgstr "" -"Intentando construir a partir de una plantilla personalizada, pero no existe " +"Se intentó construir a partir de una plantilla personalizada, pero no existe " "información de la versión para ello. Por favor, reinstala desde el menú " "'Proyecto'." @@ -12785,6 +12808,12 @@ msgstr "" "bien, conviértalo en un RenderTarget y asigne su textura interna a algún " "nodo para que se muestre." +#: scene/main/viewport.cpp +msgid "Viewport size must be greater than 0 to render anything." +msgstr "" +"El tamaño del Viewport debe ser mayor que 0 para poder renderizar cualquier " +"cosa." + #: scene/resources/visual_shader_nodes.cpp msgid "Invalid source for preview." msgstr "Fuente inválida para la vista previa." @@ -12813,6 +12842,16 @@ msgstr "Solo se pueden asignar variaciones en funciones de vértice." msgid "Constants cannot be modified." msgstr "Las constantes no pueden modificarse." +#~ msgid "Issue Tracker" +#~ msgstr "Registro de problemas" + +#~ msgid "Request Docs" +#~ msgstr "Solicitar Documentos" + +#~ msgid "Help improve the Godot documentation by giving feedback." +#~ msgstr "" +#~ "Ayuda a mejorar la documentación de Godot aportando retroalimentación." + #~ msgid "Replaced %d occurrence(s)." #~ msgstr "%d ocurrencia(s) reemplazada(s)." diff --git a/editor/translations/es_AR.po b/editor/translations/es_AR.po index 7781d59f34..bd6d934a59 100644 --- a/editor/translations/es_AR.po +++ b/editor/translations/es_AR.po @@ -18,7 +18,7 @@ msgid "" msgstr "" "Project-Id-Version: Godot Engine editor\n" "POT-Creation-Date: \n" -"PO-Revision-Date: 2020-03-11 12:20+0000\n" +"PO-Revision-Date: 2020-04-23 20:21+0000\n" "Last-Translator: Javier Ocampos <xavier.ocampos@gmail.com>\n" "Language-Team: Spanish (Argentina) <https://hosted.weblate.org/projects/" "godot-engine/godot/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-dev\n" +"X-Generator: Weblate 4.0.2-dev\n" #: core/math/expression.cpp modules/gdscript/gdscript_functions.cpp #: modules/visual_script/visual_script_builtin_funcs.cpp @@ -1457,7 +1457,7 @@ msgstr "Mover Autoload" msgid "Remove Autoload" msgstr "Quitar Autoload" -#: editor/editor_autoload_settings.cpp +#: editor/editor_autoload_settings.cpp editor/editor_plugin_settings.cpp msgid "Enable" msgstr "Activar" @@ -2954,8 +2954,13 @@ msgid "Q&A" msgstr "Q&A" #: editor/editor_node.cpp -msgid "Issue Tracker" -msgstr "Registro de problemas" +#, fuzzy +msgid "Report a Bug" +msgstr "Reimportar" + +#: editor/editor_node.cpp +msgid "Send Docs Feedback" +msgstr "" #: editor/editor_node.cpp editor/plugins/asset_library_editor_plugin.cpp msgid "Community" @@ -4015,7 +4020,8 @@ msgid "Reimport" msgstr "Reimportar" #: editor/import_dock.cpp -msgid "Save scenes, re-import and restart" +#, fuzzy +msgid "Save Scenes, Re-Import, and Restart" msgstr "Guardar escenas, reimportar y reiniciar" #: editor/import_dock.cpp @@ -6881,14 +6887,6 @@ msgid "Open Godot online documentation." msgstr "Abrir la documentación en lÃnea de Godot." #: editor/plugins/script_editor_plugin.cpp -msgid "Request Docs" -msgstr "Solicitar Docum." - -#: editor/plugins/script_editor_plugin.cpp -msgid "Help improve the Godot documentation by giving feedback." -msgstr "Ayudá a mejorar la documentación de Godot dando feedback." - -#: editor/plugins/script_editor_plugin.cpp msgid "Search the reference documentation." msgstr "Buscar en la documentación de referencia." @@ -7325,6 +7323,11 @@ 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" + +#: editor/plugins/spatial_editor_plugin.cpp msgid "Lock View Rotation" msgstr "Trabar Rotación de Vista" @@ -7413,6 +7416,10 @@ msgid "Freelook Slow Modifier" msgstr "Modificador de Velocidad de Vista Libre" #: editor/plugins/spatial_editor_plugin.cpp +msgid "View Rotation Locked" +msgstr "Rotación de Vista Trabada" + +#: editor/plugins/spatial_editor_plugin.cpp msgid "" "Note: The FPS value displayed is the editor's framerate.\n" "It cannot be used as a reliable indication of in-game performance." @@ -7421,10 +7428,6 @@ msgstr "" "No se puede utilizar como un indicador fiable del rendimiento en el juego." #: editor/plugins/spatial_editor_plugin.cpp -msgid "View Rotation Locked" -msgstr "Rotación de Vista Trabada" - -#: editor/plugins/spatial_editor_plugin.cpp msgid "XForm Dialog" msgstr "Dialogo XForm" @@ -8387,7 +8390,7 @@ msgstr "Crear PolÃgono Cóncavo" #: editor/plugins/tile_set_editor_plugin.cpp msgid "Make Polygon Convex" -msgstr "Crear PolÃgono Convexo" +msgstr "Hacer el PolÃgono Convexo" #: editor/plugins/tile_set_editor_plugin.cpp msgid "Remove Tile" @@ -9947,6 +9950,13 @@ msgstr "" "Actualmente no tenés ningún proyecto.\n" "¿Te gustarÃa explorar los ejemplos oficiales en la Biblioteca de Assets?" +#: editor/project_manager.cpp +msgid "" +"The search box filters projects by name and last path component.\n" +"To filter projects by name and full path, the query must contain at least " +"one `/` character." +msgstr "" + #: editor/project_settings_editor.cpp msgid "Key " msgstr "Tecla " @@ -10937,6 +10947,12 @@ msgid "Script file already exists." msgstr "El archivo de script ya existe." #: editor/script_create_dialog.cpp +msgid "" +"Note: Built-in scripts have some limitations and can't be edited using an " +"external editor." +msgstr "" + +#: editor/script_create_dialog.cpp msgid "Class Name:" msgstr "Nombre de Clase:" @@ -11057,6 +11073,11 @@ msgid "Total:" msgstr "Total:" #: editor/script_editor_debugger.cpp +#, fuzzy +msgid "Export list to a CSV file" +msgstr "Exportar Perfil" + +#: editor/script_editor_debugger.cpp msgid "Resource Path" msgstr "Ruta de Recursos" @@ -12736,6 +12757,10 @@ msgstr "" "pueda obtener un tamaño. Alternativamente, haz un RenderTarget y asigna su " "textura interna a algún otro nodo para mostrar." +#: scene/main/viewport.cpp +msgid "Viewport size must be greater than 0 to render anything." +msgstr "" + #: scene/resources/visual_shader_nodes.cpp msgid "Invalid source for preview." msgstr "Fuente inválida para la vista previa." @@ -12764,6 +12789,15 @@ msgstr "Solo se pueden asignar variaciones en funciones de vértice." msgid "Constants cannot be modified." msgstr "Las constantes no pueden modificarse." +#~ msgid "Issue Tracker" +#~ msgstr "Registro de problemas" + +#~ msgid "Request Docs" +#~ msgstr "Solicitar Docum." + +#~ msgid "Help improve the Godot documentation by giving feedback." +#~ msgstr "Ayudá a mejorar la documentación de Godot dando feedback." + #~ msgid "Replaced %d occurrence(s)." #~ msgstr "%d ocurrencia(s) Reemplazadas." diff --git a/editor/translations/et.po b/editor/translations/et.po index 9b9d9b9137..2ed8f83317 100644 --- a/editor/translations/et.po +++ b/editor/translations/et.po @@ -1409,7 +1409,7 @@ msgstr "" msgid "Remove Autoload" msgstr "" -#: editor/editor_autoload_settings.cpp +#: editor/editor_autoload_settings.cpp editor/editor_plugin_settings.cpp msgid "Enable" msgstr "" @@ -2816,7 +2816,11 @@ msgid "Q&A" msgstr "" #: editor/editor_node.cpp -msgid "Issue Tracker" +msgid "Report a Bug" +msgstr "" + +#: editor/editor_node.cpp +msgid "Send Docs Feedback" msgstr "" #: editor/editor_node.cpp editor/plugins/asset_library_editor_plugin.cpp @@ -3838,7 +3842,7 @@ msgid "Reimport" msgstr "" #: editor/import_dock.cpp -msgid "Save scenes, re-import and restart" +msgid "Save Scenes, Re-Import, and Restart" msgstr "" #: editor/import_dock.cpp @@ -6626,14 +6630,6 @@ msgid "Open Godot online documentation." msgstr "" #: editor/plugins/script_editor_plugin.cpp -msgid "Request Docs" -msgstr "" - -#: editor/plugins/script_editor_plugin.cpp -msgid "Help improve the Godot documentation by giving feedback." -msgstr "" - -#: editor/plugins/script_editor_plugin.cpp msgid "Search the reference documentation." msgstr "" @@ -7064,6 +7060,10 @@ msgid "This operation requires a single selected node." msgstr "" #: editor/plugins/spatial_editor_plugin.cpp +msgid "Auto Orthogonal Enabled" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp msgid "Lock View Rotation" msgstr "" @@ -7152,13 +7152,13 @@ msgid "Freelook Slow Modifier" msgstr "" #: editor/plugins/spatial_editor_plugin.cpp -msgid "" -"Note: The FPS value displayed is the editor's framerate.\n" -"It cannot be used as a reliable indication of in-game performance." +msgid "View Rotation Locked" msgstr "" #: editor/plugins/spatial_editor_plugin.cpp -msgid "View Rotation Locked" +msgid "" +"Note: The FPS value displayed is the editor's framerate.\n" +"It cannot be used as a reliable indication of in-game performance." msgstr "" #: editor/plugins/spatial_editor_plugin.cpp @@ -9524,6 +9524,13 @@ msgid "" "Would you like to explore official example projects in the Asset Library?" msgstr "" +#: editor/project_manager.cpp +msgid "" +"The search box filters projects by name and last path component.\n" +"To filter projects by name and full path, the query must contain at least " +"one `/` character." +msgstr "" + #: editor/project_settings_editor.cpp msgid "Key " msgstr "" @@ -10481,6 +10488,12 @@ msgid "Script file already exists." msgstr "" #: editor/script_create_dialog.cpp +msgid "" +"Note: Built-in scripts have some limitations and can't be edited using an " +"external editor." +msgstr "" + +#: editor/script_create_dialog.cpp msgid "Class Name:" msgstr "" @@ -10602,6 +10615,10 @@ msgid "Total:" msgstr "" #: editor/script_editor_debugger.cpp +msgid "Export list to a CSV file" +msgstr "" + +#: editor/script_editor_debugger.cpp msgid "Resource Path" msgstr "" @@ -12100,6 +12117,10 @@ msgid "" "texture to some node for display." msgstr "" +#: scene/main/viewport.cpp +msgid "Viewport size must be greater than 0 to render anything." +msgstr "" + #: scene/resources/visual_shader_nodes.cpp msgid "Invalid source for preview." msgstr "" diff --git a/editor/translations/eu.po b/editor/translations/eu.po index 1075a4a046..f633f1c298 100644 --- a/editor/translations/eu.po +++ b/editor/translations/eu.po @@ -1406,7 +1406,7 @@ msgstr "" msgid "Remove Autoload" msgstr "" -#: editor/editor_autoload_settings.cpp +#: editor/editor_autoload_settings.cpp editor/editor_plugin_settings.cpp msgid "Enable" msgstr "" @@ -2809,7 +2809,11 @@ msgid "Q&A" msgstr "" #: editor/editor_node.cpp -msgid "Issue Tracker" +msgid "Report a Bug" +msgstr "" + +#: editor/editor_node.cpp +msgid "Send Docs Feedback" msgstr "" #: editor/editor_node.cpp editor/plugins/asset_library_editor_plugin.cpp @@ -3830,7 +3834,7 @@ msgid "Reimport" msgstr "" #: editor/import_dock.cpp -msgid "Save scenes, re-import and restart" +msgid "Save Scenes, Re-Import, and Restart" msgstr "" #: editor/import_dock.cpp @@ -6612,14 +6616,6 @@ msgid "Open Godot online documentation." msgstr "" #: editor/plugins/script_editor_plugin.cpp -msgid "Request Docs" -msgstr "" - -#: editor/plugins/script_editor_plugin.cpp -msgid "Help improve the Godot documentation by giving feedback." -msgstr "" - -#: editor/plugins/script_editor_plugin.cpp msgid "Search the reference documentation." msgstr "" @@ -7049,6 +7045,10 @@ msgid "This operation requires a single selected node." msgstr "" #: editor/plugins/spatial_editor_plugin.cpp +msgid "Auto Orthogonal Enabled" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp msgid "Lock View Rotation" msgstr "" @@ -7137,13 +7137,13 @@ msgid "Freelook Slow Modifier" msgstr "" #: editor/plugins/spatial_editor_plugin.cpp -msgid "" -"Note: The FPS value displayed is the editor's framerate.\n" -"It cannot be used as a reliable indication of in-game performance." +msgid "View Rotation Locked" msgstr "" #: editor/plugins/spatial_editor_plugin.cpp -msgid "View Rotation Locked" +msgid "" +"Note: The FPS value displayed is the editor's framerate.\n" +"It cannot be used as a reliable indication of in-game performance." msgstr "" #: editor/plugins/spatial_editor_plugin.cpp @@ -9506,6 +9506,13 @@ msgid "" "Would you like to explore official example projects in the Asset Library?" msgstr "" +#: editor/project_manager.cpp +msgid "" +"The search box filters projects by name and last path component.\n" +"To filter projects by name and full path, the query must contain at least " +"one `/` character." +msgstr "" + #: editor/project_settings_editor.cpp msgid "Key " msgstr "" @@ -10461,6 +10468,12 @@ msgid "Script file already exists." msgstr "" #: editor/script_create_dialog.cpp +msgid "" +"Note: Built-in scripts have some limitations and can't be edited using an " +"external editor." +msgstr "" + +#: editor/script_create_dialog.cpp msgid "Class Name:" msgstr "" @@ -10581,6 +10594,10 @@ msgid "Total:" msgstr "" #: editor/script_editor_debugger.cpp +msgid "Export list to a CSV file" +msgstr "" + +#: editor/script_editor_debugger.cpp msgid "Resource Path" msgstr "" @@ -12074,6 +12091,10 @@ msgid "" "texture to some node for display." msgstr "" +#: scene/main/viewport.cpp +msgid "Viewport size must be greater than 0 to render anything." +msgstr "" + #: scene/resources/visual_shader_nodes.cpp msgid "Invalid source for preview." msgstr "" diff --git a/editor/translations/fa.po b/editor/translations/fa.po index caee80995e..2754720d3b 100644 --- a/editor/translations/fa.po +++ b/editor/translations/fa.po @@ -10,16 +10,15 @@ # sayyed hamed nasib <cghamed752@chmail.ir>, 2017. # Behrooz Kashani <bkashani@gmail.com>, 2018. # Mahdi <sadisticwarlock@gmail.com>, 2018. -# hpn33 <hamed.hpn332@gmail.com>, 2019. -# Focus <saeeddashticlash@gmail.com>, 2019. -# anonymous <noreply@weblate.org>, 2020. +# hpn33 <hamed.hpn332@gmail.com>, 2019, 2020. +# Focus <saeeddashticlash@gmail.com>, 2019, 2020. # mohamad por <mohamad24xx@gmail.com>, 2020. msgid "" msgstr "" "Project-Id-Version: Godot Engine editor\n" "POT-Creation-Date: \n" -"PO-Revision-Date: 2020-03-08 22:33+0000\n" -"Last-Translator: mohamad por <mohamad24xx@gmail.com>\n" +"PO-Revision-Date: 2020-04-23 20:21+0000\n" +"Last-Translator: Focus <saeeddashticlash@gmail.com>\n" "Language-Team: Persian <https://hosted.weblate.org/projects/godot-engine/" "godot/fa/>\n" "Language: fa\n" @@ -27,14 +26,13 @@ msgstr "" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=n > 1;\n" -"X-Generator: Weblate 4.0-dev\n" +"X-Generator: Weblate 4.0.2-dev\n" #: core/math/expression.cpp modules/gdscript/gdscript_functions.cpp #: modules/visual_script/visual_script_builtin_funcs.cpp -#, fuzzy msgid "Invalid type argument to convert(), use TYPE_* constants." msgstr "" -"نوع آرگومان برای متد ()convert ‌ نامعتبر است ،‌ از ثابت های *_TYPE‌ Ø§Ø³ØªÙØ§Ø¯Ù‡ " +"نوع ورودی برای متد ()convert ‌ نامعتبر است ،‌ از ثابت های *_TYPE‌ Ø§Ø³ØªÙØ§Ø¯Ù‡ " "کنید ." #: core/math/expression.cpp modules/gdscript/gdscript_functions.cpp @@ -1258,7 +1256,7 @@ msgstr "" #: editor/editor_asset_installer.cpp #: editor/plugins/asset_library_editor_plugin.cpp msgid "Success!" -msgstr "" +msgstr "موÙقیت!" #: editor/editor_asset_installer.cpp #, fuzzy @@ -1353,7 +1351,7 @@ msgstr "ØØ°Ù اثر" #: editor/editor_audio_buses.cpp msgid "Audio" -msgstr "" +msgstr "صدا" #: editor/editor_audio_buses.cpp msgid "Add Audio Bus" @@ -1497,7 +1495,7 @@ msgstr "" msgid "Remove Autoload" msgstr "" -#: editor/editor_autoload_settings.cpp +#: editor/editor_autoload_settings.cpp editor/editor_plugin_settings.cpp msgid "Enable" msgstr "" @@ -2906,6 +2904,7 @@ msgid "" msgstr "" #: editor/editor_node.cpp editor/script_create_dialog.cpp +#, fuzzy msgid "Editor" msgstr "ویرایشگر" @@ -2984,7 +2983,12 @@ msgid "Q&A" msgstr "" #: editor/editor_node.cpp -msgid "Issue Tracker" +#, fuzzy +msgid "Report a Bug" +msgstr "وارد کردن دوباره" + +#: editor/editor_node.cpp +msgid "Send Docs Feedback" msgstr "" #: editor/editor_node.cpp editor/plugins/asset_library_editor_plugin.cpp @@ -4071,7 +4075,7 @@ msgid "Reimport" msgstr "وارد کردن دوباره" #: editor/import_dock.cpp -msgid "Save scenes, re-import and restart" +msgid "Save Scenes, Re-Import, and Restart" msgstr "" #: editor/import_dock.cpp @@ -4637,7 +4641,7 @@ msgstr "" #: editor/plugins/animation_player_editor_plugin.cpp msgid "Animation" -msgstr "" +msgstr "انیمیشن" #: editor/plugins/animation_player_editor_plugin.cpp #, fuzzy @@ -7017,14 +7021,6 @@ msgid "Open Godot online documentation." msgstr "شمارش ها" #: editor/plugins/script_editor_plugin.cpp -msgid "Request Docs" -msgstr "" - -#: editor/plugins/script_editor_plugin.cpp -msgid "Help improve the Godot documentation by giving feedback." -msgstr "" - -#: editor/plugins/script_editor_plugin.cpp msgid "Search the reference documentation." msgstr "" @@ -7483,6 +7479,10 @@ msgid "This operation requires a single selected node." msgstr "" #: editor/plugins/spatial_editor_plugin.cpp +msgid "Auto Orthogonal Enabled" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp #, fuzzy msgid "Lock View Rotation" msgstr "بومی‌سازی" @@ -7578,17 +7578,17 @@ msgid "Freelook Slow Modifier" msgstr "غلطاندن به پایین." #: editor/plugins/spatial_editor_plugin.cpp +#, fuzzy +msgid "View Rotation Locked" +msgstr "بومی‌سازی" + +#: editor/plugins/spatial_editor_plugin.cpp msgid "" "Note: The FPS value displayed is the editor's framerate.\n" "It cannot be used as a reliable indication of in-game performance." msgstr "" #: editor/plugins/spatial_editor_plugin.cpp -#, fuzzy -msgid "View Rotation Locked" -msgstr "بومی‌سازی" - -#: editor/plugins/spatial_editor_plugin.cpp msgid "XForm Dialog" msgstr "" @@ -10102,6 +10102,13 @@ msgid "" "Would you like to explore official example projects in the Asset Library?" msgstr "" +#: editor/project_manager.cpp +msgid "" +"The search box filters projects by name and last path component.\n" +"To filter projects by name and full path, the query must contain at least " +"one `/` character." +msgstr "" + #: editor/project_settings_editor.cpp msgid "Key " msgstr "" @@ -10428,7 +10435,7 @@ msgstr "بارگیری خودکار" #: editor/project_settings_editor.cpp msgid "Plugins" -msgstr "" +msgstr "پلاگین ها" #: editor/property_editor.cpp msgid "Preset..." @@ -11119,6 +11126,12 @@ msgid "Script file already exists." msgstr "پیش از این وجود داشته است" #: editor/script_create_dialog.cpp +msgid "" +"Note: Built-in scripts have some limitations and can't be edited using an " +"external editor." +msgstr "" + +#: editor/script_create_dialog.cpp #, fuzzy msgid "Class Name:" msgstr "کلاس:" @@ -11254,6 +11267,11 @@ msgid "Total:" msgstr "" #: editor/script_editor_debugger.cpp +#, fuzzy +msgid "Export list to a CSV file" +msgstr "صدور پروژه" + +#: editor/script_editor_debugger.cpp msgid "Resource Path" msgstr "" @@ -12899,6 +12917,10 @@ msgstr "" "تا بتواند یک اندازه بگیرد. در غیر اینصورت، آن را یک RenderTarget قرار دهید Ùˆ " "Ø¨Ø§ÙØª داخلی آن را برای نمایش به تعدادی گره تخصیص دهید." +#: scene/main/viewport.cpp +msgid "Viewport size must be greater than 0 to render anything." +msgstr "" + #: scene/resources/visual_shader_nodes.cpp #, fuzzy msgid "Invalid source for preview." diff --git a/editor/translations/fi.po b/editor/translations/fi.po index 2798d56d28..af9486a2ad 100644 --- a/editor/translations/fi.po +++ b/editor/translations/fi.po @@ -14,7 +14,7 @@ msgid "" msgstr "" "Project-Id-Version: Godot Engine editor\n" "POT-Creation-Date: \n" -"PO-Revision-Date: 2020-03-14 15:05+0000\n" +"PO-Revision-Date: 2020-04-20 05:51+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 +23,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-dev\n" +"X-Generator: Weblate 4.0.2-dev\n" #: core/math/expression.cpp modules/gdscript/gdscript_functions.cpp #: modules/visual_script/visual_script_builtin_funcs.cpp @@ -1444,7 +1444,7 @@ msgstr "Siirrä automaattisesti ladattavaa" msgid "Remove Autoload" msgstr "Poista automaattinen lataus" -#: editor/editor_autoload_settings.cpp +#: editor/editor_autoload_settings.cpp editor/editor_plugin_settings.cpp msgid "Enable" msgstr "Ota käyttöön" @@ -2921,8 +2921,12 @@ msgid "Q&A" msgstr "Kysymykset ja vastaukset" #: editor/editor_node.cpp -msgid "Issue Tracker" -msgstr "Ilmoita viasta" +msgid "Report a Bug" +msgstr "Raportoi bugi" + +#: editor/editor_node.cpp +msgid "Send Docs Feedback" +msgstr "Lähetä palautetta ohjeesta" #: editor/editor_node.cpp editor/plugins/asset_library_editor_plugin.cpp msgid "Community" @@ -3976,7 +3980,7 @@ msgid "Reimport" msgstr "Tuo uudelleen" #: editor/import_dock.cpp -msgid "Save scenes, re-import and restart" +msgid "Save Scenes, Re-Import, and Restart" msgstr "Tallenna skenet, tuo uudelleen ja käynnistä uudelleen" #: editor/import_dock.cpp @@ -5537,7 +5541,7 @@ msgstr "Näytä origo" #: editor/plugins/canvas_item_editor_plugin.cpp msgid "Show Viewport" -msgstr "Näytä näyttöikkuna" +msgstr "Näytä näyttöruutu" #: editor/plugins/canvas_item_editor_plugin.cpp msgid "Show Group And Lock Icons" @@ -6836,14 +6840,6 @@ msgid "Open Godot online documentation." msgstr "Avaa Godotin online-dokumentaatio." #: editor/plugins/script_editor_plugin.cpp -msgid "Request Docs" -msgstr "Pyydä dokumentaatiota" - -#: editor/plugins/script_editor_plugin.cpp -msgid "Help improve the Godot documentation by giving feedback." -msgstr "Auta parantamaan Godotin dokumentaatiota antamalla palautetta." - -#: editor/plugins/script_editor_plugin.cpp msgid "Search the reference documentation." msgstr "Etsi dokumentaatiosta." @@ -7279,6 +7275,10 @@ msgid "This operation requires a single selected node." msgstr "Tämä toiminto vaatii yhden valitun solmun." #: editor/plugins/spatial_editor_plugin.cpp +msgid "Auto Orthogonal Enabled" +msgstr "Automaattinen ortogonaalinen päällä" + +#: editor/plugins/spatial_editor_plugin.cpp msgid "Lock View Rotation" msgstr "Lukitse näkymän kierto" @@ -7367,6 +7367,10 @@ msgid "Freelook Slow Modifier" msgstr "Liikkumisen hitauskerroin" #: editor/plugins/spatial_editor_plugin.cpp +msgid "View Rotation Locked" +msgstr "Näkymän kierto lukittu" + +#: editor/plugins/spatial_editor_plugin.cpp msgid "" "Note: The FPS value displayed is the editor's framerate.\n" "It cannot be used as a reliable indication of in-game performance." @@ -7375,10 +7379,6 @@ msgstr "" "Sitä ei voi käyttää luotettavana pelin sisäisenä tehokkuuden ilmaisimena." #: editor/plugins/spatial_editor_plugin.cpp -msgid "View Rotation Locked" -msgstr "Näkymän kierto lukittu" - -#: editor/plugins/spatial_editor_plugin.cpp msgid "XForm Dialog" msgstr "XForm-ikkuna" @@ -9892,6 +9892,13 @@ msgstr "" "Sinulla ei ole tällä hetkellä yhtään projekteja.\n" "Haluaisitko selata virallisia esimerkkiprojekteja Asset-kirjastosta?" +#: editor/project_manager.cpp +msgid "" +"The search box filters projects by name and last path component.\n" +"To filter projects by name and full path, the query must contain at least " +"one `/` character." +msgstr "" + #: editor/project_settings_editor.cpp msgid "Key " msgstr "Näppäin " @@ -10882,6 +10889,14 @@ msgid "Script file already exists." msgstr "Skriptitiedosto on jo olemassa." #: editor/script_create_dialog.cpp +msgid "" +"Note: Built-in scripts have some limitations and can't be edited using an " +"external editor." +msgstr "" +"Huom: sisäänrakennetuilla skripteillä on joitakin rajoituksia, eikä niitä " +"voi muokata ulkoisella editorilla." + +#: editor/script_create_dialog.cpp msgid "Class Name:" msgstr "Luokan nimi:" @@ -11002,6 +11017,11 @@ msgid "Total:" msgstr "Yhteensä:" #: editor/script_editor_debugger.cpp +#, fuzzy +msgid "Export list to a CSV file" +msgstr "Vie profiili" + +#: editor/script_editor_debugger.cpp msgid "Resource Path" msgstr "Resurssipolku" @@ -12661,6 +12681,11 @@ msgstr "" "saada koon. Muutoin tee siitä RenderTarget ja aseta sen sisäinen tekstuuri " "johonkin solmuun näkyväksi." +#: scene/main/viewport.cpp +msgid "Viewport size must be greater than 0 to render anything." +msgstr "" +"Näyttöruudun koko on oltava suurempi kuin 0, jotta mitään renderöidään." + #: scene/resources/visual_shader_nodes.cpp msgid "Invalid source for preview." msgstr "Virheellinen lähde esikatselulle." @@ -12689,6 +12714,15 @@ msgstr "Varying tyypin voi sijoittaa vain vertex-funktiossa." msgid "Constants cannot be modified." msgstr "Vakioita ei voi muokata." +#~ msgid "Issue Tracker" +#~ msgstr "Ilmoita viasta" + +#~ msgid "Request Docs" +#~ msgstr "Pyydä dokumentaatiota" + +#~ msgid "Help improve the Godot documentation by giving feedback." +#~ msgstr "Auta parantamaan Godotin dokumentaatiota antamalla palautetta." + #~ msgid "Replaced %d occurrence(s)." #~ msgstr "Korvattu %d osuvuutta." diff --git a/editor/translations/fil.po b/editor/translations/fil.po index 60445be723..32405930ea 100644 --- a/editor/translations/fil.po +++ b/editor/translations/fil.po @@ -1414,7 +1414,7 @@ msgstr "" msgid "Remove Autoload" msgstr "" -#: editor/editor_autoload_settings.cpp +#: editor/editor_autoload_settings.cpp editor/editor_plugin_settings.cpp msgid "Enable" msgstr "" @@ -2818,7 +2818,11 @@ msgid "Q&A" msgstr "" #: editor/editor_node.cpp -msgid "Issue Tracker" +msgid "Report a Bug" +msgstr "" + +#: editor/editor_node.cpp +msgid "Send Docs Feedback" msgstr "" #: editor/editor_node.cpp editor/plugins/asset_library_editor_plugin.cpp @@ -3841,7 +3845,7 @@ msgid "Reimport" msgstr "" #: editor/import_dock.cpp -msgid "Save scenes, re-import and restart" +msgid "Save Scenes, Re-Import, and Restart" msgstr "" #: editor/import_dock.cpp @@ -6628,14 +6632,6 @@ msgid "Open Godot online documentation." msgstr "" #: editor/plugins/script_editor_plugin.cpp -msgid "Request Docs" -msgstr "" - -#: editor/plugins/script_editor_plugin.cpp -msgid "Help improve the Godot documentation by giving feedback." -msgstr "" - -#: editor/plugins/script_editor_plugin.cpp msgid "Search the reference documentation." msgstr "" @@ -7065,6 +7061,10 @@ msgid "This operation requires a single selected node." msgstr "" #: editor/plugins/spatial_editor_plugin.cpp +msgid "Auto Orthogonal Enabled" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp msgid "Lock View Rotation" msgstr "" @@ -7153,13 +7153,13 @@ msgid "Freelook Slow Modifier" msgstr "" #: editor/plugins/spatial_editor_plugin.cpp -msgid "" -"Note: The FPS value displayed is the editor's framerate.\n" -"It cannot be used as a reliable indication of in-game performance." +msgid "View Rotation Locked" msgstr "" #: editor/plugins/spatial_editor_plugin.cpp -msgid "View Rotation Locked" +msgid "" +"Note: The FPS value displayed is the editor's framerate.\n" +"It cannot be used as a reliable indication of in-game performance." msgstr "" #: editor/plugins/spatial_editor_plugin.cpp @@ -9525,6 +9525,13 @@ msgid "" "Would you like to explore official example projects in the Asset Library?" msgstr "" +#: editor/project_manager.cpp +msgid "" +"The search box filters projects by name and last path component.\n" +"To filter projects by name and full path, the query must contain at least " +"one `/` character." +msgstr "" + #: editor/project_settings_editor.cpp msgid "Key " msgstr "" @@ -10480,6 +10487,12 @@ msgid "Script file already exists." msgstr "" #: editor/script_create_dialog.cpp +msgid "" +"Note: Built-in scripts have some limitations and can't be edited using an " +"external editor." +msgstr "" + +#: editor/script_create_dialog.cpp msgid "Class Name:" msgstr "" @@ -10601,6 +10614,10 @@ msgid "Total:" msgstr "" #: editor/script_editor_debugger.cpp +msgid "Export list to a CSV file" +msgstr "" + +#: editor/script_editor_debugger.cpp msgid "Resource Path" msgstr "" @@ -12098,6 +12115,10 @@ msgid "" "texture to some node for display." msgstr "" +#: scene/main/viewport.cpp +msgid "Viewport size must be greater than 0 to render anything." +msgstr "" + #: scene/resources/visual_shader_nodes.cpp msgid "Invalid source for preview." msgstr "" diff --git a/editor/translations/fr.po b/editor/translations/fr.po index 2c53fcb8e2..552da2cedf 100644 --- a/editor/translations/fr.po +++ b/editor/translations/fr.po @@ -70,12 +70,14 @@ # Camille Mohr-Daurat <pouleyketchoup@gmail.com>, 2019. # Pierre Stempin <pierre.stempin@gmail.com>, 2019. # Pierre Caye <pierrecaye@laposte.net>, 2020. +# Kevin Bouancheau <kevin.bouancheau@gmail.com>, 2020. +# LaurentOngaro <laurent@gameamea.com>, 2020. msgid "" msgstr "" "Project-Id-Version: Godot Engine editor\n" "POT-Creation-Date: \n" -"PO-Revision-Date: 2020-02-27 07:01+0000\n" -"Last-Translator: Pierre Caye <pierrecaye@laposte.net>\n" +"PO-Revision-Date: 2020-04-23 20:21+0000\n" +"Last-Translator: LaurentOngaro <laurent@gameamea.com>\n" "Language-Team: French <https://hosted.weblate.org/projects/godot-engine/" "godot/fr/>\n" "Language: fr\n" @@ -83,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-dev\n" +"X-Generator: Weblate 4.0.2-dev\n" #: core/math/expression.cpp modules/gdscript/gdscript_functions.cpp #: modules/visual_script/visual_script_builtin_funcs.cpp @@ -93,7 +95,7 @@ msgstr "" #: core/math/expression.cpp modules/gdscript/gdscript_functions.cpp msgid "Expected a string of length 1 (a character)." -msgstr "Attendu chaîne de longueur 1 (un caractère)." +msgstr "Une chaîne de caractères de longueur 1 est attendue (un caractère)." #: core/math/expression.cpp modules/gdscript/gdscript_functions.cpp #: modules/mono/glue/gd_glue.cpp @@ -103,11 +105,11 @@ msgstr "Pas assez d'octets pour le décodage, ou format non valide." #: core/math/expression.cpp msgid "Invalid input %i (not passed) in expression" -msgstr "Entrée non valide %i (pas passée) dans l’expression" +msgstr "Entrée non valide %i (non transmise) dans l’expression" #: core/math/expression.cpp msgid "self can't be used because instance is null (not passed)" -msgstr "self ne peut être utilisé car l'instance est null (pas passée)" +msgstr "self ne peut être utilisé car l'instance est nulle (non passée)" #: core/math/expression.cpp msgid "Invalid operands to operator %s, %s and %s." @@ -1518,7 +1520,7 @@ msgstr "Déplacer l'AutoLoad" msgid "Remove Autoload" msgstr "Supprimer l'AutoLoad" -#: editor/editor_autoload_settings.cpp +#: editor/editor_autoload_settings.cpp editor/editor_plugin_settings.cpp msgid "Enable" msgstr "Activer" @@ -2228,7 +2230,7 @@ msgstr "Nouvelle Fenêtre" #: editor/editor_node.cpp msgid "Imported resources can't be saved." -msgstr "Les ressources importés ne peuvent pas être sauvegarder." +msgstr "Les ressources importées ne peuvent pas être sauvegardées." #: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp #: scene/gui/dialogs.cpp @@ -3022,8 +3024,12 @@ msgid "Q&A" msgstr "Questions et réponses" #: editor/editor_node.cpp -msgid "Issue Tracker" -msgstr "Traqueur de problèmes" +msgid "Report a Bug" +msgstr "Signaler un bug" + +#: editor/editor_node.cpp +msgid "Send Docs Feedback" +msgstr "Envoyez vos retours sur la documentation" #: editor/editor_node.cpp editor/plugins/asset_library_editor_plugin.cpp msgid "Community" @@ -4085,8 +4091,8 @@ msgid "Reimport" msgstr "Réimporter" #: editor/import_dock.cpp -msgid "Save scenes, re-import and restart" -msgstr "Sauvegarde des scènes, réimportation et redémarrage" +msgid "Save Scenes, Re-Import, and Restart" +msgstr "Sauvegarder les scènes, Réimporter, et Redémarrer" #: editor/import_dock.cpp msgid "Changing the type of an imported file requires editor restart." @@ -6849,7 +6855,7 @@ msgstr "Basculer le tri alphabétique de la liste de méthodes." #: editor/plugins/script_editor_plugin.cpp msgid "Filter methods" -msgstr "Méthodes de filtrage" +msgstr "Filtrer les méthodes" #: editor/plugins/script_editor_plugin.cpp msgid "Sort" @@ -6966,14 +6972,6 @@ msgid "Open Godot online documentation." msgstr "Ouvrir la documentation de Godot en ligne." #: editor/plugins/script_editor_plugin.cpp -msgid "Request Docs" -msgstr "Demande de documentation" - -#: editor/plugins/script_editor_plugin.cpp -msgid "Help improve the Godot documentation by giving feedback." -msgstr "Aider à améliorer la documentation de Godot en donnant vos réactions." - -#: editor/plugins/script_editor_plugin.cpp msgid "Search the reference documentation." msgstr "Rechercher dans la documentation de référence." @@ -7413,6 +7411,10 @@ msgstr "" "sélectionné." #: editor/plugins/spatial_editor_plugin.cpp +msgid "Auto Orthogonal Enabled" +msgstr "Auto Orthogonal Activé" + +#: editor/plugins/spatial_editor_plugin.cpp msgid "Lock View Rotation" msgstr "Verrouiller la rotation de la vue" @@ -7501,6 +7503,10 @@ msgid "Freelook Slow Modifier" msgstr "Modificateur de vitesse de la vue libre" #: editor/plugins/spatial_editor_plugin.cpp +msgid "View Rotation Locked" +msgstr "Verrouiller la rotation de la vue" + +#: 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." @@ -7510,10 +7516,6 @@ msgstr "" "jeu." #: editor/plugins/spatial_editor_plugin.cpp -msgid "View Rotation Locked" -msgstr "Verrouiller la rotation de la vue" - -#: editor/plugins/spatial_editor_plugin.cpp msgid "XForm Dialog" msgstr "Dialogue XForm" @@ -9694,7 +9696,7 @@ msgstr "Fichier ZIP" #: editor/project_export.cpp msgid "Godot Game Pack" -msgstr "Données de jeu Godot" +msgstr "Archive Godot" #: editor/project_export.cpp msgid "Export templates for this platform are missing:" @@ -10046,6 +10048,17 @@ msgstr "" "Vous n'avez pour l'instant aucun projets.\n" "Voulez-vous explorer des exemples de projets officiels dans l'Asset Library ?" +#: editor/project_manager.cpp +msgid "" +"The search box filters projects by name and last path component.\n" +"To filter projects by name and full path, the query must contain at least " +"one `/` character." +msgstr "" +"La barre de recherche filtre les projets par leur nom et la dernière partie " +"de leur chemin d'accès.\n" +"Pour filter les projects par leur nom et le chemin d'accès complet, la " +"recherche doit inclure au moins un caractère `/`." + #: editor/project_settings_editor.cpp msgid "Key " msgstr "Touche " @@ -10248,19 +10261,19 @@ msgstr "Ajouter un chemin remappé" #: editor/project_settings_editor.cpp msgid "Resource Remap Add Remap" -msgstr "Réaffectation des ressources ; Ajouter une réaffectation" +msgstr "Réaffectation (remap) des ressources ; Ajouter une réaffectation" #: editor/project_settings_editor.cpp msgid "Change Resource Remap Language" -msgstr "Modifier le langage de réaffectation des ressources" +msgstr "Modifier le langage de réaffectation (remap) des ressources" #: editor/project_settings_editor.cpp msgid "Remove Resource Remap" -msgstr "Supprimer la réaffectation des ressources" +msgstr "Supprimer la réaffectation (remap) des ressources" #: editor/project_settings_editor.cpp msgid "Remove Resource Remap Option" -msgstr "Supprimer option de remap de ressource" +msgstr "Supprimer l'option de réaffectation (remap) de ressource" #: editor/project_settings_editor.cpp msgid "Changed Locale Filter" @@ -10268,7 +10281,7 @@ msgstr "Filtre de langue modifié" #: editor/project_settings_editor.cpp msgid "Changed Locale Filter Mode" -msgstr "Changé le mode de filtrage des langues" +msgstr "Mode de filtrage des langues modifié" #: editor/project_settings_editor.cpp msgid "Project Settings (project.godot)" @@ -10280,7 +10293,7 @@ msgstr "Général" #: editor/project_settings_editor.cpp msgid "Override For..." -msgstr "Écraser pour…" +msgstr "Surcharge pour…" #: editor/project_settings_editor.cpp editor/settings_config_dialog.cpp msgid "The editor must be restarted for changes to take effect." @@ -10324,7 +10337,7 @@ msgstr "Traductions :" #: editor/project_settings_editor.cpp msgid "Remaps" -msgstr "Remaps" +msgstr "Réaffectation" #: editor/project_settings_editor.cpp msgid "Resources:" @@ -10332,7 +10345,7 @@ msgstr "Ressources :" #: editor/project_settings_editor.cpp msgid "Remaps by Locale:" -msgstr "Remaps par langue :" +msgstr "Réaffectations (remaps) par langue :" #: editor/project_settings_editor.cpp msgid "Locale" @@ -10496,7 +10509,7 @@ msgstr "Valeur par laquelle le compteur est incrémenté pour chaque nÅ“ud" #: editor/rename_dialog.cpp msgid "Padding" -msgstr "Remplissage" +msgstr "Remplissage(Padding)" #: editor/rename_dialog.cpp msgid "" @@ -11034,6 +11047,14 @@ msgid "Script file already exists." msgstr "Le fichier de script existe déjà ." #: editor/script_create_dialog.cpp +msgid "" +"Note: Built-in scripts have some limitations and can't be edited using an " +"external editor." +msgstr "" +"Remarque : les scripts intégrés ont certaines limitations et ne peuvent pas " +"être modifiés à l'aide d'un éditeur externe." + +#: editor/script_create_dialog.cpp msgid "Class Name:" msgstr "Nom de la classe :" @@ -11155,6 +11176,10 @@ msgid "Total:" msgstr "Total :" #: editor/script_editor_debugger.cpp +msgid "Export list to a CSV file" +msgstr "Exporter la liste en fichier CSV" + +#: editor/script_editor_debugger.cpp msgid "Resource Path" msgstr "Chemin de la ressource" @@ -12543,6 +12568,8 @@ msgstr "" msgid "" "ConcavePolygonShape doesn't support RigidBody in another mode than static." msgstr "" +"ConcavePolygonShape ne supporte pas RigidBody dans un autre mode que le mode " +"statique." #: scene/3d/cpu_particles.cpp msgid "Nothing is visible because no mesh has been assigned." @@ -12851,6 +12878,12 @@ msgstr "" "nÅ“ud de type Control afin qu'il en obtienne une taille. Sinon, faites-en une " "RenderTarget et assignez sa texture à un nÅ“ud pouvant l'afficher." +#: scene/main/viewport.cpp +msgid "Viewport size must be greater than 0 to render anything." +msgstr "" +"La taille de la fenêtre d'affichage doit être supérieure à 0 pour pouvoir " +"afficher quoi que ce soit." + #: scene/resources/visual_shader_nodes.cpp msgid "Invalid source for preview." msgstr "Source invalide pour la prévisualisation." @@ -12879,6 +12912,16 @@ msgstr "Les variations ne peuvent être affectées que dans la fonction vertex." msgid "Constants cannot be modified." msgstr "Les constantes ne peuvent être modifiées." +#~ msgid "Issue Tracker" +#~ msgstr "Traqueur de problèmes" + +#~ msgid "Request Docs" +#~ msgstr "Demande de documentation" + +#~ msgid "Help improve the Godot documentation by giving feedback." +#~ msgstr "" +#~ "Aider à améliorer la documentation de Godot en donnant vos réactions." + #~ msgid "Replaced %d occurrence(s)." #~ msgstr "%d occurrence(s) remplacée(s)." diff --git a/editor/translations/ga.po b/editor/translations/ga.po index e4e77fffc1..7b271f6a77 100644 --- a/editor/translations/ga.po +++ b/editor/translations/ga.po @@ -1408,7 +1408,7 @@ msgstr "" msgid "Remove Autoload" msgstr "" -#: editor/editor_autoload_settings.cpp +#: editor/editor_autoload_settings.cpp editor/editor_plugin_settings.cpp msgid "Enable" msgstr "" @@ -2812,7 +2812,11 @@ msgid "Q&A" msgstr "" #: editor/editor_node.cpp -msgid "Issue Tracker" +msgid "Report a Bug" +msgstr "" + +#: editor/editor_node.cpp +msgid "Send Docs Feedback" msgstr "" #: editor/editor_node.cpp editor/plugins/asset_library_editor_plugin.cpp @@ -3836,7 +3840,7 @@ msgid "Reimport" msgstr "" #: editor/import_dock.cpp -msgid "Save scenes, re-import and restart" +msgid "Save Scenes, Re-Import, and Restart" msgstr "" #: editor/import_dock.cpp @@ -6621,14 +6625,6 @@ msgid "Open Godot online documentation." msgstr "" #: editor/plugins/script_editor_plugin.cpp -msgid "Request Docs" -msgstr "" - -#: editor/plugins/script_editor_plugin.cpp -msgid "Help improve the Godot documentation by giving feedback." -msgstr "" - -#: editor/plugins/script_editor_plugin.cpp msgid "Search the reference documentation." msgstr "" @@ -7058,6 +7054,10 @@ msgid "This operation requires a single selected node." msgstr "" #: editor/plugins/spatial_editor_plugin.cpp +msgid "Auto Orthogonal Enabled" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp msgid "Lock View Rotation" msgstr "" @@ -7146,13 +7146,13 @@ msgid "Freelook Slow Modifier" msgstr "" #: editor/plugins/spatial_editor_plugin.cpp -msgid "" -"Note: The FPS value displayed is the editor's framerate.\n" -"It cannot be used as a reliable indication of in-game performance." +msgid "View Rotation Locked" msgstr "" #: editor/plugins/spatial_editor_plugin.cpp -msgid "View Rotation Locked" +msgid "" +"Note: The FPS value displayed is the editor's framerate.\n" +"It cannot be used as a reliable indication of in-game performance." msgstr "" #: editor/plugins/spatial_editor_plugin.cpp @@ -9520,6 +9520,13 @@ msgid "" "Would you like to explore official example projects in the Asset Library?" msgstr "" +#: editor/project_manager.cpp +msgid "" +"The search box filters projects by name and last path component.\n" +"To filter projects by name and full path, the query must contain at least " +"one `/` character." +msgstr "" + #: editor/project_settings_editor.cpp msgid "Key " msgstr "" @@ -10476,6 +10483,12 @@ msgid "Script file already exists." msgstr "" #: editor/script_create_dialog.cpp +msgid "" +"Note: Built-in scripts have some limitations and can't be edited using an " +"external editor." +msgstr "" + +#: editor/script_create_dialog.cpp msgid "Class Name:" msgstr "" @@ -10597,6 +10610,10 @@ msgid "Total:" msgstr "" #: editor/script_editor_debugger.cpp +msgid "Export list to a CSV file" +msgstr "" + +#: editor/script_editor_debugger.cpp msgid "Resource Path" msgstr "" @@ -12095,6 +12112,10 @@ msgid "" "texture to some node for display." msgstr "" +#: scene/main/viewport.cpp +msgid "Viewport size must be greater than 0 to render anything." +msgstr "" + #: scene/resources/visual_shader_nodes.cpp msgid "Invalid source for preview." msgstr "" diff --git a/editor/translations/he.po b/editor/translations/he.po index 17e04827a0..35421252b2 100644 --- a/editor/translations/he.po +++ b/editor/translations/he.po @@ -1489,7 +1489,7 @@ msgstr "הזזת ×˜×¢×™× ×” ×וטומטית" msgid "Remove Autoload" msgstr "הסרת ×˜×¢×™× ×” ×וטומטית" -#: editor/editor_autoload_settings.cpp +#: editor/editor_autoload_settings.cpp editor/editor_plugin_settings.cpp msgid "Enable" msgstr "הפעלה" @@ -2984,8 +2984,13 @@ msgid "Q&A" msgstr "ש×לות ותשובות × ×¤×•×¦×•×ª" #: editor/editor_node.cpp -msgid "Issue Tracker" -msgstr "עוקב תקלות" +#, fuzzy +msgid "Report a Bug" +msgstr "×™×™×‘×•× ×ž×—×“×©" + +#: editor/editor_node.cpp +msgid "Send Docs Feedback" +msgstr "" #: editor/editor_node.cpp editor/plugins/asset_library_editor_plugin.cpp msgid "Community" @@ -4065,7 +4070,7 @@ msgid "Reimport" msgstr "×™×™×‘×•× ×ž×—×“×©" #: editor/import_dock.cpp -msgid "Save scenes, re-import and restart" +msgid "Save Scenes, Re-Import, and Restart" msgstr "" #: editor/import_dock.cpp @@ -7009,14 +7014,6 @@ msgid "Open Godot online documentation." msgstr "פתיחת התיעוד המקוון של Godot" #: editor/plugins/script_editor_plugin.cpp -msgid "Request Docs" -msgstr "" - -#: editor/plugins/script_editor_plugin.cpp -msgid "Help improve the Godot documentation by giving feedback." -msgstr "" - -#: editor/plugins/script_editor_plugin.cpp msgid "Search the reference documentation." msgstr "" @@ -7477,6 +7474,10 @@ msgid "This operation requires a single selected node." msgstr "" #: editor/plugins/spatial_editor_plugin.cpp +msgid "Auto Orthogonal Enabled" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp #, fuzzy msgid "Lock View Rotation" msgstr "הצגת מידע" @@ -7567,17 +7568,17 @@ msgid "Freelook Slow Modifier" msgstr "" #: editor/plugins/spatial_editor_plugin.cpp +#, fuzzy +msgid "View Rotation Locked" +msgstr "הצגת מידע" + +#: editor/plugins/spatial_editor_plugin.cpp msgid "" "Note: The FPS value displayed is the editor's framerate.\n" "It cannot be used as a reliable indication of in-game performance." msgstr "" #: editor/plugins/spatial_editor_plugin.cpp -#, fuzzy -msgid "View Rotation Locked" -msgstr "הצגת מידע" - -#: editor/plugins/spatial_editor_plugin.cpp msgid "XForm Dialog" msgstr "" @@ -10076,6 +10077,13 @@ msgid "" "Would you like to explore official example projects in the Asset Library?" msgstr "" +#: editor/project_manager.cpp +msgid "" +"The search box filters projects by name and last path component.\n" +"To filter projects by name and full path, the query must contain at least " +"one `/` character." +msgstr "" + #: editor/project_settings_editor.cpp msgid "Key " msgstr "מקש " @@ -11086,6 +11094,12 @@ msgid "Script file already exists." msgstr "הפעולה ‚%s’ כבר קיימת!" #: editor/script_create_dialog.cpp +msgid "" +"Note: Built-in scripts have some limitations and can't be edited using an " +"external editor." +msgstr "" + +#: editor/script_create_dialog.cpp #, fuzzy msgid "Class Name:" msgstr "מחלקה:" @@ -11218,6 +11232,11 @@ msgid "Total:" msgstr "" #: editor/script_editor_debugger.cpp +#, fuzzy +msgid "Export list to a CSV file" +msgstr "×™×™×¦×•× ×ž×™×–×" + +#: editor/script_editor_debugger.cpp msgid "Resource Path" msgstr "" @@ -12757,6 +12776,10 @@ msgid "" "texture to some node for display." msgstr "" +#: scene/main/viewport.cpp +msgid "Viewport size must be greater than 0 to render anything." +msgstr "" + #: scene/resources/visual_shader_nodes.cpp #, fuzzy msgid "Invalid source for preview." @@ -12788,6 +12811,9 @@ msgstr "" msgid "Constants cannot be modified." msgstr "" +#~ msgid "Issue Tracker" +#~ msgstr "עוקב תקלות" + #~ msgid "enum " #~ msgstr "×ž×•× ×” " diff --git a/editor/translations/hi.po b/editor/translations/hi.po index d043407257..12cf8fd242 100644 --- a/editor/translations/hi.po +++ b/editor/translations/hi.po @@ -9,12 +9,14 @@ # Abhay Patel <abhay111patel@gmail.com>, 2019. # Lakshmi-Jayakumar <lakshmi.jayakumar.tkm@gmail.com>, 2019. # Devashishsingh98 <devashishsingh98@gmail.com>, 2019. +# Shirious <sad3119823@gmail.com>, 2020. +# Abhay Patel <Traumaticbean@protonmail.com>, 2020. msgid "" msgstr "" "Project-Id-Version: Godot Engine editor\n" "POT-Creation-Date: \n" -"PO-Revision-Date: 2020-01-30 03:56+0000\n" -"Last-Translator: Suryansh5545 <suryanshpathak5545@gmail.com>\n" +"PO-Revision-Date: 2020-04-24 06:48+0000\n" +"Last-Translator: Shirious <sad3119823@gmail.com>\n" "Language-Team: Hindi <https://hosted.weblate.org/projects/godot-engine/godot/" "hi/>\n" "Language: hi\n" @@ -22,7 +24,7 @@ msgstr "" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=n != 1;\n" -"X-Generator: Weblate 3.11-dev\n" +"X-Generator: Weblate 4.0.2-dev\n" #: core/math/expression.cpp modules/gdscript/gdscript_functions.cpp #: modules/visual_script/visual_script_builtin_funcs.cpp @@ -31,17 +33,17 @@ msgstr "कनà¥à¤µà¤°à¥à¤Ÿ करने के लिठअमानà¥à¤¯ à #: core/math/expression.cpp modules/gdscript/gdscript_functions.cpp msgid "Expected a string of length 1 (a character)." -msgstr "लंबाई 1 (à¤à¤• चरितà¥à¤°) की à¤à¤• सà¥à¤Ÿà¥à¤°à¤¿à¤‚ग की उमà¥à¤®à¥€à¤¦ है।" +msgstr "सà¥à¤Ÿà¥à¤°à¤¿à¤‚ग की लंबाई 1 (1 अकà¥à¤·à¤°) अपेकà¥à¤·à¤¿à¤¤ है." #: core/math/expression.cpp modules/gdscript/gdscript_functions.cpp #: modules/mono/glue/gd_glue.cpp #: modules/visual_script/visual_script_builtin_funcs.cpp msgid "Not enough bytes for decoding bytes, or invalid format." -msgstr "डिकोडिंग बाइट, या अमानà¥à¤¯ पà¥à¤°à¤¾à¤°à¥‚प के लिठपरà¥à¤¯à¤¾à¤ªà¥à¤¤ बाइट नहीं।" +msgstr "अमानà¥à¤¯ फ़ोरà¥à¤®à¥ˆà¤Ÿ, या बाइटà¥à¤¸ डिकोडिंग के लिठपरà¥à¤¯à¤¾à¤ªà¥à¤¤ बाइटà¥à¤¸ नहीं।" #: core/math/expression.cpp msgid "Invalid input %i (not passed) in expression" -msgstr "अà¤à¤¿à¤µà¥à¤¯à¤•à¥à¤¤à¤¿ में अमानà¥à¤¯ इनपà¥à¤Ÿ%i (पारित नहीं)" +msgstr "à¤à¤•à¥à¤¸à¤ªà¥à¤°à¥‡à¤¶à¤¨ मे अमानà¥à¤¯ इनपà¥à¤Ÿ %i (पास नहीं हो पाया)" #: core/math/expression.cpp msgid "self can't be used because instance is null (not passed)" @@ -105,7 +107,7 @@ msgstr "संतà¥à¤²à¤¿à¤¤" #: editor/animation_bezier_editor.cpp msgid "Mirror" -msgstr "दरà¥à¤ªà¤£" +msgstr "आइना" #: editor/animation_bezier_editor.cpp editor/editor_profiler.cpp msgid "Time:" @@ -666,7 +668,7 @@ msgstr "ऑडियो टà¥à¤°à¥ˆà¤• कà¥à¤²à¤¿à¤ª à¤à¤‚ड ऑफसेठ#: editor/array_property_edit.cpp msgid "Resize Array" -msgstr "रीसाइज रीवà¥à¤¯à¥‚" +msgstr "Array को बड़ा या छोटा करना" #: editor/array_property_edit.cpp msgid "Change Array Value Type" @@ -682,24 +684,23 @@ msgstr "लाइन पर जाà¤à¤‚" #: editor/code_editor.cpp msgid "Line Number:" -msgstr "लाइन नंबर:" +msgstr "लाइन कà¥à¤°.:" #: editor/code_editor.cpp -#, fuzzy msgid "%d replaced." -msgstr "बदलने के" +msgstr "%d बदले." #: editor/code_editor.cpp editor/editor_help.cpp msgid "%d match." -msgstr "% d मैच।" +msgstr "% d मिल गया।" #: editor/code_editor.cpp editor/editor_help.cpp msgid "%d matches." -msgstr "% डी मैच।" +msgstr "%d मिल गया।" #: editor/code_editor.cpp editor/find_in_files.cpp msgid "Match Case" -msgstr "मैच मामला" +msgstr "पूंजीकरण मेल करे" #: editor/code_editor.cpp editor/find_in_files.cpp msgid "Whole Words" @@ -707,7 +708,7 @@ msgstr "पूरे शबà¥à¤¦" #: editor/code_editor.cpp editor/rename_dialog.cpp msgid "Replace" -msgstr "बदलने के" +msgstr "बदले" #: editor/code_editor.cpp msgid "Replace All" @@ -715,7 +716,7 @@ msgstr "सबको बदली करें" #: editor/code_editor.cpp msgid "Selection Only" -msgstr "केवल चयन" +msgstr "सिरà¥à¤« चयन किये हà¥à¤" #: editor/code_editor.cpp editor/plugins/script_text_editor.cpp #: editor/plugins/text_editor.cpp @@ -748,40 +749,39 @@ msgstr "चेतावनियाà¤" #: editor/code_editor.cpp msgid "Line and column numbers." -msgstr "लाइन और कॉलम नंबर।" +msgstr "पंकà¥à¤¤à¤¿ और क़तार कà¥à¤°.।" #: editor/connections_dialog.cpp msgid "Method in target node must be specified." -msgstr "लकà¥à¤·à¥à¤¯ नोड में विधि निरà¥à¤¦à¤¿à¤·à¥à¤Ÿ की जानी चाहिà¤à¥¤" +msgstr "Method को target node में निरà¥à¤¦à¤¿à¤·à¥à¤Ÿ कीजिà¤." #: editor/connections_dialog.cpp msgid "" "Target method not found. Specify a valid method or attach a script to the " "target node." -msgstr "" -"लकà¥à¤·à¥à¤¯ विधि नहीं मिली। à¤à¤• मानà¥à¤¯ विधि निरà¥à¤¦à¤¿à¤·à¥à¤Ÿ करें या सà¥à¤•à¥à¤°à¤¿à¤ªà¥à¤Ÿ को लकà¥à¤·à¥à¤¯ नोड में संलगà¥à¤¨ करें।" +msgstr "target node नहीं मिला। method उलà¥à¤²à¤¿à¤–ित करें या script जोड़िये।" #: editor/connections_dialog.cpp msgid "Connect to Node:" -msgstr "नोड से कनेकà¥à¤Ÿ करें:" +msgstr "Node से कनेकà¥à¤Ÿ करें:" #: editor/connections_dialog.cpp msgid "Connect to Script:" -msgstr "सà¥à¤•à¥à¤°à¤¿à¤ªà¥à¤Ÿ से कनेकà¥à¤Ÿ:" +msgstr "Script से कनेकà¥à¤Ÿ:" #: editor/connections_dialog.cpp msgid "From Signal:" -msgstr "सिगà¥à¤¨à¤² से:" +msgstr "Signal से:" #: editor/connections_dialog.cpp msgid "Scene does not contain any script." -msgstr "सीन में कोई सà¥à¤•à¥à¤°à¤¿à¤ªà¥à¤Ÿ नहीं होती।" +msgstr "Scene में कोई script नहीं पाई गयी।" #: editor/connections_dialog.cpp editor/editor_autoload_settings.cpp #: editor/groups_editor.cpp editor/plugins/item_list_editor_plugin.cpp #: editor/plugins/theme_editor_plugin.cpp editor/project_settings_editor.cpp msgid "Add" -msgstr "जोड़ें" +msgstr "जोड़िये" #: editor/connections_dialog.cpp editor/dependency_editor.cpp #: editor/editor_feature_profile.cpp editor/groups_editor.cpp @@ -792,23 +792,23 @@ msgstr "जोड़ें" #: editor/plugins/visual_shader_editor_plugin.cpp editor/project_manager.cpp #: editor/project_settings_editor.cpp msgid "Remove" -msgstr "मिटाना" +msgstr "मिटाइये" #: editor/connections_dialog.cpp msgid "Add Extra Call Argument:" -msgstr "अतिरिकà¥à¤¤ कॉल तरà¥à¤• जोड़ें:" +msgstr "अतिरिकà¥à¤¤ Call Argument अपेकà¥à¤·à¤¿à¤¤ है:" #: editor/connections_dialog.cpp msgid "Extra Call Arguments:" -msgstr "अतिरिकà¥à¤¤ कॉल तरà¥à¤•:" +msgstr "अतिरिकà¥à¤¤ Call Arguments:" #: editor/connections_dialog.cpp msgid "Receiver Method:" -msgstr "रिसीवर विधि:" +msgstr "पानेवाली Method:" #: editor/connections_dialog.cpp msgid "Advanced" -msgstr "उनà¥à¤¨à¤¤" +msgstr "अगà¥à¤°à¤µà¤°à¥à¤¤à¥€" #: editor/connections_dialog.cpp msgid "Deferred" @@ -818,20 +818,20 @@ msgstr "सà¥à¤¥à¤—ित" msgid "" "Defers the signal, storing it in a queue and only firing it at idle time." msgstr "" -"संकेत को सà¥à¤¥à¤—ित कर देता है, इसे à¤à¤• कतार में संगà¥à¤°à¤¹à¤¿à¤¤ करता है और केवल निषà¥à¤•à¥à¤°à¤¿à¤¯ समय पर इसे " +"इशारा को सà¥à¤¥à¤—ित कर देता है, इसे à¤à¤• कतार में संगà¥à¤°à¤¹à¤¿à¤¤ करता है और केवल निषà¥à¤•à¥à¤°à¤¿à¤¯ समय पर इसे " "फायरिंग करता है।" #: editor/connections_dialog.cpp msgid "Oneshot" -msgstr "वनशॉट" +msgstr "à¤à¤• बार" #: editor/connections_dialog.cpp msgid "Disconnects the signal after its first emission." -msgstr "अपने पहले उतà¥à¤¸à¤°à¥à¤œà¤¨ के बाद संकेत डिसà¥à¤•नेकà¥à¤Ÿ करता है।" +msgstr "इसके पहले उतà¥à¤¸à¤°à¥à¤œà¤¨ के बाद सिगà¥à¤¨à¤² को डिसà¥à¤•नेकà¥à¤Ÿ करें" #: editor/connections_dialog.cpp msgid "Cannot connect signal" -msgstr "सिगà¥à¤¨à¤² कनेकà¥à¤Ÿ नहीं कर सकते" +msgstr "इशारा कनेकà¥à¤Ÿ नहीं कर सकते" #: editor/connections_dialog.cpp editor/dependency_editor.cpp #: editor/export_template_manager.cpp editor/groups_editor.cpp @@ -850,11 +850,11 @@ msgstr "बंद करे" #: editor/connections_dialog.cpp msgid "Connect" -msgstr "जोड़ना" +msgstr "जोड़िये" #: editor/connections_dialog.cpp msgid "Signal:" -msgstr "संकेत:" +msgstr "इशारा:" #: editor/connections_dialog.cpp msgid "Connect '%s' to '%s'" @@ -862,11 +862,11 @@ msgstr "'%' को '%' से कनेकà¥à¤Ÿ करें" #: editor/connections_dialog.cpp msgid "Disconnect '%s' from '%s'" -msgstr "'%' से डिसà¥à¤•नेकà¥à¤Ÿ करें '%'" +msgstr "'%' से '%' को डिसà¥à¤•नेकà¥à¤Ÿ करें" #: editor/connections_dialog.cpp msgid "Disconnect all from signal: '%s'" -msgstr "सà¤à¥€ को सिगà¥à¤¨à¤² से डिसà¥à¤•नेकà¥à¤Ÿ करें: '%s'" +msgstr "सà¤à¥€ इशारो से डिसà¥à¤•नेकà¥à¤Ÿ करें: '%s'" #: editor/connections_dialog.cpp msgid "Connect..." @@ -875,15 +875,15 @@ msgstr "जोड़ना..." #: editor/connections_dialog.cpp #: editor/plugins/animation_tree_player_editor_plugin.cpp msgid "Disconnect" -msgstr "डिसà¥à¤•नेकà¥à¤Ÿ" +msgstr "विलगन" #: editor/connections_dialog.cpp msgid "Connect a Signal to a Method" -msgstr "à¤à¤• विधि के लिठà¤à¤• संकेत कनेकà¥à¤Ÿ" +msgstr "method इशारे से जोड़िà¤" #: editor/connections_dialog.cpp msgid "Edit Connection:" -msgstr "संपादित करें कनेकà¥à¤¶à¤¨:" +msgstr "कनेकà¥à¤¶à¤¨ संपादित करें:" #: editor/connections_dialog.cpp msgid "Are you sure you want to remove all connections from the \"%s\" signal?" @@ -903,19 +903,19 @@ msgstr "सà¤à¥€ को डिसà¥à¤•नेकà¥à¤Ÿ करें" #: editor/connections_dialog.cpp msgid "Edit..." -msgstr "संपादित..." +msgstr "संपादित करें..." #: editor/connections_dialog.cpp msgid "Go To Method" -msgstr "" +msgstr "मेथड पे जाये" #: editor/create_dialog.cpp msgid "Change %s Type" -msgstr "" +msgstr "%s का टाइप बदले" #: editor/create_dialog.cpp editor/project_settings_editor.cpp msgid "Change" -msgstr "परिवरà¥à¤¤à¤¨" +msgstr "बदली" #: editor/create_dialog.cpp msgid "Create New %s" @@ -1196,11 +1196,11 @@ msgstr "असंपीड़ित संपतà¥à¤¤à¤¿à¤¯à¤¾à¤‚" #: editor/editor_asset_installer.cpp editor/project_manager.cpp msgid "The following files failed extraction from package:" -msgstr "" +msgstr "निमà¥à¤¨ फ़ाइलों का निसà¥à¤¸à¤¾à¤°à¤£ नहीं हो पाया:" #: editor/editor_asset_installer.cpp msgid "And %s more files." -msgstr "" +msgstr "और %s फ़ाइलें." #: editor/editor_asset_installer.cpp editor/project_manager.cpp msgid "Package installed successfully!" @@ -1213,7 +1213,7 @@ msgstr "सफलता!" #: editor/editor_asset_installer.cpp msgid "Package Contents:" -msgstr "पैकेज सामगà¥à¤°à¥€:" +msgstr "पैकेज में है:" #: editor/editor_asset_installer.cpp editor/editor_node.cpp msgid "Install" @@ -1273,7 +1273,7 @@ msgstr "पà¥à¤¨à¤°à¥à¤µà¥à¤¯à¤µà¤¸à¥à¤¥à¤¿à¤¤ करने के लिठ#: editor/editor_audio_buses.cpp msgid "Solo" -msgstr "à¤à¤•ल" +msgstr "सोलो" #: editor/editor_audio_buses.cpp msgid "Mute" @@ -1298,7 +1298,7 @@ msgstr "वॉलà¥à¤¯à¥‚म रीसेट करें" #: editor/editor_audio_buses.cpp msgid "Delete Effect" -msgstr "डिलीट इफेकà¥à¤Ÿ" +msgstr "इफेकà¥à¤Ÿ मिटाइये" #: editor/editor_audio_buses.cpp msgid "Audio" @@ -1306,31 +1306,31 @@ msgstr "ऑडियो" #: editor/editor_audio_buses.cpp msgid "Add Audio Bus" -msgstr "" +msgstr "ऑडियो बस à¤à¤¡ कीजिà¤" #: editor/editor_audio_buses.cpp msgid "Master bus can't be deleted!" -msgstr "" +msgstr "मासà¥à¤Ÿà¤° बस नहीं मिटा सकते!" #: editor/editor_audio_buses.cpp msgid "Delete Audio Bus" -msgstr "" +msgstr "ऑडियो बस मिटाइये" #: editor/editor_audio_buses.cpp msgid "Duplicate Audio Bus" -msgstr "" +msgstr "ऑडियो बस दà¥à¤—à¥à¤¨à¤¾ करे" #: editor/editor_audio_buses.cpp msgid "Reset Bus Volume" -msgstr "" +msgstr "बस की धà¥à¤µà¤¨à¤¿ मातà¥à¤°à¤¾ पूरà¥à¤µà¤°à¥‚प करे" #: editor/editor_audio_buses.cpp msgid "Move Audio Bus" -msgstr "" +msgstr "ऑडियो बस हटाइये" #: editor/editor_audio_buses.cpp msgid "Save Audio Bus Layout As..." -msgstr "" +msgstr "ऑडियो बस लेआउट इस तरह बचा के रखिये..." #: editor/editor_audio_buses.cpp msgid "Location for New Layout..." @@ -1338,113 +1338,113 @@ msgstr "नठलेआउट के लिठसà¥à¤¥à¤¾à¤¨..." #: editor/editor_audio_buses.cpp msgid "Open Audio Bus Layout" -msgstr "" +msgstr "ऑडियो बस लेआउट खोलिये" #: editor/editor_audio_buses.cpp msgid "There is no '%s' file." -msgstr "" +msgstr "कोई '%s' फ़ाइल नहीं." #: editor/editor_audio_buses.cpp editor/plugins/canvas_item_editor_plugin.cpp msgid "Layout" -msgstr "" +msgstr "लेआउट" #: editor/editor_audio_buses.cpp msgid "Invalid file, not an audio bus layout." -msgstr "" +msgstr "अमानà¥à¤¯ फ़ाइल, ऑडियो बस लेआउट." #: editor/editor_audio_buses.cpp msgid "Error saving file: %s" -msgstr "तà¥à¤°à¥à¤Ÿà¤¿ बचत फ़ाइल: %s" +msgstr "फ़ाइल बचाने में चूक: %s" #: editor/editor_audio_buses.cpp msgid "Add Bus" -msgstr "" +msgstr "बस à¤à¤¡ कीजिà¤" #: editor/editor_audio_buses.cpp msgid "Add a new Audio Bus to this layout." -msgstr "" +msgstr "लेआउट में नई ऑडियो बस à¤à¤¡ कीजिà¤." #: editor/editor_audio_buses.cpp editor/editor_properties.cpp #: editor/plugins/animation_player_editor_plugin.cpp editor/property_editor.cpp #: editor/script_create_dialog.cpp msgid "Load" -msgstr "" +msgstr "लोड कीजिये" #: editor/editor_audio_buses.cpp msgid "Load an existing Bus Layout." -msgstr "" +msgstr "मौजूदा बस लेआउट लोड कीजिये." #: editor/editor_audio_buses.cpp msgid "Save As" -msgstr "" +msgstr "इस तरह बचा के रखिये" #: editor/editor_audio_buses.cpp msgid "Save this Bus Layout to a file." -msgstr "" +msgstr "बस लेआउट को फ़ाइल में बचा के रखिये." #: editor/editor_audio_buses.cpp editor/import_dock.cpp msgid "Load Default" -msgstr "" +msgstr "पà¥à¤°à¤¾à¤¯à¤¿à¤• लोड कीजिये" #: editor/editor_audio_buses.cpp msgid "Load the default Bus Layout." -msgstr "" +msgstr "पà¥à¤°à¤¾à¤¯à¤¿à¤• बस लेआउट लोड कीजिये." #: editor/editor_audio_buses.cpp msgid "Create a new Bus Layout." -msgstr "" +msgstr "नई बस लेआउट बनाइये." #: editor/editor_autoload_settings.cpp msgid "Invalid name." -msgstr "" +msgstr "अमानà¥à¤¯ नाम." #: editor/editor_autoload_settings.cpp msgid "Valid characters:" -msgstr "" +msgstr "मानà¥à¤¯ अकà¥à¤·à¤°:" #: editor/editor_autoload_settings.cpp msgid "Must not collide with an existing engine class name." -msgstr "" +msgstr "मौजूदा कà¥à¤²à¤¾à¤¸ इंजन नाम से मेल नहीं खाना चाहिà¤." #: editor/editor_autoload_settings.cpp msgid "Must not collide with an existing built-in type name." -msgstr "" +msgstr "मौजूदा बिलà¥à¤Ÿ-इन टाइप के नाम से मेल नहीं खाना चाहिà¤." #: editor/editor_autoload_settings.cpp msgid "Must not collide with an existing global constant name." -msgstr "" +msgstr "मौजूदा गà¥à¤²à¥‹à¤¬à¤² कोनà¥à¤¸à¥à¤Ÿà¤¨à¥à¤Ÿ के नाम से मेल नहीं खाना चाहिà¤." #: editor/editor_autoload_settings.cpp msgid "Keyword cannot be used as an autoload name." -msgstr "" +msgstr "कीवरà¥à¤¡ को औटोलोड नाम के तरह नहीं इसà¥à¤¤à¥‡à¤®à¤¾à¤² कर सकते." #: editor/editor_autoload_settings.cpp msgid "Autoload '%s' already exists!" -msgstr "" +msgstr "औटोलोड '%s' पहले से मौजूद!" #: editor/editor_autoload_settings.cpp msgid "Rename Autoload" -msgstr "" +msgstr "औटोलोड का नाम बदली कीजिये" #: editor/editor_autoload_settings.cpp msgid "Toggle AutoLoad Globals" -msgstr "" +msgstr "औटोलोड गà¥à¤²à¥‹à¤¬à¤² टॉगल कीजिये" #: editor/editor_autoload_settings.cpp msgid "Move Autoload" -msgstr "" +msgstr "औटोलोड हिलाइये" #: editor/editor_autoload_settings.cpp msgid "Remove Autoload" -msgstr "" +msgstr "औटोलोड हटा दीजिये" -#: editor/editor_autoload_settings.cpp +#: editor/editor_autoload_settings.cpp editor/editor_plugin_settings.cpp msgid "Enable" -msgstr "" +msgstr "सकà¥à¤°à¤¿à¤¯ करे" #: editor/editor_autoload_settings.cpp msgid "Rearrange Autoloads" -msgstr "" +msgstr "औटोलोड पà¥à¤¨à¤°à¥à¤µà¥à¤¯à¤µà¤¸à¥à¤¥à¤¿à¤¤ करें" #: editor/editor_autoload_settings.cpp editor/script_create_dialog.cpp msgid "Invalid path." @@ -1452,114 +1452,118 @@ msgstr "अमानà¥à¤¯ रासà¥à¤¤à¤¾à¥¤" #: editor/editor_autoload_settings.cpp editor/script_create_dialog.cpp msgid "File does not exist." -msgstr "" +msgstr "फ़ाइल नहीं मौजूद." #: editor/editor_autoload_settings.cpp msgid "Not in resource path." -msgstr "" +msgstr "रेसोरà¥à¤¸ पाथ में नहीं." #: editor/editor_autoload_settings.cpp msgid "Add AutoLoad" -msgstr "" +msgstr "औटोलोड à¤à¤¡ कीजिà¤" #: editor/editor_autoload_settings.cpp editor/editor_file_dialog.cpp #: editor/editor_plugin_settings.cpp #: editor/plugins/animation_tree_editor_plugin.cpp #: editor/script_create_dialog.cpp scene/gui/file_dialog.cpp msgid "Path:" -msgstr "" +msgstr "पाथ:" #: editor/editor_autoload_settings.cpp msgid "Node Name:" -msgstr "" +msgstr "नोड का नाम:" #: editor/editor_autoload_settings.cpp editor/editor_help_search.cpp #: editor/editor_profiler.cpp editor/project_manager.cpp #: editor/settings_config_dialog.cpp msgid "Name" -msgstr "" +msgstr "नाम" #: editor/editor_autoload_settings.cpp msgid "Singleton" -msgstr "" +msgstr "सिनà¥à¤—लटन" #: editor/editor_data.cpp editor/inspector_dock.cpp msgid "Paste Params" -msgstr "" +msgstr "पैरैमिटरà¥à¤¸ पेसà¥à¤Ÿ कीजिये" #: editor/editor_data.cpp msgid "Updating Scene" -msgstr "" +msgstr "सीन अपडेट कर रहा है" #: editor/editor_data.cpp msgid "Storing local changes..." -msgstr "" +msgstr "लोकल बदलीया सà¥à¤Ÿà¥‹à¤° कर रहा है..." #: editor/editor_data.cpp msgid "Updating scene..." -msgstr "" +msgstr "सीन अपडेट कर रहा है..." #: editor/editor_data.cpp editor/editor_properties.cpp msgid "[empty]" -msgstr "" +msgstr "[खाली]" #: editor/editor_data.cpp msgid "[unsaved]" -msgstr "" +msgstr "[अनसेवà¥à¤¡]" #: editor/editor_dir_dialog.cpp msgid "Please select a base directory first." -msgstr "" +msgstr "कृपया पहले बेस डायरेकà¥à¤Ÿà¤°à¥€ सिलेकà¥à¤Ÿ कीजिये." #: editor/editor_dir_dialog.cpp msgid "Choose a Directory" -msgstr "" +msgstr "डायरेकà¥à¤Ÿà¤°à¥€ चà¥à¤¨à¥‡à¤‚" #: editor/editor_dir_dialog.cpp editor/editor_file_dialog.cpp #: editor/filesystem_dock.cpp editor/project_manager.cpp #: scene/gui/file_dialog.cpp msgid "Create Folder" -msgstr "" +msgstr "फ़ोलà¥à¤¡à¤° बनाइये" #: editor/editor_dir_dialog.cpp editor/editor_file_dialog.cpp #: editor/editor_plugin_settings.cpp editor/filesystem_dock.cpp #: editor/plugins/theme_editor_plugin.cpp editor/project_export.cpp #: modules/visual_script/visual_script_editor.cpp scene/gui/file_dialog.cpp msgid "Name:" -msgstr "" +msgstr "नाम:" #: editor/editor_dir_dialog.cpp editor/editor_file_dialog.cpp #: editor/filesystem_dock.cpp scene/gui/file_dialog.cpp msgid "Could not create folder." -msgstr "" +msgstr "फ़ोलà¥à¤¡à¤° नही बना सकते." #: editor/editor_dir_dialog.cpp msgid "Choose" -msgstr "" +msgstr "चà¥à¤¨à¥‡à¤‚" #: editor/editor_export.cpp msgid "Storing File:" -msgstr "" +msgstr "फ़ाइल सà¥à¤Ÿà¥‹à¤° कर रहा है:" #: editor/editor_export.cpp msgid "No export template found at the expected path:" -msgstr "" +msgstr "निशà¥à¤šà¤¿à¤¤ पाथ पर â€à¤à¤•à¥à¤¸à¤ªà¥‹à¤°à¥à¤Ÿ टेमà¥à¤ªà¥à¤²à¥‡à¤Ÿ नहीं मिला:" #: editor/editor_export.cpp msgid "Packing" -msgstr "" +msgstr "पैक कर रहा है" #: editor/editor_export.cpp msgid "" "Target platform requires 'ETC' texture compression for GLES2. Enable 'Import " "Etc' in Project Settings." msgstr "" +"GLES2 के लिये टारà¥à¤—ेट पà¥à¤²à¥à¤Ÿà¥ˆà¥žà¥‹à¤°à¥à¤® को 'ETC' टेâ€à¤•à¥à¤¸à¤šà¤° कोमà¥à¤ªà¥à¤°à¥‡à¤¶à¤¨ की आवशà¥à¤¯à¤•ता है. 'Import Etc' " +"को पà¥à¤°à¥‹à¤œà¥‡à¤•à¥à¤Ÿ सेटिनà¥à¤—स मे सकà¥à¤°à¤¿à¤¯ करे." #: editor/editor_export.cpp msgid "" "Target platform requires 'ETC2' texture compression for GLES3. Enable " "'Import Etc 2' in Project Settings." msgstr "" +"GLES3 के लिये टारà¥à¤—ेट पà¥à¤²à¥à¤Ÿà¥ˆà¥žà¥‹à¤°à¥à¤® को 'ETC2' टेâ€à¤•à¥à¤¸à¤šà¤° कोमà¥à¤ªà¥à¤°à¥‡à¤¶à¤¨ की आवशà¥à¤¯à¤•ता है. 'Import Etc " +"2' को पà¥à¤°à¥‹à¤œà¥‡à¤•à¥à¤Ÿ सेटिनà¥à¤—स मे सकà¥à¤°à¤¿à¤¯ करे." #: editor/editor_export.cpp msgid "" @@ -1568,364 +1572,361 @@ msgid "" "Enable 'Import Etc' in Project Settings, or disable 'Driver Fallback " "Enabled'." msgstr "" +"GLES2 के लिये टारà¥à¤—ेट पà¥à¤²à¥à¤Ÿà¥ˆà¥žà¥‹à¤°à¥à¤® को 'ETC' टेâ€à¤•à¥à¤¸à¤šà¤° कोमà¥à¤ªà¥à¤°à¥‡à¤¶à¤¨ की आवशà¥à¤¯à¤•ता है. \n" +"'Import Etc' को पà¥à¤°à¥‹à¤œà¥‡à¤•à¥à¤Ÿ सेटिनà¥à¤—स मे सकà¥à¤°à¤¿à¤¯ करे, या 'Driver Fallback Enabled' को " +"निषà¥à¤•à¥à¤°à¤¿à¤¯ करे." #: editor/editor_export.cpp platform/android/export/export.cpp #: platform/iphone/export/export.cpp platform/javascript/export/export.cpp #: platform/osx/export/export.cpp platform/uwp/export/export.cpp msgid "Custom debug template not found." -msgstr "" +msgstr "कसà¥à¤Ÿà¤® डिबग टेमà¥à¤ªà¥à¤²à¥‡à¤Ÿ नहीं मिला." #: editor/editor_export.cpp platform/android/export/export.cpp #: platform/iphone/export/export.cpp platform/javascript/export/export.cpp #: platform/osx/export/export.cpp platform/uwp/export/export.cpp msgid "Custom release template not found." -msgstr "" +msgstr "कसà¥à¤Ÿà¤® रिलिज टेमà¥à¤ªà¥à¤²à¥‡à¤Ÿ नहीं मिला." #: editor/editor_export.cpp platform/javascript/export/export.cpp msgid "Template file not found:" -msgstr "" +msgstr "टेमà¥à¤ªà¥à¤²à¥‡à¤Ÿ फ़ाइल नहीं मिला:" #: editor/editor_export.cpp msgid "On 32-bit exports the embedded PCK cannot be bigger than 4 GiB." -msgstr "" +msgstr "32-बिट â€à¤à¤•à¥à¤¸à¤ªà¥‹à¤°à¥à¤Ÿ पर à¤à¤®à¤¬à¥‡à¤¡à¥à¤¡à¥‡à¤¡ PCK 4 GiB से बड़ी नहीं इसà¥à¤¤à¥‡à¤®à¤¾à¤² कर सकते." #: editor/editor_feature_profile.cpp msgid "3D Editor" msgstr "3D संपादक" #: editor/editor_feature_profile.cpp -#, fuzzy msgid "Script Editor" -msgstr "निरà¥à¤à¤°à¤¤à¤¾ संपादक" +msgstr "सà¥à¤•à¥à¤°à¤¿à¤ªà¥à¤Ÿ à¤à¤¡à¥€à¤Ÿà¤°" #: editor/editor_feature_profile.cpp msgid "Asset Library" -msgstr "" +msgstr "असà¥à¤¸à¥‡à¤Ÿ संगà¥à¤°à¤¹" #: editor/editor_feature_profile.cpp msgid "Scene Tree Editing" -msgstr "" +msgstr "सीन टà¥à¤°à¥€ à¤à¤¡à¤¿à¤Ÿà¤¿à¤‚ग" #: editor/editor_feature_profile.cpp msgid "Import Dock" -msgstr "" +msgstr "इंपोरà¥à¤Ÿ डॉक" #: editor/editor_feature_profile.cpp msgid "Node Dock" -msgstr "" +msgstr "नोड डॉक" #: editor/editor_feature_profile.cpp msgid "FileSystem and Import Docks" -msgstr "" +msgstr "फाइलसिसà¥à¤Ÿà¥‡à¤® और इंपोरà¥à¤Ÿ डोकà¥à¤¸" #: editor/editor_feature_profile.cpp msgid "Erase profile '%s'? (no undo)" -msgstr "" +msgstr "पà¥à¤°à¥‹à¤«à¤¼à¤¾à¤‡à¤² '%s' को मिटाà¤à¤‚? (इसे अंडू नहीं किया जा सकता है)" #: editor/editor_feature_profile.cpp msgid "Profile must be a valid filename and must not contain '.'" -msgstr "" +msgstr "पà¥à¤°à¥‹à¤«à¤¼à¤¾à¤‡à¤² का à¤à¤• वैध फ़ाइलनेम होना चाहिठऔर उसमे '.' नहीं होना चाहिà¤" #: editor/editor_feature_profile.cpp msgid "Profile with this name already exists." -msgstr "" +msgstr "इस नाम का पà¥à¤°à¥‹à¤«à¤¼à¤¾à¤‡à¤² पहले से मौजूद है।" #: editor/editor_feature_profile.cpp msgid "(Editor Disabled, Properties Disabled)" -msgstr "" +msgstr "(à¤à¤¡à¥€à¤Ÿà¤° निषà¥à¤•à¥à¤°à¤¿à¤¯,पà¥à¤°à¥‹à¤ªà¤°à¤Ÿà¤¿à¤œ निषà¥à¤•à¥à¤°à¤¿à¤¯)" #: editor/editor_feature_profile.cpp msgid "(Properties Disabled)" -msgstr "" +msgstr "(पà¥à¤°à¥‹à¤ªà¤°à¤Ÿà¤¿à¤œ निषà¥à¤•à¥à¤°à¤¿à¤¯)" #: editor/editor_feature_profile.cpp -#, fuzzy msgid "(Editor Disabled)" -msgstr "बंद कर दिया गया है" +msgstr "(à¤à¤¡à¥€à¤Ÿà¤° निषà¥à¤•à¥à¤°à¤¿à¤¯)" #: editor/editor_feature_profile.cpp -#, fuzzy msgid "Class Options:" -msgstr "विवरण:" +msgstr "कà¥à¤²à¤¾à¤¸ विकलà¥à¤ª:" #: editor/editor_feature_profile.cpp msgid "Enable Contextual Editor" -msgstr "" +msgstr "कोनà¥à¤Ÿà¥‡à¤•à¥à¤¸à¤šà¥à¤…ल à¤à¤¡à¥€à¤Ÿà¤° सकà¥à¤°à¤¿à¤¯ करे" #: editor/editor_feature_profile.cpp msgid "Enabled Properties:" -msgstr "" +msgstr "सकà¥à¤°à¤¿à¤¯ पà¥à¤°à¥‹à¤ªà¤°à¤Ÿà¤¿à¤œ:" #: editor/editor_feature_profile.cpp msgid "Enabled Features:" -msgstr "" +msgstr "सकà¥à¤°à¤¿à¤¯ फ़िचरà¥à¤¸:" #: editor/editor_feature_profile.cpp msgid "Enabled Classes:" -msgstr "" +msgstr "सकà¥à¤°à¤¿à¤¯ कà¥à¤²à¤¾à¤¸:" #: editor/editor_feature_profile.cpp msgid "File '%s' format is invalid, import aborted." -msgstr "" +msgstr "'%s' फ़ोरà¥à¤®à¥ˆà¤Ÿ की फ़ाइल अमानà¥à¤¯, इंपोरà¥à¤Ÿ रोका गया." #: editor/editor_feature_profile.cpp msgid "" "Profile '%s' already exists. Remove it first before importing, import " "aborted." -msgstr "" +msgstr "'%s' पà¥à¤°à¥‹à¤«à¤¼à¤¾à¤‡à¤² पहले से मौजूद. इंपोरà¥à¤Ÿ से पहले हटा दीजिये, इंपोरà¥à¤Ÿ रोका गया." #: editor/editor_feature_profile.cpp -#, fuzzy msgid "Error saving profile to path: '%s'." -msgstr "लोड हो रहा है तà¥à¤°à¥à¤Ÿà¤¿à¤¯à¤¾à¤!" +msgstr "पाथ मे पà¥à¤°à¥‹à¤«à¤¼à¤¾à¤‡à¤² सेव करनेमे à¤à¤°à¤°: '%s'." #: editor/editor_feature_profile.cpp msgid "Unset" -msgstr "" +msgstr "अनà¥à¤¸à¥‡à¤Ÿ" #: editor/editor_feature_profile.cpp msgid "Current Profile:" -msgstr "" +msgstr "वरà¥à¤¤à¤®à¤¾à¤¨ पà¥à¤°à¥‹à¤«à¤¼à¤¾à¤‡à¤²:" #: editor/editor_feature_profile.cpp msgid "Make Current" -msgstr "" +msgstr "वरà¥à¤¤à¤®à¤¾à¤¨ बनाय" #: editor/editor_feature_profile.cpp #: editor/plugins/animation_player_editor_plugin.cpp #: editor/plugins/version_control_editor_plugin.cpp msgid "New" -msgstr "" +msgstr "नई" #: editor/editor_feature_profile.cpp editor/editor_node.cpp #: editor/project_manager.cpp msgid "Import" -msgstr "" +msgstr "इंपोरà¥à¤Ÿ" #: editor/editor_feature_profile.cpp editor/project_export.cpp msgid "Export" -msgstr "" +msgstr "â€à¤à¤•à¥à¤¸à¤ªà¥‹à¤°à¥à¤Ÿ" #: editor/editor_feature_profile.cpp msgid "Available Profiles:" -msgstr "" +msgstr "उपलबà¥à¤§ पà¥à¤°à¥‹à¤«à¤¼à¤¾à¤‡à¤²:" #: editor/editor_feature_profile.cpp -#, fuzzy msgid "Class Options" -msgstr "विवरण:" +msgstr "कà¥à¤²à¤¾à¤¸ विकलà¥à¤ª" #: editor/editor_feature_profile.cpp msgid "New profile name:" -msgstr "" +msgstr "नया पà¥à¤°à¥‹à¤«à¤¼à¤¾à¤‡à¤² नाम:" #: editor/editor_feature_profile.cpp msgid "Erase Profile" -msgstr "" +msgstr "पà¥à¤°à¥‹à¤«à¤¼à¤¾à¤‡à¤² मिटाय" #: editor/editor_feature_profile.cpp msgid "Godot Feature Profile" -msgstr "" +msgstr "Godot फ़िचर पà¥à¤°à¥‹à¤«à¤¼à¤¾à¤‡à¤²" #: editor/editor_feature_profile.cpp msgid "Import Profile(s)" -msgstr "" +msgstr "इंपोरà¥à¤Ÿ पà¥à¤°à¥‹à¤«à¤¼à¤¾à¤‡à¤²" #: editor/editor_feature_profile.cpp msgid "Export Profile" -msgstr "" +msgstr "â€à¤à¤•à¥à¤¸à¤ªà¥‹à¤°à¥à¤Ÿ पà¥à¤°à¥‹à¤«à¤¼à¤¾à¤‡à¤²" #: editor/editor_feature_profile.cpp msgid "Manage Editor Feature Profiles" -msgstr "" +msgstr "à¤à¤¡à¥€à¤Ÿà¤° फ़िचर पà¥à¤°à¥‹à¤«à¤¼à¤¾à¤‡à¤² वà¥à¤¯à¤µà¤¸à¥à¤¥à¤¾ कीजिये" #: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp msgid "Select Current Folder" -msgstr "" +msgstr "वरà¥à¤¤à¤®à¤¾à¤¨ फ़ोलà¥à¤¡à¤° सिलेकà¥à¤Ÿ कीजिये" #: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp msgid "File Exists, Overwrite?" -msgstr "" +msgstr "फ़ाइल पहले से मौजूद, मौजूदा के ऊपर लिखे?" #: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp msgid "Select This Folder" -msgstr "" +msgstr "यह फ़ोलà¥à¤¡à¤° सिलेकà¥à¤Ÿ कीजिये" #: editor/editor_file_dialog.cpp editor/filesystem_dock.cpp msgid "Copy Path" -msgstr "" +msgstr "पाथ कौपी कीजिये" #: editor/editor_file_dialog.cpp editor/filesystem_dock.cpp -#, fuzzy msgid "Open in File Manager" -msgstr "खोलो इसे" +msgstr "फ़ाइल मैनेजर में खोलिये" #: editor/editor_file_dialog.cpp editor/editor_node.cpp #: editor/filesystem_dock.cpp editor/project_manager.cpp msgid "Show in File Manager" -msgstr "" +msgstr "फ़ाइल मैनेजर मे दिखाइà¤" #: editor/editor_file_dialog.cpp editor/filesystem_dock.cpp msgid "New Folder..." -msgstr "" +msgstr "नया फ़ोलà¥à¤¡à¤°..." #: editor/editor_file_dialog.cpp editor/find_in_files.cpp #: editor/plugins/version_control_editor_plugin.cpp msgid "Refresh" -msgstr "" +msgstr "रिफ़à¥à¤°à¥‡à¤¶" #: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp msgid "All Recognized" -msgstr "" +msgstr "सà¤à¥€ सà¥à¤µà¥€à¤•ृत" #: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp msgid "All Files (*)" -msgstr "" +msgstr "सà¤à¥€ फ़ाइल (*)" #: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp msgid "Open a File" -msgstr "" +msgstr "फ़ाइल खोलिये" #: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp msgid "Open File(s)" -msgstr "" +msgstr "फ़ाइल(s) खोलिये" #: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp msgid "Open a Directory" -msgstr "" +msgstr "डायरेकà¥à¤Ÿà¤°à¥€ खोलिये" #: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp msgid "Open a File or Directory" -msgstr "" +msgstr "फ़ाइल या डायरेकà¥à¤Ÿà¤°à¥€ खोलिये" #: editor/editor_file_dialog.cpp editor/editor_node.cpp #: editor/editor_properties.cpp editor/inspector_dock.cpp #: editor/plugins/animation_player_editor_plugin.cpp #: editor/plugins/script_editor_plugin.cpp scene/gui/file_dialog.cpp msgid "Save" -msgstr "" +msgstr "सेव कीजिये" #: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp msgid "Save a File" -msgstr "" +msgstr "फ़ाइल सेव कीजिये" #: editor/editor_file_dialog.cpp msgid "Go Back" -msgstr "" +msgstr "पीछे जाय" #: editor/editor_file_dialog.cpp msgid "Go Forward" -msgstr "" +msgstr "आगे जाय" #: editor/editor_file_dialog.cpp msgid "Go Up" -msgstr "" +msgstr "ऊपर जाय" #: editor/editor_file_dialog.cpp msgid "Toggle Hidden Files" -msgstr "" +msgstr "छिपी फ़ाइले टॉगल कीजिये" #: editor/editor_file_dialog.cpp msgid "Toggle Favorite" -msgstr "" +msgstr "फ़ेवरेट टॉगल कीजिये" #: editor/editor_file_dialog.cpp msgid "Toggle Mode" -msgstr "" +msgstr "मोड टॉगल कीजिये" #: editor/editor_file_dialog.cpp msgid "Focus Path" -msgstr "" +msgstr "फ़ोकस पाथ" #: editor/editor_file_dialog.cpp msgid "Move Favorite Up" -msgstr "" +msgstr "फ़ेवरेट उपर लीजिये" #: editor/editor_file_dialog.cpp msgid "Move Favorite Down" -msgstr "" +msgstr "फ़ेवरेट नीचे लीजिये" #: editor/editor_file_dialog.cpp msgid "Go to previous folder." -msgstr "" +msgstr "पिछले फ़ोलà¥à¤¡à¤° पे जाय." #: editor/editor_file_dialog.cpp msgid "Go to next folder." -msgstr "" +msgstr "अगले फ़ोलà¥à¤¡à¤° पे जाय." #: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp msgid "Go to parent folder." -msgstr "" +msgstr "मूल फ़ोलà¥à¤¡à¤° पे जाय." #: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp -#, fuzzy msgid "Refresh files." -msgstr "खोज कर:" +msgstr "रिफ़à¥à¤°à¥‡à¤¶ फ़ाइल." #: editor/editor_file_dialog.cpp msgid "(Un)favorite current folder." -msgstr "" +msgstr "फ़ेवरेट मे से वरà¥à¤¤à¤®à¤¾à¤¨ फ़ोलà¥à¤¡à¤° निकाले." #: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp msgid "Toggle the visibility of hidden files." -msgstr "" +msgstr "छिपी फ़ाइलों की दृशà¥à¤¯ टॉगल कीजिये." #: editor/editor_file_dialog.cpp editor/filesystem_dock.cpp msgid "View items as a grid of thumbnails." -msgstr "" +msgstr "आइटम थमà¥à¤¬à¤¨à¥‡à¤²à¥à¤¸ के ढाà¤à¤šà¥‡ के तरह देखे." #: editor/editor_file_dialog.cpp editor/filesystem_dock.cpp msgid "View items as a list." -msgstr "" +msgstr "आइटम लिसà¥à¤Ÿ के तरह देखे." #: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp msgid "Directories & Files:" -msgstr "" +msgstr "डायरेकà¥à¤Ÿà¤°à¤¿à¤œ & फ़ाइले:" #: editor/editor_file_dialog.cpp editor/plugins/sprite_editor_plugin.cpp #: editor/plugins/style_box_editor_plugin.cpp #: editor/plugins/theme_editor_plugin.cpp msgid "Preview:" -msgstr "" +msgstr "पूरà¥à¤µ दरà¥à¤¶à¤¨:" #: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp msgid "File:" -msgstr "" +msgstr "फ़ाइल:" #: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp msgid "Must use a valid extension." -msgstr "" +msgstr "मानà¥à¤¯ à¤à¤•à¥à¤¸à¤Ÿà¥‡à¤¨à¤¶à¤¨ इसà¥à¤¤à¥‡à¤®à¤¾à¤² कीजिये." #: editor/editor_file_system.cpp msgid "ScanSources" -msgstr "" +msgstr "सà¥à¤°à¥‹à¤¤à¤¸à¥à¤•ैन कीजिये" #: editor/editor_file_system.cpp msgid "" "There are multiple importers for different types pointing to file %s, import " "aborted" msgstr "" +"विà¤à¤¿à¤¨à¥à¤¨ पà¥à¤°à¤•ार के लिठकई आयातक हैं जो % फाइल करने की ओर इशारा करते हैं, आयात निरसà¥à¤¤" #: editor/editor_file_system.cpp msgid "(Re)Importing Assets" -msgstr "" +msgstr "असà¥à¤¸à¥‡à¤Ÿ (पà¥à¤¨:) इंपोरà¥à¤Ÿ" #: editor/editor_help.cpp editor/plugins/spatial_editor_plugin.cpp msgid "Top" -msgstr "" +msgstr "सरà¥à¤µà¥‹à¤šà¥à¤š" #: editor/editor_help.cpp msgid "Class:" -msgstr "" +msgstr "कà¥à¤²à¤¾à¤¸:" #: editor/editor_help.cpp editor/scene_tree_editor.cpp #: editor/script_create_dialog.cpp msgid "Inherits:" -msgstr "" +msgstr "निमà¥à¤¨ का उतà¥à¤¤à¤°à¤¾à¤§à¤¿à¤•ारी:" #: editor/editor_help.cpp msgid "Inherited by:" -msgstr "" +msgstr "निमà¥à¤¨ से उतà¥à¤¤à¤°à¤¾à¤§à¤¿à¤•ार पà¥à¤°à¤¾à¤ªà¥à¤¤:" #: editor/editor_help.cpp msgid "Description" @@ -1933,155 +1934,152 @@ msgstr "विवरण" #: editor/editor_help.cpp msgid "Online Tutorials" -msgstr "" +msgstr "ऑनलाइन टà¥à¤¯à¥‚टोरियल" #: editor/editor_help.cpp msgid "Properties" -msgstr "" +msgstr "पà¥à¤°à¥‹à¤ªà¤°à¤Ÿà¤¿à¤œ" #: editor/editor_help.cpp msgid "override:" -msgstr "" +msgstr "अधिà¤à¤¾à¤µà¥€ करता है:" #: editor/editor_help.cpp msgid "default:" -msgstr "" +msgstr "पà¥à¤°à¤¾à¤¯à¤¿à¤•:" #: editor/editor_help.cpp msgid "Methods" -msgstr "" +msgstr "मेथड" #: editor/editor_help.cpp msgid "Theme Properties" -msgstr "" +msgstr "थिम पà¥à¤°à¥‹à¤ªà¤°à¤Ÿà¤¿à¤œ" #: editor/editor_help.cpp msgid "Enumerations" -msgstr "" +msgstr "à¤à¤¨à¥à¤¯à¥à¤®à¤°à¥‡à¤¶à¤¨" #: editor/editor_help.cpp msgid "Constants" -msgstr "" +msgstr "कोनà¥à¤¸à¥à¤Ÿà¤¨à¥à¤Ÿ" #: editor/editor_help.cpp -#, fuzzy msgid "Property Descriptions" -msgstr "विवरण:" +msgstr "पà¥à¤°à¥‹à¤ªà¤°à¥à¤Ÿà¥€ का विवरण" #: editor/editor_help.cpp -#, fuzzy msgid "(value)" -msgstr "मूलà¥à¤¯ :" +msgstr "(मूलà¥à¤¯)" #: editor/editor_help.cpp msgid "" "There is currently no description for this property. Please help us by " "[color=$color][url=$url]contributing one[/url][/color]!" msgstr "" +"वरà¥à¤¤à¤®à¤¾à¤¨ में पà¥à¤°à¥‹à¤ªà¤°à¥à¤Ÿà¥€ का विवरण नहीं. आप हमें [color=$color][url=$url]योगदान करके[/url]" +"[/color] मदत कर सकते है!" #: editor/editor_help.cpp -#, fuzzy msgid "Method Descriptions" -msgstr "विवरण:" +msgstr "मेथड विवरण" #: editor/editor_help.cpp msgid "" "There is currently no description for this method. Please help us by [color=" "$color][url=$url]contributing one[/url][/color]!" msgstr "" +"वरà¥à¤¤à¤®à¤¾à¤¨ में मेथड का विवरण नहीं. आप हमें [color=$color][url=$url]योगदान करके[/url][/" +"color] मदत कर सकते है!" #: editor/editor_help_search.cpp editor/editor_node.cpp #: editor/plugins/script_editor_plugin.cpp msgid "Search Help" -msgstr "" +msgstr "मदत खोजे" #: editor/editor_help_search.cpp msgid "Case Sensitive" -msgstr "" +msgstr "अकà¥à¤·à¤° संवेदनशील" #: editor/editor_help_search.cpp msgid "Show Hierarchy" -msgstr "" +msgstr "उतà¥à¤•à¥à¤°à¤® दिखाइà¤" #: editor/editor_help_search.cpp msgid "Display All" -msgstr "" +msgstr "सब दिखाइà¤" #: editor/editor_help_search.cpp msgid "Classes Only" -msgstr "" +msgstr "सिरà¥à¤« कà¥à¤²à¤¾à¤¸" #: editor/editor_help_search.cpp msgid "Methods Only" -msgstr "" +msgstr "सिरà¥à¤« मेथड" #: editor/editor_help_search.cpp -#, fuzzy msgid "Signals Only" -msgstr "संकेत" +msgstr "सिरà¥à¤« सिगà¥à¤¨à¤²" #: editor/editor_help_search.cpp msgid "Constants Only" -msgstr "" +msgstr "सिरà¥à¤« कोनà¥à¤¸à¥à¤Ÿà¤¨à¥à¤Ÿ" #: editor/editor_help_search.cpp msgid "Properties Only" -msgstr "" +msgstr "सिरà¥à¤« पà¥à¤°à¥‹à¤ªà¤°à¤Ÿà¤¿à¤œ" #: editor/editor_help_search.cpp msgid "Theme Properties Only" -msgstr "" +msgstr "सिरà¥à¤« थिम पà¥à¤°à¥‹à¤ªà¤°à¤Ÿà¤¿à¤œ" #: editor/editor_help_search.cpp msgid "Member Type" -msgstr "" +msgstr "मेंबर टाइप" #: editor/editor_help_search.cpp msgid "Class" -msgstr "" +msgstr "कà¥à¤²à¤¾à¤¸" #: editor/editor_help_search.cpp msgid "Method" -msgstr "" +msgstr "मेथड" #: editor/editor_help_search.cpp editor/plugins/script_text_editor.cpp -#, fuzzy msgid "Signal" -msgstr "संकेत" +msgstr "सिगà¥à¤¨à¤²" #: editor/editor_help_search.cpp editor/plugins/theme_editor_plugin.cpp msgid "Constant" -msgstr "" +msgstr "कोनà¥à¤¸à¥à¤Ÿà¤¨à¥à¤Ÿ" #: editor/editor_help_search.cpp -#, fuzzy msgid "Property" -msgstr "गà¥à¤£(Property) टà¥à¤°à¥ˆà¤•" +msgstr "पà¥à¤°à¥‹à¤ªà¤°à¥à¤Ÿà¥€" #: editor/editor_help_search.cpp msgid "Theme Property" -msgstr "" +msgstr "थिम पà¥à¤°à¥‹à¤ªà¤°à¥à¤Ÿà¥€" #: editor/editor_inspector.cpp editor/project_settings_editor.cpp msgid "Property:" -msgstr "" +msgstr "पà¥à¤°à¥‹à¤ªà¤°à¥à¤Ÿà¥€:" #: editor/editor_inspector.cpp msgid "Set" -msgstr "" +msgstr "सेट करे" #: editor/editor_inspector.cpp msgid "Set Multiple:" -msgstr "" +msgstr "अनेक सेट करे:" #: editor/editor_log.cpp msgid "Output:" -msgstr "" +msgstr "परिणाम:" #: editor/editor_log.cpp editor/plugins/tile_map_editor_plugin.cpp -#, fuzzy msgid "Copy Selection" -msgstr "सà¤à¥€ खंड" +msgstr "खंड कौपी कीजिये" #: editor/editor_log.cpp editor/editor_network_profiler.cpp #: editor/editor_profiler.cpp editor/editor_properties.cpp @@ -2091,176 +2089,178 @@ msgstr "सà¤à¥€ खंड" #: modules/gdnative/gdnative_library_editor_plugin.cpp scene/gui/line_edit.cpp #: scene/gui/text_edit.cpp msgid "Clear" -msgstr "" +msgstr "साफ़" #: editor/editor_log.cpp msgid "Clear Output" -msgstr "" +msgstr "परिणाम साफ़ करे" #: editor/editor_network_profiler.cpp editor/editor_node.cpp #: editor/editor_profiler.cpp msgid "Stop" -msgstr "" +msgstr "रोकिये" #: editor/editor_network_profiler.cpp editor/editor_profiler.cpp #: editor/plugins/animation_state_machine_editor.cpp editor/rename_dialog.cpp msgid "Start" -msgstr "" +msgstr "शà¥à¤°à¥‚ कीजिये" #: editor/editor_network_profiler.cpp msgid "%s/s" -msgstr "" +msgstr "%s/s" #: editor/editor_network_profiler.cpp msgid "Down" -msgstr "" +msgstr "नीचे" #: editor/editor_network_profiler.cpp msgid "Up" -msgstr "" +msgstr "ऊपर" #: editor/editor_network_profiler.cpp editor/editor_node.cpp msgid "Node" -msgstr "" +msgstr "नोड" #: editor/editor_network_profiler.cpp msgid "Incoming RPC" -msgstr "" +msgstr "आगामी RPC" #: editor/editor_network_profiler.cpp msgid "Incoming RSET" -msgstr "" +msgstr "आगामी RSET" #: editor/editor_network_profiler.cpp msgid "Outgoing RPC" -msgstr "" +msgstr "बाहर जाने वाला RPC" #: editor/editor_network_profiler.cpp msgid "Outgoing RSET" -msgstr "" +msgstr "बाहर जाने वाला RSET" #: editor/editor_node.cpp editor/project_manager.cpp msgid "New Window" -msgstr "" +msgstr "नया विंडो" #: editor/editor_node.cpp msgid "Imported resources can't be saved." -msgstr "" +msgstr "इंपोरà¥à¤Ÿà¥‡à¤¡ रेसोरà¥à¤¸à¥‡à¤¸ सेव नहीं कर सकते." #: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp #: scene/gui/dialogs.cpp msgid "OK" -msgstr "" +msgstr "ठीक है" #: editor/editor_node.cpp editor/plugins/animation_player_editor_plugin.cpp msgid "Error saving resource!" -msgstr "" +msgstr "रेसोरà¥à¤¸ सेव करनेमे à¤à¤°à¤°!" #: editor/editor_node.cpp msgid "" "This resource can't be saved because it does not belong to the edited scene. " "Make it unique first." -msgstr "" +msgstr "रेसोरà¥à¤¸ सेव नहीं कर सकते कà¥à¤¯à¥‹à¤‚कि यह संपादित सीन से संबंधित नहीं. इसे पहले यà¥à¤¨à¤¿à¤• बनाय." #: editor/editor_node.cpp editor/plugins/animation_player_editor_plugin.cpp msgid "Save Resource As..." -msgstr "" +msgstr "रेसोरà¥à¤¸ इसपà¥à¤°à¤•ार सेव कीजिये..." #: editor/editor_node.cpp msgid "Can't open file for writing:" -msgstr "" +msgstr "फ़ाइल रायटिंग के लिठनहीं खोल सकते:" #: editor/editor_node.cpp msgid "Requested file format unknown:" -msgstr "" +msgstr "निवेदित फ़ाइल फ़ोरà¥à¤®à¥ˆà¤Ÿ अजà¥à¤žà¤¾à¤¤:" #: editor/editor_node.cpp msgid "Error while saving." -msgstr "" +msgstr "सेव करनेमे à¤à¤°à¤°." #: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp msgid "Can't open '%s'. The file could have been moved or deleted." -msgstr "" +msgstr "'%s' नहीं खोल सकते. फ़ाइल हिलाइ गयी या हटाई गयी." #: editor/editor_node.cpp msgid "Error while parsing '%s'." -msgstr "" +msgstr "'%s' पारà¥à¤¸ करनेमे à¤à¤°à¤°." #: editor/editor_node.cpp msgid "Unexpected end of file '%s'." -msgstr "" +msgstr "अनपेकà¥à¤·à¤¿à¤¤ फ़ाइल समापà¥à¤¤à¤¿ '%s'." #: editor/editor_node.cpp msgid "Missing '%s' or its dependencies." -msgstr "" +msgstr "'%s' या उसकी निरà¥à¤à¤°à¤¿à¤¤ फ़ाइलें नहीं मिली." #: editor/editor_node.cpp msgid "Error while loading '%s'." -msgstr "" +msgstr "लोड करनेमे à¤à¤°à¤° '%s'." #: editor/editor_node.cpp msgid "Saving Scene" -msgstr "" +msgstr "सीन सेव कर रहा है" #: editor/editor_node.cpp msgid "Analyzing" -msgstr "" +msgstr "विशà¥à¤²à¥‡à¤·à¤£" #: editor/editor_node.cpp msgid "Creating Thumbnail" -msgstr "" +msgstr "थंबनेल बनाना" #: editor/editor_node.cpp msgid "This operation can't be done without a tree root." -msgstr "" +msgstr "यह ऑपरेशन पेड़ की जड़ के बिना नहीं किया जा सकता है।" #: editor/editor_node.cpp msgid "" "This scene can't be saved because there is a cyclic instancing inclusion.\n" "Please resolve it and then attempt to save again." msgstr "" +"इस दृशà¥à¤¯ को बचाया नहीं जा सकता कà¥à¤¯à¥‹à¤‚कि à¤à¤• चकà¥à¤°à¥€à¤¯ instancing समावेश है ।\n" +"कृपया इसे हल करें और फिर फिर से बचाने का पà¥à¤°à¤¯à¤¾à¤¸ करें।" #: editor/editor_node.cpp msgid "" "Couldn't save scene. Likely dependencies (instances or inheritance) couldn't " "be satisfied." -msgstr "" +msgstr "दृशà¥à¤¯ नहीं बचा सका । संà¤à¤¾à¤µà¤¿à¤¤ निरà¥à¤à¤°à¤¤à¤¾ (उदाहरण या विरासत) संतà¥à¤·à¥à¤Ÿ नहीं हो सकीं।" #: editor/editor_node.cpp editor/scene_tree_dock.cpp msgid "Can't overwrite scene that is still open!" -msgstr "" +msgstr "दृशà¥à¤¯ है कि अà¤à¥€ à¤à¥€ खà¥à¤²à¤¾ है ओवरराइट नहीं कर सकते!" #: editor/editor_node.cpp msgid "Can't load MeshLibrary for merging!" -msgstr "" +msgstr "विलय के लिठMeshLibrary लोड नहीं कर सकते!" #: editor/editor_node.cpp msgid "Error saving MeshLibrary!" -msgstr "" +msgstr "तà¥à¤°à¥à¤Ÿà¤¿ बचत मेष लाइबà¥à¤°à¥‡à¤°à¥€!" #: editor/editor_node.cpp msgid "Can't load TileSet for merging!" -msgstr "" +msgstr "विलय के लिठTileSet लोड नहीं कर सकते!" #: editor/editor_node.cpp msgid "Error saving TileSet!" -msgstr "" +msgstr "तà¥à¤°à¥à¤Ÿà¤¿ बचत टाइलसेट!" #: editor/editor_node.cpp msgid "Error trying to save layout!" -msgstr "" +msgstr "लेआउट को बचाने की कोशिश कर रहा तà¥à¤°à¥à¤Ÿà¤¿!" #: editor/editor_node.cpp msgid "Default editor layout overridden." -msgstr "" +msgstr "डिफ़ॉलà¥à¤Ÿ संपादक लेआउट अà¤à¤¿à¤à¥‚त।" #: editor/editor_node.cpp msgid "Layout name not found!" -msgstr "" +msgstr "लेआउट नाम नहीं मिला!" #: editor/editor_node.cpp msgid "Restored default layout to base settings." -msgstr "" +msgstr "आधार सेटिंगà¥à¤¸ के लिठडिफ़ॉलà¥à¤Ÿ लेआउट बहाल।" #: editor/editor_node.cpp msgid "" @@ -2268,18 +2268,26 @@ msgid "" "Please read the documentation relevant to importing scenes to better " "understand this workflow." msgstr "" +"यह संसाधन à¤à¤• दृशà¥à¤¯ है कि आयात किया गया था के अंतरà¥à¤—त आता है, तो यह संपादन योगà¥à¤¯ नहीं है " +"।\n" +"कृपया इस कारà¥à¤¯à¤ªà¥à¤°à¤µà¤¾à¤¹ को बेहतर ढंग से समà¤à¤¨à¥‡ के लिठदृशà¥à¤¯à¥‹à¤‚ का आयात करने के लिठपà¥à¤°à¤¾à¤¸à¤‚गिक " +"दसà¥à¤¤à¤¾à¤µà¥‡à¤œ पढ़ें।" #: editor/editor_node.cpp msgid "" "This resource belongs to a scene that was instanced or inherited.\n" "Changes to it won't be kept when saving the current scene." msgstr "" +"यह संसाधन à¤à¤• दृशà¥à¤¯ है कि उदाहरण या विरासत में मिला था के अंतरà¥à¤—त आता है ।\n" +"वरà¥à¤¤à¤®à¤¾à¤¨ दृशà¥à¤¯ को सहेजते समय इसमें परिवरà¥à¤¤à¤¨ नहीं रखे जाà¤à¤‚गे।" #: editor/editor_node.cpp msgid "" "This resource was imported, so it's not editable. Change its settings in the " "import panel and then re-import." msgstr "" +"इस संसाधन का आयात किया गया था, तो यह संपादन योगà¥à¤¯ नहीं है । आयात पैनल में अपनी सेटिंग " +"बदलें और फिर फिर से आयात करें।" #: editor/editor_node.cpp msgid "" @@ -2288,6 +2296,10 @@ msgid "" "Please read the documentation relevant to importing scenes to better " "understand this workflow." msgstr "" +"यह दृशà¥à¤¯ आयात किया गया था, इसलिठइसमें परिवरà¥à¤¤à¤¨ नहीं रखे जाà¤à¤‚गे।\n" +"यह instancing या विरासत में यह परिवरà¥à¤¤à¤¨ करने की अनà¥à¤®à¤¤à¤¿ होगी ।\n" +"कृपया इस कारà¥à¤¯à¤ªà¥à¤°à¤µà¤¾à¤¹ को बेहतर ढंग से समà¤à¤¨à¥‡ के लिठदृशà¥à¤¯à¥‹à¤‚ का आयात करने के लिठपà¥à¤°à¤¾à¤¸à¤‚गिक " +"दसà¥à¤¤à¤¾à¤µà¥‡à¤œ पढ़ें।" #: editor/editor_node.cpp msgid "" @@ -2295,201 +2307,209 @@ msgid "" "Please read the documentation relevant to debugging to better understand " "this workflow." msgstr "" +"यह à¤à¤• दूरसà¥à¤¥ वसà¥à¤¤à¥ है, इसलिठइसमें परिवरà¥à¤¤à¤¨ नहीं रखे जाà¤à¤‚गे।\n" +"कृपया इस कारà¥à¤¯à¤ªà¥à¤°à¤µà¤¾à¤¹ को बेहतर ढंग से समà¤à¤¨à¥‡ के लिठडिबगिंग के लिठपà¥à¤°à¤¾à¤¸à¤‚गिक दसà¥à¤¤à¤¾à¤µà¥‡à¤œ पढ़ें।" #: editor/editor_node.cpp msgid "There is no defined scene to run." -msgstr "" +msgstr "चलाने के लिठकोई परिà¤à¤¾à¤·à¤¿à¤¤ दृशà¥à¤¯ नहीं है ।" #: editor/editor_node.cpp msgid "Current scene was never saved, please save it prior to running." -msgstr "" +msgstr "वरà¥à¤¤à¤®à¤¾à¤¨ दृशà¥à¤¯ कà¤à¥€ नहीं बचाया गया था, कृपया इसे चलाने से पहले बचाने के लिठ।" #: editor/editor_node.cpp msgid "Could not start subprocess!" -msgstr "" +msgstr "उपपà¥à¤°à¤•à¥à¤°à¤¿à¤¯à¤¾ शà¥à¤°à¥‚ नहीं कर सका!" #: editor/editor_node.cpp editor/filesystem_dock.cpp msgid "Open Scene" -msgstr "" +msgstr "खà¥à¤²à¤¾ दृशà¥à¤¯" #: editor/editor_node.cpp msgid "Open Base Scene" -msgstr "" +msgstr "ओपन बेस सीन" #: editor/editor_node.cpp -#, fuzzy msgid "Quick Open..." -msgstr "खोलो इसे" +msgstr "तà¥à¤°à¤‚त खोलिये..." #: editor/editor_node.cpp msgid "Quick Open Scene..." -msgstr "" +msgstr "कà¥à¤µà¤¿à¤• ओपन सीन..." #: editor/editor_node.cpp msgid "Quick Open Script..." -msgstr "" +msgstr "कà¥à¤µà¤¿à¤• ओपन सà¥à¤•à¥à¤°à¤¿à¤ªà¥à¤Ÿ..." #: editor/editor_node.cpp msgid "Save & Close" -msgstr "" +msgstr "सहेजें और बंद" #: editor/editor_node.cpp msgid "Save changes to '%s' before closing?" -msgstr "" +msgstr "बंद करने से पहले '%' में परिवरà¥à¤¤à¤¨ सहेजें?" #: editor/editor_node.cpp msgid "Saved %s modified resource(s)." -msgstr "" +msgstr "सहेजा गया% संशोधित संसाधन (à¤à¤¸)" #: editor/editor_node.cpp msgid "A root node is required to save the scene." -msgstr "" +msgstr "दृशà¥à¤¯ को बचाने के लिठà¤à¤• रूट नोड की आवशà¥à¤¯à¤•ता होती है।" #: editor/editor_node.cpp msgid "Save Scene As..." -msgstr "" +msgstr "दृशà¥à¤¯ के रूप में सहेजें ..." #: editor/editor_node.cpp msgid "No" -msgstr "" +msgstr "नहीं" #: editor/editor_node.cpp msgid "Yes" -msgstr "" +msgstr "हाà¤" #: editor/editor_node.cpp msgid "This scene has never been saved. Save before running?" -msgstr "" +msgstr "इस सीन को कà¤à¥€ नहीं बचाया गया। दौड़ने से पहले सहेजें?" #: editor/editor_node.cpp editor/scene_tree_dock.cpp msgid "This operation can't be done without a scene." -msgstr "" +msgstr "यह ऑपरेशन बिना किसी दृशà¥à¤¯ के नहीं किया जा सकता है।" #: editor/editor_node.cpp msgid "Export Mesh Library" -msgstr "" +msgstr "निरà¥à¤¯à¤¾à¤¤ मेष पà¥à¤¸à¥à¤¤à¤•ालय" #: editor/editor_node.cpp msgid "This operation can't be done without a root node." -msgstr "" +msgstr "यह ऑपरेशन रूट नोड के बिना नहीं किया जा सकता है।" #: editor/editor_node.cpp msgid "Export Tile Set" -msgstr "" +msgstr "निरà¥à¤¯à¤¾à¤¤ टाइल सेट" #: editor/editor_node.cpp msgid "This operation can't be done without a selected node." -msgstr "" +msgstr "यह ऑपरेशन चयनित नोड के बिना नहीं किया जा सकता है।" #: editor/editor_node.cpp msgid "Current scene not saved. Open anyway?" -msgstr "" +msgstr "वरà¥à¤¤à¤®à¤¾à¤¨ दृशà¥à¤¯ को बचाया नहीं गया । वैसे à¤à¥€ खà¥à¤²à¤¾?" #: editor/editor_node.cpp msgid "Can't reload a scene that was never saved." -msgstr "" +msgstr "à¤à¤• दृशà¥à¤¯ है कि कà¤à¥€ नहीं बचाया गया था फिर से लोड नहीं कर सकते ।" #: editor/editor_node.cpp msgid "Revert" -msgstr "" +msgstr "वापस लौटना" #: editor/editor_node.cpp msgid "This action cannot be undone. Revert anyway?" -msgstr "" +msgstr "इस कारà¥à¤°à¤µà¤¾à¤ˆ को पूरà¥à¤µà¤µà¤¤ नहीं किया जा सकता । वैसे à¤à¥€ वापस?" #: editor/editor_node.cpp msgid "Quick Run Scene..." -msgstr "" +msgstr "कà¥à¤µà¤¿à¤• रन सीन..." #: editor/editor_node.cpp msgid "Quit" -msgstr "" +msgstr "छोड़ना" #: editor/editor_node.cpp msgid "Exit the editor?" -msgstr "" +msgstr "संपादक से बाहर निकलें?" #: editor/editor_node.cpp msgid "Open Project Manager?" -msgstr "" +msgstr "ओपन पà¥à¤°à¥‹à¤œà¥‡à¤•à¥à¤Ÿ मैनेजर?" #: editor/editor_node.cpp msgid "Save & Quit" -msgstr "" +msgstr "सहेजें और छोड़ो" #: editor/editor_node.cpp msgid "Save changes to the following scene(s) before quitting?" -msgstr "" +msgstr "छोड़ने से पहले निमà¥à¤¨à¤²à¤¿à¤–ित दृशà¥à¤¯ (ओं) में परिवरà¥à¤¤à¤¨ सहेजें?" #: editor/editor_node.cpp msgid "Save changes the following scene(s) before opening Project Manager?" -msgstr "" +msgstr "परियोजना पà¥à¤°à¤¬à¤‚धक खोलने से पहले निमà¥à¤¨à¤²à¤¿à¤–ित दृशà¥à¤¯ (ओं) में परिवरà¥à¤¤à¤¨ सहेजें?" #: editor/editor_node.cpp msgid "" "This option is deprecated. Situations where refresh must be forced are now " "considered a bug. Please report." msgstr "" +"यह विकलà¥à¤ª बहिषà¥à¤•ृत है। सà¥à¤¥à¤¿à¤¤à¤¿à¤¯à¥‹à¤‚ जहां ताज़ा मजबूर किया जाना चाहिठअब à¤à¤• बग माना जाता " +"है । कृपया रिपोरà¥à¤Ÿ करें।" #: editor/editor_node.cpp msgid "Pick a Main Scene" -msgstr "" +msgstr "à¤à¤• मà¥à¤–à¥à¤¯ दृशà¥à¤¯ चà¥à¤¨à¥‡à¤‚" #: editor/editor_node.cpp msgid "Close Scene" -msgstr "" +msgstr "कà¥à¤²à¥‹à¤œ सीन" #: editor/editor_node.cpp -#, fuzzy msgid "Reopen Closed Scene" -msgstr "खोलो इसे" +msgstr "बंद सीन फिर से खोलें" #: editor/editor_node.cpp msgid "Unable to enable addon plugin at: '%s' parsing of config failed." -msgstr "" +msgstr "à¤à¤¡à¤‘न पà¥à¤²à¤—इन को सकà¥à¤·à¤® करने में असमरà¥à¤¥: '%' कॉनà¥à¤«à¤¿à¤— का पारà¥à¤¸à¤¿à¤‚ग विफल रहा।" #: editor/editor_node.cpp msgid "Unable to find script field for addon plugin at: 'res://addons/%s'." -msgstr "" +msgstr "à¤à¤¡à¤‘न पà¥à¤²à¤—इन के लिठसà¥à¤•à¥à¤°à¤¿à¤ªà¥à¤Ÿ फ़ीलà¥à¤¡ खोजने में असमरà¥à¤¥: 'res://addons/% s'।" #: editor/editor_node.cpp msgid "Unable to load addon script from path: '%s'." -msgstr "" +msgstr "पथ से à¤à¤¡à¤‘न सà¥à¤•à¥à¤°à¤¿à¤ªà¥à¤Ÿ लोड करने में असमरà¥à¤¥: '%' ।" #: editor/editor_node.cpp msgid "" "Unable to load addon script from path: '%s' There seems to be an error in " "the code, please check the syntax." msgstr "" +"रासà¥à¤¤à¥‡ से à¤à¤¡à¤‘न सà¥à¤•à¥à¤°à¤¿à¤ªà¥à¤Ÿ लोड करने में असमरà¥à¤¥: '% à¤à¤¸' कोड में गड़बड़ी लगती है, कृपया सिंटेकà¥à¤¸ की " +"जांच करें।" #: editor/editor_node.cpp msgid "" "Unable to load addon script from path: '%s' Base type is not EditorPlugin." -msgstr "" +msgstr "पथ से à¤à¤¡à¤‘न सà¥à¤•à¥à¤°à¤¿à¤ªà¥à¤Ÿ लोड करने में असमरà¥à¤¥: '%' आधार पà¥à¤°à¤•ार संपादकपà¥à¤²à¤—इन नहीं है।" #: editor/editor_node.cpp msgid "Unable to load addon script from path: '%s' Script is not in tool mode." -msgstr "" +msgstr "पथ से à¤à¤¡à¤‘न सà¥à¤•à¥à¤°à¤¿à¤ªà¥à¤Ÿ लोड करने में असमरà¥à¤¥: '%' सà¥à¤•à¥à¤°à¤¿à¤ªà¥à¤Ÿ टूल मोड में नहीं है।" #: editor/editor_node.cpp msgid "" "Scene '%s' was automatically imported, so it can't be modified.\n" "To make changes to it, a new inherited scene can be created." msgstr "" +"दृशà¥à¤¯ '%' सà¥à¤µà¤šà¤¾à¤²à¤¿à¤¤ रूप से आयात किया गया था, इसलिठइसे संशोधित नहीं किया जा सकता है।\n" +"इसमें बदलाव करने के लिठविरासत में मिला à¤à¤• नया सीन बनाया जा सकता है।" #: editor/editor_node.cpp msgid "" "Error loading scene, it must be inside the project path. Use 'Import' to " "open the scene, then save it inside the project path." msgstr "" +"तà¥à¤°à¥à¤Ÿà¤¿ लोडिंग दृशà¥à¤¯, यह परियोजना पथ के अंदर होना चाहिà¤à¥¤ दृशà¥à¤¯ खोलने के लिठ'आयात' का " +"उपयोग करें, फिर इसे परियोजना पथ के अंदर बचाà¤à¤‚।" #: editor/editor_node.cpp msgid "Scene '%s' has broken dependencies:" -msgstr "" +msgstr "दृशà¥à¤¯ '%' निरà¥à¤à¤°à¤¤à¤¾ टूट गया है:" #: editor/editor_node.cpp msgid "Clear Recent Scenes" -msgstr "" +msgstr "हाल के दृशà¥à¤¯à¥‹à¤‚ को साफ करें" #: editor/editor_node.cpp msgid "" @@ -2497,6 +2517,8 @@ msgid "" "You can change it later in \"Project Settings\" under the 'application' " "category." msgstr "" +"कोई मà¥à¤–à¥à¤¯ दृशà¥à¤¯ कà¤à¥€ परिà¤à¤¾à¤·à¤¿à¤¤ किया गया है, à¤à¤• का चयन करें?\n" +"आप इसे बाद में 'à¤à¤ªà¥à¤²à¤¿à¤•ेशन' शà¥à¤°à¥‡à¤£à¥€ के तहत \"पà¥à¤°à¥‹à¤œà¥‡à¤•à¥à¤Ÿ सेटिंगà¥à¤¸\" में बदल सकते हैं।" #: editor/editor_node.cpp msgid "" @@ -2504,6 +2526,8 @@ msgid "" "You can change it later in \"Project Settings\" under the 'application' " "category." msgstr "" +"चयनित दृशà¥à¤¯ '%' मौजूद नहीं है, à¤à¤• वैध का चयन करें?\n" +"आप इसे बाद में 'à¤à¤ªà¥à¤²à¤¿à¤•ेशन' शà¥à¤°à¥‡à¤£à¥€ के तहत \"पà¥à¤°à¥‹à¤œà¥‡à¤•à¥à¤Ÿ सेटिंगà¥à¤¸\" में बदल सकते हैं।" #: editor/editor_node.cpp msgid "" @@ -2511,232 +2535,230 @@ msgid "" "You can change it later in \"Project Settings\" under the 'application' " "category." msgstr "" +"चयनित दृशà¥à¤¯ '%' à¤à¤• दृशà¥à¤¯ फ़ाइल नहीं है, à¤à¤• वैध का चयन करें?\n" +"आप इसे बाद में 'à¤à¤ªà¥à¤²à¤¿à¤•ेशन' शà¥à¤°à¥‡à¤£à¥€ के तहत \"पà¥à¤°à¥‹à¤œà¥‡à¤•à¥à¤Ÿ सेटिंगà¥à¤¸\" में बदल सकते हैं।" #: editor/editor_node.cpp msgid "Save Layout" -msgstr "" +msgstr "लेआउट सहेजें" #: editor/editor_node.cpp msgid "Delete Layout" -msgstr "" +msgstr "लेआउट हटाà¤à¤‚" #: editor/editor_node.cpp editor/import_dock.cpp #: editor/script_create_dialog.cpp msgid "Default" -msgstr "" +msgstr "चूक" #: editor/editor_node.cpp editor/editor_properties.cpp #: editor/plugins/script_editor_plugin.cpp editor/property_editor.cpp msgid "Show in FileSystem" -msgstr "" +msgstr "शो में फाइल सिसà¥à¤Ÿà¤®" #: editor/editor_node.cpp msgid "Play This Scene" -msgstr "" +msgstr "इस दृशà¥à¤¯ को खेलो" #: editor/editor_node.cpp -#, fuzzy msgid "Close Tab" -msgstr "बंद करे" +msgstr "टैब बंद करे" #: editor/editor_node.cpp -#, fuzzy msgid "Undo Close Tab" -msgstr "बंद करे" +msgstr "बंद टैब अनकिया करें" #: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp msgid "Close Other Tabs" -msgstr "" +msgstr "बंद करें अनà¥à¤¯ टैब" #: editor/editor_node.cpp msgid "Close Tabs to the Right" -msgstr "" +msgstr "टैब को दाईं ओर बंद करें" #: editor/editor_node.cpp -#, fuzzy msgid "Close All Tabs" -msgstr "बंद करे" +msgstr "सà¤à¥€ टैब बंद करे" #: editor/editor_node.cpp msgid "Switch Scene Tab" -msgstr "" +msgstr "सà¥à¤µà¤¿à¤š सीन टैब" #: editor/editor_node.cpp msgid "%d more files or folders" -msgstr "" +msgstr "% डी अधिक फाइलें या फ़ोलà¥à¤¡à¤°" #: editor/editor_node.cpp msgid "%d more folders" -msgstr "" +msgstr "% डी अधिक फ़ोलà¥à¤¡à¤°à¥à¤¸" #: editor/editor_node.cpp msgid "%d more files" -msgstr "" +msgstr "% डी अधिक फाइलें" #: editor/editor_node.cpp msgid "Dock Position" -msgstr "" +msgstr "डॉक पोजीशन" #: editor/editor_node.cpp msgid "Distraction Free Mode" -msgstr "" +msgstr "वà¥à¤¯à¤¾à¤•à¥à¤²à¤¤à¤¾ मà¥à¤•à¥à¤¤ मोड" #: editor/editor_node.cpp msgid "Toggle distraction-free mode." -msgstr "" +msgstr "वà¥à¤¯à¤¾à¤•à¥à¤²à¤¤à¤¾ मà¥à¤•à¥à¤¤ मोड टॉगल।" #: editor/editor_node.cpp msgid "Add a new scene." -msgstr "" +msgstr "à¤à¤• नया दृशà¥à¤¯ जोड़ें।" #: editor/editor_node.cpp msgid "Scene" -msgstr "" +msgstr "दृशà¥à¤¯" #: editor/editor_node.cpp msgid "Go to previously opened scene." -msgstr "" +msgstr "पहले खोले गठदृशà¥à¤¯ में जाà¤à¤‚।" #: editor/editor_node.cpp -#, fuzzy msgid "Copy Text" -msgstr "सà¤à¥€ खंड" +msgstr "टेकà¥à¤¸à¥à¤Ÿ कौपी कीजिये" #: editor/editor_node.cpp msgid "Next tab" -msgstr "" +msgstr "अगला टैब" #: editor/editor_node.cpp msgid "Previous tab" -msgstr "" +msgstr "पिछला टैब" #: editor/editor_node.cpp msgid "Filter Files..." -msgstr "" +msgstr "फ़िलà¥à¤Ÿà¤° फ़ाइलें..." #: editor/editor_node.cpp msgid "Operations with scene files." -msgstr "" +msgstr "दृशà¥à¤¯ फ़ाइलों के साथ संचालन।" #: editor/editor_node.cpp msgid "New Scene" -msgstr "" +msgstr "नया दृशà¥à¤¯" #: editor/editor_node.cpp msgid "New Inherited Scene..." -msgstr "" +msgstr "नया विरासत में मिला दृशà¥à¤¯..." #: editor/editor_node.cpp msgid "Open Scene..." -msgstr "" +msgstr "खà¥à¤²à¤¾ दृशà¥à¤¯..." #: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp msgid "Open Recent" -msgstr "" +msgstr "खà¥à¤²à¤¾ हाल" #: editor/editor_node.cpp msgid "Save Scene" -msgstr "" +msgstr "दृशà¥à¤¯ बचाओ" #: editor/editor_node.cpp msgid "Save All Scenes" -msgstr "" +msgstr "सà¤à¥€ दृशà¥à¤¯à¥‹à¤‚ को सहेजें" #: editor/editor_node.cpp msgid "Convert To..." -msgstr "" +msgstr "बदलने के लिà¤..." #: editor/editor_node.cpp msgid "MeshLibrary..." -msgstr "" +msgstr "मेष लाइबà¥à¤°à¥‡à¤°à¥€..." #: editor/editor_node.cpp msgid "TileSet..." -msgstr "" +msgstr "Tileset ..." #: editor/editor_node.cpp editor/plugins/script_text_editor.cpp #: scene/gui/line_edit.cpp scene/gui/text_edit.cpp msgid "Undo" -msgstr "" +msgstr "पूरà¥à¤µà¤µà¤¤à¥" #: editor/editor_node.cpp editor/plugins/script_text_editor.cpp #: scene/gui/line_edit.cpp scene/gui/text_edit.cpp msgid "Redo" -msgstr "" +msgstr "दोहराà¤à¤" #: editor/editor_node.cpp msgid "Revert Scene" -msgstr "" +msgstr "वापस दृशà¥à¤¯" #: editor/editor_node.cpp msgid "Miscellaneous project or scene-wide tools." -msgstr "" +msgstr "विविध परियोजना या दृशà¥à¤¯-वà¥à¤¯à¤¾à¤ªà¥€ उपकरण।" #: editor/editor_node.cpp editor/project_manager.cpp #: editor/script_create_dialog.cpp msgid "Project" -msgstr "" +msgstr "परियोजना" #: editor/editor_node.cpp msgid "Project Settings..." -msgstr "" +msgstr "पà¥à¤°à¥‹à¤œà¥‡à¤•à¥à¤Ÿ सेटिंग ..." #: editor/editor_node.cpp editor/plugins/version_control_editor_plugin.cpp msgid "Version Control" -msgstr "" +msgstr "वरà¥à¤œà¤¨ कंटà¥à¤°à¥‹à¤²" #: editor/editor_node.cpp editor/plugins/version_control_editor_plugin.cpp msgid "Set Up Version Control" -msgstr "" +msgstr "वरà¥à¤œà¤¨ नियंतà¥à¤°à¤£ सà¥à¤¥à¤¾à¤ªà¤¿à¤¤ करें" #: editor/editor_node.cpp msgid "Shut Down Version Control" -msgstr "" +msgstr "वरà¥à¤œà¤¨ नियंतà¥à¤°à¤£ बंद करें" #: editor/editor_node.cpp msgid "Export..." -msgstr "" +msgstr "निरà¥à¤¯à¤¾à¤¤..." #: editor/editor_node.cpp msgid "Install Android Build Template..." -msgstr "" +msgstr "à¤à¤‚डà¥à¤°à¥‰à¤¯à¤¡ बिलà¥à¤¡ टेमà¥à¤ªà¤²à¥‡à¤Ÿ सà¥à¤¥à¤¾à¤ªà¤¿à¤¤ करें..." #: editor/editor_node.cpp -#, fuzzy msgid "Open Project Data Folder" -msgstr "परियोजना के संसà¥à¤¥à¤¾à¤ªà¤•" +msgstr "पà¥à¤°à¥‹à¤œà¥‡à¤•à¥à¤Ÿ डेटा फ़ोलà¥à¤¡à¤° खोलिये" #: editor/editor_node.cpp editor/plugins/tile_set_editor_plugin.cpp msgid "Tools" -msgstr "" +msgstr "उपकरण" #: editor/editor_node.cpp -#, fuzzy msgid "Orphan Resource Explorer..." -msgstr "Orphan Resource Explorer" +msgstr "असहाय रेसोरà¥à¤¸ खोजकरà¥à¤¤à¤¾..." #: editor/editor_node.cpp msgid "Quit to Project List" -msgstr "" +msgstr "परियोजना सूची में छोड़ो" #: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp #: editor/project_export.cpp msgid "Debug" -msgstr "" +msgstr "डीबग करें" #: editor/editor_node.cpp msgid "Deploy with Remote Debug" -msgstr "" +msgstr "रिमोट डिबग के साथ तैनात" #: editor/editor_node.cpp msgid "" "When exporting or deploying, the resulting executable will attempt to " "connect to the IP of this computer in order to be debugged." msgstr "" +"निरà¥à¤¯à¤¾à¤¤ या तैनाती करते समय, परिणामी निषà¥à¤ªà¤¾à¤¦à¤• इस कंपà¥à¤¯à¥‚टर के आईपी से जà¥à¤¡à¤¼à¤¨à¥‡ का पà¥à¤°à¤¯à¤¾à¤¸ करेगा " +"ताकि डिबग किया जा सके।" #: editor/editor_node.cpp msgid "Small Deploy with Network FS" -msgstr "" +msgstr "नेटवरà¥à¤• à¤à¤«à¤à¤¸ के साथ छोटे तैनात" #: editor/editor_node.cpp msgid "" @@ -2747,30 +2769,36 @@ msgid "" "On Android, deploy will use the USB cable for faster performance. This " "option speeds up testing for games with a large footprint." msgstr "" +"जब यह विकलà¥à¤ª सकà¥à¤·à¤® हो जाता है, तो निरà¥à¤¯à¤¾à¤¤ या तैनाती नà¥à¤¯à¥‚नतम निषà¥à¤ªà¤¾à¤¦à¤¿à¤¤ उतà¥à¤ªà¤¾à¤¦à¤¨ करेगी।\n" +"नेटवरà¥à¤• के ऊपर संपादक दà¥à¤µà¤¾à¤°à¤¾ परियोजना से फाइलसिसà¥à¤Ÿà¤® उपलबà¥à¤§ कराया जाà¤à¤—ा।\n" +"à¤à¤‚डà¥à¤°à¥‰à¤¯à¤¡ पर, तैनात तेजी से पà¥à¤°à¤¦à¤°à¥à¤¶à¤¨ के लिठयूà¤à¤¸à¤¬à¥€ केबल का उपयोग करेंगे । यह विकलà¥à¤ª à¤à¤• बड़े " +"पदचिहà¥à¤¨ के साथ खेल के लिठपरीकà¥à¤·à¤£ को गति देता है।" #: editor/editor_node.cpp msgid "Visible Collision Shapes" -msgstr "" +msgstr "दृशà¥à¤¯à¤®à¤¾à¤¨ टकराव आकार" #: editor/editor_node.cpp msgid "" "Collision shapes and raycast nodes (for 2D and 3D) will be visible on the " "running game if this option is turned on." msgstr "" +"यदि यह विकलà¥à¤ª चालू हो जाता है तो टकराव के आकार और रेकासà¥à¤Ÿ नोडà¥à¤¸ (2डी और 3 डी के लिà¤) " +"चल रहे खेल पर दिखाई देंगे।" #: editor/editor_node.cpp msgid "Visible Navigation" -msgstr "" +msgstr "दरà¥à¤¶à¤¨à¥€à¤¯ नेविगेशन" #: editor/editor_node.cpp msgid "" "Navigation meshes and polygons will be visible on the running game if this " "option is turned on." -msgstr "" +msgstr "यदि यह विकलà¥à¤ª चालू हो जाता है तो नेविगेशन मेशेस और बहà¥à¤à¥à¤œ चल रहे खेल पर दिखाई देंगे।" #: editor/editor_node.cpp msgid "Sync Scene Changes" -msgstr "" +msgstr "सिंक सीन बदलता है" #: editor/editor_node.cpp msgid "" @@ -2779,10 +2807,14 @@ msgid "" "When used remotely on a device, this is more efficient with network " "filesystem." msgstr "" +"जब इस विकलà¥à¤ª को चालू किया जाता है, तो संपादक में दृशà¥à¤¯ में किठगठकिसी à¤à¥€ परिवरà¥à¤¤à¤¨ को " +"चल रहे खेल में दोहराया जाà¤à¤—ा।\n" +"जब किसी डिवाइस पर दूर से उपयोग किया जाता है, तो यह नेटवरà¥à¤• फाइलसिसà¥à¤Ÿà¤® के साथ अधिक " +"कà¥à¤¶à¤² होता है।" #: editor/editor_node.cpp msgid "Sync Script Changes" -msgstr "" +msgstr "सिंक सà¥à¤•à¥à¤°à¤¿à¤ªà¥à¤Ÿ परिवरà¥à¤¤à¤¨" #: editor/editor_node.cpp msgid "" @@ -2791,59 +2823,62 @@ msgid "" "When used remotely on a device, this is more efficient with network " "filesystem." msgstr "" +"जब यह विकलà¥à¤ª चालू हो जाà¤à¤—ा, तो सहेजी गई किसी à¤à¥€ सà¥à¤•à¥à¤°à¤¿à¤ªà¥à¤Ÿ को चल रहे गेम पर फिर से लोड " +"किया जाà¤à¤—ा।\n" +"जब किसी डिवाइस पर दूर से उपयोग किया जाता है, तो यह नेटवरà¥à¤• फाइलसिसà¥à¤Ÿà¤® के साथ अधिक " +"कà¥à¤¶à¤² होता है।" #: editor/editor_node.cpp editor/script_create_dialog.cpp msgid "Editor" -msgstr "" +msgstr "संपादक" #: editor/editor_node.cpp -#, fuzzy msgid "Editor Settings..." -msgstr "अनà¥à¤µà¤¾à¤¦ में बदलाव करें:" +msgstr "à¤à¤¡à¥€à¤Ÿà¤° सेटिनà¥à¤—स..." #: editor/editor_node.cpp msgid "Editor Layout" -msgstr "" +msgstr "संपादक लेआउट" #: editor/editor_node.cpp msgid "Take Screenshot" -msgstr "" +msgstr "सà¥à¤•à¥à¤°à¥€à¤¨à¤¶à¥‰à¤Ÿ लें" #: editor/editor_node.cpp msgid "Screenshots are stored in the Editor Data/Settings Folder." -msgstr "" +msgstr "सà¥à¤•à¥à¤°à¥€à¤¨à¤¶à¥‰à¤Ÿ à¤à¤¡à¤¿à¤Ÿà¤° डेटा/सेटिंगà¥à¤¸ फोलà¥à¤¡à¤° में सà¥à¤Ÿà¥‹à¤° किठजाते हैं ।" #: editor/editor_node.cpp msgid "Toggle Fullscreen" -msgstr "" +msgstr "पूरà¥à¤£à¤¸à¥à¤•à¥à¤°à¥€à¤¨ चालू करें" #: editor/editor_node.cpp msgid "Toggle System Console" -msgstr "" +msgstr "टॉगल सिसà¥à¤Ÿà¤® कंसोल" #: editor/editor_node.cpp msgid "Open Editor Data/Settings Folder" -msgstr "" +msgstr "संपादक डेटा / सेटिंगà¥à¤¸ फ़ोलà¥à¤¡à¤° खोलें" #: editor/editor_node.cpp msgid "Open Editor Data Folder" -msgstr "" +msgstr "संपादक डेटा फ़ोलà¥à¤¡à¤° खोलें" #: editor/editor_node.cpp msgid "Open Editor Settings Folder" -msgstr "" +msgstr "ओपन à¤à¤¡à¤¿à¤Ÿà¤° सेटिंगफ़र" #: editor/editor_node.cpp msgid "Manage Editor Features..." -msgstr "" +msgstr "संपादक सà¥à¤µà¤¿à¤§à¤¾à¤à¤ पà¥à¤°à¤¬à¤‚धित करें ..." #: editor/editor_node.cpp msgid "Manage Export Templates..." -msgstr "" +msgstr "निरà¥à¤¯à¤¾à¤¤ टेमà¥à¤ªà¤²à¥‡à¤Ÿà¥à¤¸ का पà¥à¤°à¤¬à¤‚धन करें ..." #: editor/editor_node.cpp editor/plugins/shader_editor_plugin.cpp msgid "Help" -msgstr "" +msgstr "मदद" #: editor/editor_node.cpp editor/plugins/asset_library_editor_plugin.cpp #: editor/plugins/script_editor_plugin.cpp @@ -2852,20 +2887,24 @@ msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp editor/project_manager.cpp #: editor/project_settings_editor.cpp editor/rename_dialog.cpp msgid "Search" -msgstr "" +msgstr "ढूंढें" #: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp #: editor/plugins/shader_editor_plugin.cpp msgid "Online Docs" -msgstr "" +msgstr "ऑनलाइन डॉकà¥à¤¸" #: editor/editor_node.cpp msgid "Q&A" -msgstr "" +msgstr "Q&A" #: editor/editor_node.cpp -msgid "Issue Tracker" -msgstr "" +msgid "Report a Bug" +msgstr "पà¥à¤°à¥‹à¤—à¥à¤°à¤¾à¤® में तà¥à¤°à¥à¤Ÿà¤¿ की शिकायत करें" + +#: editor/editor_node.cpp +msgid "Send Docs Feedback" +msgstr "Docs की पà¥à¤°à¤¤à¤¿à¤•à¥à¤°à¤¿à¤¯à¤¾ à¤à¥‡à¤œà¥‡à¤‚" #: editor/editor_node.cpp editor/plugins/asset_library_editor_plugin.cpp msgid "Community" @@ -2877,92 +2916,92 @@ msgstr "के बारे में" #: editor/editor_node.cpp msgid "Play the project." -msgstr "" +msgstr "पà¥à¤°à¥‹à¤œà¥‡à¤•à¥à¤Ÿ चलाà¤à¤‚।" #: editor/editor_node.cpp msgid "Play" -msgstr "" +msgstr "खेल" #: editor/editor_node.cpp msgid "Pause the scene execution for debugging." -msgstr "" +msgstr "डिबगिंग के लिठदृशà¥à¤¯ निषà¥à¤ªà¤¾à¤¦à¤¨ को रोकें।" #: editor/editor_node.cpp msgid "Pause Scene" -msgstr "" +msgstr "दृशà¥à¤¯ रोकें" #: editor/editor_node.cpp msgid "Stop the scene." -msgstr "" +msgstr "सीन बंद करो।" #: editor/editor_node.cpp msgid "Play the edited scene." -msgstr "" +msgstr "संपादित दृशà¥à¤¯ खेलते हैं।" #: editor/editor_node.cpp msgid "Play Scene" -msgstr "" +msgstr "पà¥à¤²à¥‡ सीन" #: editor/editor_node.cpp msgid "Play custom scene" -msgstr "" +msgstr "कसà¥à¤Ÿà¤® दृशà¥à¤¯ बजाना" #: editor/editor_node.cpp msgid "Play Custom Scene" -msgstr "" +msgstr "कसà¥à¤Ÿà¤® दृशà¥à¤¯ बजाना" #: editor/editor_node.cpp msgid "Changing the video driver requires restarting the editor." -msgstr "" +msgstr "वीडियो डà¥à¤°à¤¾à¤‡à¤µà¤° को बदलने के लिठसंपादक को फिर से शà¥à¤°à¥‚ करने की आवशà¥à¤¯à¤•ता होती है।" #: editor/editor_node.cpp editor/project_settings_editor.cpp #: editor/settings_config_dialog.cpp msgid "Save & Restart" -msgstr "" +msgstr "सहेजें और पà¥à¤¨à¤ƒ आरंठकरें" #: editor/editor_node.cpp msgid "Spins when the editor window redraws." -msgstr "" +msgstr "जब संपादक खिड़की फिर से खींचता है तो सà¥à¤ªà¤¿à¤¨ करता है।" #: editor/editor_node.cpp msgid "Update Continuously" -msgstr "" +msgstr "लगातार अपडेट करें" #: editor/editor_node.cpp msgid "Update When Changed" -msgstr "" +msgstr "जब बदला अदà¥à¤¯à¤¤à¤¨" #: editor/editor_node.cpp msgid "Hide Update Spinner" -msgstr "" +msgstr "अपडेट सà¥à¤ªà¤¿à¤¨à¤° को छिपाà¤à¤‚" #: editor/editor_node.cpp msgid "FileSystem" -msgstr "" +msgstr "फ़ाइल" #: editor/editor_node.cpp msgid "Inspector" -msgstr "" +msgstr "निरीकà¥à¤·à¤•" #: editor/editor_node.cpp msgid "Expand Bottom Panel" -msgstr "" +msgstr "बॉटम पैनल का विसà¥à¤¤à¤¾à¤° करें" #: editor/editor_node.cpp msgid "Output" -msgstr "" +msgstr "आउटपà¥à¤Ÿ" #: editor/editor_node.cpp msgid "Don't Save" -msgstr "" +msgstr "सहेजें मत करो" #: editor/editor_node.cpp msgid "Android build template is missing, please install relevant templates." -msgstr "" +msgstr "à¤à¤‚डà¥à¤°à¥‰à¤‡à¤¡ बिलà¥à¤¡ टेमà¥à¤ªà¤²à¥‡à¤Ÿ गायब है, कृपया पà¥à¤°à¤¾à¤¸à¤‚गिक टेमà¥à¤ªà¤²à¥‡à¤Ÿà¥à¤¸ सà¥à¤¥à¤¾à¤ªà¤¿à¤¤ करें।" #: editor/editor_node.cpp msgid "Manage Templates" -msgstr "" +msgstr "टेमà¥à¤ªà¤²à¥‡à¤Ÿà¥à¤¸ का पà¥à¤°à¤¬à¤‚धन करें" #: editor/editor_node.cpp msgid "" @@ -2974,6 +3013,12 @@ msgid "" "the \"Use Custom Build\" option should be enabled in the Android export " "preset." msgstr "" +"यह \"res://android/build\" के लिठसà¥à¤°à¥‹à¤¤ टेमà¥à¤ªà¤²à¥‡à¤Ÿ सà¥à¤¥à¤¾à¤ªà¤¿à¤¤ करके कसà¥à¤Ÿà¤® à¤à¤‚डà¥à¤°à¥‰à¤‡à¤¡ बिलà¥à¤¡ के " +"लिठआपकी परियोजना सà¥à¤¥à¤¾à¤ªà¤¿à¤¤ करेगा।\n" +"फिर आप संशोधनों को लागू कर सकते हैं और निरà¥à¤¯à¤¾à¤¤ पर अपना खà¥à¤¦ का कसà¥à¤Ÿà¤® à¤à¤ªà¥€à¤•े बना सकते हैं " +"(मॉडà¥à¤¯à¥‚ल जोड़ना, AndroidManifest.xml, आदि बदलना)।\n" +"धà¥à¤¯à¤¾à¤¨ दें कि पूरà¥à¤µ-निरà¥à¤®à¤¿à¤¤ à¤à¤ªà¥€à¤•े का उपयोग करने के बजाय कसà¥à¤Ÿà¤® बिलà¥à¤¡ बनाने के लिà¤, à¤à¤‚डà¥à¤°à¥‰à¤‡à¤¡ " +"निरà¥à¤¯à¤¾à¤¤ पूरà¥à¤µ निरà¥à¤§à¤¾à¤°à¤¿à¤¤ में \"उपयोग कसà¥à¤Ÿà¤® बिलà¥à¤¡\" विकलà¥à¤ª सकà¥à¤·à¤® किया जाना चाहिà¤à¥¤" #: editor/editor_node.cpp msgid "" @@ -2982,195 +3027,198 @@ msgid "" "Remove the \"res://android/build\" directory manually before attempting this " "operation again." msgstr "" +"à¤à¤‚डà¥à¤°à¥‰à¤¯à¤¡ बिलà¥à¤¡ टेमà¥à¤ªà¤²à¥‡à¤Ÿ पहले से ही इस परियोजना में सà¥à¤¥à¤¾à¤ªà¤¿à¤¤ है और यह अधिक नहीं लिखा जाà¤à¤—ा " +"।\n" +"इस ऑपरेशन को फिर से पà¥à¤°à¤¯à¤¾à¤¸ करने से पहले मैनà¥à¤¯à¥à¤…ल रूप से \"res://android/build\" " +"निरà¥à¤¦à¥‡à¤¶à¤¿à¤•ा निकालें।" #: editor/editor_node.cpp msgid "Import Templates From ZIP File" -msgstr "" +msgstr "जिप फाइल से आयात टेमà¥à¤ªà¤²à¥‡à¤Ÿà¥à¤¸" #: editor/editor_node.cpp msgid "Template Package" -msgstr "" +msgstr "टेमà¥à¤ªà¤²à¥‡à¤Ÿ पैकेज" #: editor/editor_node.cpp msgid "Export Library" -msgstr "" +msgstr "à¤à¤•à¥à¤¸à¤ªà¥‹à¤°à¥à¤Ÿ लाइबà¥à¤°à¥‡à¤°à¥€" #: editor/editor_node.cpp msgid "Merge With Existing" -msgstr "" +msgstr "मौजूदा के साथ विलय" #: editor/editor_node.cpp msgid "Open & Run a Script" -msgstr "" +msgstr "ओपन à¤à¤‚ड रन à¤à¤• सà¥à¤•à¥à¤°à¤¿à¤ªà¥à¤Ÿ" #: editor/editor_node.cpp msgid "New Inherited" -msgstr "" +msgstr "नई विरासत में मिली" #: editor/editor_node.cpp msgid "Load Errors" -msgstr "" +msgstr "लोड तà¥à¤°à¥à¤Ÿà¤¿à¤¯à¤¾à¤‚" #: editor/editor_node.cpp editor/plugins/tile_map_editor_plugin.cpp msgid "Select" -msgstr "" +msgstr "चà¥à¤¨à¥‡à¤‚" #: editor/editor_node.cpp msgid "Open 2D Editor" -msgstr "" +msgstr "ओपन 2D संपादक" #: editor/editor_node.cpp msgid "Open 3D Editor" -msgstr "" +msgstr "ओपन 3डी à¤à¤¡à¤¿à¤Ÿà¤°" #: editor/editor_node.cpp msgid "Open Script Editor" -msgstr "" +msgstr "ओपन सà¥à¤•à¥à¤°à¤¿à¤ªà¥à¤Ÿ à¤à¤¡à¤¿à¤Ÿà¤°" #: editor/editor_node.cpp editor/project_manager.cpp msgid "Open Asset Library" -msgstr "" +msgstr "ओपन à¤à¤¸à¥‡à¤Ÿ लाइबà¥à¤°à¥‡à¤°à¥€" #: editor/editor_node.cpp msgid "Open the next Editor" -msgstr "" +msgstr "अगले संपादक खोलें" #: editor/editor_node.cpp msgid "Open the previous Editor" -msgstr "" +msgstr "पिछले संपादक खोलें" #: editor/editor_node.h msgid "Warning!" -msgstr "" +msgstr "चेतावनी!" #: editor/editor_path.cpp -#, fuzzy msgid "No sub-resources found." -msgstr "संसाधन" +msgstr "सब-रिसोरà¥à¤¸ नहीं मिला." #: editor/editor_plugin.cpp msgid "Creating Mesh Previews" -msgstr "" +msgstr "मेष पूरà¥à¤µà¤¾à¤µà¤²à¥‹à¤•न बनाना" #: editor/editor_plugin.cpp msgid "Thumbnail..." -msgstr "" +msgstr "थंबनेल..." #: editor/editor_plugin_settings.cpp -#, fuzzy msgid "Main Script:" -msgstr "निरà¥à¤à¤°à¤¤à¤¾ संपादक" +msgstr "मेन सà¥à¤•à¥à¤°à¤¿à¤ªà¥à¤Ÿ:" #: editor/editor_plugin_settings.cpp msgid "Edit Plugin" -msgstr "" +msgstr "पà¥à¤²à¤—इन को संपादित करें" #: editor/editor_plugin_settings.cpp msgid "Installed Plugins:" -msgstr "" +msgstr "सà¥à¤¥à¤¾à¤ªà¤¿à¤¤ पà¥à¤²à¤—इनà¥à¤¸:" #: editor/editor_plugin_settings.cpp editor/plugin_config_dialog.cpp msgid "Update" -msgstr "" +msgstr "अदà¥à¤¯à¤¤à¤¨" #: editor/editor_plugin_settings.cpp editor/plugin_config_dialog.cpp #: editor/plugins/asset_library_editor_plugin.cpp msgid "Version:" -msgstr "" +msgstr "संसà¥à¤•रण:" #: editor/editor_plugin_settings.cpp editor/plugin_config_dialog.cpp msgid "Author:" -msgstr "" +msgstr "लेखक:" #: editor/editor_plugin_settings.cpp msgid "Status:" -msgstr "" +msgstr "सà¥à¤¥à¤¿à¤¤à¤¿:" #: editor/editor_plugin_settings.cpp msgid "Edit:" -msgstr "" +msgstr "संपादित:" #: editor/editor_profiler.cpp msgid "Measure:" -msgstr "" +msgstr "рдорд╛рдк:" #: editor/editor_profiler.cpp msgid "Frame Time (sec)" -msgstr "" +msgstr "फà¥à¤°à¥‡à¤® समय (सेकंड)" #: editor/editor_profiler.cpp msgid "Average Time (sec)" -msgstr "" +msgstr "औसत समय (सेकंड)" #: editor/editor_profiler.cpp msgid "Frame %" -msgstr "" +msgstr "फ़à¥à¤°à¥‡à¤®%" #: editor/editor_profiler.cpp msgid "Physics Frame %" -msgstr "" +msgstr "फिजिकà¥à¤¸ फà¥à¤°à¥‡à¤® %" #: editor/editor_profiler.cpp msgid "Inclusive" -msgstr "" +msgstr "समावेशी" #: editor/editor_profiler.cpp msgid "Self" -msgstr "" +msgstr "सà¥à¤µà¤¯à¤‚" #: editor/editor_profiler.cpp msgid "Frame #:" -msgstr "" +msgstr "फà¥à¤°à¥‡à¤® #:" #: editor/editor_profiler.cpp msgid "Time" -msgstr "" +msgstr "समय" #: editor/editor_profiler.cpp msgid "Calls" -msgstr "" +msgstr "कॉल" #: editor/editor_properties.cpp -#, fuzzy msgid "Edit Text:" -msgstr "परिवरà¥à¤¤à¤¨ वकà¥à¤° चयन" +msgstr "टेकà¥à¤¸à¥à¤Ÿ संपादित करें:" #: editor/editor_properties.cpp editor/script_create_dialog.cpp msgid "On" -msgstr "" +msgstr "पर" #: editor/editor_properties.cpp msgid "Layer" -msgstr "" +msgstr "परत" #: editor/editor_properties.cpp msgid "Bit %d, value %d" -msgstr "" +msgstr "बिट%d, मूलà¥à¤¯ % डी" #: editor/editor_properties.cpp msgid "[Empty]" -msgstr "" +msgstr "[खाली]" #: editor/editor_properties.cpp editor/plugins/root_motion_editor_plugin.cpp msgid "Assign..." -msgstr "" +msgstr "सौंपना..." #: editor/editor_properties.cpp -#, fuzzy msgid "Invalid RID" -msgstr "गलत फॉणà¥à¤Ÿ का आकार |" +msgstr "अमानà¥à¤¯ RID" #: editor/editor_properties.cpp msgid "" "The selected resource (%s) does not match any type expected for this " "property (%s)." msgstr "" +"चयनित संसाधन (%s) इस संपतà¥à¤¤à¤¿ (% à¤à¤¸) के लिठअपेकà¥à¤·à¤¿à¤¤ किसी à¤à¥€ पà¥à¤°à¤•ार से मेल नहीं खाता है।" #: editor/editor_properties.cpp msgid "" "Can't create a ViewportTexture on resources saved as a file.\n" "Resource needs to belong to a scene." msgstr "" +"फ़ाइल के रूप में सहेजे गठसंसाधनों पर वà¥à¤¯à¥‚पोरà¥à¤Ÿà¤Ÿà¥‡à¤•à¥à¤¸à¤šà¤° नहीं बना सकते.\n" +"संसाधन के लिठà¤à¤• दृशà¥à¤¯ से संबंधित की जरूरत है ।" #: editor/editor_properties.cpp msgid "" @@ -3179,26 +3227,28 @@ msgid "" "Please switch on the 'local to scene' property on it (and all resources " "containing it up to a node)." msgstr "" +"इस संसाधन पर वà¥à¤¯à¥‚पोरà¥à¤Ÿà¤Ÿà¥‡à¤•à¥à¤¸à¤šà¤° नहीं बना सकते कà¥à¤¯à¥‹à¤‚कि यह सà¥à¤¥à¤¾à¤¨à¥€à¤¯ से दृशà¥à¤¯ के रूप में सेट नहीं है।\n" +"कृपया उस पर 'सà¥à¤¥à¤¾à¤¨à¥€à¤¯ से दृशà¥à¤¯' संपतà¥à¤¤à¤¿ पर सà¥à¤µà¤¿à¤š करें (और इसे यà¥à¤•à¥à¤¤ सà¤à¥€ संसाधन à¤à¤• नोड तक)।" #: editor/editor_properties.cpp editor/property_editor.cpp msgid "Pick a Viewport" -msgstr "" +msgstr "वà¥à¤¯à¥‚पोरà¥à¤Ÿ चà¥à¤¨à¥‡à¤‚" #: editor/editor_properties.cpp editor/property_editor.cpp msgid "New Script" -msgstr "" +msgstr "नई सà¥à¤•à¥à¤°à¤¿à¤ªà¥à¤Ÿ" #: editor/editor_properties.cpp editor/scene_tree_dock.cpp msgid "Extend Script" -msgstr "" +msgstr "सà¥à¤•à¥à¤°à¤¿à¤ªà¥à¤Ÿ बढ़ाà¤à¤" #: editor/editor_properties.cpp editor/property_editor.cpp msgid "New %s" -msgstr "" +msgstr "नया%s" #: editor/editor_properties.cpp editor/property_editor.cpp msgid "Make Unique" -msgstr "" +msgstr "अदà¥à¤µà¤¿à¤¤à¥€à¤¯ बनाओ" #: editor/editor_properties.cpp #: editor/plugins/animation_blend_space_1d_editor.cpp @@ -3212,204 +3262,209 @@ msgstr "" #: editor/plugins/tile_map_editor_plugin.cpp editor/property_editor.cpp #: scene/gui/line_edit.cpp scene/gui/text_edit.cpp msgid "Paste" -msgstr "" +msgstr "चिपकाà¤à¤" #: editor/editor_properties.cpp editor/property_editor.cpp msgid "Convert To %s" -msgstr "" +msgstr "% à¤à¤¸ में परिवरà¥à¤¤à¤¿à¤¤ करें" #: editor/editor_properties.cpp editor/property_editor.cpp msgid "Selected node is not a Viewport!" -msgstr "" +msgstr "चयनित नोड वà¥à¤¯à¥‚पोरà¥à¤Ÿ नहीं है!" #: editor/editor_properties_array_dict.cpp msgid "Size: " -msgstr "" +msgstr "आकार: " #: editor/editor_properties_array_dict.cpp msgid "Page: " -msgstr "" +msgstr "पृषà¥à¤ : " #: editor/editor_properties_array_dict.cpp #: editor/plugins/theme_editor_plugin.cpp msgid "Remove Item" -msgstr "" +msgstr "आइटम निकालें" #: editor/editor_properties_array_dict.cpp msgid "New Key:" -msgstr "" +msgstr "नई कà¥à¤‚जी:" #: editor/editor_properties_array_dict.cpp msgid "New Value:" -msgstr "" +msgstr "नया मूलà¥à¤¯:" #: editor/editor_properties_array_dict.cpp msgid "Add Key/Value Pair" -msgstr "" +msgstr "कà¥à¤‚जी/मूलà¥à¤¯ जोड़ी जोड़ें" #: editor/editor_run_native.cpp msgid "" "No runnable export preset found for this platform.\n" "Please add a runnable preset in the export menu." msgstr "" +"इस मंच के लिठकोई रननयोगà¥à¤¯ निरà¥à¤¯à¤¾à¤¤ पूरà¥à¤µ निरà¥à¤§à¤¾à¤°à¤¿à¤¤ नहीं मिला।\n" +"कृपया निरà¥à¤¯à¤¾à¤¤ मेनू में à¤à¤• रननेबल पà¥à¤°à¥€à¤¸à¥‡à¤Ÿ जोड़ें।" #: editor/editor_run_script.cpp msgid "Write your logic in the _run() method." -msgstr "" +msgstr "अपने तरà¥à¤• को _run () विधि में लिखें।" #: editor/editor_run_script.cpp msgid "There is an edited scene already." -msgstr "" +msgstr "वहां à¤à¤• संपादित दृशà¥à¤¯ पहले से ही है ।" #: editor/editor_run_script.cpp msgid "Couldn't instance script:" -msgstr "" +msgstr "उदाहरण सà¥à¤•à¥à¤°à¤¿à¤ªà¥à¤Ÿ नहीं कर सका:" #: editor/editor_run_script.cpp msgid "Did you forget the 'tool' keyword?" -msgstr "" +msgstr "कà¥à¤¯à¤¾ आप 'टूल' कीवरà¥à¤¡ à¤à¥‚ल गà¤?" #: editor/editor_run_script.cpp msgid "Couldn't run script:" -msgstr "" +msgstr "सà¥à¤•à¥à¤°à¤¿à¤ªà¥à¤Ÿ नहीं चला सका:" #: editor/editor_run_script.cpp msgid "Did you forget the '_run' method?" -msgstr "" +msgstr "कà¥à¤¯à¤¾ आप '_run' विधि को à¤à¥‚ल गà¤?" #: editor/editor_sub_scene.cpp msgid "Select Node(s) to Import" -msgstr "" +msgstr "आयात करने के लिठनोड (à¤à¤¸) का चयन करें" #: editor/editor_sub_scene.cpp editor/project_manager.cpp msgid "Browse" -msgstr "" +msgstr "बà¥à¤°à¤¾à¤‰à¤œà¤¼" #: editor/editor_sub_scene.cpp msgid "Scene Path:" -msgstr "" +msgstr "दृशà¥à¤¯ पथ:" #: editor/editor_sub_scene.cpp msgid "Import From Node:" -msgstr "" +msgstr "नोड से आयात:" #: editor/export_template_manager.cpp msgid "Redownload" -msgstr "" +msgstr "रीडाउनलोड करें" #: editor/export_template_manager.cpp msgid "Uninstall" -msgstr "" +msgstr "अनइंसà¥à¤Ÿà¤¾à¤² करें" #: editor/export_template_manager.cpp msgid "(Installed)" -msgstr "" +msgstr "(सà¥à¤¥à¤¾à¤ªà¤¿à¤¤)" #: editor/export_template_manager.cpp #: editor/plugins/asset_library_editor_plugin.cpp msgid "Download" -msgstr "" +msgstr "डाउनलोड" #: editor/export_template_manager.cpp msgid "Official export templates aren't available for development builds." -msgstr "" +msgstr "विकास के निरà¥à¤®à¤¾à¤£ के लिठआधिकारिक निरà¥à¤¯à¤¾à¤¤ टेमà¥à¤ªà¤²à¥‡à¤Ÿà¤‰à¤ªà¤²à¤¬à¥à¤§ नहीं हैं।" #: editor/export_template_manager.cpp msgid "(Missing)" -msgstr "" +msgstr "(लापता)" #: editor/export_template_manager.cpp msgid "(Current)" -msgstr "" +msgstr "(वरà¥à¤¤à¤®à¤¾à¤¨)" #: editor/export_template_manager.cpp msgid "Retrieving mirrors, please wait..." -msgstr "" +msgstr "दरà¥à¤ªà¤£ को पà¥à¤¨à¤ƒ पà¥à¤°à¤¾à¤ªà¥à¤¤ करना, कृपया पà¥à¤°à¤¤à¥€à¤•à¥à¤·à¤¾ करें ..." #: editor/export_template_manager.cpp msgid "Remove template version '%s'?" -msgstr "" +msgstr "टेमà¥à¤ªà¤²à¥‡à¤Ÿ संसà¥à¤•रण '%s'?" #: editor/export_template_manager.cpp msgid "Can't open export templates zip." -msgstr "" +msgstr "निरà¥à¤¯à¤¾à¤¤ टेमà¥à¤ªà¤²à¥‡à¤Ÿà¥à¤¸ ज़िप नहीं खोल सकते।" #: editor/export_template_manager.cpp msgid "Invalid version.txt format inside templates: %s." -msgstr "" +msgstr "टेमà¥à¤ªà¤²à¥‡à¤Ÿà¥à¤¸ के अंदर अमानà¥à¤¯ संसà¥à¤•रण.txt पà¥à¤°à¤¾à¤°à¥‚प: % à¤à¤¸à¥¤" #: editor/export_template_manager.cpp msgid "No version.txt found inside templates." -msgstr "" +msgstr "टेमà¥à¤ªà¤²à¥‡à¤Ÿà¥à¤¸ के अंदर कोई संसà¥à¤•रण.txt नहीं मिला।" #: editor/export_template_manager.cpp msgid "Error creating path for templates:" -msgstr "" +msgstr "टेमà¥à¤ªà¤²à¥‡à¤Ÿà¥à¤¸ के लिठपथ बनाने में तà¥à¤°à¥à¤Ÿà¤¿:" #: editor/export_template_manager.cpp msgid "Extracting Export Templates" -msgstr "" +msgstr "à¤à¤•à¥à¤¸à¤ªà¥‹à¤°à¥à¤Ÿ टेमà¥à¤ªà¤²à¥‡à¤Ÿà¥à¤¸ निकालना" #: editor/export_template_manager.cpp msgid "Importing:" -msgstr "" +msgstr "आयात:" #: editor/export_template_manager.cpp msgid "Error getting the list of mirrors." -msgstr "" +msgstr "तà¥à¤°à¥à¤Ÿà¤¿ दरà¥à¤ªà¤£ की सूची हो रही है।" #: editor/export_template_manager.cpp msgid "Error parsing JSON of mirror list. Please report this issue!" -msgstr "" +msgstr "मिरर लिसà¥à¤Ÿ की तà¥à¤°à¥à¤Ÿà¤¿ पारà¥à¤¸à¤¿à¤‚ग जेसन । कृपया इस मà¥à¤¦à¥à¤¦à¥‡ की रिपोरà¥à¤Ÿ करें!" #: editor/export_template_manager.cpp msgid "" "No download links found for this version. Direct download is only available " "for official releases." msgstr "" +"इस संसà¥à¤•रण के लिठकोई डाउनलोड लिंक नहीं मिला। पà¥à¤°à¤¤à¥à¤¯à¤•à¥à¤· डाउनलोड केवल आधिकारिक रिलीज के " +"लिठउपलबà¥à¤§ है।" #: editor/export_template_manager.cpp #: editor/plugins/asset_library_editor_plugin.cpp msgid "Can't resolve." -msgstr "" +msgstr "हल नहीं कर सकते।" #: editor/export_template_manager.cpp #: editor/plugins/asset_library_editor_plugin.cpp msgid "Can't connect." -msgstr "" +msgstr "कनेकà¥à¤Ÿ नहीं कर सकते।" #: editor/export_template_manager.cpp #: editor/plugins/asset_library_editor_plugin.cpp msgid "No response." -msgstr "" +msgstr "कोई जवाब नहीं।" #: editor/export_template_manager.cpp msgid "Request Failed." -msgstr "" +msgstr "अनà¥à¤°à¥‹à¤§ विफल रहा।" #: editor/export_template_manager.cpp msgid "Redirect Loop." -msgstr "" +msgstr "लूप को रीडायरेकà¥à¤Ÿ करते हैं।" #: editor/export_template_manager.cpp #: editor/plugins/asset_library_editor_plugin.cpp msgid "Failed:" -msgstr "" +msgstr "विफल:" #: editor/export_template_manager.cpp msgid "Download Complete." -msgstr "" +msgstr "पूरा डाउनलोड करें।" #: editor/export_template_manager.cpp -#, fuzzy msgid "Cannot remove temporary file:" -msgstr "निकाला नहीं जा सकता:" +msgstr "अलà¥à¤ªà¤•ालिक फ़ाइल निकाली नहीं जा सकà¥à¤¤à¥€:" #: editor/export_template_manager.cpp msgid "" "Templates installation failed.\n" "The problematic templates archives can be found at '%s'." msgstr "" +"टेमà¥à¤ªà¤²à¥‡à¤Ÿà¥à¤¸ सà¥à¤¥à¤¾à¤ªà¤¨à¤¾ विफल रही।\n" +"समसà¥à¤¯à¤¾à¤—à¥à¤°à¤¸à¥à¤¤ टेमà¥à¤ªà¤²à¥‡à¤Ÿà¥à¤¸ अà¤à¤¿à¤²à¥‡à¤–ागार '%' पर पाया जा सकता है।" #: editor/export_template_manager.cpp msgid "Error requesting URL:" @@ -3417,24 +3472,24 @@ msgstr "लोड होने मे तà¥à¤°à¥à¤Ÿà¤¿:" #: editor/export_template_manager.cpp msgid "Connecting to Mirror..." -msgstr "" +msgstr "मिरर से कनेकà¥à¤Ÿ..." #: editor/export_template_manager.cpp msgid "Disconnected" -msgstr "" +msgstr "डिसà¥à¤•नेकà¥à¤Ÿ" #: editor/export_template_manager.cpp msgid "Resolving" -msgstr "" +msgstr "समाधान" #: editor/export_template_manager.cpp msgid "Can't Resolve" -msgstr "" +msgstr "हल नहीं कर सकते" #: editor/export_template_manager.cpp #: editor/plugins/asset_library_editor_plugin.cpp msgid "Connecting..." -msgstr "" +msgstr "जोड़ने..." #: editor/export_template_manager.cpp msgid "Can't Connect" @@ -3442,24 +3497,24 @@ msgstr "कनेकà¥à¤Ÿ नहीं कर सकते" #: editor/export_template_manager.cpp msgid "Connected" -msgstr "" +msgstr "जà¥à¤¡à¤¼à¤¾" #: editor/export_template_manager.cpp #: editor/plugins/asset_library_editor_plugin.cpp msgid "Requesting..." -msgstr "" +msgstr "अनà¥à¤°à¥‹à¤§..." #: editor/export_template_manager.cpp msgid "Downloading" -msgstr "" +msgstr "डाउनलोड" #: editor/export_template_manager.cpp msgid "Connection Error" -msgstr "" +msgstr "कनेकà¥à¤¶à¤¨ तà¥à¤°à¥à¤Ÿà¤¿" #: editor/export_template_manager.cpp msgid "SSL Handshake Error" -msgstr "" +msgstr "à¤à¤¸à¤à¤¸à¤à¤² हैंडशेक à¤à¤°à¤°" #: editor/export_template_manager.cpp msgid "Uncompressing Android Build Sources" @@ -3467,19 +3522,19 @@ msgstr "अनकॉमिंग à¤à¤‚डà¥à¤°à¥‰à¤‡à¤¡ बिलà¥à¤¡ सॠ#: editor/export_template_manager.cpp msgid "Current Version:" -msgstr "" +msgstr "वरà¥à¤¤à¤®à¤¾à¤¨ संसà¥à¤•रण:" #: editor/export_template_manager.cpp msgid "Installed Versions:" -msgstr "" +msgstr "सà¥à¤¥à¤¾à¤ªà¤¿à¤¤ संसà¥à¤•रण:" #: editor/export_template_manager.cpp msgid "Install From File" -msgstr "" +msgstr "फ़ाइल से इंसà¥à¤Ÿà¥‰à¤² करें" #: editor/export_template_manager.cpp msgid "Remove Template" -msgstr "" +msgstr "टेमà¥à¤ªà¤²à¥‡à¤Ÿ निकालें" #: editor/export_template_manager.cpp msgid "Select Template File" @@ -3487,19 +3542,19 @@ msgstr "टेमà¥à¤ªà¤²à¥‡à¤Ÿ फ़ाइल का चयन करें" #: editor/export_template_manager.cpp msgid "Godot Export Templates" -msgstr "" +msgstr "गोडॉट à¤à¤•à¥à¤¸à¤ªà¥‹à¤°à¥à¤Ÿ टेमà¥à¤ªà¤²à¥‡à¤Ÿà¥à¤¸" #: editor/export_template_manager.cpp msgid "Export Template Manager" -msgstr "" +msgstr "à¤à¤•à¥à¤¸à¤ªà¥‹à¤°à¥à¤Ÿ टेमà¥à¤ªà¤²à¥‡à¤Ÿ मैनेजर" #: editor/export_template_manager.cpp msgid "Download Templates" -msgstr "" +msgstr "टेमà¥à¤ªà¤²à¥‡à¤Ÿà¥à¤¸ डाउनलोड करें" #: editor/export_template_manager.cpp msgid "Select mirror from list: (Shift+Click: Open in Browser)" -msgstr "" +msgstr "सूची से दरà¥à¤ªà¤£ चà¥à¤¨à¥‡à¤‚: (शिफà¥à¤Ÿ +कà¥à¤²à¤¿à¤•: बà¥à¤°à¤¾à¤‰à¤œà¤¼à¤° में खà¥à¤²à¤¾)" #: editor/filesystem_dock.cpp msgid "Favorites" @@ -3508,14 +3563,15 @@ msgstr "पसंद" #: editor/filesystem_dock.cpp msgid "Status: Import of file failed. Please fix file and reimport manually." msgstr "" +"सà¥à¤¥à¤¿à¤¤à¤¿: फाइल का आयात विफल रहा। कृपया फाइल को ठीक करें और मैनà¥à¤¯à¥à¤…ल रूप से पà¥à¤¨à¤°à¥à¤†à¤¯à¤¾à¤¤ करें।" #: editor/filesystem_dock.cpp msgid "Cannot move/rename resources root." -msgstr "" +msgstr "संसाधनों की जड़ को सà¥à¤¥à¤¾à¤¨à¤¾à¤‚तरित/नाम नहीं दे सकते ।" #: editor/filesystem_dock.cpp msgid "Cannot move a folder into itself." -msgstr "" +msgstr "फ़ोलà¥à¤¡à¤° को अपने आप में नहीं ले जा सकते।" #: editor/filesystem_dock.cpp msgid "Error moving:" @@ -3531,27 +3587,27 @@ msgstr "निरà¥à¤à¤°à¤¤à¤¾ को अपडेट करने में à #: editor/filesystem_dock.cpp editor/scene_tree_editor.cpp msgid "No name provided." -msgstr "" +msgstr "कोई नाम पà¥à¤°à¤¦à¤¾à¤¨ नहीं किया गया।" #: editor/filesystem_dock.cpp msgid "Provided name contains invalid characters." -msgstr "" +msgstr "बशरà¥à¤¤à¥‡ नाम में अमानà¥à¤¯ पातà¥à¤° होते हैं।" #: editor/filesystem_dock.cpp msgid "A file or folder with this name already exists." -msgstr "" +msgstr "इस नाम से फ़ाइल या फ़ोलà¥à¤¡à¤° पहले से मौजूद." #: editor/filesystem_dock.cpp msgid "Name contains invalid characters." -msgstr "" +msgstr "नाम मे अमानà¥à¤¯ अकà¥à¤·à¤° मौजूद." #: editor/filesystem_dock.cpp msgid "Renaming file:" -msgstr "" +msgstr "फ़ाइल का नाम बदल रहे है:" #: editor/filesystem_dock.cpp msgid "Renaming folder:" -msgstr "" +msgstr "फ़ोलà¥à¤¡à¤° का नाम बदल रहे है:" #: editor/filesystem_dock.cpp msgid "Duplicating file:" @@ -3563,11 +3619,11 @@ msgstr "डà¥à¤ªà¥à¤²à¤¿à¤•ेटिंग फ़ोलà¥à¤¡à¤°:" #: editor/filesystem_dock.cpp msgid "New Inherited Scene" -msgstr "" +msgstr "नई उतà¥à¤¤à¤°à¤¾à¤§à¤¿à¤•ार पà¥à¤°à¤¾à¤ªà¥à¤¤ सीन" #: editor/filesystem_dock.cpp msgid "Set As Main Scene" -msgstr "" +msgstr "मेन सीन सेट करे" #: editor/filesystem_dock.cpp msgid "Open Scenes" @@ -3587,7 +3643,7 @@ msgstr "पसंदीदा से निकालें" #: editor/filesystem_dock.cpp msgid "Edit Dependencies..." -msgstr "" +msgstr "निरà¥à¤à¤°à¤¿à¤¤ फ़ाइलें संपादित करें..." #: editor/filesystem_dock.cpp msgid "View Owners..." @@ -3890,7 +3946,7 @@ msgid "Reimport" msgstr "" #: editor/import_dock.cpp -msgid "Save scenes, re-import and restart" +msgid "Save Scenes, Re-Import, and Restart" msgstr "" #: editor/import_dock.cpp @@ -6691,14 +6747,6 @@ msgid "Open Godot online documentation." msgstr "" #: editor/plugins/script_editor_plugin.cpp -msgid "Request Docs" -msgstr "" - -#: editor/plugins/script_editor_plugin.cpp -msgid "Help improve the Godot documentation by giving feedback." -msgstr "" - -#: editor/plugins/script_editor_plugin.cpp msgid "Search the reference documentation." msgstr "" @@ -7136,6 +7184,10 @@ msgid "This operation requires a single selected node." msgstr "" #: editor/plugins/spatial_editor_plugin.cpp +msgid "Auto Orthogonal Enabled" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp msgid "Lock View Rotation" msgstr "" @@ -7224,13 +7276,13 @@ msgid "Freelook Slow Modifier" msgstr "" #: editor/plugins/spatial_editor_plugin.cpp -msgid "" -"Note: The FPS value displayed is the editor's framerate.\n" -"It cannot be used as a reliable indication of in-game performance." +msgid "View Rotation Locked" msgstr "" #: editor/plugins/spatial_editor_plugin.cpp -msgid "View Rotation Locked" +msgid "" +"Note: The FPS value displayed is the editor's framerate.\n" +"It cannot be used as a reliable indication of in-game performance." msgstr "" #: editor/plugins/spatial_editor_plugin.cpp @@ -9663,6 +9715,13 @@ msgid "" "Would you like to explore official example projects in the Asset Library?" msgstr "" +#: editor/project_manager.cpp +msgid "" +"The search box filters projects by name and last path component.\n" +"To filter projects by name and full path, the query must contain at least " +"one `/` character." +msgstr "" + #: editor/project_settings_editor.cpp msgid "Key " msgstr "" @@ -10633,6 +10692,12 @@ msgid "Script file already exists." msgstr "" #: editor/script_create_dialog.cpp +msgid "" +"Note: Built-in scripts have some limitations and can't be edited using an " +"external editor." +msgstr "" + +#: editor/script_create_dialog.cpp msgid "Class Name:" msgstr "" @@ -10760,6 +10825,11 @@ msgid "Total:" msgstr "" #: editor/script_editor_debugger.cpp +#, fuzzy +msgid "Export list to a CSV file" +msgstr "â€à¤à¤•à¥à¤¸à¤ªà¥‹à¤°à¥à¤Ÿ पà¥à¤°à¥‹à¤«à¤¼à¤¾à¤‡à¤²" + +#: editor/script_editor_debugger.cpp msgid "Resource Path" msgstr "" @@ -12280,6 +12350,10 @@ msgid "" "texture to some node for display." msgstr "" +#: scene/main/viewport.cpp +msgid "Viewport size must be greater than 0 to render anything." +msgstr "" + #: scene/resources/visual_shader_nodes.cpp #, fuzzy msgid "Invalid source for preview." @@ -12311,6 +12385,9 @@ msgstr "" msgid "Constants cannot be modified." msgstr "" +#~ msgid "Issue Tracker" +#~ msgstr "मà¥à¤¦à¥à¤¦à¤¾ पर नज़र रखने वाला" + #~ msgid "Replaced %d occurrence(s)." #~ msgstr "बदल दिया % डी घटना (à¤à¤¸) ।" diff --git a/editor/translations/hr.po b/editor/translations/hr.po index ce8191c638..8627e7f239 100644 --- a/editor/translations/hr.po +++ b/editor/translations/hr.po @@ -1423,7 +1423,7 @@ msgstr "" msgid "Remove Autoload" msgstr "" -#: editor/editor_autoload_settings.cpp +#: editor/editor_autoload_settings.cpp editor/editor_plugin_settings.cpp msgid "Enable" msgstr "" @@ -2829,7 +2829,11 @@ msgid "Q&A" msgstr "" #: editor/editor_node.cpp -msgid "Issue Tracker" +msgid "Report a Bug" +msgstr "" + +#: editor/editor_node.cpp +msgid "Send Docs Feedback" msgstr "" #: editor/editor_node.cpp editor/plugins/asset_library_editor_plugin.cpp @@ -3855,7 +3859,7 @@ msgid "Reimport" msgstr "" #: editor/import_dock.cpp -msgid "Save scenes, re-import and restart" +msgid "Save Scenes, Re-Import, and Restart" msgstr "" #: editor/import_dock.cpp @@ -6654,14 +6658,6 @@ msgid "Open Godot online documentation." msgstr "" #: editor/plugins/script_editor_plugin.cpp -msgid "Request Docs" -msgstr "" - -#: editor/plugins/script_editor_plugin.cpp -msgid "Help improve the Godot documentation by giving feedback." -msgstr "" - -#: editor/plugins/script_editor_plugin.cpp msgid "Search the reference documentation." msgstr "" @@ -7091,6 +7087,10 @@ msgid "This operation requires a single selected node." msgstr "" #: editor/plugins/spatial_editor_plugin.cpp +msgid "Auto Orthogonal Enabled" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp msgid "Lock View Rotation" msgstr "" @@ -7179,13 +7179,13 @@ msgid "Freelook Slow Modifier" msgstr "" #: editor/plugins/spatial_editor_plugin.cpp -msgid "" -"Note: The FPS value displayed is the editor's framerate.\n" -"It cannot be used as a reliable indication of in-game performance." +msgid "View Rotation Locked" msgstr "" #: editor/plugins/spatial_editor_plugin.cpp -msgid "View Rotation Locked" +msgid "" +"Note: The FPS value displayed is the editor's framerate.\n" +"It cannot be used as a reliable indication of in-game performance." msgstr "" #: editor/plugins/spatial_editor_plugin.cpp @@ -9567,6 +9567,13 @@ msgid "" "Would you like to explore official example projects in the Asset Library?" msgstr "" +#: editor/project_manager.cpp +msgid "" +"The search box filters projects by name and last path component.\n" +"To filter projects by name and full path, the query must contain at least " +"one `/` character." +msgstr "" + #: editor/project_settings_editor.cpp msgid "Key " msgstr "" @@ -10526,6 +10533,12 @@ msgid "Script file already exists." msgstr "" #: editor/script_create_dialog.cpp +msgid "" +"Note: Built-in scripts have some limitations and can't be edited using an " +"external editor." +msgstr "" + +#: editor/script_create_dialog.cpp msgid "Class Name:" msgstr "" @@ -10650,6 +10663,10 @@ msgid "Total:" msgstr "" #: editor/script_editor_debugger.cpp +msgid "Export list to a CSV file" +msgstr "" + +#: editor/script_editor_debugger.cpp msgid "Resource Path" msgstr "" @@ -12154,6 +12171,10 @@ msgid "" "texture to some node for display." msgstr "" +#: scene/main/viewport.cpp +msgid "Viewport size must be greater than 0 to render anything." +msgstr "" + #: scene/resources/visual_shader_nodes.cpp msgid "Invalid source for preview." msgstr "" diff --git a/editor/translations/hu.po b/editor/translations/hu.po index cbe475b022..d066d5e317 100644 --- a/editor/translations/hu.po +++ b/editor/translations/hu.po @@ -1507,7 +1507,7 @@ msgstr "AutoLoad Ãthelyezése" msgid "Remove Autoload" msgstr "AutoLoad EltávolÃtása" -#: editor/editor_autoload_settings.cpp +#: editor/editor_autoload_settings.cpp editor/editor_plugin_settings.cpp msgid "Enable" msgstr "Engedélyezés" @@ -3075,8 +3075,13 @@ msgid "Q&A" msgstr "Kérdések és Válaszok" #: editor/editor_node.cpp -msgid "Issue Tracker" -msgstr "ProblémakövetÅ‘" +#, fuzzy +msgid "Report a Bug" +msgstr "Újraimportálás" + +#: editor/editor_node.cpp +msgid "Send Docs Feedback" +msgstr "" #: editor/editor_node.cpp editor/plugins/asset_library_editor_plugin.cpp msgid "Community" @@ -4167,7 +4172,7 @@ msgid "Reimport" msgstr "Újraimportálás" #: editor/import_dock.cpp -msgid "Save scenes, re-import and restart" +msgid "Save Scenes, Re-Import, and Restart" msgstr "" #: editor/import_dock.cpp @@ -7177,14 +7182,6 @@ msgid "Open Godot online documentation." msgstr "Godot online dokumentáció megnyitása" #: editor/plugins/script_editor_plugin.cpp -msgid "Request Docs" -msgstr "" - -#: editor/plugins/script_editor_plugin.cpp -msgid "Help improve the Godot documentation by giving feedback." -msgstr "" - -#: editor/plugins/script_editor_plugin.cpp msgid "Search the reference documentation." msgstr "Keresés a referencia dokumentációban." @@ -7645,6 +7642,10 @@ msgid "This operation requires a single selected node." msgstr "" #: editor/plugins/spatial_editor_plugin.cpp +msgid "Auto Orthogonal Enabled" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp msgid "Lock View Rotation" msgstr "" @@ -7735,13 +7736,13 @@ msgid "Freelook Slow Modifier" msgstr "" #: editor/plugins/spatial_editor_plugin.cpp -msgid "" -"Note: The FPS value displayed is the editor's framerate.\n" -"It cannot be used as a reliable indication of in-game performance." +msgid "View Rotation Locked" msgstr "" #: editor/plugins/spatial_editor_plugin.cpp -msgid "View Rotation Locked" +msgid "" +"Note: The FPS value displayed is the editor's framerate.\n" +"It cannot be used as a reliable indication of in-game performance." msgstr "" #: editor/plugins/spatial_editor_plugin.cpp @@ -10264,6 +10265,13 @@ msgid "" "Would you like to explore official example projects in the Asset Library?" msgstr "" +#: editor/project_manager.cpp +msgid "" +"The search box filters projects by name and last path component.\n" +"To filter projects by name and full path, the query must contain at least " +"one `/` character." +msgstr "" + #: editor/project_settings_editor.cpp msgid "Key " msgstr "" @@ -11270,6 +11278,12 @@ msgid "Script file already exists." msgstr "Már létezik '%s' AutoLoad!" #: editor/script_create_dialog.cpp +msgid "" +"Note: Built-in scripts have some limitations and can't be edited using an " +"external editor." +msgstr "" + +#: editor/script_create_dialog.cpp #, fuzzy msgid "Class Name:" msgstr "Osztály:" @@ -11402,6 +11416,11 @@ msgid "Total:" msgstr "" #: editor/script_editor_debugger.cpp +#, fuzzy +msgid "Export list to a CSV file" +msgstr "Projekt Exportálása" + +#: editor/script_editor_debugger.cpp msgid "Resource Path" msgstr "" @@ -12954,6 +12973,10 @@ msgstr "" "gyermekévé, hogy Ãgy kapjon méretet. EllenkezÅ‘ esetben tegye RenderTarget-" "té, és állÃtsa hozzá a belsÅ‘ textúráját valamilyen node-hoz kirajzolásra." +#: scene/main/viewport.cpp +msgid "Viewport size must be greater than 0 to render anything." +msgstr "" + #: scene/resources/visual_shader_nodes.cpp #, fuzzy msgid "Invalid source for preview." @@ -12985,6 +13008,9 @@ msgstr "" msgid "Constants cannot be modified." msgstr "" +#~ msgid "Issue Tracker" +#~ msgstr "ProblémakövetÅ‘" + #~ msgid "Replaced %d occurrence(s)." #~ msgstr "Lecserélve %d elÅ‘fordulás." diff --git a/editor/translations/id.po b/editor/translations/id.po index c4ead514c6..54222d1aeb 100644 --- a/editor/translations/id.po +++ b/editor/translations/id.po @@ -25,12 +25,13 @@ # Akhmad Zulfikar <azuldegratz@gmail.com>, 2020. # Ade Fikri Malihuddin <ade.fm97@gmail.com>, 2020. # zephyroths <ridho.hikaru@gmail.com>, 2020. +# Richard Urban <redasuio1@gmail.com>, 2020. msgid "" msgstr "" "Project-Id-Version: Godot Engine editor\n" "POT-Creation-Date: \n" -"PO-Revision-Date: 2020-03-08 22:33+0000\n" -"Last-Translator: Sofyan Sugianto <sofyanartem@gmail.com>\n" +"PO-Revision-Date: 2020-04-16 11:03+0000\n" +"Last-Translator: Richard Urban <redasuio1@gmail.com>\n" "Language-Team: Indonesian <https://hosted.weblate.org/projects/godot-engine/" "godot/id/>\n" "Language: id\n" @@ -38,7 +39,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-dev\n" +"X-Generator: Weblate 4.0.1-dev\n" #: core/math/expression.cpp modules/gdscript/gdscript_functions.cpp #: modules/visual_script/visual_script_builtin_funcs.cpp @@ -1462,7 +1463,7 @@ msgstr "Pindahkan Autoload" msgid "Remove Autoload" msgstr "Hapus Autoload" -#: editor/editor_autoload_settings.cpp +#: editor/editor_autoload_settings.cpp editor/editor_plugin_settings.cpp msgid "Enable" msgstr "Aktifkan" @@ -2947,8 +2948,13 @@ msgid "Q&A" msgstr "Tanya Jawab" #: editor/editor_node.cpp -msgid "Issue Tracker" -msgstr "Pelacak Isu" +#, fuzzy +msgid "Report a Bug" +msgstr "Impor ulang" + +#: editor/editor_node.cpp +msgid "Send Docs Feedback" +msgstr "" #: editor/editor_node.cpp editor/plugins/asset_library_editor_plugin.cpp msgid "Community" @@ -4000,7 +4006,8 @@ msgid "Reimport" msgstr "Impor ulang" #: editor/import_dock.cpp -msgid "Save scenes, re-import and restart" +#, fuzzy +msgid "Save Scenes, Re-Import, and Restart" msgstr "Simpan skena, impor ulang, dan mulai ulang" #: editor/import_dock.cpp @@ -5874,7 +5881,6 @@ msgid "Couldn't create a single convex collision shape." msgstr "Tidak dapat membuat convex collision shape tunggal." #: editor/plugins/mesh_instance_editor_plugin.cpp -#, fuzzy msgid "Create Single Convex Shape" msgstr "Buat Bentuk Cembung" @@ -5887,7 +5893,6 @@ msgid "Couldn't create any collision shapes." msgstr "Tidak dapat membuat bentuk collision." #: editor/plugins/mesh_instance_editor_plugin.cpp -#, fuzzy msgid "Create Multiple Convex Shapes" msgstr "Buat Beberapa Bentuk Cembung" @@ -5964,7 +5969,6 @@ msgstr "" "collision." #: editor/plugins/mesh_instance_editor_plugin.cpp -#, fuzzy msgid "Create Single Convex Collision Sibling" msgstr "Buat Saudara Tunggal Convex Collision" @@ -6855,14 +6859,6 @@ msgid "Open Godot online documentation." msgstr "Buka dokumentasi daring Godot." #: editor/plugins/script_editor_plugin.cpp -msgid "Request Docs" -msgstr "Minta Dokumentasi" - -#: editor/plugins/script_editor_plugin.cpp -msgid "Help improve the Godot documentation by giving feedback." -msgstr "Bantu tingkatkan dokumentasi Godot dengan memberikan tanggapan." - -#: editor/plugins/script_editor_plugin.cpp msgid "Search the reference documentation." msgstr "Cari dokumentasi referensi." @@ -7301,6 +7297,11 @@ msgid "This operation requires a single selected node." msgstr "Operasi ini membutuhkan satu node yang dipilih." #: editor/plugins/spatial_editor_plugin.cpp +#, fuzzy +msgid "Auto Orthogonal Enabled" +msgstr "Ortogonal" + +#: editor/plugins/spatial_editor_plugin.cpp msgid "Lock View Rotation" msgstr "Kunci Rotasi Tampilan" @@ -7389,6 +7390,10 @@ msgid "Freelook Slow Modifier" msgstr "Pengubah Lambat Tampilan Bebas" #: editor/plugins/spatial_editor_plugin.cpp +msgid "View Rotation Locked" +msgstr "Rotasi Tampilan Terkunci" + +#: editor/plugins/spatial_editor_plugin.cpp msgid "" "Note: The FPS value displayed is the editor's framerate.\n" "It cannot be used as a reliable indication of in-game performance." @@ -7397,10 +7402,6 @@ msgstr "" "Tidak bisa digunakan sebagai indikasi kinerja gim yang dapat dihandalkan." #: editor/plugins/spatial_editor_plugin.cpp -msgid "View Rotation Locked" -msgstr "Rotasi Tampilan Terkunci" - -#: editor/plugins/spatial_editor_plugin.cpp msgid "XForm Dialog" msgstr "Dialog XForm" @@ -9924,6 +9925,13 @@ msgstr "" "Saat ini Anda tidak memiliki proyek.\n" "Apakah Anda ingin menjelajahi contoh proyek resmi di Pustaka Aset?" +#: editor/project_manager.cpp +msgid "" +"The search box filters projects by name and last path component.\n" +"To filter projects by name and full path, the query must contain at least " +"one `/` character." +msgstr "" + #: editor/project_settings_editor.cpp msgid "Key " msgstr "Kunci " @@ -10914,6 +10922,12 @@ msgid "Script file already exists." msgstr "Berkas skrip sudah ada." #: editor/script_create_dialog.cpp +msgid "" +"Note: Built-in scripts have some limitations and can't be edited using an " +"external editor." +msgstr "" + +#: editor/script_create_dialog.cpp msgid "Class Name:" msgstr "Nama Kelas:" @@ -11034,6 +11048,11 @@ msgid "Total:" msgstr "Total:" #: editor/script_editor_debugger.cpp +#, fuzzy +msgid "Export list to a CSV file" +msgstr "Ekspor Profil" + +#: editor/script_editor_debugger.cpp msgid "Resource Path" msgstr "Lokasi Resource" @@ -11298,7 +11317,6 @@ msgid "GridMap Paste Selection" msgstr "Rekat(Paste) Seleksi GridMap" #: modules/gridmap/grid_map_editor_plugin.cpp -#, fuzzy msgid "GridMap Paint" msgstr "Cat GridMap" @@ -11716,7 +11734,7 @@ msgstr "Tidak dapat membuat fungsi dengan node fungsi." #: modules/visual_script/visual_script_editor.cpp msgid "Can't create function of nodes from nodes of multiple functions." -msgstr "" +msgstr "Tidak dapat membuat fungsi node dari node beberapa fungsi." #: modules/visual_script/visual_script_editor.cpp msgid "Select at least one node with sequence port." @@ -11881,19 +11899,19 @@ msgstr "Nama paket tidak ada." #: platform/android/export/export.cpp msgid "Package segments must be of non-zero length." -msgstr "" +msgstr "Segmen paket panjangnya harus tidak boleh nol." #: platform/android/export/export.cpp msgid "The character '%s' is not allowed in Android application package names." -msgstr "" +msgstr "Karakter '%s' tidak diizinkan dalam penamaan paket aplikasi Android." #: platform/android/export/export.cpp msgid "A digit cannot be the first character in a package segment." -msgstr "" +msgstr "Digit tidak boleh diletakkan sebagai karakter awal di segmen paket." #: platform/android/export/export.cpp msgid "The character '%s' cannot be the first character in a package segment." -msgstr "" +msgstr "Karakter '%s' tidak bisa dijadikan karakter awal dalam segmen paket." #: platform/android/export/export.cpp msgid "The package must have at least one '.' separator." @@ -11939,7 +11957,7 @@ msgstr "" #: platform/android/export/export.cpp msgid "Invalid public key for APK expansion." -msgstr "" +msgstr "Kunci Publik untuk ekspansi APK tidak valid." #: platform/android/export/export.cpp msgid "Invalid package name:" @@ -11950,6 +11968,8 @@ msgid "" "Trying to build from a custom built template, but no version info for it " "exists. Please reinstall from the 'Project' menu." msgstr "" +"Mencoba untuk membangun dari templat build khusus, tapi tidak ada informasi " +"versinya. Silakan pasang ulang dari menu 'Proyek'." #: platform/android/export/export.cpp msgid "" @@ -11958,24 +11978,30 @@ msgid "" " Godot Version: %s\n" "Please reinstall Android build template from 'Project' menu." msgstr "" +"Versi build Android tidak cocok:\n" +" Templat terpasang: %s\n" +" Versi Godot: %s\n" +"Silakan pasang ulang templat build Android dari menu 'Project'." #: platform/android/export/export.cpp msgid "Building Android Project (gradle)" -msgstr "" +msgstr "Membangun Proyek Android (gradle)" #: platform/android/export/export.cpp msgid "" "Building of Android project failed, check output for the error.\n" "Alternatively visit docs.godotengine.org for Android build documentation." msgstr "" +"Pembangunan proyek Android gagal, periksa output untuk galatnya.\n" +"Atau kunjungi docs.godotengine.org untuk dokumentasi build Android." #: platform/android/export/export.cpp msgid "No build apk generated at: " -msgstr "" +msgstr "Tak ada build apk yang dihasilkan di: " #: platform/iphone/export/export.cpp msgid "Identifier is missing." -msgstr "" +msgstr "Kurang identifier." #: platform/iphone/export/export.cpp msgid "The character '%s' is not allowed in Identifier." @@ -11984,6 +12010,7 @@ msgstr "Karakter '%s' tidak diizinkan dalam Identifier." #: platform/iphone/export/export.cpp msgid "App Store Team ID not specified - cannot configure the project." msgstr "" +"App Store Team ID tidak ditetapkan - tidak dapat mengonfigurasi proyek." #: platform/iphone/export/export.cpp msgid "Invalid Identifier:" @@ -11991,19 +12018,19 @@ msgstr "Identifier tidak valid:" #: platform/iphone/export/export.cpp msgid "Required icon is not specified in the preset." -msgstr "" +msgstr "Ikon yang dibutuhkan tidak ditentukan dalam preset." #: platform/javascript/export/export.cpp msgid "Stop HTTP Server" -msgstr "" +msgstr "Hentikan Server HTTP" #: platform/javascript/export/export.cpp msgid "Run in Browser" -msgstr "" +msgstr "Jalankan di Peramban" #: platform/javascript/export/export.cpp msgid "Run exported HTML in the system's default browser." -msgstr "" +msgstr "Jalankan HTML yang diekspor dalam peramban baku sistem." #: platform/javascript/export/export.cpp msgid "Could not write file:" @@ -12055,31 +12082,31 @@ msgstr "Warna latar belakang tidak valid." #: platform/uwp/export/export.cpp msgid "Invalid Store Logo image dimensions (should be 50x50)." -msgstr "" +msgstr "Dimensi gambar Logo Store tidak valid (harus 50x50)." #: platform/uwp/export/export.cpp msgid "Invalid square 44x44 logo image dimensions (should be 44x44)." -msgstr "" +msgstr "Dimensi gambar logo persegi 44x44 tidak valid (harus 44x44)." #: platform/uwp/export/export.cpp msgid "Invalid square 71x71 logo image dimensions (should be 71x71)." -msgstr "" +msgstr "Dimensi gambar logo persegi 71x71 tidak valid (harus 71x71)." #: platform/uwp/export/export.cpp msgid "Invalid square 150x150 logo image dimensions (should be 150x150)." -msgstr "" +msgstr "Dimensi gambar logo persegi 150x150 tidak valid (harus 150x150)." #: platform/uwp/export/export.cpp msgid "Invalid square 310x310 logo image dimensions (should be 310x310)." -msgstr "" +msgstr "Dimensi gambar logo persegi 310x310 tidak valid (harus 310x310)." #: platform/uwp/export/export.cpp msgid "Invalid wide 310x150 logo image dimensions (should be 310x150)." -msgstr "" +msgstr "Dimensi gambar logo 310x150 lebarnya tidak valid (harus 310x150)." #: platform/uwp/export/export.cpp msgid "Invalid splash screen image dimensions (should be 620x300)." -msgstr "" +msgstr "Dimensi gambar splash screen tidak valid (harus 620x300)." #: scene/2d/animated_sprite.cpp msgid "" @@ -12104,6 +12131,10 @@ msgid "" "Consider adding a CollisionShape2D or CollisionPolygon2D as a child to " "define its shape." msgstr "" +"Node ini tidak punya shape, jadi dia tidak bisa bertabrakan atau " +"berinteraksi dengan objek lain.\n" +"Pertimbangkan untuk menambahkan CollisionShape2D atau CollisionPolygon2D " +"sebagai anak untuk mendefinisikan bentuknya." #: scene/2d/collision_polygon_2d.cpp msgid "" @@ -12145,6 +12176,8 @@ msgid "" "CPUParticles2D animation requires the usage of a CanvasItemMaterial with " "\"Particles Animation\" enabled." msgstr "" +"Animasi CPUParticles2D membutuhkan penggunaan CanvasItemMaterial dengan " +"\"Animasi Partikel\" diaktifkan." #: scene/2d/light_2d.cpp msgid "" @@ -12194,18 +12227,25 @@ msgid "" "Use the CPUParticles2D node instead. You can use the \"Convert to " "CPUParticles\" option for this purpose." msgstr "" +"Partikel berbasis GPU tidak didukung oleh video driver GLES2.\n" +"Gunakan node CPUParticles2D sebagai gantinya. Anda dapat menggunakan opsi " +"\"Konversikan jadi CPUParticles\" untuk tujuan ini." #: scene/2d/particles_2d.cpp scene/3d/particles.cpp msgid "" "A material to process the particles is not assigned, so no behavior is " "imprinted." msgstr "" +"Material untuk memproses partikel belum ditetapkan, jadi tidak ada perilaku " +"yang dimunculkan." #: scene/2d/particles_2d.cpp msgid "" "Particles2D animation requires the usage of a CanvasItemMaterial with " "\"Particles Animation\" enabled." msgstr "" +"Animasi Particles2D membutuhkan penggunaan CanvasItemMaterial dengan " +"\"Animasi Partikel\" diaktifkan." #: scene/2d/path_2d.cpp msgid "PathFollow2D only works when set as a child of a Path2D node." @@ -12219,6 +12259,9 @@ msgid "" "by the physics engine when running.\n" "Change the size in children collision shapes instead." msgstr "" +"Perubahan ukuran RigidBody2D (dalam mode karakter atau rigid/pejal) akan " +"ditimpa oleh mesin fisika saat menjalankan.\n" +"Sebagai gantinya, ubahlah ukuran di anakan collision shape-nya saja." #: scene/2d/remote_transform_2d.cpp msgid "Path property must point to a valid Node2D node to work." @@ -12227,16 +12270,19 @@ msgstr "" #: scene/2d/skeleton_2d.cpp msgid "This Bone2D chain should end at a Skeleton2D node." -msgstr "" +msgstr "Ikatan Bone2D ini harus diakhiri dengan node Skeleton2D." #: scene/2d/skeleton_2d.cpp msgid "A Bone2D only works with a Skeleton2D or another Bone2D as parent node." msgstr "" +"Bone2D hanya bekerja dengan Skeleton2D atau Bone2D lain sebagai node induk." #: scene/2d/skeleton_2d.cpp msgid "" "This bone lacks a proper REST pose. Go to the Skeleton2D node and set one." msgstr "" +"Tulang ini tidak memiliki pose REST yang sesuai. Pergi ke node Skeleton2D " +"dan tetapkan." #: scene/2d/tile_map.cpp msgid "" @@ -12258,47 +12304,51 @@ msgstr "" #: scene/3d/arvr_nodes.cpp msgid "ARVRCamera must have an ARVROrigin node as its parent." -msgstr "" +msgstr "ARVRCamera wajib memiliki node ARVROrigin sebagai induknya." #: scene/3d/arvr_nodes.cpp msgid "ARVRController must have an ARVROrigin node as its parent." -msgstr "" +msgstr "ARVRController wajib memiliki node ARVROrigin sebagai induknya." #: scene/3d/arvr_nodes.cpp msgid "" "The controller ID must not be 0 or this controller won't be bound to an " "actual controller." msgstr "" +"ID pengontrol tidak boleh 0 atau pengontrol ini tidak terikat ke pengontrol " +"yang sebenarnya." #: scene/3d/arvr_nodes.cpp msgid "ARVRAnchor must have an ARVROrigin node as its parent." -msgstr "" +msgstr "ARVRAnchor wajib memiliki node ARVROrigin sebagai induknya." #: scene/3d/arvr_nodes.cpp msgid "" "The anchor ID must not be 0 or this anchor won't be bound to an actual " "anchor." msgstr "" +"ID jangkar tidak boleh 0 atau jangkar ini tidak akan terikat ke jangkar " +"aslinya." #: scene/3d/arvr_nodes.cpp msgid "ARVROrigin requires an ARVRCamera child node." -msgstr "" +msgstr "ARVROrigin membutuhkan node anak ARVRCamera." #: scene/3d/baked_lightmap.cpp msgid "%d%%" -msgstr "" +msgstr "%d%%" #: scene/3d/baked_lightmap.cpp msgid "(Time Left: %d:%02d s)" -msgstr "" +msgstr "(Waktu tersisa: %d:%02d s)" #: scene/3d/baked_lightmap.cpp msgid "Plotting Meshes: " -msgstr "" +msgstr "Plotting Meshes: " #: scene/3d/baked_lightmap.cpp msgid "Plotting Lights:" -msgstr "" +msgstr "Plotting Lights:" #: scene/3d/baked_lightmap.cpp scene/3d/gi_probe.cpp msgid "Finishing Plot" @@ -12642,6 +12692,10 @@ msgstr "" "tidak, jadikan sebagai RenderTarget dan tetapkan tekstur internal nya ke " "beberapa node untuk ditampilkan." +#: scene/main/viewport.cpp +msgid "Viewport size must be greater than 0 to render anything." +msgstr "" + #: scene/resources/visual_shader_nodes.cpp msgid "Invalid source for preview." msgstr "Sumber tidak sah untuk pratinjau." @@ -12670,6 +12724,15 @@ msgstr "Variasi hanya bisa ditetapkan dalam fungsi vertex." msgid "Constants cannot be modified." msgstr "Konstanta tidak dapat dimodifikasi." +#~ msgid "Issue Tracker" +#~ msgstr "Pelacak Isu" + +#~ msgid "Request Docs" +#~ msgstr "Minta Dokumentasi" + +#~ msgid "Help improve the Godot documentation by giving feedback." +#~ msgstr "Bantu tingkatkan dokumentasi Godot dengan memberikan tanggapan." + #~ msgid "Replaced %d occurrence(s)." #~ msgstr "kejadian %d diganti." diff --git a/editor/translations/is.po b/editor/translations/is.po index 213e7d239b..e2943eb9cf 100644 --- a/editor/translations/is.po +++ b/editor/translations/is.po @@ -4,12 +4,13 @@ # This file is distributed under the same license as the Godot source code. # Jóhannes G. Þorsteinsson <johannesg@johannesg.com>, 2017, 2018. # Kaan Gül <qaantum@hotmail.com>, 2018. +# Einar Magnús Einarsson <einar.m.einarsson@gmail.com>, 2020. msgid "" msgstr "" "Project-Id-Version: Godot Engine editor\n" "POT-Creation-Date: \n" -"PO-Revision-Date: 2018-12-13 14:40+0100\n" -"Last-Translator: Jóhannes G. Þorsteinsson <johannesg@johannesg.com>\n" +"PO-Revision-Date: 2020-04-16 11:03+0000\n" +"Last-Translator: Einar Magnús Einarsson <einar.m.einarsson@gmail.com>\n" "Language-Team: Icelandic <https://hosted.weblate.org/projects/godot-engine/" "godot/is/>\n" "Language: is\n" @@ -17,34 +18,35 @@ msgstr "" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=n != 1;\n" -"X-Generator: Poedit 2.2\n" +"X-Generator: Weblate 4.0.1-dev\n" #: core/math/expression.cpp modules/gdscript/gdscript_functions.cpp #: modules/visual_script/visual_script_builtin_funcs.cpp msgid "Invalid type argument to convert(), use TYPE_* constants." -msgstr "" +msgstr "Ógild breyta send til convert(), notaðu TYPE_ * fasti." #: core/math/expression.cpp modules/gdscript/gdscript_functions.cpp msgid "Expected a string of length 1 (a character)." -msgstr "" +msgstr "Búist var við streng með lengd 1 (a character)." #: core/math/expression.cpp modules/gdscript/gdscript_functions.cpp #: modules/mono/glue/gd_glue.cpp #: modules/visual_script/visual_script_builtin_funcs.cpp msgid "Not enough bytes for decoding bytes, or invalid format." -msgstr "" +msgstr "Ekki nægt minni til að umskrá bæti eða ógilt snið." #: core/math/expression.cpp msgid "Invalid input %i (not passed) in expression" -msgstr "" +msgstr "Ógild inntak % i (ekki sent áfram)" #: core/math/expression.cpp msgid "self can't be used because instance is null (not passed)" msgstr "" +"Ekki hægt að nota \"self\" vegna þess að tilvik er \"null\" (ekki samþykkt)" #: core/math/expression.cpp msgid "Invalid operands to operator %s, %s and %s." -msgstr "" +msgstr "Ógilt reiknitákn notað à útreikningi % s,% s og% s." #: core/math/expression.cpp msgid "Invalid index of type %s for base type %s" @@ -1441,7 +1443,7 @@ msgstr "" msgid "Remove Autoload" msgstr "" -#: editor/editor_autoload_settings.cpp +#: editor/editor_autoload_settings.cpp editor/editor_plugin_settings.cpp msgid "Enable" msgstr "" @@ -2852,7 +2854,11 @@ msgid "Q&A" msgstr "" #: editor/editor_node.cpp -msgid "Issue Tracker" +msgid "Report a Bug" +msgstr "" + +#: editor/editor_node.cpp +msgid "Send Docs Feedback" msgstr "" #: editor/editor_node.cpp editor/plugins/asset_library_editor_plugin.cpp @@ -3878,7 +3884,7 @@ msgid "Reimport" msgstr "" #: editor/import_dock.cpp -msgid "Save scenes, re-import and restart" +msgid "Save Scenes, Re-Import, and Restart" msgstr "" #: editor/import_dock.cpp @@ -6689,14 +6695,6 @@ msgid "Open Godot online documentation." msgstr "" #: editor/plugins/script_editor_plugin.cpp -msgid "Request Docs" -msgstr "" - -#: editor/plugins/script_editor_plugin.cpp -msgid "Help improve the Godot documentation by giving feedback." -msgstr "" - -#: editor/plugins/script_editor_plugin.cpp msgid "Search the reference documentation." msgstr "" @@ -7127,6 +7125,10 @@ msgid "This operation requires a single selected node." msgstr "" #: editor/plugins/spatial_editor_plugin.cpp +msgid "Auto Orthogonal Enabled" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp msgid "Lock View Rotation" msgstr "" @@ -7215,13 +7217,13 @@ msgid "Freelook Slow Modifier" msgstr "" #: editor/plugins/spatial_editor_plugin.cpp -msgid "" -"Note: The FPS value displayed is the editor's framerate.\n" -"It cannot be used as a reliable indication of in-game performance." +msgid "View Rotation Locked" msgstr "" #: editor/plugins/spatial_editor_plugin.cpp -msgid "View Rotation Locked" +msgid "" +"Note: The FPS value displayed is the editor's framerate.\n" +"It cannot be used as a reliable indication of in-game performance." msgstr "" #: editor/plugins/spatial_editor_plugin.cpp @@ -9627,6 +9629,13 @@ msgid "" "Would you like to explore official example projects in the Asset Library?" msgstr "" +#: editor/project_manager.cpp +msgid "" +"The search box filters projects by name and last path component.\n" +"To filter projects by name and full path, the query must contain at least " +"one `/` character." +msgstr "" + #: editor/project_settings_editor.cpp msgid "Key " msgstr "" @@ -10588,6 +10597,12 @@ msgid "Script file already exists." msgstr "" #: editor/script_create_dialog.cpp +msgid "" +"Note: Built-in scripts have some limitations and can't be edited using an " +"external editor." +msgstr "" + +#: editor/script_create_dialog.cpp msgid "Class Name:" msgstr "" @@ -10708,6 +10723,10 @@ msgid "Total:" msgstr "" #: editor/script_editor_debugger.cpp +msgid "Export list to a CSV file" +msgstr "" + +#: editor/script_editor_debugger.cpp msgid "Resource Path" msgstr "" @@ -12215,6 +12234,10 @@ msgid "" "texture to some node for display." msgstr "" +#: scene/main/viewport.cpp +msgid "Viewport size must be greater than 0 to render anything." +msgstr "" + #: scene/resources/visual_shader_nodes.cpp msgid "Invalid source for preview." msgstr "" diff --git a/editor/translations/it.po b/editor/translations/it.po index 738718a0fa..1c7c72ce12 100644 --- a/editor/translations/it.po +++ b/editor/translations/it.po @@ -44,11 +44,13 @@ # nickfla1 <lanterniniflavio@gmail.com>, 2019. # Fabio Iotti <fabiogiopla@gmail.com>, 2020. # Douglas Fiedler <dognew@gmail.com>, 2020. +# E440QF <ettore.beltra@gmail.com>, 2020. +# Giuseppe Lucido <giuseppe.lucido@gmail.com>, 2020. msgid "" msgstr "" "Project-Id-Version: Godot Engine editor\n" "POT-Creation-Date: \n" -"PO-Revision-Date: 2020-02-27 07:01+0000\n" +"PO-Revision-Date: 2020-04-27 08:25+0000\n" "Last-Translator: Micila Micillotto <micillotto@gmail.com>\n" "Language-Team: Italian <https://hosted.weblate.org/projects/godot-engine/" "godot/it/>\n" @@ -57,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-dev\n" +"X-Generator: Weblate 4.0.2-dev\n" #: core/math/expression.cpp modules/gdscript/gdscript_functions.cpp #: modules/visual_script/visual_script_builtin_funcs.cpp @@ -1484,7 +1486,7 @@ msgstr "Sposta Autoload" msgid "Remove Autoload" msgstr "Rimuovi Autoload" -#: editor/editor_autoload_settings.cpp +#: editor/editor_autoload_settings.cpp editor/editor_plugin_settings.cpp msgid "Enable" msgstr "Abilita" @@ -2983,8 +2985,12 @@ msgid "Q&A" msgstr "Domande e risposte" #: editor/editor_node.cpp -msgid "Issue Tracker" -msgstr "Tracciatore segnalazioni" +msgid "Report a Bug" +msgstr "Riporta un Bug" + +#: editor/editor_node.cpp +msgid "Send Docs Feedback" +msgstr "Invia opinione sui documenti" #: editor/editor_node.cpp editor/plugins/asset_library_editor_plugin.cpp msgid "Community" @@ -4043,8 +4049,8 @@ msgid "Reimport" msgstr "Reimporta" #: editor/import_dock.cpp -msgid "Save scenes, re-import and restart" -msgstr "Salva scene, importa nuovamente e riavvia" +msgid "Save Scenes, Re-Import, and Restart" +msgstr "Salva scene, re-importa e riavvia" #: editor/import_dock.cpp msgid "Changing the type of an imported file requires editor restart." @@ -6023,7 +6029,6 @@ msgstr "" "collisioni." #: editor/plugins/mesh_instance_editor_plugin.cpp -#, fuzzy msgid "Create Single Convex Collision Sibling" msgstr "Crea Singolo Fratello di Collisione Convessa" @@ -6918,14 +6923,6 @@ msgid "Open Godot online documentation." msgstr "Apri la documentazione online di Godot." #: editor/plugins/script_editor_plugin.cpp -msgid "Request Docs" -msgstr "Documentazione richiesta" - -#: editor/plugins/script_editor_plugin.cpp -msgid "Help improve the Godot documentation by giving feedback." -msgstr "Aiutate a migliorare la documentazione di Godot fornendo feedback." - -#: editor/plugins/script_editor_plugin.cpp msgid "Search the reference documentation." msgstr "Cerca Riferimenti nella documentazione." @@ -7361,6 +7358,10 @@ msgid "This operation requires a single selected node." msgstr "Questa operazione richiede un solo nodo selezionato." #: editor/plugins/spatial_editor_plugin.cpp +msgid "Auto Orthogonal Enabled" +msgstr "Ortogonale Automatico Abilitato" + +#: editor/plugins/spatial_editor_plugin.cpp msgid "Lock View Rotation" msgstr "Blocca Rotazione Vista" @@ -7449,6 +7450,10 @@ msgid "Freelook Slow Modifier" msgstr "Modificatore Vista Libera Velocità Lenta" #: editor/plugins/spatial_editor_plugin.cpp +msgid "View Rotation Locked" +msgstr "Rotazione Vista Bloccata" + +#: editor/plugins/spatial_editor_plugin.cpp msgid "" "Note: The FPS value displayed is the editor's framerate.\n" "It cannot be used as a reliable indication of in-game performance." @@ -7458,10 +7463,6 @@ msgstr "" "gioco." #: editor/plugins/spatial_editor_plugin.cpp -msgid "View Rotation Locked" -msgstr "Rotazione Vista Bloccata" - -#: editor/plugins/spatial_editor_plugin.cpp msgid "XForm Dialog" msgstr "Finestra di XForm" @@ -9987,6 +9988,13 @@ msgstr "" "Al momento non hai nessun progetto.\n" "Ti piacerebbe esplorare gli esempi ufficiali nella libreria degli Asset?" +#: editor/project_manager.cpp +msgid "" +"The search box filters projects by name and last path component.\n" +"To filter projects by name and full path, the query must contain at least " +"one `/` character." +msgstr "" + #: editor/project_settings_editor.cpp msgid "Key " msgstr "Tasto " @@ -10975,6 +10983,14 @@ msgid "Script file already exists." msgstr "Il file di script esiste già ." #: editor/script_create_dialog.cpp +msgid "" +"Note: Built-in scripts have some limitations and can't be edited using an " +"external editor." +msgstr "" +"Note: Gli script pre-installati hanno alcune limitazioni e non possono " +"essere modificati utilizzando un editor esterno." + +#: editor/script_create_dialog.cpp msgid "Class Name:" msgstr "Nome Classe:" @@ -11095,6 +11111,11 @@ msgid "Total:" msgstr "Totale:" #: editor/script_editor_debugger.cpp +#, fuzzy +msgid "Export list to a CSV file" +msgstr "Esporta profilo" + +#: editor/script_editor_debugger.cpp msgid "Resource Path" msgstr "Percorso Risorsa" @@ -12477,6 +12498,7 @@ msgstr "" msgid "" "ConcavePolygonShape doesn't support RigidBody in another mode than static." msgstr "" +"ConcavePolygonShape non supporta RigidBody in modalità diverse da static." #: scene/3d/cpu_particles.cpp msgid "Nothing is visible because no mesh has been assigned." @@ -12774,6 +12796,12 @@ msgstr "" "Control, in modo che possa ottenere una dimensione. Altrimenti, renderlo un " "RenderTarget e assegnare alla sua texture interna qualche nodo da mostrare." +#: scene/main/viewport.cpp +msgid "Viewport size must be greater than 0 to render anything." +msgstr "" +"La dimensione del Viewport deve essere maggiore di 0 affinché qualcosa sia " +"visibile." + #: scene/resources/visual_shader_nodes.cpp msgid "Invalid source for preview." msgstr "Fonte non valida per l'anteprima." @@ -12802,6 +12830,15 @@ msgstr "Varyings può essere assegnato soltanto nella funzione del vertice." msgid "Constants cannot be modified." msgstr "Le constanti non possono essere modificate." +#~ msgid "Issue Tracker" +#~ msgstr "Tracciatore segnalazioni" + +#~ msgid "Request Docs" +#~ msgstr "Documentazione richiesta" + +#~ msgid "Help improve the Godot documentation by giving feedback." +#~ msgstr "Aiutate a migliorare la documentazione di Godot fornendo feedback." + #~ msgid "Replaced %d occurrence(s)." #~ msgstr "Rimpiazzate %d occorrenze." diff --git a/editor/translations/ja.po b/editor/translations/ja.po index 0bb76f1261..aac20e9666 100644 --- a/editor/translations/ja.po +++ b/editor/translations/ja.po @@ -7,7 +7,7 @@ # Daisuke Saito <d.saito@coriginate.com>, 2017, 2018. # h416 <shinichiro.hirama@gmail.com>, 2017. # hopping tappy (ãŸã£ã´ã•ã‚“) <hopping.tappy@gmail.com>, 2016-2017, 2018. -# Jun Shiozawa <haresecret@gmail.com>, 2017, 2018. +# Jun Shiozawa <haresecret@gmail.com>, 2017, 2018, 2020. # Lexi Grafen <shfeedly@gmail.com>, 2017. # NoahDigital <taku_58@hotmail.com>, 2017. # Shinsuke Masuda <shinsuke.masuda@gmail.com>, 2018. @@ -35,8 +35,8 @@ msgid "" msgstr "" "Project-Id-Version: Godot Engine editor\n" "POT-Creation-Date: \n" -"PO-Revision-Date: 2020-03-16 09:43+0000\n" -"Last-Translator: Akihiro Ogoshi <technical@palsystem-game.com>\n" +"PO-Revision-Date: 2020-04-27 08:25+0000\n" +"Last-Translator: Anonymous <noreply@weblate.org>\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-dev\n" +"X-Generator: Weblate 4.0.2-dev\n" #: core/math/expression.cpp modules/gdscript/gdscript_functions.cpp #: modules/visual_script/visual_script_builtin_funcs.cpp @@ -53,7 +53,7 @@ msgstr "convert() ã®å¼•æ•°ã®åž‹ãŒç„¡åйã§ã™ã€‚TYPE_* 定数を使ã£ã¦ãã #: core/math/expression.cpp modules/gdscript/gdscript_functions.cpp msgid "Expected a string of length 1 (a character)." -msgstr "é•·ã•ãŒ1ã®æ–‡å—列(文å—)を予期ã—ã¾ã—ãŸã€‚" +msgstr "é•·ã•1ã®æ–‡å—列(æ–‡å—)ãŒå¿…è¦ã§ã™ã€‚" #: core/math/expression.cpp modules/gdscript/gdscript_functions.cpp #: modules/mono/glue/gd_glue.cpp @@ -63,19 +63,19 @@ msgstr "デコードã™ã‚‹ã«ã¯ãƒã‚¤ãƒˆãŒè¶³ã‚Šãªã„ã‹ã€ã¾ãŸã¯ç„¡åŠ¹ãª #: core/math/expression.cpp msgid "Invalid input %i (not passed) in expression" -msgstr "入力ã•れãŸå¼ %i ã¯ç„¡åйã§ã™" +msgstr "å¼ä¸ã®ç„¡åйãªå…¥åŠ› %i (渡ã•れã¦ã„ã¾ã›ã‚“)" #: core/math/expression.cpp msgid "self can't be used because instance is null (not passed)" -msgstr "インスタンス㌠null ã®ãŸã‚ã€self ã¯ä½¿ç”¨ã§ãã¾ã›ã‚“" +msgstr "インスタンスãŒnull(渡ã•れãªã„)ã§ã‚ã‚‹ãŸã‚ã€selfã¯ä½¿ç”¨ã§ãã¾ã›ã‚“" #: core/math/expression.cpp msgid "Invalid operands to operator %s, %s and %s." -msgstr "演算å %s, %s, %s ã«å¯¾ã™ã‚‹å€¤ãŒç„¡åйã§ã™ã€‚" +msgstr "演算å %s ã«å¯¾ã™ã‚‹ç„¡åйãªã‚ªãƒšãƒ©ãƒ³ãƒ‰ã§ã™ã€%s åŠã³ %s。" #: core/math/expression.cpp msgid "Invalid index of type %s for base type %s" -msgstr "基本型 %s ã®åž‹ %s ã®ã‚¤ãƒ³ãƒ‡ãƒƒã‚¯ã‚¹ãŒç„¡åйã§ã™" +msgstr "タイプ %s ã®ã‚¤ãƒ³ãƒ‡ãƒƒã‚¯ã‚¹ãŒç„¡åйã€ã“れã¯åŸºåº•åž‹ %s 用ã§ã™" #: core/math/expression.cpp msgid "Invalid named index '%s' for base type %s" @@ -83,39 +83,39 @@ msgstr "インデックス '%s' (基底型 %s) ã¯ç„¡åйãªåå‰ã§ã™" #: core/math/expression.cpp msgid "Invalid arguments to construct '%s'" -msgstr "'%s' ã®å¼•æ•°ã¯ç„¡åйã§ã™" +msgstr "'%s' を構築ã™ã‚‹ãŸã‚ã®å¼•æ•°ãŒç„¡åйã§ã™" #: core/math/expression.cpp msgid "On call to '%s':" -msgstr "'%s' ã¸ã®å‘¼ã³å‡ºã—:" +msgstr "'%s' ã®å‘¼ã³å‡ºã—時:" #: core/ustring.cpp msgid "B" -msgstr "\\ B" +msgstr "B" #: core/ustring.cpp msgid "KiB" -msgstr "\\ KiB" +msgstr "KiB" #: core/ustring.cpp msgid "MiB" -msgstr "\\ MiB" +msgstr "MiB" #: core/ustring.cpp msgid "GiB" -msgstr "\\ GiB" +msgstr "GiB" #: core/ustring.cpp msgid "TiB" -msgstr "\\ TiB" +msgstr "TiB" #: core/ustring.cpp msgid "PiB" -msgstr "\\ PiB" +msgstr "PiB" #: core/ustring.cpp msgid "EiB" -msgstr "\\ EiB" +msgstr "EiB" #: editor/animation_bezier_editor.cpp msgid "Free" @@ -297,7 +297,7 @@ msgstr "時間 (ç§’): " #: editor/animation_track_editor.cpp msgid "Toggle Track Enabled" -msgstr "トラックを有効ã«ã™ã‚‹" +msgstr "トラックを有効 / 無効" #: editor/animation_track_editor.cpp msgid "Continuous" @@ -330,11 +330,11 @@ msgstr "ã‚ュービック" #: editor/animation_track_editor.cpp msgid "Clamp Loop Interp" -msgstr "ループインタプリタを抑ãˆè¾¼ã¿ï¼ˆclamp)" +msgstr "ループインタプリタを抑ãˆè¾¼ã¿(clamp)" #: editor/animation_track_editor.cpp msgid "Wrap Loop Interp" -msgstr "ループインタプリタをラップ(wrap)" +msgstr "ループインタプリタをラップ(wrap)" #: editor/animation_track_editor.cpp #: editor/plugins/canvas_item_editor_plugin.cpp @@ -721,11 +721,11 @@ msgstr "%d ã‚’ç½®æ›ã—ã¾ã—ãŸã€‚" #: editor/code_editor.cpp editor/editor_help.cpp msgid "%d match." -msgstr "ï¼…dä»¶ã®ä¸€è‡´ãŒè¦‹ã¤ã‹ã‚Šã¾ã—ãŸã€‚" +msgstr "%dä»¶ã®ä¸€è‡´ãŒè¦‹ã¤ã‹ã‚Šã¾ã—ãŸã€‚" #: editor/code_editor.cpp editor/editor_help.cpp msgid "%d matches." -msgstr "ï¼…dä»¶ã®ä¸€è‡´ãŒè¦‹ã¤ã‹ã‚Šã¾ã—ãŸã€‚" +msgstr "%dä»¶ã®ä¸€è‡´ãŒè¦‹ã¤ã‹ã‚Šã¾ã—ãŸã€‚" #: editor/code_editor.cpp editor/find_in_files.cpp msgid "Match Case" @@ -1049,7 +1049,7 @@ msgstr "次ã®ã‚ªãƒ¼ãƒŠãƒ¼:" #: editor/dependency_editor.cpp msgid "Remove selected files from the project? (Can't be restored)" -msgstr "é¸æŠžã—ãŸãƒ•ァイルをプãƒã‚¸ã‚§ã‚¯ãƒˆã‹ã‚‰å‰Šé™¤ã—ã¾ã™ã‹? (å…ƒã«æˆ»ã›ã¾ã›ã‚“)" +msgstr "é¸æŠžã—ãŸãƒ•ァイルをプãƒã‚¸ã‚§ã‚¯ãƒˆã‹ã‚‰å‰Šé™¤ã—ã¾ã™ã‹ï¼Ÿ(å…ƒã«æˆ»ã›ã¾ã›ã‚“)" #: editor/dependency_editor.cpp msgid "" @@ -1058,7 +1058,7 @@ msgid "" "Remove them anyway? (no undo)" msgstr "" "除去ã—よã†ã¨ã—ã¦ã„るファイルã¯ä»–ã®ãƒªã‚½ãƒ¼ã‚¹ã®å‹•作ã«å¿…è¦ã§ã™ã€‚\n" -"無視ã—ã¦é™¤åŽ»ã—ã¾ã™ã‹ï¼Ÿ (å…ƒã«æˆ»ã›ã¾ã›ã‚“)" +"無視ã—ã¦é™¤åŽ»ã—ã¾ã™ã‹ï¼Ÿ(å…ƒã«æˆ»ã›ã¾ã›ã‚“)" #: editor/dependency_editor.cpp msgid "Cannot remove:" @@ -1090,7 +1090,7 @@ msgstr "èªã¿è¾¼ã¿ã‚¨ãƒ©ãƒ¼ï¼" #: editor/dependency_editor.cpp msgid "Permanently delete %d item(s)? (No undo!)" -msgstr "%d 個ã®ã‚¢ã‚¤ãƒ†ãƒ を完全ã«å‰Šé™¤ã—ã¾ã™ã‹?ï¼ˆå…ƒã«æˆ»ã›ã¾ã›ã‚“!)" +msgstr "%d 個ã®ã‚¢ã‚¤ãƒ†ãƒ を完全ã«å‰Šé™¤ã—ã¾ã™ã‹ï¼Ÿ(å…ƒã«æˆ»ã›ã¾ã›ã‚“ï¼)" #: editor/dependency_editor.cpp msgid "Show Dependencies" @@ -1210,7 +1210,7 @@ msgstr "コンãƒãƒ¼ãƒãƒ³ãƒˆ" #: editor/editor_about.cpp msgid "Licenses" -msgstr "ライセンス" +msgstr "ライセンス文書" #: editor/editor_asset_installer.cpp editor/project_manager.cpp msgid "Error opening package file, not in ZIP format." @@ -1251,7 +1251,7 @@ msgstr "インストール" #: editor/editor_asset_installer.cpp msgid "Package Installer" -msgstr "パッケージインストーラー" +msgstr "パッケージインストーラ" #: editor/editor_audio_buses.cpp msgid "Speakers" @@ -1271,15 +1271,15 @@ msgstr "オーディオãƒã‚¹ã®ãƒœãƒªãƒ¥ãƒ¼ãƒ を変更" #: editor/editor_audio_buses.cpp msgid "Toggle Audio Bus Solo" -msgstr "オーディオãƒã‚¹ã®ã‚½ãƒã‚’切り替ãˆ" +msgstr "オーディオãƒã‚¹ã®ã‚½ãƒã‚’オン / オフ" #: editor/editor_audio_buses.cpp msgid "Toggle Audio Bus Mute" -msgstr "オーディオãƒã‚¹ã®ãƒŸãƒ¥ãƒ¼ãƒˆã‚’切り替ãˆ" +msgstr "オーディオãƒã‚¹ã®ãƒŸãƒ¥ãƒ¼ãƒˆã‚’オン / オフ" #: editor/editor_audio_buses.cpp msgid "Toggle Audio Bus Bypass Effects" -msgstr "オーディオãƒã‚¹ã®ãƒã‚¤ãƒ‘スエフェクトを切り替ãˆ" +msgstr "オーディオãƒã‚¹ã®ãƒã‚¤ãƒ‘スエフェクトをオン / オフ" #: editor/editor_audio_buses.cpp msgid "Select Audio Bus Send" @@ -1287,7 +1287,7 @@ msgstr "オーディオãƒã‚¹ã®å‡ºåŠ›å…ˆã‚’é¸æŠž" #: editor/editor_audio_buses.cpp msgid "Add Audio Bus Effect" -msgstr "オーディオãƒã‚¹ã‚¨ãƒ•ã‚§ã‚¯ãƒˆã‚’è¿½åŠ " +msgstr "オーディオãƒã‚¹ ã‚¨ãƒ•ã‚§ã‚¯ãƒˆã‚’è¿½åŠ " #: editor/editor_audio_buses.cpp msgid "Move Bus Effect" @@ -1299,7 +1299,7 @@ msgstr "ãƒã‚¹ã‚¨ãƒ•ェクトを削除" #: editor/editor_audio_buses.cpp msgid "Drag & drop to rearrange." -msgstr "ドラッグ・アンド・ドãƒãƒƒãƒ—ã§ä¸¦ã³æ›¿ãˆã‚‹ã“ã¨ãŒã§ãã¾ã™ã€‚" +msgstr "ドラッグ&ドãƒãƒƒãƒ—ã§ä¸¦ã³æ›¿ãˆã‚‹ã“ã¨ãŒã§ãã¾ã™ã€‚" #: editor/editor_audio_buses.cpp msgid "Solo" @@ -1340,7 +1340,7 @@ msgstr "オーディオãƒã‚¹ã‚’è¿½åŠ " #: editor/editor_audio_buses.cpp msgid "Master bus can't be deleted!" -msgstr "マスター ãƒã‚¹ã¯å‰Šé™¤ã§ãã¾ã›ã‚“!" +msgstr "マスターãƒã‚¹ã¯å‰Šé™¤ã§ãã¾ã›ã‚“ï¼" #: editor/editor_audio_buses.cpp msgid "Delete Audio Bus" @@ -1372,7 +1372,7 @@ msgstr "オーディオãƒã‚¹ã®ãƒ¬ã‚¤ã‚¢ã‚¦ãƒˆã‚’é–‹ã" #: editor/editor_audio_buses.cpp msgid "There is no '%s' file." -msgstr "'ï¼…s' ファイルãŒã‚りã¾ã›ã‚“。" +msgstr "'%s' ファイルãŒã‚りã¾ã›ã‚“。" #: editor/editor_audio_buses.cpp editor/plugins/canvas_item_editor_plugin.cpp msgid "Layout" @@ -1458,7 +1458,7 @@ msgstr "自動èªè¾¼ã¿ã®åå‰å¤‰æ›´" #: editor/editor_autoload_settings.cpp msgid "Toggle AutoLoad Globals" -msgstr "ã‚°ãƒãƒ¼ãƒãƒ«ã®è‡ªå‹•èªè¾¼ã¿ã‚’切り替ãˆ" +msgstr "ã‚°ãƒãƒ¼ãƒãƒ«ã®è‡ªå‹•èªè¾¼ã¿ã‚’オン / オフ" #: editor/editor_autoload_settings.cpp msgid "Move Autoload" @@ -1468,7 +1468,7 @@ msgstr "自動èªè¾¼ã¿ã‚’移動" msgid "Remove Autoload" msgstr "自動èªè¾¼ã¿ã‚’除去" -#: editor/editor_autoload_settings.cpp +#: editor/editor_autoload_settings.cpp editor/editor_plugin_settings.cpp msgid "Enable" msgstr "有効" @@ -1549,7 +1549,7 @@ msgstr "ãƒ‡ã‚£ãƒ¬ã‚¯ãƒˆãƒªã‚’é¸æŠž" #: editor/filesystem_dock.cpp editor/project_manager.cpp #: scene/gui/file_dialog.cpp msgid "Create Folder" -msgstr "フォルダーを作æˆ" +msgstr "フォルダを作æˆ" #: editor/editor_dir_dialog.cpp editor/editor_file_dialog.cpp #: editor/editor_plugin_settings.cpp editor/filesystem_dock.cpp @@ -1777,7 +1777,7 @@ msgstr "エディタ機能ã®ãƒ—ãƒãƒ•ァイルã®ç®¡ç†" #: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp msgid "Select Current Folder" -msgstr "ç¾åœ¨ã®ãƒ•ã‚©ãƒ«ãƒ€ãƒ¼ã‚’é¸æŠž" +msgstr "ç¾åœ¨ã®ãƒ•ã‚©ãƒ«ãƒ€ã‚’é¸æŠž" #: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp msgid "File Exists, Overwrite?" @@ -1785,7 +1785,7 @@ msgstr "ãƒ•ã‚¡ã‚¤ãƒ«ãŒæ—¢ã«å˜åœ¨ã—ã¾ã™ã€‚上書ãã—ã¾ã™ã‹ï¼Ÿ" #: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp msgid "Select This Folder" -msgstr "ã“ã®ãƒ•ã‚©ãƒ«ãƒ€ãƒ¼ã‚’é¸æŠž" +msgstr "ã“ã®ãƒ•ã‚©ãƒ«ãƒ€ã‚’é¸æŠž" #: editor/editor_file_dialog.cpp editor/filesystem_dock.cpp msgid "Copy Path" @@ -1858,11 +1858,11 @@ msgstr "上ã¸" #: editor/editor_file_dialog.cpp msgid "Toggle Hidden Files" -msgstr "éš ã—ファイルã®åˆ‡ã‚Šæ›¿ãˆ" +msgstr "éš ã—ファイルをオン / オフ" #: editor/editor_file_dialog.cpp msgid "Toggle Favorite" -msgstr "ãŠæ°—ã«å…¥ã‚Šã®åˆ‡ã‚Šæ›¿ãˆ" +msgstr "ãŠæ°—ã«å…¥ã‚Šã®ã‚ªãƒ³ / オフ" #: editor/editor_file_dialog.cpp msgid "Toggle Mode" @@ -1902,7 +1902,7 @@ msgstr "ç¾åœ¨ã®ãƒ•ã‚©ãƒ«ãƒ€ã‚’ãŠæ°—ã«å…¥ã‚Šã«ã™ã‚‹/ãŠæ°—ã«å…¥ã‚Šã‹ã‚‰å¤ #: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp msgid "Toggle the visibility of hidden files." -msgstr "éš ã—ファイルã®è¡¨ç¤º/éžè¡¨ç¤ºã‚’切り替ãˆã¾ã™ã€‚" +msgstr "éš ã—ファイルã®è¡¨ç¤º / éžè¡¨ç¤ºã‚’切り替ãˆã¾ã™ã€‚" #: editor/editor_file_dialog.cpp editor/filesystem_dock.cpp msgid "View items as a grid of thumbnails." @@ -2393,7 +2393,7 @@ msgstr "é–‰ã˜ã‚‹å‰ã«ã€'%s' ã¸ã®å¤‰æ›´ã‚’ä¿å˜ã—ã¾ã™ã‹ï¼Ÿ" #: editor/editor_node.cpp msgid "Saved %s modified resource(s)." -msgstr "ï¼…s個ã®å¤‰æ›´ã•れãŸãƒªã‚½ãƒ¼ã‚¹ã‚’ä¿å˜ã—ã¾ã—ãŸã€‚" +msgstr "%s個ã®å¤‰æ›´ã•れãŸãƒªã‚½ãƒ¼ã‚¹ã‚’ä¿å˜ã—ã¾ã—ãŸã€‚" #: editor/editor_node.cpp msgid "A root node is required to save the scene." @@ -2449,7 +2449,7 @@ msgstr "å…ƒã«æˆ»ã™" #: editor/editor_node.cpp msgid "This action cannot be undone. Revert anyway?" -msgstr "ã“ã®æ“作ã¯å…ƒã«æˆ»ã›ã¾ã›ã‚“。ãれã§ã‚‚å…ƒã«æˆ»ã—ã¾ã™ã‹?" +msgstr "ã“ã®æ“作ã¯å–り消ã›ã¾ã›ã‚“。ãれã§ã‚‚å…ƒã«æˆ»ã—ã¾ã™ã‹?" #: editor/editor_node.cpp msgid "Quick Run Scene..." @@ -2461,7 +2461,7 @@ msgstr "終了" #: editor/editor_node.cpp msgid "Exit the editor?" -msgstr "エディターを終了ã—ã¾ã™ã‹ï¼Ÿ" +msgstr "エディタを終了ã—ã¾ã™ã‹ï¼Ÿ" #: editor/editor_node.cpp msgid "Open Project Manager?" @@ -2696,7 +2696,7 @@ msgstr "æ–°è¦ã‚·ãƒ¼ãƒ³" #: editor/editor_node.cpp msgid "New Inherited Scene..." -msgstr "æ–°ã—ã„継承ã—ãŸã‚·ãƒ¼ãƒ³..." +msgstr "æ–°ã—ã„継承シーン..." #: editor/editor_node.cpp msgid "Open Scene..." @@ -2804,7 +2804,7 @@ msgid "" "connect to the IP of this computer in order to be debugged." msgstr "" "エクスãƒãƒ¼ãƒˆã¾ãŸã¯ãƒ‡ãƒ—ãƒã‚¤ã‚’行ã†å ´åˆã€ç”Ÿæˆã•れãŸå®Ÿè¡Œãƒ•ァイルã¯ãƒ‡ãƒãƒƒã‚°ã®ãŸã‚" -"ã«ã€ã“ã®ã‚³ãƒ³ãƒ”ューターã®ï¼©ï¼°ã«æŽ¥ç¶šã‚’試ã¿ã¾ã™ã€‚" +"ã«ã€ã“ã®ã‚³ãƒ³ãƒ”ューターã®IPã«æŽ¥ç¶šã‚’è©¦ã¿ã¾ã™ã€‚" #: editor/editor_node.cpp msgid "Small Deploy with Network FS" @@ -2902,11 +2902,11 @@ msgstr "スクリーンショットã¯Editor Data / Settingsフォルダã«ä¿å #: editor/editor_node.cpp msgid "Toggle Fullscreen" -msgstr "フルスクリーン切り替ãˆ" +msgstr "ãƒ•ãƒ«ã‚¹ã‚¯ãƒªãƒ¼ãƒ³ã®æœ‰åŠ¹åŒ– / 無効化" #: editor/editor_node.cpp msgid "Toggle System Console" -msgstr "システムコンソールã®åˆ‡ã‚Šæ›¿ãˆ" +msgstr "ã‚·ã‚¹ãƒ†ãƒ ã‚³ãƒ³ã‚½ãƒ¼ãƒ«ã®æœ‰åŠ¹åŒ– / 無効化" #: editor/editor_node.cpp msgid "Open Editor Data/Settings Folder" @@ -2951,8 +2951,12 @@ msgid "Q&A" msgstr "Q&A" #: editor/editor_node.cpp -msgid "Issue Tracker" -msgstr "課題管ç†ã‚·ã‚¹ãƒ†ãƒ " +msgid "Report a Bug" +msgstr "ãƒã‚°ã‚’å ±å‘Š" + +#: editor/editor_node.cpp +msgid "Send Docs Feedback" +msgstr "ドã‚ュメントã®ãƒ•ィードãƒãƒƒã‚¯ã‚’é€ã‚‹" #: editor/editor_node.cpp editor/plugins/asset_library_editor_plugin.cpp msgid "Community" @@ -3079,7 +3083,7 @@ msgid "" "operation again." msgstr "" "Androidビルドテンプレートã¯ã™ã§ã«ã‚¤ãƒ³ã‚¹ãƒˆãƒ¼ãƒ«ã•れã¦ãŠã‚Šã€ä¸Šæ›¸ãã•れã¾ã›ã‚“。\n" -"ã“ã®æ“作をå†è©¦è¡Œã™ã‚‹å‰ã«ã€ \"res://android/build\" ディレクトリを手動ã§å‰Šé™¤ã—" +"ã“ã®æ“作をå†è©¦è¡Œã™ã‚‹å‰ã«ã€\"res://android/build\" ディレクトリを手動ã§å‰Šé™¤ã—" "ã¦ãã ã•ã„。" #: editor/editor_node.cpp @@ -3096,7 +3100,7 @@ msgstr "ライブラリã®ã‚¨ã‚¯ã‚¹ãƒãƒ¼ãƒˆ" #: editor/editor_node.cpp msgid "Merge With Existing" -msgstr "æ—¢å˜ã®ï¼ˆãƒ©ã‚¤ãƒ–ラリを)マージ" +msgstr "æ—¢å˜ã®(ライブラリを)マージ" #: editor/editor_node.cpp msgid "Open & Run a Script" @@ -3193,11 +3197,11 @@ msgstr "測定:" #: editor/editor_profiler.cpp msgid "Frame Time (sec)" -msgstr "フレーム時間(秒)" +msgstr "フレーム時間(ç§’)" #: editor/editor_profiler.cpp msgid "Average Time (sec)" -msgstr "平凿™‚間(秒)" +msgstr "平凿™‚é–“(ç§’)" #: editor/editor_profiler.cpp msgid "Frame %" @@ -3348,7 +3352,7 @@ msgstr "æ–°è¦ã®å€¤:" #: editor/editor_properties_array_dict.cpp msgid "Add Key/Value Pair" -msgstr "ã‚ー・値ã®ãƒšã‚¢ã‚’è¿½åŠ " +msgstr "ã‚ー/値ã®ãƒšã‚¢ã‚’è¿½åŠ " #: editor/editor_run_native.cpp msgid "" @@ -3421,7 +3425,7 @@ msgstr "å…¬å¼ã®æ›¸ã出ã—テンプレートã¯é–‹ç™ºç”¨ãƒ“ルドã®å ´åˆã¯ #: editor/export_template_manager.cpp msgid "(Missing)" -msgstr "(見ã¤ã‹ã‚Šã¾ã›ã‚“)" +msgstr "(見ã¤ã‹ã‚Šã¾ã›ã‚“)" #: editor/export_template_manager.cpp msgid "(Current)" @@ -3607,7 +3611,7 @@ msgstr "テンプレートをダウンãƒãƒ¼ãƒ‰" #: editor/export_template_manager.cpp msgid "Select mirror from list: (Shift+Click: Open in Browser)" -msgstr "リストã‹ã‚‰ãƒŸãƒ©ãƒ¼ã‚’é¸æŠž: (Shift+クリック: ブラウザã§é–‹ã)" +msgstr "リストã‹ã‚‰ãƒŸãƒ©ãƒ¼ã‚’é¸æŠž: (Shift+クリック: ブラウザã§é–‹ã)" #: editor/filesystem_dock.cpp msgid "Favorites" @@ -3621,7 +3625,7 @@ msgstr "" #: editor/filesystem_dock.cpp msgid "Cannot move/rename resources root." -msgstr "ルートã®ãƒªã‚½ãƒ¼ã‚¹ã¯ç§»å‹•・リãƒãƒ¼ãƒ ã§ãã¾ã›ã‚“。" +msgstr "ルートã®ãƒªã‚½ãƒ¼ã‚¹ã¯ç§»å‹•/リãƒãƒ¼ãƒ ã§ãã¾ã›ã‚“。" #: editor/filesystem_dock.cpp msgid "Cannot move a folder into itself." @@ -3673,7 +3677,7 @@ msgstr "フォルダを複製:" #: editor/filesystem_dock.cpp msgid "New Inherited Scene" -msgstr "æ–°ã—ã„継承ã—ãŸã‚·ãƒ¼ãƒ³" +msgstr "æ–°ã—ã„継承シーン" #: editor/filesystem_dock.cpp msgid "Set As Main Scene" @@ -3806,7 +3810,7 @@ msgstr "フォルダ:" #: editor/find_in_files.cpp msgid "Filters:" -msgstr "フィルター:" +msgstr "フィルタ:" #: editor/find_in_files.cpp msgid "" @@ -3968,7 +3972,7 @@ msgstr "インãƒãƒ¼ãƒˆæ¸ˆã®ã‚¹ã‚¯ãƒªãƒ—トをèªè¾¼ã‚ã¾ã›ã‚“ã§ã—ãŸï¼š" #: editor/import/resource_importer_scene.cpp msgid "Invalid/broken script for post-import (check console):" -msgstr "無効・壊れãŸã‚¤ãƒ³ãƒãƒ¼ãƒˆæ¸ˆã‚¹ã‚¯ãƒªãƒ—ト(コンソールを確èªã—ã¦ãã ã•ã„):" +msgstr "無効ã¾ãŸã¯å£Šã‚ŒãŸã‚¤ãƒ³ãƒãƒ¼ãƒˆæ¸ˆã‚¹ã‚¯ãƒªãƒ—ト(コンソールを確èªã—ã¦ãã ã•ã„):" #: editor/import/resource_importer_scene.cpp msgid "Error running post-import script:" @@ -4003,8 +4007,8 @@ msgid "Reimport" msgstr "å†ã‚¤ãƒ³ãƒãƒ¼ãƒˆ" #: editor/import_dock.cpp -msgid "Save scenes, re-import and restart" -msgstr "シーンをä¿å˜ã—ã¦ã€å†ã‚¤ãƒ³ãƒãƒ¼ãƒˆã—ã¦å†èµ·å‹•ã—ã¦ãã ã•ã„" +msgid "Save Scenes, Re-Import, and Restart" +msgstr "シーンをä¿å˜ã—ã€å†ã‚¤ãƒ³ãƒãƒ¼ãƒˆã—ã¦ã‹ã‚‰ã€å†èµ·å‹•ã—ã¾ã™" #: editor/import_dock.cpp msgid "Changing the type of an imported file requires editor restart." @@ -4052,7 +4056,7 @@ msgstr "ビルトインを作æˆ" #: editor/inspector_dock.cpp msgid "Make Sub-Resources Unique" -msgstr "ユニークãªã‚µãƒ–リソースを生æˆ" +msgstr "サブリソースをユニーク化ã™ã‚‹" #: editor/inspector_dock.cpp msgid "Open in Help" @@ -4166,7 +4170,7 @@ msgstr "ãƒã‚¤ãƒ³ãƒˆæŒ¿å…¥" #: editor/plugins/abstract_polygon_2d_editor.cpp msgid "Edit Polygon (Remove Point)" -msgstr "ãƒãƒªã‚´ãƒ³ã‚’編集(点を除去)" +msgstr "ãƒãƒªã‚´ãƒ³ã‚’編集(点を除去)" #: editor/plugins/abstract_polygon_2d_editor.cpp msgid "Remove Polygon And Point" @@ -4303,7 +4307,7 @@ msgstr "三角形ãŒå˜åœ¨ã—ãªã„ãŸã‚ã€ãƒ–レンドã§ãã¾ã›ã‚“。" #: editor/plugins/animation_blend_space_2d_editor.cpp msgid "Toggle Auto Triangles" -msgstr "三角形ã®è‡ªå‹•作æˆã«åˆ‡ã‚Šæ›¿ãˆ" +msgstr "三角形ã®è‡ªå‹•作æˆã‚’オン / オフ" #: editor/plugins/animation_blend_space_2d_editor.cpp msgid "Create triangles by connecting points." @@ -4374,11 +4378,11 @@ msgstr "ノードを削除" #: editor/plugins/animation_blend_tree_editor_plugin.cpp msgid "Toggle Filter On/Off" -msgstr "フィルター㮠オン/オフ を切り替ãˆ" +msgstr "フィルタ㮠オン/オフ を切り替ãˆ" #: editor/plugins/animation_blend_tree_editor_plugin.cpp msgid "Change Filter" -msgstr "フィルターを変更" +msgstr "フィルタを変更" #: editor/plugins/animation_blend_tree_editor_plugin.cpp msgid "No animation player set, so unable to retrieve track names." @@ -4431,7 +4435,7 @@ msgstr "フィルタリングを有効化" #: editor/plugins/animation_player_editor_plugin.cpp msgid "Toggle Autoplay" -msgstr "自動å†ç”Ÿã®åˆ‡ã‚Šæ›¿ãˆ" +msgstr "自動å†ç”Ÿã®æœ‰åŠ¹åŒ– / 無効化" #: editor/plugins/animation_player_editor_plugin.cpp msgid "New Animation Name:" @@ -4506,27 +4510,27 @@ msgstr "編集ã™ã‚‹ã‚¢ãƒ‹ãƒ¡ãƒ¼ã‚·ãƒ§ãƒ³ãŒã‚りã¾ã›ã‚“ï¼" #: editor/plugins/animation_player_editor_plugin.cpp msgid "Play selected animation backwards from current pos. (A)" -msgstr "é¸æŠžã—ãŸã‚¢ãƒ‹ãƒ¡ãƒ¼ã‚·ãƒ§ãƒ³ã‚’ç¾åœ¨ã®ä½ç½®ã‹ã‚‰é€†å†ç”Ÿã™ã‚‹ã€‚(A)" +msgstr "é¸æŠžã—ãŸã‚¢ãƒ‹ãƒ¡ãƒ¼ã‚·ãƒ§ãƒ³ã‚’ç¾åœ¨ã®ä½ç½®ã‹ã‚‰é€†å†ç”Ÿã™ã‚‹ã€‚(A)" #: editor/plugins/animation_player_editor_plugin.cpp msgid "Play selected animation backwards from end. (Shift+A)" -msgstr "é¸æŠžã—ãŸã‚¢ãƒ‹ãƒ¡ãƒ¼ã‚·ãƒ§ãƒ³ã‚’最後ã‹ã‚‰é€†å†ç”Ÿã™ã‚‹ã€‚(Shift+A)" +msgstr "é¸æŠžã—ãŸã‚¢ãƒ‹ãƒ¡ãƒ¼ã‚·ãƒ§ãƒ³ã‚’最後ã‹ã‚‰é€†å†ç”Ÿã™ã‚‹ã€‚(Shift+A)" #: editor/plugins/animation_player_editor_plugin.cpp msgid "Stop animation playback. (S)" -msgstr "アニメーションã®å†ç”Ÿã‚’åœæ¢ã™ã‚‹ã€‚(S)" +msgstr "アニメーションã®å†ç”Ÿã‚’åœæ¢ã™ã‚‹ã€‚(S)" #: editor/plugins/animation_player_editor_plugin.cpp msgid "Play selected animation from start. (Shift+D)" -msgstr "é¸æŠžã—ãŸã‚¢ãƒ‹ãƒ¡ãƒ¼ã‚·ãƒ§ãƒ³ã‚’最åˆã‹ã‚‰å†ç”Ÿã™ã‚‹ã€‚(Shift+D)" +msgstr "é¸æŠžã—ãŸã‚¢ãƒ‹ãƒ¡ãƒ¼ã‚·ãƒ§ãƒ³ã‚’最åˆã‹ã‚‰å†ç”Ÿã™ã‚‹ã€‚(Shift+D)" #: editor/plugins/animation_player_editor_plugin.cpp msgid "Play selected animation from current pos. (D)" -msgstr "é¸æŠžã—ãŸã‚¢ãƒ‹ãƒ¡ãƒ¼ã‚·ãƒ§ãƒ³ã‚’ç¾åœ¨ã®ä½ç½®ã‹ã‚‰å†ç”Ÿã™ã‚‹ã€‚(D)" +msgstr "é¸æŠžã—ãŸã‚¢ãƒ‹ãƒ¡ãƒ¼ã‚·ãƒ§ãƒ³ã‚’ç¾åœ¨ã®ä½ç½®ã‹ã‚‰å†ç”Ÿã™ã‚‹ã€‚(D)" #: editor/plugins/animation_player_editor_plugin.cpp msgid "Animation position (in seconds)." -msgstr "アニメーションã®ä½ç½®ï¼ˆç§’)。" +msgstr "アニメーションã®ä½ç½® (ç§’)。" #: editor/plugins/animation_player_editor_plugin.cpp msgid "Scale animation playback globally for the node." @@ -4629,7 +4633,7 @@ msgstr "ブレンド時間:" #: editor/plugins/animation_player_editor_plugin.cpp msgid "Next (Auto Queue):" -msgstr "次(自動ã‚ュー):" +msgstr "次 (自動ã‚ュー):" #: editor/plugins/animation_player_editor_plugin.cpp msgid "Cross-Animation Blend Times" @@ -4678,7 +4682,7 @@ msgstr "サブトランジションã«ã¯ã€é–‹å§‹ãƒŽãƒ¼ãƒ‰ã¨çµ‚了ノード㌠#: editor/plugins/animation_state_machine_editor.cpp msgid "No playback resource set at path: %s." -msgstr "パス( %s )ã«å†ç”Ÿãƒªã‚½ãƒ¼ã‚¹ãŒè¨å®šã•れã¦ã„ã¾ã›ã‚“。" +msgstr "パス: %s ã«å†ç”Ÿãƒªã‚½ãƒ¼ã‚¹ãŒè¨å®šã•れã¦ã„ã¾ã›ã‚“。" #: editor/plugins/animation_state_machine_editor.cpp msgid "Node Removed" @@ -4717,8 +4721,8 @@ msgstr "é¸æŠžã—ãŸãƒŽãƒ¼ãƒ‰ã¾ãŸã¯ãƒˆãƒ©ãƒ³ã‚¸ã‚·ãƒ§ãƒ³ã‚’除去。" #: editor/plugins/animation_state_machine_editor.cpp msgid "Toggle autoplay this animation on start, restart or seek to zero." msgstr "" -"ã“ã®ã‚¢ãƒ‹ãƒ¡ãƒ¼ã‚·ãƒ§ãƒ³ã®è‡ªå‹•å†ç”Ÿã®é–‹å§‹ã€å†èµ·å‹•ã€ã¾ãŸã¯ã‚¼ãƒã¸ã®ã‚·ãƒ¼ã‚¯ã‚’切り替ãˆã¾" -"ã™ã€‚" +"é–‹å§‹ã€å†ã‚¹ã‚¿ãƒ¼ãƒˆã€ã¾ãŸã¯ã‚¼ãƒã¸ã®ã‚·ãƒ¼ã‚¯æ™‚ã«ãŠã‘ã‚‹ã€ã“ã®ã‚¢ãƒ‹ãƒ¡ãƒ¼ã‚·ãƒ§ãƒ³ã®è‡ªå‹•å†" +"生をオン / オフã«ã—ã¾ã™ã€‚" #: editor/plugins/animation_state_machine_editor.cpp msgid "Set the end animation. This is useful for sub-transitions." @@ -4793,7 +4797,7 @@ msgstr "ブレンド 1:" #: editor/plugins/animation_tree_player_editor_plugin.cpp msgid "X-Fade Time (s):" -msgstr "クãƒã‚¹ãƒ•ェード時間(秒):" +msgstr "クãƒã‚¹ãƒ•ェード時間 (ç§’):" #: editor/plugins/animation_tree_player_editor_plugin.cpp msgid "Current:" @@ -5372,7 +5376,7 @@ msgstr "é¸æŠžãƒ¢ãƒ¼ãƒ‰" #: editor/plugins/canvas_item_editor_plugin.cpp msgid "Drag: Rotate" -msgstr "ドラッグ:回転" +msgstr "ドラッグ: 回転" #: editor/plugins/canvas_item_editor_plugin.cpp msgid "Alt+Drag: Move" @@ -5386,7 +5390,7 @@ msgstr "" #: editor/plugins/canvas_item_editor_plugin.cpp msgid "Alt+RMB: Depth list selection" -msgstr "Alt+å³ã‚¯ãƒªãƒƒã‚¯: 奥行ã(被写界深度)リストã®é¸æŠž" +msgstr "Alt+å³ã‚¯ãƒªãƒƒã‚¯: 奥行ã(被写界深度)リストã®é¸æŠž" #: editor/plugins/canvas_item_editor_plugin.cpp #: editor/plugins/spatial_editor_plugin.cpp @@ -5426,7 +5430,7 @@ msgstr "定è¦ãƒ¢ãƒ¼ãƒ‰" #: editor/plugins/canvas_item_editor_plugin.cpp msgid "Toggle smart snapping." -msgstr "スマートスナッピングを切り替ãˆã‚‹ã€‚" +msgstr "スマート スナッピングをオン / オフ。" #: editor/plugins/canvas_item_editor_plugin.cpp msgid "Use Smart Snap" @@ -5434,7 +5438,7 @@ msgstr "スマートスナップを使ã†" #: editor/plugins/canvas_item_editor_plugin.cpp msgid "Toggle grid snapping." -msgstr "グリッドスナッピングを切り替ãˆã‚‹ã€‚" +msgstr "グリッド スナッピングをオン / オフ。" #: editor/plugins/canvas_item_editor_plugin.cpp msgid "Use Grid Snap" @@ -5597,8 +5601,8 @@ msgid "" "Keys are only added to existing tracks, no new tracks will be created.\n" "Keys must be inserted manually for the first time." msgstr "" -"ã‚ーã®è‡ªå‹•挿入ã¯ï¼ˆãƒžã‚¹ã‚¯ã«åŸºã¥ã„ã¦ï¼‰ã‚ªãƒ–ジェクトãŒç§»å‹•ã€å›žè»¢ã€ã¾ãŸã¯æ‹¡å¤§ç¸®å°" -"ã•れãŸéš›ã«è¡Œã‚れã¾ã™ã€‚\n" +"ã‚ーã®è‡ªå‹•挿入ã¯(マスクã«åŸºã¥ã„ã¦)オブジェクトãŒç§»å‹•ã€å›žè»¢ã€ã¾ãŸã¯æ‹¡å¤§ç¸®å°ã•" +"れãŸéš›ã«è¡Œã‚れã¾ã™ã€‚\n" "ã‚ãƒ¼ã¯æ—¢å˜ã®ãƒˆãƒ©ãƒƒã‚¯ã«ã®ã¿è¿½åŠ ã•ã‚Œã€æ–°ã—ã„トラックã¯ä½œæˆã•れã¾ã›ã‚“。\n" "åˆå›žã®ã‚ãƒ¼æŒ¿å…¥ã¯æ‰‹å‹•ã§è¡Œã†å¿…è¦ãŒã‚りã¾ã™ã€‚" @@ -5678,7 +5682,7 @@ msgstr "ãƒãƒªã‚´ãƒ³ã‚’編集" #: editor/plugins/collision_polygon_editor_plugin.cpp msgid "Edit Poly (Remove Point)" -msgstr "ãƒãƒªã‚´ãƒ³ã‚’編集(点を除去)" +msgstr "ãƒãƒªã‚´ãƒ³ã‚’編集(点を除去)" #: editor/plugins/collision_shape_2d_editor_plugin.cpp msgid "Set Handle" @@ -5687,7 +5691,7 @@ msgstr "ãƒãƒ³ãƒ‰ãƒ«ã‚’è¨å®šã™ã‚‹" #: editor/plugins/cpu_particles_2d_editor_plugin.cpp #: editor/plugins/particles_2d_editor_plugin.cpp msgid "Load Emission Mask" -msgstr "発光(Emission)マスクをèªã¿è¾¼ã‚€" +msgstr "放射マスクをèªã¿è¾¼ã‚€" #: editor/plugins/cpu_particles_2d_editor_plugin.cpp #: editor/plugins/cpu_particles_editor_plugin.cpp @@ -6064,14 +6068,13 @@ msgstr "シーンã‹ã‚‰ã‚¢ãƒƒãƒ—デート" #: editor/plugins/multimesh_editor_plugin.cpp msgid "No mesh source specified (and no MultiMesh set in node)." msgstr "" -"メッシュã®ã‚½ãƒ¼ã‚¹ãŒæŒ‡å®šã•れã¦ã„ã¾ã›ã‚“(ノードã«MultiMeshãŒè¨å®šã•れã¦ã„ã¾ã›" -"ん)。" +"メッシュã®ã‚½ãƒ¼ã‚¹ãŒæŒ‡å®šã•れã¦ã„ã¾ã›ã‚“(ノードã«MultiMeshãŒè¨å®šã•れã¦ã„ã¾ã›ã‚“)。" #: editor/plugins/multimesh_editor_plugin.cpp msgid "No mesh source specified (and MultiMesh contains no Mesh)." msgstr "" -"メッシュã®ã‚½ãƒ¼ã‚¹ãŒæŒ‡å®šã•れã¦ã„ã¾ã›ã‚“(ãã—ã¦MultiMeshã«ã¯ãƒ¡ãƒƒã‚·ãƒ¥ãŒå«ã¾ã‚Œã¦ã„" -"ã¾ã›ã‚“)。" +"メッシュã®ã‚½ãƒ¼ã‚¹ãŒæŒ‡å®šã•れã¦ã„ã¾ã›ã‚“(ãã—ã¦MultiMeshã«ã¯ãƒ¡ãƒƒã‚·ãƒ¥ãŒå«ã¾ã‚Œã¦ã„" +"ã¾ã›ã‚“)。" #: editor/plugins/multimesh_editor_plugin.cpp msgid "Mesh source is invalid (invalid path)." @@ -6267,7 +6270,7 @@ msgstr "曲線を分割ã™ã‚‹" #: editor/plugins/path_2d_editor_plugin.cpp msgid "Move Point in Curve" -msgstr "曲線内ã®ãƒã‚¤ãƒ³ãƒˆã‚’移動" +msgstr "曲線内ã®ç‚¹ã‚’移動" #: editor/plugins/path_2d_editor_plugin.cpp msgid "Move In-Control in Curve" @@ -6854,15 +6857,6 @@ msgid "Open Godot online documentation." msgstr "Godotã®ã‚ªãƒ³ãƒ©ã‚¤ãƒ³ãƒ‰ã‚ュメントを開ã。" #: editor/plugins/script_editor_plugin.cpp -msgid "Request Docs" -msgstr "ドã‚ãƒ¥ãƒ¡ãƒ³ãƒˆã‚’è¦æ±‚" - -#: editor/plugins/script_editor_plugin.cpp -msgid "Help improve the Godot documentation by giving feedback." -msgstr "" -"フィードãƒãƒƒã‚¯ã‚’æä¾›ã—ã¦ã€Godotã®ãƒ‰ã‚ãƒ¥ãƒ¡ãƒ³ãƒˆã®æ”¹å–„ã«å½¹ç«‹ã¦ã¦ãã ã•ã„。" - -#: editor/plugins/script_editor_plugin.cpp msgid "Search the reference documentation." msgstr "リファレンス文書を探ã™." @@ -6924,8 +6918,8 @@ msgstr "ターゲット" msgid "" "Missing connected method '%s' for signal '%s' from node '%s' to node '%s'." msgstr "" -"ノード'ï¼…s'ã‹ã‚‰ãƒŽãƒ¼ãƒ‰'ï¼…s'ã¸é€ã‚‹ã‚·ã‚°ãƒŠãƒ«'ï¼…s'ã®ãƒ¡ã‚½ãƒƒãƒ‰'ï¼…s'ã¸ã®æŽ¥ç¶šãŒè¦‹ã¤ã‹" -"りã¾ã›ã‚“。" +"メソッド'%s' (シグナル'ï¼…s'用) ãŒè¦‹ã¤ã‹ã‚Šã¾ã›ã‚“ã€ã“れã¯ãƒŽãƒ¼ãƒ‰'%s'ã‹ã‚‰ãƒŽãƒ¼" +"ド'%s'ã¸ã®ã‚·ã‚°ãƒŠãƒ«ç”¨ã§ã™ã€‚" #: editor/plugins/script_text_editor.cpp msgid "Line" @@ -6947,8 +6941,8 @@ msgstr "ファイルシステムã®ãƒªã‚½ãƒ¼ã‚¹ã®ã¿ãƒ‰ãƒãƒƒãƒ—ã§ãã¾ã™." #: modules/visual_script/visual_script_editor.cpp msgid "Can't drop nodes because script '%s' is not used in this scene." msgstr "" -"スクリプト '%s' ã¯ã“ã®ã‚·ãƒ¼ãƒ³ã§ä½¿ã‚れã¦ã„ãªã„ãŸã‚ã€ãƒŽãƒ¼ãƒ‰ã‚’(ドラッグ&)ドãƒãƒƒ" -"プã™ã‚‹ã“ã¨ãŒã§ãã¾ã›ã‚“。" +"スクリプト '%s' ã¯ã“ã®ã‚·ãƒ¼ãƒ³ã§ä½¿ã‚れã¦ã„ãªã„ãŸã‚ã€ãƒŽãƒ¼ãƒ‰ã‚’(ドラッグ&)ドãƒãƒƒãƒ—" +"ã™ã‚‹ã“ã¨ãŒã§ãã¾ã›ã‚“。" #: editor/plugins/script_text_editor.cpp msgid "Lookup Symbol" @@ -7068,7 +7062,7 @@ msgstr "コンテã‚ストヘルプ" #: editor/plugins/script_text_editor.cpp msgid "Toggle Bookmark" -msgstr "ブックマークã®åˆ‡ã‚Šæ›¿ãˆ" +msgstr "ブックマークをã¤ã‘ã‚‹ / 外ã™" #: editor/plugins/script_text_editor.cpp msgid "Go to Next Bookmark" @@ -7093,7 +7087,7 @@ msgstr "行ã«ç§»å‹•..." #: editor/plugins/script_text_editor.cpp #: modules/visual_script/visual_script_editor.cpp msgid "Toggle Breakpoint" -msgstr "ブレークãƒã‚¤ãƒ³ãƒˆã‚’切り替ãˆ" +msgstr "ブレークãƒã‚¤ãƒ³ãƒˆã‚’ã¤ã‘ã‚‹ / 外ã™" #: editor/plugins/script_text_editor.cpp msgid "Remove All Breakpoints" @@ -7112,7 +7106,7 @@ msgid "" "This shader has been modified on on disk.\n" "What action should be taken?" msgstr "" -"ã“ã®ã‚·ã‚§ãƒ¼ãƒ€ã¯ãƒ‡ã‚£ã‚¹ã‚¯ä¸Šã§ä¿®æ£ã•れã¦ã„ã¾ã™ã€‚\n" +"ã“ã®ã‚·ã‚§ãƒ¼ãƒ€ãƒ¼ã¯ãƒ‡ã‚£ã‚¹ã‚¯ä¸Šã§ä¿®æ£ã•れã¦ã„ã¾ã™ã€‚\n" "ã©ã†ã—ã¾ã™ã‹?" #: editor/plugins/shader_editor_plugin.cpp @@ -7201,7 +7195,7 @@ msgstr "%s 度回転." #: editor/plugins/spatial_editor_plugin.cpp msgid "Keying is disabled (no key inserted)." -msgstr "ã‚ーã¯ç„¡åŠ¹åŒ–ã•れã¦ã„ã¾ã™ï¼ˆã‚ãƒ¼ã¯æŒ¿å…¥ã•れã¦ã„ã¾ã›ã‚“)." +msgstr "ã‚ーã¯ç„¡åŠ¹åŒ–ã•れã¦ã„ã¾ã™(ã‚ãƒ¼ã¯æŒ¿å…¥ã•れã¦ã„ã¾ã›ã‚“)。" #: editor/plugins/spatial_editor_plugin.cpp msgid "Animation Key Inserted." @@ -7241,11 +7235,11 @@ msgstr "é ‚ç‚¹" #: editor/plugins/spatial_editor_plugin.cpp msgid "Top View." -msgstr "上é¢å›³." +msgstr "上é¢å›³ã€‚" #: editor/plugins/spatial_editor_plugin.cpp msgid "Bottom View." -msgstr "下é¢å›³." +msgstr "下é¢å›³ã€‚" #: editor/plugins/spatial_editor_plugin.cpp msgid "Bottom" @@ -7269,7 +7263,7 @@ msgstr "å³å´é¢" #: editor/plugins/spatial_editor_plugin.cpp msgid "Front View." -msgstr "å‰é¢å›³." +msgstr "å‰é¢å›³ã€‚" #: editor/plugins/spatial_editor_plugin.cpp msgid "Front" @@ -7300,6 +7294,10 @@ msgid "This operation requires a single selected node." msgstr "å˜ä¸€ã®é¸æŠžã•れãŸãƒŽãƒ¼ãƒ‰ãŒãªã„ã¨ã€ã“ã®æ“作ã¯è¡Œãˆã¾ã›ã‚“。" #: editor/plugins/spatial_editor_plugin.cpp +msgid "Auto Orthogonal Enabled" +msgstr "自動平行投影 有効" + +#: editor/plugins/spatial_editor_plugin.cpp msgid "Lock View Rotation" msgstr "ビューã®å›žè»¢ã‚’固定" @@ -7388,18 +7386,18 @@ msgid "Freelook Slow Modifier" msgstr "ãƒ•ãƒªãƒ¼ãƒ«ãƒƒã‚¯ã®æ¸›é€Ÿã‚’調整" #: editor/plugins/spatial_editor_plugin.cpp +msgid "View Rotation Locked" +msgstr "ビューã®å›žè»¢ã‚’固定ä¸" + +#: editor/plugins/spatial_editor_plugin.cpp msgid "" "Note: The FPS value displayed is the editor's framerate.\n" "It cannot be used as a reliable indication of in-game performance." msgstr "" -"注æ„:表示ã•れるFPS値ã¯ã€ã‚¨ãƒ‡ã‚£ã‚¿ã®ãƒ•レームレートã§ã™ã€‚\n" +"注æ„: 表示ã•れるFPS値ã¯ã€ã‚¨ãƒ‡ã‚£ã‚¿ã®ãƒ•レームレートã§ã™ã€‚\n" "ゲーム内ã®ãƒ‘フォーマンスを確実ã«ç¤ºã™ã‚‚ã®ã¨ã—ã¦ä½¿ç”¨ã™ã‚‹ã“ã¨ã¯ã§ãã¾ã›ã‚“。" #: editor/plugins/spatial_editor_plugin.cpp -msgid "View Rotation Locked" -msgstr "ビューã®å›žè»¢ã‚’固定ä¸" - -#: editor/plugins/spatial_editor_plugin.cpp msgid "XForm Dialog" msgstr "Xformダイアãƒã‚°" @@ -7471,7 +7469,7 @@ msgstr "é¸æŠžã«ãƒ•ォーカス" #: editor/plugins/spatial_editor_plugin.cpp msgid "Toggle Freelook" -msgstr "フリールックã®åˆ‡ã‚Šæ›¿ãˆ" +msgstr "フリールックã®ã‚ªãƒ³ / オフ" #: editor/plugins/spatial_editor_plugin.cpp #: editor/plugins/visual_shader_editor_plugin.cpp @@ -7537,7 +7535,7 @@ msgstr "スナップを移動:" #: editor/plugins/spatial_editor_plugin.cpp msgid "Rotate Snap (deg.):" -msgstr "スナップã®å›žè»¢ï¼ˆåº¦ï¼‰:" +msgstr "スナップã®å›žè»¢(度):" #: editor/plugins/spatial_editor_plugin.cpp msgid "Scale Snap (%):" @@ -7569,7 +7567,7 @@ msgstr "移動:" #: editor/plugins/spatial_editor_plugin.cpp msgid "Rotate (deg.):" -msgstr "回転(度):" +msgstr "回転(度):" #: editor/plugins/spatial_editor_plugin.cpp msgid "Scale (ratio):" @@ -7593,7 +7591,7 @@ msgstr "ç„¡åã®ã‚®ã‚ºãƒ¢" #: editor/plugins/sprite_editor_plugin.cpp msgid "Create Mesh2D" -msgstr "Mesh2Dを作æˆã™ã‚‹" +msgstr "Mesh2Dを生æˆ" #: editor/plugins/sprite_editor_plugin.cpp msgid "Mesh2D Preview" @@ -7645,11 +7643,11 @@ msgstr "ジオメトリãŒç„¡åйã§ã™ã€‚ãƒãƒªã‚´ãƒ³ã‚’作æˆã§ãã¾ã›ã‚“。 #: editor/plugins/sprite_editor_plugin.cpp msgid "Convert to Polygon2D" -msgstr "Polygon2Dã«å¤‰æ›" +msgstr "Polygon2Dã«å¤‰æ›ã™ã‚‹" #: editor/plugins/sprite_editor_plugin.cpp msgid "Invalid geometry, can't create collision polygon." -msgstr "ジオメトリãŒç„¡åйã§ã™ã€‚è¡çªãƒãƒªã‚´ãƒ³ã‚’作æˆã§ãã¾ã›ã‚“。" +msgstr "ジオメトリãŒç„¡åйã§ã™ã€‚コリジョンãƒãƒªã‚´ãƒ³ã‚’作æˆã§ãã¾ã›ã‚“。" #: editor/plugins/sprite_editor_plugin.cpp msgid "Create CollisionPolygon2D Sibling" @@ -7725,7 +7723,7 @@ msgstr "アニメーションã®FPSを変更" #: editor/plugins/sprite_frames_editor_plugin.cpp msgid "(empty)" -msgstr "(空)" +msgstr "(空)" #: editor/plugins/sprite_frames_editor_plugin.cpp msgid "Move Frame" @@ -7866,7 +7864,7 @@ msgstr "テーマを編集" #: editor/plugins/theme_editor_plugin.cpp msgid "Theme editing menu." -msgstr "テーマ編集メニュー." +msgstr "テーマ編集メニュー。" #: editor/plugins/theme_editor_plugin.cpp msgid "Add Class Items" @@ -7890,7 +7888,7 @@ msgstr "ç¾åœ¨ã®ã‚¨ãƒ‡ã‚£ã‚¿ãƒ†ãƒ¼ãƒžã‹ã‚‰ä½œæˆ" #: editor/plugins/theme_editor_plugin.cpp msgid "Toggle Button" -msgstr "ボタンã®åˆ‡ã‚Šæ›¿ãˆ" +msgstr "切り替ãˆãƒœã‚¿ãƒ³" #: editor/plugins/theme_editor_plugin.cpp msgid "Disabled Button" @@ -7970,7 +7968,7 @@ msgstr "サブツリー" #: editor/plugins/theme_editor_plugin.cpp msgid "Has,Many,Options" -msgstr "ã‚りã¾ã™ã‚ˆ,ãŸãã•ã‚“,オプション" +msgstr "Has,Many,Options" #: editor/plugins/theme_editor_plugin.cpp msgid "Data Type:" @@ -8036,7 +8034,7 @@ msgstr "タイルを検索ã™ã‚‹" #: editor/plugins/tile_map_editor_plugin.cpp msgid "Transpose" -msgstr "行列(縦横)入れ替ãˆ" +msgstr "行列(縦横)入れ替ãˆ" #: editor/plugins/tile_map_editor_plugin.cpp msgid "Disable Autotile" @@ -9282,9 +9280,9 @@ msgid "" "output ports. This is a direct injection of code into the vertex/fragment/" "light function, do not use it to write the function declarations inside." msgstr "" -"カスタムã®Godotシェーダ言語å¼ã€‚カスタムã®é‡ã®å…¥å‡ºåŠ›ãƒãƒ¼ãƒˆã‚’æŒã¡ã¾ã™ã€‚ ã“れã¯" -"vertex / fragment / light関数ã¸ã®ã‚³ãƒ¼ãƒ‰ã®ç›´æŽ¥æ³¨å…¥ã§ã™ã€‚内部ã§é–¢æ•°å®£è¨€ã‚’書ããŸ" -"ã‚ã«ãれを使用ã—ãªã„ã§ãã ã•ã„。" +"カスタムã®Godotシェーダー言語å¼ã€‚カスタムã®é‡ã®å…¥å‡ºåŠ›ãƒãƒ¼ãƒˆã‚’æŒã¡ã¾ã™ã€‚ ã“れ" +"ã¯vertex / fragment / light関数ã¸ã®ã‚³ãƒ¼ãƒ‰ã®ç›´æŽ¥æ³¨å…¥ã§ã™ã€‚内部ã§é–¢æ•°å®£è¨€ã‚’書ã" +"ãŸã‚ã«ãれを使用ã—ãªã„ã§ãã ã•ã„。" #: editor/plugins/visual_shader_editor_plugin.cpp msgid "" @@ -9458,11 +9456,11 @@ msgstr "プãƒã‚¸ã‚§ã‚¯ãƒˆå†…ã®ãƒªã‚½ãƒ¼ã‚¹ã‚’ã™ã¹ã¦ã‚¨ã‚¯ã‚¹ãƒãƒ¼ãƒˆ" #: editor/project_export.cpp msgid "Export selected scenes (and dependencies)" -msgstr "é¸æŠžã—ãŸã‚·ãƒ¼ãƒ³ï¼ˆã¨ä¾å˜é–¢ä¿‚ã«ã‚ã‚‹ã‚‚ã®ï¼‰ã‚’エクスãƒãƒ¼ãƒˆ" +msgstr "é¸æŠžã—ãŸã‚·ãƒ¼ãƒ³(ã¨ä¾å˜é–¢ä¿‚ã«ã‚ã‚‹ã‚‚ã®)をエクスãƒãƒ¼ãƒˆ" #: editor/project_export.cpp msgid "Export selected resources (and dependencies)" -msgstr "é¸æŠžã—ãŸãƒªã‚½ãƒ¼ã‚¹ï¼ˆã¨ä¾å˜é–¢ä¿‚ã«ã‚ã‚‹ã‚‚ã®ï¼‰ã‚’エクスãƒãƒ¼ãƒˆ" +msgstr "é¸æŠžã—ãŸãƒªã‚½ãƒ¼ã‚¹(ã¨ä¾å˜é–¢ä¿‚ã«ã‚ã‚‹ã‚‚ã®)をエクスãƒãƒ¼ãƒˆ" #: editor/project_export.cpp msgid "Export Mode:" @@ -9594,7 +9592,7 @@ msgstr "" #: editor/project_manager.cpp msgid "Please choose an empty folder." -msgstr "空ã®ãƒ•ã‚©ãƒ«ãƒ€ãƒ¼ã‚’é¸æŠžã—ã¦ãã ã•ã„。" +msgstr "空ã®ãƒ•ã‚©ãƒ«ãƒ€ã‚’é¸æŠžã—ã¦ãã ã•ã„。" #: editor/project_manager.cpp msgid "Please choose a \"project.godot\" or \".zip\" file." @@ -9622,7 +9620,7 @@ msgstr "フォルダを作æˆã§ãã¾ã›ã‚“ã§ã—ãŸã€‚" #: editor/project_manager.cpp msgid "There is already a folder in this path with the specified name." -msgstr "ã“ã®ãƒ‘スã«ã¯ã€æŒ‡å®šã•れãŸåå‰ã®ãƒ•ã‚©ãƒ«ãƒ€ãƒ¼ãŒæ—¢ã«å˜åœ¨ã—ã¾ã™ã€‚" +msgstr "ã“ã®ãƒ‘スã«ã¯ã€æŒ‡å®šã•れãŸåå‰ã®ãƒ•ã‚©ãƒ«ãƒ€ãŒæ—¢ã«å˜åœ¨ã—ã¾ã™ã€‚" #: editor/project_manager.cpp msgid "It would be a good idea to name your project." @@ -9630,7 +9628,7 @@ msgstr "プãƒã‚¸ã‚§ã‚¯ãƒˆã«åå‰ã‚’付ã‘ã¦ãã ã•ã„." #: editor/project_manager.cpp msgid "Invalid project path (changed anything?)." -msgstr "プãƒã‚¸ã‚§ã‚¯ãƒˆãƒ‘スãŒç„¡åйã§ã™(何ã‹ã‚’変更ã—ã¾ã—ãŸã‹?)。" +msgstr "無効ãªãƒ—ãƒã‚¸ã‚§ã‚¯ãƒˆãƒ‘スã§ã™ (ãªã«ã‹å¤‰æ›´ãŒã‚りã¾ã—ãŸã‹ï¼Ÿ)。" #: editor/project_manager.cpp msgid "" @@ -9761,13 +9759,13 @@ msgid "" "Warning: You won't be able to open the project with previous versions of the " "engine anymore." msgstr "" -"次ã®ãƒ—ãƒã‚¸ã‚§ã‚¯ãƒˆè¨å®šãƒ•ァイルã«ã¯ã€ä½œæˆã«ä½¿ç”¨ã—ãŸGodotã®ãƒãƒ¼ã‚¸ãƒ§ãƒ³ã¯æŒ‡å®šã•れã¦" -"ã„ã¾ã›ã‚“。\n" +"次ã®ãƒ—ãƒã‚¸ã‚§ã‚¯ãƒˆè¨å®šãƒ•ァイルã«ã¯ã€ä½œæˆã«ä½¿ç”¨ã•れãŸGodotã®ãƒãƒ¼ã‚¸ãƒ§ãƒ³ãŒæŒ‡å®šã•れ" +"ã¦ã„ã¾ã›ã‚“。\n" "\n" "%s\n" "\n" "ファイルを開ãã¨ã€Godotã®ç¾åœ¨ã®è¨å®šãƒ•ァイル形å¼ã«å¤‰æ›ã•れã¾ã™ã€‚\n" -"è¦å‘Š:以å‰ã®ãƒãƒ¼ã‚¸ãƒ§ãƒ³ã®ã‚¨ãƒ³ã‚¸ãƒ³ã§ã¯ãƒ—ãƒã‚¸ã‚§ã‚¯ãƒˆã‚’é–‹ã‘ã¾ã›ã‚“。" +"è¦å‘Š: 以å‰ã®ãƒãƒ¼ã‚¸ãƒ§ãƒ³ã®ã‚¨ãƒ³ã‚¸ãƒ³ã§ã¯ãƒ—ãƒã‚¸ã‚§ã‚¯ãƒˆã‚’é–‹ã‘ãªããªã‚Šã¾ã™ã€‚" #: editor/project_manager.cpp msgid "" @@ -9877,7 +9875,7 @@ msgstr "スã‚ャン" #: editor/project_manager.cpp msgid "Select a Folder to Scan" -msgstr "スã‚ャンã™ã‚‹ãƒ•ã‚©ãƒ«ãƒ€ãƒ¼ã‚’é¸æŠž" +msgstr "スã‚ャンã™ã‚‹ãƒ•ã‚©ãƒ«ãƒ€ã‚’é¸æŠž" #: editor/project_manager.cpp msgid "New Project" @@ -9907,6 +9905,13 @@ msgstr "" "プãƒã‚¸ã‚§ã‚¯ãƒˆãŒä½•も登録ã•れã¦ã„ã¾ã›ã‚“。\n" "アセットライブラリã§å…¬å¼ã®ã‚µãƒ³ãƒ—ルプãƒã‚¸ã‚§ã‚¯ãƒˆã‚’ãƒã‚§ãƒƒã‚¯ã—ã¾ã™ã‹ï¼Ÿ" +#: editor/project_manager.cpp +msgid "" +"The search box filters projects by name and last path component.\n" +"To filter projects by name and full path, the query must contain at least " +"one `/` character." +msgstr "" + #: editor/project_settings_editor.cpp msgid "Key " msgstr "ã‚ー " @@ -9928,8 +9933,8 @@ msgid "" "Invalid action name. it cannot be empty nor contain '/', ':', '=', '\\' or " "'\"'" msgstr "" -"アクションåãŒç„¡åйã§ã™ã€‚空ã«ã—ãŸã‚Šã€ã€Œ/ ã€ã€ã€Œ: ã€ã€ã€Œ= ã€ã€ã€Œ\\ ã€ã‚’å«ã‚ã‚‹ã“" -"ã¨ã¯ã§ãã¾ã›ã‚“" +"アクションåãŒç„¡åйã§ã™ã€‚空ã«ã—ãŸã‚Šã€'/'ã€':'ã€'='ã€'\\'ç‰ã‚’å«ã‚ã‚‹ã“ã¨ã¯ã§ãã¾" +"ã›ã‚“" #: editor/project_settings_editor.cpp msgid "An action with the name '%s' already exists." @@ -10017,7 +10022,7 @@ msgstr "入力アクションを消去" #: editor/project_settings_editor.cpp msgid "Erase Input Action Event" -msgstr "入力アクションイベントを消去" +msgstr "入力アクション イベントを消去" #: editor/project_settings_editor.cpp msgid "Add Event" @@ -10025,7 +10030,7 @@ msgstr "ã‚¤ãƒ™ãƒ³ãƒˆã‚’è¿½åŠ " #: editor/project_settings_editor.cpp msgid "Button" -msgstr "\\ Button" +msgstr "Button" #: editor/project_settings_editor.cpp msgid "Left Button." @@ -10041,11 +10046,11 @@ 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" @@ -10072,8 +10077,8 @@ msgid "" "Invalid action name. It cannot be empty nor contain '/', ':', '=', '\\' or " "'\"'." msgstr "" -"無効ãªã‚¢ã‚¯ã‚·ãƒ§ãƒ³åã§ã™ã€‚空もã—ãã¯'/', ':', '=', '\\' ã‚„ '\"'ã‚’å«ã‚ã‚‹ã“ã¨ã¯ã§" -"ãã¾ã›ã‚“。" +"無効ãªã‚¢ã‚¯ã‚·ãƒ§ãƒ³åã§ã™ã€‚空もã—ãã¯'/'ã€':'ã€'='ã€'\\' ã€'\"'ç‰ã‚’å«ã‚ã‚‹ã“ã¨ã¯" +"ã§ãã¾ã›ã‚“。" #: editor/project_settings_editor.cpp msgid "Add Input Action" @@ -10081,11 +10086,11 @@ 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 msgid "Moved Input Action Event" @@ -10201,7 +10206,7 @@ msgstr "ãƒã‚±ãƒ¼ãƒ«" #: editor/project_settings_editor.cpp msgid "Locales Filter" -msgstr "ãƒã‚±ãƒ¼ãƒ«ãƒ•ィルター" +msgstr "ãƒã‚±ãƒ¼ãƒ«ãƒ•ィルタ" #: editor/project_settings_editor.cpp msgid "Show All Locales" @@ -10213,7 +10218,7 @@ msgstr "é¸æŠžã—ãŸãƒã‚±ãƒ¼ãƒ«ã®ã¿è¡¨ç¤º" #: editor/project_settings_editor.cpp msgid "Filter mode:" -msgstr "フィルターモード:" +msgstr "フィルタモード:" #: editor/project_settings_editor.cpp msgid "Locales:" @@ -10265,7 +10270,7 @@ msgstr "ファイルèªã¿è¾¼ã¿ã‚¨ãƒ©ãƒ¼: リソースã§ã¯ã‚りã¾ã›ã‚“!" #: editor/property_editor.cpp msgid "Pick a Node" -msgstr "ãƒŽãƒ¼ãƒ‰ã‚’é¸æŠžã™ã‚‹" +msgstr "ノードをé¸ã¶" #: editor/property_editor.cpp msgid "Bit %d, val %d." @@ -10605,8 +10610,8 @@ msgid "" "Couldn't save new scene. Likely dependencies (instances) couldn't be " "satisfied." msgstr "" -"æ–°ã—ã„シーンをä¿å˜ã§ãã¾ã›ã‚“ã§ã—ãŸã€‚ ãŠãらãä¾å˜é–¢ä¿‚(インスタンス)を満ãŸã™ã“" -"ã¨ãŒã§ãã¾ã›ã‚“ã§ã—ãŸã€‚" +"æ–°ã—ã„シーンをä¿å˜ã§ãã¾ã›ã‚“ã§ã—ãŸã€‚ ãŠãらãä¾å˜é–¢ä¿‚(インスタンス)を満ãŸã›ã¦" +"ã„ã¾ã›ã‚“。" #: editor/scene_tree_dock.cpp msgid "Error saving scene." @@ -10706,11 +10711,11 @@ msgstr "継承をクリアã—ã¾ã™ã‹? (å…ƒã«æˆ»ã›ã¾ã›ã‚“!)" #: editor/scene_tree_editor.cpp msgid "Toggle Visible" -msgstr "表示ã®åˆ‡ã‚Šæ›¿ãˆ" +msgstr "表示 / éžè¡¨ç¤ºã®åˆ‡ã‚Šæ›¿ãˆ" #: editor/scene_tree_editor.cpp msgid "Unlock Node" -msgstr "ノードã®ãƒãƒƒã‚¯è§£é™¤" +msgstr "ノードをãƒãƒƒã‚¯è§£é™¤" #: editor/scene_tree_editor.cpp msgid "Button Group" @@ -10790,7 +10795,7 @@ msgstr "ノードã®åå‰ã‚’変更" #: editor/scene_tree_editor.cpp msgid "Scene Tree (Nodes):" -msgstr "シーンツリー(ノード):" +msgstr "シーンツリー(ノード):" #: editor/scene_tree_editor.cpp msgid "Node Configuration Warning!" @@ -10838,7 +10843,7 @@ msgstr "エラー - ファイルシステムã«ã‚¹ã‚¯ãƒªãƒ—トを作æˆã§ãã¾ #: editor/script_create_dialog.cpp msgid "Error loading script from %s" -msgstr "%s ã‹ã‚‰ã®ã‚¹ã‚¯ãƒªãƒ—トã®èªã¿è¾¼ã¿ä¸ã«ã‚¨ãƒ©ãƒ¼ãŒç™ºç”Ÿã—ã¾ã—ãŸ" +msgstr "%s ã‹ã‚‰ã®ã‚¹ã‚¯ãƒªãƒ—トをèªã¿è¾¼ã¿ä¸ã«ã‚¨ãƒ©ãƒ¼" #: editor/script_create_dialog.cpp msgid "Overrides" @@ -10850,7 +10855,7 @@ msgstr "N/A" #: editor/script_create_dialog.cpp msgid "Open Script / Choose Location" -msgstr "スクリプトを開ã/å ´æ‰€ã‚’é¸æŠžã™ã‚‹" +msgstr "スクリプトを開ã / å ´æ‰€ã‚’é¸æŠžã™ã‚‹" #: editor/script_create_dialog.cpp msgid "Open Script" @@ -10866,7 +10871,7 @@ msgstr "無効ãªã‚¯ãƒ©ã‚¹å。" #: editor/script_create_dialog.cpp msgid "Invalid inherited parent name or path." -msgstr "継承ã•れãŸè¦ªã®åå‰ã¾ãŸã¯ãƒ‘スãŒç„¡åйã§ã™ã€‚" +msgstr "継承ã™ã‚‹è¦ªã®åå‰ã€ã¾ãŸã¯ãƒ‘スãŒç„¡åйã§ã™ã€‚" #: editor/script_create_dialog.cpp msgid "Script path/name is valid." @@ -10874,7 +10879,7 @@ msgstr "スクリプトã®ãƒ‘ス/åå‰ã¯æœ‰åйã§ã™ã€‚" #: editor/script_create_dialog.cpp msgid "Allowed: a-z, A-Z, 0-9, _ and ." -msgstr "使用å¯èƒ½: a-z, A-Z, 0-9 㨠." +msgstr "使用å¯èƒ½: a-zã€A-Zã€0-9åŠã³_。" #: editor/script_create_dialog.cpp msgid "Built-in script (into scene file)." @@ -10893,6 +10898,14 @@ msgid "Script file already exists." msgstr "ã‚¹ã‚¯ãƒªãƒ—ãƒˆãƒ•ã‚¡ã‚¤ãƒ«ãŒæ—¢ã«ã‚りã¾ã™ã€‚" #: editor/script_create_dialog.cpp +msgid "" +"Note: Built-in scripts have some limitations and can't be edited using an " +"external editor." +msgstr "" +"注: 組ã¿è¾¼ã¿ã‚¹ã‚¯ãƒªãƒ—トã«ã¯ã„ãã¤ã‹åˆ¶ç´„ãŒã‚りã€ã¾ãŸå¤–部ã®ã‚¨ãƒ‡ã‚£ã‚¿ã§ã¯ç·¨é›†ã§ã" +"ã¾ã›ã‚“。" + +#: editor/script_create_dialog.cpp msgid "Class Name:" msgstr "クラスå:" @@ -11013,6 +11026,11 @@ msgid "Total:" msgstr "åˆè¨ˆ:" #: editor/script_editor_debugger.cpp +#, fuzzy +msgid "Export list to a CSV file" +msgstr "プãƒãƒ•ァイルã®ã‚¨ã‚¯ã‚¹ãƒãƒ¼ãƒˆ" + +#: editor/script_editor_debugger.cpp msgid "Resource Path" msgstr "リソースã®ãƒ‘ス(ResourcePath)" @@ -11054,11 +11072,11 @@ msgstr "数値データをCSVã¨ã—ã¦ã‚¨ã‚¯ã‚¹ãƒãƒ¼ãƒˆ" #: editor/settings_config_dialog.cpp msgid "Erase Shortcut" -msgstr "ã‚·ãƒ§ãƒ¼ãƒˆã‚«ãƒƒãƒˆã®æ¶ˆåŽ»" +msgstr "ショートカットを消去" #: editor/settings_config_dialog.cpp msgid "Restore Shortcut" -msgstr "ショートカットã®å¾©å…ƒ" +msgstr "ショートカットを復元" #: editor/settings_config_dialog.cpp msgid "Change Shortcut" @@ -11202,7 +11220,7 @@ msgstr "ライブラリ: " #: modules/gdnative/register_types.cpp msgid "GDNative" -msgstr "\\ GDNative" +msgstr "GDNative" #: modules/gdscript/gdscript_functions.cpp msgid "Step argument is zero!" @@ -11384,7 +11402,7 @@ msgstr "NavMeshを焼ã込む" #: modules/recast/navigation_mesh_editor_plugin.cpp msgid "Clear the navigation mesh." -msgstr "ãƒŠãƒ“ãƒ¡ãƒƒã‚·ãƒ¥ï¼ˆãƒŠãƒ“ã‚²ãƒ¼ã‚·ãƒ§ãƒ³ãƒ¡ãƒƒã‚·ãƒ¥ï¼‰ã®æ¶ˆåŽ»." +msgstr "ナビメッシュ(ナビゲーションメッシュ)ã®æ¶ˆåŽ»ã€‚" #: modules/recast/navigation_mesh_generator.cpp msgid "Setting up Configuration..." @@ -11428,7 +11446,7 @@ msgstr "ãƒã‚¤ãƒ†ã‚£ãƒ–ナビゲーションメッシュã«å¤‰æ›ã—ã¦ã„ã¾ã™ #: modules/recast/navigation_mesh_generator.cpp msgid "Navigation Mesh Generator Setup:" -msgstr "ナビメッシュ(ナビゲーションメッシュ)生æˆè¨å®š:" +msgstr "ナビメッシュ(ナビゲーションメッシュ)生æˆè¨å®š:" #: modules/recast/navigation_mesh_generator.cpp msgid "Parsing Geometry..." @@ -11586,34 +11604,33 @@ msgstr "VisualScriptノードを複製" #: modules/visual_script/visual_script_editor.cpp msgid "Hold %s to drop a Getter. Hold Shift to drop a generic signature." msgstr "" -"%sを押ã—ãŸã¾ã¾Getterを(ドラッグ&)ドãƒãƒƒãƒ—ã™ã‚‹ã€‚Shiftを押ã—ãŸã¾ã¾æ±Žç”¨ç½²åã‚’" -"(ドラッグ&)ドãƒãƒƒãƒ—ã™ã‚‹ã€‚" +"%sを押ã—ãŸã¾ã¾Getterã‚’(ドラッグ&)ドãƒãƒƒãƒ—ã™ã‚‹ã€‚Shiftを押ã—ãŸã¾ã¾æ±Žç”¨ç½²åã‚’" +"(ドラッグ&)ドãƒãƒƒãƒ—ã™ã‚‹ã€‚" #: modules/visual_script/visual_script_editor.cpp msgid "Hold Ctrl to drop a Getter. Hold Shift to drop a generic signature." msgstr "" -"Ctrlを押ã—ãŸã¾ã¾Getterを(ドラッグ&)ドãƒãƒƒãƒ—ã™ã‚‹ã€‚Shiftを押ã—ãŸã¾ã¾æ±Žç”¨ã‚·ã‚°" -"ãƒãƒãƒ£ã‚’(ドラッグ&)ドãƒãƒƒãƒ—ã™ã‚‹." +"Ctrlを押ã—ãŸã¾ã¾Getterã‚’(ドラッグ&)ドãƒãƒƒãƒ—ã™ã‚‹ã€‚Shiftを押ã—ãŸã¾ã¾æ±Žç”¨ã‚·ã‚°ãƒ" +"ãƒãƒ£ã‚’(ドラッグ&)ドãƒãƒƒãƒ—ã™ã‚‹." #: modules/visual_script/visual_script_editor.cpp msgid "Hold %s to drop a simple reference to the node." msgstr "" -"%sを押ã—ãŸã¾ã¾ãƒŽãƒ¼ãƒ‰ã¸å˜ç´”å‚照(simple reference)を(ドラッグ&)ドãƒãƒƒãƒ—ã™" -"る。" +"%sを押ã—ãŸã¾ã¾ãƒŽãƒ¼ãƒ‰ã¸å˜ç´”å‚ç…§(simple reference)ã‚’(ドラッグ&)ドãƒãƒƒãƒ—ã™ã‚‹ã€‚" #: modules/visual_script/visual_script_editor.cpp msgid "Hold Ctrl to drop a simple reference to the node." msgstr "" -"Ctrlを押ã—ãŸã¾ã¾ãƒŽãƒ¼ãƒ‰ã¸å˜ç´”å‚照(simple reference)を(ドラッグ&)ドãƒãƒƒãƒ—ã™" +"Ctrlを押ã—ãŸã¾ã¾ãƒŽãƒ¼ãƒ‰ã¸å˜ç´”å‚ç…§(simple reference)ã‚’(ドラッグ&)ドãƒãƒƒãƒ—ã™" "る。" #: modules/visual_script/visual_script_editor.cpp msgid "Hold %s to drop a Variable Setter." -msgstr "%sを押ã—ãŸã¾ã¾å¤‰æ•°ã®Setterを(ドラッグ&)ドãƒãƒƒãƒ—ã™ã‚‹ã€‚" +msgstr "%sを押ã—ãŸã¾ã¾å¤‰æ•°ã®Setterã‚’(ドラッグ&)ドãƒãƒƒãƒ—ã™ã‚‹ã€‚" #: modules/visual_script/visual_script_editor.cpp msgid "Hold Ctrl to drop a Variable Setter." -msgstr "Ctrlを押ã—ãŸã¾ã¾å¤‰æ•°ã®Setterを(ドラッグ&)ドãƒãƒƒãƒ—ã™ã‚‹ã€‚" +msgstr "Ctrlを押ã—ãŸã¾ã¾å¤‰æ•°ã®Setterã‚’(ドラッグ&)ドãƒãƒƒãƒ—ã™ã‚‹ã€‚" #: modules/visual_script/visual_script_editor.cpp msgid "Add Preload Node" @@ -11890,7 +11907,7 @@ msgstr "ADB実行å¯èƒ½ãƒ•ァイルãŒã‚¨ãƒ‡ã‚£ã‚¿è¨å®šã§è¨å®šã•れã¦ã„ã¾ #: platform/android/export/export.cpp msgid "OpenJDK jarsigner not configured in the Editor Settings." -msgstr "OpenJDK jarsignerãŒã‚¨ãƒ‡ã‚£ã‚¿ãƒ¼è¨å®šã§è¨å®šã•れã¦ã„ã¾ã›ã‚“。" +msgstr "OpenJDK jarsignerãŒã‚¨ãƒ‡ã‚£ã‚¿è¨å®šã§è¨å®šã•れã¦ã„ã¾ã›ã‚“。" #: platform/android/export/export.cpp msgid "Debug keystore not configured in the Editor Settings nor in the preset." @@ -12127,8 +12144,8 @@ msgid "" "A shape must be provided for CollisionShape2D to function. Please create a " "shape resource for it!" msgstr "" -"関数ã«å¯¾ã—㦠CollisionShape2D ã®å½¢çŠ¶ï¼ˆã‚·ã‚§ã‚¤ãƒ—ï¼‰ã‚’æŒ‡å®šã™ã‚‹å¿…è¦ãŒã‚りã¾ã™ã€‚ã" -"ã®ãŸã‚ã®ã‚·ã‚§ã‚¤ãƒ—リソースを作æˆã—ã¦ãã ã•ã„!" +"関数ã«å¯¾ã—㦠CollisionShape2D ã®å½¢çж(シェイプ)を指定ã™ã‚‹å¿…è¦ãŒã‚りã¾ã™ã€‚ãã®" +"ãŸã‚ã®ã‚·ã‚§ã‚¤ãƒ—リソースを作æˆã—ã¦ãã ã•ã„!" #: scene/2d/cpu_particles_2d.cpp msgid "" @@ -12186,8 +12203,8 @@ msgid "" "CPUParticles\" option for this purpose." msgstr "" "GPUベースã®ãƒ‘ーティクルã¯ã€GLES2ビデオドライãƒã§ã¯ã‚µãƒãƒ¼ãƒˆã•れã¦ã„ã¾ã›ã‚“。\n" -"代ã‚りã«CPUParticles2Dノードを使用ã—ã¦ãã ã•ã„。 ã“ã®ç›®çš„ã®ãŸã‚ã« \"Convert " -"to CPUParticles\" オプションを使用ã™ã‚‹ã“ã¨ãŒã§ãã¾ã™ã€‚" +"代ã‚りã«CPUParticles2Dノードを使用ã—ã¦ãã ã•ã„。ã“ã®ç›®çš„ã®ãŸã‚ã« \"CPUパー" +"ティクルã«å¤‰æ›\" オプションを使用ã§ãã¾ã™ã€‚" #: scene/2d/particles_2d.cpp scene/3d/particles.cpp msgid "" @@ -12216,9 +12233,9 @@ msgid "" "by the physics engine when running.\n" "Change the size in children collision shapes instead." msgstr "" -"RigidBody2D(ã‚ャラクタモードã¾ãŸã¯ãƒªã‚¸ãƒƒãƒ‰ãƒ¢ãƒ¼ãƒ‰)ã«å¯¾ã™ã‚‹ã‚µã‚¤ã‚ºå¤‰æ›´ã¯ã€å®Ÿè¡Œæ™‚" -"ã«ç‰©ç†ã‚¨ãƒ³ã‚¸ãƒ³ã«ã‚ˆã£ã¦ã‚ªãƒ¼ãƒãƒ¼ãƒ©ã‚¤ãƒ‰ã•れã¾ã™ã€‚\n" -"代ã‚りã«ã€åã®è¡çªã‚·ã‚§ã‚¤ãƒ—ã®ã‚µã‚¤ã‚ºã‚’変更ã—ã¦ãã ã•ã„。" +"RigidBody2D (Characterモードã¾ãŸã¯Rigidモード) ã«å¯¾ã™ã‚‹ã‚µã‚¤ã‚ºå¤‰æ›´ã¯ã€å®Ÿè¡Œæ™‚ã«" +"物ç†ã‚¨ãƒ³ã‚¸ãƒ³ã«ã‚ˆã£ã¦ä¸Šæ›¸ãã•れã¾ã™ã€‚\n" +"代ã‚りã«ã€åã®ã‚³ãƒªã‚¸ãƒ§ãƒ³ シェイプã®ã‚µã‚¤ã‚ºã‚’変更ã—ã¦ãã ã•ã„。" #: scene/2d/remote_transform_2d.cpp msgid "Path property must point to a valid Node2D node to work." @@ -12423,8 +12440,8 @@ msgid "" "\" option for this purpose." msgstr "" "GPUベースã®ãƒ‘ーティクルã¯ã€GLES2ビデオドライãƒã§ã¯ã‚µãƒãƒ¼ãƒˆã•れã¦ã„ã¾ã›ã‚“。\n" -"代ã‚りã«CPUParticlesノードを使用ã—ã¦ãã ã•ã„。 ã“ã®ç›®çš„ã®ãŸã‚ã« \"Convert to " -"CPUParticles\"オプションを使用ã™ã‚‹ã“ã¨ãŒã§ãã¾ã™ã€‚" +"代ã‚りã«CPUParticlesノードを使用ã—ã¦ãã ã•ã„。ã“ã®ç›®çš„ã®ãŸã‚ã« \"CPUパーティ" +"クルã«å¤‰æ›\" オプションを使用ã§ãã¾ã™ã€‚" #: scene/3d/particles.cpp msgid "" @@ -12540,7 +12557,7 @@ msgstr "無効ãªã‚¢ãƒ‹ãƒ¡ãƒ¼ã‚·ãƒ§ãƒ³: '%s'。" #: scene/animation/animation_tree.cpp msgid "Nothing connected to input '%s' of node '%s'." -msgstr "ノード 'ï¼…s'ã®å…¥åŠ› 'ï¼…s'ã«æŽ¥ç¶šã•れã¦ã„ã‚‹ã‚‚ã®ãŒã‚りã¾ã›ã‚“。" +msgstr "入力 'ï¼…s'(ノード 'ï¼…s')ã«æŽ¥ç¶šã•れã¦ã„ã‚‹ã‚‚ã®ã¯ã‚りã¾ã›ã‚“。" #: scene/animation/animation_tree.cpp msgid "No root AnimationNode for the graph is set." @@ -12584,7 +12601,7 @@ msgstr "HSV" #: scene/gui/color_picker.cpp msgid "Raw" -msgstr "ãƒãƒ¼" +msgstr "Raw" #: scene/gui/color_picker.cpp msgid "Switch between hexadecimal and code values." @@ -12670,6 +12687,10 @@ msgstr "" "れ以外ã®å ´åˆã¯ã€RenderTarget ã«ã—ã¦ã€ãã®å†…部テクスãƒãƒ£ã‚’表示ã™ã‚‹ãƒŽãƒ¼ãƒ‰ã«å‰²ã‚Š" "当ã¦ã¾ã™ã€‚" +#: scene/main/viewport.cpp +msgid "Viewport size must be greater than 0 to render anything." +msgstr "レンダーã™ã‚‹ã«ã¯ãƒ“ューãƒãƒ¼ãƒˆã®ã‚µã‚¤ã‚ºãŒ 0 より大ãã„å¿…è¦ãŒã‚りã¾ã™ã€‚" + #: scene/resources/visual_shader_nodes.cpp msgid "Invalid source for preview." msgstr "プレビューã®ã‚½ãƒ¼ã‚¹ãŒç„¡åйã§ã™ã€‚" @@ -12698,6 +12719,16 @@ msgstr "Varying変数ã¯é ‚点関数ã«ã®ã¿å‰²ã‚Šå½“ã¦ã‚‹ã“ã¨ãŒã§ãã¾ã msgid "Constants cannot be modified." msgstr "定数ã¯å¤‰æ›´ã§ãã¾ã›ã‚“。" +#~ msgid "Issue Tracker" +#~ msgstr "課題管ç†ã‚·ã‚¹ãƒ†ãƒ " + +#~ msgid "Request Docs" +#~ msgstr "ドã‚ãƒ¥ãƒ¡ãƒ³ãƒˆã‚’è¦æ±‚" + +#~ msgid "Help improve the Godot documentation by giving feedback." +#~ msgstr "" +#~ "フィードãƒãƒƒã‚¯ã‚’æä¾›ã—ã¦ã€Godotã®ãƒ‰ã‚ãƒ¥ãƒ¡ãƒ³ãƒˆã®æ”¹å–„ã«å½¹ç«‹ã¦ã¦ãã ã•ã„。" + #~ msgid "Replaced %d occurrence(s)." #~ msgstr "%d 箇所を置æ›ã—ã¾ã—ãŸã€‚" diff --git a/editor/translations/ka.po b/editor/translations/ka.po index 1aaa12d6a0..07eeeb5377 100644 --- a/editor/translations/ka.po +++ b/editor/translations/ka.po @@ -1495,7 +1495,7 @@ msgstr "" msgid "Remove Autoload" msgstr "" -#: editor/editor_autoload_settings.cpp +#: editor/editor_autoload_settings.cpp editor/editor_plugin_settings.cpp msgid "Enable" msgstr "" @@ -2933,7 +2933,11 @@ msgid "Q&A" msgstr "" #: editor/editor_node.cpp -msgid "Issue Tracker" +msgid "Report a Bug" +msgstr "" + +#: editor/editor_node.cpp +msgid "Send Docs Feedback" msgstr "" #: editor/editor_node.cpp editor/plugins/asset_library_editor_plugin.cpp @@ -3979,7 +3983,7 @@ msgid "Reimport" msgstr "" #: editor/import_dock.cpp -msgid "Save scenes, re-import and restart" +msgid "Save Scenes, Re-Import, and Restart" msgstr "" #: editor/import_dock.cpp @@ -6837,14 +6841,6 @@ msgid "Open Godot online documentation." msgstr "" #: editor/plugins/script_editor_plugin.cpp -msgid "Request Docs" -msgstr "" - -#: editor/plugins/script_editor_plugin.cpp -msgid "Help improve the Godot documentation by giving feedback." -msgstr "" - -#: editor/plugins/script_editor_plugin.cpp msgid "Search the reference documentation." msgstr "" @@ -7288,6 +7284,10 @@ msgid "This operation requires a single selected node." msgstr "" #: editor/plugins/spatial_editor_plugin.cpp +msgid "Auto Orthogonal Enabled" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp msgid "Lock View Rotation" msgstr "" @@ -7377,13 +7377,13 @@ msgid "Freelook Slow Modifier" msgstr "" #: editor/plugins/spatial_editor_plugin.cpp -msgid "" -"Note: The FPS value displayed is the editor's framerate.\n" -"It cannot be used as a reliable indication of in-game performance." +msgid "View Rotation Locked" msgstr "" #: editor/plugins/spatial_editor_plugin.cpp -msgid "View Rotation Locked" +msgid "" +"Note: The FPS value displayed is the editor's framerate.\n" +"It cannot be used as a reliable indication of in-game performance." msgstr "" #: editor/plugins/spatial_editor_plugin.cpp @@ -9824,6 +9824,13 @@ msgid "" "Would you like to explore official example projects in the Asset Library?" msgstr "" +#: editor/project_manager.cpp +msgid "" +"The search box filters projects by name and last path component.\n" +"To filter projects by name and full path, the query must contain at least " +"one `/` character." +msgstr "" + #: editor/project_settings_editor.cpp msgid "Key " msgstr "" @@ -10800,6 +10807,12 @@ msgid "Script file already exists." msgstr "" #: editor/script_create_dialog.cpp +msgid "" +"Note: Built-in scripts have some limitations and can't be edited using an " +"external editor." +msgstr "" + +#: editor/script_create_dialog.cpp msgid "Class Name:" msgstr "" @@ -10927,6 +10940,10 @@ msgid "Total:" msgstr "" #: editor/script_editor_debugger.cpp +msgid "Export list to a CSV file" +msgstr "" + +#: editor/script_editor_debugger.cpp msgid "Resource Path" msgstr "" @@ -12452,6 +12469,10 @@ msgid "" "texture to some node for display." msgstr "" +#: scene/main/viewport.cpp +msgid "Viewport size must be greater than 0 to render anything." +msgstr "" + #: scene/resources/visual_shader_nodes.cpp #, fuzzy msgid "Invalid source for preview." diff --git a/editor/translations/ko.po b/editor/translations/ko.po index ec33599440..b2dbd4e353 100644 --- a/editor/translations/ko.po +++ b/editor/translations/ko.po @@ -15,12 +15,14 @@ # moolow <copyhyeon@gmail.com>, 2019. # Jiyoon Kim <kimjiy@dickinson.edu>, 2019. # Ervin <zetsmart@gmail.com>, 2019. +# Tilto_ <tilto0822@develable.xyz>, 2020. +# Myeongjin Lee <aranet100@gmail.com>, 2020. msgid "" msgstr "" "Project-Id-Version: Godot Engine editor\n" "POT-Creation-Date: \n" -"PO-Revision-Date: 2020-03-14 00:33+0000\n" -"Last-Translator: Ch. <ccwpc@hanmail.net>\n" +"PO-Revision-Date: 2020-04-20 05:51+0000\n" +"Last-Translator: Myeongjin Lee <aranet100@gmail.com>\n" "Language-Team: Korean <https://hosted.weblate.org/projects/godot-engine/" "godot/ko/>\n" "Language: ko\n" @@ -28,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-dev\n" +"X-Generator: Weblate 4.0.2-dev\n" #: core/math/expression.cpp modules/gdscript/gdscript_functions.cpp #: modules/visual_script/visual_script_builtin_funcs.cpp @@ -1449,7 +1451,7 @@ msgstr "ì˜¤í† ë¡œë“œ ì´ë™" msgid "Remove Autoload" msgstr "ì˜¤í† ë¡œë“œ ì‚ì œ" -#: editor/editor_autoload_settings.cpp +#: editor/editor_autoload_settings.cpp editor/editor_plugin_settings.cpp msgid "Enable" msgstr "켜기" @@ -2923,8 +2925,12 @@ msgid "Q&A" msgstr "Q&A" #: editor/editor_node.cpp -msgid "Issue Tracker" -msgstr "ì´ìŠˆ 트래커" +msgid "Report a Bug" +msgstr "버그 ë³´ê³ " + +#: editor/editor_node.cpp +msgid "Send Docs Feedback" +msgstr "문서 피드백 보내기" #: editor/editor_node.cpp editor/plugins/asset_library_editor_plugin.cpp msgid "Community" @@ -3970,7 +3976,7 @@ msgid "Reimport" msgstr "다시 ê°€ì ¸ì˜¤ê¸°" #: editor/import_dock.cpp -msgid "Save scenes, re-import and restart" +msgid "Save Scenes, Re-Import, and Restart" msgstr "씬 ì €ìž¥, 다시 ê°€ì ¸ì˜¤ê¸° ë° ë‹¤ì‹œ 시작" #: editor/import_dock.cpp @@ -5836,9 +5842,8 @@ msgid "Couldn't create a single convex collision shape." msgstr "ë‹¨ì¼ convex ì¶©ëŒ ëª¨ì–‘ì„ ë§Œë“¤ 수 없습니다." #: editor/plugins/mesh_instance_editor_plugin.cpp -#, fuzzy msgid "Create Single Convex Shape" -msgstr "Convex 모양 만들기" +msgstr "개별 Convex 모양 만들기" #: editor/plugins/mesh_instance_editor_plugin.cpp msgid "Can't create multiple convex collision shapes for the scene root." @@ -5923,9 +5928,8 @@ msgstr "" "ì´ ë°©ë²•ì€ ê°€ìž¥ ì •í™•í•œ (하지만 가장 ëŠë¦°) ì¶©ëŒ íƒì§€ 방법입니다." #: editor/plugins/mesh_instance_editor_plugin.cpp -#, fuzzy msgid "Create Single Convex Collision Sibling" -msgstr "Convex ì¶©ëŒ í˜•ì œ 만들기" +msgstr "개별 Convex ì¶©ëŒ í˜•ì œ 만들기" #: editor/plugins/mesh_instance_editor_plugin.cpp msgid "" @@ -5936,7 +5940,6 @@ msgstr "" "ì´ ë°©ë²•ì€ ê°€ìž¥ ë¹ ë¥¸ (하지만 ëœ ì •í™•í•œ) ì¶©ëŒ íƒì§€ 방법입니다." #: editor/plugins/mesh_instance_editor_plugin.cpp -#, fuzzy msgid "Create Multiple Convex Collision Siblings" msgstr "다중 Convex ì¶©ëŒ í˜•ì œ 만들기" @@ -6810,14 +6813,6 @@ msgid "Open Godot online documentation." msgstr "Godot 온ë¼ì¸ 문서를 ì—´." #: editor/plugins/script_editor_plugin.cpp -msgid "Request Docs" -msgstr "문서 ìš”ì²" - -#: editor/plugins/script_editor_plugin.cpp -msgid "Help improve the Godot documentation by giving feedback." -msgstr "피드백으로 Godot 문서를 ê°œì„ í•˜ëŠ”ë° ë„와주세요." - -#: editor/plugins/script_editor_plugin.cpp msgid "Search the reference documentation." msgstr "참조 문서 검색." @@ -7254,6 +7249,10 @@ msgid "This operation requires a single selected node." msgstr "ì´ ìž‘ì—…ì€ í•˜ë‚˜ì˜ ë…¸ë“œë¥¼ ì„ íƒí•´ì•¼ 합니다." #: editor/plugins/spatial_editor_plugin.cpp +msgid "Auto Orthogonal Enabled" +msgstr "ìžë™ ì§êµ 활성화" + +#: editor/plugins/spatial_editor_plugin.cpp msgid "Lock View Rotation" msgstr "ë·° íšŒì „ ìž ê¸ˆ" @@ -7342,6 +7341,10 @@ msgid "Freelook Slow Modifier" msgstr "ìžìœ 시ì ëŠë¦° ìˆ˜ì •ìž" #: editor/plugins/spatial_editor_plugin.cpp +msgid "View Rotation Locked" +msgstr "ë·° íšŒì „ ìž ê¹€" + +#: editor/plugins/spatial_editor_plugin.cpp msgid "" "Note: The FPS value displayed is the editor's framerate.\n" "It cannot be used as a reliable indication of in-game performance." @@ -7350,10 +7353,6 @@ msgstr "" "ì´ê²ƒì´ 게임 ë‚´ ì„±ëŠ¥ì„ ë³´ìž¥í• ìˆ˜ 없습니다." #: editor/plugins/spatial_editor_plugin.cpp -msgid "View Rotation Locked" -msgstr "ë·° íšŒì „ ìž ê¹€" - -#: editor/plugins/spatial_editor_plugin.cpp msgid "XForm Dialog" msgstr "XForm 대화 ìƒìž" @@ -9530,9 +9529,8 @@ msgid "Please choose a \"project.godot\" or \".zip\" file." msgstr "\"project.godot\" íŒŒì¼ ë˜ëŠ” \".zip\" 파ì¼ì„ ì„ íƒí•´ì£¼ì„¸ìš”." #: editor/project_manager.cpp -#, fuzzy msgid "This directory already contains a Godot project." -msgstr "ë””ë ‰í† ë¦¬ì— Godot 프로ì 트가 ì´ë¯¸ 있습니다." +msgstr "ë””ë ‰í† ë¦¬ì— Godot 프로ì 트가 ì´ë¯¸ 존재합니다." #: editor/project_manager.cpp msgid "New Game Project" @@ -9834,6 +9832,13 @@ msgstr "" "현재 프로ì 트가 í•˜ë‚˜ë„ ì—†ìŠµë‹ˆë‹¤.\n" "ì• ì…‹ ë¼ì´ë¸ŒëŸ¬ë¦¬ì—서 ê³µì‹ ì˜ˆì œ 프로ì 트를 찾아볼까요?" +#: editor/project_manager.cpp +msgid "" +"The search box filters projects by name and last path component.\n" +"To filter projects by name and full path, the query must contain at least " +"one `/` character." +msgstr "" + #: editor/project_settings_editor.cpp msgid "Key " msgstr "키 " @@ -10263,7 +10268,6 @@ msgstr "" "ì¹´ìš´í„° ì„¤ì •ê³¼ 비êµí•©ë‹ˆë‹¤." #: editor/rename_dialog.cpp -#, fuzzy msgid "Per-level Counter" msgstr "단계별 ì¹´ìš´í„°" @@ -10817,6 +10821,14 @@ msgid "Script file already exists." msgstr "스í¬ë¦½íЏ 파ì¼ì´ ì´ë¯¸ 있습니다." #: editor/script_create_dialog.cpp +msgid "" +"Note: Built-in scripts have some limitations and can't be edited using an " +"external editor." +msgstr "" +"ì°¸ê³ : 내장 스í¬ë¦½íЏì—는 ì¼ë¶€ ì œí•œ 사í•ì´ ìžˆìœ¼ë©° 외부 편집기를 사용하여 편집" +"í• ìˆ˜ 없습니다." + +#: editor/script_create_dialog.cpp msgid "Class Name:" msgstr "í´ëž˜ìФ ì´ë¦„:" @@ -10937,6 +10949,11 @@ msgid "Total:" msgstr "ì „ì²´:" #: editor/script_editor_debugger.cpp +#, fuzzy +msgid "Export list to a CSV file" +msgstr "프로필 내보내기" + +#: editor/script_editor_debugger.cpp msgid "Resource Path" msgstr "리소스 경로" @@ -12565,6 +12582,10 @@ msgstr "" "ìš°, í™”ë©´ì— í‘œì‹œí•˜ê¸° 위해서는 ë·°í¬íŠ¸ë¥¼ RenderTarget으로 ë§Œë“¤ê³ ë‚´ë¶€ì ì¸ í…스처" "를 다른 ë…¸ë“œì— ì§€ì •í•´ì•¼ 합니다." +#: scene/main/viewport.cpp +msgid "Viewport size must be greater than 0 to render anything." +msgstr "ë·°í¬íЏ í¬ê¸°ëŠ” 무엇ì´ë“ ë Œë”ë§í•˜ê¸° 위해 0보다 커야 합니다." + #: scene/resources/visual_shader_nodes.cpp msgid "Invalid source for preview." msgstr "미리 ë³´ê¸°ì— ìž˜ëª»ëœ ì†ŒìŠ¤." @@ -12593,6 +12614,15 @@ msgstr "Varyingì€ ê¼ì§“ì 함수ì—ë§Œ ì§€ì •í• ìˆ˜ 있습니다." msgid "Constants cannot be modified." msgstr "ìƒìˆ˜ëŠ” ìˆ˜ì •í• ìˆ˜ 없습니다." +#~ msgid "Issue Tracker" +#~ msgstr "ì´ìŠˆ 트래커" + +#~ msgid "Request Docs" +#~ msgstr "문서 ìš”ì²" + +#~ msgid "Help improve the Godot documentation by giving feedback." +#~ msgstr "피드백으로 Godot 문서를 ê°œì„ í•˜ëŠ”ë° ë„와주세요." + #~ msgid "Replaced %d occurrence(s)." #~ msgstr "%d개를 바꿨습니다." diff --git a/editor/translations/lt.po b/editor/translations/lt.po index 1f58c4a658..57c377b571 100644 --- a/editor/translations/lt.po +++ b/editor/translations/lt.po @@ -1457,7 +1457,7 @@ msgstr "" msgid "Remove Autoload" msgstr "" -#: editor/editor_autoload_settings.cpp +#: editor/editor_autoload_settings.cpp editor/editor_plugin_settings.cpp msgid "Enable" msgstr "" @@ -2898,7 +2898,11 @@ msgid "Q&A" msgstr "" #: editor/editor_node.cpp -msgid "Issue Tracker" +msgid "Report a Bug" +msgstr "" + +#: editor/editor_node.cpp +msgid "Send Docs Feedback" msgstr "" #: editor/editor_node.cpp editor/plugins/asset_library_editor_plugin.cpp @@ -3953,7 +3957,7 @@ msgid "Reimport" msgstr "" #: editor/import_dock.cpp -msgid "Save scenes, re-import and restart" +msgid "Save Scenes, Re-Import, and Restart" msgstr "" #: editor/import_dock.cpp @@ -6821,14 +6825,6 @@ msgid "Open Godot online documentation." msgstr "" #: editor/plugins/script_editor_plugin.cpp -msgid "Request Docs" -msgstr "" - -#: editor/plugins/script_editor_plugin.cpp -msgid "Help improve the Godot documentation by giving feedback." -msgstr "" - -#: editor/plugins/script_editor_plugin.cpp msgid "Search the reference documentation." msgstr "" @@ -7264,6 +7260,10 @@ msgid "This operation requires a single selected node." msgstr "" #: editor/plugins/spatial_editor_plugin.cpp +msgid "Auto Orthogonal Enabled" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp msgid "Lock View Rotation" msgstr "" @@ -7353,13 +7353,13 @@ msgid "Freelook Slow Modifier" msgstr "" #: editor/plugins/spatial_editor_plugin.cpp -msgid "" -"Note: The FPS value displayed is the editor's framerate.\n" -"It cannot be used as a reliable indication of in-game performance." +msgid "View Rotation Locked" msgstr "" #: editor/plugins/spatial_editor_plugin.cpp -msgid "View Rotation Locked" +msgid "" +"Note: The FPS value displayed is the editor's framerate.\n" +"It cannot be used as a reliable indication of in-game performance." msgstr "" #: editor/plugins/spatial_editor_plugin.cpp @@ -9811,6 +9811,13 @@ msgid "" "Would you like to explore official example projects in the Asset Library?" msgstr "" +#: editor/project_manager.cpp +msgid "" +"The search box filters projects by name and last path component.\n" +"To filter projects by name and full path, the query must contain at least " +"one `/` character." +msgstr "" + #: editor/project_settings_editor.cpp msgid "Key " msgstr "" @@ -10785,6 +10792,12 @@ msgid "Script file already exists." msgstr "" #: editor/script_create_dialog.cpp +msgid "" +"Note: Built-in scripts have some limitations and can't be edited using an " +"external editor." +msgstr "" + +#: editor/script_create_dialog.cpp #, fuzzy msgid "Class Name:" msgstr "Priedai" @@ -10911,6 +10924,11 @@ msgid "Total:" msgstr "" #: editor/script_editor_debugger.cpp +#, fuzzy +msgid "Export list to a CSV file" +msgstr "Importuoti iÅ¡ Nodo:" + +#: editor/script_editor_debugger.cpp msgid "Resource Path" msgstr "" @@ -12439,6 +12457,10 @@ msgid "" "texture to some node for display." msgstr "" +#: scene/main/viewport.cpp +msgid "Viewport size must be greater than 0 to render anything." +msgstr "" + #: scene/resources/visual_shader_nodes.cpp #, fuzzy msgid "Invalid source for preview." diff --git a/editor/translations/lv.po b/editor/translations/lv.po index 14dfdff801..642050468b 100644 --- a/editor/translations/lv.po +++ b/editor/translations/lv.po @@ -1464,7 +1464,7 @@ msgstr "" msgid "Remove Autoload" msgstr "" -#: editor/editor_autoload_settings.cpp +#: editor/editor_autoload_settings.cpp editor/editor_plugin_settings.cpp msgid "Enable" msgstr "IespÄ“jot" @@ -2896,7 +2896,11 @@ msgid "Q&A" msgstr "" #: editor/editor_node.cpp -msgid "Issue Tracker" +msgid "Report a Bug" +msgstr "" + +#: editor/editor_node.cpp +msgid "Send Docs Feedback" msgstr "" #: editor/editor_node.cpp editor/plugins/asset_library_editor_plugin.cpp @@ -3944,7 +3948,7 @@ msgid "Reimport" msgstr "" #: editor/import_dock.cpp -msgid "Save scenes, re-import and restart" +msgid "Save Scenes, Re-Import, and Restart" msgstr "" #: editor/import_dock.cpp @@ -6795,14 +6799,6 @@ msgid "Open Godot online documentation." msgstr "" #: editor/plugins/script_editor_plugin.cpp -msgid "Request Docs" -msgstr "" - -#: editor/plugins/script_editor_plugin.cpp -msgid "Help improve the Godot documentation by giving feedback." -msgstr "" - -#: editor/plugins/script_editor_plugin.cpp msgid "Search the reference documentation." msgstr "" @@ -7245,6 +7241,10 @@ msgid "This operation requires a single selected node." msgstr "" #: editor/plugins/spatial_editor_plugin.cpp +msgid "Auto Orthogonal Enabled" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp msgid "Lock View Rotation" msgstr "" @@ -7334,13 +7334,13 @@ msgid "Freelook Slow Modifier" msgstr "" #: editor/plugins/spatial_editor_plugin.cpp -msgid "" -"Note: The FPS value displayed is the editor's framerate.\n" -"It cannot be used as a reliable indication of in-game performance." +msgid "View Rotation Locked" msgstr "" #: editor/plugins/spatial_editor_plugin.cpp -msgid "View Rotation Locked" +msgid "" +"Note: The FPS value displayed is the editor's framerate.\n" +"It cannot be used as a reliable indication of in-game performance." msgstr "" #: editor/plugins/spatial_editor_plugin.cpp @@ -9778,6 +9778,13 @@ msgid "" "Would you like to explore official example projects in the Asset Library?" msgstr "" +#: editor/project_manager.cpp +msgid "" +"The search box filters projects by name and last path component.\n" +"To filter projects by name and full path, the query must contain at least " +"one `/` character." +msgstr "" + #: editor/project_settings_editor.cpp msgid "Key " msgstr "" @@ -10751,6 +10758,12 @@ msgid "Script file already exists." msgstr "" #: editor/script_create_dialog.cpp +msgid "" +"Note: Built-in scripts have some limitations and can't be edited using an " +"external editor." +msgstr "" + +#: editor/script_create_dialog.cpp msgid "Class Name:" msgstr "" @@ -10878,6 +10891,10 @@ msgid "Total:" msgstr "" #: editor/script_editor_debugger.cpp +msgid "Export list to a CSV file" +msgstr "" + +#: editor/script_editor_debugger.cpp msgid "Resource Path" msgstr "" @@ -12405,6 +12422,10 @@ msgid "" "texture to some node for display." msgstr "" +#: scene/main/viewport.cpp +msgid "Viewport size must be greater than 0 to render anything." +msgstr "" + #: scene/resources/visual_shader_nodes.cpp #, fuzzy msgid "Invalid source for preview." diff --git a/editor/translations/mi.po b/editor/translations/mi.po index 5ec6cc28e0..5c33f2e72e 100644 --- a/editor/translations/mi.po +++ b/editor/translations/mi.po @@ -1399,7 +1399,7 @@ msgstr "" msgid "Remove Autoload" msgstr "" -#: editor/editor_autoload_settings.cpp +#: editor/editor_autoload_settings.cpp editor/editor_plugin_settings.cpp msgid "Enable" msgstr "" @@ -2802,7 +2802,11 @@ msgid "Q&A" msgstr "" #: editor/editor_node.cpp -msgid "Issue Tracker" +msgid "Report a Bug" +msgstr "" + +#: editor/editor_node.cpp +msgid "Send Docs Feedback" msgstr "" #: editor/editor_node.cpp editor/plugins/asset_library_editor_plugin.cpp @@ -3823,7 +3827,7 @@ msgid "Reimport" msgstr "" #: editor/import_dock.cpp -msgid "Save scenes, re-import and restart" +msgid "Save Scenes, Re-Import, and Restart" msgstr "" #: editor/import_dock.cpp @@ -6605,14 +6609,6 @@ msgid "Open Godot online documentation." msgstr "" #: editor/plugins/script_editor_plugin.cpp -msgid "Request Docs" -msgstr "" - -#: editor/plugins/script_editor_plugin.cpp -msgid "Help improve the Godot documentation by giving feedback." -msgstr "" - -#: editor/plugins/script_editor_plugin.cpp msgid "Search the reference documentation." msgstr "" @@ -7042,6 +7038,10 @@ msgid "This operation requires a single selected node." msgstr "" #: editor/plugins/spatial_editor_plugin.cpp +msgid "Auto Orthogonal Enabled" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp msgid "Lock View Rotation" msgstr "" @@ -7130,13 +7130,13 @@ msgid "Freelook Slow Modifier" msgstr "" #: editor/plugins/spatial_editor_plugin.cpp -msgid "" -"Note: The FPS value displayed is the editor's framerate.\n" -"It cannot be used as a reliable indication of in-game performance." +msgid "View Rotation Locked" msgstr "" #: editor/plugins/spatial_editor_plugin.cpp -msgid "View Rotation Locked" +msgid "" +"Note: The FPS value displayed is the editor's framerate.\n" +"It cannot be used as a reliable indication of in-game performance." msgstr "" #: editor/plugins/spatial_editor_plugin.cpp @@ -9499,6 +9499,13 @@ msgid "" "Would you like to explore official example projects in the Asset Library?" msgstr "" +#: editor/project_manager.cpp +msgid "" +"The search box filters projects by name and last path component.\n" +"To filter projects by name and full path, the query must contain at least " +"one `/` character." +msgstr "" + #: editor/project_settings_editor.cpp msgid "Key " msgstr "" @@ -10454,6 +10461,12 @@ msgid "Script file already exists." msgstr "" #: editor/script_create_dialog.cpp +msgid "" +"Note: Built-in scripts have some limitations and can't be edited using an " +"external editor." +msgstr "" + +#: editor/script_create_dialog.cpp msgid "Class Name:" msgstr "" @@ -10574,6 +10587,10 @@ msgid "Total:" msgstr "" #: editor/script_editor_debugger.cpp +msgid "Export list to a CSV file" +msgstr "" + +#: editor/script_editor_debugger.cpp msgid "Resource Path" msgstr "" @@ -12067,6 +12084,10 @@ msgid "" "texture to some node for display." msgstr "" +#: scene/main/viewport.cpp +msgid "Viewport size must be greater than 0 to render anything." +msgstr "" + #: scene/resources/visual_shader_nodes.cpp msgid "Invalid source for preview." msgstr "" diff --git a/editor/translations/ml.po b/editor/translations/ml.po index 7e7149e05e..e46fd5a10d 100644 --- a/editor/translations/ml.po +++ b/editor/translations/ml.po @@ -1409,7 +1409,7 @@ msgstr "" msgid "Remove Autoload" msgstr "" -#: editor/editor_autoload_settings.cpp +#: editor/editor_autoload_settings.cpp editor/editor_plugin_settings.cpp msgid "Enable" msgstr "" @@ -2814,7 +2814,11 @@ msgid "Q&A" msgstr "" #: editor/editor_node.cpp -msgid "Issue Tracker" +msgid "Report a Bug" +msgstr "" + +#: editor/editor_node.cpp +msgid "Send Docs Feedback" msgstr "" #: editor/editor_node.cpp editor/plugins/asset_library_editor_plugin.cpp @@ -3835,7 +3839,7 @@ msgid "Reimport" msgstr "" #: editor/import_dock.cpp -msgid "Save scenes, re-import and restart" +msgid "Save Scenes, Re-Import, and Restart" msgstr "" #: editor/import_dock.cpp @@ -6621,14 +6625,6 @@ msgid "Open Godot online documentation." msgstr "" #: editor/plugins/script_editor_plugin.cpp -msgid "Request Docs" -msgstr "" - -#: editor/plugins/script_editor_plugin.cpp -msgid "Help improve the Godot documentation by giving feedback." -msgstr "" - -#: editor/plugins/script_editor_plugin.cpp msgid "Search the reference documentation." msgstr "" @@ -7058,6 +7054,10 @@ msgid "This operation requires a single selected node." msgstr "" #: editor/plugins/spatial_editor_plugin.cpp +msgid "Auto Orthogonal Enabled" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp msgid "Lock View Rotation" msgstr "" @@ -7146,13 +7146,13 @@ msgid "Freelook Slow Modifier" msgstr "" #: editor/plugins/spatial_editor_plugin.cpp -msgid "" -"Note: The FPS value displayed is the editor's framerate.\n" -"It cannot be used as a reliable indication of in-game performance." +msgid "View Rotation Locked" msgstr "" #: editor/plugins/spatial_editor_plugin.cpp -msgid "View Rotation Locked" +msgid "" +"Note: The FPS value displayed is the editor's framerate.\n" +"It cannot be used as a reliable indication of in-game performance." msgstr "" #: editor/plugins/spatial_editor_plugin.cpp @@ -9515,6 +9515,13 @@ msgid "" "Would you like to explore official example projects in the Asset Library?" msgstr "" +#: editor/project_manager.cpp +msgid "" +"The search box filters projects by name and last path component.\n" +"To filter projects by name and full path, the query must contain at least " +"one `/` character." +msgstr "" + #: editor/project_settings_editor.cpp msgid "Key " msgstr "" @@ -10470,6 +10477,12 @@ msgid "Script file already exists." msgstr "" #: editor/script_create_dialog.cpp +msgid "" +"Note: Built-in scripts have some limitations and can't be edited using an " +"external editor." +msgstr "" + +#: editor/script_create_dialog.cpp msgid "Class Name:" msgstr "" @@ -10590,6 +10603,10 @@ msgid "Total:" msgstr "" #: editor/script_editor_debugger.cpp +msgid "Export list to a CSV file" +msgstr "" + +#: editor/script_editor_debugger.cpp msgid "Resource Path" msgstr "" @@ -12084,6 +12101,10 @@ msgid "" "texture to some node for display." msgstr "" +#: scene/main/viewport.cpp +msgid "Viewport size must be greater than 0 to render anything." +msgstr "" + #: scene/resources/visual_shader_nodes.cpp msgid "Invalid source for preview." msgstr "" diff --git a/editor/translations/mr.po b/editor/translations/mr.po index 4ae3df9f99..5b2a55ffbe 100644 --- a/editor/translations/mr.po +++ b/editor/translations/mr.po @@ -1405,7 +1405,7 @@ msgstr "" msgid "Remove Autoload" msgstr "" -#: editor/editor_autoload_settings.cpp +#: editor/editor_autoload_settings.cpp editor/editor_plugin_settings.cpp msgid "Enable" msgstr "" @@ -2809,7 +2809,11 @@ msgid "Q&A" msgstr "" #: editor/editor_node.cpp -msgid "Issue Tracker" +msgid "Report a Bug" +msgstr "" + +#: editor/editor_node.cpp +msgid "Send Docs Feedback" msgstr "" #: editor/editor_node.cpp editor/plugins/asset_library_editor_plugin.cpp @@ -3830,7 +3834,7 @@ msgid "Reimport" msgstr "" #: editor/import_dock.cpp -msgid "Save scenes, re-import and restart" +msgid "Save Scenes, Re-Import, and Restart" msgstr "" #: editor/import_dock.cpp @@ -6612,14 +6616,6 @@ msgid "Open Godot online documentation." msgstr "" #: editor/plugins/script_editor_plugin.cpp -msgid "Request Docs" -msgstr "" - -#: editor/plugins/script_editor_plugin.cpp -msgid "Help improve the Godot documentation by giving feedback." -msgstr "" - -#: editor/plugins/script_editor_plugin.cpp msgid "Search the reference documentation." msgstr "" @@ -7049,6 +7045,10 @@ msgid "This operation requires a single selected node." msgstr "" #: editor/plugins/spatial_editor_plugin.cpp +msgid "Auto Orthogonal Enabled" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp msgid "Lock View Rotation" msgstr "" @@ -7137,13 +7137,13 @@ msgid "Freelook Slow Modifier" msgstr "" #: editor/plugins/spatial_editor_plugin.cpp -msgid "" -"Note: The FPS value displayed is the editor's framerate.\n" -"It cannot be used as a reliable indication of in-game performance." +msgid "View Rotation Locked" msgstr "" #: editor/plugins/spatial_editor_plugin.cpp -msgid "View Rotation Locked" +msgid "" +"Note: The FPS value displayed is the editor's framerate.\n" +"It cannot be used as a reliable indication of in-game performance." msgstr "" #: editor/plugins/spatial_editor_plugin.cpp @@ -9506,6 +9506,13 @@ msgid "" "Would you like to explore official example projects in the Asset Library?" msgstr "" +#: editor/project_manager.cpp +msgid "" +"The search box filters projects by name and last path component.\n" +"To filter projects by name and full path, the query must contain at least " +"one `/` character." +msgstr "" + #: editor/project_settings_editor.cpp msgid "Key " msgstr "" @@ -10461,6 +10468,12 @@ msgid "Script file already exists." msgstr "" #: editor/script_create_dialog.cpp +msgid "" +"Note: Built-in scripts have some limitations and can't be edited using an " +"external editor." +msgstr "" + +#: editor/script_create_dialog.cpp msgid "Class Name:" msgstr "" @@ -10581,6 +10594,10 @@ msgid "Total:" msgstr "" #: editor/script_editor_debugger.cpp +msgid "Export list to a CSV file" +msgstr "" + +#: editor/script_editor_debugger.cpp msgid "Resource Path" msgstr "" @@ -12074,6 +12091,10 @@ msgid "" "texture to some node for display." msgstr "" +#: scene/main/viewport.cpp +msgid "Viewport size must be greater than 0 to render anything." +msgstr "" + #: scene/resources/visual_shader_nodes.cpp msgid "Invalid source for preview." msgstr "" diff --git a/editor/translations/ms.po b/editor/translations/ms.po index bdb52e4845..09e2bcc096 100644 --- a/editor/translations/ms.po +++ b/editor/translations/ms.po @@ -1429,7 +1429,7 @@ msgstr "" msgid "Remove Autoload" msgstr "" -#: editor/editor_autoload_settings.cpp +#: editor/editor_autoload_settings.cpp editor/editor_plugin_settings.cpp msgid "Enable" msgstr "" @@ -2836,7 +2836,11 @@ msgid "Q&A" msgstr "" #: editor/editor_node.cpp -msgid "Issue Tracker" +msgid "Report a Bug" +msgstr "" + +#: editor/editor_node.cpp +msgid "Send Docs Feedback" msgstr "" #: editor/editor_node.cpp editor/plugins/asset_library_editor_plugin.cpp @@ -3858,7 +3862,7 @@ msgid "Reimport" msgstr "" #: editor/import_dock.cpp -msgid "Save scenes, re-import and restart" +msgid "Save Scenes, Re-Import, and Restart" msgstr "" #: editor/import_dock.cpp @@ -6659,14 +6663,6 @@ msgid "Open Godot online documentation." msgstr "" #: editor/plugins/script_editor_plugin.cpp -msgid "Request Docs" -msgstr "" - -#: editor/plugins/script_editor_plugin.cpp -msgid "Help improve the Godot documentation by giving feedback." -msgstr "" - -#: editor/plugins/script_editor_plugin.cpp msgid "Search the reference documentation." msgstr "" @@ -7097,6 +7093,10 @@ msgid "This operation requires a single selected node." msgstr "" #: editor/plugins/spatial_editor_plugin.cpp +msgid "Auto Orthogonal Enabled" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp msgid "Lock View Rotation" msgstr "" @@ -7185,13 +7185,13 @@ msgid "Freelook Slow Modifier" msgstr "" #: editor/plugins/spatial_editor_plugin.cpp -msgid "" -"Note: The FPS value displayed is the editor's framerate.\n" -"It cannot be used as a reliable indication of in-game performance." +msgid "View Rotation Locked" msgstr "" #: editor/plugins/spatial_editor_plugin.cpp -msgid "View Rotation Locked" +msgid "" +"Note: The FPS value displayed is the editor's framerate.\n" +"It cannot be used as a reliable indication of in-game performance." msgstr "" #: editor/plugins/spatial_editor_plugin.cpp @@ -9572,6 +9572,13 @@ msgid "" "Would you like to explore official example projects in the Asset Library?" msgstr "" +#: editor/project_manager.cpp +msgid "" +"The search box filters projects by name and last path component.\n" +"To filter projects by name and full path, the query must contain at least " +"one `/` character." +msgstr "" + #: editor/project_settings_editor.cpp msgid "Key " msgstr "" @@ -10531,6 +10538,12 @@ msgid "Script file already exists." msgstr "" #: editor/script_create_dialog.cpp +msgid "" +"Note: Built-in scripts have some limitations and can't be edited using an " +"external editor." +msgstr "" + +#: editor/script_create_dialog.cpp msgid "Class Name:" msgstr "" @@ -10651,6 +10664,10 @@ msgid "Total:" msgstr "" #: editor/script_editor_debugger.cpp +msgid "Export list to a CSV file" +msgstr "" + +#: editor/script_editor_debugger.cpp msgid "Resource Path" msgstr "" @@ -12154,6 +12171,10 @@ msgid "" "texture to some node for display." msgstr "" +#: scene/main/viewport.cpp +msgid "Viewport size must be greater than 0 to render anything." +msgstr "" + #: scene/resources/visual_shader_nodes.cpp msgid "Invalid source for preview." msgstr "" diff --git a/editor/translations/nb.po b/editor/translations/nb.po index 90df4e7b4f..34d6e9dc76 100644 --- a/editor/translations/nb.po +++ b/editor/translations/nb.po @@ -2,7 +2,7 @@ # Copyright (c) 2007-2020 Juan Linietsky, Ariel Manzur. # Copyright (c) 2014-2020 Godot Engine contributors (cf. AUTHORS.md). # This file is distributed under the same license as the Godot source code. -# Allan Nordhøy <epost@anotheragency.no>, 2017-2018, 2019. +# Allan Nordhøy <epost@anotheragency.no>, 2017-2018, 2019, 2020. # Anonymous <GentleSaucepan@protonmail.com>, 2017. # Elias <eliasnykrem@gmail.com>, 2018. # flesk <eivindkn@gmail.com>, 2017, 2019. @@ -14,13 +14,13 @@ # Byzantin <kasper-hoel@hotmail.com>, 2018. # Hans-Marius ØverÃ¥s <hansmariusoveras@gmail.com>, 2019. # Revolution <revosw@gmail.com>, 2019. -# Petter Reinholdtsen <pere-weblate@hungry.com>, 2019. +# Petter Reinholdtsen <pere-weblate@hungry.com>, 2019, 2020. msgid "" msgstr "" "Project-Id-Version: Godot Engine editor\n" "POT-Creation-Date: \n" -"PO-Revision-Date: 2019-10-29 12:49+0000\n" -"Last-Translator: Allan Nordhøy <epost@anotheragency.no>\n" +"PO-Revision-Date: 2020-04-16 11:03+0000\n" +"Last-Translator: Petter Reinholdtsen <pere-weblate@hungry.com>\n" "Language-Team: Norwegian BokmÃ¥l <https://hosted.weblate.org/projects/godot-" "engine/godot/nb_NO/>\n" "Language: nb\n" @@ -28,7 +28,7 @@ msgstr "" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=n != 1;\n" -"X-Generator: Weblate 3.9.1\n" +"X-Generator: Weblate 4.0.1-dev\n" #: core/math/expression.cpp modules/gdscript/gdscript_functions.cpp #: modules/visual_script/visual_script_builtin_funcs.cpp @@ -37,7 +37,7 @@ msgstr "Ugyldig argumenttype til convert(), bruk TYPE_*-konstantene." #: core/math/expression.cpp modules/gdscript/gdscript_functions.cpp msgid "Expected a string of length 1 (a character)." -msgstr "" +msgstr "Forventet en streng med lenge 1 (et tegn)." #: core/math/expression.cpp modules/gdscript/gdscript_functions.cpp #: modules/mono/glue/gd_glue.cpp @@ -243,7 +243,7 @@ msgstr "Legg til Spor" #: editor/animation_track_editor.cpp #, fuzzy msgid "Animation Looping" -msgstr "Animasjons-zoom." +msgstr "Animasjonsløkke" #: editor/animation_track_editor.cpp #: modules/visual_script/visual_script_editor.cpp @@ -283,14 +283,12 @@ msgid "Loop Wrap Mode (Interpolate end with beginning on loop)" msgstr "" #: editor/animation_track_editor.cpp -#, fuzzy msgid "Remove this track." -msgstr "Fjern valgt spor." +msgstr "Fjern dette sporet." #: editor/animation_track_editor.cpp -#, fuzzy msgid "Time (s): " -msgstr "X-Fade Tid (s):" +msgstr "Tid (s): " #: editor/animation_track_editor.cpp msgid "Toggle Track Enabled" @@ -309,9 +307,8 @@ msgid "Trigger" msgstr "Avtrekker" #: editor/animation_track_editor.cpp -#, fuzzy msgid "Capture" -msgstr "Framtid" +msgstr "Fang" #: editor/animation_track_editor.cpp msgid "Nearest" @@ -340,14 +337,12 @@ msgid "Insert Key" msgstr "Sett inn Nøkkel" #: editor/animation_track_editor.cpp -#, fuzzy msgid "Duplicate Key(s)" -msgstr "Anim Dupliser Nøkler" +msgstr "Dupliser Nøkler" #: editor/animation_track_editor.cpp -#, fuzzy msgid "Delete Key(s)" -msgstr "Anim Fjern Nøkler" +msgstr "Fjern Nøkler" #: editor/animation_track_editor.cpp #, fuzzy @@ -1181,7 +1176,7 @@ msgstr "Utviklingsleder" #: editor/editor_about.cpp msgid "Project Manager " -msgstr "Prosjektleder " +msgstr "Prosjektstyring " #: editor/editor_about.cpp msgid "Developers" @@ -1284,7 +1279,7 @@ msgstr "Vellykket Installering av Pakke!" #: editor/editor_asset_installer.cpp #: editor/plugins/asset_library_editor_plugin.cpp msgid "Success!" -msgstr "Suksess!" +msgstr "Vellykket!" #: editor/editor_asset_installer.cpp #, fuzzy @@ -1524,7 +1519,7 @@ msgstr "Flytt Autoload" msgid "Remove Autoload" msgstr "Fjern Autoload" -#: editor/editor_autoload_settings.cpp +#: editor/editor_autoload_settings.cpp editor/editor_plugin_settings.cpp msgid "Enable" msgstr "Aktiver" @@ -1588,7 +1583,7 @@ msgstr "Oppdaterer scene..." #: editor/editor_data.cpp editor/editor_properties.cpp msgid "[empty]" -msgstr "[tom]" +msgstr "[blank]" #: editor/editor_data.cpp msgid "[unsaved]" @@ -1669,16 +1664,14 @@ msgstr "" #: editor/editor_export.cpp platform/android/export/export.cpp #: platform/iphone/export/export.cpp platform/javascript/export/export.cpp #: platform/osx/export/export.cpp platform/uwp/export/export.cpp -#, fuzzy msgid "Custom debug template not found." -msgstr "Malfil ble ikke funnet:" +msgstr "Tilpasset feilsøkingsmal ble ikke funnet." #: editor/editor_export.cpp platform/android/export/export.cpp #: platform/iphone/export/export.cpp platform/javascript/export/export.cpp #: platform/osx/export/export.cpp platform/uwp/export/export.cpp -#, fuzzy msgid "Custom release template not found." -msgstr "Tilpasset utgivelsesmal ikke funnet." +msgstr "Fant ikke tilpasset utgivelsesmal." #: editor/editor_export.cpp platform/javascript/export/export.cpp msgid "Template file not found:" @@ -1699,9 +1692,8 @@ msgid "Script Editor" msgstr "Ã…pne SkriptEditor" #: editor/editor_feature_profile.cpp -#, fuzzy msgid "Asset Library" -msgstr "Ã…pne Assets-Bibliotek" +msgstr "Ressursbibliotek" #: editor/editor_feature_profile.cpp msgid "Scene Tree Editing" @@ -2024,7 +2016,7 @@ msgstr "MÃ¥ ha en gyldig filutvidelse." #: editor/editor_file_system.cpp msgid "ScanSources" -msgstr "SkannKilder" +msgstr "Gjennomsøk kilder" #: editor/editor_file_system.cpp msgid "" @@ -2054,9 +2046,8 @@ msgid "Inherited by:" msgstr "Arvet av:" #: editor/editor_help.cpp -#, fuzzy msgid "Description" -msgstr "Beskrivelse:" +msgstr "Beskrivelse" #: editor/editor_help.cpp #, fuzzy @@ -2180,9 +2171,8 @@ msgid "Member Type" msgstr "Medlemmer" #: editor/editor_help_search.cpp -#, fuzzy msgid "Class" -msgstr "Klasse:" +msgstr "Klasse" #: editor/editor_help_search.cpp #, fuzzy @@ -2927,7 +2917,7 @@ msgstr "Avslutt til Prosjektliste" #: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp #: editor/project_export.cpp msgid "Debug" -msgstr "Debug" +msgstr "Feilsøk" #: editor/editor_node.cpp msgid "Deploy with Remote Debug" @@ -2943,9 +2933,8 @@ msgstr "" "koble til IP'en til denne datamaskinen for Ã¥ bli debugget." #: editor/editor_node.cpp -#, fuzzy msgid "Small Deploy with Network FS" -msgstr "Liten Deploy med Network FS" +msgstr "Liten utrulling med Network FS" #: editor/editor_node.cpp msgid "" @@ -2963,9 +2952,8 @@ msgstr "" "alternativet gjør testing for spill med et stort fotavtrykk raskere." #: editor/editor_node.cpp -#, fuzzy msgid "Visible Collision Shapes" -msgstr "Synlige Kollisjons-Former" +msgstr "Synlige kollisjons-former" #: editor/editor_node.cpp msgid "" @@ -2977,7 +2965,7 @@ msgstr "" #: editor/editor_node.cpp msgid "Visible Navigation" -msgstr "Synlig Navigasjon" +msgstr "Synlig navigasjon" #: editor/editor_node.cpp msgid "" @@ -2989,7 +2977,7 @@ msgstr "" #: editor/editor_node.cpp msgid "Sync Scene Changes" -msgstr "Synkroniser Sceneforandringer" +msgstr "Synkroniser Sceneendringer" #: editor/editor_node.cpp msgid "" @@ -3005,7 +2993,7 @@ msgstr "" #: editor/editor_node.cpp msgid "Sync Script Changes" -msgstr "Synkroniser Skriptforandringer" +msgstr "Synkroniser Skriptendringer" #: editor/editor_node.cpp #, fuzzy @@ -3021,7 +3009,6 @@ msgstr "" "nettverksfilsystem." #: editor/editor_node.cpp editor/script_create_dialog.cpp -#, fuzzy msgid "Editor" msgstr "Redigeringsverktøy" @@ -3100,8 +3087,13 @@ msgid "Q&A" msgstr "SpørsmÃ¥l og Svar" #: editor/editor_node.cpp -msgid "Issue Tracker" -msgstr "Problemtracker" +#, fuzzy +msgid "Report a Bug" +msgstr "Reimporter" + +#: editor/editor_node.cpp +msgid "Send Docs Feedback" +msgstr "" #: editor/editor_node.cpp editor/plugins/asset_library_editor_plugin.cpp msgid "Community" @@ -3365,7 +3357,6 @@ msgid "Inclusive" msgstr "Inklusiv" #: editor/editor_profiler.cpp -#, fuzzy msgid "Self" msgstr "Selv" @@ -3547,8 +3538,9 @@ msgid "Select Node(s) to Import" msgstr "Velg Node(r) for Importering" #: editor/editor_sub_scene.cpp editor/project_manager.cpp +#, fuzzy msgid "Browse" -msgstr "Utforsk" +msgstr "Bla gjennom" #: editor/editor_sub_scene.cpp msgid "Scene Path:" @@ -3953,7 +3945,7 @@ msgstr "Lag mappe" #: editor/filesystem_dock.cpp msgid "Re-Scan Filesystem" -msgstr "Re-Skann Filsystem" +msgstr "Gjennomsøk filsystem pÃ¥ ny" #: editor/filesystem_dock.cpp #, fuzzy @@ -3970,8 +3962,8 @@ msgid "" "Scanning Files,\n" "Please Wait..." msgstr "" -"Skanner Filer,\n" -"Vennligst Vent..." +"GjennomgÃ¥r filer,\n" +"Vent…" #: editor/filesystem_dock.cpp msgid "Move" @@ -4225,7 +4217,8 @@ msgid "Reimport" msgstr "Reimporter" #: editor/import_dock.cpp -msgid "Save scenes, re-import and restart" +#, fuzzy +msgid "Save Scenes, Re-Import, and Restart" msgstr "Lagre scener, om-importer og start om" #: editor/import_dock.cpp @@ -4670,9 +4663,8 @@ msgid "Audio Clips" msgstr "Lydklipp:" #: editor/plugins/animation_blend_tree_editor_plugin.cpp -#, fuzzy msgid "Functions" -msgstr "Funksjoner:" +msgstr "Funksjoner" #: editor/plugins/animation_blend_tree_editor_plugin.cpp #: editor/plugins/animation_state_machine_editor.cpp @@ -5021,9 +5013,8 @@ msgstr "Panorerings-Modus" #: editor/plugins/animation_tree_editor_plugin.cpp #: editor/plugins/animation_tree_player_editor_plugin.cpp -#, fuzzy msgid "AnimationTree" -msgstr "Animasjon" +msgstr "Animasjontre" #: editor/plugins/animation_tree_player_editor_plugin.cpp msgid "New name:" @@ -7256,14 +7247,6 @@ msgid "Open Godot online documentation." msgstr "Ã…pne Godots nettbaserte dokumentasjon" #: editor/plugins/script_editor_plugin.cpp -msgid "Request Docs" -msgstr "" - -#: editor/plugins/script_editor_plugin.cpp -msgid "Help improve the Godot documentation by giving feedback." -msgstr "" - -#: editor/plugins/script_editor_plugin.cpp msgid "Search the reference documentation." msgstr "Søk i referanse-dokumentasjonen." @@ -7297,7 +7280,7 @@ msgstr "Lagre pÃ¥ nytt" #: editor/plugins/script_editor_plugin.cpp editor/script_editor_debugger.cpp msgid "Debugger" -msgstr "Feilretter" +msgstr "Feilsøking" #: editor/plugins/script_editor_plugin.cpp #, fuzzy @@ -7565,9 +7548,8 @@ msgid "Create physical bones" msgstr "" #: editor/plugins/skeleton_editor_plugin.cpp -#, fuzzy msgid "Skeleton" -msgstr "Singleton" +msgstr "Skelett" #: editor/plugins/skeleton_editor_plugin.cpp #, fuzzy @@ -7585,7 +7567,7 @@ msgstr "" #: editor/plugins/spatial_editor_plugin.cpp msgid "Perspective" -msgstr "" +msgstr "Perspektiv" #: editor/plugins/spatial_editor_plugin.cpp msgid "Transform Aborted." @@ -7724,6 +7706,10 @@ msgid "This operation requires a single selected node." msgstr "Denne operasjonen krever én valgt node." #: editor/plugins/spatial_editor_plugin.cpp +msgid "Auto Orthogonal Enabled" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp #, fuzzy msgid "Lock View Rotation" msgstr "Vis Informasjon" @@ -7780,7 +7766,7 @@ msgstr "Lager ForhÃ¥ndsvisning av Mesh" #: editor/plugins/spatial_editor_plugin.cpp msgid "Not available when using the GLES2 renderer." -msgstr "" +msgstr "Ikke tilgjengelig ved bruk av GLES2-opptegner." #: editor/plugins/spatial_editor_plugin.cpp msgid "Freelook Left" @@ -7815,17 +7801,17 @@ msgid "Freelook Slow Modifier" msgstr "" #: editor/plugins/spatial_editor_plugin.cpp +#, fuzzy +msgid "View Rotation Locked" +msgstr "Vis Informasjon" + +#: editor/plugins/spatial_editor_plugin.cpp msgid "" "Note: The FPS value displayed is the editor's framerate.\n" "It cannot be used as a reliable indication of in-game performance." msgstr "" #: editor/plugins/spatial_editor_plugin.cpp -#, fuzzy -msgid "View Rotation Locked" -msgstr "Vis Informasjon" - -#: editor/plugins/spatial_editor_plugin.cpp msgid "XForm Dialog" msgstr "" @@ -7879,7 +7865,7 @@ msgstr "Høyrevisning" #: editor/plugins/spatial_editor_plugin.cpp msgid "Switch Perspective/Orthogonal View" -msgstr "" +msgstr "Bytt perspektiv/ortogonal fremvisning" #: editor/plugins/spatial_editor_plugin.cpp msgid "Insert Animation Key" @@ -7975,7 +7961,7 @@ msgstr "" #: editor/plugins/spatial_editor_plugin.cpp msgid "Perspective FOV (deg.):" -msgstr "" +msgstr "Perspektiv-synsv. (deg.):" #: editor/plugins/spatial_editor_plugin.cpp msgid "View Z-Near:" @@ -9032,9 +9018,8 @@ msgid "Scalar" msgstr "Skala:" #: editor/plugins/visual_shader_editor_plugin.cpp -#, fuzzy msgid "Vector" -msgstr "Inspektør" +msgstr "Vektor" #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Boolean" @@ -10071,7 +10056,7 @@ msgstr "" #: editor/project_manager.cpp msgid "Please choose an empty folder." -msgstr "" +msgstr "Velg en tom mappe." #: editor/project_manager.cpp msgid "Please choose a \"project.godot\" or \".zip\" file." @@ -10144,9 +10129,8 @@ msgid "Create New Project" msgstr "Opprett Nytt Prosjekt" #: editor/project_manager.cpp -#, fuzzy msgid "Create & Edit" -msgstr "Opprett skript" +msgstr "Opprett og rediger" #: editor/project_manager.cpp msgid "Install Project:" @@ -10171,7 +10155,7 @@ msgstr "Prosjektsti:" #: editor/project_manager.cpp msgid "Renderer:" -msgstr "" +msgstr "Opptegner:" #: editor/project_manager.cpp msgid "OpenGL ES 3.0" @@ -10184,6 +10168,10 @@ msgid "" "Incompatible with older hardware\n" "Not recommended for web games" msgstr "" +"Høyere visuell kvalitet\n" +"All funksjonalitet tilgjengelig\n" +"Fungerer ikke med eldre maskinvare\n" +"Ikke anbefalt for nettsidebaserte spill" #: editor/project_manager.cpp msgid "OpenGL ES 2.0" @@ -10196,10 +10184,14 @@ msgid "" "Works on most hardware\n" "Recommended for web games" msgstr "" +"Lavere visuell kvalitet\n" +"Noe funksjonalitet er ikke tilgjengelig\n" +"Virker pÃ¥ det meste av maskinvare\n" +"Anbefalt for nettsidebaserte spill" #: editor/project_manager.cpp msgid "Renderer can be changed later, but scenes may need to be adjusted." -msgstr "" +msgstr "Rendrer kan endres senere, men scener mÃ¥ kanskje justeres." #: editor/project_manager.cpp msgid "Unnamed Project" @@ -10304,22 +10296,21 @@ msgid "" msgstr "" #: editor/project_manager.cpp -#, fuzzy msgid "" "Are you sure to scan %s folders for existing Godot projects?\n" "This could take a while." msgstr "" -"Du er i ferd med Ã¥ skanne %s mapper for eksisterende Godotprosjekter. " -"Bekrefter du?" +"Er du sikker pÃ¥ at du vil søke gjennom %s mapper etter eksisterende " +"Godotprosjekter.\n" +"Det kan ta en stund." #: editor/project_manager.cpp msgid "Project Manager" -msgstr "Prosjektleder" +msgstr "Prosjektstyring" #: editor/project_manager.cpp -#, fuzzy msgid "Projects" -msgstr "Prosjekt" +msgstr "Prosjekter" #: editor/project_manager.cpp msgid "Last Modified" @@ -10327,11 +10318,11 @@ msgstr "" #: editor/project_manager.cpp msgid "Scan" -msgstr "Skann" +msgstr "Gjennomsøk" #: editor/project_manager.cpp msgid "Select a Folder to Scan" -msgstr "Velg en Mappe Ã¥ Skanne" +msgstr "Velg en mappe Ã¥ søke gjennom" #: editor/project_manager.cpp msgid "New Project" @@ -10344,7 +10335,7 @@ msgstr "Fjern punkt" #: editor/project_manager.cpp msgid "Templates" -msgstr "" +msgstr "Maler" #: editor/project_manager.cpp msgid "Restart Now" @@ -10360,6 +10351,13 @@ msgid "" "Would you like to explore official example projects in the Asset Library?" msgstr "" +#: editor/project_manager.cpp +msgid "" +"The search box filters projects by name and last path component.\n" +"To filter projects by name and full path, the query must contain at least " +"one `/` character." +msgstr "" + #: editor/project_settings_editor.cpp msgid "Key " msgstr "" @@ -10402,15 +10400,15 @@ msgstr "" #: editor/project_settings_editor.cpp msgid "All Devices" -msgstr "" +msgstr "Alle enheter" #: editor/project_settings_editor.cpp msgid "Device" -msgstr "" +msgstr "Enhet" #: editor/project_settings_editor.cpp editor/settings_config_dialog.cpp msgid "Press a Key..." -msgstr "" +msgstr "Trykk en tast..." #: editor/project_settings_editor.cpp msgid "Mouse Button Index:" @@ -10418,15 +10416,15 @@ msgstr "" #: editor/project_settings_editor.cpp msgid "Left Button" -msgstr "" +msgstr "Venstre knapp" #: editor/project_settings_editor.cpp msgid "Right Button" -msgstr "" +msgstr "Høyre knapp" #: editor/project_settings_editor.cpp msgid "Middle Button" -msgstr "" +msgstr "Midtknapp" #: editor/project_settings_editor.cpp msgid "Wheel Up Button" @@ -10460,7 +10458,7 @@ msgstr "" #: editor/project_settings_editor.cpp msgid "Axis" -msgstr "" +msgstr "Akse" #: editor/project_settings_editor.cpp msgid "Joypad Button Index:" @@ -10477,23 +10475,23 @@ msgstr "" #: editor/project_settings_editor.cpp msgid "Add Event" -msgstr "" +msgstr "Legg til hendelse" #: editor/project_settings_editor.cpp msgid "Button" -msgstr "" +msgstr "Knapp" #: editor/project_settings_editor.cpp msgid "Left Button." -msgstr "" +msgstr "Venstre knapp." #: editor/project_settings_editor.cpp msgid "Right Button." -msgstr "" +msgstr "Høyre knapp." #: editor/project_settings_editor.cpp msgid "Middle Button." -msgstr "" +msgstr "Midtknapp." #: editor/project_settings_editor.cpp msgid "Wheel Up." @@ -10513,7 +10511,7 @@ msgstr "" #: editor/project_settings_editor.cpp msgid "No property '%s' exists." -msgstr "" +msgstr "Egenskapen «%s» eksisterer ikke." #: editor/project_settings_editor.cpp msgid "Setting '%s' is internal, and it can't be deleted." @@ -10553,11 +10551,11 @@ msgstr "" #: editor/project_settings_editor.cpp msgid "Add Translation" -msgstr "" +msgstr "Legg til oversettelse" #: editor/project_settings_editor.cpp msgid "Remove Translation" -msgstr "" +msgstr "Fjern oversettelse" #: editor/project_settings_editor.cpp msgid "Add Remapped Path" @@ -10597,7 +10595,7 @@ msgstr "Generelt" #: editor/project_settings_editor.cpp msgid "Override For..." -msgstr "" +msgstr "Overstyr for..." #: editor/project_settings_editor.cpp editor/settings_config_dialog.cpp msgid "The editor must be restarted for changes to take effect." @@ -10612,17 +10610,16 @@ msgid "Action:" msgstr "" #: editor/project_settings_editor.cpp -#, fuzzy msgid "Action" -msgstr "Flytt Handling" +msgstr "Handling" #: editor/project_settings_editor.cpp msgid "Deadzone" -msgstr "" +msgstr "Dødsone" #: editor/project_settings_editor.cpp msgid "Device:" -msgstr "" +msgstr "Enhet:" #: editor/project_settings_editor.cpp msgid "Index:" @@ -10634,11 +10631,11 @@ msgstr "" #: editor/project_settings_editor.cpp msgid "Translations" -msgstr "" +msgstr "Oversettelser" #: editor/project_settings_editor.cpp msgid "Translations:" -msgstr "" +msgstr "Oversettelser:" #: editor/project_settings_editor.cpp msgid "Remaps" @@ -10684,9 +10681,8 @@ msgid "AutoLoad" msgstr "" #: editor/project_settings_editor.cpp -#, fuzzy msgid "Plugins" -msgstr "Plugins" +msgstr "Innstikkmoduler" #: editor/property_editor.cpp #, fuzzy @@ -10707,7 +10703,7 @@ msgstr "" #: editor/property_editor.cpp msgid "File..." -msgstr "" +msgstr "Fil..." #: editor/property_editor.cpp msgid "Dir..." @@ -10715,12 +10711,11 @@ msgstr "" #: editor/property_editor.cpp msgid "Assign" -msgstr "" +msgstr "Tildel" #: editor/property_editor.cpp -#, fuzzy msgid "Select Node" -msgstr "Kutt Noder" +msgstr "Velg node" #: editor/property_editor.cpp msgid "Error loading file: Not a resource!" @@ -11031,9 +11026,8 @@ msgid "New Scene Root" msgstr "Lagre Scene" #: editor/scene_tree_dock.cpp -#, fuzzy msgid "Create Root Node:" -msgstr "Lag Node" +msgstr "Opprett rot-node:" #: editor/scene_tree_dock.cpp #, fuzzy @@ -11047,12 +11041,11 @@ msgstr "Scene" #: editor/scene_tree_dock.cpp msgid "User Interface" -msgstr "" +msgstr "Brukergrensesnitt" #: editor/scene_tree_dock.cpp -#, fuzzy msgid "Other Node" -msgstr "Kutt Noder" +msgstr "Andre noder" #: editor/scene_tree_dock.cpp msgid "Can't operate on nodes from a foreign scene!" @@ -11161,6 +11154,8 @@ msgid "" "Instance a scene file as a Node. Creates an inherited scene if no root node " "exists." msgstr "" +"Opprett en scenefil som en node. Oppretter en arvet scene hvis det ikke " +"finnes en rot-node." #: editor/scene_tree_dock.cpp msgid "Attach a new or existing script for the selected node." @@ -11381,6 +11376,12 @@ msgid "Script file already exists." msgstr "Eksisterer allerede" #: editor/script_create_dialog.cpp +msgid "" +"Note: Built-in scripts have some limitations and can't be edited using an " +"external editor." +msgstr "" + +#: editor/script_create_dialog.cpp #, fuzzy msgid "Class Name:" msgstr "Klasse:" @@ -11487,9 +11488,8 @@ msgid "Profiler" msgstr "" #: editor/script_editor_debugger.cpp -#, fuzzy msgid "Network Profiler" -msgstr "Eksporter Prosjekt" +msgstr "" #: editor/script_editor_debugger.cpp msgid "Monitor" @@ -11516,6 +11516,11 @@ msgid "Total:" msgstr "" #: editor/script_editor_debugger.cpp +#, fuzzy +msgid "Export list to a CSV file" +msgstr "Eksporter Prosjekt" + +#: editor/script_editor_debugger.cpp msgid "Resource Path" msgstr "" @@ -12209,11 +12214,11 @@ msgstr "Endre CanvasItem" #: modules/visual_script/visual_script_editor.cpp msgid "Can't copy the function node." -msgstr "" +msgstr "Kan ikke kopiere funksjonsnoden." #: modules/visual_script/visual_script_editor.cpp msgid "Clipboard is empty!" -msgstr "" +msgstr "Utklippsbordet er tomt!" #: modules/visual_script/visual_script_editor.cpp #, fuzzy @@ -13084,6 +13089,10 @@ msgid "" "texture to some node for display." msgstr "" +#: scene/main/viewport.cpp +msgid "Viewport size must be greater than 0 to render anything." +msgstr "" + #: scene/resources/visual_shader_nodes.cpp #, fuzzy msgid "Invalid source for preview." @@ -13114,6 +13123,9 @@ msgstr "" msgid "Constants cannot be modified." msgstr "Konstanter kan ikke endres." +#~ msgid "Issue Tracker" +#~ msgstr "Problemtracker" + #~ msgid "Replaced %d occurrence(s)." #~ msgstr "Erstattet %d forekomst(er)." diff --git a/editor/translations/nl.po b/editor/translations/nl.po index a729ea6119..ba11dc0dad 100644 --- a/editor/translations/nl.po +++ b/editor/translations/nl.po @@ -4,7 +4,7 @@ # This file is distributed under the same license as the Godot source code. # aelspire <aelspire@gmail.com>, 2017. # Aram Nap <xyphex.aram@gmail.com>, 2017. -# Arjan219 <arjannugteren1@gmail.com>, 2017-2018. +# Arjan219 <arjannugteren1@gmail.com>, 2017-2018, 2020. # Christophe Swolfs <swolfschristophe@gmail.com>, 2017. # Cornee Traas <corneetraas@hotmail.com>, 2017. # Daeran Wereld <daeran@gmail.com>, 2017. @@ -44,7 +44,7 @@ msgid "" msgstr "" "Project-Id-Version: Godot Engine editor\n" "POT-Creation-Date: \n" -"PO-Revision-Date: 2020-03-16 09:43+0000\n" +"PO-Revision-Date: 2020-04-23 20:21+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-dev\n" +"X-Generator: Weblate 4.0.2-dev\n" #: core/math/expression.cpp modules/gdscript/gdscript_functions.cpp #: modules/visual_script/visual_script_builtin_funcs.cpp @@ -68,7 +68,7 @@ msgstr "Tekenreeks met lengte 1 verwacht (één karakter)." #: modules/mono/glue/gd_glue.cpp #: modules/visual_script/visual_script_builtin_funcs.cpp msgid "Not enough bytes for decoding bytes, or invalid format." -msgstr "Niet genoeg bytes om bytes te decoderen, of ongeldig formaat." +msgstr "Niet genoeg bytes om te decoderen, of ongeldig formaat." #: core/math/expression.cpp msgid "Invalid input %i (not passed) in expression" @@ -661,7 +661,7 @@ msgstr "Alle animaties opruimen" #: editor/animation_track_editor.cpp msgid "Clean-Up Animation(s) (NO UNDO!)" -msgstr "Animatie(s) Opruimen (KAN NIET ONGEDAAN WORDEN!)" +msgstr "Animatie(s) opruimen (ONOMKEERBAAR!)" #: editor/animation_track_editor.cpp msgid "Clean-Up" @@ -694,11 +694,11 @@ msgstr "Voeg audiospoor clip toe" #: editor/animation_track_editor_plugins.cpp msgid "Change Audio Track Clip Start Offset" -msgstr "Wijzig start afwijking van audiospoorclip" +msgstr "Wijzig startverschuiving van audiospoorclip" #: editor/animation_track_editor_plugins.cpp msgid "Change Audio Track Clip End Offset" -msgstr "Wijzig eind afwijking van audiospoorclip" +msgstr "Wijzig eindverschuiving van audiospoorclip" #: editor/array_property_edit.cpp msgid "Resize Array" @@ -722,7 +722,7 @@ msgstr "Regelnummer:" #: editor/code_editor.cpp msgid "%d replaced." -msgstr "%d vervangen." +msgstr "%d vervangingen." #: editor/code_editor.cpp editor/editor_help.cpp msgid "%d match." @@ -746,7 +746,7 @@ msgstr "Vervangen" #: editor/code_editor.cpp msgid "Replace All" -msgstr "Alle Vervangen" +msgstr "Alles vervangen" #: editor/code_editor.cpp msgid "Selection Only" @@ -1070,7 +1070,7 @@ msgid "" msgstr "" "De bestanden die verwijderd worden zijn nodig om andere bronnen te laten " "werken.\n" -"Toch verwijderen? (Kan niet ongedaan worden)" +"Toch verwijderen? (Onomkeerbaar)" #: editor/dependency_editor.cpp msgid "Cannot remove:" @@ -1102,7 +1102,7 @@ msgstr "Fouten bij het laden!" #: editor/dependency_editor.cpp msgid "Permanently delete %d item(s)? (No undo!)" -msgstr "%d bestand(en) voorgoed verwijderen? (Kan niet ongedaan worden!)" +msgstr "%d bestand(en) voorgoed verwijderen? (Onomkeerbaar!)" #: editor/dependency_editor.cpp msgid "Show Dependencies" @@ -1466,7 +1466,7 @@ msgstr "Autoload '%s' bestaat al!" #: editor/editor_autoload_settings.cpp msgid "Rename Autoload" -msgstr "Autoload Hernoemen" +msgstr "Naam Autoload-script wijzigen" #: editor/editor_autoload_settings.cpp msgid "Toggle AutoLoad Globals" @@ -1480,7 +1480,7 @@ msgstr "Autoload verplaatsen" msgid "Remove Autoload" msgstr "Autoload verwijderen" -#: editor/editor_autoload_settings.cpp +#: editor/editor_autoload_settings.cpp editor/editor_plugin_settings.cpp msgid "Enable" msgstr "Inschakelen" @@ -1605,7 +1605,7 @@ msgid "" "'Import Etc 2' in Project Settings." msgstr "" "Doelplatform vereist 'ETC2' textuurcompressie voor GLES3. Schakel 'Import " -"Etc 2' in bij de Projectinstellingen." +"Etc 2' in de Projectinstellingen in." #: editor/editor_export.cpp msgid "" @@ -1669,7 +1669,7 @@ msgstr "Bestandssysteem- en Importtablad" #: editor/editor_feature_profile.cpp msgid "Erase profile '%s'? (no undo)" -msgstr "Profiel '%s' verwijderen? (kan niet ongedaan gemaakt worden)" +msgstr "Profiel '%s' verwijderen? (Onomkeerbaar)" #: editor/editor_feature_profile.cpp msgid "Profile must be a valid filename and must not contain '.'" @@ -1748,7 +1748,7 @@ msgstr "Nieuw" #: editor/editor_feature_profile.cpp editor/editor_node.cpp #: editor/project_manager.cpp msgid "Import" -msgstr "Import" +msgstr "Importeren" #: editor/editor_feature_profile.cpp editor/project_export.cpp msgid "Export" @@ -2386,7 +2386,7 @@ msgstr "Basisscène openen" #: editor/editor_node.cpp msgid "Quick Open..." -msgstr "Snel Openen..." +msgstr "Snel openen..." #: editor/editor_node.cpp msgid "Quick Open Scene..." @@ -2394,7 +2394,7 @@ msgstr "Scène snel openen..." #: editor/editor_node.cpp msgid "Quick Open Script..." -msgstr "Open Script Snel..." +msgstr "Script snel openen..." #: editor/editor_node.cpp msgid "Save & Close" @@ -2463,7 +2463,8 @@ msgstr "Herstellen" #: editor/editor_node.cpp msgid "This action cannot be undone. Revert anyway?" -msgstr "Deze actie kan niet ongedaan gemaakt worden. Toch herstellen?" +msgstr "" +"Deze actie kan niet ongedaan gemaakt worden. WIlt u desondanks terugzetten?" #: editor/editor_node.cpp msgid "Quick Run Scene..." @@ -2742,7 +2743,7 @@ msgstr "TileSet..." #: editor/editor_node.cpp editor/plugins/script_text_editor.cpp #: scene/gui/line_edit.cpp scene/gui/text_edit.cpp msgid "Undo" -msgstr "Ongedaan Maken" +msgstr "Ongedaan maken" #: editor/editor_node.cpp editor/plugins/script_text_editor.cpp #: scene/gui/line_edit.cpp scene/gui/text_edit.cpp @@ -2796,7 +2797,7 @@ msgstr "Hulpmiddelen" #: editor/editor_node.cpp msgid "Orphan Resource Explorer..." -msgstr "Verweesde hulpbronnen verkenner..." +msgstr "Beheer ongebruikte bronnen..." #: editor/editor_node.cpp msgid "Quit to Project List" @@ -2917,7 +2918,7 @@ msgstr "Schermafbeeldingen worden bewaard in de map \"Editor Data/Settings\"." #: editor/editor_node.cpp msgid "Toggle Fullscreen" -msgstr "Schakel Volledig Scherm" +msgstr "Volledig scherm" #: editor/editor_node.cpp msgid "Toggle System Console" @@ -2966,8 +2967,12 @@ msgid "Q&A" msgstr "Vragen en antwoorden" #: editor/editor_node.cpp -msgid "Issue Tracker" -msgstr "Issue Tracker" +msgid "Report a Bug" +msgstr "Meld een probleem" + +#: editor/editor_node.cpp +msgid "Send Docs Feedback" +msgstr "Suggesties voor documentatie verzenden" #: editor/editor_node.cpp editor/plugins/asset_library_editor_plugin.cpp msgid "Community" @@ -3641,7 +3646,7 @@ msgstr "" #: editor/filesystem_dock.cpp msgid "Cannot move/rename resources root." -msgstr "Kan de hoofdmap voor bronnen niet verplaatsen of hernoemen." +msgstr "Kan de hoofdmap voor bronnen niet verplaatsen of van naam veranderen." #: editor/filesystem_dock.cpp msgid "Cannot move a folder into itself." @@ -3677,11 +3682,11 @@ msgstr "Naam bevat ongeldige tekens." #: editor/filesystem_dock.cpp msgid "Renaming file:" -msgstr "Bestandsnaam wijzigen:" +msgstr "Bestand hernoemen:" #: editor/filesystem_dock.cpp msgid "Renaming folder:" -msgstr "Hernoemen folder:" +msgstr "Mapnaam wijzigen:" #: editor/filesystem_dock.cpp msgid "Duplicating file:" @@ -3762,7 +3767,7 @@ msgstr "Alles inklappen" #: editor/project_manager.cpp editor/rename_dialog.cpp #: editor/scene_tree_dock.cpp msgid "Rename" -msgstr "Hernoemen" +msgstr "Naam wijzigen" #: editor/filesystem_dock.cpp msgid "Previous Folder/File" @@ -3859,7 +3864,7 @@ msgstr "Vervangen: " #: editor/find_in_files.cpp msgid "Replace all (no undo)" -msgstr "Alle vervangen (geen ongedaan maken)" +msgstr "Alles vervangen (onomkeerbaar)" #: editor/find_in_files.cpp msgid "Searching..." @@ -4024,8 +4029,8 @@ msgid "Reimport" msgstr "Opnieuw importeren" #: editor/import_dock.cpp -msgid "Save scenes, re-import and restart" -msgstr "Opnieuw importeren en herstarten (alle scènes worden opgeslagen)" +msgid "Save Scenes, Re-Import, and Restart" +msgstr "Sla scènes op, importeer opnieuw en start dan opnieuw op" #: editor/import_dock.cpp msgid "Changing the type of an imported file requires editor restart." @@ -4075,7 +4080,7 @@ msgstr "Integreer" #: editor/inspector_dock.cpp msgid "Make Sub-Resources Unique" -msgstr "Maak Onderliggende Bronnen Uniek" +msgstr "Onderliggende bronnen zelfstandig maken" #: editor/inspector_dock.cpp msgid "Open in Help" @@ -5885,7 +5890,7 @@ msgstr "Mesh is leeg!" #: editor/plugins/mesh_instance_editor_plugin.cpp msgid "Couldn't create a Trimesh collision shape." -msgstr "Kon geen Trimesh-botsingsvorm maken." +msgstr "Kan geen Trimesh-botsingsvorm maken." #: editor/plugins/mesh_instance_editor_plugin.cpp msgid "Create Static Trimesh Body" @@ -5997,9 +6002,8 @@ msgstr "" "Dit is de meest preciese (maar langzaamste) optie voor botsingsberekeningen." #: editor/plugins/mesh_instance_editor_plugin.cpp -#, fuzzy msgid "Create Single Convex Collision Sibling" -msgstr "Een enkele convexe botsingsonderelement aanmaken" +msgstr "Maak een enkel convex botsingselement als subelement" #: editor/plugins/mesh_instance_editor_plugin.cpp msgid "" @@ -6888,14 +6892,6 @@ msgid "Open Godot online documentation." msgstr "Open Godot online documentatie." #: editor/plugins/script_editor_plugin.cpp -msgid "Request Docs" -msgstr "Verzoek documentatie" - -#: editor/plugins/script_editor_plugin.cpp -msgid "Help improve the Godot documentation by giving feedback." -msgstr "Help de Godot-documentatie te verbeteren door feedback te geven." - -#: editor/plugins/script_editor_plugin.cpp msgid "Search the reference documentation." msgstr "Zoek in de referentie documentatie." @@ -7330,6 +7326,10 @@ msgid "This operation requires a single selected node." msgstr "Deze bewerking vereist één geselecteerde knoop." #: editor/plugins/spatial_editor_plugin.cpp +msgid "Auto Orthogonal Enabled" +msgstr "Auto-orthogonaal ingeschakeld" + +#: editor/plugins/spatial_editor_plugin.cpp msgid "Lock View Rotation" msgstr "Beeldrotatie vergrendelen" @@ -7418,6 +7418,10 @@ msgid "Freelook Slow Modifier" msgstr "Vrijekijk Snelheid Modificator" #: editor/plugins/spatial_editor_plugin.cpp +msgid "View Rotation Locked" +msgstr "Beeldrotatie vergrendeld" + +#: editor/plugins/spatial_editor_plugin.cpp msgid "" "Note: The FPS value displayed is the editor's framerate.\n" "It cannot be used as a reliable indication of in-game performance." @@ -7427,10 +7431,6 @@ msgstr "" "Het is geen betrouwbare indicatie voor werkelijke spelprestaties." #: editor/plugins/spatial_editor_plugin.cpp -msgid "View Rotation Locked" -msgstr "Beeldrotatie vergrendeld" - -#: editor/plugins/spatial_editor_plugin.cpp msgid "XForm Dialog" msgstr "XForm Dialoog" @@ -7580,7 +7580,7 @@ msgstr "Beeldvensterinstellingen" #: editor/plugins/spatial_editor_plugin.cpp msgid "Perspective FOV (deg.):" -msgstr "Perspectief FOV (grad.):" +msgstr "Gezichtsveld (graden):" #: editor/plugins/spatial_editor_plugin.cpp msgid "View Z-Near:" @@ -7871,7 +7871,7 @@ msgstr "Stap:" #: editor/plugins/texture_region_editor_plugin.cpp msgid "Sep.:" -msgstr "Separatie:" +msgstr "Scheiding:" #: editor/plugins/texture_region_editor_plugin.cpp msgid "TextureRegion" @@ -8169,7 +8169,7 @@ msgstr "Selecteer de vorige shape, subtegel of Tegel." #: editor/plugins/tile_set_editor_plugin.cpp msgid "Region" -msgstr "Bereik" +msgstr "Gebied" #: editor/plugins/tile_set_editor_plugin.cpp msgid "Collision" @@ -8197,7 +8197,7 @@ msgstr "Z Index" #: editor/plugins/tile_set_editor_plugin.cpp msgid "Region Mode" -msgstr "Bereikmodus" +msgstr "Gebiedmodus" #: editor/plugins/tile_set_editor_plugin.cpp msgid "Collision Mode" @@ -8249,7 +8249,7 @@ msgstr "Nieuwe veelhoek aanmaken." #: editor/plugins/tile_set_editor_plugin.cpp msgid "Keep polygon inside region Rect." -msgstr "Hou de veelhoek binnen een rechthoekig bereik." +msgstr "Houd de veelhoek binnen het rechthoekige gebied." #: editor/plugins/tile_set_editor_plugin.cpp msgid "Enable snap and show grid (configurable via the Inspector)." @@ -9877,7 +9877,7 @@ msgid "" "The project folders' contents won't be modified." msgstr "" "%d projecten uit de lijst verwijderen?\n" -"De inhoud van de projectmappen wordt niet geraakt." +"De inhoud van de projectmappen wordt niet gewijzigd." #: editor/project_manager.cpp msgid "" @@ -9885,7 +9885,7 @@ msgid "" "The project folder's contents won't be modified." msgstr "" "Project uit de lijst verwijderen?\n" -"De inhoud van de projectmap wordt niet geraakt." +"De inhoud van de projectmap wordt niet gewijzigd." #: editor/project_manager.cpp msgid "" @@ -9960,6 +9960,13 @@ msgstr "" "U heeft momenteel geen projecten.\n" "Wilt u de officiële voorbeeldprojecten verkennen in de Asset Library?" +#: editor/project_manager.cpp +msgid "" +"The search box filters projects by name and last path component.\n" +"To filter projects by name and full path, the query must contain at least " +"one `/` character." +msgstr "" + #: editor/project_settings_editor.cpp msgid "Key " msgstr "Toets " @@ -10338,7 +10345,7 @@ msgstr "Selecteer Method" #: editor/rename_dialog.cpp editor/scene_tree_dock.cpp msgid "Batch Rename" -msgstr "Hernoemen meerdere" +msgstr "Bulk hernoemen" #: editor/rename_dialog.cpp msgid "Prefix" @@ -10647,7 +10654,7 @@ msgstr "Kan niet werken aan knopen waar de huidige scène van erft!" #: editor/scene_tree_dock.cpp msgid "Attach Script" -msgstr "Verbind Script" +msgstr "Script toevoegen" #: editor/scene_tree_dock.cpp msgid "Remove Node(s)" @@ -10950,6 +10957,14 @@ msgid "Script file already exists." msgstr "Scriptbestand bestaat al." #: editor/script_create_dialog.cpp +msgid "" +"Note: Built-in scripts have some limitations and can't be edited using an " +"external editor." +msgstr "" +"Merk op: Ingebouwde scripten zijn onderhevig aan bepaalde beperkingen en " +"kunnen niet in een externe editor bewerkt worden." + +#: editor/script_create_dialog.cpp msgid "Class Name:" msgstr "Klasse Naam:" @@ -11070,6 +11085,11 @@ msgid "Total:" msgstr "Totaal:" #: editor/script_editor_debugger.cpp +#, fuzzy +msgid "Export list to a CSV file" +msgstr "Profiel exporteren" + +#: editor/script_editor_debugger.cpp msgid "Resource Path" msgstr "Bronpad" @@ -12733,6 +12753,11 @@ msgstr "" "maken, zodat het een grootte kan ontvangen. Anders, maak er een RenderTarget " "van en wijs zijn interne textuur toe aan een knoop om te tonen." +#: scene/main/viewport.cpp +msgid "Viewport size must be greater than 0 to render anything." +msgstr "" +"De grootte van een Viewport moet groter zijn dan 0 om iets weer te geven." + #: scene/resources/visual_shader_nodes.cpp msgid "Invalid source for preview." msgstr "Ongeldige bron voor voorvertoning." @@ -12761,6 +12786,15 @@ msgstr "Varyings kunnen alleen worden toegewezenin vertex functies." msgid "Constants cannot be modified." msgstr "Constanten kunnen niet worden aangepast." +#~ msgid "Issue Tracker" +#~ msgstr "Issue Tracker" + +#~ msgid "Request Docs" +#~ msgstr "Verzoek documentatie" + +#~ msgid "Help improve the Godot documentation by giving feedback." +#~ msgstr "Help de Godot-documentatie te verbeteren door feedback te geven." + #~ msgid "Replaced %d occurrence(s)." #~ msgstr "%d voorgekomen waarde(s) vervangen." diff --git a/editor/translations/or.po b/editor/translations/or.po index 6819e53f38..2ce05efe5d 100644 --- a/editor/translations/or.po +++ b/editor/translations/or.po @@ -1405,7 +1405,7 @@ msgstr "" msgid "Remove Autoload" msgstr "" -#: editor/editor_autoload_settings.cpp +#: editor/editor_autoload_settings.cpp editor/editor_plugin_settings.cpp msgid "Enable" msgstr "" @@ -2808,7 +2808,11 @@ msgid "Q&A" msgstr "" #: editor/editor_node.cpp -msgid "Issue Tracker" +msgid "Report a Bug" +msgstr "" + +#: editor/editor_node.cpp +msgid "Send Docs Feedback" msgstr "" #: editor/editor_node.cpp editor/plugins/asset_library_editor_plugin.cpp @@ -3829,7 +3833,7 @@ msgid "Reimport" msgstr "" #: editor/import_dock.cpp -msgid "Save scenes, re-import and restart" +msgid "Save Scenes, Re-Import, and Restart" msgstr "" #: editor/import_dock.cpp @@ -6611,14 +6615,6 @@ msgid "Open Godot online documentation." msgstr "" #: editor/plugins/script_editor_plugin.cpp -msgid "Request Docs" -msgstr "" - -#: editor/plugins/script_editor_plugin.cpp -msgid "Help improve the Godot documentation by giving feedback." -msgstr "" - -#: editor/plugins/script_editor_plugin.cpp msgid "Search the reference documentation." msgstr "" @@ -7048,6 +7044,10 @@ msgid "This operation requires a single selected node." msgstr "" #: editor/plugins/spatial_editor_plugin.cpp +msgid "Auto Orthogonal Enabled" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp msgid "Lock View Rotation" msgstr "" @@ -7136,13 +7136,13 @@ msgid "Freelook Slow Modifier" msgstr "" #: editor/plugins/spatial_editor_plugin.cpp -msgid "" -"Note: The FPS value displayed is the editor's framerate.\n" -"It cannot be used as a reliable indication of in-game performance." +msgid "View Rotation Locked" msgstr "" #: editor/plugins/spatial_editor_plugin.cpp -msgid "View Rotation Locked" +msgid "" +"Note: The FPS value displayed is the editor's framerate.\n" +"It cannot be used as a reliable indication of in-game performance." msgstr "" #: editor/plugins/spatial_editor_plugin.cpp @@ -9505,6 +9505,13 @@ msgid "" "Would you like to explore official example projects in the Asset Library?" msgstr "" +#: editor/project_manager.cpp +msgid "" +"The search box filters projects by name and last path component.\n" +"To filter projects by name and full path, the query must contain at least " +"one `/` character." +msgstr "" + #: editor/project_settings_editor.cpp msgid "Key " msgstr "" @@ -10460,6 +10467,12 @@ msgid "Script file already exists." msgstr "" #: editor/script_create_dialog.cpp +msgid "" +"Note: Built-in scripts have some limitations and can't be edited using an " +"external editor." +msgstr "" + +#: editor/script_create_dialog.cpp msgid "Class Name:" msgstr "" @@ -10580,6 +10593,10 @@ msgid "Total:" msgstr "" #: editor/script_editor_debugger.cpp +msgid "Export list to a CSV file" +msgstr "" + +#: editor/script_editor_debugger.cpp msgid "Resource Path" msgstr "" @@ -12073,6 +12090,10 @@ msgid "" "texture to some node for display." msgstr "" +#: scene/main/viewport.cpp +msgid "Viewport size must be greater than 0 to render anything." +msgstr "" + #: scene/resources/visual_shader_nodes.cpp msgid "Invalid source for preview." msgstr "" diff --git a/editor/translations/pl.po b/editor/translations/pl.po index de1d6d5375..eb84ea26ca 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-03-16 09:43+0000\n" +"PO-Revision-Date: 2020-04-27 08:25+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-dev\n" +"X-Generator: Weblate 4.0.2-dev\n" #: core/math/expression.cpp modules/gdscript/gdscript_functions.cpp #: modules/visual_script/visual_script_builtin_funcs.cpp @@ -1474,7 +1474,7 @@ msgstr "Przemieść Autoload" msgid "Remove Autoload" msgstr "UsuÅ„ Autoload" -#: editor/editor_autoload_settings.cpp +#: editor/editor_autoload_settings.cpp editor/editor_plugin_settings.cpp msgid "Enable" msgstr "Włącz" @@ -2952,8 +2952,12 @@ msgid "Q&A" msgstr "Pytania i odpowiedzi" #: editor/editor_node.cpp -msgid "Issue Tracker" -msgstr "Lista problemów" +msgid "Report a Bug" +msgstr "ZgÅ‚oÅ› błąd" + +#: editor/editor_node.cpp +msgid "Send Docs Feedback" +msgstr "WyÅ›lij opiniÄ™ o dokumentacji" #: editor/editor_node.cpp editor/plugins/asset_library_editor_plugin.cpp msgid "Community" @@ -4008,8 +4012,8 @@ msgid "Reimport" msgstr "Importuj ponownie" #: editor/import_dock.cpp -msgid "Save scenes, re-import and restart" -msgstr "Zapisz sceny, re-importuj i zrestartuj" +msgid "Save Scenes, Re-Import, and Restart" +msgstr "Zapisz sceny, reimportuj i uruchom ponownie" #: editor/import_dock.cpp msgid "Changing the type of an imported file requires editor restart." @@ -5395,7 +5399,7 @@ msgstr "Alt+PrzeciÄ…gnij: PrzesuÅ„" #: editor/plugins/canvas_item_editor_plugin.cpp msgid "Press 'v' to Change Pivot, 'Shift+v' to Drag Pivot (while moving)." msgstr "" -"WciÅ›nij \"v\" by zmienić punkt zaczepienia (pivot), \"Shift+v\" by przesunąć " +"WciÅ›nij \"V\" by zmienić punkt zaczepienia (pivot), \"Shift+V\" by przesunąć " "punkt zaczepienia (podczas poruszania)." #: editor/plugins/canvas_item_editor_plugin.cpp @@ -6867,14 +6871,6 @@ msgid "Open Godot online documentation." msgstr "Otwórz dokumentacjÄ™ Godota online." #: editor/plugins/script_editor_plugin.cpp -msgid "Request Docs" -msgstr "PoproÅ› o dokumentacjÄ™" - -#: editor/plugins/script_editor_plugin.cpp -msgid "Help improve the Godot documentation by giving feedback." -msgstr "Pomóż polepszyć dokumentacjÄ™ Godota przesyÅ‚ajÄ…c opiniÄ™." - -#: editor/plugins/script_editor_plugin.cpp msgid "Search the reference documentation." msgstr "Poszukaj w dokumentacji referencyjnej." @@ -7311,6 +7307,10 @@ msgid "This operation requires a single selected node." msgstr "Ta operacja wymaga pojedynczego wybranego wÄ™zÅ‚a." #: editor/plugins/spatial_editor_plugin.cpp +msgid "Auto Orthogonal Enabled" +msgstr "Automatyczna ortogonalizacja włączona" + +#: editor/plugins/spatial_editor_plugin.cpp msgid "Lock View Rotation" msgstr "Zablokuj obrót widoku" @@ -7399,6 +7399,10 @@ msgid "Freelook Slow Modifier" msgstr "Wolny modyfikator swobodnego widoku" #: editor/plugins/spatial_editor_plugin.cpp +msgid "View Rotation Locked" +msgstr "Obroty widoku zablokowane" + +#: editor/plugins/spatial_editor_plugin.cpp msgid "" "Note: The FPS value displayed is the editor's framerate.\n" "It cannot be used as a reliable indication of in-game performance." @@ -7407,10 +7411,6 @@ msgstr "" "Nie może być używana jako miarodajny wskaźnik wydajnoÅ›ci w grze." #: editor/plugins/spatial_editor_plugin.cpp -msgid "View Rotation Locked" -msgstr "Obroty widoku zablokowane" - -#: editor/plugins/spatial_editor_plugin.cpp msgid "XForm Dialog" msgstr "Okno dialogowe XForm" @@ -8040,7 +8040,7 @@ msgstr "WypeÅ‚nienie" #: editor/plugins/tile_map_editor_plugin.cpp msgid "Erase TileMap" -msgstr "Wyczyść TileMap" +msgstr "UsuÅ„ TileMap" #: editor/plugins/tile_map_editor_plugin.cpp msgid "Find Tile" @@ -9927,6 +9927,13 @@ msgstr "" "Nie posiadasz obecnie żadnych projektów.\n" "Czy chcesz zobaczyć oficjalne przykÅ‚adowe projekty w Bibliotece Zasobów?" +#: editor/project_manager.cpp +msgid "" +"The search box filters projects by name and last path component.\n" +"To filter projects by name and full path, the query must contain at least " +"one `/` character." +msgstr "" + #: editor/project_settings_editor.cpp msgid "Key " msgstr "Klawisz " @@ -10914,6 +10921,14 @@ msgid "Script file already exists." msgstr "Plik skryptu już istnieje." #: editor/script_create_dialog.cpp +msgid "" +"Note: Built-in scripts have some limitations and can't be edited using an " +"external editor." +msgstr "" +"Uwaga: wbudowane skrypty posiadajÄ… pewne ograniczenia i nie mogÄ… być " +"edytowane przy użyciu zewnÄ™trznego edytora." + +#: editor/script_create_dialog.cpp msgid "Class Name:" msgstr "Nazwa klasy:" @@ -11034,6 +11049,11 @@ msgid "Total:" msgstr "CaÅ‚kowity:" #: editor/script_editor_debugger.cpp +#, fuzzy +msgid "Export list to a CSV file" +msgstr "Eksportuj profil" + +#: editor/script_editor_debugger.cpp msgid "Resource Path" msgstr "Åšcieżka zasobu" @@ -12697,6 +12717,10 @@ msgstr "" "otrzymaÅ‚ jakiÅ› rozmiar. W przeciwnym wypadku ustawi opcjÄ™ RenderTarget i " "przyporzÄ…dkuj jego teksturÄ™ dla któregoÅ› wÄ™zÅ‚a." +#: scene/main/viewport.cpp +msgid "Viewport size must be greater than 0 to render anything." +msgstr "Rozmiar wÄ™zÅ‚a Viewport musi być wiÄ™kszy niż 0, by coÅ› wyrenderować." + #: scene/resources/visual_shader_nodes.cpp msgid "Invalid source for preview." msgstr "NieprawidÅ‚owe źródÅ‚o do podglÄ…du." @@ -12725,6 +12749,15 @@ msgstr "Varying może być przypisane tylko w funkcji wierzchoÅ‚ków." msgid "Constants cannot be modified." msgstr "StaÅ‚e nie mogÄ… być modyfikowane." +#~ msgid "Issue Tracker" +#~ msgstr "Lista problemów" + +#~ msgid "Request Docs" +#~ msgstr "PoproÅ› o dokumentacjÄ™" + +#~ msgid "Help improve the Godot documentation by giving feedback." +#~ msgstr "Pomóż polepszyć dokumentacjÄ™ Godota przesyÅ‚ajÄ…c opiniÄ™." + #~ msgid "Replaced %d occurrence(s)." #~ msgstr "ZastÄ…piono %d wystÄ…pieÅ„." diff --git a/editor/translations/pr.po b/editor/translations/pr.po index 873a2d506b..646d14c2cf 100644 --- a/editor/translations/pr.po +++ b/editor/translations/pr.po @@ -1453,7 +1453,7 @@ msgstr "" msgid "Remove Autoload" msgstr "" -#: editor/editor_autoload_settings.cpp +#: editor/editor_autoload_settings.cpp editor/editor_plugin_settings.cpp msgid "Enable" msgstr "" @@ -2897,7 +2897,11 @@ msgid "Q&A" msgstr "" #: editor/editor_node.cpp -msgid "Issue Tracker" +msgid "Report a Bug" +msgstr "" + +#: editor/editor_node.cpp +msgid "Send Docs Feedback" msgstr "" #: editor/editor_node.cpp editor/plugins/asset_library_editor_plugin.cpp @@ -3956,7 +3960,7 @@ msgid "Reimport" msgstr "" #: editor/import_dock.cpp -msgid "Save scenes, re-import and restart" +msgid "Save Scenes, Re-Import, and Restart" msgstr "" #: editor/import_dock.cpp @@ -6823,14 +6827,6 @@ msgid "Open Godot online documentation." msgstr "Yer functions:" #: editor/plugins/script_editor_plugin.cpp -msgid "Request Docs" -msgstr "" - -#: editor/plugins/script_editor_plugin.cpp -msgid "Help improve the Godot documentation by giving feedback." -msgstr "" - -#: editor/plugins/script_editor_plugin.cpp msgid "Search the reference documentation." msgstr "" @@ -7277,6 +7273,10 @@ msgid "This operation requires a single selected node." msgstr "" #: editor/plugins/spatial_editor_plugin.cpp +msgid "Auto Orthogonal Enabled" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp msgid "Lock View Rotation" msgstr "" @@ -7366,13 +7366,13 @@ msgid "Freelook Slow Modifier" msgstr "" #: editor/plugins/spatial_editor_plugin.cpp -msgid "" -"Note: The FPS value displayed is the editor's framerate.\n" -"It cannot be used as a reliable indication of in-game performance." +msgid "View Rotation Locked" msgstr "" #: editor/plugins/spatial_editor_plugin.cpp -msgid "View Rotation Locked" +msgid "" +"Note: The FPS value displayed is the editor's framerate.\n" +"It cannot be used as a reliable indication of in-game performance." msgstr "" #: editor/plugins/spatial_editor_plugin.cpp @@ -9829,6 +9829,13 @@ msgid "" "Would you like to explore official example projects in the Asset Library?" msgstr "" +#: editor/project_manager.cpp +msgid "" +"The search box filters projects by name and last path component.\n" +"To filter projects by name and full path, the query must contain at least " +"one `/` character." +msgstr "" + #: editor/project_settings_editor.cpp msgid "Key " msgstr "" @@ -10812,6 +10819,12 @@ msgid "Script file already exists." msgstr "" #: editor/script_create_dialog.cpp +msgid "" +"Note: Built-in scripts have some limitations and can't be edited using an " +"external editor." +msgstr "" + +#: editor/script_create_dialog.cpp msgid "Class Name:" msgstr "" @@ -10942,6 +10955,10 @@ msgid "Total:" msgstr "" #: editor/script_editor_debugger.cpp +msgid "Export list to a CSV file" +msgstr "" + +#: editor/script_editor_debugger.cpp msgid "Resource Path" msgstr "" @@ -12501,6 +12518,10 @@ msgid "" "texture to some node for display." msgstr "" +#: scene/main/viewport.cpp +msgid "Viewport size must be greater than 0 to render anything." +msgstr "" + #: scene/resources/visual_shader_nodes.cpp #, fuzzy msgid "Invalid source for preview." diff --git a/editor/translations/pt_BR.po b/editor/translations/pt_BR.po index a96186e434..b7102a7cdf 100644 --- a/editor/translations/pt_BR.po +++ b/editor/translations/pt_BR.po @@ -12,7 +12,7 @@ # Guilherme Felipe C G Silva <guilhermefelipecgs@gmail.com>, 2017, 2018, 2019. # João Victor Lima <victordevtb@outlook.com>, 2018. # João Vitor de Oliveira Carlos <lopogax@gmail.com>, 2018. -# Joaquim Ferreira <joaquimferreira1996@bol.com.br>, 2016, 2019. +# Joaquim Ferreira <joaquimferreira1996@bol.com.br>, 2016, 2019, 2020. # jonathan railarem <railarem@gmail.com>, 2017. # Lucas Silva <lucasb.hpp@gmail.com>, 2018. # Luiz G. Correia <luizgabriell2.0@gmail.com>, 2017. @@ -28,7 +28,7 @@ # Michel G. Souza <Michelgomesdes@hotmail.com>, 2018. # Caio Northfleet <caio.northfleet@gmail.com>, 2018. # Henrique Combochi <henrique.combochi@gmail.com>, 2018, 2019. -# Gabriel Carvalho <billlmaster@gmail.com>, 2018, 2019. +# Gabriel Carvalho <billlmaster@gmail.com>, 2018, 2019, 2020. # miketangogamer <miketangogamer@gmail.com>, 2018. # Eduardo Abreu <eduo.abreu@gmail.com>, 2018, 2019. # Bruno Miranda Da Silva <brunofreezee@gmail.com>, 2018. @@ -74,7 +74,7 @@ # Rafael Silveira <res883@gmail.com>, 2019. # Luigi <luigimendeszanchett@gmail.com>, 2019. # Nicolas Abril <nicolas.abril@protonmail.ch>, 2019. -# johnnybigoode <jamarson@gmail.com>, 2019. +# johnnybigoode <jamarson@gmail.com>, 2019, 2020. # Zeero <igcdzeero@gmail.com>, 2019. # Gian Penna <gianfrancopen@gmail.com>, 2020. # sribgui <sribgui@gmail.com>, 2020. @@ -82,14 +82,16 @@ # Michael Leocádio <aeronmike@gmail.com>, 2020. # Z <rainromes@gmail.com>, 2020. # Leonardo Dimano <leodimano@live.com>, 2020. -# anonymous <noreply@weblate.org>, 2020. # Guilherme Souza Reis de Melo Lopes <gsrmlopes@gmail.com>, 2020. +# Richard Urban <redasuio1@gmail.com>, 2020. +# Wellyngton R Weller <well.weller@hotmail.com>, 2020. +# Lucas Araujo <lucassants2808@gmail.com>, 2020. msgid "" msgstr "" "Project-Id-Version: Godot Engine editor\n" "POT-Creation-Date: 2016-05-30\n" -"PO-Revision-Date: 2020-03-08 22:32+0000\n" -"Last-Translator: Guilherme Souza Reis de Melo Lopes <gsrmlopes@gmail.com>\n" +"PO-Revision-Date: 2020-04-27 08:25+0000\n" +"Last-Translator: johnnybigoode <jamarson@gmail.com>\n" "Language-Team: Portuguese (Brazil) <https://hosted.weblate.org/projects/" "godot-engine/godot/pt_BR/>\n" "Language: pt_BR\n" @@ -97,16 +99,16 @@ msgstr "" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=n > 1;\n" -"X-Generator: Weblate 4.0-dev\n" +"X-Generator: Weblate 4.0.2-dev\n" #: core/math/expression.cpp modules/gdscript/gdscript_functions.cpp #: modules/visual_script/visual_script_builtin_funcs.cpp msgid "Invalid type argument to convert(), use TYPE_* constants." -msgstr "Argumento de tipo inválido para converter(), use TYPE_* constantes." +msgstr "Tipo de argumento inválido para converter(), use TYPE_* constantes." #: core/math/expression.cpp modules/gdscript/gdscript_functions.cpp msgid "Expected a string of length 1 (a character)." -msgstr "Esperado uma string de comprimento 1 (um caractere)." +msgstr "Esperado uma corda de comprimento 1 (um caractere)." #: core/math/expression.cpp modules/gdscript/gdscript_functions.cpp #: modules/mono/glue/gd_glue.cpp @@ -734,11 +736,11 @@ msgstr "Selecionar Todos/Nenhum" #: editor/animation_track_editor_plugins.cpp msgid "Add Audio Track Clip" -msgstr "Adicionar Amostra de uma Trilha de Ãudio" +msgstr "Adicionar Trilha de Clipes de Ãudio" #: editor/animation_track_editor_plugins.cpp msgid "Change Audio Track Clip Start Offset" -msgstr "Mudar Deslocamento de InÃcio da Amostra da Trilha de Ãudio" +msgstr "Mudar Deslocamento do InÃcio do Clip de Trilha de Audio" #: editor/animation_track_editor_plugins.cpp msgid "Change Audio Track Clip End Offset" @@ -1519,7 +1521,7 @@ msgstr "Mover Autoload" msgid "Remove Autoload" msgstr "Remover Autoload" -#: editor/editor_autoload_settings.cpp +#: editor/editor_autoload_settings.cpp editor/editor_plugin_settings.cpp msgid "Enable" msgstr "Habilitar" @@ -3005,8 +3007,12 @@ msgid "Q&A" msgstr "Perguntas & Respostas" #: editor/editor_node.cpp -msgid "Issue Tracker" -msgstr "Rastreador de Problemas" +msgid "Report a Bug" +msgstr "Reportar bug" + +#: editor/editor_node.cpp +msgid "Send Docs Feedback" +msgstr "Enviar Feedback de Docs" #: editor/editor_node.cpp editor/plugins/asset_library_editor_plugin.cpp msgid "Community" @@ -3117,14 +3123,13 @@ msgid "" "the \"Use Custom Build\" option should be enabled in the Android export " "preset." msgstr "" -"Isso irá configurar seu projeto para compilações customizadas do Android " -"instalando o template raÃz em \"res://android/build\".\n" -"Em seguida, você pode aplicar modificações e compilar seu próprio APK " -"customizado na exportação (adicionando módulos, alterando o AndroidManifest." -"xml, etc.).\n" -"Note que para fazer uma compilação customizada em vez de usar APKs pre-" -"compilados, a opção \"Usar compilação customizada\" deve estar ativa nas " -"predefinições de exportação do Android." +"Isso vai configurar seu projeto para construções customizadas do Android, " +"instalando o modelo de fonte para \"res://android/build\".\n" +"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 " +"predefinições de exportação Android." #: editor/editor_node.cpp msgid "" @@ -3656,7 +3661,7 @@ msgstr "Selecionar o Arquivo de Modelo" #: editor/export_template_manager.cpp msgid "Godot Export Templates" -msgstr "Modelos de Exportação do Godot" +msgstr "Modelos de Exportação" #: editor/export_template_manager.cpp msgid "Export Template Manager" @@ -4065,7 +4070,7 @@ msgid "Reimport" msgstr "Reimportar" #: editor/import_dock.cpp -msgid "Save scenes, re-import and restart" +msgid "Save Scenes, Re-Import, and Restart" msgstr "Salvar cenas, reimportar e reiniciar" #: editor/import_dock.cpp @@ -4331,7 +4336,7 @@ msgstr "Abrir Editor" #: editor/plugins/animation_blend_tree_editor_plugin.cpp #: editor/plugins/animation_state_machine_editor.cpp msgid "Open Animation Node" -msgstr "Abrir Nó de Animação" +msgstr "Abrir Animação de Nós" #: editor/plugins/animation_blend_space_2d_editor.cpp msgid "Triangle already exists." @@ -5058,7 +5063,7 @@ msgstr "Download deste asset já está em progresso!" #: editor/plugins/asset_library_editor_plugin.cpp msgid "Recently Updated" -msgstr "Atualizado recentemente" +msgstr "Atualizado Recentemente" #: editor/plugins/asset_library_editor_plugin.cpp msgid "Least Recently Updated" @@ -5267,7 +5272,7 @@ msgid "" "Children of containers have their anchors and margins values overridden by " "their parent." msgstr "" -"Filhos de contêineres tem suas posições e margens sobrescritos pelos seus " +"Filhos de contêineres tem suas posições e tamanhos sobrescritos pelos seus " "pais." #: editor/plugins/canvas_item_editor_plugin.cpp @@ -5321,27 +5326,27 @@ msgstr "Centro" #: editor/plugins/canvas_item_editor_plugin.cpp msgid "Left Wide" -msgstr "Esquerda Largo" +msgstr "Largura Esquerda" #: editor/plugins/canvas_item_editor_plugin.cpp msgid "Top Wide" -msgstr "Superior Largo" +msgstr "Largura Superior" #: editor/plugins/canvas_item_editor_plugin.cpp msgid "Right Wide" -msgstr "Direita Largo" +msgstr "Largura Direita" #: editor/plugins/canvas_item_editor_plugin.cpp msgid "Bottom Wide" -msgstr "Inferior Largo" +msgstr "Largura inferior" #: editor/plugins/canvas_item_editor_plugin.cpp msgid "VCenter Wide" -msgstr "Centro Vertical Largo" +msgstr "Largura Centro Vertical" #: editor/plugins/canvas_item_editor_plugin.cpp msgid "HCenter Wide" -msgstr "Centro Horizontal Largo" +msgstr "Largura Centro Horizontal" #: editor/plugins/canvas_item_editor_plugin.cpp msgid "Full Rect" @@ -5369,8 +5374,8 @@ msgid "" "Game Camera Override\n" "Overrides game camera with editor viewport camera." msgstr "" -"Substituir Câmera do Jogo\n" -"Substitui a câmera do jogo com a câmera de visualização do editor." +"Sobrepor câmera de Jogo\n" +"Sobrepõe a câmera de jogo com a janela de exibição da câmera." #: editor/plugins/canvas_item_editor_plugin.cpp #: editor/plugins/spatial_editor_plugin.cpp @@ -5378,8 +5383,8 @@ msgid "" "Game Camera Override\n" "No game instance running." msgstr "" -"Substituir Câmera do Jogo\n" -"Nenhuma instância de jogo em execução." +"Sobrepor câmera de Jogo\n" +"Sem instancia de jogo rodando." #: editor/plugins/canvas_item_editor_plugin.cpp #: editor/plugins/spatial_editor_plugin.cpp @@ -5650,11 +5655,11 @@ msgstr "Visualizar Canvas Scale" #: editor/plugins/canvas_item_editor_plugin.cpp msgid "Translation mask for inserting keys." -msgstr "Máscara de Translação para inserir chaves." +msgstr "Mascara de tradução para inserção de chaves" #: editor/plugins/canvas_item_editor_plugin.cpp msgid "Rotation mask for inserting keys." -msgstr "Máscara de Rotação para inserir chaves." +msgstr "Mascara de rotação para inserção de chaves." #: editor/plugins/canvas_item_editor_plugin.cpp msgid "Scale mask for inserting keys." @@ -6038,7 +6043,6 @@ msgstr "" "Este é a opção mais precisa (mas lenta) para detecção de colisão." #: editor/plugins/mesh_instance_editor_plugin.cpp -#, fuzzy msgid "Create Single Convex Collision Sibling" msgstr "Criar Simples Colisão Convexa Irmã(s)" @@ -6930,14 +6934,6 @@ msgid "Open Godot online documentation." msgstr "Abrir a documentação online da Godot." #: editor/plugins/script_editor_plugin.cpp -msgid "Request Docs" -msgstr "Solicitar documentos" - -#: editor/plugins/script_editor_plugin.cpp -msgid "Help improve the Godot documentation by giving feedback." -msgstr "Ajude a melhorar a documentação do Godot dando seu feedback." - -#: editor/plugins/script_editor_plugin.cpp msgid "Search the reference documentation." msgstr "Pesquise a documentação de referência." @@ -7372,6 +7368,10 @@ msgid "This operation requires a single selected node." msgstr "Essa operação requer um único nó selecionado." #: editor/plugins/spatial_editor_plugin.cpp +msgid "Auto Orthogonal Enabled" +msgstr "Ortogonal automático habilitado" + +#: editor/plugins/spatial_editor_plugin.cpp msgid "Lock View Rotation" msgstr "Bloquear Rotação da Visão" @@ -7460,6 +7460,10 @@ msgid "Freelook Slow Modifier" msgstr "Modificador de velocidade lenta da Visão Livre" #: editor/plugins/spatial_editor_plugin.cpp +msgid "View Rotation Locked" +msgstr "Ver Rotação Bloqueada" + +#: editor/plugins/spatial_editor_plugin.cpp msgid "" "Note: The FPS value displayed is the editor's framerate.\n" "It cannot be used as a reliable indication of in-game performance." @@ -7468,10 +7472,6 @@ msgstr "" "Ele não deve ser usado como indicação confiável de desempenho do jogo." #: editor/plugins/spatial_editor_plugin.cpp -msgid "View Rotation Locked" -msgstr "Ver Rotação Bloqueada" - -#: editor/plugins/spatial_editor_plugin.cpp msgid "XForm Dialog" msgstr "Diálogo XForm" @@ -9985,6 +9985,13 @@ msgstr "" "Você não tem nenhum projeto no momento.\n" "Gostaria de explorar projetos de exemplo oficiais na Asset Library?" +#: editor/project_manager.cpp +msgid "" +"The search box filters projects by name and last path component.\n" +"To filter projects by name and full path, the query must contain at least " +"one `/` character." +msgstr "" + #: editor/project_settings_editor.cpp msgid "Key " msgstr "Chave " @@ -10972,6 +10979,14 @@ msgid "Script file already exists." msgstr "O arquivo de script já existe." #: editor/script_create_dialog.cpp +msgid "" +"Note: Built-in scripts have some limitations and can't be edited using an " +"external editor." +msgstr "" +"Nota: Os scripts internos têm algumas limitações e não podem ser editados " +"usando um editor externo." + +#: editor/script_create_dialog.cpp msgid "Class Name:" msgstr "Nome da Classe:" @@ -11092,6 +11107,11 @@ msgid "Total:" msgstr "Total:" #: editor/script_editor_debugger.cpp +#, fuzzy +msgid "Export list to a CSV file" +msgstr "Exportar Perfil" + +#: editor/script_editor_debugger.cpp msgid "Resource Path" msgstr "Caminho do Recurso" @@ -12453,7 +12473,7 @@ msgstr "" #: scene/3d/collision_shape.cpp msgid "" "ConcavePolygonShape doesn't support RigidBody in another mode than static." -msgstr "" +msgstr "Lol." #: scene/3d/cpu_particles.cpp msgid "Nothing is visible because no mesh has been assigned." @@ -12753,6 +12773,11 @@ msgstr "" "para que ele possa ter um tamanho. Caso contrário, defina-o como destino de " "render e atribua sua textura interna a algum nó para exibir." +#: scene/main/viewport.cpp +msgid "Viewport size must be greater than 0 to render anything." +msgstr "" +"O tamanho da viewport deve ser maior do que 0 para renderizar qualquer coisa." + #: scene/resources/visual_shader_nodes.cpp msgid "Invalid source for preview." msgstr "Fonte inválida para a prévia." @@ -12781,6 +12806,15 @@ msgstr "Variáveis só podem ser atribuÃdas na função de vértice." msgid "Constants cannot be modified." msgstr "Constantes não podem serem modificadas." +#~ msgid "Issue Tracker" +#~ msgstr "Rastreador de Problemas" + +#~ msgid "Request Docs" +#~ msgstr "Solicitar documentos" + +#~ msgid "Help improve the Godot documentation by giving feedback." +#~ msgstr "Ajude a melhorar a documentação do Godot dando seu feedback." + #~ msgid "Replaced %d occurrence(s)." #~ msgstr "%d ocorrência(s) substituÃda(s)." diff --git a/editor/translations/pt_PT.po b/editor/translations/pt_PT.po index d7532e38d4..f7c6f042d2 100644 --- a/editor/translations/pt_PT.po +++ b/editor/translations/pt_PT.po @@ -15,11 +15,12 @@ # Vinicius Gonçalves <viniciusgoncalves21@gmail.com>, 2017. # ssantos <ssantos@web.de>, 2018, 2019. # Gonçalo Dinis Guerreiro João <goncalojoao205@gmail.com>, 2019. +# Manuela Silva <mmsrs@sky.com>, 2020. msgid "" msgstr "" "Project-Id-Version: Godot Engine editor\n" "POT-Creation-Date: \n" -"PO-Revision-Date: 2020-03-16 09:43+0000\n" +"PO-Revision-Date: 2020-04-20 05:51+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" @@ -28,23 +29,23 @@ msgstr "" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=n != 1;\n" -"X-Generator: Weblate 4.0-dev\n" +"X-Generator: Weblate 4.0.2-dev\n" #: core/math/expression.cpp modules/gdscript/gdscript_functions.cpp #: modules/visual_script/visual_script_builtin_funcs.cpp msgid "Invalid type argument to convert(), use TYPE_* constants." -msgstr "Tipo de argumento inválido para convert(), use constantes TYPE_*." +msgstr "Tipo de argumento inválido para convert(), utilize constantes TYPE_*." #: core/math/expression.cpp modules/gdscript/gdscript_functions.cpp msgid "Expected a string of length 1 (a character)." -msgstr "Esperado um string de comprimento 1 (um carácter)." +msgstr "Esperado uma \"string\" de comprimento 1 (um caráter)." #: core/math/expression.cpp modules/gdscript/gdscript_functions.cpp #: modules/mono/glue/gd_glue.cpp #: modules/visual_script/visual_script_builtin_funcs.cpp msgid "Not enough bytes for decoding bytes, or invalid format." msgstr "" -"Número de bytes insuficientes para descodificar, ou o formato é inválido." +"Número de \"bytes\" insuficientes para descodificar, ou o formato é inválido." #: core/math/expression.cpp msgid "Invalid input %i (not passed) in expression" @@ -1454,7 +1455,7 @@ msgstr "Mover Carregamento Automático" msgid "Remove Autoload" msgstr "Remover Carregamento Automático" -#: editor/editor_autoload_settings.cpp +#: editor/editor_autoload_settings.cpp editor/editor_plugin_settings.cpp msgid "Enable" msgstr "Ativar" @@ -2473,7 +2474,7 @@ msgid "" "considered a bug. Please report." msgstr "" "Esta opção foi descontinuada. Situações onde a atualização tem que ser " -"forçada, são agora consideras um defeito. Por favor, reporte." +"forçada, são agora consideras um defeito. Por favor, denuncie." #: editor/editor_node.cpp msgid "Pick a Main Scene" @@ -2939,8 +2940,12 @@ msgid "Q&A" msgstr "Perguntas & Respostas" #: editor/editor_node.cpp -msgid "Issue Tracker" -msgstr "Rastreador de Problemas" +msgid "Report a Bug" +msgstr "Denunciar um Bug" + +#: editor/editor_node.cpp +msgid "Send Docs Feedback" +msgstr "Enviar Sugestão dos Docs" #: editor/editor_node.cpp editor/plugins/asset_library_editor_plugin.cpp msgid "Community" @@ -3272,7 +3277,7 @@ msgstr "" #: editor/editor_properties.cpp editor/property_editor.cpp msgid "Pick a Viewport" -msgstr "Escolha uma Vista" +msgstr "Escolha um Viewport" #: editor/editor_properties.cpp editor/property_editor.cpp msgid "New Script" @@ -3310,7 +3315,7 @@ msgstr "Converter em %s" #: editor/editor_properties.cpp editor/property_editor.cpp msgid "Selected node is not a Viewport!" -msgstr "Nó selecionado não é uma Vista!" +msgstr "Nó selecionado não é um Viewport!" #: editor/editor_properties_array_dict.cpp msgid "Size: " @@ -3455,7 +3460,7 @@ msgstr "Erro na receção da lista de mirrors." #: editor/export_template_manager.cpp msgid "Error parsing JSON of mirror list. Please report this issue!" msgstr "" -"Erro ao analisar a lista de mirrors JSON. Por favor comunique o problema!" +"Erro ao analisar a lista de mirrors JSON. Por favor denuncie o problema!" #: editor/export_template_manager.cpp msgid "" @@ -3994,8 +3999,8 @@ msgid "Reimport" msgstr "Reimportar" #: editor/import_dock.cpp -msgid "Save scenes, re-import and restart" -msgstr "Guardar cenas, reimportar e reiniciar" +msgid "Save Scenes, Re-Import, and Restart" +msgstr "Guardar Cenas, Reimportar e Reiniciar" #: editor/import_dock.cpp msgid "Changing the type of an imported file requires editor restart." @@ -4039,7 +4044,7 @@ msgstr "Copiar Recurso" #: editor/inspector_dock.cpp msgid "Make Built-In" -msgstr "Tornar incorporado" +msgstr "Tornar Incorporado" #: editor/inspector_dock.cpp msgid "Make Sub-Resources Unique" @@ -5290,7 +5295,7 @@ msgid "" "Overrides game camera with editor viewport camera." msgstr "" "Sobreposição de Câmara de Jogo\n" -"Sobrepõe câmara de jogo com câmara do editor." +"Sobrepõe câmara de jogo com câmara viewport do editor." #: editor/plugins/canvas_item_editor_plugin.cpp #: editor/plugins/spatial_editor_plugin.cpp @@ -5549,7 +5554,7 @@ msgstr "Mostrar Origem" #: editor/plugins/canvas_item_editor_plugin.cpp msgid "Show Viewport" -msgstr "Mostrar Vista" +msgstr "Mostrar Viewport" #: editor/plugins/canvas_item_editor_plugin.cpp msgid "Show Group And Lock Icons" @@ -6844,14 +6849,6 @@ msgid "Open Godot online documentation." msgstr "Abrir documentação online do Godot." #: editor/plugins/script_editor_plugin.cpp -msgid "Request Docs" -msgstr "Requisitar Docs" - -#: editor/plugins/script_editor_plugin.cpp -msgid "Help improve the Godot documentation by giving feedback." -msgstr "Dê a sua opinião para ajudar a melhorar a documentação Godot." - -#: editor/plugins/script_editor_plugin.cpp msgid "Search the reference documentation." msgstr "Procurar na documentação de referência." @@ -7285,6 +7282,10 @@ msgid "This operation requires a single selected node." msgstr "Esta operação requer um único nó selecionado." #: editor/plugins/spatial_editor_plugin.cpp +msgid "Auto Orthogonal Enabled" +msgstr "Ortogonal Automático Ativado" + +#: editor/plugins/spatial_editor_plugin.cpp msgid "Lock View Rotation" msgstr "Bloquear Rotação da Vista" @@ -7373,6 +7374,10 @@ msgid "Freelook Slow Modifier" msgstr "Modificador de Velocidade Freelook" #: editor/plugins/spatial_editor_plugin.cpp +msgid "View Rotation Locked" +msgstr "Rotação da Vista Bloqueada" + +#: editor/plugins/spatial_editor_plugin.cpp msgid "" "Note: The FPS value displayed is the editor's framerate.\n" "It cannot be used as a reliable indication of in-game performance." @@ -7381,10 +7386,6 @@ msgstr "" "Não é uma indicação fiável do desempenho do jogo." #: editor/plugins/spatial_editor_plugin.cpp -msgid "View Rotation Locked" -msgstr "Rotação da Vista Bloqueada" - -#: editor/plugins/spatial_editor_plugin.cpp msgid "XForm Dialog" msgstr "Diálogo XForm" @@ -7473,27 +7474,27 @@ msgstr "Diálogo de transformação..." #: editor/plugins/spatial_editor_plugin.cpp msgid "1 Viewport" -msgstr "1 Vista" +msgstr "1 Viewport" #: editor/plugins/spatial_editor_plugin.cpp msgid "2 Viewports" -msgstr "2 vistas" +msgstr "2 Viewports" #: editor/plugins/spatial_editor_plugin.cpp msgid "2 Viewports (Alt)" -msgstr "2 vistas (Alt)" +msgstr "2 Viewports (Alt)" #: editor/plugins/spatial_editor_plugin.cpp msgid "3 Viewports" -msgstr "3 vistas" +msgstr "3 Viewports" #: editor/plugins/spatial_editor_plugin.cpp msgid "3 Viewports (Alt)" -msgstr "3 vistas (Alt)" +msgstr "3 Viewports (Alt)" #: editor/plugins/spatial_editor_plugin.cpp msgid "4 Viewports" -msgstr "4 vistas" +msgstr "4 Viewports" #: editor/plugins/spatial_editor_plugin.cpp msgid "Gizmos" @@ -7530,7 +7531,7 @@ msgstr "Ajuste de Escala (%):" #: editor/plugins/spatial_editor_plugin.cpp msgid "Viewport Settings" -msgstr "Configuração de Vista" +msgstr "Configuração do Viewport" #: editor/plugins/spatial_editor_plugin.cpp msgid "Perspective FOV (deg.):" @@ -9895,6 +9896,13 @@ msgstr "" "Atualmente não tem quaisquer projetos.\n" "Gostaria de explorar os projetos de exemplo oficiais na Biblioteca de Ativos?" +#: editor/project_manager.cpp +msgid "" +"The search box filters projects by name and last path component.\n" +"To filter projects by name and full path, the query must contain at least " +"one `/` character." +msgstr "" + #: editor/project_settings_editor.cpp msgid "Key " msgstr "Tecla " @@ -10881,6 +10889,14 @@ msgid "Script file already exists." msgstr "Ficheiro Script já existe." #: editor/script_create_dialog.cpp +msgid "" +"Note: Built-in scripts have some limitations and can't be edited using an " +"external editor." +msgstr "" +"Nota: Scripts incorporados têm algumas limitações e não podem ser editados " +"com um editor externo." + +#: editor/script_create_dialog.cpp msgid "Class Name:" msgstr "Nome de Classe:" @@ -11001,6 +11017,11 @@ msgid "Total:" msgstr "Total:" #: editor/script_editor_debugger.cpp +#, fuzzy +msgid "Export list to a CSV file" +msgstr "Exportar Perfil" + +#: editor/script_editor_debugger.cpp msgid "Resource Path" msgstr "Caminho do recurso" @@ -11456,7 +11477,8 @@ msgstr "O nó retornou uma sequência de saÃda (output) incorreta: " #: modules/visual_script/visual_script.cpp msgid "Found sequence bit but not the node in the stack, report bug!" -msgstr "Foi encontrada o bit da sequência mas não o nó na pilha, relate o bug!" +msgstr "" +"Foi encontrada o bit da sequência mas não o nó na pilha, denuncie o bug!" #: modules/visual_script/visual_script.cpp msgid "Stack overflow with stack depth: " @@ -12654,11 +12676,15 @@ msgid "" "obtain a size. Otherwise, make it a RenderTarget and assign its internal " "texture to some node for display." msgstr "" -"Esta vista não está definida como alvo de Renderização. Se pretende " +"Este viewport não está definida como alvo de Renderização. Se pretende " "apresentar o seu conteúdo diretamente no ecrã, torne-a um filho de um " "Control de modo a que obtenha um tamanho. Caso contrário, torne-a um " "RenderTarget e atribua a sua textura interna a outro nó para visualizar." +#: scene/main/viewport.cpp +msgid "Viewport size must be greater than 0 to render anything." +msgstr "O tamanho do viewport tem de ser maior do que 0 para renderizar." + #: scene/resources/visual_shader_nodes.cpp msgid "Invalid source for preview." msgstr "Fonte inválida para pré-visualização." @@ -12687,6 +12713,15 @@ msgstr "Variações só podem ser atribuÃdas na função vértice." msgid "Constants cannot be modified." msgstr "Constantes não podem ser modificadas." +#~ msgid "Issue Tracker" +#~ msgstr "Rastreador de Problemas" + +#~ msgid "Request Docs" +#~ msgstr "Requisitar Docs" + +#~ msgid "Help improve the Godot documentation by giving feedback." +#~ msgstr "Dê a sua opinião para ajudar a melhorar a documentação Godot." + #~ msgid "Replaced %d occurrence(s)." #~ msgstr "SubstituÃdo %d ocorrência(s)." diff --git a/editor/translations/ro.po b/editor/translations/ro.po index d52127fd95..624ae005f2 100644 --- a/editor/translations/ro.po +++ b/editor/translations/ro.po @@ -1437,7 +1437,7 @@ msgstr "MutaÈ›i Autoload" msgid "Remove Autoload" msgstr "EliminaÈ›i Autoload" -#: editor/editor_autoload_settings.cpp +#: editor/editor_autoload_settings.cpp editor/editor_plugin_settings.cpp msgid "Enable" msgstr "ActivaÈ›i" @@ -2935,8 +2935,13 @@ msgid "Q&A" msgstr "ÃŽntrebări È™i Răspunsuri" #: editor/editor_node.cpp -msgid "Issue Tracker" -msgstr "Agent de Monitorizare al Problemelor" +#, fuzzy +msgid "Report a Bug" +msgstr "Reimportă" + +#: editor/editor_node.cpp +msgid "Send Docs Feedback" +msgstr "" #: editor/editor_node.cpp editor/plugins/asset_library_editor_plugin.cpp msgid "Community" @@ -4026,7 +4031,7 @@ msgid "Reimport" msgstr "Reimportă" #: editor/import_dock.cpp -msgid "Save scenes, re-import and restart" +msgid "Save Scenes, Re-Import, and Restart" msgstr "" #: editor/import_dock.cpp @@ -7030,14 +7035,6 @@ msgid "Open Godot online documentation." msgstr "Deschide Recente" #: editor/plugins/script_editor_plugin.cpp -msgid "Request Docs" -msgstr "" - -#: editor/plugins/script_editor_plugin.cpp -msgid "Help improve the Godot documentation by giving feedback." -msgstr "" - -#: editor/plugins/script_editor_plugin.cpp msgid "Search the reference documentation." msgstr "" @@ -7489,6 +7486,10 @@ msgid "This operation requires a single selected node." msgstr "" #: editor/plugins/spatial_editor_plugin.cpp +msgid "Auto Orthogonal Enabled" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp #, fuzzy msgid "Lock View Rotation" msgstr "Curăță RotaÈ›ia Cursorului" @@ -7580,17 +7581,17 @@ msgid "Freelook Slow Modifier" msgstr "" #: editor/plugins/spatial_editor_plugin.cpp +#, fuzzy +msgid "View Rotation Locked" +msgstr "Curăță RotaÈ›ia Cursorului" + +#: editor/plugins/spatial_editor_plugin.cpp msgid "" "Note: The FPS value displayed is the editor's framerate.\n" "It cannot be used as a reliable indication of in-game performance." msgstr "" #: editor/plugins/spatial_editor_plugin.cpp -#, fuzzy -msgid "View Rotation Locked" -msgstr "Curăță RotaÈ›ia Cursorului" - -#: editor/plugins/spatial_editor_plugin.cpp msgid "XForm Dialog" msgstr "" @@ -10104,6 +10105,13 @@ msgstr "" "DoreÈ™ti să explorezi exemplele de proiecte oficiale din Librăria de Asset-" "uri?" +#: editor/project_manager.cpp +msgid "" +"The search box filters projects by name and last path component.\n" +"To filter projects by name and full path, the query must contain at least " +"one `/` character." +msgstr "" + #: editor/project_settings_editor.cpp msgid "Key " msgstr "" @@ -11107,6 +11115,12 @@ msgid "Script file already exists." msgstr "AutoLoad '%s' există deja!" #: editor/script_create_dialog.cpp +msgid "" +"Note: Built-in scripts have some limitations and can't be edited using an " +"external editor." +msgstr "" + +#: editor/script_create_dialog.cpp #, fuzzy msgid "Class Name:" msgstr "Clasă:" @@ -11238,6 +11252,11 @@ msgid "Total:" msgstr "" #: editor/script_editor_debugger.cpp +#, fuzzy +msgid "Export list to a CSV file" +msgstr "Exportă Profil" + +#: editor/script_editor_debugger.cpp msgid "Resource Path" msgstr "" @@ -12779,6 +12798,10 @@ msgid "" "texture to some node for display." msgstr "" +#: scene/main/viewport.cpp +msgid "Viewport size must be greater than 0 to render anything." +msgstr "" + #: scene/resources/visual_shader_nodes.cpp msgid "Invalid source for preview." msgstr "" @@ -12807,6 +12830,9 @@ msgstr "" msgid "Constants cannot be modified." msgstr "" +#~ msgid "Issue Tracker" +#~ msgstr "Agent de Monitorizare al Problemelor" + #~ msgid "Replaced %d occurrence(s)." #~ msgstr "ÃŽnlocuit %d potriviri." diff --git a/editor/translations/ru.po b/editor/translations/ru.po index d3402fd63e..2344b31e59 100644 --- a/editor/translations/ru.po +++ b/editor/translations/ru.po @@ -65,14 +65,17 @@ # Ðндрей БелÑков <andbelandantrus@gmail.com>, 2020. # Artur Tretiak <stikyt@protonmail.com>, 2020. # Smadjavul <o1985af@gmail.com>, 2020. -# anonymous <noreply@weblate.org>, 2020. # Vinsent Insaider_red <vinsent.in7aider@gmail.com>, 2020. +# TMF <themysticalfox@mail.ru>, 2020. +# Ivan Kuzmenko <kuzmenko.ivan2002@yandex.com>, 2020. +# Super Pracion <superpracion2@gmail.com>, 2020. +# PizzArt <7o7goo7o7@gmail.com>, 2020. msgid "" msgstr "" "Project-Id-Version: Godot Engine editor\n" "POT-Creation-Date: \n" -"PO-Revision-Date: 2020-03-11 12:20+0000\n" -"Last-Translator: Vinsent Insaider_red <vinsent.in7aider@gmail.com>\n" +"PO-Revision-Date: 2020-04-23 20:21+0000\n" +"Last-Translator: PizzArt <7o7goo7o7@gmail.com>\n" "Language-Team: Russian <https://hosted.weblate.org/projects/godot-engine/" "godot/ru/>\n" "Language: ru\n" @@ -81,7 +84,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-dev\n" +"X-Generator: Weblate 4.0.2-dev\n" #: core/math/expression.cpp modules/gdscript/gdscript_functions.cpp #: modules/visual_script/visual_script_builtin_funcs.cpp @@ -96,7 +99,7 @@ msgstr "ОжидалаÑÑŒ Ñтрока длиной 1 (Ñимвол)." #: 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" @@ -232,9 +235,8 @@ msgid "Anim Multi Change Transition" msgstr "Многократное изменение перехода" #: editor/animation_track_editor.cpp -#, fuzzy msgid "Anim Multi Change Transform" -msgstr "Ðнимационное многоÑменное преобразование" +msgstr "Ðнимационное многократное изменение положениÑ" #: editor/animation_track_editor.cpp msgid "Anim Multi Change Keyframe Value" @@ -1505,7 +1507,7 @@ msgstr "ПеремеÑтить автозагрузку" msgid "Remove Autoload" msgstr "Удалить автозагрузку" -#: editor/editor_autoload_settings.cpp +#: editor/editor_autoload_settings.cpp editor/editor_plugin_settings.cpp msgid "Enable" msgstr "Включить" @@ -2988,8 +2990,12 @@ msgid "Q&A" msgstr "ВопроÑÑ‹ и ответы" #: editor/editor_node.cpp -msgid "Issue Tracker" -msgstr "СиÑтема отÑÐ»ÐµÐ¶Ð¸Ð²Ð°Ð½Ð¸Ñ Ð¾ÑˆÐ¸Ð±Ð¾Ðº" +msgid "Report a Bug" +msgstr "Сообщить об ошибке" + +#: editor/editor_node.cpp +msgid "Send Docs Feedback" +msgstr "Отправить отзыв о документации" #: editor/editor_node.cpp editor/plugins/asset_library_editor_plugin.cpp msgid "Community" @@ -4043,7 +4049,7 @@ msgid "Reimport" msgstr "Переимпортировать" #: editor/import_dock.cpp -msgid "Save scenes, re-import and restart" +msgid "Save Scenes, Re-Import, and Restart" msgstr "Сохранить Ñцены, переимпортировать и перезапуÑтить" #: editor/import_dock.cpp @@ -5242,7 +5248,7 @@ msgstr "Ð¯ÐºÐ¾Ñ€Ñ Ð¸ отÑтупы дочерних контейнеров пР#: editor/plugins/canvas_item_editor_plugin.cpp msgid "Presets for the anchors and margins values of a Control node." -msgstr "ПредуÑтановки Ð´Ð»Ñ Ñкорей и Ð·Ð½Ð°Ñ‡ÐµÐ½Ð¸Ñ Ð¾Ñ‚Ñтупов контрольного узла." +msgstr "ПреÑеты значений Ð´Ð»Ñ Ñкорей и отÑтупов узла Control." #: editor/plugins/canvas_item_editor_plugin.cpp msgid "" @@ -5651,9 +5657,8 @@ msgid "Auto Insert Key" msgstr "ÐвтовÑтавка ключа" #: editor/plugins/canvas_item_editor_plugin.cpp -#, fuzzy msgid "Animation Key and Pose Options" -msgstr "Ключ анимации вÑтавлен." +msgstr "ÐаÑтройки ключевых кадров и поз" #: editor/plugins/canvas_item_editor_plugin.cpp msgid "Insert Key (Existing Tracks)" @@ -5764,9 +5769,8 @@ msgstr "МаÑка излучениÑ" #: editor/plugins/cpu_particles_2d_editor_plugin.cpp #: editor/plugins/particles_2d_editor_plugin.cpp -#, fuzzy msgid "Solid Pixels" -msgstr "Твёрдые пикÑели" +msgstr "Сплошные пикÑели" #: editor/plugins/cpu_particles_2d_editor_plugin.cpp #: editor/plugins/particles_2d_editor_plugin.cpp @@ -5775,9 +5779,8 @@ msgstr "Граничные пикÑели" #: editor/plugins/cpu_particles_2d_editor_plugin.cpp #: editor/plugins/particles_2d_editor_plugin.cpp -#, fuzzy msgid "Directed Border Pixels" -msgstr "Ðаправленные граничные пикÑели" +msgstr "Ðаправленные пограничные пикÑели" #: editor/plugins/cpu_particles_2d_editor_plugin.cpp #: editor/plugins/particles_2d_editor_plugin.cpp @@ -5912,22 +5915,21 @@ msgid "This doesn't work on scene root!" msgstr "Ðто не работает на корне Ñцены!" #: editor/plugins/mesh_instance_editor_plugin.cpp -#, fuzzy msgid "Create Trimesh Static Shape" -msgstr "Создать вогнутую форму" +msgstr "Создать треугольную Ñетку ÑтатичеÑкой формы" #: editor/plugins/mesh_instance_editor_plugin.cpp msgid "Can't create a single convex collision shape for the scene root." msgstr "" +"Ðе удаетÑÑ Ñоздать единÑтвенную выпуклую форму ÑÑ‚Ð¾Ð»ÐºÐ½Ð¾Ð²ÐµÐ½Ð¸Ñ Ð´Ð»Ñ ÐºÐ¾Ñ€Ð½Ñ Ñцены." #: editor/plugins/mesh_instance_editor_plugin.cpp msgid "Couldn't create a single convex collision shape." -msgstr "" +msgstr "Ðе удалоÑÑŒ Ñоздать одну выпуклую форму Ñтолкновений." #: editor/plugins/mesh_instance_editor_plugin.cpp -#, fuzzy msgid "Create Single Convex Shape" -msgstr "Создать выпуклую форму(Ñ‹)" +msgstr "Создать одну выпуклую форму" #: editor/plugins/mesh_instance_editor_plugin.cpp msgid "Can't create multiple convex collision shapes for the scene root." @@ -5935,14 +5937,12 @@ msgstr "" "Ðевозможно Ñоздать неÑколько выпуклых форм ÑÑ‚Ð¾Ð»ÐºÐ½Ð¾Ð²ÐµÐ½Ð¸Ñ Ð´Ð»Ñ ÐºÐ¾Ñ€Ð½Ñ Ñцены." #: editor/plugins/mesh_instance_editor_plugin.cpp -#, fuzzy msgid "Couldn't create any collision shapes." -msgstr "Ðе удалоÑÑŒ Ñоздать папку." +msgstr "Ðе удалоÑÑŒ Ñоздать ни одной форму ÑтолкновениÑ." #: editor/plugins/mesh_instance_editor_plugin.cpp -#, fuzzy msgid "Create Multiple Convex Shapes" -msgstr "Создать выпуклую форму(Ñ‹)" +msgstr "Создать неÑколько выпуклых форм" #: editor/plugins/mesh_instance_editor_plugin.cpp msgid "Create Navigation Mesh" @@ -5986,7 +5986,7 @@ msgstr "Создать контур" #: editor/plugins/mesh_instance_editor_plugin.cpp msgid "Mesh" -msgstr "МаÑÑив" +msgstr "Меш" #: editor/plugins/mesh_instance_editor_plugin.cpp msgid "Create Trimesh Static Body" @@ -6015,9 +6015,8 @@ msgstr "" "Ðто Ñамый точный (но Ñамый медленный) ÑпоÑоб Ð¾Ð±Ð½Ð°Ñ€ÑƒÐ¶ÐµÐ½Ð¸Ñ Ñтолкновений." #: editor/plugins/mesh_instance_editor_plugin.cpp -#, fuzzy msgid "Create Single Convex Collision Sibling" -msgstr "Создать выпуклую облаÑть ÑтолкновениÑ" +msgstr "Создать одну выпуклую облаÑть ÑтолкновениÑ" #: editor/plugins/mesh_instance_editor_plugin.cpp msgid "" @@ -6028,9 +6027,8 @@ msgstr "" "Ðто Ñамый быÑтрый (но наименее точный) ÑпоÑоб Ð¾Ð±Ð½Ð°Ñ€ÑƒÐ¶ÐµÐ½Ð¸Ñ Ñтолкновений." #: editor/plugins/mesh_instance_editor_plugin.cpp -#, fuzzy msgid "Create Multiple Convex Collision Siblings" -msgstr "Создать выпуклую облаÑть ÑтолкновениÑ" +msgstr "Создать неÑколько ÑоÑедних выпуклых форм ÑтолкновениÑ" #: editor/plugins/mesh_instance_editor_plugin.cpp msgid "" @@ -6045,12 +6043,17 @@ msgid "Create Outline Mesh..." msgstr "Создать полиÑетку обводки..." #: editor/plugins/mesh_instance_editor_plugin.cpp +#, fuzzy msgid "" "Creates a static outline mesh. The outline mesh will have its normals " "flipped automatically.\n" "This can be used instead of the SpatialMaterial Grow property when using " "that property isn't possible." msgstr "" +"Создаёт Ñтатичную контурную полиÑетку. Её нормали будут перевёрнуты " +"автоматичеÑки.\n" +"Она может быть заменой ÑвойÑтву Grow реÑурÑа SpatialMaterial, когда Ñто " +"ÑвойÑтво невозможно иÑпользовать." #: editor/plugins/mesh_instance_editor_plugin.cpp msgid "View UV1" @@ -6900,14 +6903,6 @@ msgid "Open Godot online documentation." msgstr "Открыть онлайн-документацию Godot." #: editor/plugins/script_editor_plugin.cpp -msgid "Request Docs" -msgstr "Проблема" - -#: editor/plugins/script_editor_plugin.cpp -msgid "Help improve the Godot documentation by giving feedback." -msgstr "Помогите улучшить документацию Godot, оÑтавьте Ñообщение об ошибке." - -#: editor/plugins/script_editor_plugin.cpp msgid "Search the reference documentation." msgstr "ПоиÑк Ñправочной документации." @@ -7344,6 +7339,11 @@ msgid "This operation requires a single selected node." msgstr "Ðта Ð¾Ð¿ÐµÑ€Ð°Ñ†Ð¸Ñ Ñ‚Ñ€ÐµÐ±ÑƒÐµÑ‚ одного выбранного узла." #: editor/plugins/spatial_editor_plugin.cpp +#, fuzzy +msgid "Auto Orthogonal Enabled" +msgstr "Ортогональный" + +#: editor/plugins/spatial_editor_plugin.cpp msgid "Lock View Rotation" msgstr "Блокировать вращение камеры" @@ -7432,6 +7432,10 @@ msgid "Freelook Slow Modifier" msgstr "Медленный модификатор Ñвободного проÑмотра" #: editor/plugins/spatial_editor_plugin.cpp +msgid "View Rotation Locked" +msgstr "Блокировать вращение камеры" + +#: editor/plugins/spatial_editor_plugin.cpp msgid "" "Note: The FPS value displayed is the editor's framerate.\n" "It cannot be used as a reliable indication of in-game performance." @@ -7441,10 +7445,6 @@ msgstr "" "игры." #: editor/plugins/spatial_editor_plugin.cpp -msgid "View Rotation Locked" -msgstr "Блокировать вращение камеры" - -#: editor/plugins/spatial_editor_plugin.cpp msgid "XForm Dialog" msgstr "XForm диалоговое окно" @@ -7662,7 +7662,7 @@ msgstr "ПредпроÑмотр CollisionPolygon2D" #: editor/plugins/sprite_editor_plugin.cpp msgid "Create LightOccluder2D" -msgstr "Создан LightOccluder2D" +msgstr "Создать LightOccluder2D" #: editor/plugins/sprite_editor_plugin.cpp msgid "LightOccluder2D Preview" @@ -8436,14 +8436,12 @@ msgid "Edit Tile Z Index" msgstr "Редактирование Z индекÑа плитки" #: editor/plugins/tile_set_editor_plugin.cpp -#, fuzzy msgid "Make Convex" -msgstr "Сделать Convex" +msgstr "Сделать выпуклым" #: editor/plugins/tile_set_editor_plugin.cpp -#, fuzzy msgid "Make Concave" -msgstr "Сделать Concave" +msgstr "Сделать вогнутым" #: editor/plugins/tile_set_editor_plugin.cpp msgid "Create Collision Polygon" @@ -8708,9 +8706,8 @@ msgid "Dodge operator." msgstr "Оператор выцветаниÑ." #: editor/plugins/visual_shader_editor_plugin.cpp -#, fuzzy msgid "HardLight operator." -msgstr "Оператор жёÑткого Ñвета." +msgstr "Оператор HardLight." #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Lighten operator." @@ -9107,19 +9104,17 @@ msgid "Perform the texture lookup." msgstr "ВыполнÑет поиÑк текÑтуры." #: editor/plugins/visual_shader_editor_plugin.cpp -#, fuzzy msgid "Cubic texture uniform lookup." -msgstr "Изменить текÑтурную единицу" +msgstr "ПоиÑк кубичеÑкой текÑтуры." #: editor/plugins/visual_shader_editor_plugin.cpp -#, fuzzy msgid "2D texture uniform lookup." -msgstr "Изменить текÑтурную единицу" +msgstr "Равномерный поиÑк 2D-текÑтур." #: editor/plugins/visual_shader_editor_plugin.cpp #, fuzzy msgid "2D texture uniform lookup with triplanar." -msgstr "Изменить текÑтурную единицу" +msgstr "Форменный поиÑк 2d текÑтуры Ñ Ñ‚Ñ€Ð¸Ð¿Ð»Ð°Ð½Ð°Ñ€Ð¾Ð¼." #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Transform function." @@ -9229,9 +9224,8 @@ msgid "Linear interpolation between two vectors." msgstr "Ð›Ð¸Ð½ÐµÐ¹Ð½Ð°Ñ Ð¸Ð½Ñ‚ÐµÑ€Ð¿Ð¾Ð»ÑÑ†Ð¸Ñ Ð¼ÐµÐ¶Ð´Ñƒ Ð´Ð²ÑƒÐ¼Ñ Ð²ÐµÐºÑ‚Ð¾Ñ€Ð°Ð¼Ð¸." #: editor/plugins/visual_shader_editor_plugin.cpp -#, fuzzy msgid "Linear interpolation between two vectors using scalar." -msgstr "Ð›Ð¸Ð½ÐµÐ¹Ð½Ð°Ñ Ð¸Ð½Ñ‚ÐµÑ€Ð¿Ð¾Ð»ÑÑ†Ð¸Ñ Ð¼ÐµÐ¶Ð´Ñƒ Ð´Ð²ÑƒÐ¼Ñ Ð²ÐµÐºÑ‚Ð¾Ñ€Ð°Ð¼Ð¸." +msgstr "Ð›Ð¸Ð½ÐµÐ¹Ð½Ð°Ñ Ð¸Ð½Ñ‚ÐµÑ€Ð¿Ð¾Ð»ÑÑ†Ð¸Ñ Ð¼ÐµÐ¶Ð´Ñƒ Ð´Ð²ÑƒÐ¼Ñ Ð²ÐµÐºÑ‚Ð¾Ñ€Ð°Ð¼Ð¸ Ñ Ð¸Ñпользованием ÑкалÑра." #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Calculates the normalize product of vector." @@ -9352,17 +9346,16 @@ msgstr "" "Ð½Ð°Ð¿Ñ€Ð°Ð²Ð»ÐµÐ½Ð¸Ñ Ð¾Ð±Ð·Ð¾Ñ€Ð° камеры (пропуÑтите ÑоответÑтвующие входы к ней)." #: editor/plugins/visual_shader_editor_plugin.cpp -#, fuzzy msgid "" "Custom Godot Shader Language expression, which is placed on top of the " "resulted shader. You can place various function definitions inside and call " "it later in the Expressions. You can also declare varyings, uniforms and " "constants." msgstr "" -"ПользовательÑкое выражение Ñзыка шейдеров Godot, которое помещаетÑÑ Ð¿Ð¾Ð²ÐµÑ€Ñ… " -"шейдера. Ð’Ñ‹ можете размеÑтить внутри различные объÑÐ²Ð»ÐµÐ½Ð¸Ñ Ñ„ÑƒÐ½ÐºÑ†Ð¸Ð¹ и вызвать " -"их позже в ВыражениÑÑ…. Ð’Ñ‹ также можете объÑвить varyings, uniforms и " -"конÑтанты." +"ПользовательÑкое выражение на Ñзыке шейдеров Godot, которое помещаетÑÑ " +"поверх шейдера. Ð’Ñ‹ можете размеÑтить внутри различные объÑÐ²Ð»ÐµÐ½Ð¸Ñ Ñ„ÑƒÐ½ÐºÑ†Ð¸Ð¹ и " +"вызвать их позже в ВыражениÑÑ…. Ð’Ñ‹ также можете объÑвить переменные типа " +"varying, uniform и конÑтанты." #: editor/plugins/visual_shader_editor_plugin.cpp msgid "(Fragment/Light mode only) Scalar derivative function." @@ -9637,35 +9630,30 @@ msgid "Export With Debug" msgstr "ÐкÑпорт в режиме отладки" #: editor/project_manager.cpp -#, fuzzy msgid "The path specified doesn't exist." -msgstr "Путь не ÑущеÑтвует." +msgstr "Указанный путь не ÑущеÑтвует." #: editor/project_manager.cpp -#, fuzzy msgid "Error opening package file (it's not in ZIP format)." -msgstr "Ошибка при открытии файла пакета, не в формате zip." +msgstr "Ошибка при открытии файла пакета (Ðе ÑвлÑетÑÑ ZIP форматом)." #: editor/project_manager.cpp -#, fuzzy msgid "" "Invalid \".zip\" project file; it doesn't contain a \"project.godot\" file." msgstr "" -"ÐедейÑтвительный '.zip' файл проекта, не Ñодержит файл 'project.godot'." +"ÐедейÑтвительный \".zip\" файл проекта; не Ñодержит файл \"project.godot\"." #: editor/project_manager.cpp msgid "Please choose an empty folder." msgstr "ПожалуйÑта, выберите пуÑтую папку." #: editor/project_manager.cpp -#, fuzzy msgid "Please choose a \"project.godot\" or \".zip\" file." -msgstr "ПожалуйÑта, выберите файл 'project.godot' или '.zip'." +msgstr "ПожалуйÑта, выберите файл \"project.godot\" или \".zip\"." #: editor/project_manager.cpp -#, fuzzy msgid "This directory already contains a Godot project." -msgstr "Каталог уже Ñодержит проект Godot." +msgstr "Ðтот каталог уже Ñодержит проект Godot." #: editor/project_manager.cpp msgid "New Game Project" @@ -9972,6 +9960,13 @@ msgstr "" "Ð’ наÑтоÑщее Ð²Ñ€ÐµÐ¼Ñ Ñƒ Ð²Ð°Ñ Ð½ÐµÑ‚ никаких проектов.\n" "Хотите изучить официальные примеры в Библиотеке реÑурÑов?" +#: editor/project_manager.cpp +msgid "" +"The search box filters projects by name and last path component.\n" +"To filter projects by name and full path, the query must contain at least " +"one `/` character." +msgstr "" + #: editor/project_settings_editor.cpp msgid "Key " msgstr "Клавиша " @@ -10155,7 +10150,7 @@ msgstr "ÐаÑтройки Ñохранены нормально." #: editor/project_settings_editor.cpp #, fuzzy msgid "Moved Input Action Event" -msgstr "Добавить дейÑтвие" +msgstr "Событие ввода дейÑÑ‚Ð²Ð¸Ñ Ð¿ÐµÑ€ÐµÐ¼ÐµÑ‰ÐµÐ½Ð¾" #: editor/project_settings_editor.cpp msgid "Override for Feature" @@ -10362,9 +10357,8 @@ msgid "Suffix" msgstr "СуффикÑ" #: editor/rename_dialog.cpp -#, fuzzy msgid "Use Regular Expressions" -msgstr "РегулÑрное выражение" +msgstr "ИÑпользовать регулÑрные выражениÑ" #: editor/rename_dialog.cpp msgid "Advanced Options" @@ -10403,9 +10397,8 @@ msgstr "" "Сравните параметры Ñчетчика." #: editor/rename_dialog.cpp -#, fuzzy msgid "Per-level Counter" -msgstr "Счетчик уровнÑ" +msgstr "Счетчик Ð´Ð»Ñ ÐºÐ°Ð¶Ð´Ð¾Ð³Ð¾ уровнÑ" #: editor/rename_dialog.cpp msgid "If set the counter restarts for each group of child nodes" @@ -10446,14 +10439,12 @@ msgid "Keep" msgstr "ОÑтавить оригинал" #: editor/rename_dialog.cpp -#, fuzzy msgid "PascalCase to snake_case" -msgstr "CamelCase в under_scored" +msgstr "ВерблюжийРегиÑтр в змеиный_региÑтр" #: editor/rename_dialog.cpp -#, fuzzy msgid "snake_case to PascalCase" -msgstr "under_scored к CamelCase" +msgstr "змеиный_региÑтр в ВерблюжийРегиÑтр" #: editor/rename_dialog.cpp msgid "Case" @@ -10472,9 +10463,8 @@ msgid "Reset" msgstr "СброÑить" #: editor/rename_dialog.cpp -#, fuzzy msgid "Regular Expression Error" -msgstr "РегулÑрное выражение" +msgstr "Ошибка в регулÑрном выражении" #: editor/rename_dialog.cpp #, fuzzy @@ -10947,7 +10937,7 @@ 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 ." @@ -10970,6 +10960,14 @@ msgid "Script file already exists." msgstr "Файл Ñкрипта уже ÑущеÑтвует." #: editor/script_create_dialog.cpp +msgid "" +"Note: Built-in scripts have some limitations and can't be edited using an " +"external editor." +msgstr "" +"Примечание: вÑтроенные Ñкрипты имеют неÑколько ограничений и не могут быть " +"редактированы через внешний редактор." + +#: editor/script_create_dialog.cpp msgid "Class Name:" msgstr "Ð˜Ð¼Ñ ÐºÐ»Ð°ÑÑа:" @@ -11038,9 +11036,8 @@ msgid "Copy Error" msgstr "Копировать ошибку" #: editor/script_editor_debugger.cpp -#, fuzzy msgid "Video RAM" -msgstr "Видео памÑть" +msgstr "ВидеопамÑть" #: editor/script_editor_debugger.cpp msgid "Skip Breakpoints" @@ -11092,6 +11089,11 @@ msgid "Total:" msgstr "Ð’Ñего:" #: editor/script_editor_debugger.cpp +#, fuzzy +msgid "Export list to a CSV file" +msgstr "ÐкÑпортировать профиль" + +#: editor/script_editor_debugger.cpp msgid "Resource Path" msgstr "Путь к реÑурÑу" @@ -11353,7 +11355,6 @@ msgid "GridMap Fill Selection" msgstr "Залить выделенную GridMap" #: modules/gridmap/grid_map_editor_plugin.cpp -#, fuzzy msgid "GridMap Paste Selection" msgstr "Ð’Ñтавить выделенную Ñетку" @@ -12452,7 +12453,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." @@ -12752,6 +12753,10 @@ msgstr "" "Ñделайте её целью рендеринга и назначьте её внутреннюю текÑтуру какому-либо " "узлу Ð´Ð»Ñ Ð¾Ñ‚Ð¾Ð±Ñ€Ð°Ð¶ÐµÐ½Ð¸Ñ." +#: scene/main/viewport.cpp +msgid "Viewport size must be greater than 0 to render anything." +msgstr "Размер окна проÑмотра должен быть больше 0 Ð´Ð»Ñ Ñ€ÐµÐ½Ð´ÐµÑ€Ð¸Ð½Ð³Ð°." + #: scene/resources/visual_shader_nodes.cpp msgid "Invalid source for preview." msgstr "Ðеверный иÑточник Ð´Ð»Ñ Ð¿Ñ€ÐµÐ´Ð¿Ñ€Ð¾Ñмотра." @@ -12780,6 +12785,15 @@ msgstr "Ð˜Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ Ð¼Ð¾Ð³ÑƒÑ‚ быть назначены только Ð msgid "Constants cannot be modified." msgstr "КонÑтанты не могут быть изменены." +#~ msgid "Issue Tracker" +#~ msgstr "СиÑтема отÑÐ»ÐµÐ¶Ð¸Ð²Ð°Ð½Ð¸Ñ Ð¾ÑˆÐ¸Ð±Ð¾Ðº" + +#~ msgid "Request Docs" +#~ msgstr "Проблема" + +#~ msgid "Help improve the Godot documentation by giving feedback." +#~ msgstr "Помогите улучшить документацию Godot, оÑтавьте Ñообщение об ошибке." + #~ msgid "Replaced %d occurrence(s)." #~ msgstr "Заменено %d Ñовпадений." diff --git a/editor/translations/si.po b/editor/translations/si.po index 119818e11f..2eb9cad3f8 100644 --- a/editor/translations/si.po +++ b/editor/translations/si.po @@ -1428,7 +1428,7 @@ msgstr "" msgid "Remove Autoload" msgstr "" -#: editor/editor_autoload_settings.cpp +#: editor/editor_autoload_settings.cpp editor/editor_plugin_settings.cpp msgid "Enable" msgstr "" @@ -2832,7 +2832,11 @@ msgid "Q&A" msgstr "" #: editor/editor_node.cpp -msgid "Issue Tracker" +msgid "Report a Bug" +msgstr "" + +#: editor/editor_node.cpp +msgid "Send Docs Feedback" msgstr "" #: editor/editor_node.cpp editor/plugins/asset_library_editor_plugin.cpp @@ -3856,7 +3860,7 @@ msgid "Reimport" msgstr "" #: editor/import_dock.cpp -msgid "Save scenes, re-import and restart" +msgid "Save Scenes, Re-Import, and Restart" msgstr "" #: editor/import_dock.cpp @@ -6662,14 +6666,6 @@ msgid "Open Godot online documentation." msgstr "" #: editor/plugins/script_editor_plugin.cpp -msgid "Request Docs" -msgstr "" - -#: editor/plugins/script_editor_plugin.cpp -msgid "Help improve the Godot documentation by giving feedback." -msgstr "" - -#: editor/plugins/script_editor_plugin.cpp msgid "Search the reference documentation." msgstr "" @@ -7100,6 +7096,10 @@ msgid "This operation requires a single selected node." msgstr "" #: editor/plugins/spatial_editor_plugin.cpp +msgid "Auto Orthogonal Enabled" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp msgid "Lock View Rotation" msgstr "" @@ -7188,13 +7188,13 @@ msgid "Freelook Slow Modifier" msgstr "" #: editor/plugins/spatial_editor_plugin.cpp -msgid "" -"Note: The FPS value displayed is the editor's framerate.\n" -"It cannot be used as a reliable indication of in-game performance." +msgid "View Rotation Locked" msgstr "" #: editor/plugins/spatial_editor_plugin.cpp -msgid "View Rotation Locked" +msgid "" +"Note: The FPS value displayed is the editor's framerate.\n" +"It cannot be used as a reliable indication of in-game performance." msgstr "" #: editor/plugins/spatial_editor_plugin.cpp @@ -9581,6 +9581,13 @@ msgid "" "Would you like to explore official example projects in the Asset Library?" msgstr "" +#: editor/project_manager.cpp +msgid "" +"The search box filters projects by name and last path component.\n" +"To filter projects by name and full path, the query must contain at least " +"one `/` character." +msgstr "" + #: editor/project_settings_editor.cpp msgid "Key " msgstr "" @@ -10539,6 +10546,12 @@ msgid "Script file already exists." msgstr "" #: editor/script_create_dialog.cpp +msgid "" +"Note: Built-in scripts have some limitations and can't be edited using an " +"external editor." +msgstr "" + +#: editor/script_create_dialog.cpp msgid "Class Name:" msgstr "" @@ -10660,6 +10673,10 @@ msgid "Total:" msgstr "" #: editor/script_editor_debugger.cpp +msgid "Export list to a CSV file" +msgstr "" + +#: editor/script_editor_debugger.cpp msgid "Resource Path" msgstr "" @@ -12165,6 +12182,10 @@ msgid "" "texture to some node for display." msgstr "" +#: scene/main/viewport.cpp +msgid "Viewport size must be greater than 0 to render anything." +msgstr "" + #: scene/resources/visual_shader_nodes.cpp msgid "Invalid source for preview." msgstr "" diff --git a/editor/translations/sk.po b/editor/translations/sk.po index 50cf59efdc..d5730a7db9 100644 --- a/editor/translations/sk.po +++ b/editor/translations/sk.po @@ -5,15 +5,16 @@ # J08nY <johnenter@gmail.com>, 2016. # MineGame 159 <minegame459@gmail.com>, 2018. # Zuzana Palenikova <sousana.is@gmail.com>, 2019. -# MineGame159 <petulko08@gmail.com>, 2019. +# MineGame159 <petulko08@gmail.com>, 2019, 2020. # Michal <alladinsiffon@gmail.com>, 2019. # Richard <rgarlik@gmail.com>, 2019. +# Richard Urban <redasuio1@gmail.com>, 2020. msgid "" msgstr "" "Project-Id-Version: Godot Engine editor\n" "POT-Creation-Date: \n" -"PO-Revision-Date: 2019-07-02 10:51+0000\n" -"Last-Translator: Richard <rgarlik@gmail.com>\n" +"PO-Revision-Date: 2020-04-23 20:21+0000\n" +"Last-Translator: Richard Urban <redasuio1@gmail.com>\n" "Language-Team: Slovak <https://hosted.weblate.org/projects/godot-engine/" "godot/sk/>\n" "Language: sk\n" @@ -21,7 +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 3.8-dev\n" +"X-Generator: Weblate 4.0.2-dev\n" #: core/math/expression.cpp modules/gdscript/gdscript_functions.cpp #: modules/visual_script/visual_script_builtin_funcs.cpp @@ -30,7 +31,7 @@ msgstr "Chybný argument convert(), použite TYPE_* konÅ¡tanty." #: core/math/expression.cpp modules/gdscript/gdscript_functions.cpp msgid "Expected a string of length 1 (a character)." -msgstr "" +msgstr "OÄakávaná dĺžka stringu 1 (pÃsmeno)." #: core/math/expression.cpp modules/gdscript/gdscript_functions.cpp #: modules/mono/glue/gd_glue.cpp @@ -40,12 +41,11 @@ msgstr "Nedostatok bajtov na dekódovanie, možný chybný formát." #: core/math/expression.cpp msgid "Invalid input %i (not passed) in expression" -msgstr "" +msgstr "Nesprávny vstup %i (chýba) vo výraze" #: core/math/expression.cpp -#, fuzzy msgid "self can't be used because instance is null (not passed)" -msgstr "self nemožno použiÅ¥ lebo inÅ¡tancia je rovná null (not passed)" +msgstr "self sa nedá použiÅ¥ lebo inÅ¡tancia je null (nepreÅ¡iel)" #: core/math/expression.cpp msgid "Invalid operands to operator %s, %s and %s." @@ -69,31 +69,31 @@ msgstr "Pri volanà '%s':" #: core/ustring.cpp msgid "B" -msgstr "" +msgstr "B" #: core/ustring.cpp msgid "KiB" -msgstr "" +msgstr "KiB" #: core/ustring.cpp msgid "MiB" -msgstr "" +msgstr "MiB" #: core/ustring.cpp msgid "GiB" -msgstr "" +msgstr "GiB" #: core/ustring.cpp msgid "TiB" -msgstr "" +msgstr "TiB" #: core/ustring.cpp msgid "PiB" -msgstr "" +msgstr "PiB" #: core/ustring.cpp msgid "EiB" -msgstr "" +msgstr "EiB" #: editor/animation_bezier_editor.cpp msgid "Free" @@ -153,41 +153,35 @@ msgstr "Animácia zmeniÅ¥ prechod" #: editor/animation_track_editor.cpp msgid "Anim Change Transform" -msgstr "" +msgstr "ZmeniÅ¥ VeľkosÅ¥ Animácie" #: editor/animation_track_editor.cpp msgid "Anim Change Keyframe Value" msgstr "Animácia ZmeniÅ¥ Keyframe Hodnotu" #: editor/animation_track_editor.cpp -#, fuzzy msgid "Anim Change Call" -msgstr "Animácia ZmeniÅ¥ Hovor" +msgstr "Animácia zmenila Hovor" #: editor/animation_track_editor.cpp -#, fuzzy msgid "Anim Multi Change Keyframe Time" -msgstr "Animácia ZmeniÅ¥ Keyframe ÄŒas" +msgstr "Animácia ZmeniÅ¥ Äas Keyframe-u" #: editor/animation_track_editor.cpp -#, fuzzy msgid "Anim Multi Change Transition" -msgstr "Animácia zmeniÅ¥ prechod" +msgstr "ZmeniÅ¥ Transition Animácie" #: editor/animation_track_editor.cpp -#, fuzzy msgid "Anim Multi Change Transform" -msgstr "Animácia zmeniÅ¥ prechod" +msgstr "Animácia zmeniÅ¥ Transform" #: editor/animation_track_editor.cpp -#, fuzzy msgid "Anim Multi Change Keyframe Value" -msgstr "Animácia ZmeniÅ¥ Keyframe Hodnotu" +msgstr "Animácia ZmeniÅ¥ hodnotu Keyframe-u" #: editor/animation_track_editor.cpp -#, fuzzy msgid "Anim Multi Change Call" -msgstr "Animácia ZmeniÅ¥ Hovor" +msgstr "Animácia Zmenila Hovor" #: editor/animation_track_editor.cpp msgid "Change Animation Length" @@ -200,45 +194,43 @@ msgstr "ZmeniÅ¥ Dĺžku Animácie" #: editor/animation_track_editor.cpp msgid "Property Track" -msgstr "" +msgstr "Property Track" #: editor/animation_track_editor.cpp msgid "3D Transform Track" -msgstr "" +msgstr "3D Transform Track" #: editor/animation_track_editor.cpp msgid "Call Method Track" -msgstr "" +msgstr "Call Method Track" #: editor/animation_track_editor.cpp msgid "Bezier Curve Track" -msgstr "" +msgstr "Krivka Bezier Track" #: editor/animation_track_editor.cpp msgid "Audio Playback Track" -msgstr "" +msgstr "Audio Playback Track" #: editor/animation_track_editor.cpp msgid "Animation Playback Track" -msgstr "" +msgstr "Playback Track Animácie" #: editor/animation_track_editor.cpp -#, fuzzy msgid "Animation length (frames)" msgstr "Dĺžka ÄŒasu Animácie (v sekundách)" #: editor/animation_track_editor.cpp -#, fuzzy msgid "Animation length (seconds)" msgstr "Dĺžka ÄŒasu Animácie (v sekundách)" #: editor/animation_track_editor.cpp msgid "Add Track" -msgstr "" +msgstr "PridaÅ¥ Track" #: editor/animation_track_editor.cpp msgid "Animation Looping" -msgstr "" +msgstr "Opakovanie Animácie" #: editor/animation_track_editor.cpp #: modules/visual_script/visual_script_editor.cpp @@ -255,15 +247,15 @@ msgstr "Klipy Animácie:" #: editor/animation_track_editor.cpp msgid "Change Track Path" -msgstr "" +msgstr "ZmeniÅ¥ cestu Tracku" #: editor/animation_track_editor.cpp msgid "Toggle this track on/off." -msgstr "" +msgstr "Zapnúť/Vypnúť tento track." #: editor/animation_track_editor.cpp msgid "Update Mode (How this property is set)" -msgstr "" +msgstr "Update Mode (ako je nastavená táto možnosÅ¥)" #: editor/animation_track_editor.cpp msgid "Interpolation Mode" @@ -271,12 +263,11 @@ msgstr "Režim Interpolácie" #: editor/animation_track_editor.cpp msgid "Loop Wrap Mode (Interpolate end with beginning on loop)" -msgstr "" +msgstr "Loop Wrap Mode (interpoluje koniec zo zaÄiatkom opakovania)" #: editor/animation_track_editor.cpp -#, fuzzy msgid "Remove this track." -msgstr "VÅ¡etky vybrané" +msgstr "VymazaÅ¥ tento track." #: editor/animation_track_editor.cpp msgid "Time (s): " @@ -284,7 +275,7 @@ msgstr "ÄŒas (s): " #: editor/animation_track_editor.cpp msgid "Toggle Track Enabled" -msgstr "" +msgstr "Zmena Tracku Povolená" #: editor/animation_track_editor.cpp msgid "Continuous" @@ -317,11 +308,11 @@ msgstr "Kubický" #: editor/animation_track_editor.cpp msgid "Clamp Loop Interp" -msgstr "" +msgstr "Clamp Loop Interp" #: editor/animation_track_editor.cpp msgid "Wrap Loop Interp" -msgstr "" +msgstr "Wrap Loop Interp" #: editor/animation_track_editor.cpp #: editor/plugins/canvas_item_editor_plugin.cpp @@ -329,38 +320,36 @@ msgid "Insert Key" msgstr "VložiÅ¥ KľúÄ" #: editor/animation_track_editor.cpp -#, fuzzy msgid "Duplicate Key(s)" -msgstr "DuplikovaÅ¥ výber" +msgstr "Duplikovanie KľúÄov" #: editor/animation_track_editor.cpp -#, fuzzy msgid "Delete Key(s)" -msgstr "VÅ¡etky vybrané" +msgstr "Vymazanie kľúÄa(ov)" #: editor/animation_track_editor.cpp msgid "Change Animation Update Mode" -msgstr "" +msgstr "ZmeniÅ¥ Update Mode Animácie" #: editor/animation_track_editor.cpp msgid "Change Animation Interpolation Mode" -msgstr "" +msgstr "ZmeniÅ¥ Interpolacný Mód Animácie" #: editor/animation_track_editor.cpp msgid "Change Animation Loop Mode" -msgstr "" +msgstr "ZmeniÅ¥ Loop Mode Animacie" #: editor/animation_track_editor.cpp msgid "Remove Anim Track" -msgstr "" +msgstr "VymazaÅ¥ Track Animácie" #: editor/animation_track_editor.cpp msgid "Create NEW track for %s and insert key?" -msgstr "" +msgstr "VytvoriÅ¥ NOVà track za %s a vložiÅ¥ kľúÄ?" #: editor/animation_track_editor.cpp msgid "Create %d NEW tracks and insert keys?" -msgstr "" +msgstr "VytvoriÅ¥ %d NOVÉ track-y a vložiÅ¥ kľúÄe?" #: editor/animation_track_editor.cpp editor/create_dialog.cpp #: editor/editor_audio_buses.cpp editor/editor_feature_profile.cpp @@ -388,25 +377,23 @@ msgstr "Animácia VytvoriÅ¥ & VložiÅ¥" #: editor/animation_track_editor.cpp msgid "Anim Insert Track & Key" -msgstr "" +msgstr "Anim VložiÅ¥ Track & kľúÄ" #: editor/animation_track_editor.cpp msgid "Anim Insert Key" msgstr "Animácia VložiÅ¥ KľúÄ" #: editor/animation_track_editor.cpp -#, fuzzy msgid "Change Animation Step" -msgstr "Animácia zmeniÅ¥ prechod" +msgstr "ZmeniÅ¥ krok Animácie" #: editor/animation_track_editor.cpp -#, fuzzy msgid "Rearrange Tracks" -msgstr "VložiÅ¥" +msgstr "PreskupiÅ¥ Track-y" #: editor/animation_track_editor.cpp msgid "Transform tracks only apply to Spatial-based nodes." -msgstr "" +msgstr "TransformovaÅ¥ track-y a aplikovaÅ¥ do Spatial-based node-ov." #: editor/animation_track_editor.cpp msgid "" @@ -422,73 +409,72 @@ msgstr "" #: editor/animation_track_editor.cpp msgid "Animation tracks can only point to AnimationPlayer nodes." -msgstr "" +msgstr "Track-y Animácià môžu ukazovaÅ¥ iba na node-y AnimationPlayer." #: editor/animation_track_editor.cpp msgid "An animation player can't animate itself, only other players." -msgstr "" +msgstr "Animation player sa nemôže naanimovaÅ¥ sám, iba ostatné player-y." #: editor/animation_track_editor.cpp msgid "Not possible to add a new track without a root" -msgstr "" +msgstr "Nenà možné pridaÅ¥ nový track bez root-u" #: editor/animation_track_editor.cpp msgid "Invalid track for Bezier (no suitable sub-properties)" -msgstr "" +msgstr "Neplatný track pre Bezier (niesu vhodné sub-properties)" #: editor/animation_track_editor.cpp msgid "Add Bezier Track" -msgstr "" +msgstr "PridaÅ¥ Bezier Track" #: editor/animation_track_editor.cpp msgid "Track path is invalid, so can't add a key." -msgstr "" +msgstr "Cesta Track-u je neplatná, takže sa nedá pridaÅ¥ kľúÄ." #: editor/animation_track_editor.cpp msgid "Track is not of type Spatial, can't insert key" -msgstr "" +msgstr "Track nenà typ Spatial, nedá sa vložiÅ¥ kľúÄ" #: editor/animation_track_editor.cpp msgid "Add Transform Track Key" -msgstr "" +msgstr "PridaÅ¥ Transform Track Key" #: editor/animation_track_editor.cpp msgid "Add Track Key" -msgstr "" +msgstr "PridaÅ¥ Track Key" #: editor/animation_track_editor.cpp msgid "Track path is invalid, so can't add a method key." -msgstr "" +msgstr "Cesta track-u je neplatná, takže sa nedá pridaÅ¥ do method key." #: editor/animation_track_editor.cpp msgid "Add Method Track Key" -msgstr "" +msgstr "PridaÅ¥ Method Track Key" #: editor/animation_track_editor.cpp msgid "Method not found in object: " -msgstr "" +msgstr "Metóda nebola nájdená v objekte: " #: editor/animation_track_editor.cpp msgid "Anim Move Keys" -msgstr "" +msgstr "Pohybové kľúÄe Animácie" #: editor/animation_track_editor.cpp msgid "Clipboard is empty" -msgstr "" +msgstr "Schránka je prázdna" #: editor/animation_track_editor.cpp -#, fuzzy msgid "Paste Tracks" -msgstr "VložiÅ¥" +msgstr "VložiÅ¥ Track-y" #: editor/animation_track_editor.cpp msgid "Anim Scale Keys" -msgstr "" +msgstr "Scale keys Animácie" #: editor/animation_track_editor.cpp msgid "" "This option does not work for Bezier editing, as it's only a single track." -msgstr "" +msgstr "Táto možnosÅ¥ nefunguje pre Bezier editovanie, lebo je to jeden track." #: editor/animation_track_editor.cpp msgid "" @@ -502,38 +488,47 @@ msgid "" "Alternatively, use an import preset that imports animations to separate " "files." msgstr "" +"Táto Animácia patrà importovanej scéne, takže zmeny pre importované track-y " +"nebudú uložené.\n" +" \n" +"Na povolenie abilite pridaÅ¥ vlastné track-y, prejdite na nastavenia importu " +"scén a nastavte\n" +"\" Animation > Storage\" na \"Files\", povolte \"Animation > Keep Custom " +"Tracks\", a potom re-import.\n" +"AlternatÃvne, použite import preset ktorý importuje animácie pre oddelenie " +"file-ov." #: editor/animation_track_editor.cpp msgid "Warning: Editing imported animation" -msgstr "" +msgstr "Upozornenie: Editovanie importovaných animáciÃ" #: editor/animation_track_editor.cpp msgid "Select an AnimationPlayer node to create and edit animations." -msgstr "" +msgstr "OznaÄte AnimationPlayer node aby ste vytvorili a upravili animácie." #: editor/animation_track_editor.cpp msgid "Only show tracks from nodes selected in tree." -msgstr "" +msgstr "Iba show track-y z node-ov oznaÄené v strome." #: editor/animation_track_editor.cpp msgid "Group tracks by node or display them as plain list." -msgstr "" +msgstr "Zoskupte track-y pomocou node-u alebo ich zobrazte ako plain list." #: editor/animation_track_editor.cpp msgid "Snap:" -msgstr "" +msgstr "Snap:" #: editor/animation_track_editor.cpp msgid "Animation step value." -msgstr "" +msgstr "Hodnota kroku Animácie." #: editor/animation_track_editor.cpp msgid "Seconds" -msgstr "" +msgstr "Sekundy" #: editor/animation_track_editor.cpp msgid "FPS" -msgstr "" +msgstr "FPS" #: editor/animation_track_editor.cpp editor/editor_properties.cpp #: editor/plugins/polygon_2d_editor_plugin.cpp @@ -543,15 +538,15 @@ msgstr "" #: editor/project_settings_editor.cpp editor/property_editor.cpp #: modules/visual_script/visual_script_editor.cpp msgid "Edit" -msgstr "" +msgstr "Edit" #: editor/animation_track_editor.cpp msgid "Animation properties." -msgstr "" +msgstr "Vlastnosti Animácie." #: editor/animation_track_editor.cpp msgid "Copy Tracks" -msgstr "" +msgstr "KopÃrovaÅ¥ track-y" #: editor/animation_track_editor.cpp msgid "Scale Selection" @@ -567,87 +562,83 @@ msgstr "DuplikovaÅ¥ výber" #: editor/animation_track_editor.cpp msgid "Duplicate Transposed" -msgstr "" +msgstr "Duplikovanie transponovaných" #: editor/animation_track_editor.cpp -#, fuzzy msgid "Delete Selection" -msgstr "VÅ¡etky vybrané" +msgstr "VymazaÅ¥ výber" #: editor/animation_track_editor.cpp -#, fuzzy msgid "Go to Next Step" msgstr "PrejsÅ¥ na Äalšà krok" #: editor/animation_track_editor.cpp -#, fuzzy msgid "Go to Previous Step" msgstr "PrejsÅ¥ na predchádzajúci krok" #: editor/animation_track_editor.cpp msgid "Optimize Animation" -msgstr "" +msgstr "Optimalizácia Animacie" #: editor/animation_track_editor.cpp msgid "Clean-Up Animation" -msgstr "" +msgstr "VyÄistenie Animácie" #: editor/animation_track_editor.cpp msgid "Pick the node that will be animated:" -msgstr "" +msgstr "Vyberte node ktorý bude animovaný:" #: editor/animation_track_editor.cpp msgid "Use Bezier Curves" -msgstr "" +msgstr "PoužiÅ¥ Bezier Curves" #: editor/animation_track_editor.cpp msgid "Anim. Optimizer" -msgstr "" +msgstr "Optimalizér AnimáciÃ" #: editor/animation_track_editor.cpp msgid "Max. Linear Error:" -msgstr "" +msgstr "Max. Linear Error:" #: editor/animation_track_editor.cpp msgid "Max. Angular Error:" -msgstr "" +msgstr "Max. Angular Error:" #: editor/animation_track_editor.cpp msgid "Max Optimizable Angle:" -msgstr "" +msgstr "Maximálny Optimalizovatelný Uhol:" #: editor/animation_track_editor.cpp msgid "Optimize" -msgstr "" +msgstr "Optimalizácia" #: editor/animation_track_editor.cpp msgid "Remove invalid keys" -msgstr "" +msgstr "VymazaÅ¥ neplatné kľúÄe" #: editor/animation_track_editor.cpp msgid "Remove unresolved and empty tracks" -msgstr "" +msgstr "VymazaÅ¥ nevyrieÅ¡ené a prázdne track-y" #: editor/animation_track_editor.cpp msgid "Clean-up all animations" -msgstr "" +msgstr "VyÄistiÅ¥ vÅ¡etky animácie" #: editor/animation_track_editor.cpp msgid "Clean-Up Animation(s) (NO UNDO!)" -msgstr "" +msgstr "VyÄistenie Animácià (NIEJE KROK SPÄŤ!)" #: editor/animation_track_editor.cpp msgid "Clean-Up" -msgstr "" +msgstr "VyÄistenie" #: editor/animation_track_editor.cpp msgid "Scale Ratio:" -msgstr "" +msgstr "Pomer mierky:" #: editor/animation_track_editor.cpp -#, fuzzy msgid "Select Tracks to Copy" -msgstr "NastaviÅ¥ prechody na:" +msgstr "VybraÅ¥ Track-y na skopÃrovanie" #: editor/animation_track_editor.cpp editor/editor_log.cpp #: editor/editor_properties.cpp @@ -659,136 +650,133 @@ msgid "Copy" msgstr "KopÃrovaÅ¥" #: editor/animation_track_editor.cpp -#, fuzzy msgid "Select All/None" -msgstr "VÅ¡etky vybrané" +msgstr "VybraÅ¥ vÅ¡etko/niÄ" #: editor/animation_track_editor_plugins.cpp msgid "Add Audio Track Clip" -msgstr "" +msgstr "PridaÅ¥ Audio Track Clip" #: editor/animation_track_editor_plugins.cpp msgid "Change Audio Track Clip Start Offset" -msgstr "" +msgstr "ZmeniÅ¥ Audio Track Clip spustiÅ¥ Offset" #: editor/animation_track_editor_plugins.cpp msgid "Change Audio Track Clip End Offset" -msgstr "" +msgstr "ZmeniÅ¥ Audio Track Clip koniec Offset-u" #: editor/array_property_edit.cpp msgid "Resize Array" -msgstr "" +msgstr "ZmeniÅ¥ veľkosÅ¥ Array-u" #: editor/array_property_edit.cpp msgid "Change Array Value Type" -msgstr "" +msgstr "ZmeniÅ¥ hodnotu Array-u" #: editor/array_property_edit.cpp msgid "Change Array Value" -msgstr "" +msgstr "ZmeniÅ¥ hodnotu Array-u" #: editor/code_editor.cpp msgid "Go to Line" -msgstr "" +msgstr "ChoÄte na LÃniu" #: editor/code_editor.cpp msgid "Line Number:" -msgstr "" +msgstr "ÄŒÃslo lÃnie:" #: editor/code_editor.cpp msgid "%d replaced." -msgstr "" +msgstr "%d náhradené." #: editor/code_editor.cpp editor/editor_help.cpp msgid "%d match." -msgstr "" +msgstr "%d sa zhoduje." #: editor/code_editor.cpp editor/editor_help.cpp -#, fuzzy msgid "%d matches." -msgstr "Zhody:" +msgstr "%d zhody." #: editor/code_editor.cpp editor/find_in_files.cpp msgid "Match Case" -msgstr "" +msgstr "Match Case" #: editor/code_editor.cpp editor/find_in_files.cpp msgid "Whole Words" -msgstr "" +msgstr "Celé slová" #: editor/code_editor.cpp editor/rename_dialog.cpp msgid "Replace" -msgstr "" +msgstr "NahradiÅ¥" #: editor/code_editor.cpp msgid "Replace All" -msgstr "" +msgstr "NahradiÅ¥ VÅ¡etko" #: editor/code_editor.cpp msgid "Selection Only" -msgstr "" +msgstr "Iba Výber" #: editor/code_editor.cpp editor/plugins/script_text_editor.cpp #: editor/plugins/text_editor.cpp msgid "Standard" -msgstr "" +msgstr "Å tandard" #: editor/code_editor.cpp editor/plugins/script_editor_plugin.cpp msgid "Toggle Scripts Panel" -msgstr "" +msgstr "Vypnúť Panel Script-ov" #: editor/code_editor.cpp editor/plugins/canvas_item_editor_plugin.cpp #: editor/plugins/texture_region_editor_plugin.cpp #: editor/plugins/tile_set_editor_plugin.cpp scene/gui/graph_edit.cpp msgid "Zoom In" -msgstr "" +msgstr "PriblÞiÅ¥" #: editor/code_editor.cpp editor/plugins/canvas_item_editor_plugin.cpp #: editor/plugins/texture_region_editor_plugin.cpp #: editor/plugins/tile_set_editor_plugin.cpp scene/gui/graph_edit.cpp msgid "Zoom Out" -msgstr "" +msgstr "OddialiÅ¥" #: editor/code_editor.cpp msgid "Reset Zoom" -msgstr "" +msgstr "ResetovaÅ¥ priblÞenie" #: editor/code_editor.cpp msgid "Warnings" -msgstr "" +msgstr "Varovania" #: editor/code_editor.cpp msgid "Line and column numbers." -msgstr "" +msgstr "ÄŒÃsla riadkov a stĺpcov." #: editor/connections_dialog.cpp msgid "Method in target node must be specified." -msgstr "" +msgstr "Metóda v target node-e musà byÅ¥ Å¡pecifikovaná." #: editor/connections_dialog.cpp msgid "" "Target method not found. Specify a valid method or attach a script to the " "target node." msgstr "" +"Metóda Target sa nenaÅ¡la. Å pecifikujte platnú metódu alebo pripojte script k " +"target node-u." #: editor/connections_dialog.cpp -#, fuzzy msgid "Connect to Node:" -msgstr "PripojiÅ¥ k Node:" +msgstr "PripojiÅ¥ k Node-u:" #: editor/connections_dialog.cpp -#, fuzzy msgid "Connect to Script:" -msgstr "PripojiÅ¥ k Node:" +msgstr "PripojiÅ¥ k Scriptu:" #: editor/connections_dialog.cpp -#, fuzzy msgid "From Signal:" -msgstr "Signály:" +msgstr "Zo Signálu:" #: editor/connections_dialog.cpp msgid "Scene does not contain any script." -msgstr "" +msgstr "Scéna neobsahuje žiadny script." #: editor/connections_dialog.cpp editor/editor_autoload_settings.cpp #: editor/groups_editor.cpp editor/plugins/item_list_editor_plugin.cpp @@ -809,43 +797,40 @@ msgstr "OdstrániÅ¥" #: editor/connections_dialog.cpp msgid "Add Extra Call Argument:" -msgstr "" +msgstr "Pridajte Extra Call Argument:" #: editor/connections_dialog.cpp msgid "Extra Call Arguments:" -msgstr "" +msgstr "Extra Call Argumenty:" #: editor/connections_dialog.cpp -#, fuzzy msgid "Receiver Method:" -msgstr "Filter:" +msgstr "Metóda PrijÃmaÄa:" #: editor/connections_dialog.cpp -#, fuzzy msgid "Advanced" -msgstr "Vyvážený" +msgstr "PokroÄilé" #: editor/connections_dialog.cpp msgid "Deferred" -msgstr "" +msgstr "Odložené" #: editor/connections_dialog.cpp msgid "" "Defers the signal, storing it in a queue and only firing it at idle time." -msgstr "" +msgstr "Odložà signál, uložà ho do queue a vystrelà ho iba cez idle time." #: editor/connections_dialog.cpp msgid "Oneshot" -msgstr "" +msgstr "Oneshot" #: editor/connections_dialog.cpp msgid "Disconnects the signal after its first emission." -msgstr "" +msgstr "Odpojà signál po jeho prvej emisii." #: editor/connections_dialog.cpp -#, fuzzy msgid "Cannot connect signal" -msgstr "PripojiÅ¥ Signál: " +msgstr "Nedá sa pripojiÅ¥ signál" #: editor/connections_dialog.cpp editor/dependency_editor.cpp #: editor/export_template_manager.cpp editor/groups_editor.cpp @@ -867,9 +852,8 @@ msgid "Connect" msgstr "PripojiÅ¥" #: editor/connections_dialog.cpp -#, fuzzy msgid "Signal:" -msgstr "Signály:" +msgstr "Signál:" #: editor/connections_dialog.cpp msgid "Connect '%s' to '%s'" @@ -893,14 +877,12 @@ msgid "Disconnect" msgstr "OdpojiÅ¥" #: editor/connections_dialog.cpp -#, fuzzy msgid "Connect a Signal to a Method" -msgstr "PripojiÅ¥ Signál: " +msgstr "PripojiÅ¥ Signál k Metóde" #: editor/connections_dialog.cpp -#, fuzzy msgid "Edit Connection:" -msgstr "UpraviÅ¥ Pripojenie: " +msgstr "UpraviÅ¥ Pripojenie:" #: editor/connections_dialog.cpp msgid "Are you sure you want to remove all connections from the \"%s\" signal?" @@ -976,22 +958,20 @@ msgid "Dependencies For:" msgstr "Závislosti pre:" #: editor/dependency_editor.cpp -#, fuzzy msgid "" "Scene '%s' is currently being edited.\n" "Changes will only take effect when reloaded." msgstr "" "Scéna '%s' sa práve upravuje.\n" -"Zmeny sa neprejavia, pokiaľ znovu naÄÃtané." +"Zmeny sa prejavia iba keÄ sa znovu naÄÃtajú." #: editor/dependency_editor.cpp -#, fuzzy msgid "" "Resource '%s' is in use.\n" "Changes will only take effect when reloaded." msgstr "" "Scéna '%s' sa práve upravuje.\n" -"Zmeny sa neprejavia, pokiaľ znovu naÄÃtané." +"Zmeny sa prejavia iba keÄ sa znovu naÄÃtajú." #: editor/dependency_editor.cpp #: modules/gdnative/gdnative_library_editor_plugin.cpp @@ -1038,7 +1018,6 @@ msgid "Owners Of:" msgstr "Majitelia:" #: editor/dependency_editor.cpp -#, fuzzy msgid "Remove selected files from the project? (Can't be restored)" msgstr "OdstrániÅ¥ vybraté súbory z projektu? (nedá sa vrátiÅ¥ späť)" @@ -1084,13 +1063,12 @@ msgid "Permanently delete %d item(s)? (No undo!)" msgstr "Natrvalo odstrániÅ¥ %d položky? (Nedá sa vrátiÅ¥ späť!)" #: editor/dependency_editor.cpp -#, fuzzy msgid "Show Dependencies" -msgstr "ZávislostÃ" +msgstr "ZobraziÅ¥ ZávislosÅ¥i" #: editor/dependency_editor.cpp msgid "Orphan Resource Explorer" -msgstr "" +msgstr "Orphan Resource Explorer" #: editor/dependency_editor.cpp editor/editor_audio_buses.cpp #: editor/editor_file_dialog.cpp editor/editor_node.cpp @@ -1177,7 +1155,6 @@ msgid "License" msgstr "Licencia" #: editor/editor_about.cpp -#, fuzzy msgid "Third-party Licenses" msgstr "Thirdparty Licencie" @@ -1188,13 +1165,16 @@ msgid "" "is an exhaustive list of all such third-party components with their " "respective copyright statements and license terms." msgstr "" +"Godot Engine sa spolieha na množstvo bezplatných a otvorených knižnÃc " +"tretÃch strán, ktoré sú kompatibilné s podmienkami licencie MIT. Nasleduje " +"vyÄerpávajúci zoznam vÅ¡etkých takýchto komponentov tretÃch strán s ich " +"prÃsluÅ¡nými prehláseniami o autorských právach a licenÄnými podmienkami." #: editor/editor_about.cpp msgid "All Components" msgstr "VÅ¡etky Komponenty" #: editor/editor_about.cpp -#, fuzzy msgid "Components" msgstr "Komponenty" @@ -1203,26 +1183,24 @@ msgid "Licenses" msgstr "Licencie" #: editor/editor_asset_installer.cpp editor/project_manager.cpp -#, fuzzy msgid "Error opening package file, not in ZIP format." msgstr "Chyba pri otváranà súboru balÃka, nie je vo formáte zip." #: editor/editor_asset_installer.cpp msgid "%s (Already Exists)" -msgstr "" +msgstr "%s (Už Existuje)" #: editor/editor_asset_installer.cpp msgid "Uncompressing Assets" -msgstr "" +msgstr "Dekompresia Prostriedkov" #: editor/editor_asset_installer.cpp editor/project_manager.cpp msgid "The following files failed extraction from package:" -msgstr "" +msgstr "Nasledovné súbory sa nepodarilo extrahovaÅ¥ z balÃka:" #: editor/editor_asset_installer.cpp -#, fuzzy msgid "And %s more files." -msgstr "VytvoriÅ¥ adresár" +msgstr "A %s viac súborov." #: editor/editor_asset_installer.cpp editor/project_manager.cpp msgid "Package installed successfully!" @@ -1234,9 +1212,8 @@ msgid "Success!" msgstr "Úspech!" #: editor/editor_asset_installer.cpp -#, fuzzy msgid "Package Contents:" -msgstr "KonÅ¡tanty:" +msgstr "BalÃÄek Obsahu:" #: editor/editor_asset_installer.cpp editor/editor_node.cpp msgid "Install" @@ -1255,46 +1232,44 @@ msgid "Add Effect" msgstr "PridaÅ¥ Efekt" #: editor/editor_audio_buses.cpp -#, fuzzy msgid "Rename Audio Bus" -msgstr "VÅ¡etky vybrané" +msgstr "PremenovaÅ¥ Audio Bus" #: editor/editor_audio_buses.cpp -#, fuzzy msgid "Change Audio Bus Volume" -msgstr "VÅ¡etky vybrané" +msgstr "ZmeniÅ¥ hlasitosÅ¥ Audio Bus-u" #: editor/editor_audio_buses.cpp msgid "Toggle Audio Bus Solo" -msgstr "" +msgstr "Prepnúť Audio Bus Solo" #: editor/editor_audio_buses.cpp msgid "Toggle Audio Bus Mute" -msgstr "" +msgstr "Prepnúť Audio Bus Mute" #: editor/editor_audio_buses.cpp msgid "Toggle Audio Bus Bypass Effects" -msgstr "" +msgstr "Prepnúť Audio Bus Bypass Effects" #: editor/editor_audio_buses.cpp msgid "Select Audio Bus Send" -msgstr "" +msgstr "VybraÅ¥ Audio Bus Send" #: editor/editor_audio_buses.cpp msgid "Add Audio Bus Effect" -msgstr "" +msgstr "PridaÅ¥ Audio Bus Effect" #: editor/editor_audio_buses.cpp msgid "Move Bus Effect" -msgstr "" +msgstr "Posunúť Bus Effect" #: editor/editor_audio_buses.cpp msgid "Delete Bus Effect" -msgstr "" +msgstr "VymazaÅ¥ Bus Effect" #: editor/editor_audio_buses.cpp msgid "Drag & drop to rearrange." -msgstr "" +msgstr "Zoberte a položte(drag & drop) pre rearandžovanie." #: editor/editor_audio_buses.cpp msgid "Solo" @@ -1310,7 +1285,7 @@ msgstr "ObÃsÅ¥" #: editor/editor_audio_buses.cpp msgid "Bus options" -msgstr "" +msgstr "Možnosti pre Bus" #: editor/editor_audio_buses.cpp editor/filesystem_dock.cpp #: editor/plugins/animation_player_editor_plugin.cpp editor/scene_tree_dock.cpp @@ -1331,64 +1306,63 @@ msgstr "Audio" #: editor/editor_audio_buses.cpp msgid "Add Audio Bus" -msgstr "" +msgstr "PridaÅ¥ Audio Bus" #: editor/editor_audio_buses.cpp msgid "Master bus can't be deleted!" -msgstr "" +msgstr "Master bus nemôžete vymazaÅ¥!" #: editor/editor_audio_buses.cpp msgid "Delete Audio Bus" -msgstr "" +msgstr "VymazaÅ¥ Audio Bus" #: editor/editor_audio_buses.cpp msgid "Duplicate Audio Bus" -msgstr "" +msgstr "DuplikovaÅ¥ Audio Bus" #: editor/editor_audio_buses.cpp msgid "Reset Bus Volume" -msgstr "" +msgstr "ResetovaÅ¥ hlasitosÅ¥ Bus-u" #: editor/editor_audio_buses.cpp msgid "Move Audio Bus" -msgstr "" +msgstr "Presunúť Audio Bus" #: editor/editor_audio_buses.cpp msgid "Save Audio Bus Layout As..." -msgstr "" +msgstr "UložiÅ¥ Audio Bus Layaut Ako..." #: editor/editor_audio_buses.cpp msgid "Location for New Layout..." -msgstr "" +msgstr "Lokácia pre Nový Layout..." #: editor/editor_audio_buses.cpp msgid "Open Audio Bus Layout" -msgstr "" +msgstr "OtvoriÅ¥ Audio Bus Layout" #: editor/editor_audio_buses.cpp msgid "There is no '%s' file." -msgstr "" +msgstr "Nenà tu žiadny '%s' súbor." #: editor/editor_audio_buses.cpp editor/plugins/canvas_item_editor_plugin.cpp msgid "Layout" -msgstr "" +msgstr "Layout" #: editor/editor_audio_buses.cpp msgid "Invalid file, not an audio bus layout." -msgstr "" +msgstr "Neplatný súbor, nenà audio bus layout." #: editor/editor_audio_buses.cpp -#, fuzzy msgid "Error saving file: %s" -msgstr "Chyba pri naÄÃtanÃ:" +msgstr "Chyba uloženia súbora: %s" #: editor/editor_audio_buses.cpp msgid "Add Bus" -msgstr "" +msgstr "PridaÅ¥ Bus" #: editor/editor_audio_buses.cpp msgid "Add a new Audio Bus to this layout." -msgstr "" +msgstr "PridaÅ¥ nový Audio Bus do tohoto layout-u." #: editor/editor_audio_buses.cpp editor/editor_properties.cpp #: editor/plugins/animation_player_editor_plugin.cpp editor/property_editor.cpp @@ -1397,9 +1371,8 @@ msgid "Load" msgstr "NaÄÃtaÅ¥" #: editor/editor_audio_buses.cpp -#, fuzzy msgid "Load an existing Bus Layout." -msgstr "Popis:" +msgstr "NaÄÃtaÅ¥ existujúci Bus Layout." #: editor/editor_audio_buses.cpp msgid "Save As" @@ -1407,7 +1380,7 @@ msgstr "UložiÅ¥ Ako" #: editor/editor_audio_buses.cpp msgid "Save this Bus Layout to a file." -msgstr "" +msgstr "UložiÅ¥ tento Bus Layout do súboru." #: editor/editor_audio_buses.cpp editor/import_dock.cpp msgid "Load Default" @@ -1415,11 +1388,11 @@ msgstr "NaÄÃtaÅ¥ predvolené" #: editor/editor_audio_buses.cpp msgid "Load the default Bus Layout." -msgstr "" +msgstr "NaÄÃtaÅ¥ základný Bus Layout." #: editor/editor_audio_buses.cpp msgid "Create a new Bus Layout." -msgstr "" +msgstr "VytvoriÅ¥ nový Bus Layout." #: editor/editor_autoload_settings.cpp msgid "Invalid name." @@ -1427,68 +1400,67 @@ msgstr "Neplatný Názov." #: editor/editor_autoload_settings.cpp msgid "Valid characters:" -msgstr "" +msgstr "Platné pÃsmená:" #: editor/editor_autoload_settings.cpp msgid "Must not collide with an existing engine class name." -msgstr "" +msgstr "Nesmie kolidovaÅ¥(collide) s existujúcim názvom engine class-u." #: editor/editor_autoload_settings.cpp msgid "Must not collide with an existing built-in type name." -msgstr "" +msgstr "Nesmie kolidovaÅ¥(collide) s existujúcim menom pre built-in-type." #: editor/editor_autoload_settings.cpp msgid "Must not collide with an existing global constant name." -msgstr "" +msgstr "Nesmie kolidovaÅ¥ s existujúcim menom pre global constant." #: editor/editor_autoload_settings.cpp msgid "Keyword cannot be used as an autoload name." -msgstr "" +msgstr "KľúÄové slovo nemožno použiÅ¥ ako AutoLoad názvu." #: editor/editor_autoload_settings.cpp msgid "Autoload '%s' already exists!" -msgstr "" +msgstr "AutoLoad '%s' už existujuje!" #: editor/editor_autoload_settings.cpp msgid "Rename Autoload" -msgstr "" +msgstr "PremenovaÅ¥ AutoLoad" #: editor/editor_autoload_settings.cpp msgid "Toggle AutoLoad Globals" -msgstr "" +msgstr "Prepnúť globálne AutoLoad-y" #: editor/editor_autoload_settings.cpp msgid "Move Autoload" -msgstr "" +msgstr "Presunúť AutoLoad-y" #: editor/editor_autoload_settings.cpp msgid "Remove Autoload" -msgstr "" +msgstr "VymazaÅ¥ AutoLoad" -#: editor/editor_autoload_settings.cpp +#: editor/editor_autoload_settings.cpp editor/editor_plugin_settings.cpp msgid "Enable" -msgstr "" +msgstr "PovoliÅ¥" #: editor/editor_autoload_settings.cpp msgid "Rearrange Autoloads" -msgstr "" +msgstr "RearandžovaÅ¥ AutoLoad-y" #: editor/editor_autoload_settings.cpp editor/script_create_dialog.cpp -#, fuzzy msgid "Invalid path." -msgstr "Neplatný Názov." +msgstr "Neplatná cesta." #: editor/editor_autoload_settings.cpp editor/script_create_dialog.cpp msgid "File does not exist." -msgstr "" +msgstr "Súbor neexistuje." #: editor/editor_autoload_settings.cpp msgid "Not in resource path." -msgstr "" +msgstr "Nieje v resource path." #: editor/editor_autoload_settings.cpp msgid "Add AutoLoad" -msgstr "" +msgstr "PridaÅ¥ AutoLoad" #: editor/editor_autoload_settings.cpp editor/editor_file_dialog.cpp #: editor/editor_plugin_settings.cpp @@ -1499,49 +1471,49 @@ msgstr "Cesta:" #: editor/editor_autoload_settings.cpp msgid "Node Name:" -msgstr "" +msgstr "Meno Node-u:" #: editor/editor_autoload_settings.cpp editor/editor_help_search.cpp #: editor/editor_profiler.cpp editor/project_manager.cpp #: editor/settings_config_dialog.cpp msgid "Name" -msgstr "" +msgstr "Meno" #: editor/editor_autoload_settings.cpp msgid "Singleton" -msgstr "" +msgstr "Singleton" #: editor/editor_data.cpp editor/inspector_dock.cpp msgid "Paste Params" -msgstr "" +msgstr "VložiÅ¥ Params" #: editor/editor_data.cpp msgid "Updating Scene" -msgstr "" +msgstr "AktualizovaÅ¥ Scénu" #: editor/editor_data.cpp msgid "Storing local changes..." -msgstr "" +msgstr "Ukladanie lokálnych zmien..." #: editor/editor_data.cpp msgid "Updating scene..." -msgstr "" +msgstr "Aktualizovanie scény..." #: editor/editor_data.cpp editor/editor_properties.cpp msgid "[empty]" -msgstr "" +msgstr "[Prázdne]" #: editor/editor_data.cpp msgid "[unsaved]" -msgstr "" +msgstr "[Neuložené]" #: editor/editor_dir_dialog.cpp msgid "Please select a base directory first." -msgstr "" +msgstr "Najprv vyberte základný adresár." #: editor/editor_dir_dialog.cpp msgid "Choose a Directory" -msgstr "" +msgstr "Vyberte adresár" #: editor/editor_dir_dialog.cpp editor/editor_file_dialog.cpp #: editor/filesystem_dock.cpp editor/project_manager.cpp @@ -1559,35 +1531,39 @@ msgstr "Meno:" #: editor/editor_dir_dialog.cpp editor/editor_file_dialog.cpp #: editor/filesystem_dock.cpp scene/gui/file_dialog.cpp msgid "Could not create folder." -msgstr "" +msgstr "PrieÄinok sa nepodarilo vytvoriÅ¥." #: editor/editor_dir_dialog.cpp msgid "Choose" -msgstr "" +msgstr "Vyberte" #: editor/editor_export.cpp msgid "Storing File:" -msgstr "" +msgstr "Ukladanie súboru:" #: editor/editor_export.cpp msgid "No export template found at the expected path:" -msgstr "" +msgstr "Na oÄakávanej ceste sa nenaÅ¡la žiadna exportná cesta:" #: editor/editor_export.cpp msgid "Packing" -msgstr "" +msgstr "Zabalovanie" #: editor/editor_export.cpp msgid "" "Target platform requires 'ETC' texture compression for GLES2. Enable 'Import " "Etc' in Project Settings." msgstr "" +"Target platforma potrebuje 'ETC' kompresor textúr pre GLES2. PovoliÅ¥ 'Import " +"Etc' v Nastaveniach Projektu." #: editor/editor_export.cpp msgid "" "Target platform requires 'ETC2' texture compression for GLES3. Enable " "'Import Etc 2' in Project Settings." msgstr "" +"Target platforma potrebuje 'ETC2' kompresor textúr pre GLES3. PovoliÅ¥'Import " +"Etc 2' v Nastaveniach Projektu." #: editor/editor_export.cpp msgid "" @@ -1596,219 +1572,211 @@ msgid "" "Enable 'Import Etc' in Project Settings, or disable 'Driver Fallback " "Enabled'." msgstr "" +"Target platform potrebuje'ETC' kompresor textúr pre driver fallback do " +"GLES2.\n" +"Povoľte 'Import Etc' v Nastaveniach Projektu, alebo vipnite 'Driver Fallback " +"Enabled'." #: editor/editor_export.cpp platform/android/export/export.cpp #: platform/iphone/export/export.cpp platform/javascript/export/export.cpp #: platform/osx/export/export.cpp platform/uwp/export/export.cpp msgid "Custom debug template not found." -msgstr "" +msgstr "Vlastná debug Å¡ablóna sa nenaÅ¡la." #: editor/editor_export.cpp platform/android/export/export.cpp #: platform/iphone/export/export.cpp platform/javascript/export/export.cpp #: platform/osx/export/export.cpp platform/uwp/export/export.cpp msgid "Custom release template not found." -msgstr "" +msgstr "Vlastná release Å¡ablóna sa nenaÅ¡la." #: editor/editor_export.cpp platform/javascript/export/export.cpp msgid "Template file not found:" -msgstr "" +msgstr "Súbor Å ablóny sa nenaÅ¡iel:" #: editor/editor_export.cpp msgid "On 32-bit exports the embedded PCK cannot be bigger than 4 GiB." -msgstr "" +msgstr "Pri 32-bitovom exporte nemôže byÅ¥ vložená PCK väÄÅ¡ia ako 4 GiB." #: editor/editor_feature_profile.cpp -#, fuzzy msgid "3D Editor" -msgstr "Otvorit prieÄinok" +msgstr "3D Editor" #: editor/editor_feature_profile.cpp -#, fuzzy msgid "Script Editor" -msgstr "Otvorit prieÄinok" +msgstr "Script Editor" #: editor/editor_feature_profile.cpp msgid "Asset Library" -msgstr "" +msgstr "Asset Library" #: editor/editor_feature_profile.cpp msgid "Scene Tree Editing" -msgstr "" +msgstr "Editovanie Stromu Scén" #: editor/editor_feature_profile.cpp msgid "Import Dock" -msgstr "" +msgstr "ImportovaÅ¥ Dock" #: editor/editor_feature_profile.cpp msgid "Node Dock" -msgstr "" +msgstr "Node Dock" #: editor/editor_feature_profile.cpp msgid "FileSystem and Import Docks" -msgstr "" +msgstr "Systém súborov a Import Dock-y" #: editor/editor_feature_profile.cpp msgid "Erase profile '%s'? (no undo)" -msgstr "" +msgstr "VymazaÅ¥ profil '%s'? (Nedá sa vrátiÅ¥ späť)" #: editor/editor_feature_profile.cpp msgid "Profile must be a valid filename and must not contain '.'" -msgstr "" +msgstr "Profil musà maÅ¥ platný názov súboru a musà obsahovaÅ¥ '.'" #: editor/editor_feature_profile.cpp msgid "Profile with this name already exists." -msgstr "" +msgstr "Profil s týmto menom už existuje." #: editor/editor_feature_profile.cpp msgid "(Editor Disabled, Properties Disabled)" -msgstr "" +msgstr "(Editor je vypnutý, Vlastnosti sú vypnuté)" #: editor/editor_feature_profile.cpp msgid "(Properties Disabled)" -msgstr "" +msgstr "(Vlastnosi sú vypnuté)" #: editor/editor_feature_profile.cpp -#, fuzzy msgid "(Editor Disabled)" -msgstr "Vypnuté" +msgstr "(Editor je vypnutý)" #: editor/editor_feature_profile.cpp -#, fuzzy msgid "Class Options:" -msgstr "Popis:" +msgstr "Možnosti pre Class:" #: editor/editor_feature_profile.cpp msgid "Enable Contextual Editor" -msgstr "" +msgstr "PovoliÅ¥ Kontextuálny Editor" #: editor/editor_feature_profile.cpp -#, fuzzy msgid "Enabled Properties:" -msgstr "Filter:" +msgstr "Povolené Vlastnosti:" #: editor/editor_feature_profile.cpp msgid "Enabled Features:" -msgstr "" +msgstr "Povolené Funkcie:" #: editor/editor_feature_profile.cpp msgid "Enabled Classes:" -msgstr "" +msgstr "Povolené Class-y:" #: editor/editor_feature_profile.cpp msgid "File '%s' format is invalid, import aborted." -msgstr "" +msgstr "Formát súboru '%s' je neplatny, Import bol preruÅ¡ený." #: editor/editor_feature_profile.cpp msgid "" "Profile '%s' already exists. Remove it first before importing, import " "aborted." msgstr "" +"Profil '%s' už existuje. Najprv ho Vymažte ako zaÄnete ImportovaÅ¥, import je " +"preruÅ¡ený." #: editor/editor_feature_profile.cpp msgid "Error saving profile to path: '%s'." -msgstr "" +msgstr "Error pri ukladanà profilu do cesty: '%s'." #: editor/editor_feature_profile.cpp msgid "Unset" -msgstr "" +msgstr "Unset" #: editor/editor_feature_profile.cpp -#, fuzzy msgid "Current Profile:" -msgstr "VytvoriÅ¥ adresár" +msgstr "Aktuálny Profil:" #: editor/editor_feature_profile.cpp msgid "Make Current" -msgstr "" +msgstr "SpraviÅ¥ Aktuálny" #: editor/editor_feature_profile.cpp #: editor/plugins/animation_player_editor_plugin.cpp #: editor/plugins/version_control_editor_plugin.cpp msgid "New" -msgstr "" +msgstr "Nový" #: editor/editor_feature_profile.cpp editor/editor_node.cpp #: editor/project_manager.cpp msgid "Import" -msgstr "" +msgstr "Import" #: editor/editor_feature_profile.cpp editor/project_export.cpp msgid "Export" -msgstr "" +msgstr "Export" #: editor/editor_feature_profile.cpp -#, fuzzy msgid "Available Profiles:" -msgstr "Filter:" +msgstr "Profily k dispozÃcii:" #: editor/editor_feature_profile.cpp -#, fuzzy msgid "Class Options" -msgstr "Popis:" +msgstr "Možnosti pre Class" #: editor/editor_feature_profile.cpp msgid "New profile name:" -msgstr "" +msgstr "Nové profilové meno:" #: editor/editor_feature_profile.cpp -#, fuzzy msgid "Erase Profile" -msgstr "VÅ¡etky vybrané" +msgstr "VymazaÅ¥ Profil" #: editor/editor_feature_profile.cpp msgid "Godot Feature Profile" -msgstr "" +msgstr "Godot Feature Profil" #: editor/editor_feature_profile.cpp msgid "Import Profile(s)" -msgstr "" +msgstr "ImportovaÅ¥ Profil(y)" #: editor/editor_feature_profile.cpp msgid "Export Profile" -msgstr "" +msgstr "ExportovaÅ¥ Profil" #: editor/editor_feature_profile.cpp msgid "Manage Editor Feature Profiles" -msgstr "" +msgstr "SpravovaÅ¥ Feature Profily Editora" #: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp -#, fuzzy msgid "Select Current Folder" -msgstr "VytvoriÅ¥ adresár" +msgstr "VybraÅ¥ Aktuálny PrieÄinok" #: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp msgid "File Exists, Overwrite?" -msgstr "" +msgstr "Súbor Existuje, PredpÃsaÅ¥?" #: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp -#, fuzzy msgid "Select This Folder" -msgstr "VytvoriÅ¥ adresár" +msgstr "VybraÅ¥ Tento PrieÄinok" #: editor/editor_file_dialog.cpp editor/filesystem_dock.cpp msgid "Copy Path" -msgstr "" +msgstr "SkopÃrovaÅ¥ Cestu" #: editor/editor_file_dialog.cpp editor/filesystem_dock.cpp -#, fuzzy msgid "Open in File Manager" -msgstr "OtvoriÅ¥ súbor" +msgstr "OtvoriÅ¥ v File Manažérovy" #: editor/editor_file_dialog.cpp editor/editor_node.cpp #: editor/filesystem_dock.cpp editor/project_manager.cpp -#, fuzzy msgid "Show in File Manager" -msgstr "OtvoriÅ¥ súbor" +msgstr "UkázaÅ¥ v File Manažérovy" #: editor/editor_file_dialog.cpp editor/filesystem_dock.cpp -#, fuzzy msgid "New Folder..." -msgstr "VytvoriÅ¥ adresár" +msgstr "Nový PrieÄinok..." #: editor/editor_file_dialog.cpp editor/find_in_files.cpp #: editor/plugins/version_control_editor_plugin.cpp msgid "Refresh" -msgstr "" +msgstr "ObnoviÅ¥" #: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp msgid "All Recognized" @@ -1816,7 +1784,7 @@ msgstr "VÅ¡etko rozpoznané" #: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp msgid "All Files (*)" -msgstr "" +msgstr "VÅ¡etky Súbory (*)" #: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp msgid "Open a File" @@ -1847,74 +1815,71 @@ msgstr "UložiÅ¥ súbor" #: editor/editor_file_dialog.cpp msgid "Go Back" -msgstr "" +msgstr "ÃsÅ¥ Naspäť" #: editor/editor_file_dialog.cpp msgid "Go Forward" -msgstr "" +msgstr "ÃsÅ¥ Dopredu" #: editor/editor_file_dialog.cpp msgid "Go Up" -msgstr "" +msgstr "ÃsÅ¥ Hore" #: editor/editor_file_dialog.cpp msgid "Toggle Hidden Files" -msgstr "" +msgstr "Prepnúť Skryté Súbory" #: editor/editor_file_dialog.cpp msgid "Toggle Favorite" -msgstr "" +msgstr "Prepnúť Obľúbené" #: editor/editor_file_dialog.cpp msgid "Toggle Mode" -msgstr "" +msgstr "Prepnúť Mode" #: editor/editor_file_dialog.cpp msgid "Focus Path" -msgstr "" +msgstr "ZameraÅ¥ Cestu" #: editor/editor_file_dialog.cpp msgid "Move Favorite Up" -msgstr "" +msgstr "Posunúť obľúbené Vyššie" #: editor/editor_file_dialog.cpp msgid "Move Favorite Down" -msgstr "" +msgstr "Posunúť Obľúbené Nižšie" #: editor/editor_file_dialog.cpp -#, fuzzy msgid "Go to previous folder." -msgstr "VytvoriÅ¥ adresár" +msgstr "ÃsÅ¥ do predchádzajúceho prieÄinka." #: editor/editor_file_dialog.cpp -#, fuzzy msgid "Go to next folder." -msgstr "VytvoriÅ¥ adresár" +msgstr "ÃsÅ¥ do ÄalÅ¡ieho prieÄinka." #: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp -#, fuzzy msgid "Go to parent folder." -msgstr "VytvoriÅ¥ adresár" +msgstr "ÃsÅ¥ do parent folder." #: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp msgid "Refresh files." -msgstr "" +msgstr "ObnoviÅ¥ súbory." #: editor/editor_file_dialog.cpp msgid "(Un)favorite current folder." -msgstr "" +msgstr "(Od)obľúbiÅ¥ aktuálny prieÄinok." #: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp msgid "Toggle the visibility of hidden files." -msgstr "" +msgstr "Prepnúť viditeľnosÅ¥ skrytých súborov." #: editor/editor_file_dialog.cpp editor/filesystem_dock.cpp msgid "View items as a grid of thumbnails." -msgstr "" +msgstr "ZobraziÅ¥ veci ako mriežku náhľadov." #: editor/editor_file_dialog.cpp editor/filesystem_dock.cpp msgid "View items as a list." -msgstr "" +msgstr "ZobraziÅ¥ veci ako list." #: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp msgid "Directories & Files:" @@ -1924,7 +1889,7 @@ msgstr "PrieÄinky a Súbory:" #: editor/plugins/style_box_editor_plugin.cpp #: editor/plugins/theme_editor_plugin.cpp msgid "Preview:" -msgstr "" +msgstr "Ako to bude vyzeraÅ¥:" #: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp msgid "File:" @@ -1932,25 +1897,27 @@ msgstr "Súbor:" #: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp msgid "Must use a valid extension." -msgstr "" +msgstr "MusÃte použiÅ¥ platné rozÅ¡Ãrenie." #: editor/editor_file_system.cpp msgid "ScanSources" -msgstr "" +msgstr "SkenZdrojov" #: editor/editor_file_system.cpp msgid "" "There are multiple importers for different types pointing to file %s, import " "aborted" msgstr "" +"Sú tu viacero importérov pre rozliÄné typy ukazujúce do súboru, import " +"preruÅ¡ený" #: editor/editor_file_system.cpp msgid "(Re)Importing Assets" -msgstr "" +msgstr "(Re)Importovanie Asset-ov" #: editor/editor_help.cpp editor/plugins/spatial_editor_plugin.cpp msgid "Top" -msgstr "" +msgstr "Top" #: editor/editor_help.cpp msgid "Class:" @@ -1959,175 +1926,164 @@ msgstr "Trieda:" #: editor/editor_help.cpp editor/scene_tree_editor.cpp #: editor/script_create_dialog.cpp msgid "Inherits:" -msgstr "" +msgstr "Inherit-y:" #: editor/editor_help.cpp msgid "Inherited by:" -msgstr "" +msgstr "Zdedené použÃvateľom:" #: editor/editor_help.cpp -#, fuzzy msgid "Description" -msgstr "Popis:" +msgstr "Popisok" #: editor/editor_help.cpp msgid "Online Tutorials" -msgstr "" +msgstr "Online Tutoriáli" #: editor/editor_help.cpp msgid "Properties" -msgstr "" +msgstr "Vlastnosti" #: editor/editor_help.cpp msgid "override:" -msgstr "" +msgstr "PredpÃsaÅ¥:" #: editor/editor_help.cpp -#, fuzzy msgid "default:" -msgstr "NaÄÃtaÅ¥ predvolené" +msgstr "Å tandard:" #: editor/editor_help.cpp msgid "Methods" -msgstr "" +msgstr "Metódy" #: editor/editor_help.cpp -#, fuzzy msgid "Theme Properties" -msgstr "Filter:" +msgstr "Vlastnosti Témy" #: editor/editor_help.cpp -#, fuzzy msgid "Enumerations" -msgstr "Popis:" +msgstr "VýpoÄty" #: editor/editor_help.cpp -#, fuzzy msgid "Constants" -msgstr "KonÅ¡tanty:" +msgstr "KonÅ¡tanty" #: editor/editor_help.cpp -#, fuzzy msgid "Property Descriptions" -msgstr "Popis:" +msgstr "Popisok Vlastnosti" #: editor/editor_help.cpp -#, fuzzy msgid "(value)" -msgstr "Hodnota:" +msgstr "(hodnota)" #: editor/editor_help.cpp msgid "" "There is currently no description for this property. Please help us by " "[color=$color][url=$url]contributing one[/url][/color]!" msgstr "" +"Zatiaľ tu nenà žiadny popisok pre túto vlastnosÅ¥. ProsÃm pomôžte nám pomocou " +"[color=$color][url=$url]prispetÃm jedného[/url][/color]!" #: editor/editor_help.cpp -#, fuzzy msgid "Method Descriptions" -msgstr "Popis:" +msgstr "Popisky Metód" #: editor/editor_help.cpp msgid "" "There is currently no description for this method. Please help us by [color=" "$color][url=$url]contributing one[/url][/color]!" msgstr "" +"Zatiaľ tu nenà žiadny popisok pre túto metódu. ProsÃm pomôžte nám pomocou " +"[color=$color][url=$url]prispetÃm jedného[/url][/color]!" #: editor/editor_help_search.cpp editor/editor_node.cpp #: editor/plugins/script_editor_plugin.cpp msgid "Search Help" -msgstr "" +msgstr "VyhľadaÅ¥ Pomoc" #: editor/editor_help_search.cpp msgid "Case Sensitive" -msgstr "" +msgstr "RozliÅ¡uje malé a veľké pÃsmená" #: editor/editor_help_search.cpp msgid "Show Hierarchy" -msgstr "" +msgstr "UkázaÅ¥ Hierarchiu" #: editor/editor_help_search.cpp msgid "Display All" -msgstr "" +msgstr "ZobraziÅ¥ VÅ¡etko" #: editor/editor_help_search.cpp msgid "Classes Only" -msgstr "" +msgstr "Iba Class-y" #: editor/editor_help_search.cpp msgid "Methods Only" -msgstr "" +msgstr "Iba Metódy" #: editor/editor_help_search.cpp -#, fuzzy msgid "Signals Only" -msgstr "Signály:" +msgstr "Iba Signály" #: editor/editor_help_search.cpp -#, fuzzy msgid "Constants Only" -msgstr "KonÅ¡tanty:" +msgstr "Iba KonÅ¡tanty" #: editor/editor_help_search.cpp msgid "Properties Only" -msgstr "" +msgstr "Iba Vlastnosti" #: editor/editor_help_search.cpp msgid "Theme Properties Only" -msgstr "" +msgstr "Iba Vlastnosti Témy" #: editor/editor_help_search.cpp msgid "Member Type" -msgstr "" +msgstr "Typ ÄŒlena" #: editor/editor_help_search.cpp -#, fuzzy msgid "Class" -msgstr "Trieda:" +msgstr "Class" #: editor/editor_help_search.cpp -#, fuzzy msgid "Method" -msgstr "Prejdite na Metódu" +msgstr "Metóda" #: editor/editor_help_search.cpp editor/plugins/script_text_editor.cpp -#, fuzzy msgid "Signal" -msgstr "Signály" +msgstr "Signál" #: editor/editor_help_search.cpp editor/plugins/theme_editor_plugin.cpp msgid "Constant" -msgstr "" +msgstr "KonÅ¡tant" #: editor/editor_help_search.cpp msgid "Property" -msgstr "" +msgstr "VlastnosÅ¥" #: editor/editor_help_search.cpp -#, fuzzy msgid "Theme Property" -msgstr "Filter:" +msgstr "VlastnosÅ¥ Témy" #: editor/editor_inspector.cpp editor/project_settings_editor.cpp msgid "Property:" -msgstr "" +msgstr "VlastnosÅ¥:" #: editor/editor_inspector.cpp msgid "Set" -msgstr "" +msgstr "NastaviÅ¥" #: editor/editor_inspector.cpp msgid "Set Multiple:" -msgstr "" +msgstr "NastaviÅ¥ Viac:" #: editor/editor_log.cpp msgid "Output:" -msgstr "" +msgstr "Output:" #: editor/editor_log.cpp editor/plugins/tile_map_editor_plugin.cpp -#, fuzzy msgid "Copy Selection" -msgstr "OdstrániÅ¥ výber" +msgstr "SkopÃrovaÅ¥ Výber" #: editor/editor_log.cpp editor/editor_network_profiler.cpp #: editor/editor_profiler.cpp editor/editor_properties.cpp @@ -2137,177 +2093,182 @@ msgstr "OdstrániÅ¥ výber" #: modules/gdnative/gdnative_library_editor_plugin.cpp scene/gui/line_edit.cpp #: scene/gui/text_edit.cpp msgid "Clear" -msgstr "" +msgstr "VyÄistiÅ¥" #: editor/editor_log.cpp -#, fuzzy msgid "Clear Output" -msgstr "Popis:" +msgstr "VyÄistiÅ¥ Output" #: editor/editor_network_profiler.cpp editor/editor_node.cpp #: editor/editor_profiler.cpp msgid "Stop" -msgstr "" +msgstr "Stop" #: editor/editor_network_profiler.cpp editor/editor_profiler.cpp #: editor/plugins/animation_state_machine_editor.cpp editor/rename_dialog.cpp msgid "Start" -msgstr "" +msgstr "Å tart" #: editor/editor_network_profiler.cpp msgid "%s/s" -msgstr "" +msgstr "%s/s" #: editor/editor_network_profiler.cpp msgid "Down" -msgstr "" +msgstr "Dole" #: editor/editor_network_profiler.cpp msgid "Up" -msgstr "" +msgstr "Hore" #: editor/editor_network_profiler.cpp editor/editor_node.cpp msgid "Node" -msgstr "" +msgstr "Node" #: editor/editor_network_profiler.cpp msgid "Incoming RPC" -msgstr "" +msgstr "Prichádzajúce RPC" #: editor/editor_network_profiler.cpp msgid "Incoming RSET" -msgstr "" +msgstr "Prichádzajúci RSET" #: editor/editor_network_profiler.cpp msgid "Outgoing RPC" -msgstr "" +msgstr "Vychádzajúce RPC" #: editor/editor_network_profiler.cpp msgid "Outgoing RSET" -msgstr "" +msgstr "Vychádzajúci RSET" #: editor/editor_node.cpp editor/project_manager.cpp msgid "New Window" -msgstr "" +msgstr "Nové Okno" #: editor/editor_node.cpp msgid "Imported resources can't be saved." -msgstr "" +msgstr "Importované zdroje nemôžu byÅ¥ uložené." #: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp #: scene/gui/dialogs.cpp msgid "OK" -msgstr "" +msgstr "OK" #: editor/editor_node.cpp editor/plugins/animation_player_editor_plugin.cpp msgid "Error saving resource!" -msgstr "" +msgstr "Error pri ukladanà prostriedku!" #: editor/editor_node.cpp msgid "" "This resource can't be saved because it does not belong to the edited scene. " "Make it unique first." msgstr "" +"Tento prostriedok nemôže byÅ¥ uložený lebo nepatrà editovanej scéne. Najprv " +"ho spravte jedineÄným." #: editor/editor_node.cpp editor/plugins/animation_player_editor_plugin.cpp msgid "Save Resource As..." -msgstr "" +msgstr "UložiÅ¥ Prostriedok Ako..." #: editor/editor_node.cpp msgid "Can't open file for writing:" -msgstr "" +msgstr "Nie je možné otvoriÅ¥ súbor pre pÃsanie:" #: editor/editor_node.cpp msgid "Requested file format unknown:" -msgstr "" +msgstr "Požadovaný formát súboru je neznámy:" #: editor/editor_node.cpp msgid "Error while saving." -msgstr "" +msgstr "Error pri ukladanÃ." #: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp msgid "Can't open '%s'. The file could have been moved or deleted." -msgstr "" +msgstr "Nedá sa otvoriÅ¥ '%s'. Súbor mohol byÅ¥ presunutý alebo vymazaný." #: editor/editor_node.cpp msgid "Error while parsing '%s'." -msgstr "" +msgstr "Error pri analýze '%s'." #: editor/editor_node.cpp msgid "Unexpected end of file '%s'." -msgstr "" +msgstr "NeoÄakávaný koniec súboru '%s'." #: editor/editor_node.cpp msgid "Missing '%s' or its dependencies." -msgstr "" +msgstr "Chýba '%s' alebo jeho závislosti." #: editor/editor_node.cpp msgid "Error while loading '%s'." -msgstr "" +msgstr "Error pri naÄÃtavanà '%s'." #: editor/editor_node.cpp msgid "Saving Scene" -msgstr "" +msgstr "Ukladanie Scény" #: editor/editor_node.cpp msgid "Analyzing" -msgstr "" +msgstr "Analyzovanie" #: editor/editor_node.cpp msgid "Creating Thumbnail" -msgstr "" +msgstr "Vytváranie Náhľadu" #: editor/editor_node.cpp msgid "This operation can't be done without a tree root." -msgstr "" +msgstr "Tátu operáciu nie je možné vykonaÅ¥ bez tree root-u." #: editor/editor_node.cpp msgid "" "This scene can't be saved because there is a cyclic instancing inclusion.\n" "Please resolve it and then attempt to save again." msgstr "" +"Táto scéna nemôže byÅ¥ uložená lebo je tu cyklické instancovanie inklúzie.\n" +"ProsÃm vyrieÅ¡te to a skúste to znova." #: editor/editor_node.cpp msgid "" "Couldn't save scene. Likely dependencies (instances or inheritance) couldn't " "be satisfied." msgstr "" +"Nedá sa uložiÅ¥ scéna. Pravdepodobne (inÅ¡tancie alebo dediÄstvo) nemôžu byÅ¥ " +"spokojné." #: editor/editor_node.cpp editor/scene_tree_dock.cpp msgid "Can't overwrite scene that is still open!" -msgstr "" +msgstr "Scéna sa nedá predpÃsaÅ¥ keÄ je stále otvorená!" #: editor/editor_node.cpp msgid "Can't load MeshLibrary for merging!" -msgstr "" +msgstr "Nedá sa naÄÃtaÅ¥ MeshLibrary lebo sa spája!" #: editor/editor_node.cpp msgid "Error saving MeshLibrary!" -msgstr "" +msgstr "Error pri ukladanà MeshLibrary!" #: editor/editor_node.cpp msgid "Can't load TileSet for merging!" -msgstr "" +msgstr "Nedá sa naÄÃtaÅ¥ TileSet lebo sa spája!" #: editor/editor_node.cpp msgid "Error saving TileSet!" -msgstr "" +msgstr "Error pri ukladanà TileSet-u!" #: editor/editor_node.cpp msgid "Error trying to save layout!" -msgstr "" +msgstr "Error pri ukladanà layout-i!" #: editor/editor_node.cpp msgid "Default editor layout overridden." -msgstr "" +msgstr "Predvolený editor layout je prepÃsaný." #: editor/editor_node.cpp msgid "Layout name not found!" -msgstr "" +msgstr "Meno Layout-u sa nenaÅ¡lo!" #: editor/editor_node.cpp msgid "Restored default layout to base settings." -msgstr "" +msgstr "Obnovené predvolené rozloženie na základné nastavenia." #: editor/editor_node.cpp msgid "" @@ -2315,18 +2276,26 @@ msgid "" "Please read the documentation relevant to importing scenes to better " "understand this workflow." msgstr "" +"Tento prostriedok patrà scéne ktorá bola importovaná, takže nenà " +"editovateľný.\n" +"ProsÃm preÄÃtajte si dokumentáciu na importovanie scén aby ste tomu viac " +"pochopili." #: editor/editor_node.cpp msgid "" "This resource belongs to a scene that was instanced or inherited.\n" "Changes to it won't be kept when saving the current scene." msgstr "" +"Tento prostriedok patrà scéne ktorá bola inÅ¡tancovaná alebo zdedená.\n" +"Zmeny sa nezanechajú po uloženà aktuálnej scény." #: editor/editor_node.cpp msgid "" "This resource was imported, so it's not editable. Change its settings in the " "import panel and then re-import." msgstr "" +"Tento prostriedok bol importovaný, takže nenà editovateľný. Zmeňte jeho " +"nastavenia v import panely a potom stlaÄÅ¥e re-import." #: editor/editor_node.cpp msgid "" @@ -2335,6 +2304,11 @@ msgid "" "Please read the documentation relevant to importing scenes to better " "understand this workflow." msgstr "" +"Táto scéna bola importovaná, takže sa zmeny neuložia.\n" +"Jej inÅ¡tancovanÃm alebo zdedenÃm povolÃte to že môžete robiÅ¥ zmeny v tejto " +"scéne.\n" +"ProsÃm preÄÃtajte si dokumentáciu na importovanie scén aby ste tomu viac " +"pochopili." #: editor/editor_node.cpp msgid "" @@ -2342,203 +2316,215 @@ msgid "" "Please read the documentation relevant to debugging to better understand " "this workflow." msgstr "" +"Toto je remote objekt, takže sa zmeny neuložia.\n" +"ProsÃm preÄÃtajte si dokumentáciu o debbugging aby ste tomu viac pochopili." #: editor/editor_node.cpp msgid "There is no defined scene to run." -msgstr "" +msgstr "Nieje definovaná žiadna scéna na spustenie." #: editor/editor_node.cpp msgid "Current scene was never saved, please save it prior to running." -msgstr "" +msgstr "Aktuálna scéna sa nikdy neuložila, prosÃm uložte ju pred spustenÃm." #: editor/editor_node.cpp msgid "Could not start subprocess!" -msgstr "" +msgstr "Subprocess sa nedá spustiÅ¥!" #: editor/editor_node.cpp editor/filesystem_dock.cpp msgid "Open Scene" -msgstr "" +msgstr "OtvoriÅ¥ Scénu" #: editor/editor_node.cpp msgid "Open Base Scene" -msgstr "" +msgstr "OtvoriÅ¥ Base Scene" #: editor/editor_node.cpp -#, fuzzy msgid "Quick Open..." -msgstr "OtvoriÅ¥" +msgstr "Rýchle Otvorenie..." #: editor/editor_node.cpp msgid "Quick Open Scene..." -msgstr "" +msgstr "Rýchle Otvorenie Scény..." #: editor/editor_node.cpp msgid "Quick Open Script..." -msgstr "" +msgstr "Rýchle Otvorenie Scriptu..." #: editor/editor_node.cpp -#, fuzzy msgid "Save & Close" -msgstr "UložiÅ¥ súbor" +msgstr "UložiÅ¥ & ZatvoriÅ¥" #: editor/editor_node.cpp msgid "Save changes to '%s' before closing?" -msgstr "" +msgstr "Chcete uložiÅ¥ zmeny do '%s' pred zatvorenÃm?" #: editor/editor_node.cpp msgid "Saved %s modified resource(s)." -msgstr "" +msgstr "Uložené %s upravené zdroje." #: editor/editor_node.cpp msgid "A root node is required to save the scene." -msgstr "" +msgstr "Na uloženie scény je potrebný root node." #: editor/editor_node.cpp msgid "Save Scene As..." -msgstr "" +msgstr "UložiÅ¥ Scénu Ako..." #: editor/editor_node.cpp msgid "No" -msgstr "" +msgstr "Nie" #: editor/editor_node.cpp msgid "Yes" -msgstr "" +msgstr "ÃNO" #: editor/editor_node.cpp msgid "This scene has never been saved. Save before running?" msgstr "" +"Táto scéna eÅ¡te nikdy nebola uložená. Chcete ju uložiÅ¥ predtým ako ju " +"zapnete?" #: editor/editor_node.cpp editor/scene_tree_dock.cpp msgid "This operation can't be done without a scene." -msgstr "" +msgstr "Táto operácia nemôže byÅ¥ dokonÄená bez scény." #: editor/editor_node.cpp msgid "Export Mesh Library" -msgstr "" +msgstr "ExportovaÅ¥ Mesh Library" #: editor/editor_node.cpp msgid "This operation can't be done without a root node." -msgstr "" +msgstr "Táto operácia nemôže byÅ¥ dokonÄená bez root node-u." #: editor/editor_node.cpp msgid "Export Tile Set" -msgstr "" +msgstr "ExportovaÅ¥ Tile Set" #: editor/editor_node.cpp msgid "This operation can't be done without a selected node." -msgstr "" +msgstr "Táto operácia nemôže byÅ¥ dokonÄená bez vybraného node-u." #: editor/editor_node.cpp msgid "Current scene not saved. Open anyway?" -msgstr "" +msgstr "Aktuálna scéna sa neuložila. Chcete ju aj tak otvoriÅ¥?" #: editor/editor_node.cpp msgid "Can't reload a scene that was never saved." -msgstr "" +msgstr "Nemožno naÄÃtaÅ¥ scénu, ktorá nikdy nebola uložená." #: editor/editor_node.cpp msgid "Revert" -msgstr "" +msgstr "Revert" #: editor/editor_node.cpp msgid "This action cannot be undone. Revert anyway?" -msgstr "" +msgstr "Túto akciu nie je možné vrátiÅ¥ späť. Chcete RevertovatÅ¥ aj tak?" #: editor/editor_node.cpp msgid "Quick Run Scene..." -msgstr "" +msgstr "Rýchle Spustenie Scény..." #: editor/editor_node.cpp msgid "Quit" -msgstr "" +msgstr "OdÃsÅ¥" #: editor/editor_node.cpp msgid "Exit the editor?" -msgstr "" +msgstr "OdÃsÅ¥ z editora?" #: editor/editor_node.cpp msgid "Open Project Manager?" -msgstr "" +msgstr "OtvoriÅ¥ Manažéra Projektov?" #: editor/editor_node.cpp -#, fuzzy msgid "Save & Quit" -msgstr "UložiÅ¥ súbor" +msgstr "UložiÅ¥ & UkonÄiÅ¥" #: editor/editor_node.cpp msgid "Save changes to the following scene(s) before quitting?" -msgstr "" +msgstr "UložiÅ¥ zmeny do nasledujúcich scén pred ukonÄenÃm?" #: editor/editor_node.cpp msgid "Save changes the following scene(s) before opening Project Manager?" -msgstr "" +msgstr "UložiÅ¥ zmeny nasledujúcich scén pred otvorenÃm Manažéra Projektov?" #: editor/editor_node.cpp msgid "" "This option is deprecated. Situations where refresh must be forced are now " "considered a bug. Please report." msgstr "" +"Táto možnosÅ¥ je zastaraná. Situácie, v ktorých je potrebné obnovenie, sa " +"teraz považujú za chybu. ProsÃm, nahláste." #: editor/editor_node.cpp msgid "Pick a Main Scene" -msgstr "" +msgstr "Vyberte hlavnú scénu" #: editor/editor_node.cpp msgid "Close Scene" -msgstr "" +msgstr "ZavrieÅ¥ Scénu" #: editor/editor_node.cpp -#, fuzzy msgid "Reopen Closed Scene" -msgstr "OtvoriÅ¥ súbor(y)" +msgstr "PreotvoriÅ¥ Zatvorenú Scénu" #: editor/editor_node.cpp msgid "Unable to enable addon plugin at: '%s' parsing of config failed." msgstr "" +"Addon plugin nie je možné povoliÅ¥ pri: '% s' analýze konfigurácie zlyhalo." #: editor/editor_node.cpp msgid "Unable to find script field for addon plugin at: 'res://addons/%s'." msgstr "" +"Nepodarilo sa nájsÅ¥ script field pre addon plugin v: 'res://addons/%s'." #: editor/editor_node.cpp msgid "Unable to load addon script from path: '%s'." -msgstr "" +msgstr "Nepodarilo sa naÄÃtaÅ¥ addon script z cesty: '%s'." #: editor/editor_node.cpp msgid "" "Unable to load addon script from path: '%s' There seems to be an error in " "the code, please check the syntax." msgstr "" +"Nepodarilo sa nájsÅ¥ addon script z cesty: '%s' Vyzerá to tak že by mohol byÅ¥ " +"problém v kóde, prosÃm skontrolujte syntax." #: editor/editor_node.cpp msgid "" "Unable to load addon script from path: '%s' Base type is not EditorPlugin." msgstr "" +"Nepodarilo sa naÄÃtaÅ¥ addon script z cesty: '%s' Base type nenà EditorPlugin." #: editor/editor_node.cpp msgid "Unable to load addon script from path: '%s' Script is not in tool mode." msgstr "" +"Nepodarilo sa naÄÃtaÅ¥ addon script z cesty: '%s' Script nenà v tool móde." #: editor/editor_node.cpp msgid "" "Scene '%s' was automatically imported, so it can't be modified.\n" "To make changes to it, a new inherited scene can be created." msgstr "" +"Scéna '%s' bola automaticky importovaná, takže nemôže byÅ¥ modifikovaná.\n" +"Aby ste v nej mohli spraviÅ¥ úpravy, môžete vytvoriÅ¥ novú zdedenú scénu." #: editor/editor_node.cpp msgid "" "Error loading scene, it must be inside the project path. Use 'Import' to " "open the scene, then save it inside the project path." msgstr "" +"Error pri naÄÃtavanÃ, musà byÅ¥ vo vnútri projektovej cesty. Použite 'Import' " +"aby ste otvorili scénu, a potom ju uložte do projektovej cesty." #: editor/editor_node.cpp msgid "Scene '%s' has broken dependencies:" -msgstr "" +msgstr "Scéna '%s' má zniÄené závislosti:" #: editor/editor_node.cpp msgid "Clear Recent Scenes" -msgstr "" +msgstr "VyÄistiÅ¥ Posledné Scény" #: editor/editor_node.cpp msgid "" @@ -2546,6 +2532,9 @@ msgid "" "You can change it later in \"Project Settings\" under the 'application' " "category." msgstr "" +"EÅ¡te ste nedefinovali hlavnú scénu, chcete nejakú vybraÅ¥?\n" +"Neskôr ju môžete zmeniÅ¥ v \"Nastaveniach Projektu\" pod kategóriou " +"'application'." #: editor/editor_node.cpp msgid "" @@ -2553,6 +2542,9 @@ msgid "" "You can change it later in \"Project Settings\" under the 'application' " "category." msgstr "" +"Vybraná scéna '%s' neexistuje, vybraÅ¥ platnú?\n" +"Neskôr ju môžete zmeniÅ¥ v \"Nastaveniach Projekta\" pod kategóriou " +"'application'." #: editor/editor_node.cpp msgid "" @@ -2560,147 +2552,147 @@ msgid "" "You can change it later in \"Project Settings\" under the 'application' " "category." msgstr "" +"Vybraná scéna '%s' nenà scene file, vybraÅ¥ platnú scénu?\n" +"Neskôr ju môžete zmeniÅ¥ v \"Nastaveniach Projekta\" pod kategóriou " +"'application'." #: editor/editor_node.cpp msgid "Save Layout" -msgstr "" +msgstr "UložiÅ¥ Layout" #: editor/editor_node.cpp msgid "Delete Layout" -msgstr "" +msgstr "OdstrániÅ¥ Layout" #: editor/editor_node.cpp editor/import_dock.cpp #: editor/script_create_dialog.cpp msgid "Default" -msgstr "" +msgstr "Predvolené" #: editor/editor_node.cpp editor/editor_properties.cpp #: editor/plugins/script_editor_plugin.cpp editor/property_editor.cpp msgid "Show in FileSystem" -msgstr "" +msgstr "UkázaÅ¥ v FileSystéme" #: editor/editor_node.cpp msgid "Play This Scene" -msgstr "" +msgstr "SpustiÅ¥ Túto Scénu" #: editor/editor_node.cpp msgid "Close Tab" -msgstr "" +msgstr "ZavrieÅ¥ Kartu" #: editor/editor_node.cpp msgid "Undo Close Tab" -msgstr "" +msgstr "Naspäť OtvoriÅ¥ Kartu" #: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp msgid "Close Other Tabs" -msgstr "" +msgstr "ZavrieÅ¥ Ostatné Karty" #: editor/editor_node.cpp msgid "Close Tabs to the Right" -msgstr "" +msgstr "ZavrieÅ¥ Karty na Pravo" #: editor/editor_node.cpp msgid "Close All Tabs" -msgstr "" +msgstr "ZatvoriÅ¥ vÅ¡etky Karty" #: editor/editor_node.cpp msgid "Switch Scene Tab" -msgstr "" +msgstr "Prepnúť Kartu Scény" #: editor/editor_node.cpp msgid "%d more files or folders" -msgstr "" +msgstr "%d viac súborov alebo prieÄinkov" #: editor/editor_node.cpp -#, fuzzy msgid "%d more folders" -msgstr "VytvoriÅ¥ adresár" +msgstr "%d viac prieÄinkov" #: editor/editor_node.cpp msgid "%d more files" -msgstr "" +msgstr "%d viac súborov" #: editor/editor_node.cpp msgid "Dock Position" -msgstr "" +msgstr "PozÃcia Dock-u" #: editor/editor_node.cpp msgid "Distraction Free Mode" -msgstr "" +msgstr "Režim bez rozptyľovania" #: editor/editor_node.cpp msgid "Toggle distraction-free mode." -msgstr "" +msgstr "Prepnúť režim bez rozptyľovania." #: editor/editor_node.cpp msgid "Add a new scene." -msgstr "" +msgstr "PridaÅ¥ novú scénu." #: editor/editor_node.cpp msgid "Scene" -msgstr "" +msgstr "Scéna" #: editor/editor_node.cpp msgid "Go to previously opened scene." -msgstr "" +msgstr "ÃsÅ¥ do naposledy otvorenej scény." #: editor/editor_node.cpp -#, fuzzy msgid "Copy Text" -msgstr "KopÃrovaÅ¥" +msgstr "KopÃrovaÅ¥ Text" #: editor/editor_node.cpp msgid "Next tab" -msgstr "" +msgstr "ÄŽalÅ¡ia karta" #: editor/editor_node.cpp msgid "Previous tab" -msgstr "" +msgstr "Minulá karta" #: editor/editor_node.cpp msgid "Filter Files..." -msgstr "" +msgstr "FiltrovaÅ¥ Súbory..." #: editor/editor_node.cpp msgid "Operations with scene files." -msgstr "" +msgstr "Operácie zo súbormi scén." #: editor/editor_node.cpp msgid "New Scene" -msgstr "" +msgstr "Nová Scéna" #: editor/editor_node.cpp msgid "New Inherited Scene..." -msgstr "" +msgstr "Nové Zdedené Scény..." #: editor/editor_node.cpp msgid "Open Scene..." -msgstr "" +msgstr "OtvoriÅ¥ Scénu..." #: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp msgid "Open Recent" -msgstr "" +msgstr "OtvoriÅ¥ Posledné" #: editor/editor_node.cpp msgid "Save Scene" -msgstr "" +msgstr "UložiÅ¥ Scénu" #: editor/editor_node.cpp -#, fuzzy msgid "Save All Scenes" -msgstr "UložiÅ¥ súbor" +msgstr "UložiÅ¥ VÅ¡etky Scény" #: editor/editor_node.cpp msgid "Convert To..." -msgstr "" +msgstr "KonvertovaÅ¥ Do..." #: editor/editor_node.cpp msgid "MeshLibrary..." -msgstr "" +msgstr "MeshLibrary..." #: editor/editor_node.cpp msgid "TileSet..." -msgstr "" +msgstr "TileSet..." #: editor/editor_node.cpp editor/plugins/script_text_editor.cpp #: scene/gui/line_edit.cpp scene/gui/text_edit.cpp @@ -2710,80 +2702,81 @@ msgstr "Späť" #: editor/editor_node.cpp editor/plugins/script_text_editor.cpp #: scene/gui/line_edit.cpp scene/gui/text_edit.cpp msgid "Redo" -msgstr "" +msgstr "PrerobiÅ¥" #: editor/editor_node.cpp msgid "Revert Scene" -msgstr "" +msgstr "VrátiÅ¥ Scénu" #: editor/editor_node.cpp msgid "Miscellaneous project or scene-wide tools." -msgstr "" +msgstr "ZmieÅ¡anosti projektových alebo scénových wide tool-ov." #: editor/editor_node.cpp editor/project_manager.cpp #: editor/script_create_dialog.cpp msgid "Project" -msgstr "" +msgstr "Projekt" #: editor/editor_node.cpp msgid "Project Settings..." -msgstr "" +msgstr "Nastavenia Projektu..." #: editor/editor_node.cpp editor/plugins/version_control_editor_plugin.cpp msgid "Version Control" -msgstr "" +msgstr "Kontrola Verzie" #: editor/editor_node.cpp editor/plugins/version_control_editor_plugin.cpp msgid "Set Up Version Control" -msgstr "" +msgstr "NastaviÅ¥ Kontrolu Verizie" #: editor/editor_node.cpp msgid "Shut Down Version Control" -msgstr "" +msgstr "Vypnúť Kontrolu Verzie" #: editor/editor_node.cpp -#, fuzzy msgid "Export..." -msgstr "UpraviÅ¥..." +msgstr "Export..." #: editor/editor_node.cpp msgid "Install Android Build Template..." -msgstr "" +msgstr "InÅ¡talovaÅ¥ Android Build Template..." #: editor/editor_node.cpp msgid "Open Project Data Folder" -msgstr "" +msgstr "OtvoriÅ¥ Project Data Folder" #: editor/editor_node.cpp editor/plugins/tile_set_editor_plugin.cpp msgid "Tools" -msgstr "" +msgstr "Nástroje" #: editor/editor_node.cpp msgid "Orphan Resource Explorer..." -msgstr "" +msgstr "Orphan Resource Explorer..." #: editor/editor_node.cpp msgid "Quit to Project List" -msgstr "" +msgstr "OdÃsÅ¥ do Listu Projektov" #: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp #: editor/project_export.cpp msgid "Debug" -msgstr "" +msgstr "Debug" #: editor/editor_node.cpp msgid "Deploy with Remote Debug" -msgstr "" +msgstr "Deploy-ovanie z Remote Debug-om" #: editor/editor_node.cpp msgid "" "When exporting or deploying, the resulting executable will attempt to " "connect to the IP of this computer in order to be debugged." msgstr "" +"Pri exportovanà alebo deploy-ovanÃ, súbor resulting executable sa pokúsi o " +"pripojenie do IP vášho poÄÃtaÄa aby mohol byÅ¥ debugg-ovaný." #: editor/editor_node.cpp msgid "Small Deploy with Network FS" -msgstr "" +msgstr "Malý Deploy z Network FS" #: editor/editor_node.cpp msgid "" @@ -2794,30 +2787,39 @@ msgid "" "On Android, deploy will use the USB cable for faster performance. This " "option speeds up testing for games with a large footprint." msgstr "" +"KeÄ bude povolená táto možnosÅ¥, export alebo deploy vyprodukujú menej \n" +"súboru executable.\n" +"Filesystém bude z projektu poskytovaný editorom v sieti. Na Androide, pre " +"deploy budete potrebovaÅ¥ USB kábel \n" +"rýchlejšà výkon. Táto možnosÅ¥ zrýchľuje proces testovania." #: editor/editor_node.cpp msgid "Visible Collision Shapes" -msgstr "" +msgstr "Viditeľné Tvary KolÃzie" #: editor/editor_node.cpp msgid "" "Collision shapes and raycast nodes (for 2D and 3D) will be visible on the " "running game if this option is turned on." msgstr "" +"Tvary KolÃzie a raycast node-y (pre 2D a 3D) budú viditeľné po spustenà hry " +"ak budete maÅ¥ zapnutú túto možnosÅ¥." #: editor/editor_node.cpp msgid "Visible Navigation" -msgstr "" +msgstr "Viditeľná Navigácia" #: editor/editor_node.cpp msgid "" "Navigation meshes and polygons will be visible on the running game if this " "option is turned on." msgstr "" +"NavigaÄné mesh-e a polygony budú viditeľné po spustenà hry ak budete maÅ¥ " +"zapnutú túto možnosÅ¥." #: editor/editor_node.cpp msgid "Sync Scene Changes" -msgstr "" +msgstr "Zmeny Synchronizácie Scény" #: editor/editor_node.cpp msgid "" @@ -2826,10 +2828,14 @@ msgid "" "When used remotely on a device, this is more efficient with network " "filesystem." msgstr "" +"KeÄ zapnete túto možnosÅ¥, akékoľvek zmeny v scéne v editore budú náhradné so " +"spustenou hrou.\n" +"KeÄ je použitá na diaľku v zariadenÃ, je to viac efektÃvne z network " +"filesystémom." #: editor/editor_node.cpp msgid "Sync Script Changes" -msgstr "" +msgstr "Zmeny Synchronizácie Scriptu" #: editor/editor_node.cpp msgid "" @@ -2838,60 +2844,62 @@ msgid "" "When used remotely on a device, this is more efficient with network " "filesystem." msgstr "" +"KeÄ je zapnutá táto MožnosÅ¥, akýkoľvek uložený script bude znovu naÄÃtaný v " +"spustenej hre.\n" +"KeÄ je použitá na diaľku zo zariadenia, toto je viac efektÃvnejÅ¡ie z network " +"filesystémom." #: editor/editor_node.cpp editor/script_create_dialog.cpp msgid "Editor" -msgstr "" +msgstr "Editor" #: editor/editor_node.cpp -#, fuzzy msgid "Editor Settings..." -msgstr "Prechody" +msgstr "Nastavenia Editora..." #: editor/editor_node.cpp msgid "Editor Layout" -msgstr "" +msgstr "Layout Editora" #: editor/editor_node.cpp msgid "Take Screenshot" -msgstr "" +msgstr "SpraviÅ¥ SnÃmku Obrazovky" #: editor/editor_node.cpp msgid "Screenshots are stored in the Editor Data/Settings Folder." -msgstr "" +msgstr "SnÃmky obrázky sú uložené v Editor Data/Settings Folder." #: editor/editor_node.cpp msgid "Toggle Fullscreen" -msgstr "" +msgstr "Prepnúť na Celú Obrazovku" #: editor/editor_node.cpp msgid "Toggle System Console" -msgstr "" +msgstr "Prepnúť Systémovú Konzolu" #: editor/editor_node.cpp msgid "Open Editor Data/Settings Folder" -msgstr "" +msgstr "OtvoriÅ¥ Editor Data/Settings Folder" #: editor/editor_node.cpp msgid "Open Editor Data Folder" -msgstr "" +msgstr "OtvoriÅ¥ prieÄinok Editor Data" #: editor/editor_node.cpp msgid "Open Editor Settings Folder" -msgstr "" +msgstr "OtvoriÅ¥ PrieÄinok Editor Settings" #: editor/editor_node.cpp msgid "Manage Editor Features..." -msgstr "" +msgstr "SpravovaÅ¥ Funkcie Editora..." #: editor/editor_node.cpp -#, fuzzy msgid "Manage Export Templates..." -msgstr "VÅ¡etky vybrané" +msgstr "SpravovaÅ¥ Export Templates..." #: editor/editor_node.cpp editor/plugins/shader_editor_plugin.cpp msgid "Help" -msgstr "" +msgstr "Pomoc" #: editor/editor_node.cpp editor/plugins/asset_library_editor_plugin.cpp #: editor/plugins/script_editor_plugin.cpp @@ -2900,20 +2908,24 @@ msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp editor/project_manager.cpp #: editor/project_settings_editor.cpp editor/rename_dialog.cpp msgid "Search" -msgstr "" +msgstr "VyhľadaÅ¥" #: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp #: editor/plugins/shader_editor_plugin.cpp msgid "Online Docs" -msgstr "" +msgstr "Online Dokumentácie" #: editor/editor_node.cpp msgid "Q&A" -msgstr "" +msgstr "Q&A" #: editor/editor_node.cpp -msgid "Issue Tracker" -msgstr "" +msgid "Report a Bug" +msgstr "NahlásiÅ¥ Bugy" + +#: editor/editor_node.cpp +msgid "Send Docs Feedback" +msgstr "PoslaÅ¥ spätnú väzbu Dokumentácie" #: editor/editor_node.cpp editor/plugins/asset_library_editor_plugin.cpp msgid "Community" @@ -2925,95 +2937,92 @@ msgstr "O nás" #: editor/editor_node.cpp msgid "Play the project." -msgstr "" +msgstr "SpustiÅ¥ projekt." #: editor/editor_node.cpp msgid "Play" -msgstr "" +msgstr "SpustiÅ¥" #: editor/editor_node.cpp msgid "Pause the scene execution for debugging." -msgstr "" +msgstr "Pozastavenie vykonávania scény kvôli debugg-ovaniu." #: editor/editor_node.cpp msgid "Pause Scene" -msgstr "" +msgstr "PozastaviÅ¥ Scénu" #: editor/editor_node.cpp msgid "Stop the scene." -msgstr "" +msgstr "ZastaviÅ¥ scénu." #: editor/editor_node.cpp msgid "Play the edited scene." -msgstr "" +msgstr "SpustiÅ¥ editovanú scénu." #: editor/editor_node.cpp msgid "Play Scene" -msgstr "" +msgstr "SpustiÅ¥ Scénu" #: editor/editor_node.cpp msgid "Play custom scene" -msgstr "" +msgstr "SpustiÅ¥ vlastnú scénu" #: editor/editor_node.cpp msgid "Play Custom Scene" -msgstr "" +msgstr "SpustiÅ¥ Vlastnú Scénu" #: editor/editor_node.cpp msgid "Changing the video driver requires restarting the editor." -msgstr "" +msgstr "Zmena video driver-u vyžaduje reÅ¡tart editora." #: editor/editor_node.cpp editor/project_settings_editor.cpp #: editor/settings_config_dialog.cpp -#, fuzzy msgid "Save & Restart" -msgstr "UložiÅ¥ súbor" +msgstr "UložiÅ¥ & ReÅ¡tartovaÅ¥" #: editor/editor_node.cpp msgid "Spins when the editor window redraws." -msgstr "" +msgstr "OtáÄa sa, keÄ sa okno editora redistribuuje." #: editor/editor_node.cpp -#, fuzzy msgid "Update Continuously" -msgstr "Priebežný" +msgstr "AktualizovaÅ¥ priebežne" #: editor/editor_node.cpp msgid "Update When Changed" -msgstr "" +msgstr "AktualizovaÅ¥ po Zmene" #: editor/editor_node.cpp msgid "Hide Update Spinner" -msgstr "" +msgstr "SkryÅ¥ aktualizáciu Spinner" #: editor/editor_node.cpp msgid "FileSystem" -msgstr "" +msgstr "FileSystém" #: editor/editor_node.cpp msgid "Inspector" -msgstr "" +msgstr "InÅ¡pektor" #: editor/editor_node.cpp msgid "Expand Bottom Panel" -msgstr "" +msgstr "ExpandovaÅ¥ Spodný Panel" #: editor/editor_node.cpp msgid "Output" -msgstr "" +msgstr "Výstup" #: editor/editor_node.cpp msgid "Don't Save" -msgstr "" +msgstr "NeukladaÅ¥" #: editor/editor_node.cpp msgid "Android build template is missing, please install relevant templates." -msgstr "" +msgstr "Android build template chýba, prosÃm nainÅ¡talujte prÃsluÅ¡né Å¡ablóny." #: editor/editor_node.cpp -#, fuzzy msgid "Manage Templates" -msgstr "VÅ¡etky vybrané" +msgstr "SpravovaÅ¥ Å ablóny" #: editor/editor_node.cpp msgid "" @@ -3972,7 +3981,7 @@ msgid "Reimport" msgstr "" #: editor/import_dock.cpp -msgid "Save scenes, re-import and restart" +msgid "Save Scenes, Re-Import, and Restart" msgstr "" #: editor/import_dock.cpp @@ -4518,7 +4527,7 @@ msgstr "" #: editor/plugins/animation_player_editor_plugin.cpp msgid "Animation" -msgstr "" +msgstr "Animácie" #: editor/plugins/animation_player_editor_plugin.cpp #, fuzzy @@ -6858,14 +6867,6 @@ msgid "Open Godot online documentation." msgstr "Popis:" #: editor/plugins/script_editor_plugin.cpp -msgid "Request Docs" -msgstr "" - -#: editor/plugins/script_editor_plugin.cpp -msgid "Help improve the Godot documentation by giving feedback." -msgstr "" - -#: editor/plugins/script_editor_plugin.cpp msgid "Search the reference documentation." msgstr "" @@ -7310,6 +7311,10 @@ msgid "This operation requires a single selected node." msgstr "" #: editor/plugins/spatial_editor_plugin.cpp +msgid "Auto Orthogonal Enabled" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp msgid "Lock View Rotation" msgstr "" @@ -7400,13 +7405,13 @@ msgid "Freelook Slow Modifier" msgstr "" #: editor/plugins/spatial_editor_plugin.cpp -msgid "" -"Note: The FPS value displayed is the editor's framerate.\n" -"It cannot be used as a reliable indication of in-game performance." +msgid "View Rotation Locked" msgstr "" #: editor/plugins/spatial_editor_plugin.cpp -msgid "View Rotation Locked" +msgid "" +"Note: The FPS value displayed is the editor's framerate.\n" +"It cannot be used as a reliable indication of in-game performance." msgstr "" #: editor/plugins/spatial_editor_plugin.cpp @@ -9877,6 +9882,13 @@ msgid "" "Would you like to explore official example projects in the Asset Library?" msgstr "" +#: editor/project_manager.cpp +msgid "" +"The search box filters projects by name and last path component.\n" +"To filter projects by name and full path, the query must contain at least " +"one `/` character." +msgstr "" + #: editor/project_settings_editor.cpp msgid "Key " msgstr "" @@ -10198,7 +10210,7 @@ msgstr "" #: editor/project_settings_editor.cpp msgid "Plugins" -msgstr "" +msgstr "Pluginy" #: editor/property_editor.cpp msgid "Preset..." @@ -10860,6 +10872,12 @@ msgid "Script file already exists." msgstr "" #: editor/script_create_dialog.cpp +msgid "" +"Note: Built-in scripts have some limitations and can't be edited using an " +"external editor." +msgstr "" + +#: editor/script_create_dialog.cpp #, fuzzy msgid "Class Name:" msgstr "Trieda:" @@ -10991,6 +11009,11 @@ msgid "Total:" msgstr "" #: editor/script_editor_debugger.cpp +#, fuzzy +msgid "Export list to a CSV file" +msgstr "ExportovaÅ¥ Profil" + +#: editor/script_editor_debugger.cpp msgid "Resource Path" msgstr "" @@ -12542,6 +12565,10 @@ msgid "" "texture to some node for display." msgstr "" +#: scene/main/viewport.cpp +msgid "Viewport size must be greater than 0 to render anything." +msgstr "" + #: scene/resources/visual_shader_nodes.cpp #, fuzzy msgid "Invalid source for preview." diff --git a/editor/translations/sl.po b/editor/translations/sl.po index e8a0b4c2a1..a4a668f76b 100644 --- a/editor/translations/sl.po +++ b/editor/translations/sl.po @@ -1515,7 +1515,7 @@ msgstr "Premakni SamodejnoNalaganje" msgid "Remove Autoload" msgstr "Odstrani SamodejnoNalaganje" -#: editor/editor_autoload_settings.cpp +#: editor/editor_autoload_settings.cpp editor/editor_plugin_settings.cpp msgid "Enable" msgstr "OmogoÄi" @@ -3066,8 +3066,13 @@ msgid "Q&A" msgstr "V&O" #: editor/editor_node.cpp -msgid "Issue Tracker" -msgstr "Sledilnik Napak" +#, fuzzy +msgid "Report a Bug" +msgstr "Ponovno Uvozi" + +#: editor/editor_node.cpp +msgid "Send Docs Feedback" +msgstr "" #: editor/editor_node.cpp editor/plugins/asset_library_editor_plugin.cpp msgid "Community" @@ -4155,7 +4160,7 @@ msgid "Reimport" msgstr "Ponovno Uvozi" #: editor/import_dock.cpp -msgid "Save scenes, re-import and restart" +msgid "Save Scenes, Re-Import, and Restart" msgstr "" #: editor/import_dock.cpp @@ -7140,14 +7145,6 @@ msgid "Open Godot online documentation." msgstr "Odpri Nedavne" #: editor/plugins/script_editor_plugin.cpp -msgid "Request Docs" -msgstr "" - -#: editor/plugins/script_editor_plugin.cpp -msgid "Help improve the Godot documentation by giving feedback." -msgstr "" - -#: editor/plugins/script_editor_plugin.cpp msgid "Search the reference documentation." msgstr "" @@ -7599,6 +7596,10 @@ msgid "This operation requires a single selected node." msgstr "" #: editor/plugins/spatial_editor_plugin.cpp +msgid "Auto Orthogonal Enabled" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp msgid "Lock View Rotation" msgstr "" @@ -7689,13 +7690,13 @@ msgid "Freelook Slow Modifier" msgstr "" #: editor/plugins/spatial_editor_plugin.cpp -msgid "" -"Note: The FPS value displayed is the editor's framerate.\n" -"It cannot be used as a reliable indication of in-game performance." +msgid "View Rotation Locked" msgstr "" #: editor/plugins/spatial_editor_plugin.cpp -msgid "View Rotation Locked" +msgid "" +"Note: The FPS value displayed is the editor's framerate.\n" +"It cannot be used as a reliable indication of in-game performance." msgstr "" #: editor/plugins/spatial_editor_plugin.cpp @@ -10213,6 +10214,13 @@ msgstr "" "Trenutno nimate projektov.\n" "Želite raziskovati uradne primere projektov v Asset Library?" +#: editor/project_manager.cpp +msgid "" +"The search box filters projects by name and last path component.\n" +"To filter projects by name and full path, the query must contain at least " +"one `/` character." +msgstr "" + #: editor/project_settings_editor.cpp msgid "Key " msgstr "" @@ -11215,6 +11223,12 @@ msgid "Script file already exists." msgstr "SamodejnoNalaganje '%s' že obstaja!" #: editor/script_create_dialog.cpp +msgid "" +"Note: Built-in scripts have some limitations and can't be edited using an " +"external editor." +msgstr "" + +#: editor/script_create_dialog.cpp #, fuzzy msgid "Class Name:" msgstr "Razred:" @@ -11347,6 +11361,11 @@ msgid "Total:" msgstr "" #: editor/script_editor_debugger.cpp +#, fuzzy +msgid "Export list to a CSV file" +msgstr "Izvozi Projekt" + +#: editor/script_editor_debugger.cpp msgid "Resource Path" msgstr "" @@ -12926,6 +12945,10 @@ msgid "" "texture to some node for display." msgstr "" +#: scene/main/viewport.cpp +msgid "Viewport size must be greater than 0 to render anything." +msgstr "" + #: scene/resources/visual_shader_nodes.cpp #, fuzzy msgid "Invalid source for preview." @@ -12956,6 +12979,9 @@ msgstr "" msgid "Constants cannot be modified." msgstr "Konstante ni možno spreminjati." +#~ msgid "Issue Tracker" +#~ msgstr "Sledilnik Napak" + #~ msgid "Replaced %d occurrence(s)." #~ msgstr "Zamenjana %d ponovitev/e." diff --git a/editor/translations/sq.po b/editor/translations/sq.po index 60ac25f6f4..f24645059a 100644 --- a/editor/translations/sq.po +++ b/editor/translations/sq.po @@ -1452,7 +1452,7 @@ msgstr "Lëviz Autoload-in" msgid "Remove Autoload" msgstr "Hiq Autoload-in" -#: editor/editor_autoload_settings.cpp +#: editor/editor_autoload_settings.cpp editor/editor_plugin_settings.cpp msgid "Enable" msgstr "Lejo" @@ -2991,8 +2991,13 @@ msgid "Q&A" msgstr "Pyetje&Përgjigje" #: editor/editor_node.cpp -msgid "Issue Tracker" -msgstr "Gjurmuesi i Problemeve" +#, fuzzy +msgid "Report a Bug" +msgstr "Ri-importo" + +#: editor/editor_node.cpp +msgid "Send Docs Feedback" +msgstr "" #: editor/editor_node.cpp editor/plugins/asset_library_editor_plugin.cpp msgid "Community" @@ -4066,7 +4071,8 @@ msgid "Reimport" msgstr "Ri-importo" #: editor/import_dock.cpp -msgid "Save scenes, re-import and restart" +#, fuzzy +msgid "Save Scenes, Re-Import, and Restart" msgstr "Ruaj skenat, ri-importo dhe rifillo" #: editor/import_dock.cpp @@ -6897,14 +6903,6 @@ msgid "Open Godot online documentation." msgstr "" #: editor/plugins/script_editor_plugin.cpp -msgid "Request Docs" -msgstr "" - -#: editor/plugins/script_editor_plugin.cpp -msgid "Help improve the Godot documentation by giving feedback." -msgstr "" - -#: editor/plugins/script_editor_plugin.cpp msgid "Search the reference documentation." msgstr "" @@ -7343,6 +7341,10 @@ msgid "This operation requires a single selected node." msgstr "" #: editor/plugins/spatial_editor_plugin.cpp +msgid "Auto Orthogonal Enabled" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp msgid "Lock View Rotation" msgstr "" @@ -7432,13 +7434,13 @@ msgid "Freelook Slow Modifier" msgstr "" #: editor/plugins/spatial_editor_plugin.cpp -msgid "" -"Note: The FPS value displayed is the editor's framerate.\n" -"It cannot be used as a reliable indication of in-game performance." +msgid "View Rotation Locked" msgstr "" #: editor/plugins/spatial_editor_plugin.cpp -msgid "View Rotation Locked" +msgid "" +"Note: The FPS value displayed is the editor's framerate.\n" +"It cannot be used as a reliable indication of in-game performance." msgstr "" #: editor/plugins/spatial_editor_plugin.cpp @@ -9858,6 +9860,13 @@ msgid "" "Would you like to explore official example projects in the Asset Library?" msgstr "" +#: editor/project_manager.cpp +msgid "" +"The search box filters projects by name and last path component.\n" +"To filter projects by name and full path, the query must contain at least " +"one `/` character." +msgstr "" + #: editor/project_settings_editor.cpp msgid "Key " msgstr "" @@ -10835,6 +10844,12 @@ msgid "Script file already exists." msgstr "Emri i grupit ekziston që më parë." #: editor/script_create_dialog.cpp +msgid "" +"Note: Built-in scripts have some limitations and can't be edited using an " +"external editor." +msgstr "" + +#: editor/script_create_dialog.cpp #, fuzzy msgid "Class Name:" msgstr "Klasa:" @@ -10966,6 +10981,11 @@ msgid "Total:" msgstr "" #: editor/script_editor_debugger.cpp +#, fuzzy +msgid "Export list to a CSV file" +msgstr "Eksporto Projektin" + +#: editor/script_editor_debugger.cpp msgid "Resource Path" msgstr "" @@ -12481,6 +12501,10 @@ msgid "" "texture to some node for display." msgstr "" +#: scene/main/viewport.cpp +msgid "Viewport size must be greater than 0 to render anything." +msgstr "" + #: scene/resources/visual_shader_nodes.cpp msgid "Invalid source for preview." msgstr "" @@ -12509,6 +12533,9 @@ msgstr "" msgid "Constants cannot be modified." msgstr "" +#~ msgid "Issue Tracker" +#~ msgstr "Gjurmuesi i Problemeve" + #~ msgid "" #~ "There are currently no tutorials for this class, you can [color=$color]" #~ "[url=$url]contribute one[/url][/color] or [color=$color][url=" diff --git a/editor/translations/sr_Cyrl.po b/editor/translations/sr_Cyrl.po index 5f5f3786a7..52639bbeeb 100644 --- a/editor/translations/sr_Cyrl.po +++ b/editor/translations/sr_Cyrl.po @@ -1516,7 +1516,7 @@ msgstr "Помери аутоматÑко учитавање" msgid "Remove Autoload" msgstr "Обриши аутоматÑко учитавање" -#: editor/editor_autoload_settings.cpp +#: editor/editor_autoload_settings.cpp editor/editor_plugin_settings.cpp msgid "Enable" msgstr "Укључи" @@ -3073,8 +3073,13 @@ msgid "Q&A" msgstr "Питања и одговори" #: editor/editor_node.cpp -msgid "Issue Tracker" -msgstr "Пратилац грешака" +#, fuzzy +msgid "Report a Bug" +msgstr "Поново увези" + +#: editor/editor_node.cpp +msgid "Send Docs Feedback" +msgstr "" #: editor/editor_node.cpp editor/plugins/asset_library_editor_plugin.cpp msgid "Community" @@ -4181,7 +4186,7 @@ msgid "Reimport" msgstr "Поново увези" #: editor/import_dock.cpp -msgid "Save scenes, re-import and restart" +msgid "Save Scenes, Re-Import, and Restart" msgstr "" #: editor/import_dock.cpp @@ -7191,14 +7196,6 @@ msgid "Open Godot online documentation." msgstr "Отвори Godot онлајн документацију" #: editor/plugins/script_editor_plugin.cpp -msgid "Request Docs" -msgstr "" - -#: editor/plugins/script_editor_plugin.cpp -msgid "Help improve the Godot documentation by giving feedback." -msgstr "" - -#: editor/plugins/script_editor_plugin.cpp msgid "Search the reference documentation." msgstr "Претражи документацију." @@ -7666,6 +7663,11 @@ msgstr "Ова операција захтева један изабран чвР#: editor/plugins/spatial_editor_plugin.cpp #, fuzzy +msgid "Auto Orthogonal Enabled" +msgstr "Ортогонална пројекција" + +#: editor/plugins/spatial_editor_plugin.cpp +#, fuzzy msgid "Lock View Rotation" msgstr "Прикажи информације" @@ -7757,17 +7759,17 @@ msgid "Freelook Slow Modifier" msgstr "Брзина Ñлободног погледа" #: editor/plugins/spatial_editor_plugin.cpp +#, fuzzy +msgid "View Rotation Locked" +msgstr "Прикажи информације" + +#: editor/plugins/spatial_editor_plugin.cpp msgid "" "Note: The FPS value displayed is the editor's framerate.\n" "It cannot be used as a reliable indication of in-game performance." msgstr "" #: editor/plugins/spatial_editor_plugin.cpp -#, fuzzy -msgid "View Rotation Locked" -msgstr "Прикажи информације" - -#: editor/plugins/spatial_editor_plugin.cpp msgid "XForm Dialog" msgstr "XForm дијалог" @@ -10333,6 +10335,13 @@ msgid "" "Would you like to explore official example projects in the Asset Library?" msgstr "" +#: editor/project_manager.cpp +msgid "" +"The search box filters projects by name and last path component.\n" +"To filter projects by name and full path, the query must contain at least " +"one `/` character." +msgstr "" + #: editor/project_settings_editor.cpp msgid "Key " msgstr "" @@ -11343,6 +11352,12 @@ msgid "Script file already exists." msgstr "ÐутоматÑко учитавање '%s' већ поÑтоји!" #: editor/script_create_dialog.cpp +msgid "" +"Note: Built-in scripts have some limitations and can't be edited using an " +"external editor." +msgstr "" + +#: editor/script_create_dialog.cpp #, fuzzy msgid "Class Name:" msgstr "КлаÑа:" @@ -11482,6 +11497,11 @@ msgid "Total:" msgstr "" #: editor/script_editor_debugger.cpp +#, fuzzy +msgid "Export list to a CSV file" +msgstr "Извези пројекат" + +#: editor/script_editor_debugger.cpp msgid "Resource Path" msgstr "" @@ -13031,6 +13051,10 @@ msgid "" "texture to some node for display." msgstr "" +#: scene/main/viewport.cpp +msgid "Viewport size must be greater than 0 to render anything." +msgstr "" + #: scene/resources/visual_shader_nodes.cpp #, fuzzy msgid "Invalid source for preview." @@ -13062,6 +13086,9 @@ msgstr "" msgid "Constants cannot be modified." msgstr "" +#~ msgid "Issue Tracker" +#~ msgstr "Пратилац грешака" + #~ msgid "Replaced %d occurrence(s)." #~ msgstr "Замени %d појаве/а." diff --git a/editor/translations/sr_Latn.po b/editor/translations/sr_Latn.po index c36e64d459..a2ae9fccea 100644 --- a/editor/translations/sr_Latn.po +++ b/editor/translations/sr_Latn.po @@ -1437,7 +1437,7 @@ msgstr "" msgid "Remove Autoload" msgstr "" -#: editor/editor_autoload_settings.cpp +#: editor/editor_autoload_settings.cpp editor/editor_plugin_settings.cpp msgid "Enable" msgstr "" @@ -2848,7 +2848,11 @@ msgid "Q&A" msgstr "" #: editor/editor_node.cpp -msgid "Issue Tracker" +msgid "Report a Bug" +msgstr "" + +#: editor/editor_node.cpp +msgid "Send Docs Feedback" msgstr "" #: editor/editor_node.cpp editor/plugins/asset_library_editor_plugin.cpp @@ -3873,7 +3877,7 @@ msgid "Reimport" msgstr "" #: editor/import_dock.cpp -msgid "Save scenes, re-import and restart" +msgid "Save Scenes, Re-Import, and Restart" msgstr "" #: editor/import_dock.cpp @@ -6698,14 +6702,6 @@ msgid "Open Godot online documentation." msgstr "" #: editor/plugins/script_editor_plugin.cpp -msgid "Request Docs" -msgstr "" - -#: editor/plugins/script_editor_plugin.cpp -msgid "Help improve the Godot documentation by giving feedback." -msgstr "" - -#: editor/plugins/script_editor_plugin.cpp msgid "Search the reference documentation." msgstr "" @@ -7142,6 +7138,10 @@ msgid "This operation requires a single selected node." msgstr "" #: editor/plugins/spatial_editor_plugin.cpp +msgid "Auto Orthogonal Enabled" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp msgid "Lock View Rotation" msgstr "" @@ -7230,13 +7230,13 @@ msgid "Freelook Slow Modifier" msgstr "" #: editor/plugins/spatial_editor_plugin.cpp -msgid "" -"Note: The FPS value displayed is the editor's framerate.\n" -"It cannot be used as a reliable indication of in-game performance." +msgid "View Rotation Locked" msgstr "" #: editor/plugins/spatial_editor_plugin.cpp -msgid "View Rotation Locked" +msgid "" +"Note: The FPS value displayed is the editor's framerate.\n" +"It cannot be used as a reliable indication of in-game performance." msgstr "" #: editor/plugins/spatial_editor_plugin.cpp @@ -9657,6 +9657,13 @@ msgid "" "Would you like to explore official example projects in the Asset Library?" msgstr "" +#: editor/project_manager.cpp +msgid "" +"The search box filters projects by name and last path component.\n" +"To filter projects by name and full path, the query must contain at least " +"one `/` character." +msgstr "" + #: editor/project_settings_editor.cpp msgid "Key " msgstr "" @@ -10621,6 +10628,12 @@ msgid "Script file already exists." msgstr "" #: editor/script_create_dialog.cpp +msgid "" +"Note: Built-in scripts have some limitations and can't be edited using an " +"external editor." +msgstr "" + +#: editor/script_create_dialog.cpp msgid "Class Name:" msgstr "" @@ -10743,6 +10756,10 @@ msgid "Total:" msgstr "" #: editor/script_editor_debugger.cpp +msgid "Export list to a CSV file" +msgstr "" + +#: editor/script_editor_debugger.cpp msgid "Resource Path" msgstr "" @@ -12253,6 +12270,10 @@ msgid "" "texture to some node for display." msgstr "" +#: scene/main/viewport.cpp +msgid "Viewport size must be greater than 0 to render anything." +msgstr "" + #: scene/resources/visual_shader_nodes.cpp msgid "Invalid source for preview." msgstr "" diff --git a/editor/translations/sv.po b/editor/translations/sv.po index 3f7fee23b7..a03a37b533 100644 --- a/editor/translations/sv.po +++ b/editor/translations/sv.po @@ -1507,7 +1507,7 @@ msgstr "Flytta Autoload" msgid "Remove Autoload" msgstr "Ta bort Autoload" -#: editor/editor_autoload_settings.cpp +#: editor/editor_autoload_settings.cpp editor/editor_plugin_settings.cpp msgid "Enable" msgstr "Aktivera" @@ -3043,7 +3043,12 @@ msgid "Q&A" msgstr "FrÃ¥gor och svar" #: editor/editor_node.cpp -msgid "Issue Tracker" +#, fuzzy +msgid "Report a Bug" +msgstr "Importera om" + +#: editor/editor_node.cpp +msgid "Send Docs Feedback" msgstr "" #: editor/editor_node.cpp editor/plugins/asset_library_editor_plugin.cpp @@ -4139,7 +4144,7 @@ msgid "Reimport" msgstr "Importera om" #: editor/import_dock.cpp -msgid "Save scenes, re-import and restart" +msgid "Save Scenes, Re-Import, and Restart" msgstr "" #: editor/import_dock.cpp @@ -7086,14 +7091,6 @@ msgid "Open Godot online documentation." msgstr "Öppna Senaste" #: editor/plugins/script_editor_plugin.cpp -msgid "Request Docs" -msgstr "" - -#: editor/plugins/script_editor_plugin.cpp -msgid "Help improve the Godot documentation by giving feedback." -msgstr "" - -#: editor/plugins/script_editor_plugin.cpp msgid "Search the reference documentation." msgstr "" @@ -7550,6 +7547,10 @@ msgid "This operation requires a single selected node." msgstr "Ã…tgärden kräver en enstaka vald Node." #: editor/plugins/spatial_editor_plugin.cpp +msgid "Auto Orthogonal Enabled" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp #, fuzzy msgid "Lock View Rotation" msgstr "Visa Information" @@ -7640,17 +7641,17 @@ msgid "Freelook Slow Modifier" msgstr "" #: editor/plugins/spatial_editor_plugin.cpp +#, fuzzy +msgid "View Rotation Locked" +msgstr "Visa Information" + +#: editor/plugins/spatial_editor_plugin.cpp msgid "" "Note: The FPS value displayed is the editor's framerate.\n" "It cannot be used as a reliable indication of in-game performance." msgstr "" #: editor/plugins/spatial_editor_plugin.cpp -#, fuzzy -msgid "View Rotation Locked" -msgstr "Visa Information" - -#: editor/plugins/spatial_editor_plugin.cpp msgid "XForm Dialog" msgstr "" @@ -10153,6 +10154,13 @@ msgid "" "Would you like to explore official example projects in the Asset Library?" msgstr "" +#: editor/project_manager.cpp +msgid "" +"The search box filters projects by name and last path component.\n" +"To filter projects by name and full path, the query must contain at least " +"one `/` character." +msgstr "" + #: editor/project_settings_editor.cpp msgid "Key " msgstr "Nyckel " @@ -11166,6 +11174,12 @@ msgid "Script file already exists." msgstr "Autoload '%s' finns redan!" #: editor/script_create_dialog.cpp +msgid "" +"Note: Built-in scripts have some limitations and can't be edited using an " +"external editor." +msgstr "" + +#: editor/script_create_dialog.cpp #, fuzzy msgid "Class Name:" msgstr "Klassnamn" @@ -11298,6 +11312,11 @@ msgid "Total:" msgstr "Totalt:" #: editor/script_editor_debugger.cpp +#, fuzzy +msgid "Export list to a CSV file" +msgstr "Exportera Projekt" + +#: editor/script_editor_debugger.cpp msgid "Resource Path" msgstr "" @@ -12871,6 +12890,10 @@ msgid "" "texture to some node for display." msgstr "" +#: scene/main/viewport.cpp +msgid "Viewport size must be greater than 0 to render anything." +msgstr "" + #: scene/resources/visual_shader_nodes.cpp #, fuzzy msgid "Invalid source for preview." diff --git a/editor/translations/ta.po b/editor/translations/ta.po index 5300f984bb..7dd9f5f38c 100644 --- a/editor/translations/ta.po +++ b/editor/translations/ta.po @@ -1429,7 +1429,7 @@ msgstr "" msgid "Remove Autoload" msgstr "" -#: editor/editor_autoload_settings.cpp +#: editor/editor_autoload_settings.cpp editor/editor_plugin_settings.cpp msgid "Enable" msgstr "" @@ -2836,7 +2836,11 @@ msgid "Q&A" msgstr "" #: editor/editor_node.cpp -msgid "Issue Tracker" +msgid "Report a Bug" +msgstr "" + +#: editor/editor_node.cpp +msgid "Send Docs Feedback" msgstr "" #: editor/editor_node.cpp editor/plugins/asset_library_editor_plugin.cpp @@ -3860,7 +3864,7 @@ msgid "Reimport" msgstr "" #: editor/import_dock.cpp -msgid "Save scenes, re-import and restart" +msgid "Save Scenes, Re-Import, and Restart" msgstr "" #: editor/import_dock.cpp @@ -6663,14 +6667,6 @@ msgid "Open Godot online documentation." msgstr "" #: editor/plugins/script_editor_plugin.cpp -msgid "Request Docs" -msgstr "" - -#: editor/plugins/script_editor_plugin.cpp -msgid "Help improve the Godot documentation by giving feedback." -msgstr "" - -#: editor/plugins/script_editor_plugin.cpp msgid "Search the reference documentation." msgstr "" @@ -7101,6 +7097,10 @@ msgid "This operation requires a single selected node." msgstr "" #: editor/plugins/spatial_editor_plugin.cpp +msgid "Auto Orthogonal Enabled" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp msgid "Lock View Rotation" msgstr "" @@ -7189,13 +7189,13 @@ msgid "Freelook Slow Modifier" msgstr "" #: editor/plugins/spatial_editor_plugin.cpp -msgid "" -"Note: The FPS value displayed is the editor's framerate.\n" -"It cannot be used as a reliable indication of in-game performance." +msgid "View Rotation Locked" msgstr "" #: editor/plugins/spatial_editor_plugin.cpp -msgid "View Rotation Locked" +msgid "" +"Note: The FPS value displayed is the editor's framerate.\n" +"It cannot be used as a reliable indication of in-game performance." msgstr "" #: editor/plugins/spatial_editor_plugin.cpp @@ -9576,6 +9576,13 @@ msgid "" "Would you like to explore official example projects in the Asset Library?" msgstr "" +#: editor/project_manager.cpp +msgid "" +"The search box filters projects by name and last path component.\n" +"To filter projects by name and full path, the query must contain at least " +"one `/` character." +msgstr "" + #: editor/project_settings_editor.cpp msgid "Key " msgstr "" @@ -10537,6 +10544,12 @@ msgid "Script file already exists." msgstr "" #: editor/script_create_dialog.cpp +msgid "" +"Note: Built-in scripts have some limitations and can't be edited using an " +"external editor." +msgstr "" + +#: editor/script_create_dialog.cpp msgid "Class Name:" msgstr "" @@ -10657,6 +10670,10 @@ msgid "Total:" msgstr "" #: editor/script_editor_debugger.cpp +msgid "Export list to a CSV file" +msgstr "" + +#: editor/script_editor_debugger.cpp msgid "Resource Path" msgstr "" @@ -12160,6 +12177,10 @@ msgid "" "texture to some node for display." msgstr "" +#: scene/main/viewport.cpp +msgid "Viewport size must be greater than 0 to render anything." +msgstr "" + #: scene/resources/visual_shader_nodes.cpp msgid "Invalid source for preview." msgstr "" diff --git a/editor/translations/te.po b/editor/translations/te.po index d76be13ec1..a6c727fe89 100644 --- a/editor/translations/te.po +++ b/editor/translations/te.po @@ -1407,7 +1407,7 @@ msgstr "" msgid "Remove Autoload" msgstr "" -#: editor/editor_autoload_settings.cpp +#: editor/editor_autoload_settings.cpp editor/editor_plugin_settings.cpp msgid "Enable" msgstr "" @@ -2810,7 +2810,11 @@ msgid "Q&A" msgstr "" #: editor/editor_node.cpp -msgid "Issue Tracker" +msgid "Report a Bug" +msgstr "" + +#: editor/editor_node.cpp +msgid "Send Docs Feedback" msgstr "" #: editor/editor_node.cpp editor/plugins/asset_library_editor_plugin.cpp @@ -3831,7 +3835,7 @@ msgid "Reimport" msgstr "" #: editor/import_dock.cpp -msgid "Save scenes, re-import and restart" +msgid "Save Scenes, Re-Import, and Restart" msgstr "" #: editor/import_dock.cpp @@ -6613,14 +6617,6 @@ msgid "Open Godot online documentation." msgstr "" #: editor/plugins/script_editor_plugin.cpp -msgid "Request Docs" -msgstr "" - -#: editor/plugins/script_editor_plugin.cpp -msgid "Help improve the Godot documentation by giving feedback." -msgstr "" - -#: editor/plugins/script_editor_plugin.cpp msgid "Search the reference documentation." msgstr "" @@ -7050,6 +7046,10 @@ msgid "This operation requires a single selected node." msgstr "" #: editor/plugins/spatial_editor_plugin.cpp +msgid "Auto Orthogonal Enabled" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp msgid "Lock View Rotation" msgstr "" @@ -7138,13 +7138,13 @@ msgid "Freelook Slow Modifier" msgstr "" #: editor/plugins/spatial_editor_plugin.cpp -msgid "" -"Note: The FPS value displayed is the editor's framerate.\n" -"It cannot be used as a reliable indication of in-game performance." +msgid "View Rotation Locked" msgstr "" #: editor/plugins/spatial_editor_plugin.cpp -msgid "View Rotation Locked" +msgid "" +"Note: The FPS value displayed is the editor's framerate.\n" +"It cannot be used as a reliable indication of in-game performance." msgstr "" #: editor/plugins/spatial_editor_plugin.cpp @@ -9508,6 +9508,13 @@ msgid "" "Would you like to explore official example projects in the Asset Library?" msgstr "" +#: editor/project_manager.cpp +msgid "" +"The search box filters projects by name and last path component.\n" +"To filter projects by name and full path, the query must contain at least " +"one `/` character." +msgstr "" + #: editor/project_settings_editor.cpp msgid "Key " msgstr "" @@ -10463,6 +10470,12 @@ msgid "Script file already exists." msgstr "" #: editor/script_create_dialog.cpp +msgid "" +"Note: Built-in scripts have some limitations and can't be edited using an " +"external editor." +msgstr "" + +#: editor/script_create_dialog.cpp msgid "Class Name:" msgstr "" @@ -10583,6 +10596,10 @@ msgid "Total:" msgstr "" #: editor/script_editor_debugger.cpp +msgid "Export list to a CSV file" +msgstr "" + +#: editor/script_editor_debugger.cpp msgid "Resource Path" msgstr "" @@ -12076,6 +12093,10 @@ msgid "" "texture to some node for display." msgstr "" +#: scene/main/viewport.cpp +msgid "Viewport size must be greater than 0 to render anything." +msgstr "" + #: scene/resources/visual_shader_nodes.cpp msgid "Invalid source for preview." msgstr "" diff --git a/editor/translations/th.po b/editor/translations/th.po index a56f6338ab..e908dde33c 100644 --- a/editor/translations/th.po +++ b/editor/translations/th.po @@ -9,7 +9,7 @@ msgid "" msgstr "" "Project-Id-Version: Godot Engine editor\n" "POT-Creation-Date: \n" -"PO-Revision-Date: 2020-01-03 21:21+0000\n" +"PO-Revision-Date: 2020-03-31 02:26+0000\n" "Last-Translator: Thanachart Monpassorn <nunf_2539@hotmail.com>\n" "Language-Team: Thai <https://hosted.weblate.org/projects/godot-engine/godot/" "th/>\n" @@ -18,7 +18,7 @@ msgstr "" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=1; plural=0;\n" -"X-Generator: Weblate 3.10\n" +"X-Generator: Weblate 4.0-dev\n" #: core/math/expression.cpp modules/gdscript/gdscript_functions.cpp #: modules/visual_script/visual_script_builtin_funcs.cpp @@ -41,30 +41,27 @@ msgstr "ค่าà¸à¸´à¸™à¸žà¸¸à¸•ผิดพลาด %i (ไม่ผ่าà #: core/math/expression.cpp msgid "self can't be used because instance is null (not passed)" -msgstr "self ไม่สามารถใช้ได้เนื่à¸à¸‡à¸ˆà¸²à¸ instance มีค่า null (ไม่ผ่าน)" +msgstr "self ไม่สามารถใช้ได้เนื่à¸à¸‡à¸ˆà¸²à¸à¸à¸´à¸™à¸ªà¹à¸•นซ์มีค่า null (ไม่ผ่าน)" #: core/math/expression.cpp -#, fuzzy msgid "Invalid operands to operator %s, %s and %s." -msgstr "ไม่พบคุณสมบัติ '%s' ในโหนด %s" +msgstr "ดำเนินà¸à¸²à¸£à¸œà¸´à¸”พลาดที่ตัวดำเนินà¸à¸²à¸£ %s, %s à¹à¸¥à¸° %s" #: core/math/expression.cpp -#, fuzzy msgid "Invalid index of type %s for base type %s" -msgstr "ไม่พบคุณสมบัติ '%s' ในโหนด %s" +msgstr "ดัชนีขà¸à¸‡à¸Šà¸™à¸´à¸” '%s' ผิดพลาด ในชนิดà¸à¸²à¸™ %s" #: core/math/expression.cpp msgid "Invalid named index '%s' for base type %s" -msgstr "" +msgstr "ชื่à¸à¸”ัชนีขà¸à¸‡ '%s' ผิดพลาด สำหรับà¸à¸²à¸™ %s" #: core/math/expression.cpp -#, fuzzy msgid "Invalid arguments to construct '%s'" -msgstr ": ประเภทตัวà¹à¸›à¸£à¹„ม่ถูà¸à¸•้à¸à¸‡: " +msgstr "à¸à¸²à¸à¸´à¸§à¹€à¸¡à¸™à¸•์ไม่ถูà¸à¸•้à¸à¸‡à¹ƒà¸™à¸„à¸à¸™à¸ªà¸•รัภ'%s'" #: core/math/expression.cpp msgid "On call to '%s':" -msgstr "" +msgstr "เรียภ'%s':" #: core/ustring.cpp msgid "B" @@ -103,9 +100,8 @@ msgid "Balanced" msgstr "สมดุล" #: editor/animation_bezier_editor.cpp -#, fuzzy msgid "Mirror" -msgstr "สะท้à¸à¸™à¸‹à¹‰à¸²à¸¢à¸‚วา" +msgstr "à¸à¸£à¸°à¸ˆà¸" #: editor/animation_bezier_editor.cpp editor/editor_profiler.cpp msgid "Time:" @@ -116,29 +112,24 @@ msgid "Value:" msgstr "ค่า:" #: editor/animation_bezier_editor.cpp -#, fuzzy msgid "Insert Key Here" -msgstr "เพิ่มคีย์" +msgstr "เพิ่มคีย์ที่นี่" #: editor/animation_bezier_editor.cpp -#, fuzzy msgid "Duplicate Selected Key(s)" -msgstr "ทำซ้ำที่เลืà¸à¸" +msgstr "ทำซ้ำคีย์ที่เลืà¸à¸" #: editor/animation_bezier_editor.cpp -#, fuzzy msgid "Delete Selected Key(s)" -msgstr "ลบสิ่งที่เลืà¸à¸" +msgstr "ลบคีย์ที่เลืà¸à¸" #: editor/animation_bezier_editor.cpp -#, fuzzy msgid "Add Bezier Point" -msgstr "เพิ่มจุด" +msgstr "เพิ่มจุดเบซิเยร์" #: editor/animation_bezier_editor.cpp -#, fuzzy msgid "Move Bezier Points" -msgstr "ย้ายจุด" +msgstr "ย้ายจุดเบซิเยร์" #: editor/animation_bezier_editor.cpp editor/animation_track_editor.cpp msgid "Anim Duplicate Keys" @@ -169,34 +160,28 @@ msgid "Anim Change Call" msgstr "à¹à¸à¹‰à¹„ขà¸à¸²à¸£à¹€à¸£à¸µà¸¢à¸à¸Ÿà¸±à¸‡à¸à¹Œà¸Šà¸±à¸™à¹à¸à¸™à¸´à¹€à¸¡à¸Šà¸±à¸™" #: editor/animation_track_editor.cpp -#, fuzzy msgid "Anim Multi Change Keyframe Time" -msgstr "à¹à¸à¹‰à¹„ขเวลาคีย์เฟรมà¹à¸à¸™à¸´à¹€à¸¡à¸Šà¸±à¸™" +msgstr "à¹à¸à¹‰à¹„ขเวลาคีย์เฟรมà¹à¸à¸™à¸´à¹€à¸¡à¸Šà¸±à¸™à¹à¸šà¸šà¸«à¸¥à¸²à¸¢à¸„รั้ง" #: editor/animation_track_editor.cpp -#, fuzzy msgid "Anim Multi Change Transition" -msgstr "à¹à¸à¹‰à¹„ขทรานสิชันà¹à¸à¸™à¸´à¹€à¸¡à¸Šà¸±à¸™" +msgstr "à¹à¸à¹‰à¹„ขทรานสิชันà¹à¸à¸™à¸´à¹€à¸¡à¸Šà¸±à¸™à¹à¸šà¸šà¸«à¸¥à¸²à¸¢à¸„รั้ง" #: editor/animation_track_editor.cpp -#, fuzzy msgid "Anim Multi Change Transform" -msgstr "เคลื่à¸à¸™à¸¢à¹‰à¸²à¸¢à¹à¸à¸™à¸´à¹€à¸¡à¸Šà¸±à¸™" +msgstr "à¹à¸à¹‰à¹„ขà¸à¸²à¸£à¹€à¸›à¸¥à¸µà¹ˆà¸¢à¸™à¹à¸›à¸¥à¸‡à¹à¸à¸™à¸´à¹€à¸¡à¸Šà¸±à¸™à¹à¸šà¸šà¸«à¸¥à¸²à¸¢à¸„รั้ง" #: editor/animation_track_editor.cpp -#, fuzzy msgid "Anim Multi Change Keyframe Value" -msgstr "à¹à¸à¹‰à¹„ขค่าคีย์เฟรมà¹à¸à¸™à¸´à¹€à¸¡à¸Šà¸±à¸™" +msgstr "à¹à¸à¹‰à¹„ขคีย์เฟรมà¹à¸à¸™à¸´à¹€à¸¡à¸Šà¸±à¸™à¹à¸šà¸šà¸«à¸¥à¸²à¸¢à¸„รั้ง" #: editor/animation_track_editor.cpp -#, fuzzy msgid "Anim Multi Change Call" -msgstr "à¹à¸à¹‰à¹„ขà¸à¸²à¸£à¹€à¸£à¸µà¸¢à¸à¸Ÿà¸±à¸‡à¸à¹Œà¸Šà¸±à¸™à¹à¸à¸™à¸´à¹€à¸¡à¸Šà¸±à¸™" +msgstr "à¹à¸à¹‰à¹„ขà¸à¸²à¸£à¹€à¸£à¸µà¸¢à¸à¹à¸à¸™à¸´à¹€à¸¡à¸Šà¸±à¸™à¹à¸šà¸šà¸«à¸¥à¸²à¸¢à¸„รั้ง" #: editor/animation_track_editor.cpp -#, fuzzy msgid "Change Animation Length" -msgstr "à¹à¸à¹‰à¹„ขà¸à¸²à¸£à¸§à¸™à¸‹à¹‰à¸³à¹à¸à¸™à¸´à¹€à¸¡à¸Šà¸±à¸™" +msgstr "à¹à¸à¹‰à¹„ขความยาวà¹à¸à¸™à¸´à¹€à¸¡à¸Šà¸±à¸™" #: editor/animation_track_editor.cpp #: editor/plugins/sprite_frames_editor_plugin.cpp @@ -204,51 +189,44 @@ msgid "Change Animation Loop" msgstr "à¹à¸à¹‰à¹„ขà¸à¸²à¸£à¸§à¸™à¸‹à¹‰à¸³à¹à¸à¸™à¸´à¹€à¸¡à¸Šà¸±à¸™" #: editor/animation_track_editor.cpp -#, fuzzy msgid "Property Track" -msgstr "คุณสมบัติ:" +msgstr "คุณสมบัติà¹à¸—ร็à¸" #: editor/animation_track_editor.cpp -#, fuzzy msgid "3D Transform Track" -msgstr "ประเภทà¸à¸²à¸£à¹€à¸„ลื่à¸à¸™à¸¢à¹‰à¸²à¸¢" +msgstr "à¹à¸—ร็ภ3D Transform" #: editor/animation_track_editor.cpp msgid "Call Method Track" -msgstr "" +msgstr "เรียà¸à¹à¸—ร็à¸à¹€à¸¡à¸˜à¸à¸”" #: editor/animation_track_editor.cpp msgid "Bezier Curve Track" -msgstr "" +msgstr "à¹à¸—ร็à¸à¹€à¸ªà¹‰à¸™à¹‚ค้งเบซิเยร์" #: editor/animation_track_editor.cpp msgid "Audio Playback Track" -msgstr "" +msgstr "à¹à¸—ร็à¸à¸à¸²à¸£à¹€à¸¥à¹ˆà¸™à¹€à¸ªà¸µà¸¢à¸‡" #: editor/animation_track_editor.cpp -#, fuzzy msgid "Animation Playback Track" -msgstr "หยุดà¸à¸²à¸£à¹€à¸¥à¹ˆà¸™à¹à¸à¸™à¸´à¹€à¸¡à¸Šà¸±à¸™ (S)" +msgstr "à¹à¸—ร็à¸à¸à¸²à¸£à¹€à¸¥à¹ˆà¸™à¹à¸à¸™à¸´à¹€à¸¡à¸Šà¸±à¸™" #: editor/animation_track_editor.cpp -#, fuzzy msgid "Animation length (frames)" -msgstr "ความยาวà¹à¸à¸™à¸´à¹€à¸¡à¸Šà¸±à¸™ (วินาที)" +msgstr "ความยาวà¹à¸à¸™à¸´à¹€à¸¡à¸Šà¸±à¸™ (เฟรม)" #: editor/animation_track_editor.cpp -#, fuzzy msgid "Animation length (seconds)" msgstr "ความยาวà¹à¸à¸™à¸´à¹€à¸¡à¸Šà¸±à¸™ (วินาที)" #: editor/animation_track_editor.cpp -#, fuzzy msgid "Add Track" -msgstr "เพิ่มà¹à¸—ร็à¸à¹à¸à¸™à¸´à¹€à¸¡à¸Šà¸±à¸™" +msgstr "เพิ่มà¹à¸—ร็à¸" #: editor/animation_track_editor.cpp -#, fuzzy msgid "Animation Looping" -msgstr "ซูมà¹à¸à¸™à¸´à¹€à¸¡à¸Šà¸±à¸™" +msgstr "à¸à¸²à¸£à¸§à¸™à¸‹à¹‰à¸³à¹à¸à¸™à¸´à¹€à¸¡à¸Šà¸±à¸™" #: editor/animation_track_editor.cpp #: modules/visual_script/visual_script_editor.cpp @@ -256,52 +234,44 @@ msgid "Functions:" msgstr "ฟังà¸à¹Œà¸Šà¸±à¸™:" #: editor/animation_track_editor.cpp -#, fuzzy msgid "Audio Clips:" -msgstr "ตัวรับเสียง" +msgstr "คลิปเสียง:" #: editor/animation_track_editor.cpp -#, fuzzy msgid "Anim Clips:" -msgstr "คลิป" +msgstr "คลิปà¹à¸à¸™à¸´à¹€à¸¡à¸Šà¸±à¹ˆà¸™:" #: editor/animation_track_editor.cpp -#, fuzzy msgid "Change Track Path" -msgstr "เปลี่ยนค่าในà¸à¸²à¸£à¹Œà¹€à¸£à¸¢à¹Œ" +msgstr "เปลี่ยนที่à¸à¸¢à¸¹à¹ˆà¹à¸—ร็à¸" #: editor/animation_track_editor.cpp -#, fuzzy msgid "Toggle this track on/off." -msgstr "โหมดไร้สิ่งรบà¸à¸§à¸™" +msgstr "เปิด/ปิดà¸à¸²à¸£à¸•ิดตามà¹à¸—ร็à¸à¸™à¸µà¹‰" #: editor/animation_track_editor.cpp msgid "Update Mode (How this property is set)" -msgstr "" +msgstr "โหมดà¸à¸±à¸žà¹€à¸”ท (วิธีตั้งค่าคุณสมบัตินี้)" #: editor/animation_track_editor.cpp -#, fuzzy msgid "Interpolation Mode" -msgstr "โหนดà¹à¸à¸™à¸´à¹€à¸¡à¸Šà¸±à¸™" +msgstr "โหมดà¸à¸²à¸£à¹à¸à¹‰à¹„ข" #: editor/animation_track_editor.cpp msgid "Loop Wrap Mode (Interpolate end with beginning on loop)" -msgstr "" +msgstr "โหมดวนรà¸à¸š (ต่à¸à¸ˆà¸¸à¸”สิ้นสุดด้วยจุดเริ่มต้นขà¸à¸‡à¸¥à¸¹à¸›)" #: editor/animation_track_editor.cpp -#, fuzzy msgid "Remove this track." -msgstr "ลบà¹à¸—ร็à¸à¸—ี่เลืà¸à¸" +msgstr "ลบà¹à¸—ร็à¸à¸™à¸µà¹‰" #: editor/animation_track_editor.cpp -#, fuzzy msgid "Time (s): " -msgstr "ระยะเวลาเฟด (วิ):" +msgstr "เวลา (วินาที): " #: editor/animation_track_editor.cpp -#, fuzzy msgid "Toggle Track Enabled" -msgstr "เปิดดà¸à¸›à¹€à¸žà¸¥à¸à¸£à¹Œ" +msgstr "เปิดà¸à¸²à¸£à¹ƒà¸Šà¹‰à¸‡à¸²à¸™à¸à¸²à¸£à¸•ิดตามà¹à¸—ร็à¸" #: editor/animation_track_editor.cpp msgid "Continuous" @@ -316,13 +286,12 @@ msgid "Trigger" msgstr "ทริà¸à¹€à¸à¸à¸£à¹Œ" #: editor/animation_track_editor.cpp -#, fuzzy msgid "Capture" -msgstr "ฟีเจà¸à¸£à¹Œ" +msgstr "จับ" #: editor/animation_track_editor.cpp msgid "Nearest" -msgstr "" +msgstr "ใà¸à¸¥à¹‰à¸—ี่สุด" #: editor/animation_track_editor.cpp editor/plugins/curve_editor_plugin.cpp #: editor/property_editor.cpp @@ -331,15 +300,15 @@ msgstr "เส้นตรง" #: editor/animation_track_editor.cpp msgid "Cubic" -msgstr "" +msgstr "ลูà¸à¸šà¸²à¸¨à¸à¹Œ" #: editor/animation_track_editor.cpp msgid "Clamp Loop Interp" -msgstr "" +msgstr "à¸à¸²à¸£à¸ˆà¸³à¸à¸±à¸”à¸à¸²à¸£à¸§à¸™à¸¥à¸¹à¸›" #: editor/animation_track_editor.cpp msgid "Wrap Loop Interp" -msgstr "" +msgstr "ล้à¸à¸¡à¸à¸²à¸£à¸§à¸™à¸‹à¹‰à¸³" #: editor/animation_track_editor.cpp #: editor/plugins/canvas_item_editor_plugin.cpp @@ -347,19 +316,16 @@ msgid "Insert Key" msgstr "เพิ่มคีย์" #: editor/animation_track_editor.cpp -#, fuzzy msgid "Duplicate Key(s)" -msgstr "ทำซ้ำโหนด" +msgstr "สร้างคีย์ซ้ำà¸à¸µà¸à¸à¸±à¸™" #: editor/animation_track_editor.cpp -#, fuzzy msgid "Delete Key(s)" -msgstr "ลบโหนด" +msgstr "ลบคีย์" #: editor/animation_track_editor.cpp -#, fuzzy msgid "Change Animation Update Mode" -msgstr "เปลี่ยนชื่à¸à¹à¸à¸™à¸´à¹€à¸¡à¸Šà¸±à¸™:" +msgstr "เปลี่ยนโหมดà¸à¸²à¸£à¸à¸±à¸žà¹€à¸”ทà¹à¸à¸™à¸´à¹€à¸¡à¸Šà¸±à¸™" #: editor/animation_track_editor.cpp #, fuzzy @@ -367,9 +333,8 @@ msgid "Change Animation Interpolation Mode" msgstr "โหนดà¹à¸à¸™à¸´à¹€à¸¡à¸Šà¸±à¸™" #: editor/animation_track_editor.cpp -#, fuzzy msgid "Change Animation Loop Mode" -msgstr "à¹à¸à¹‰à¹„ขà¸à¸²à¸£à¸§à¸™à¸‹à¹‰à¸³à¹à¸à¸™à¸´à¹€à¸¡à¸Šà¸±à¸™" +msgstr "เปลี่ยนโหมดà¸à¸²à¸£à¸§à¸™à¸‹à¹‰à¸³à¹à¸à¸™à¸´à¹€à¸¡à¸Šà¸±à¸™" #: editor/animation_track_editor.cpp msgid "Remove Anim Track" @@ -401,7 +366,7 @@ msgstr "à¹à¸—รà¸à¹à¸à¸™à¸´à¹€à¸¡à¸Šà¸±à¸™" #: editor/animation_track_editor.cpp msgid "AnimationPlayer can't animate itself, only other players." -msgstr "" +msgstr "ตัวเล่นà¸à¸™à¸´à¹€à¸¡à¸Šà¸±à¹ˆà¸™à¹„ม่สามารถเล่นà¸à¸™à¸´à¹€à¸¡à¸Šà¸±à¹ˆà¸™à¸”้วยตัวมันเà¸à¸‡à¹„ด้ เล่นได้เฉพาะตัวเล่นà¸à¸·à¹ˆà¸™à¹€à¸—่านั้น" #: editor/animation_track_editor.cpp msgid "Anim Create & Insert" @@ -421,9 +386,8 @@ msgid "Change Animation Step" msgstr "à¹à¸à¹‰à¹„ขความเร็วà¹à¸à¸™à¸´à¹€à¸¡à¸Šà¸±à¸™" #: editor/animation_track_editor.cpp -#, fuzzy msgid "Rearrange Tracks" -msgstr "จัดลำดับà¸à¸à¹‚ต้โหลด" +msgstr "จัดเรียงà¹à¸—ร็à¸" #: editor/animation_track_editor.cpp msgid "Transform tracks only apply to Spatial-based nodes." @@ -436,73 +400,70 @@ msgid "" "-AudioStreamPlayer2D\n" "-AudioStreamPlayer3D" msgstr "" +"à¹à¸—ร็à¸à¹€à¸ªà¸µà¸¢à¸‡à¸ªà¸²à¸¡à¸²à¸£à¸–ติดไว้บนโหนดชนิดเหล่านี้เท่านั้น:\n" +"-AudioStreamPlayer\n" +"-AudioStreamPlayer2D\n" +"-AudioStreamPlayer3D" #: editor/animation_track_editor.cpp msgid "Animation tracks can only point to AnimationPlayer nodes." -msgstr "" +msgstr "à¹à¸—ร็à¸à¸à¸™à¸´à¹€à¸¡à¸Šà¸±à¹ˆà¸™à¸ªà¸²à¸¡à¸²à¸£à¸–ติดไว้บนโหนด AnimationPlayer เท่านั้น" #: editor/animation_track_editor.cpp msgid "An animation player can't animate itself, only other players." -msgstr "" +msgstr "à¹à¸—ร็à¸à¸à¸™à¸´à¹€à¸¡à¸Šà¸±à¹ˆà¸™à¹„ม่สามารถเล่นตัวมันเà¸à¸‡à¹„ด้ à¹à¸•่สามารถเล่นตัวเล่นà¸à¸·à¹ˆà¸™à¹„ด้" #: editor/animation_track_editor.cpp msgid "Not possible to add a new track without a root" -msgstr "" +msgstr "ไม่สามารถที่จะเพิ่มà¹à¸—ร็à¸à¹ƒà¸«à¸¡à¹ˆà¹‚ดยที่ไม่มีรูท" #: editor/animation_track_editor.cpp msgid "Invalid track for Bezier (no suitable sub-properties)" -msgstr "" +msgstr "à¹à¸—ร็à¸à¸œà¸´à¸”พลาดสำหรับเบซิเยร์ (ไม่มีคุณสมบัติย่à¸à¸¢à¸—ี่เข้าà¸à¸±à¸™à¹„ด้)" #: editor/animation_track_editor.cpp -#, fuzzy msgid "Add Bezier Track" -msgstr "เพิ่มà¹à¸—ร็à¸à¹à¸à¸™à¸´à¹€à¸¡à¸Šà¸±à¸™" +msgstr "เพิ่มà¹à¸—ร็à¸à¹€à¸šà¸‹à¸´à¹€à¸¢à¸£à¹Œ" #: editor/animation_track_editor.cpp msgid "Track path is invalid, so can't add a key." -msgstr "" +msgstr "ที่à¸à¸¢à¸¹à¹ˆà¹à¸—ร็à¸à¸œà¸´à¸”พลาด ไม่สามารถเพิ่มคีย์ได้" #: editor/animation_track_editor.cpp msgid "Track is not of type Spatial, can't insert key" -msgstr "" +msgstr "à¹à¸—ร็à¸à¹„ม่ใช่ชนิด Spatial, ไม่สามารถเพิ่มคีย์ได้" #: editor/animation_track_editor.cpp -#, fuzzy msgid "Add Transform Track Key" -msgstr "ประเภทà¸à¸²à¸£à¹€à¸„ลื่à¸à¸™à¸¢à¹‰à¸²à¸¢" +msgstr "เพิ่มคีย์à¹à¸—ร็à¸à¸à¸²à¸£à¹à¸›à¸¥à¸‡" #: editor/animation_track_editor.cpp -#, fuzzy msgid "Add Track Key" -msgstr "เพิ่มà¹à¸—ร็à¸à¹à¸à¸™à¸´à¹€à¸¡à¸Šà¸±à¸™" +msgstr "เพิ่มà¹à¸—ร็à¸à¸„ีย์" #: editor/animation_track_editor.cpp msgid "Track path is invalid, so can't add a method key." -msgstr "" +msgstr "ที่à¸à¸¢à¸¹à¹ˆà¹à¸—ร็à¸à¸œà¸´à¸”พลาด ไม่สามารถเพิ่มคีย์เมธà¸à¸”ได้" #: editor/animation_track_editor.cpp -#, fuzzy msgid "Add Method Track Key" -msgstr "เพิ่มà¹à¸—ร็à¸à¹à¸¥à¸°à¸„ีย์à¹à¸à¸™à¸´à¹€à¸¡à¸Šà¸±à¸™" +msgstr "เพิ่มคีย์à¹à¸—ร็à¸à¹€à¸¡à¸˜à¸à¸”" #: editor/animation_track_editor.cpp -#, fuzzy msgid "Method not found in object: " -msgstr "ไม่พบ VariableGet ในสคริปต์: " +msgstr "ไม่พบเมธà¸à¸”ในà¸à¸à¸šà¹€à¸ˆà¸à¸•์: " #: editor/animation_track_editor.cpp msgid "Anim Move Keys" msgstr "ย้ายคีย์à¹à¸à¸™à¸´à¹€à¸¡à¸Šà¸±à¸™" #: editor/animation_track_editor.cpp -#, fuzzy msgid "Clipboard is empty" -msgstr "คลิปบà¸à¸£à¹Œà¸”ว่างเปล่า!" +msgstr "คลิปบà¸à¸£à¹Œà¸”ว่างเปล่า" #: editor/animation_track_editor.cpp -#, fuzzy msgid "Paste Tracks" -msgstr "วางตัวà¹à¸›à¸£" +msgstr "วางà¹à¸—ร็à¸" #: editor/animation_track_editor.cpp msgid "Anim Scale Keys" @@ -511,7 +472,7 @@ msgstr "ปรับคีย์à¹à¸à¸™à¸´à¹€à¸¡à¸Šà¸±à¸™" #: editor/animation_track_editor.cpp msgid "" "This option does not work for Bezier editing, as it's only a single track." -msgstr "" +msgstr "ตัวเลืà¸à¸à¸™à¸µà¹‰à¹„ม่สามารถทำงานà¸à¸±à¸šà¹à¸—ร็à¸à¹€à¸šà¸‹à¸´à¹€à¸¢à¸£à¹Œ เนื่à¸à¸‡à¸ˆà¸²à¸à¹€à¸›à¹‡à¸™à¹à¸„่à¹à¸—ร็à¸à¹€à¸”ี่ยว" #: editor/animation_track_editor.cpp msgid "" @@ -528,16 +489,15 @@ msgstr "" #: editor/animation_track_editor.cpp msgid "Warning: Editing imported animation" -msgstr "" +msgstr "คำเตืà¸à¸™: à¸à¸³à¸¥à¸±à¸‡à¹à¸à¹‰à¹„ขà¹à¸à¸™à¸´à¹€à¸¡à¸Šà¸±à¸™à¸—ี่นำเข้ามา" #: editor/animation_track_editor.cpp -#, fuzzy msgid "Select an AnimationPlayer node to create and edit animations." -msgstr "เลืà¸à¸ AnimationPlayer จาà¸à¸œà¸±à¸‡à¸‰à¸²à¸à¹€à¸žà¸·à¹ˆà¸à¹à¸à¹‰à¹„ขà¹à¸à¸™à¸´à¹€à¸¡à¸Šà¸±à¸™" +msgstr "เลืà¸à¸à¹‚หนด AnimationPlayer เพื่à¸à¸ªà¸£à¹‰à¸²à¸‡à¹à¸¥à¸°à¹à¸à¹‰à¹„ขà¹à¸à¸™à¸´à¹€à¸¡à¸Šà¸±à¸™" #: editor/animation_track_editor.cpp msgid "Only show tracks from nodes selected in tree." -msgstr "" +msgstr "โชว์à¹à¸—ร็à¸à¸ˆà¸²à¸à¹‚หนดที่เลืà¸à¸à¹ƒà¸™à¸œà¸±à¸‡à¹€à¸—่านั้น" #: editor/animation_track_editor.cpp msgid "Group tracks by node or display them as plain list." @@ -555,11 +515,11 @@ msgstr "ผังà¹à¸à¸™à¸´à¹€à¸¡à¸Šà¸±à¸™à¸–ูà¸à¸•้à¸à¸‡" #: editor/animation_track_editor.cpp msgid "Seconds" -msgstr "" +msgstr "วินาที" #: editor/animation_track_editor.cpp msgid "FPS" -msgstr "เฟรมต่à¸à¸§à¸´à¸™à¸²à¸—ี" +msgstr "เฟรมเรท" #: editor/animation_track_editor.cpp editor/editor_properties.cpp #: editor/plugins/polygon_2d_editor_plugin.cpp @@ -572,14 +532,12 @@ msgid "Edit" msgstr "à¹à¸à¹‰à¹„ข" #: editor/animation_track_editor.cpp -#, fuzzy msgid "Animation properties." -msgstr "ผังà¹à¸à¸™à¸´à¹€à¸¡à¸Šà¸±à¸™" +msgstr "คุณสมบัติà¹à¸à¸™à¸´à¹€à¸¡à¸Šà¸±à¸™" #: editor/animation_track_editor.cpp -#, fuzzy msgid "Copy Tracks" -msgstr "คัดลà¸à¸à¸•ัวà¹à¸›à¸£" +msgstr "คัดลà¸à¸à¹à¸—ร็à¸" #: editor/animation_track_editor.cpp msgid "Scale Selection" @@ -598,19 +556,16 @@ msgid "Duplicate Transposed" msgstr "ทำซ้ำเปลี่ยนà¹à¸—ร็à¸" #: editor/animation_track_editor.cpp -#, fuzzy msgid "Delete Selection" -msgstr "ลบสิ่งที่เลืà¸à¸" +msgstr "ลบที่เลืà¸à¸" #: editor/animation_track_editor.cpp -#, fuzzy msgid "Go to Next Step" -msgstr "ถัดไป" +msgstr "ไปยังขั้นถัดไป" #: editor/animation_track_editor.cpp -#, fuzzy msgid "Go to Previous Step" -msgstr "à¸à¹ˆà¸à¸™à¸«à¸™à¹‰à¸²" +msgstr "ไปยังขั้นà¸à¹ˆà¸à¸™à¸«à¸™à¹‰à¸²" #: editor/animation_track_editor.cpp msgid "Optimize Animation" @@ -622,11 +577,11 @@ msgstr "เà¸à¹‡à¸šà¸à¸§à¸²à¸”à¹à¸à¸™à¸´à¹€à¸¡à¸Šà¸±à¸™" #: editor/animation_track_editor.cpp msgid "Pick the node that will be animated:" -msgstr "" +msgstr "เลืà¸à¸à¹‚หนดที่จะให้เคลื่à¸à¸™à¹„หว:" #: editor/animation_track_editor.cpp msgid "Use Bezier Curves" -msgstr "" +msgstr "ใช้เส้นโค้งเบซิเยร์" #: editor/animation_track_editor.cpp msgid "Anim. Optimizer" @@ -673,9 +628,8 @@ msgid "Scale Ratio:" msgstr "à¸à¸±à¸•ราส่วนเวลา:" #: editor/animation_track_editor.cpp -#, fuzzy msgid "Select Tracks to Copy" -msgstr "เลืà¸à¸à¸„ุณสมบัติ" +msgstr "เลืà¸à¸à¹à¸—ร็à¸à¸—ี่จะคัดลà¸à¸" #: editor/animation_track_editor.cpp editor/editor_log.cpp #: editor/editor_properties.cpp @@ -687,22 +641,20 @@ msgid "Copy" msgstr "คัดลà¸à¸" #: editor/animation_track_editor.cpp -#, fuzzy msgid "Select All/None" -msgstr "ไม่เลืà¸à¸" +msgstr "เลืà¸à¸à¸—ั้งหมด/ไม่เลืà¸à¸" #: editor/animation_track_editor_plugins.cpp -#, fuzzy msgid "Add Audio Track Clip" -msgstr "ตัวรับเสียง" +msgstr "เพิ่มคลิปà¹à¸—ร็à¸à¹€à¸ªà¸µà¸¢à¸‡" #: editor/animation_track_editor_plugins.cpp msgid "Change Audio Track Clip Start Offset" -msgstr "" +msgstr "เปลี่ยนà¸à¸à¸Ÿà¹€à¸‹à¹‡à¸•เริ่มต้นขà¸à¸‡à¸„ลิปà¹à¸—ร็à¸à¹€à¸ªà¸µà¸¢à¸‡" #: editor/animation_track_editor_plugins.cpp msgid "Change Audio Track Clip End Offset" -msgstr "" +msgstr "เปลี่ยนà¸à¸à¸Ÿà¹€à¸‹à¹‡à¸•ตà¸à¸™à¸ˆà¸šà¸‚à¸à¸‡à¸„ลิปà¹à¸—ร็à¸à¹€à¸ªà¸µà¸¢à¸‡" #: editor/array_property_edit.cpp msgid "Resize Array" @@ -725,18 +677,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 "" +msgstr "จับคู่ %d" #: editor/code_editor.cpp editor/editor_help.cpp -#, fuzzy msgid "%d matches." -msgstr "ไม่พบ" +msgstr "%d ตรงà¸à¸±à¸™" #: editor/code_editor.cpp editor/find_in_files.cpp msgid "Match Case" @@ -761,7 +711,7 @@ msgstr "เฉพาะที่à¸à¸³à¸¥à¸±à¸‡à¹€à¸¥à¸·à¸à¸" #: editor/code_editor.cpp editor/plugins/script_text_editor.cpp #: editor/plugins/text_editor.cpp msgid "Standard" -msgstr "" +msgstr "มาตรà¸à¸²à¸™" #: editor/code_editor.cpp editor/plugins/script_editor_plugin.cpp msgid "Toggle Scripts Panel" @@ -789,39 +739,33 @@ msgstr "คำเตืà¸à¸™" #: editor/code_editor.cpp msgid "Line and column numbers." -msgstr "" +msgstr "เลขบรรทัดà¹à¸¥à¸°à¸„à¸à¸¥à¸±à¸¡à¸™à¹Œ" #: editor/connections_dialog.cpp -#, fuzzy msgid "Method in target node must be specified." -msgstr "ต้à¸à¸‡à¸£à¸°à¸šà¸¸à¹€à¸¡à¸—็à¸à¸”ในโหนดปลายทาง!" +msgstr "ต้à¸à¸‡à¸£à¸°à¸šà¸¸à¹€à¸¡à¸˜à¸à¸”ในโหนดเป้าหมาย" #: editor/connections_dialog.cpp -#, fuzzy msgid "" "Target method not found. Specify a valid method or attach a script to the " "target node." -msgstr "ไม่พบเมท็à¸à¸”ปลายทาง! ระบุเมท็à¸à¸”ให้ถูà¸à¸•้à¸à¸‡à¸«à¸£à¸·à¸à¹€à¸žà¸´à¹ˆà¸¡à¸ªà¸„ริปต์ในโหนดปลายทาง" +msgstr "ไม่พบโหนดเป้าหมาย ระบุเมธà¸à¸”ที่ถูà¸à¸•้à¸à¸‡à¸«à¸£à¸·à¸à¹€à¸žà¸´à¹ˆà¸¡à¸ªà¸„ริปต์ในโหนดเป้าหมาย" #: editor/connections_dialog.cpp -#, fuzzy msgid "Connect to Node:" -msgstr "เชื่à¸à¸¡à¹„ปยังโหนด:" +msgstr "เชื่à¸à¸¡à¸•่à¸à¸à¸±à¸šà¹‚หนด:" #: editor/connections_dialog.cpp -#, fuzzy msgid "Connect to Script:" -msgstr "ไม่สามารถเชื่à¸à¸¡à¸•่à¸à¸à¸±à¸šà¹‚ฮสต์:" +msgstr "เชื่à¸à¸¡à¸•่à¸à¸ªà¸„ริปต์:" #: editor/connections_dialog.cpp -#, fuzzy msgid "From Signal:" -msgstr "สัà¸à¸à¸²à¸“:" +msgstr "จาà¸à¸ªà¸±à¸à¸à¸²à¸“:" #: editor/connections_dialog.cpp -#, fuzzy msgid "Scene does not contain any script." -msgstr "โหนดไม่มี geometry" +msgstr "ไม่มีสคริปต์ในฉาà¸" #: editor/connections_dialog.cpp editor/editor_autoload_settings.cpp #: editor/groups_editor.cpp editor/plugins/item_list_editor_plugin.cpp @@ -849,14 +793,12 @@ msgid "Extra Call Arguments:" msgstr "ตัวà¹à¸›à¸£à¹€à¸žà¸´à¹ˆà¸¡à¹€à¸•ิม:" #: editor/connections_dialog.cpp -#, fuzzy msgid "Receiver Method:" -msgstr "เลืà¸à¸à¹€à¸¡à¸—็à¸à¸”" +msgstr "ตัวรับเมธà¸à¸”:" #: editor/connections_dialog.cpp -#, fuzzy msgid "Advanced" -msgstr "ตัวเลืà¸à¸à¸à¸²à¸£à¸ˆà¸³à¸à¸±à¸”" +msgstr "ขั้นสูง" #: editor/connections_dialog.cpp msgid "Deferred" @@ -876,9 +818,8 @@ msgid "Disconnects the signal after its first emission." msgstr "" #: editor/connections_dialog.cpp -#, fuzzy msgid "Cannot connect signal" -msgstr "เชื่à¸à¸¡à¹‚ยงสัà¸à¸à¸²à¸“:" +msgstr "ไม่สามารถเชื่à¸à¸¡à¸•่à¸à¸ªà¸±à¸à¸à¸²à¸“" #: editor/connections_dialog.cpp editor/dependency_editor.cpp #: editor/export_template_manager.cpp editor/groups_editor.cpp @@ -900,7 +841,6 @@ msgid "Connect" msgstr "เชื่à¸à¸¡" #: editor/connections_dialog.cpp -#, fuzzy msgid "Signal:" msgstr "สัà¸à¸à¸²à¸“:" @@ -910,12 +850,11 @@ msgstr "เชื่à¸à¸¡ '%s' à¸à¸±à¸š '%s'" #: editor/connections_dialog.cpp msgid "Disconnect '%s' from '%s'" -msgstr "ลบà¸à¸²à¸£à¹€à¸Šà¸·à¹ˆà¸à¸¡à¹‚ยง '%s' à¸à¸±à¸š '%s'" +msgstr "ตัดà¸à¸²à¸£à¹€à¸Šà¸·à¹ˆà¸à¸¡à¸•่ภ'%s' à¸à¸±à¸š '%s'" #: editor/connections_dialog.cpp -#, fuzzy msgid "Disconnect all from signal: '%s'" -msgstr "ลบà¸à¸²à¸£à¹€à¸Šà¸·à¹ˆà¸à¸¡à¹‚ยง '%s' à¸à¸±à¸š '%s'" +msgstr "ตัดà¸à¸²à¸£à¹€à¸Šà¸·à¹ˆà¸à¸¡à¸•่à¸à¸—ั้งหมดจาà¸à¸ªà¸±à¸à¸à¸²à¸“: '%s'" #: editor/connections_dialog.cpp msgid "Connect..." @@ -927,19 +866,16 @@ msgid "Disconnect" msgstr "ลบà¸à¸²à¸£à¹€à¸Šà¸·à¹ˆà¸à¸¡à¹‚ยง" #: editor/connections_dialog.cpp -#, fuzzy msgid "Connect a Signal to a Method" -msgstr "เชื่à¸à¸¡à¹‚ยงสัà¸à¸à¸²à¸“:" +msgstr "เชื่à¸à¸¡à¸•่à¸à¸ªà¸±à¸à¸à¸²à¸“ไปยังเมธà¸à¸”" #: editor/connections_dialog.cpp -#, fuzzy msgid "Edit Connection:" -msgstr "à¹à¸à¹‰à¹„ขà¸à¸²à¸£à¹€à¸Šà¸·à¹ˆà¸à¸¡à¹‚ยง" +msgstr "à¹à¸à¹‰à¹„ขà¸à¸²à¸£à¹€à¸Šà¸·à¹ˆà¸à¸¡à¸•่à¸:" #: editor/connections_dialog.cpp -#, fuzzy msgid "Are you sure you want to remove all connections from the \"%s\" signal?" -msgstr "ยืนยันà¸à¸²à¸£à¸£à¸±à¸™à¹‚ปรเจà¸à¸•์มาà¸à¸à¸§à¹ˆà¸² 1 โปรเจà¸à¸•์?" +msgstr "ยืนยันà¸à¸²à¸£à¸¥à¸šà¸à¸²à¸£à¹€à¸Šà¸·à¹ˆà¸à¸¡à¸•่à¸à¸ªà¸±à¸à¸à¸²à¸“จาภ\"%s\"?" #: editor/connections_dialog.cpp editor/editor_help.cpp editor/node_dock.cpp msgid "Signals" @@ -950,19 +886,16 @@ msgid "Are you sure you want to remove all connections from this signal?" msgstr "" #: editor/connections_dialog.cpp -#, fuzzy msgid "Disconnect All" -msgstr "ลบà¸à¸²à¸£à¹€à¸Šà¸·à¹ˆà¸à¸¡à¹‚ยง" +msgstr "ตัดà¸à¸²à¸£à¹€à¸Šà¸·à¹ˆà¸à¸¡à¸•่à¸à¸—ั้งหมด" #: editor/connections_dialog.cpp -#, fuzzy msgid "Edit..." -msgstr "à¹à¸à¹‰à¹„ข" +msgstr "à¹à¸à¹‰à¹„ข..." #: editor/connections_dialog.cpp -#, fuzzy msgid "Go To Method" -msgstr "รายชื่à¸à¹€à¸¡à¸—็à¸à¸”" +msgstr "ไปยังเมธà¸à¸”" #: editor/create_dialog.cpp msgid "Change %s Type" @@ -1014,7 +947,6 @@ msgid "Dependencies For:" msgstr "à¸à¸²à¸£à¸à¹‰à¸²à¸‡à¸à¸´à¸‡à¸‚à¸à¸‡:" #: editor/dependency_editor.cpp -#, fuzzy msgid "" "Scene '%s' is currently being edited.\n" "Changes will only take effect when reloaded." @@ -1023,12 +955,11 @@ msgstr "" "à¸à¸²à¸£à¹à¸à¹‰à¹„ขจะไม่ส่งผลจนà¸à¸§à¹ˆà¸²à¸ˆà¸°à¹‚หลดใหม่" #: editor/dependency_editor.cpp -#, fuzzy msgid "" "Resource '%s' is in use.\n" "Changes will only take effect when reloaded." msgstr "" -"รีซà¸à¸£à¹Œà¸ª '%s' à¸à¸³à¸¥à¸±à¸‡à¸–ูà¸à¹ƒà¸Šà¹‰à¸‡à¸²à¸™\n" +"ทรัพยาà¸à¸£ '%s' à¸à¸³à¸¥à¸±à¸‡à¸–ูà¸à¹ƒà¸Šà¹‰à¸‡à¸²à¸™\n" "à¸à¸²à¸£à¹à¸à¹‰à¹„ขจะไม่ส่งผลจนà¸à¸§à¹ˆà¸²à¸ˆà¸°à¹‚หลดใหม่" #: editor/dependency_editor.cpp @@ -1038,12 +969,12 @@ msgstr "à¸à¸²à¸£à¸à¹‰à¸²à¸‡à¸à¸´à¸‡" #: editor/dependency_editor.cpp msgid "Resource" -msgstr "รีซà¸à¸£à¹Œà¸ª" +msgstr "ทรัพยาà¸à¸£" #: editor/dependency_editor.cpp editor/editor_autoload_settings.cpp #: editor/project_manager.cpp editor/project_settings_editor.cpp msgid "Path" -msgstr "ตำà¹à¸«à¸™à¹ˆà¸‡" +msgstr "เส้นทาง" #: editor/dependency_editor.cpp msgid "Dependencies:" @@ -1059,7 +990,7 @@ msgstr "à¹à¸à¹‰à¹„ขà¸à¸²à¸£à¸à¹‰à¸²à¸‡à¸à¸´à¸‡" #: editor/dependency_editor.cpp msgid "Search Replacement Resource:" -msgstr "ค้นหารีซà¸à¸£à¹Œà¸ªà¸¡à¸²à¹à¸—นที่:" +msgstr "ค้นหาทรัพยาà¸à¸£à¸¡à¸²à¹à¸—นที่:" #: editor/dependency_editor.cpp editor/editor_file_dialog.cpp #: editor/editor_help_search.cpp editor/editor_node.cpp @@ -1076,9 +1007,8 @@ msgid "Owners Of:" msgstr "เจ้าขà¸à¸‡à¸‚à¸à¸‡:" #: editor/dependency_editor.cpp -#, fuzzy msgid "Remove selected files from the project? (Can't be restored)" -msgstr "ลบไฟล์ที่เลืà¸à¸à¸à¸à¸à¸ˆà¸²à¸à¹‚ปรเจà¸à¸•์? (ย้à¸à¸™à¸à¸¥à¸±à¸šà¹„ม่ได้)" +msgstr "ลบไฟล์ที่เลืà¸à¸à¸à¸à¸à¸ˆà¸²à¸à¹‚ปรเจà¸à¸•์? (à¸à¸¹à¹‰à¸„ืนไม่ได้)" #: editor/dependency_editor.cpp msgid "" @@ -1086,8 +1016,8 @@ msgid "" "work.\n" "Remove them anyway? (no undo)" msgstr "" -"มีรีซà¸à¸£à¹Œà¸ªà¸à¸·à¹ˆà¸™à¸•้à¸à¸‡à¸à¸²à¸£à¹„ฟล์ที่à¸à¸³à¸¥à¸±à¸‡à¸¥à¸š\n" -"ยืนยันจะลบหรืà¸à¹„ม่? (ย้à¸à¸™à¸à¸¥à¸±à¸šà¹„ม่ได้)" +"ไฟล์ที่à¸à¸³à¸¥à¸±à¸‡à¸ˆà¸°à¸¥à¸š จำเป็นสำหรับใช้งานโดยทรัพยาà¸à¸£à¸à¸±à¸™à¸à¸·à¹ˆà¸™\n" +"จะทำà¸à¸²à¸£à¸¥à¸šà¸«à¸£à¸·à¸à¹„ม่? (คืนà¸à¸¥à¸±à¸šà¹„ม่ได้)" #: editor/dependency_editor.cpp msgid "Cannot remove:" @@ -1098,9 +1028,8 @@ msgid "Error loading:" msgstr "ผิดพลาดขณะโหลด:" #: editor/dependency_editor.cpp -#, fuzzy msgid "Load failed due to missing dependencies:" -msgstr "โหลดฉาà¸à¹„ม่ได้เนื่à¸à¸‡à¸ˆà¸²à¸à¸à¸²à¸£à¸à¹‰à¸²à¸‡à¸à¸´à¸‡à¸ªà¸¹à¸à¸«à¸²à¸¢:" +msgstr "โหลดผิดพลาดเนื่à¸à¸‡à¸ˆà¸²à¸à¸à¸²à¸£à¸à¹‰à¸²à¸‡à¸à¸´à¸‡à¸ªà¸¹à¸à¸«à¸²à¸¢:" #: editor/dependency_editor.cpp editor/editor_node.cpp msgid "Open Anyway" @@ -1120,16 +1049,15 @@ msgstr "ผิดพลาดขณะโหลด!" #: editor/dependency_editor.cpp msgid "Permanently delete %d item(s)? (No undo!)" -msgstr "ลบ %d ไฟล์ถาวร? (ย้à¸à¸™à¸à¸¥à¸±à¸šà¹„ม่ได้!)" +msgstr "ลบไà¸à¹€à¸—ม %d ถาวรหรืà¸à¹„ม่? (ย้à¸à¸™à¸à¸¥à¸±à¸šà¹„ม่ได้!)" #: editor/dependency_editor.cpp -#, fuzzy msgid "Show Dependencies" -msgstr "à¸à¸²à¸£à¸à¹‰à¸²à¸‡à¸à¸´à¸‡" +msgstr "à¹à¸ªà¸”งà¸à¸²à¸£à¸à¹‰à¸²à¸‡à¸à¸´à¸‡" #: editor/dependency_editor.cpp msgid "Orphan Resource Explorer" -msgstr "ตัวจัดà¸à¸²à¸£à¸£à¸µà¸‹à¸à¸£à¹Œà¸ªà¸—ี่ไม่มีเจ้าขà¸à¸‡" +msgstr "ทรัพยาà¸à¸£à¸—ี่ไม่ได้ใช้" #: editor/dependency_editor.cpp editor/editor_audio_buses.cpp #: editor/editor_file_dialog.cpp editor/editor_node.cpp @@ -1216,12 +1144,10 @@ msgid "License" msgstr "สัà¸à¸à¸²à¸à¸™à¸¸à¸à¸²à¸•" #: editor/editor_about.cpp -#, fuzzy msgid "Third-party Licenses" -msgstr "สัà¸à¸à¸²à¸à¸™à¸¸à¸à¸²à¸•ไลบรารี" +msgstr "สัà¸à¸à¸²à¸à¸™à¸¸à¸à¸²à¸•จาà¸à¸šà¸¸à¸„คลที่สาม" #: editor/editor_about.cpp -#, fuzzy msgid "" "Godot Engine relies on a number of third-party free and open source " "libraries, all compatible with the terms of its MIT license. The following " @@ -1229,8 +1155,8 @@ msgid "" "respective copyright statements and license terms." msgstr "" "Godot Engine à¸à¸²à¸¨à¸±à¸¢à¹„ลบรารีต่าง ๆ ที่นำมาใช้ได้à¸à¸¢à¹ˆà¸²à¸‡à¹€à¸ªà¸£à¸µà¹à¸¥à¸°à¹€à¸›à¸´à¸”เผยโค้ดเป็นจำนวนมาภ" -"ซึ่งเข้าà¸à¸±à¸™à¹„ด้à¸à¸±à¸šà¸ªà¸±à¸à¸à¸²à¸à¸™à¸¸à¸à¸²à¸• MIT ต่à¸à¹„ปนี้เป็นรายชื่à¸à¸‚à¸à¸‡à¹„ลบรารีทั้งหมด รวมถึงข้à¸à¸„วามลิขสิทธิ์ " -"à¹à¸¥à¸°à¸‚้à¸à¸à¸³à¸«à¸™à¸”à¸à¸²à¸£à¹ƒà¸Šà¹‰à¸‡à¸²à¸™à¸‚à¸à¸‡à¹à¸•่ละไลบรารี" +"ซึ่งเข้าà¸à¸±à¸™à¹„ด้à¸à¸±à¸šà¸ªà¸±à¸à¸à¸²à¸à¸™à¸¸à¸à¸²à¸• MIT ต่à¸à¹„ปนี้เป็นรายชื่à¸à¸‚à¸à¸‡à¹„ลบรารีทั้งหมดขà¸à¸‡à¸šà¸¸à¸„คลที่สาม " +"รวมถึงข้à¸à¸„วามลิขสิทธิ์ à¹à¸¥à¸°à¸‚้à¸à¸à¸³à¸«à¸™à¸”à¸à¸²à¸£à¹ƒà¸Šà¹‰à¸‡à¸²à¸™à¸‚à¸à¸‡à¹à¸•่ละไลบรารี" #: editor/editor_about.cpp msgid "All Components" @@ -1245,14 +1171,12 @@ msgid "Licenses" msgstr "สัà¸à¸à¸²à¸à¸™à¸¸à¸à¸²à¸•" #: editor/editor_asset_installer.cpp editor/project_manager.cpp -#, fuzzy msgid "Error opening package file, not in ZIP format." msgstr "ผิดพลาดขณะเปิดไฟล์à¹à¸žà¸„เà¸à¸ˆ, ไม่ใช่รูปà¹à¸šà¸š zip" #: editor/editor_asset_installer.cpp -#, fuzzy msgid "%s (Already Exists)" -msgstr "มีà¸à¸¢à¸¹à¹ˆà¸à¹ˆà¸à¸™à¹à¸¥à¹‰à¸§" +msgstr "%s (มีà¸à¸¢à¸¹à¹ˆà¸à¹ˆà¸à¸™à¹à¸¥à¹‰à¸§)" #: editor/editor_asset_installer.cpp msgid "Uncompressing Assets" @@ -1263,12 +1187,10 @@ msgid "The following files failed extraction from package:" msgstr "ผิดพลาดขณะà¹à¸¢à¸à¹„ฟล์ต่à¸à¹„ปนี้จาà¸à¹à¸žà¸„เà¸à¸ˆ:" #: editor/editor_asset_installer.cpp -#, fuzzy msgid "And %s more files." msgstr "à¹à¸¥à¸°à¸à¸µà¸ %d ไฟล์" #: editor/editor_asset_installer.cpp editor/project_manager.cpp -#, fuzzy msgid "Package installed successfully!" msgstr "ติดตั้งà¹à¸žà¸„เà¸à¸ˆà¹€à¸ªà¸£à¹‡à¸ˆà¸ªà¸¡à¸šà¸¹à¸£à¸“์!" @@ -1278,9 +1200,8 @@ msgid "Success!" msgstr "สำเร็จ!" #: editor/editor_asset_installer.cpp -#, fuzzy msgid "Package Contents:" -msgstr "ประà¸à¸à¸šà¸”้วย:" +msgstr "เนื้à¸à¸«à¸²à¹à¸žà¸„เà¸à¸ˆ:" #: editor/editor_asset_installer.cpp editor/editor_node.cpp msgid "Install" @@ -1296,7 +1217,7 @@ msgstr "ลำโพง" #: editor/editor_audio_buses.cpp msgid "Add Effect" -msgstr "เà¸à¸Ÿà¹€à¸Ÿà¸à¸•์" +msgstr "เพิ่มเà¸à¸Ÿà¹€à¸Ÿà¸à¸•์" #: editor/editor_audio_buses.cpp msgid "Rename Audio Bus" @@ -1324,20 +1245,19 @@ msgstr "เลืà¸à¸ Audio Bus ที่ส่งต่à¸" #: editor/editor_audio_buses.cpp msgid "Add Audio Bus Effect" -msgstr "เพิ่มเà¸à¸Ÿà¹€à¸Ÿà¸à¸•์เสียง" +msgstr "เพิ่มเà¸à¸Ÿà¹€à¸Ÿà¸à¸•์บัสเสียง" #: editor/editor_audio_buses.cpp msgid "Move Bus Effect" -msgstr "ย้ายเà¸à¸Ÿà¹€à¸Ÿà¸à¸•์เสียง" +msgstr "ย้ายเà¸à¸Ÿà¹€à¸Ÿà¸à¸•์บัสเสียง" #: editor/editor_audio_buses.cpp msgid "Delete Bus Effect" -msgstr "ลบเà¸à¸Ÿà¹€à¸Ÿà¸à¸•์เสียง" +msgstr "ลบเà¸à¸Ÿà¹€à¸Ÿà¸à¸•์บัสเสียง" #: editor/editor_audio_buses.cpp -#, fuzzy msgid "Drag & drop to rearrange." -msgstr "Audio Bus ลาà¸à¹à¸¥à¸°à¸§à¸²à¸‡à¹€à¸žà¸·à¹ˆà¸à¸¢à¹‰à¸²à¸¢à¸•ำà¹à¸«à¸™à¹ˆà¸‡" +msgstr "ลาà¸à¹à¸¥à¸°à¸§à¸²à¸‡à¹€à¸žà¸·à¹ˆà¸à¸ˆà¸±à¸”เรียง" #: editor/editor_audio_buses.cpp msgid "Solo" @@ -1378,15 +1298,15 @@ msgstr "เพิ่ม Audio Bus" #: editor/editor_audio_buses.cpp msgid "Master bus can't be deleted!" -msgstr "ลบ Bus หลัà¸à¹„ม่ได้!" +msgstr "ลบบัสหลัà¸à¹„ม่ได้!" #: editor/editor_audio_buses.cpp msgid "Delete Audio Bus" -msgstr "ลบ Audio Bus" +msgstr "ลบบัสเสียง" #: editor/editor_audio_buses.cpp msgid "Duplicate Audio Bus" -msgstr "ทำซ้ำ Audio Bus" +msgstr "ทำซ้ำบัสเสียง" #: editor/editor_audio_buses.cpp msgid "Reset Bus Volume" @@ -1394,11 +1314,11 @@ msgstr "รีเซ็ตระดับเสียงบัส" #: editor/editor_audio_buses.cpp msgid "Move Audio Bus" -msgstr "ย้าย Audio Bus" +msgstr "ย้ายบัสเสียง" #: editor/editor_audio_buses.cpp msgid "Save Audio Bus Layout As..." -msgstr "บันทึà¸à¹€à¸¥à¸¢à¹Œà¹€à¸à¸²à¸•์ขà¸à¸‡ Audio Bus เป็น..." +msgstr "บันทึà¸à¹€à¸¥à¸¢à¹Œà¹€à¸à¸²à¸•์ขà¸à¸‡à¸šà¸±à¸ªà¹€à¸ªà¸µà¸¢à¸‡à¹€à¸›à¹‡à¸™..." #: editor/editor_audio_buses.cpp msgid "Location for New Layout..." @@ -1406,11 +1326,11 @@ msgstr "ตำà¹à¸«à¸™à¹ˆà¸‡à¸‚à¸à¸‡à¹€à¸¥à¸¢à¹Œà¹€à¸à¸²à¸•์ใหม่... #: editor/editor_audio_buses.cpp msgid "Open Audio Bus Layout" -msgstr "เปิดเลย์เà¸à¸²à¸•์ขà¸à¸‡ Audio Bus" +msgstr "เปิดเลย์เà¸à¸²à¸•์ขà¸à¸‡à¸šà¸±à¸ªà¹€à¸ªà¸µà¸¢à¸‡" #: editor/editor_audio_buses.cpp msgid "There is no '%s' file." -msgstr "" +msgstr "ไม่มีไฟล์ '%s'" #: editor/editor_audio_buses.cpp editor/plugins/canvas_item_editor_plugin.cpp msgid "Layout" @@ -1421,18 +1341,16 @@ msgid "Invalid file, not an audio bus layout." msgstr "ไฟล์ไม่ถูà¸à¸•้à¸à¸‡ ไม่ใช่เลย์เà¸à¸²à¸•์ขà¸à¸‡ Audio Bus" #: editor/editor_audio_buses.cpp -#, fuzzy msgid "Error saving file: %s" -msgstr "ผิดพลาดขณะบันทึภTileSet!" +msgstr "ผิดพลาดขณะบันทึà¸à¹„ฟล์: %s" #: editor/editor_audio_buses.cpp msgid "Add Bus" -msgstr "เพิ่ม Bus" +msgstr "เพิ่มบัส" #: editor/editor_audio_buses.cpp -#, fuzzy msgid "Add a new Audio Bus to this layout." -msgstr "บันทึà¸à¹€à¸¥à¸¢à¹Œà¹€à¸à¸²à¸•์ขà¸à¸‡ Audio Bus เป็น..." +msgstr "เพิ่มบัสเสียงไปยังเลย์เà¸à¸²à¸•์นี้" #: editor/editor_audio_buses.cpp editor/editor_properties.cpp #: editor/plugins/animation_player_editor_plugin.cpp editor/property_editor.cpp @@ -1442,7 +1360,7 @@ msgstr "โหลด" #: editor/editor_audio_buses.cpp msgid "Load an existing Bus Layout." -msgstr "โหลดเลย์เà¸à¸²à¸•์ Bus จาà¸à¸”ิสà¸à¹Œ" +msgstr "โหลดเลย์เà¸à¸²à¸•์บัสจาà¸à¸”ิสà¸à¹Œ" #: editor/editor_audio_buses.cpp msgid "Save As" @@ -1450,7 +1368,7 @@ msgstr "บันทึà¸à¹€à¸›à¹‡à¸™" #: editor/editor_audio_buses.cpp msgid "Save this Bus Layout to a file." -msgstr "บันทึà¸à¹€à¸¥à¸¢à¹Œà¹€à¸à¸²à¸•์ขà¸à¸‡ Bus นี้เป็นไฟล์" +msgstr "บันทึà¸à¹€à¸¥à¸¢à¹Œà¹€à¸à¸²à¸•์ขà¸à¸‡à¸šà¸±à¸ªà¸™à¸µà¹‰à¹€à¸›à¹‡à¸™à¹„ฟล์" #: editor/editor_audio_buses.cpp editor/import_dock.cpp msgid "Load Default" @@ -1458,11 +1376,11 @@ msgstr "โหลดค่าเริ่มต้น" #: editor/editor_audio_buses.cpp msgid "Load the default Bus Layout." -msgstr "โหลดค่าเริ่มต้นเลย์เà¸à¸²à¸•์ Bus" +msgstr "โหลดค่าเริ่มต้นเลย์เà¸à¸²à¸•์บัส" #: editor/editor_audio_buses.cpp msgid "Create a new Bus Layout." -msgstr "สร้างเลย์เà¸à¸²à¸•์ Bus ใหม่" +msgstr "สร้างเลย์เà¸à¸²à¸•์บัสใหม่" #: editor/editor_autoload_settings.cpp msgid "Invalid name." @@ -1473,19 +1391,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." @@ -1511,7 +1426,7 @@ msgstr "เลื่à¸à¸™à¸à¸à¹‚ต้โหลด" msgid "Remove Autoload" msgstr "ลบà¸à¸à¹‚ต้โหลด" -#: editor/editor_autoload_settings.cpp +#: editor/editor_autoload_settings.cpp editor/editor_plugin_settings.cpp msgid "Enable" msgstr "เปิด" @@ -1520,7 +1435,6 @@ msgid "Rearrange Autoloads" msgstr "จัดลำดับà¸à¸à¹‚ต้โหลด" #: editor/editor_autoload_settings.cpp editor/script_create_dialog.cpp -#, fuzzy msgid "Invalid path." msgstr "ตำà¹à¸«à¸™à¹ˆà¸‡à¸œà¸´à¸”พลาด" @@ -1582,7 +1496,6 @@ msgid "[unsaved]" msgstr "[ไฟล์ใหม่]" #: editor/editor_dir_dialog.cpp -#, fuzzy msgid "Please select a base directory first." msgstr "à¸à¸£à¸¸à¸“าเลืà¸à¸à¹‚ฟลเดà¸à¸£à¹Œà¹€à¸£à¸´à¹ˆà¸¡à¸•้นà¸à¹ˆà¸à¸™" @@ -1617,11 +1530,8 @@ msgid "Storing File:" msgstr "เà¸à¹‡à¸šà¹„ฟล์:" #: editor/editor_export.cpp -#, fuzzy msgid "No export template found at the expected path:" -msgstr "" -"ไม่มีà¹à¸¡à¹ˆà¹à¸šà¸šà¸ªà¸³à¸«à¸£à¸±à¸šà¸ªà¹ˆà¸‡à¸à¸à¸\n" -"ดาวน์โหลดà¹à¸¥à¸°à¸•ิดตั้งà¹à¸¡à¹ˆà¹à¸šà¸š" +msgstr "ไม่พบà¹à¸¡à¹ˆà¹à¸šà¸šà¸ªà¹ˆà¸‡à¸à¸à¸à¸—ี่ที่à¸à¸¢à¸¹à¹ˆà¸—ี่คาดไว้:" #: editor/editor_export.cpp msgid "Packing" @@ -1632,12 +1542,16 @@ msgid "" "Target platform requires 'ETC' texture compression for GLES2. Enable 'Import " "Etc' in Project Settings." msgstr "" +"à¹à¸žà¸¥à¸•ฟà¸à¸£à¹Œà¸¡à¹€à¸›à¹‰à¸²à¸«à¸¡à¸²à¸¢à¸•้à¸à¸‡à¸à¸²à¸£à¸à¸²à¸£à¸šà¸µà¸šà¸à¸±à¸”เทà¸à¹€à¸ˆà¸à¸£à¹Œ 'ETC' สำหรับ GLES2 เปิด 'Import Etc' " +"ในตั้งค่าโปรเจ็ค" #: editor/editor_export.cpp msgid "" "Target platform requires 'ETC2' texture compression for GLES3. Enable " "'Import Etc 2' in Project Settings." msgstr "" +"à¹à¸žà¸¥à¸•ฟà¸à¸£à¹Œà¸¡à¹€à¸›à¹‰à¸²à¸«à¸¡à¸²à¸¢à¸•้à¸à¸‡à¸à¸²à¸£à¸à¸²à¸£à¸šà¸µà¸šà¸à¸±à¸”เทà¸à¹€à¸ˆà¸à¸£à¹Œ 'ETC2' สำหรับ GLES3 เปิด 'Import Etc 2' " +"ในตั้งค่าโปรเจ็ค" #: editor/editor_export.cpp msgid "" @@ -1646,13 +1560,14 @@ msgid "" "Enable 'Import Etc' in Project Settings, or disable 'Driver Fallback " "Enabled'." msgstr "" +"à¹à¸žà¸¥à¸•ฟà¸à¸£à¹Œà¸¡à¹€à¸›à¹‰à¸²à¸«à¸¡à¸²à¸¢à¸•้à¸à¸‡à¸à¸²à¸£à¸à¸²à¸£à¸šà¸µà¸šà¸à¸±à¸”เทà¸à¹€à¸ˆà¸à¸£à¹Œ 'ETC' สำหรับà¸à¸²à¸£à¸à¸¥à¸±à¸šà¸¡à¸²à¹ƒà¸Šà¹‰ GLES2\n" +"เปิด 'Import Etc' ในตั้งค่าโปรเจ็คหรืà¸à¸›à¸´à¸” 'Driver Fallback Enabled'" #: editor/editor_export.cpp platform/android/export/export.cpp #: platform/iphone/export/export.cpp platform/javascript/export/export.cpp #: platform/osx/export/export.cpp platform/uwp/export/export.cpp -#, fuzzy msgid "Custom debug template not found." -msgstr "ไม่พบà¹à¸žà¸„เà¸à¸ˆà¸”ีบัคที่à¸à¸³à¸«à¸™à¸”" +msgstr "ไม่พบà¹à¸¡à¹ˆà¹à¸šà¸šà¸à¸²à¸£à¸”ีบัà¸à¹à¸šà¸šà¸à¸³à¸«à¸™à¸”เà¸à¸‡" #: editor/editor_export.cpp platform/android/export/export.cpp #: platform/iphone/export/export.cpp platform/javascript/export/export.cpp @@ -1663,31 +1578,27 @@ msgstr "ไม่พบà¹à¸žà¸„เà¸à¸ˆà¸ˆà¸³à¸«à¸™à¹ˆà¸²à¸¢à¸—ี่à¸à¸³à¸« #: editor/editor_export.cpp platform/javascript/export/export.cpp msgid "Template file not found:" -msgstr "ไม่พบà¹à¸¡à¹ˆà¹à¸šà¸š:" +msgstr "ไม่พบไฟล์à¹à¸¡à¹ˆà¹à¸šà¸š:" #: editor/editor_export.cpp msgid "On 32-bit exports the embedded PCK cannot be bigger than 4 GiB." -msgstr "" +msgstr "à¸à¸²à¸£à¸ªà¹ˆà¸‡à¸à¸à¸à¹à¸šà¸š 32 bit PCK à¹à¸šà¸šà¸à¸±à¸‡à¸•ัวไม่สามารถใหà¸à¹ˆà¹„ด้เà¸à¸´à¸™ 4 GiB" #: editor/editor_feature_profile.cpp -#, fuzzy msgid "3D Editor" -msgstr "โปรà¹à¸à¸£à¸¡" +msgstr "เà¸à¸”ิเตà¸à¸£à¹Œ 3D" #: editor/editor_feature_profile.cpp -#, fuzzy msgid "Script Editor" -msgstr "เปิดตัวà¹à¸à¹‰à¹„ขสคริปต์" +msgstr "เà¸à¸”ิเตà¸à¸£à¹Œà¸ªà¸„ริปต์" #: editor/editor_feature_profile.cpp -#, fuzzy msgid "Asset Library" -msgstr "เปิดà¹à¸«à¸¥à¹ˆà¸‡à¸£à¸§à¸¡à¸—รัพยาà¸à¸£" +msgstr "ไลบรารีทรัพยาà¸à¸£" #: editor/editor_feature_profile.cpp -#, fuzzy msgid "Scene Tree Editing" -msgstr "ผังฉาภ(โหนด):" +msgstr "à¹à¸à¹‰à¹„ขผังฉาà¸" #: editor/editor_feature_profile.cpp #, fuzzy @@ -1705,92 +1616,80 @@ msgid "FileSystem and Import Docks" msgstr "ระบบไฟล์" #: editor/editor_feature_profile.cpp -#, fuzzy msgid "Erase profile '%s'? (no undo)" -msgstr "à¹à¸—นที่ทั้งหมด" +msgstr "ลบโปรไฟล์ '%s' หรืà¸à¹„ม่? (ทำà¸à¸¥à¸±à¸šà¹„ม่ได้)" #: editor/editor_feature_profile.cpp msgid "Profile must be a valid filename and must not contain '.'" -msgstr "" +msgstr "โปรไฟล์จะต้à¸à¸‡à¸¡à¸µà¸Šà¸·à¹ˆà¸à¹„ฟล์ที่ถูà¸à¸•้à¸à¸‡ à¹à¸¥à¸°à¸•้à¸à¸‡à¹„ม่มี '.'" #: editor/editor_feature_profile.cpp -#, fuzzy msgid "Profile with this name already exists." -msgstr "มีชื่à¸à¸à¸¥à¸¸à¹ˆà¸¡à¸™à¸µà¹‰à¸à¸¢à¸¹à¹ˆà¹à¸¥à¹‰à¸§" +msgstr "มีโปรไฟล์ที่มีชื่à¸à¸™à¸µà¹‰à¸à¸¢à¸¹à¹‹à¹à¸¥à¹‰à¸§" #: editor/editor_feature_profile.cpp msgid "(Editor Disabled, Properties Disabled)" -msgstr "" +msgstr "(เà¸à¸”ิเตà¸à¸£à¹Œà¸–ูà¸à¸›à¸´à¸”à¸à¸²à¸£à¹ƒà¸Šà¹‰à¸‡à¸²à¸™, คุณสมบัติถูà¸à¸›à¸´à¸”à¸à¸²à¸£à¹ƒà¸Šà¹‰à¸‡à¸²à¸™)" #: editor/editor_feature_profile.cpp -#, fuzzy msgid "(Properties Disabled)" -msgstr "คุณสมบัติ" +msgstr "(ปิดà¸à¸²à¸£à¸—ำงานคุณสมบัติ)" #: editor/editor_feature_profile.cpp -#, fuzzy msgid "(Editor Disabled)" -msgstr "ปิดà¸à¸²à¸£à¸•ัด" +msgstr "(เà¸à¸”ิเตà¸à¸£à¹Œà¸–ูà¸à¸›à¸´à¸”à¸à¸²à¸£à¹ƒà¸Šà¹‰à¸‡à¸²à¸™)" #: editor/editor_feature_profile.cpp -#, fuzzy msgid "Class Options:" -msgstr "รายละเà¸à¸µà¸¢à¸”:" +msgstr "ตั้งค่าคลาส:" #: editor/editor_feature_profile.cpp -#, fuzzy msgid "Enable Contextual Editor" -msgstr "เปิดตัวà¹à¸à¹‰à¹„ขถัดไป" +msgstr "เปิดà¸à¸²à¸£à¸—ำงานเà¸à¸”ิเตà¸à¸£à¹Œà¸•ามบริบท" #: editor/editor_feature_profile.cpp -#, fuzzy msgid "Enabled Properties:" -msgstr "คุณสมบัติ:" +msgstr "เปิดà¸à¸²à¸£à¸—ำงานคุณสมบัติ:" #: editor/editor_feature_profile.cpp -#, fuzzy msgid "Enabled Features:" -msgstr "ฟีเจà¸à¸£à¹Œ" +msgstr "เปิดà¸à¸²à¸£à¸—ำงานฟีเจà¸à¸£à¹Œ:" #: editor/editor_feature_profile.cpp -#, fuzzy msgid "Enabled Classes:" -msgstr "ค้นหาคลาส" +msgstr "เปิดà¸à¸²à¸£à¸—ำงานคลาส:" #: editor/editor_feature_profile.cpp msgid "File '%s' format is invalid, import aborted." -msgstr "" +msgstr "นามสà¸à¸¸à¸¥à¸‚à¸à¸‡à¹„ฟล์ '%s' ผิดพลาด ยà¸à¹€à¸¥à¸´à¸à¸à¸²à¸£à¸™à¸³à¹€à¸‚้า" #: editor/editor_feature_profile.cpp msgid "" "Profile '%s' already exists. Remove it first before importing, import " "aborted." -msgstr "" +msgstr "มีโปรไฟล์ '%s' à¸à¸¢à¸¹à¹ˆà¹à¸¥à¹‰à¸§ à¸à¸£à¸¸à¸“าลบà¸à¹ˆà¸à¸™à¸—ี่จะนำเข้า, à¸à¸²à¸£à¸™à¸³à¹€à¸‚้าถูà¸à¸¢à¸à¹€à¸¥à¸´à¸" #: editor/editor_feature_profile.cpp -#, fuzzy msgid "Error saving profile to path: '%s'." -msgstr "ผิดพลาดขณะโหลดà¹à¸¡à¹ˆà¹à¸šà¸š '%s'" +msgstr "ผิดพลาดขณะบันทึà¸à¹‚ปรไฟล์ไปยังà¹à¸žà¸—ช์: '%s'" #: editor/editor_feature_profile.cpp msgid "Unset" -msgstr "" +msgstr "ยà¸à¹€à¸¥à¸´à¸à¸à¸²à¸£à¸•ั้งค่า" #: editor/editor_feature_profile.cpp -#, fuzzy msgid "Current Profile:" -msgstr "รุ่นปัจจุบัน:" +msgstr "โปรไฟล์ปัจจุบัน:" #: editor/editor_feature_profile.cpp -#, fuzzy msgid "Make Current" -msgstr "ปัจจุบัน:" +msgstr "ทำให้เป็นปัจจุบัน" #: editor/editor_feature_profile.cpp #: editor/plugins/animation_player_editor_plugin.cpp #: editor/plugins/version_control_editor_plugin.cpp msgid "New" -msgstr "ไฟล์ใหม่" +msgstr "ใหม่" #: editor/editor_feature_profile.cpp editor/editor_node.cpp #: editor/project_manager.cpp @@ -1802,44 +1701,36 @@ msgid "Export" msgstr "ส่งà¸à¸à¸" #: editor/editor_feature_profile.cpp -#, fuzzy msgid "Available Profiles:" -msgstr "โหนดที่มีให้ใช้:" +msgstr "โปรไฟล์ที่มีให้ใช้:" #: editor/editor_feature_profile.cpp -#, fuzzy msgid "Class Options" -msgstr "รายละเà¸à¸µà¸¢à¸”" +msgstr "ตั้งค่าคลาส" #: editor/editor_feature_profile.cpp -#, fuzzy msgid "New profile name:" -msgstr "ชื่à¸à¹ƒà¸«à¸¡à¹ˆ:" +msgstr "ชื่à¸à¹‚ปรไฟล์ใหม่:" #: editor/editor_feature_profile.cpp -#, fuzzy msgid "Erase Profile" -msgstr "ลบพื้นที่" +msgstr "ลบโปรไฟล์" #: editor/editor_feature_profile.cpp -#, fuzzy msgid "Godot Feature Profile" -msgstr "จัดà¸à¸²à¸£à¹à¸¡à¹ˆà¹à¸šà¸šà¸ªà¹ˆà¸‡à¸à¸à¸" +msgstr "รายละเà¸à¸µà¸¢à¸”คุณสมบัติ Godot" #: editor/editor_feature_profile.cpp -#, fuzzy msgid "Import Profile(s)" -msgstr "นำเข้าโปรเจà¸à¸•์à¹à¸¥à¹‰à¸§" +msgstr "นำเข้าโปรไฟล์" #: editor/editor_feature_profile.cpp -#, fuzzy msgid "Export Profile" -msgstr "ส่งà¸à¸à¸à¹‚ปรเจà¸à¸•์" +msgstr "ส่งà¸à¸à¸à¹‚ปรไฟล์" #: editor/editor_feature_profile.cpp -#, fuzzy msgid "Manage Editor Feature Profiles" -msgstr "จัดà¸à¸²à¸£à¹à¸¡à¹ˆà¹à¸šà¸šà¸ªà¹ˆà¸‡à¸à¸à¸" +msgstr "จัดà¸à¸²à¸£à¸£à¸²à¸¢à¸¥à¸°à¹€à¸à¸µà¸¢à¸”คุณสมบัติเà¸à¸”ิเตà¸à¸£à¹Œ" #: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp msgid "Select Current Folder" @@ -1850,7 +1741,6 @@ msgid "File Exists, Overwrite?" msgstr "มีไฟล์นี้à¸à¸¢à¸¹à¹ˆà¹à¸¥à¹‰à¸§ จะเขียนทับหรืà¸à¹„ม่?" #: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp -#, fuzzy msgid "Select This Folder" msgstr "เลืà¸à¸à¹‚ฟลเดà¸à¸£à¹Œà¸™à¸µà¹‰" @@ -1859,13 +1749,11 @@ msgid "Copy Path" msgstr "คัดลà¸à¸à¸•ำà¹à¸«à¸™à¹ˆà¸‡" #: editor/editor_file_dialog.cpp editor/filesystem_dock.cpp -#, fuzzy msgid "Open in File Manager" -msgstr "à¹à¸ªà¸”งในตัวจัดà¸à¸²à¸£à¹„ฟล์" +msgstr "เปิดโฟลเดà¸à¸£à¹Œ" #: editor/editor_file_dialog.cpp editor/editor_node.cpp #: editor/filesystem_dock.cpp editor/project_manager.cpp -#, fuzzy msgid "Show in File Manager" msgstr "à¹à¸ªà¸”งในตัวจัดà¸à¸²à¸£à¹„ฟล์" @@ -1950,44 +1838,36 @@ msgid "Move Favorite Down" msgstr "เลื่à¸à¸™à¹‚ฟลเดà¸à¸£à¹Œà¸—ี่ชà¸à¸šà¸¥à¸‡" #: editor/editor_file_dialog.cpp -#, fuzzy msgid "Go to previous folder." -msgstr "ไปยังโฟลเดà¸à¸£à¹Œà¸«à¸¥à¸±à¸" +msgstr "ไปยังโฟลเดà¸à¸£à¹Œà¸à¹ˆà¸à¸™à¸«à¸™à¹‰à¸²" #: editor/editor_file_dialog.cpp -#, fuzzy msgid "Go to next folder." -msgstr "ไปยังโฟลเดà¸à¸£à¹Œà¸«à¸¥à¸±à¸" +msgstr "ไปยังโฟลเดà¸à¸£à¹Œà¸–ัดไป" #: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp -#, fuzzy msgid "Go to parent folder." msgstr "ไปยังโฟลเดà¸à¸£à¹Œà¸«à¸¥à¸±à¸" #: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp -#, fuzzy msgid "Refresh files." -msgstr "ค้นหาคลาส" +msgstr "รีเฟรชไฟล์" #: editor/editor_file_dialog.cpp -#, fuzzy msgid "(Un)favorite current folder." -msgstr "ไม่สามารถสร้างโฟลเดà¸à¸£à¹Œ" +msgstr "เพิ่ม/ลบโฟลเดà¸à¸£à¹Œà¸›à¸±à¸ˆà¸ˆà¸¸à¸šà¸±à¸™à¹„ปยังที่ชื่นชà¸à¸š" #: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp -#, fuzzy msgid "Toggle the visibility of hidden files." -msgstr "เปิด/ปิดไฟล์ที่ซ่à¸à¸™" +msgstr "เปิด/ปิดà¸à¸²à¸£à¹à¸ªà¸”งไฟล์ที่ซ่à¸à¸™" #: editor/editor_file_dialog.cpp editor/filesystem_dock.cpp -#, fuzzy msgid "View items as a grid of thumbnails." -msgstr "à¹à¸ªà¸”งเป็นภาพตัวà¸à¸¢à¹ˆà¸²à¸‡" +msgstr "à¹à¸ªà¸”งไà¸à¹€à¸—มในรูปà¹à¸šà¸šà¸•าราง" #: editor/editor_file_dialog.cpp editor/filesystem_dock.cpp -#, fuzzy msgid "View items as a list." -msgstr "à¹à¸ªà¸”งเป็นรายชื่à¸à¹„ฟล์" +msgstr "à¹à¸ªà¸”งไà¸à¹€à¸—มในรูปà¹à¸šà¸šà¸¥à¸´à¸ªà¸•์รายชื่à¸" #: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp msgid "Directories & Files:" @@ -2015,7 +1895,7 @@ msgstr "สà¹à¸à¸™à¸•้นฉบับ" msgid "" "There are multiple importers for different types pointing to file %s, import " "aborted" -msgstr "" +msgstr "มีà¸à¸²à¸£à¸™à¸³à¹€à¸‚้าไฟล์ %s หลายà¸à¸±à¸™ à¸à¸²à¸£à¸™à¸³à¹€à¸‚้าถูà¸à¸¢à¸à¹€à¸¥à¸´à¸" #: editor/editor_file_system.cpp msgid "(Re)Importing Assets" @@ -2039,55 +1919,48 @@ msgid "Inherited by:" msgstr "สืบทà¸à¸”โดย:" #: editor/editor_help.cpp -#, fuzzy msgid "Description" -msgstr "รายละเà¸à¸µà¸¢à¸”:" +msgstr "รายละเà¸à¸µà¸¢à¸”" #: editor/editor_help.cpp -#, fuzzy msgid "Online Tutorials" -msgstr "สà¸à¸™à¹ƒà¸Šà¹‰à¸‡à¸²à¸™à¸à¸à¸™à¹„ลน์:" +msgstr "บทสà¸à¸™à¸à¸à¸™à¹„ลน์" #: editor/editor_help.cpp msgid "Properties" msgstr "คุณสมบัติ" #: editor/editor_help.cpp -#, fuzzy msgid "override:" -msgstr "à¸à¸³à¸«à¸™à¸”เฉพาะ..." +msgstr "à¹à¸—นที่:" #: editor/editor_help.cpp -#, fuzzy msgid "default:" -msgstr "ค่าเริ่มต้น" +msgstr "ค่าเริ่มต้น:" #: editor/editor_help.cpp msgid "Methods" msgstr "รายชื่à¸à¹€à¸¡à¸—็à¸à¸”" #: editor/editor_help.cpp -#, fuzzy msgid "Theme Properties" -msgstr "คุณสมบัติ" +msgstr "คุณสมบัติธีม" #: editor/editor_help.cpp msgid "Enumerations" -msgstr "ค่าคงที่" +msgstr "à¸à¸µà¸™à¸±à¸¡" #: editor/editor_help.cpp msgid "Constants" msgstr "ค่าคงที่" #: editor/editor_help.cpp -#, fuzzy msgid "Property Descriptions" -msgstr "รายละเà¸à¸µà¸¢à¸”ตัวà¹à¸›à¸£:" +msgstr "รายละเà¸à¸µà¸¢à¸”ขà¸à¸‡à¸„ุณสมบัติ" #: editor/editor_help.cpp -#, fuzzy msgid "(value)" -msgstr "ค่า" +msgstr "(ค่า)" #: editor/editor_help.cpp msgid "" @@ -2096,9 +1969,8 @@ msgid "" msgstr "คุณสมบัตินี้ยังไม่มีคำà¸à¸˜à¸´à¸šà¸²à¸¢ โปรดช่วย[color=$color][url=$url]à¹à¸à¹‰à¹„ข[/url][/color]!" #: editor/editor_help.cpp -#, fuzzy msgid "Method Descriptions" -msgstr "รายละเà¸à¸µà¸¢à¸”เมท็à¸à¸”:" +msgstr "รายละเà¸à¸µà¸¢à¸”เมท็à¸à¸”" #: editor/editor_help.cpp msgid "" @@ -2116,62 +1988,50 @@ msgid "Case Sensitive" msgstr "ตรงตามà¸à¸±à¸à¸©à¸£à¸žà¸´à¸¡à¸žà¹Œà¹€à¸¥à¹‡à¸-ใหà¸à¹ˆ" #: editor/editor_help_search.cpp -#, fuzzy msgid "Show Hierarchy" -msgstr "à¹à¸ªà¸”งตัวช่วย" +msgstr "à¹à¸ªà¸”งลำดับชั้น" #: editor/editor_help_search.cpp -#, fuzzy msgid "Display All" -msgstr "à¹à¸ªà¸”งปà¸à¸•ิ" +msgstr "à¹à¸ªà¸”งทั้งหมด" #: editor/editor_help_search.cpp -#, fuzzy msgid "Classes Only" -msgstr "คลาส" +msgstr "คลาสเท่านั้น" #: editor/editor_help_search.cpp -#, fuzzy msgid "Methods Only" -msgstr "รายชื่à¸à¹€à¸¡à¸—็à¸à¸”" +msgstr "เมท็à¸à¸”เท่านั้น" #: editor/editor_help_search.cpp -#, fuzzy msgid "Signals Only" -msgstr "สัà¸à¸à¸²à¸“" +msgstr "สัà¸à¸à¸²à¸“เท่านั้น" #: editor/editor_help_search.cpp -#, fuzzy msgid "Constants Only" -msgstr "ค่าคงที่" +msgstr "ค่าคงที่เท่านั้น" #: editor/editor_help_search.cpp -#, fuzzy msgid "Properties Only" -msgstr "คุณสมบัติ" +msgstr "คุณสมบัติเท่านั้น" #: editor/editor_help_search.cpp -#, fuzzy msgid "Theme Properties Only" -msgstr "คุณสมบัติ" +msgstr "คุณสมบัติธีมเท่านั้น" #: editor/editor_help_search.cpp -#, fuzzy msgid "Member Type" -msgstr "ตัวà¹à¸›à¸£" +msgstr "ชนิดสมาชิà¸" #: editor/editor_help_search.cpp -#, fuzzy msgid "Class" -msgstr "คลาส:" +msgstr "คลาส" #: editor/editor_help_search.cpp -#, fuzzy msgid "Method" -msgstr "รายชื่à¸à¹€à¸¡à¸—็à¸à¸”" +msgstr "เมธà¸à¸”" #: editor/editor_help_search.cpp editor/plugins/script_text_editor.cpp -#, fuzzy msgid "Signal" msgstr "สัà¸à¸à¸²à¸“" @@ -2180,14 +2040,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:" @@ -2203,12 +2061,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 @@ -2218,7 +2075,7 @@ msgstr "ลบที่เลืà¸à¸" #: modules/gdnative/gdnative_library_editor_plugin.cpp scene/gui/line_edit.cpp #: scene/gui/text_edit.cpp msgid "Clear" -msgstr "ลบ" +msgstr "เคลียร์" #: editor/editor_log.cpp msgid "Clear Output" @@ -2231,13 +2088,12 @@ msgstr "หยุด" #: editor/editor_network_profiler.cpp editor/editor_profiler.cpp #: editor/plugins/animation_state_machine_editor.cpp editor/rename_dialog.cpp -#, fuzzy msgid "Start" -msgstr "เริ่ม!" +msgstr "เริ่ม" #: editor/editor_network_profiler.cpp msgid "%s/s" -msgstr "" +msgstr "%s/s" #: editor/editor_network_profiler.cpp msgid "Down" @@ -2268,13 +2124,12 @@ msgid "Outgoing RSET" msgstr "" #: editor/editor_node.cpp editor/project_manager.cpp -#, fuzzy msgid "New Window" -msgstr "หน้าต่าง" +msgstr "หน้าต่างใหม่" #: editor/editor_node.cpp msgid "Imported resources can't be saved." -msgstr "" +msgstr "ทรัพยาà¸à¸£à¸—ี่นำเข้ามา ไม่สามารถบันทึà¸à¹„ด้" #: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp #: scene/gui/dialogs.cpp @@ -2283,7 +2138,7 @@ msgstr "ตà¸à¸¥à¸‡" #: editor/editor_node.cpp editor/plugins/animation_player_editor_plugin.cpp msgid "Error saving resource!" -msgstr "บันทึà¸à¸£à¸µà¸‹à¸à¸£à¹Œà¸ªà¸œà¸´à¸”พลาด!" +msgstr "บันทึà¸à¸—รัพยาà¸à¸£à¸œà¸´à¸”พลาด!" #: editor/editor_node.cpp msgid "" @@ -2301,7 +2156,7 @@ msgstr "เปิดไฟล์เพื่à¸à¹€à¸‚ียนไม่ได้ #: editor/editor_node.cpp msgid "Requested file format unknown:" -msgstr "ไม่ทราบรูปà¹à¸šà¸šà¹„ฟล์ที่ร้à¸à¸‡à¸‚à¸:" +msgstr "ไม่ทราบนามสà¸à¸¸à¸¥à¹„ฟล์ที่ร้à¸à¸‡à¸‚à¸:" #: editor/editor_node.cpp msgid "Error while saving." @@ -2309,7 +2164,7 @@ msgstr "ผิดพลาดขณะบันทึà¸" #: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp msgid "Can't open '%s'. The file could have been moved or deleted." -msgstr "" +msgstr "ไม่สามารถเปิด '%s' เนื่à¸à¸‡à¸ˆà¸²à¸à¹„ฟล์ถูà¸à¸¢à¹‰à¸²à¸¢à¸«à¸£à¸·à¸à¸–ูà¸à¸¥à¸š" #: editor/editor_node.cpp msgid "Error while parsing '%s'." @@ -2357,23 +2212,23 @@ msgstr "บันทึà¸à¸‰à¸²à¸à¹„ม่ได้ à¸à¸²à¸ˆà¸ˆà¸°à¸¡à¸µà¸à¸ #: editor/editor_node.cpp editor/scene_tree_dock.cpp msgid "Can't overwrite scene that is still open!" -msgstr "" +msgstr "ไม่สามารถเขียนทับฉาà¸à¸—ี่à¸à¸³à¸¥à¸±à¸‡à¹€à¸›à¸´à¸”à¸à¸¢à¸¹à¹ˆà¹„ด้!" #: editor/editor_node.cpp msgid "Can't load MeshLibrary for merging!" -msgstr "โหลด MeshLibrary เพื่à¸à¸£à¸§à¸¡à¹„ม่ได้!" +msgstr "ไม่สามารถโหลดไลบรารี Mesh เพื่à¸à¸„วบรวม!" #: editor/editor_node.cpp msgid "Error saving MeshLibrary!" -msgstr "ผิดพลาดขณะบันทึภMeshLibrary!" +msgstr "ผิดพลาดขณะบันทึà¸à¹„ลบรารี Mesh!" #: editor/editor_node.cpp msgid "Can't load TileSet for merging!" -msgstr "โหลด TileSet เพื่à¸à¸£à¸§à¸¡à¹„ม่ได้!" +msgstr "โหลดไทล์เซตเพื่à¸à¸£à¸§à¸¡à¹„ม่ได้!" #: editor/editor_node.cpp msgid "Error saving TileSet!" -msgstr "ผิดพลาดขณะบันทึภTileSet!" +msgstr "ผิดพลาดขณะบันทึà¸à¹„ทล์เซต!" #: editor/editor_node.cpp msgid "Error trying to save layout!" @@ -2401,13 +2256,12 @@ msgstr "" "à¸à¹ˆà¸²à¸™à¸£à¸²à¸¢à¸¥à¸°à¹€à¸à¸µà¸¢à¸”เพิ่มเติมได้จาà¸à¸„ู่มืà¸à¹ƒà¸™à¸ªà¹ˆà¸§à¸™à¸‚à¸à¸‡à¸à¸²à¸£à¸™à¸³à¹€à¸‚้าฉาà¸" #: editor/editor_node.cpp -#, fuzzy msgid "" "This resource belongs to a scene that was instanced or inherited.\n" "Changes to it won't be kept when saving the current scene." msgstr "" -"รีซà¸à¸£à¹Œà¸ªà¸™à¸µà¹‰à¹€à¸›à¹‡à¸™à¸‚à¸à¸‡à¸‰à¸²à¸à¸—ี่ถูà¸à¸à¸´à¸™à¸ªà¹à¸•นซ์หรืà¸à¸ªà¸·à¸šà¸—à¸à¸”\n" -"à¸à¸²à¸£à¹à¸à¹‰à¹„ขจะไม่ถูà¸à¸šà¸±à¸™à¸—ึà¸" +"ทรัพยาà¸à¸£à¸™à¸µà¹‰à¹€à¸›à¹‡à¸™à¸‰à¸²à¸à¸—ี่เป็นà¸à¸´à¸™à¸ªà¹à¸•นซ์หรืà¸à¸ªà¸·à¸šà¸—à¸à¸”\n" +"à¸à¸²à¸£à¹€à¸›à¸¥à¸µà¹ˆà¸¢à¸™à¹à¸›à¸¥à¸‡à¸ˆà¸°à¹„ม่ถูà¸à¹€à¸à¹‡à¸šà¹„ว้ เมื่à¸à¸šà¸±à¸™à¸—ึà¸à¸‰à¸²à¸à¸›à¸±à¸ˆà¸ˆà¸¸à¸šà¸±à¸™" #: editor/editor_node.cpp msgid "" @@ -2458,17 +2312,16 @@ msgid "Open Base Scene" msgstr "เปิดไฟล์ฉาà¸à¸—ี่ใช้สืบทà¸à¸”" #: editor/editor_node.cpp -#, fuzzy msgid "Quick Open..." -msgstr "เปิดไฟล์ฉาà¸à¸”่วน..." +msgstr "เปิดด่วน..." #: editor/editor_node.cpp msgid "Quick Open Scene..." -msgstr "เปิดไฟล์ฉาà¸à¸”่วน..." +msgstr "เปิดฉาà¸à¸”่วน..." #: editor/editor_node.cpp msgid "Quick Open Script..." -msgstr "เปิดไฟล์สคริปต์ด่วน..." +msgstr "เปิดสคริปต์ด่วน..." #: editor/editor_node.cpp msgid "Save & Close" @@ -2479,14 +2332,12 @@ msgid "Save changes to '%s' before closing?" msgstr "บันทึภ'%s' à¸à¹ˆà¸à¸™à¸›à¸´à¸”โปรà¹à¸à¸£à¸¡à¸«à¸£à¸·à¸à¹„ม่?" #: editor/editor_node.cpp -#, fuzzy msgid "Saved %s modified resource(s)." -msgstr "โหลดรีซà¸à¸£à¹Œà¸ªà¹„ม่ได้" +msgstr "บันทึà¸à¸—รัพยาà¸à¸£ %s ที่ถูà¸à¹à¸à¹‰à¹„ขสำเร็จ" #: editor/editor_node.cpp -#, fuzzy msgid "A root node is required to save the scene." -msgstr "Texture ขนาดใหà¸à¹ˆà¸•้à¸à¸‡à¸à¸²à¸£à¹à¸„่ไฟล์เดียว" +msgstr "โหนดà¹à¸¡à¹ˆà¸ˆà¸³à¹€à¸›à¹‡à¸™à¸•้à¸à¸‡à¸—ำà¸à¸²à¸£à¸šà¸±à¸™à¸—ึà¸à¸‰à¸²à¸" #: editor/editor_node.cpp msgid "Save Scene As..." @@ -2510,11 +2361,11 @@ msgstr "ทำไม่ได้ถ้าไม่มีฉาà¸" #: editor/editor_node.cpp msgid "Export Mesh Library" -msgstr "ส่งà¸à¸à¸ Mesh Library" +msgstr "ส่งà¸à¸à¸à¹„ลบรารี Mesh" #: editor/editor_node.cpp msgid "This operation can't be done without a root node." -msgstr "ทำไม่ได้ถ้าไม่มีโหนดราà¸" +msgstr "ไม่สามารถà¸à¸£à¸°à¸—ำได้สำเร็จถ้าไม่มีโหนดà¹à¸¡à¹ˆ" #: editor/editor_node.cpp msgid "Export Tile Set" @@ -2584,9 +2435,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." @@ -2601,11 +2451,12 @@ msgid "Unable to load addon script from path: '%s'." msgstr "ไม่สามารถโหลดสคริปต์จาà¸: '%s'" #: editor/editor_node.cpp -#, fuzzy msgid "" "Unable to load addon script from path: '%s' There seems to be an error in " "the code, please check the syntax." -msgstr "ไม่สามารถโหลดสคริปต์จาà¸: '%s' ไม่ใช่สคริปต์ tool" +msgstr "" +"ไม่สามารถโหลดสคริปต์ส่วนเสริมจาà¸: '%s' เหมืà¸à¸™à¸§à¹ˆà¸²à¸ˆà¸°à¹€à¸à¸´à¸”ข้à¸à¸œà¸´à¸”พลาดขึ้นในโค้ด " +"à¸à¸£à¸¸à¸“าเช็ตรูปà¹à¸šà¸šà¸à¸²à¸£à¹€à¸‚ียนโค้ด" #: editor/editor_node.cpp msgid "" @@ -2682,24 +2533,20 @@ msgstr "ค่าเริ่มต้น" #: editor/editor_node.cpp editor/editor_properties.cpp #: editor/plugins/script_editor_plugin.cpp editor/property_editor.cpp -#, fuzzy msgid "Show in FileSystem" -msgstr "เปิดในตัวจัดà¸à¸²à¸£à¹„ฟล์" +msgstr "à¹à¸ªà¸”งในรูปà¹à¸šà¸šà¹„ฟล์" #: editor/editor_node.cpp -#, fuzzy msgid "Play This Scene" -msgstr "เล่น" +msgstr "เล่นฉาà¸à¸™à¸µà¹‰" #: editor/editor_node.cpp -#, fuzzy msgid "Close Tab" -msgstr "ปิดà¹à¸—็บà¸à¸·à¹ˆà¸™" +msgstr "ปิดà¹à¸—็บ" #: editor/editor_node.cpp -#, fuzzy msgid "Undo Close Tab" -msgstr "ปิดà¹à¸—็บà¸à¸·à¹ˆà¸™" +msgstr "เลิà¸à¸—ำà¹à¸—็บที่ปิด" #: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp msgid "Close Other Tabs" @@ -2707,12 +2554,11 @@ msgstr "ปิดà¹à¸—็บà¸à¸·à¹ˆà¸™" #: editor/editor_node.cpp msgid "Close Tabs to the Right" -msgstr "" +msgstr "ปิดà¹à¸—็บทางด้านขวา" #: editor/editor_node.cpp -#, fuzzy msgid "Close All Tabs" -msgstr "ปิดทั้งหมด" +msgstr "ปิดà¹à¸—็บทั้งหมด" #: editor/editor_node.cpp msgid "Switch Scene Tab" @@ -2755,9 +2601,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" @@ -2796,9 +2641,8 @@ msgid "Save Scene" msgstr "บันทึà¸à¸‰à¸²à¸" #: editor/editor_node.cpp -#, fuzzy msgid "Save All Scenes" -msgstr "บันทึà¸à¸—ุà¸à¸‰à¸²à¸" +msgstr "บันทึà¸à¸‰à¸²à¸à¸—ั้งหมด" #: editor/editor_node.cpp msgid "Convert To..." @@ -2806,11 +2650,11 @@ msgstr "à¹à¸›à¸¥à¸‡à¹€à¸›à¹‡à¸™..." #: editor/editor_node.cpp msgid "MeshLibrary..." -msgstr "MeshLibrary..." +msgstr "ไลบรารี Mesh..." #: editor/editor_node.cpp msgid "TileSet..." -msgstr "TileSet..." +msgstr "ไทล์เซต..." #: editor/editor_node.cpp editor/plugins/script_text_editor.cpp #: scene/gui/line_edit.cpp scene/gui/text_edit.cpp @@ -2836,22 +2680,20 @@ msgid "Project" msgstr "โปรเจà¸à¸•์" #: editor/editor_node.cpp -#, fuzzy msgid "Project Settings..." -msgstr "ตัวเลืà¸à¸à¹‚ปรเจà¸à¸•์" +msgstr "ตั้งค่าโปรเจà¸à¸•์" #: editor/editor_node.cpp editor/plugins/version_control_editor_plugin.cpp -#, fuzzy msgid "Version Control" -msgstr "รุ่น:" +msgstr "เวà¸à¸£à¹Œà¸Šà¸±à¸™à¸„à¸à¸™à¹‚ทรล" #: editor/editor_node.cpp editor/plugins/version_control_editor_plugin.cpp msgid "Set Up Version Control" -msgstr "" +msgstr "ตั้งเวà¸à¸£à¹Œà¸Šà¸±à¸™à¸„à¸à¸™à¹‚ทรน" #: editor/editor_node.cpp msgid "Shut Down Version Control" -msgstr "" +msgstr "ปิดเวà¸à¸£à¹Œà¸Šà¸±à¸™à¸„à¸à¸™à¹‚ทรล" #: editor/editor_node.cpp msgid "Export..." @@ -2859,21 +2701,19 @@ msgstr "ส่งà¸à¸à¸..." #: editor/editor_node.cpp msgid "Install Android Build Template..." -msgstr "" +msgstr "ติดตั้งà¹à¸¡à¹ˆà¹à¸šà¸šà¸à¸²à¸£à¸ªà¸£à¹‰à¸²à¸‡à¸‚à¸à¸‡à¹à¸à¸™à¸”รà¸à¸¢à¸”์" #: editor/editor_node.cpp -#, fuzzy msgid "Open Project Data Folder" -msgstr "เปิดตัวจัดà¸à¸²à¸£à¹‚ปรเจà¸à¸•์?" +msgstr "เปิดโฟลเดà¸à¸£à¹Œà¸‚้à¸à¸¡à¸¹à¸¥à¹‚ปรเจà¸à¸•์" #: editor/editor_node.cpp editor/plugins/tile_set_editor_plugin.cpp msgid "Tools" msgstr "เครื่à¸à¸‡à¸¡à¸·à¸" #: editor/editor_node.cpp -#, fuzzy msgid "Orphan Resource Explorer..." -msgstr "ตัวจัดà¸à¸²à¸£à¸£à¸µà¸‹à¸à¸£à¹Œà¸ªà¸—ี่ไม่มีเจ้าขà¸à¸‡" +msgstr "à¸à¸²à¸£à¹ƒà¸Šà¹‰à¸—รัพยาà¸à¸£" #: editor/editor_node.cpp msgid "Quit to Project List" @@ -2882,7 +2722,7 @@ msgstr "ปิดà¹à¸¥à¸°à¸à¸¥à¸±à¸šà¸ªà¸¹à¹ˆà¸£à¸²à¸¢à¸Šà¸·à¹ˆà¸à¹‚ปรเ #: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp #: editor/project_export.cpp msgid "Debug" -msgstr "à¹à¸à¹‰à¸ˆà¸¸à¸”บà¸à¸žà¸£à¹ˆà¸à¸‡" +msgstr "ดีบัà¸" #: editor/editor_node.cpp msgid "Deploy with Remote Debug" @@ -2913,7 +2753,7 @@ msgstr "" #: editor/editor_node.cpp msgid "Visible Collision Shapes" -msgstr "รูปทรงà¸à¸²à¸¢à¸ าพมà¸à¸‡à¹€à¸«à¹‡à¸™à¹„ด้" +msgstr "ขà¸à¸šà¹€à¸‚ตà¸à¸²à¸£à¸Šà¸™à¸—ี่มà¸à¸‡à¹€à¸«à¹‡à¸™à¹„ด้" #: editor/editor_node.cpp msgid "" @@ -2923,7 +2763,7 @@ msgstr "รูปทรงà¸à¸²à¸¢à¸ าพà¹à¸¥à¸°à¸£à¸±à¸‡à¸ªà¸µ (2D à¹à¸¥à #: editor/editor_node.cpp msgid "Visible Navigation" -msgstr "เส้นนำทางมà¸à¸‡à¹€à¸«à¹‡à¸™à¹„ด้" +msgstr "à¹à¸ªà¸”งà¸à¸²à¸£à¸™à¸³à¸—าง" #: editor/editor_node.cpp msgid "" @@ -2947,7 +2787,7 @@ msgstr "" #: editor/editor_node.cpp msgid "Sync Script Changes" -msgstr "ซิงค์à¸à¸²à¸£à¹à¸à¹‰à¹„ขสคริปต์" +msgstr "ซิงค์à¸à¸²à¸£à¹€à¸›à¸¥à¸µà¹ˆà¸¢à¸™à¹à¸›à¸¥à¸‡à¸ªà¸„ริปต์" #: editor/editor_node.cpp msgid "" @@ -2961,59 +2801,51 @@ msgstr "" #: editor/editor_node.cpp editor/script_create_dialog.cpp msgid "Editor" -msgstr "โปรà¹à¸à¸£à¸¡" +msgstr "เà¸à¸”ิเตà¸à¸£à¹Œ" #: editor/editor_node.cpp -#, fuzzy msgid "Editor Settings..." -msgstr "ตัวเลืà¸à¸à¹‚ปรà¹à¸à¸£à¸¡à¸ªà¸£à¹‰à¸²à¸‡à¹€à¸à¸¡" +msgstr "ตั้งค่าเà¸à¸”ิเตà¸à¸£à¹Œ" #: editor/editor_node.cpp msgid "Editor Layout" -msgstr "เลย์เà¸à¸²à¸•์โปรà¹à¸à¸£à¸¡" +msgstr "เลย์เà¸à¸²à¸•์เà¸à¸”ิเตà¸à¸£à¹Œ" #: editor/editor_node.cpp -#, fuzzy msgid "Take Screenshot" -msgstr "เข้าใจ!" +msgstr "ถ่ายภาพหน้าจà¸" #: editor/editor_node.cpp -#, fuzzy msgid "Screenshots are stored in the Editor Data/Settings Folder." -msgstr "ตัวเลืà¸à¸à¹‚ปรà¹à¸à¸£à¸¡à¸ªà¸£à¹‰à¸²à¸‡à¹€à¸à¸¡" +msgstr "ภาพหน้าจà¸à¸ˆà¸°à¸–ูà¸à¹€à¸à¹‡à¸šà¹„ว้ในโฟลเดà¸à¸£à¹Œà¸‚้à¸à¸¡à¸¹à¸¥/à¸à¸²à¸£à¸•ั้งค่าขà¸à¸‡à¹€à¸à¸”ิเตà¸à¸£à¹Œ" #: editor/editor_node.cpp msgid "Toggle Fullscreen" -msgstr "สลับเต็มจà¸" +msgstr "เปิด/ปิด โหมดเต็มหน้าจà¸" #: editor/editor_node.cpp -#, fuzzy msgid "Toggle System Console" -msgstr "ซ่à¸à¸™/à¹à¸ªà¸”งโหนด CanvasItem" +msgstr "เปิด/ปิด คà¸à¸™à¹‚ซลระบบ" #: editor/editor_node.cpp -#, fuzzy msgid "Open Editor Data/Settings Folder" -msgstr "ตัวเลืà¸à¸à¹‚ปรà¹à¸à¸£à¸¡à¸ªà¸£à¹‰à¸²à¸‡à¹€à¸à¸¡" +msgstr "เปิดโฟลเดà¸à¸£à¹Œà¸‚้à¸à¸¡à¸¹à¸¥/ตั้งค่าขà¸à¸‡à¹€à¸à¸”ิเตà¸à¸£à¹Œ" #: editor/editor_node.cpp msgid "Open Editor Data Folder" -msgstr "" +msgstr "เปิดโฟลเดà¸à¸£à¹Œà¸‚à¸à¸‡à¹€à¸à¸”ิเตà¸à¸£à¹Œ" #: editor/editor_node.cpp -#, fuzzy msgid "Open Editor Settings Folder" -msgstr "ตัวเลืà¸à¸à¹‚ปรà¹à¸à¸£à¸¡à¸ªà¸£à¹‰à¸²à¸‡à¹€à¸à¸¡" +msgstr "เปิดโฟลเดà¸à¸£à¹Œà¸à¸²à¸£à¸•ั้งค่าขà¸à¸‡à¹€à¸à¸”ิเตà¸à¸£à¹Œ" #: editor/editor_node.cpp -#, fuzzy msgid "Manage Editor Features..." -msgstr "จัดà¸à¸²à¸£à¹à¸¡à¹ˆà¹à¸šà¸šà¸ªà¹ˆà¸‡à¸à¸à¸" +msgstr "จัดà¸à¸²à¸£à¸Ÿà¸µà¹€à¸ˆà¸à¸£à¹Œà¸‚à¸à¸‡à¹€à¸à¸”ิเตà¸à¸£à¹Œ..." #: editor/editor_node.cpp -#, fuzzy msgid "Manage Export Templates..." -msgstr "จัดà¸à¸²à¸£à¹à¸¡à¹ˆà¹à¸šà¸šà¸ªà¹ˆà¸‡à¸à¸à¸" +msgstr "จัดà¸à¸²à¸£à¹à¸¡à¹ˆà¹à¸šà¸šà¸à¸²à¸£à¸ªà¹ˆà¸‡à¸à¸à¸..." #: editor/editor_node.cpp editor/plugins/shader_editor_plugin.cpp msgid "Help" @@ -3038,8 +2870,13 @@ msgid "Q&A" msgstr "ถาม/ตà¸à¸š" #: editor/editor_node.cpp -msgid "Issue Tracker" -msgstr "ระบบติดตามบัค" +#, fuzzy +msgid "Report a Bug" +msgstr "นำเข้าใหม่" + +#: editor/editor_node.cpp +msgid "Send Docs Feedback" +msgstr "" #: editor/editor_node.cpp editor/plugins/asset_library_editor_plugin.cpp msgid "Community" @@ -3087,13 +2924,12 @@ msgstr "เลืà¸à¸à¹€à¸¥à¹ˆà¸™à¸‰à¸²à¸" #: editor/editor_node.cpp msgid "Changing the video driver requires restarting the editor." -msgstr "" +msgstr "à¸à¸²à¸£à¹€à¸›à¸¥à¸µà¹ˆà¸¢à¸™à¹„ดรเวà¸à¸£à¹Œà¸à¸²à¸£à¹Œà¸”จà¸à¸ˆà¸³à¹€à¸›à¹‡à¸™à¸•้à¸à¸‡à¹€à¸£à¸´à¹ˆà¸¡à¹€à¸à¸”ิเตà¸à¸£à¹Œà¹ƒà¸«à¸¡à¹ˆ" #: editor/editor_node.cpp editor/project_settings_editor.cpp #: editor/settings_config_dialog.cpp -#, fuzzy msgid "Save & Restart" -msgstr "บันทึà¸à¹à¸¥à¸°à¸™à¸³à¹€à¸‚้าà¸à¸µà¸à¸„รั้ง" +msgstr "บันทึà¸à¹à¸¥à¸°à¹€à¸£à¸´à¹ˆà¸¡à¹ƒà¸«à¸¡à¹ˆ" #: editor/editor_node.cpp #, fuzzy @@ -3101,19 +2937,16 @@ msgid "Spins when the editor window redraws." msgstr "หมุนเมื่à¸à¸¡à¸µà¸à¸²à¸£à¸§à¸²à¸”หน้าต่างโปรà¹à¸à¸£à¸¡à¹ƒà¸«à¸¡à¹ˆ!" #: editor/editor_node.cpp -#, fuzzy msgid "Update Continuously" -msgstr "ต่à¸à¹€à¸™à¸·à¹ˆà¸à¸‡" +msgstr "à¸à¸±à¸žà¹€à¸”ทà¸à¸¢à¹ˆà¸²à¸‡à¸•่à¸à¹€à¸™à¸·à¹ˆà¸à¸‡" #: editor/editor_node.cpp -#, fuzzy msgid "Update When Changed" msgstr "à¸à¸±à¸žà¹€à¸”ทเมื่à¸à¹€à¸›à¸¥à¸µà¹ˆà¸¢à¸™à¹à¸›à¸¥à¸‡" #: editor/editor_node.cpp -#, fuzzy msgid "Hide Update Spinner" -msgstr "ปิดà¸à¸²à¸£à¸à¸±à¸žà¹€à¸”ทตัวหมุน" +msgstr "ซ่à¸à¸™à¸•ัวหมุนà¸à¸²à¸£à¸à¸±à¸žà¹€à¸”ท" #: editor/editor_node.cpp msgid "FileSystem" @@ -3124,9 +2957,8 @@ msgid "Inspector" msgstr "คุณสมบัติ" #: editor/editor_node.cpp -#, fuzzy msgid "Expand Bottom Panel" -msgstr "ขยายโฟลเดà¸à¸£à¹Œ" +msgstr "ขยายà¹à¸œà¸‡à¸¥à¹ˆà¸²à¸‡" #: editor/editor_node.cpp msgid "Output" @@ -3141,9 +2973,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 "" @@ -3169,9 +3000,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" @@ -3199,15 +3029,15 @@ msgstr "เลืà¸à¸" #: editor/editor_node.cpp msgid "Open 2D Editor" -msgstr "เปิดตัวà¹à¸à¹‰à¹„ข 2 มิติ" +msgstr "เปิดเà¸à¸”ิเตà¸à¸£à¹Œ 2D" #: editor/editor_node.cpp msgid "Open 3D Editor" -msgstr "เปิดตัวà¹à¸à¹‰à¹„ข 3 มิติ" +msgstr "เปิดเà¸à¸”ิเตà¸à¸£à¹Œ 3D" #: editor/editor_node.cpp msgid "Open Script Editor" -msgstr "เปิดตัวà¹à¸à¹‰à¹„ขสคริปต์" +msgstr "เปิดเà¸à¸”ิเตà¸à¸£à¹Œà¸ªà¸„ริปต์" #: editor/editor_node.cpp editor/project_manager.cpp msgid "Open Asset Library" @@ -3215,16 +3045,15 @@ msgstr "เปิดà¹à¸«à¸¥à¹ˆà¸‡à¸£à¸§à¸¡à¸—รัพยาà¸à¸£" #: editor/editor_node.cpp msgid "Open the next Editor" -msgstr "เปิดตัวà¹à¸à¹‰à¹„ขถัดไป" +msgstr "เปิดเà¸à¸”ิเตà¸à¸£à¹Œà¸–ัดไป" #: editor/editor_node.cpp msgid "Open the previous Editor" -msgstr "เปิดตัวà¹à¸à¹‰à¹„ขà¸à¹ˆà¸à¸™à¸«à¸™à¹‰à¸²" +msgstr "เปิดเà¸à¸”ิเตà¸à¸£à¹Œà¸à¹ˆà¸à¸™à¸«à¸™à¹‰à¸²" #: editor/editor_node.h -#, fuzzy msgid "Warning!" -msgstr "คำเตืà¸à¸™" +msgstr "คำเตืà¸à¸™!" #: editor/editor_path.cpp #, fuzzy @@ -3240,14 +3069,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:" @@ -3264,16 +3091,15 @@ msgstr "รุ่น:" #: editor/editor_plugin_settings.cpp editor/plugin_config_dialog.cpp msgid "Author:" -msgstr "โดย:" +msgstr "ผู้สร้าง:" #: editor/editor_plugin_settings.cpp msgid "Status:" msgstr "สถานะ:" #: editor/editor_plugin_settings.cpp -#, fuzzy msgid "Edit:" -msgstr "à¹à¸à¹‰à¹„ข" +msgstr "à¹à¸à¹‰à¹„ข:" #: editor/editor_profiler.cpp msgid "Measure:" @@ -3289,7 +3115,7 @@ msgstr "เวลาเฉลี่ย (วินาที)" #: editor/editor_profiler.cpp msgid "Frame %" -msgstr "% ขà¸à¸‡à¹€à¸Ÿà¸£à¸¡" +msgstr "เฟรม %" #: editor/editor_profiler.cpp msgid "Physics Frame %" @@ -3316,9 +3142,8 @@ msgid "Calls" msgstr "จำนวนครั้ง" #: editor/editor_properties.cpp -#, fuzzy msgid "Edit Text:" -msgstr "à¹à¸à¹‰à¹„ขธีม..." +msgstr "à¹à¸à¹‰à¹„ขข้à¸à¸„วาม:" #: editor/editor_properties.cpp editor/script_create_dialog.cpp msgid "On" @@ -3326,10 +3151,9 @@ msgstr "เปิด" #: editor/editor_properties.cpp msgid "Layer" -msgstr "" +msgstr "เลเยà¸à¸£à¹Œ" #: editor/editor_properties.cpp -#, fuzzy msgid "Bit %d, value %d" msgstr "บิต %d, ค่า %d" @@ -3338,14 +3162,12 @@ msgid "[Empty]" msgstr "[ว่างเปล่า]" #: editor/editor_properties.cpp editor/plugins/root_motion_editor_plugin.cpp -#, fuzzy msgid "Assign..." -msgstr "ระบุ" +msgstr "à¸à¸³à¸«à¸™à¸”..." #: editor/editor_properties.cpp -#, fuzzy msgid "Invalid RID" -msgstr "ตำà¹à¸«à¸™à¹ˆà¸‡à¸œà¸´à¸”พลาด" +msgstr "RID ผิดพลาด" #: editor/editor_properties.cpp msgid "" @@ -3376,9 +3198,8 @@ msgid "New Script" msgstr "สคริปต์ใหม่" #: editor/editor_properties.cpp editor/scene_tree_dock.cpp -#, fuzzy msgid "Extend Script" -msgstr "เปิดสคริปต์" +msgstr "สคริปต์เสริม" #: editor/editor_properties.cpp editor/property_editor.cpp msgid "New %s" @@ -3411,13 +3232,12 @@ msgid "Selected node is not a Viewport!" msgstr "โหนดที่เลืà¸à¸à¹„ม่ใช่ Viewport!" #: editor/editor_properties_array_dict.cpp -#, fuzzy msgid "Size: " -msgstr "ขนาดเซลล์:" +msgstr "ขนาด: " #: editor/editor_properties_array_dict.cpp msgid "Page: " -msgstr "" +msgstr "หน้า: " #: editor/editor_properties_array_dict.cpp #: editor/plugins/theme_editor_plugin.cpp @@ -3425,18 +3245,16 @@ msgid "Remove Item" msgstr "ลบไà¸à¹€à¸—ม" #: editor/editor_properties_array_dict.cpp -#, fuzzy msgid "New Key:" -msgstr "ชื่à¸à¹ƒà¸«à¸¡à¹ˆ:" +msgstr "คีย์ใหม่:" #: editor/editor_properties_array_dict.cpp -#, fuzzy msgid "New Value:" -msgstr "ชื่à¸à¹ƒà¸«à¸¡à¹ˆ:" +msgstr "ค่าใหม่:" #: editor/editor_properties_array_dict.cpp msgid "Add Key/Value Pair" -msgstr "" +msgstr "เพิ่มคู่ขà¸à¸‡à¸„ีย์/ค่า" #: editor/editor_run_native.cpp msgid "" @@ -3456,7 +3274,7 @@ msgstr "มีฉาà¸à¸—ี่à¹à¸à¹‰à¹„ขà¸à¸¢à¸¹à¹ˆà¹à¸¥à¹‰à¸§" #: editor/editor_run_script.cpp msgid "Couldn't instance script:" -msgstr "สร้างà¸à¸´à¸™à¸ªà¹à¸•นซ์ขà¸à¸‡à¸ªà¸„ริปต์ไม่ได้:" +msgstr "ไม่สามารถà¸à¸´à¸™à¸ªà¹à¸•นซ์สคริปต์ได้:" #: editor/editor_run_script.cpp msgid "Did you forget the 'tool' keyword?" @@ -3476,7 +3294,7 @@ msgstr "เลืà¸à¸à¹‚หนดเพื่à¸à¸™à¸³à¹€à¸‚้า" #: editor/editor_sub_scene.cpp editor/project_manager.cpp msgid "Browse" -msgstr "เลืà¸à¸" +msgstr "ค้นหา" #: editor/editor_sub_scene.cpp msgid "Scene Path:" @@ -3487,7 +3305,6 @@ msgid "Import From Node:" msgstr "นำเข้าจาà¸à¹‚หนด:" #: editor/export_template_manager.cpp -#, fuzzy msgid "Redownload" msgstr "ดาวน์โหลดà¸à¸µà¸à¸„รั้ง" @@ -3529,9 +3346,8 @@ msgid "Can't open export templates zip." msgstr "เปิดไฟล์ zip à¹à¸¡à¹ˆà¹à¸šà¸šà¸ªà¹ˆà¸‡à¸à¸à¸à¹„ม่ได้" #: editor/export_template_manager.cpp -#, fuzzy msgid "Invalid version.txt format inside templates: %s." -msgstr "รูปà¹à¸šà¸šà¸‚à¸à¸‡ version.txt ในà¹à¸¡à¹ˆà¹à¸šà¸šà¹„ม่ถูà¸à¸•้à¸à¸‡" +msgstr "รูปà¹à¸šà¸šà¸‚à¸à¸‡ version.txt ในà¹à¸¡à¹ˆà¹à¸šà¸š %s ไม่ถูà¸à¸•้à¸à¸‡" #: editor/export_template_manager.cpp msgid "No version.txt found inside templates." @@ -3550,9 +3366,8 @@ msgid "Importing:" msgstr "นำเข้า:" #: editor/export_template_manager.cpp -#, fuzzy msgid "Error getting the list of mirrors." -msgstr "ผิดพลาดขณะสร้าง signature object" +msgstr "ผิดพลาดขณะà¸à¸³à¸¥à¸±à¸‡à¸£à¸±à¸šà¸£à¸²à¸¢à¸Šà¸·à¹ˆà¸à¸‚à¸à¸‡ mirrors" #: editor/export_template_manager.cpp msgid "Error parsing JSON of mirror list. Please report this issue!" @@ -3597,9 +3412,8 @@ msgid "Download Complete." msgstr "ดาวน์โหลดเสร็จสิ้น" #: editor/export_template_manager.cpp -#, fuzzy msgid "Cannot remove temporary file:" -msgstr "บันทึà¸à¸˜à¸µà¸¡à¹„ม่ได้:" +msgstr "ไม่สามารถลบไฟล์ชั่วคราวได้:" #: editor/export_template_manager.cpp msgid "" @@ -3608,17 +3422,16 @@ msgid "" msgstr "" #: editor/export_template_manager.cpp -#, fuzzy msgid "Error requesting URL:" -msgstr "ผิดพลาดขณะร้à¸à¸‡à¸‚à¸à¸—ี่à¸à¸¢à¸¹à¹ˆ: " +msgstr "ผิดพลาดขณะà¸à¸³à¸¥à¸±à¸‡à¸£à¹‰à¸à¸‡à¸‚ภURL:" #: editor/export_template_manager.cpp msgid "Connecting to Mirror..." -msgstr "à¸à¸³à¸¥à¸±à¸‡à¹€à¸Šà¸·à¹ˆà¸à¸¡à¸•่à¸..." +msgstr "à¸à¸³à¸¥à¸±à¸‡à¹€à¸Šà¸·à¹ˆà¸à¸¡à¸•่à¸à¸à¸±à¸š Mirror" #: editor/export_template_manager.cpp msgid "Disconnected" -msgstr "à¸à¸²à¸£à¹€à¸Šà¸·à¹ˆà¸à¸¡à¸•่à¸à¸ªà¸´à¹‰à¸™à¸ªà¸¸à¸”" +msgstr "ตัดà¸à¸²à¸£à¹€à¸Šà¸·à¹ˆà¸à¸¡à¸•่à¸à¹à¸¥à¹‰à¸§" #: editor/export_template_manager.cpp msgid "Resolving" @@ -3659,9 +3472,8 @@ msgid "SSL Handshake Error" msgstr "à¸à¸²à¸£à¸£à¸±à¸šà¸£à¸à¸‡à¸„วามปลà¸à¸”ภัยผิดพลาด" #: editor/export_template_manager.cpp -#, fuzzy msgid "Uncompressing Android Build Sources" -msgstr "à¸à¸³à¸¥à¸±à¸‡à¸„ลายบีบà¸à¸±à¸”" +msgstr "à¸à¸³à¸¥à¸±à¸‡à¸„ลาย Android Build Sources" #: editor/export_template_manager.cpp msgid "Current Version:" @@ -3680,14 +3492,12 @@ msgid "Remove Template" msgstr "ลบà¹à¸¡à¹ˆà¹à¸šà¸š" #: editor/export_template_manager.cpp -#, fuzzy msgid "Select Template File" msgstr "เลืà¸à¸à¹„ฟล์à¹à¸¡à¹ˆà¹à¸šà¸š" #: editor/export_template_manager.cpp -#, fuzzy msgid "Godot Export Templates" -msgstr "à¸à¸³à¸¥à¸±à¸‡à¹‚หลดà¹à¸¡à¹ˆà¹à¸šà¸šà¸ªà¹ˆà¸‡à¸à¸à¸" +msgstr "à¹à¸¡à¹ˆà¹à¸šà¸šà¸à¸²à¸£à¸ªà¹ˆà¸‡à¸à¸à¸ Godot" #: editor/export_template_manager.cpp msgid "Export Template Manager" @@ -3698,14 +3508,12 @@ msgid "Download Templates" msgstr "ดาวน์โหลดà¹à¸¡à¹ˆà¹à¸šà¸š" #: editor/export_template_manager.cpp -#, fuzzy msgid "Select mirror from list: (Shift+Click: Open in Browser)" -msgstr "เลืà¸à¸à¸¥à¸´à¸‡à¸à¹Œà¸”าวน์โหลด: " +msgstr "เลืà¸à¸ mirror จาà¸à¸£à¸²à¸¢à¸Šà¸·à¹ˆà¸: (Shift+คลิà¸: เปิดในเบราเซà¸à¸£à¹Œ)" #: editor/filesystem_dock.cpp -#, fuzzy msgid "Favorites" -msgstr "ที่ชื่นชà¸à¸š:" +msgstr "ที่ชื่นชà¸à¸š" #: editor/filesystem_dock.cpp msgid "Status: Import of file failed. Please fix file and reimport manually." @@ -3736,9 +3544,8 @@ msgid "No name provided." msgstr "ไม่ได้ระบุชื่à¸" #: editor/filesystem_dock.cpp -#, fuzzy msgid "Provided name contains invalid characters." -msgstr "ไม่สามารถใช้à¸à¸±à¸à¸©à¸£à¸šà¸²à¸‡à¸•ัวในชื่à¸à¹„ด้" +msgstr "ชื่à¸à¸—ี่ระบุประà¸à¸à¸šà¹„ปด้วยตัวà¸à¸±à¸à¸©à¸£à¸—ี่ไม่ถูà¸à¸•้à¸à¸‡" #: editor/filesystem_dock.cpp msgid "A file or folder with this name already exists." @@ -3765,33 +3572,28 @@ msgid "Duplicating folder:" msgstr "ทำซ้ำโฟลเดà¸à¸£à¹Œ:" #: editor/filesystem_dock.cpp -#, fuzzy msgid "New Inherited Scene" -msgstr "สืบทà¸à¸”ฉาà¸à¹ƒà¸«à¸¡à¹ˆ..." +msgstr "ฉาà¸à¸ªà¸·à¸šà¸—à¸à¸”ใหม่" #: editor/filesystem_dock.cpp -#, fuzzy msgid "Set As Main Scene" -msgstr "ฉาà¸à¸«à¸¥à¸±à¸" +msgstr "ตั้งเป็นฉาà¸à¸«à¸¥à¸±à¸" #: editor/filesystem_dock.cpp -#, fuzzy msgid "Open Scenes" -msgstr "เปิดไฟล์ฉาà¸" +msgstr "เปิดฉาà¸" #: editor/filesystem_dock.cpp msgid "Instance" msgstr "à¸à¸´à¸™à¸ªà¹à¸•นซ์" #: editor/filesystem_dock.cpp -#, fuzzy msgid "Add to Favorites" -msgstr "ที่ชื่นชà¸à¸š:" +msgstr "เพิ่มไปยังที่ชื่นชà¸à¸š" #: editor/filesystem_dock.cpp -#, fuzzy msgid "Remove from Favorites" -msgstr "ลบà¸à¸à¸à¸ˆà¸²à¸à¸à¸¥à¸¸à¹ˆà¸¡" +msgstr "ลบจาà¸à¸—ี่่ชื่นชà¸à¸š" #: editor/filesystem_dock.cpp msgid "Edit Dependencies..." @@ -3814,9 +3616,8 @@ msgid "Move To..." msgstr "ย้ายไป..." #: editor/filesystem_dock.cpp -#, fuzzy msgid "New Scene..." -msgstr "ฉาà¸à¹ƒà¸«à¸¡à¹ˆ" +msgstr "ฉาà¸à¹ƒà¸«à¸¡à¹ˆ..." #: editor/filesystem_dock.cpp editor/plugins/script_editor_plugin.cpp msgid "New Script..." @@ -3861,9 +3662,8 @@ msgid "Toggle Split Mode" msgstr "สลับโหมด" #: editor/filesystem_dock.cpp -#, fuzzy msgid "Search files" -msgstr "ค้นหาคลาส" +msgstr "ค้นหาไฟล์" #: editor/filesystem_dock.cpp msgid "" @@ -3886,9 +3686,8 @@ msgid "Overwrite" msgstr "เขียนทับ" #: editor/filesystem_dock.cpp -#, fuzzy msgid "Create Scene" -msgstr "สร้างจาà¸à¸‰à¸²à¸" +msgstr "สร้างฉาà¸" #: editor/filesystem_dock.cpp editor/plugins/script_editor_plugin.cpp msgid "Create Script" @@ -3900,16 +3699,15 @@ msgstr "ค้นหาในไฟล์" #: editor/find_in_files.cpp msgid "Find:" -msgstr "ค้นหา: " +msgstr "ค้นหา:" #: editor/find_in_files.cpp msgid "Folder:" -msgstr "โฟลเดà¸à¸£à¹Œ: " +msgstr "โฟลเดà¸à¸£à¹Œ:" #: editor/find_in_files.cpp -#, fuzzy msgid "Filters:" -msgstr "ตัวà¸à¸£à¸à¸‡" +msgstr "ตัวà¸à¸£à¸à¸‡:" #: editor/find_in_files.cpp msgid "" @@ -4084,9 +3882,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'" @@ -4101,21 +3898,21 @@ msgid "Import As:" msgstr "นำเข้าเป็น:" #: editor/import_dock.cpp -#, fuzzy msgid "Preset" -msgstr "à¸à¸²à¸£à¸ªà¹ˆà¸‡à¸à¸à¸" +msgstr "ตั้งล่วงหน้า" #: editor/import_dock.cpp msgid "Reimport" msgstr "นำเข้าใหม่" #: editor/import_dock.cpp -msgid "Save scenes, re-import and restart" -msgstr "" +#, fuzzy +msgid "Save Scenes, Re-Import, and Restart" +msgstr "บันทึà¸à¸‰à¸²à¸, นำเข้าà¹à¸¥à¸°à¹€à¸£à¸´à¹ˆà¸¡à¸•้นใหม่" #: editor/import_dock.cpp msgid "Changing the type of an imported file requires editor restart." -msgstr "" +msgstr "à¸à¸²à¸£à¹€à¸›à¸¥à¸µà¹ˆà¸¢à¸™à¹à¸›à¸¥à¸‡à¸Šà¸™à¸´à¸”ขà¸à¸‡à¹„ฟล์ที่นำเข้า จำเป็นต้à¸à¸‡à¹€à¸£à¸´à¹ˆà¸¡à¹€à¸à¸”ิเตà¸à¸£à¹Œà¹ƒà¸«à¸¡à¹ˆ" #: editor/import_dock.cpp msgid "" @@ -4124,15 +3921,13 @@ msgstr "" #: editor/inspector_dock.cpp msgid "Failed to load resource." -msgstr "โหลดรีซà¸à¸£à¹Œà¸ªà¹„ม่ได้" +msgstr "โหลดทรัพยาà¸à¸£à¹„ม่ได้" #: editor/inspector_dock.cpp -#, fuzzy msgid "Expand All Properties" msgstr "ขยายคุณสมบัติทั้งหมด" #: editor/inspector_dock.cpp -#, fuzzy msgid "Collapse All Properties" msgstr "ยุบคุณสมบัติทั้งหมด" @@ -4143,12 +3938,11 @@ msgstr "บันทึà¸à¹€à¸›à¹‡à¸™..." #: editor/inspector_dock.cpp msgid "Copy Params" -msgstr "คัดลà¸à¸à¸•ัวà¹à¸›à¸£" +msgstr "คัดลà¸à¸à¸žà¸²à¸£à¸²à¸¡à¸´à¹€à¸•à¸à¸£à¹Œ" #: editor/inspector_dock.cpp -#, fuzzy msgid "Edit Resource Clipboard" -msgstr "คลิปบà¸à¸£à¹Œà¸”ไม่มีรีซà¸à¸£à¹Œà¸ª!" +msgstr "à¹à¸à¹‰à¹„ขคลิปบà¸à¸£à¹Œà¸”ทรัพยาà¸à¸£" #: editor/inspector_dock.cpp msgid "Copy Resource" @@ -4195,9 +3989,8 @@ msgid "Object properties." msgstr "คุณสมบัติวัตถุ" #: editor/inspector_dock.cpp -#, fuzzy msgid "Filter properties" -msgstr "ตัวà¸à¸£à¸à¸‡" +msgstr "คุà¸à¸ªà¸¡à¸šà¸±à¸•ิตัวà¸à¸£à¸à¸‡" #: editor/inspector_dock.cpp msgid "Changes may be lost!" @@ -4222,15 +4015,15 @@ msgstr "สร้างปลั๊à¸à¸à¸´à¸™" #: editor/plugin_config_dialog.cpp msgid "Plugin Name:" -msgstr "ชื่à¸à¸›à¸¥à¸±à¹Šà¸à¸à¸´à¸™" +msgstr "ชื่à¸à¸›à¸¥à¸±à¹Šà¸à¸à¸´à¸™:" #: editor/plugin_config_dialog.cpp msgid "Subfolder:" -msgstr "โฟลเดà¸à¸£à¹Œà¸¢à¹ˆà¸à¸¢: " +msgstr "โฟลเดà¸à¸£à¹Œà¸¢à¹ˆà¸à¸¢:" #: editor/plugin_config_dialog.cpp editor/script_create_dialog.cpp msgid "Language:" -msgstr "ภาษา: " +msgstr "ภาษา:" #: editor/plugin_config_dialog.cpp msgid "Script Name:" @@ -4238,7 +4031,7 @@ msgstr "ชื่à¸à¸ªà¸„ริปต์:" #: editor/plugin_config_dialog.cpp msgid "Activate now?" -msgstr "" +msgstr "เปิดใช้งานตà¸à¸™à¸™à¸µà¹‰?" #: editor/plugins/abstract_polygon_2d_editor.cpp #: editor/plugins/polygon_2d_editor_plugin.cpp @@ -4252,25 +4045,21 @@ msgid "Create points." msgstr "สร้างจุด" #: editor/plugins/abstract_polygon_2d_editor.cpp -#, fuzzy msgid "" "Edit points.\n" "LMB: Move Point\n" "RMB: Erase Point" msgstr "" -"à¹à¸à¹‰à¹„ขรูปหลายเหลี่ยม:\n" -"เมาส์ซ้าย: ย้ายจุด\n" -"Ctrl+เมาส์ซ้าย: à¹à¸¢à¸à¸ªà¹ˆà¸§à¸™\n" -"เมาส์ขวา: ลบจุด" +"à¹à¸à¹‰à¹„ขจุด:\n" +"คลิà¸à¸‹à¹‰à¸²à¸¢: ย้ายจุด\n" +"คลิà¸à¸‚วา: ลบจุด" #: editor/plugins/abstract_polygon_2d_editor.cpp #: editor/plugins/animation_blend_space_1d_editor.cpp -#, fuzzy msgid "Erase points." -msgstr "คลิà¸à¸‚วา: ลบจุด" +msgstr "ลบจุด" #: editor/plugins/abstract_polygon_2d_editor.cpp -#, fuzzy msgid "Edit Polygon" msgstr "à¹à¸à¹‰à¹„ขรูปหลายเหลี่ยม" @@ -4279,12 +4068,10 @@ msgid "Insert Point" msgstr "à¹à¸—รà¸à¸ˆà¸¸à¸”" #: editor/plugins/abstract_polygon_2d_editor.cpp -#, fuzzy msgid "Edit Polygon (Remove Point)" msgstr "à¹à¸à¹‰à¹„ขรูปหลายเหลี่ยม (ลบจุด)" #: editor/plugins/abstract_polygon_2d_editor.cpp -#, fuzzy msgid "Remove Polygon And Point" msgstr "ลบรูปหลายเหลี่ยมà¹à¸¥à¸°à¸ˆà¸¸à¸”" @@ -4300,52 +4087,45 @@ msgstr "เพิ่มà¹à¸à¸™à¸´à¹€à¸¡à¸Šà¸±à¸™" #: editor/plugins/animation_blend_space_2d_editor.cpp #: editor/plugins/animation_blend_tree_editor_plugin.cpp #: editor/plugins/animation_state_machine_editor.cpp -#, fuzzy msgid "Load..." -msgstr "โหลด" +msgstr "โหลด..." #: editor/plugins/animation_blend_space_1d_editor.cpp #: editor/plugins/animation_blend_space_2d_editor.cpp -#, fuzzy msgid "Move Node Point" -msgstr "ย้ายจุด" +msgstr "สร้างจุดโหนด" #: editor/plugins/animation_blend_space_1d_editor.cpp -#, fuzzy msgid "Change BlendSpace1D Limits" -msgstr "à¹à¸à¹‰à¹„ขระยะเวลาà¸à¸²à¸£à¸œà¸ªà¸²à¸™" +msgstr "เปลี่ยนค่าจำà¸à¸±à¸”ขà¸à¸‡ BlendSpace1D" #: editor/plugins/animation_blend_space_1d_editor.cpp -#, fuzzy msgid "Change BlendSpace1D Labels" -msgstr "à¹à¸à¹‰à¹„ขระยะเวลาà¸à¸²à¸£à¸œà¸ªà¸²à¸™" +msgstr "เปลี่ยนป้ายà¸à¸³à¸à¸±à¸š BlendSpace1D" #: editor/plugins/animation_blend_space_1d_editor.cpp #: editor/plugins/animation_blend_space_2d_editor.cpp #: editor/plugins/animation_state_machine_editor.cpp msgid "This type of node can't be used. Only root nodes are allowed." -msgstr "" +msgstr "โหนดชนิดนี้ไม่สามารถใช้ได้ มีà¹à¸„่โหนดà¹à¸¡à¹ˆà¹€à¸—่านั้นที่สามารถใช้ได้" #: editor/plugins/animation_blend_space_1d_editor.cpp #: editor/plugins/animation_blend_space_2d_editor.cpp -#, fuzzy msgid "Add Node Point" -msgstr "เพิ่มโหนด" +msgstr "เพิ่มจุดโหนด" #: editor/plugins/animation_blend_space_1d_editor.cpp #: editor/plugins/animation_blend_space_2d_editor.cpp -#, fuzzy msgid "Add Animation Point" -msgstr "เพิ่มà¹à¸à¸™à¸´à¹€à¸¡à¸Šà¸±à¸™" +msgstr "เพิ่มจุดà¹à¸à¸™à¸´à¹€à¸¡à¸Šà¸±à¸™" #: editor/plugins/animation_blend_space_1d_editor.cpp -#, fuzzy msgid "Remove BlendSpace1D Point" -msgstr "ลบจุด" +msgstr "ลบจุด BlendSpace1D" #: editor/plugins/animation_blend_space_1d_editor.cpp msgid "Move BlendSpace1D Node Point" -msgstr "" +msgstr "ย้ายจุดโหนด BlendSpace1D" #: editor/plugins/animation_blend_space_1d_editor.cpp #: editor/plugins/animation_blend_space_2d_editor.cpp @@ -4369,38 +4149,33 @@ msgstr "" #: editor/plugins/animation_blend_space_1d_editor.cpp #: editor/plugins/animation_blend_space_2d_editor.cpp scene/gui/graph_edit.cpp msgid "Enable snap and show grid." -msgstr "" +msgstr "เปิà¸à¸à¸²à¸£à¹ƒà¸Šà¹‰à¸‡à¸²à¸™à¸à¸²à¸£à¹€à¸‚้าหาà¹à¸¥à¹à¸ªà¸”งเส้นà¸à¸£à¸´à¸”" #: editor/plugins/animation_blend_space_1d_editor.cpp #: editor/plugins/animation_blend_space_2d_editor.cpp -#, fuzzy msgid "Point" -msgstr "ย้ายจุด" +msgstr "จุด" #: editor/plugins/animation_blend_space_1d_editor.cpp #: editor/plugins/animation_blend_space_2d_editor.cpp #: editor/plugins/animation_blend_tree_editor_plugin.cpp -#, fuzzy msgid "Open Editor" -msgstr "เปิดในโปรà¹à¸à¸£à¸¡à¹à¸à¹‰à¹„ข" +msgstr "เปิดเà¸à¸”ิเตà¸à¸£à¹Œ" #: editor/plugins/animation_blend_space_1d_editor.cpp #: editor/plugins/animation_blend_space_2d_editor.cpp #: editor/plugins/animation_blend_tree_editor_plugin.cpp #: editor/plugins/animation_state_machine_editor.cpp -#, fuzzy msgid "Open Animation Node" -msgstr "โหนดà¹à¸à¸™à¸´à¹€à¸¡à¸Šà¸±à¸™" +msgstr "เปิดโหนดà¹à¸à¸™à¸´à¹€à¸¡à¸Šà¸±à¸™" #: editor/plugins/animation_blend_space_2d_editor.cpp -#, fuzzy msgid "Triangle already exists." -msgstr "มีà¸à¸²à¸£à¸à¸£à¸°à¸—ำ '%s' à¸à¸¢à¸¹à¹ˆà¹à¸¥à¹‰à¸§!" +msgstr "มีสามเหลี่ยมà¸à¸¢à¸¹à¹ˆà¹à¸¥à¹‰à¸§" #: editor/plugins/animation_blend_space_2d_editor.cpp -#, fuzzy msgid "Add Triangle" -msgstr "เพิ่มตัวà¹à¸›à¸£" +msgstr "เพิ่มสามเหลี่ยม" #: editor/plugins/animation_blend_space_2d_editor.cpp #, fuzzy @@ -4440,9 +4215,8 @@ msgid "Create triangles by connecting points." msgstr "" #: editor/plugins/animation_blend_space_2d_editor.cpp -#, fuzzy msgid "Erase points and triangles." -msgstr "วิเคราะห์สามเหลี่ยม %d à¸à¸±à¸™:" +msgstr "ลบจุดà¹à¸¥à¸°à¸ªà¸²à¸¡à¹€à¸«à¸¥à¸µà¹ˆà¸¢à¸¡" #: editor/plugins/animation_blend_space_2d_editor.cpp msgid "Generate blend triangles automatically (instead of manually)" @@ -4491,9 +4265,8 @@ msgid "Nodes Disconnected" msgstr "ตัดà¸à¸²à¸£à¹€à¸Šà¸·à¹ˆà¸à¸¡à¸•่à¸à¹‚หนดà¹à¸¥à¹‰à¸§" #: editor/plugins/animation_blend_tree_editor_plugin.cpp -#, fuzzy msgid "Set Animation" -msgstr "à¹à¸à¸™à¸´à¹€à¸¡à¸Šà¸±à¸™" +msgstr "ตั้งà¹à¸à¸™à¸´à¹€à¸¡à¸Šà¸±à¸™" #: editor/plugins/animation_blend_tree_editor_plugin.cpp #: editor/plugins/visual_shader_editor_plugin.cpp @@ -4512,9 +4285,8 @@ msgid "Toggle Filter On/Off" msgstr "โหมดไร้สิ่งรบà¸à¸§à¸™" #: editor/plugins/animation_blend_tree_editor_plugin.cpp -#, fuzzy msgid "Change Filter" -msgstr "à¹à¸à¹‰à¹„ขตัวà¸à¸£à¸à¸‡à¸ ูมิภาค" +msgstr "à¹à¸à¹‰à¹„ขตัวà¸à¸£à¸à¸‡" #: editor/plugins/animation_blend_tree_editor_plugin.cpp msgid "No animation player set, so unable to retrieve track names." @@ -4532,31 +4304,26 @@ msgid "" msgstr "" #: editor/plugins/animation_blend_tree_editor_plugin.cpp -#, fuzzy msgid "Anim Clips" -msgstr "คลิป" +msgstr "คลิปà¹à¸à¸™à¸´à¹€à¸¡à¸Šà¸±à¸™" #: editor/plugins/animation_blend_tree_editor_plugin.cpp -#, fuzzy msgid "Audio Clips" -msgstr "ตัวรับเสียง" +msgstr "คลิปเสียง" #: editor/plugins/animation_blend_tree_editor_plugin.cpp -#, fuzzy msgid "Functions" -msgstr "ฟังà¸à¹Œà¸Šà¸±à¸™:" +msgstr "ฟังà¸à¹Œà¸Šà¸±à¸™" #: editor/plugins/animation_blend_tree_editor_plugin.cpp #: editor/plugins/animation_state_machine_editor.cpp -#, fuzzy msgid "Node Renamed" -msgstr "ชื่à¸à¹‚หนด:" +msgstr "เปลี่ยนชื่à¸à¹‚หนดà¹à¸¥à¹‰à¸§" #: editor/plugins/animation_blend_tree_editor_plugin.cpp #: editor/plugins/visual_shader_editor_plugin.cpp -#, fuzzy msgid "Add Node..." -msgstr "เพิ่มโหนด" +msgstr "เพิ่มโหนด..." #: editor/plugins/animation_blend_tree_editor_plugin.cpp #: editor/plugins/root_motion_editor_plugin.cpp @@ -4565,9 +4332,8 @@ msgid "Edit Filtered Tracks:" msgstr "à¹à¸à¹‰à¹„ขตัวà¸à¸£à¸à¸‡" #: editor/plugins/animation_blend_tree_editor_plugin.cpp -#, fuzzy msgid "Enable Filtering" -msgstr "à¹à¸à¹‰à¹„ขโหนดลูà¸à¹„ด้" +msgstr "เปิดà¸à¸²à¸£à¹ƒà¸Šà¹‰à¸‡à¸²à¸™à¸•ัวà¸à¸£à¸à¸‡" #: editor/plugins/animation_player_editor_plugin.cpp msgid "Toggle Autoplay" @@ -4596,14 +4362,12 @@ msgid "Remove Animation" msgstr "ลบà¹à¸à¸™à¸´à¹€à¸¡à¸Šà¸±à¸™" #: editor/plugins/animation_player_editor_plugin.cpp -#, fuzzy msgid "Invalid animation name!" -msgstr "ผิดพลาด: ชื่à¸à¹à¸à¸™à¸´à¹€à¸¡à¸Šà¸±à¸™à¹„ม่ถูà¸à¸•้à¸à¸‡!" +msgstr "ชื่à¸à¹à¸à¸™à¸´à¹€à¸¡à¸Šà¸±à¸™à¹„ม่ถูà¸à¸•้à¸à¸‡!" #: editor/plugins/animation_player_editor_plugin.cpp -#, fuzzy msgid "Animation name already exists!" -msgstr "ผิดพลาด: มีชื่à¸à¹à¸à¸™à¸´à¹€à¸¡à¸Šà¸±à¸™à¸™à¸µà¹‰à¸à¸¢à¸¹à¹ˆà¹à¸¥à¹‰à¸§!" +msgstr "ชื่à¸à¹à¸à¸™à¸´à¹€à¸¡à¸Šà¸±à¸™à¸™à¸µà¹‰ มีà¸à¸¢à¸¹à¹ˆà¹à¸¥à¹‰à¸§!" #: editor/plugins/animation_player_editor_plugin.cpp #: editor/plugins/sprite_frames_editor_plugin.cpp @@ -4627,14 +4391,12 @@ msgid "Duplicate Animation" msgstr "ทำซ้ำà¹à¸à¸™à¸´à¹€à¸¡à¸Šà¸±à¸™" #: editor/plugins/animation_player_editor_plugin.cpp -#, fuzzy msgid "No animation to copy!" -msgstr "ผิดพลาด: ไม่มีà¹à¸à¸™à¸´à¹€à¸¡à¸Šà¸±à¸™à¹ƒà¸«à¹‰à¸„ัดลà¸à¸!" +msgstr "ไม่มีà¹à¸à¸™à¸´à¹€à¸¡à¸Šà¸±à¸™à¹ƒà¸«à¹‰à¸„ัดลà¸à¸!" #: editor/plugins/animation_player_editor_plugin.cpp -#, fuzzy msgid "No animation resource on clipboard!" -msgstr "ผิดพลาด: ไม่มีà¹à¸à¸™à¸´à¹€à¸¡à¸Šà¸±à¸™à¹ƒà¸™à¸„ลิปบà¸à¸£à¹Œà¸”!" +msgstr "ไม่มีà¹à¸à¸™à¸´à¹€à¸¡à¸Šà¸±à¸™à¹ƒà¸™à¸„ลิปบà¸à¸£à¹Œà¸”!" #: editor/plugins/animation_player_editor_plugin.cpp msgid "Pasted Animation" @@ -4645,9 +4407,8 @@ msgid "Paste Animation" msgstr "วางà¹à¸à¸™à¸´à¹€à¸¡à¸Šà¸±à¸™" #: editor/plugins/animation_player_editor_plugin.cpp -#, fuzzy msgid "No animation to edit!" -msgstr "ผิดพลาด: ไม่มีà¹à¸à¸™à¸´à¹€à¸¡à¸Šà¸±à¸™à¹ƒà¸«à¹‰à¹à¸à¹‰à¹„ข!" +msgstr "ไม่มีà¹à¸à¸™à¸´à¹€à¸¡à¸Šà¸±à¸™à¹ƒà¸«à¹‰à¹à¸à¹‰à¹„ข!" #: editor/plugins/animation_player_editor_plugin.cpp msgid "Play selected animation backwards from current pos. (A)" @@ -4753,9 +4514,8 @@ msgid "Include Gizmos (3D)" msgstr "รวมสัà¸à¸¥à¸±à¸à¸©à¸“์ (3D)" #: editor/plugins/animation_player_editor_plugin.cpp -#, fuzzy msgid "Pin AnimationPlayer" -msgstr "วางà¹à¸à¸™à¸´à¹€à¸¡à¸Šà¸±à¸™" +msgstr "ปัà¸à¸«à¸¡à¸¸à¸” AnimationPlayer" #: editor/plugins/animation_player_editor_plugin.cpp msgid "Create New Animation" @@ -4785,9 +4545,8 @@ msgid "Cross-Animation Blend Times" msgstr "ระยะเวลาà¸à¸²à¸£à¸œà¸ªà¸²à¸™ Cross-Animation" #: editor/plugins/animation_state_machine_editor.cpp -#, fuzzy msgid "Move Node" -msgstr "โหมดเคลื่à¸à¸™à¸¢à¹‰à¸²à¸¢" +msgstr "เคลื่à¸à¸™à¸¢à¹‰à¸²à¸¢à¹‚หนด" #: editor/plugins/animation_state_machine_editor.cpp #, fuzzy @@ -4815,7 +4574,7 @@ msgstr "" #: editor/plugins/animation_state_machine_editor.cpp msgid "Sync" -msgstr "" +msgstr "ซิงค์" #: editor/plugins/animation_state_machine_editor.cpp msgid "At End" @@ -4835,9 +4594,8 @@ msgid "No playback resource set at path: %s." msgstr "ไม่à¸à¸¢à¸¹à¹ˆà¹ƒà¸™à¹‚ฟลเดà¸à¸£à¹Œà¸£à¸µà¸‹à¸à¸£à¹Œà¸ª" #: editor/plugins/animation_state_machine_editor.cpp -#, fuzzy msgid "Node Removed" -msgstr "ลบ:" +msgstr "ลบโหนดà¹à¸¥à¹‰à¸§" #: editor/plugins/animation_state_machine_editor.cpp #, fuzzy @@ -4856,9 +4614,8 @@ msgid "" msgstr "" #: editor/plugins/animation_state_machine_editor.cpp -#, fuzzy msgid "Create new nodes." -msgstr "สร้าง %s ใหม่" +msgstr "สร้างโหนดใหม่" #: editor/plugins/animation_state_machine_editor.cpp #, fuzzy @@ -4884,9 +4641,8 @@ msgid "Transition: " msgstr "ทรานสิชัน" #: editor/plugins/animation_state_machine_editor.cpp -#, fuzzy msgid "Play Mode:" -msgstr "โหมดมุมมà¸à¸‡" +msgstr "โหมดà¸à¸²à¸£à¹€à¸¥à¹ˆà¸™:" #: editor/plugins/animation_tree_editor_plugin.cpp #: editor/plugins/animation_tree_player_editor_plugin.cpp @@ -5058,7 +4814,6 @@ msgid "Request failed, return code:" msgstr "à¸à¸²à¸£à¸£à¹‰à¸à¸‡à¸‚à¸à¸œà¸´à¸”พลาด รหัส:" #: editor/plugins/asset_library_editor_plugin.cpp -#, fuzzy msgid "Request failed." msgstr "ร้à¸à¸‡à¸‚à¸à¸œà¸´à¸”พลาด" @@ -5069,7 +4824,7 @@ msgstr "บันทึà¸à¸˜à¸µà¸¡à¹„ม่ได้:" #: editor/plugins/asset_library_editor_plugin.cpp msgid "Write error." -msgstr "" +msgstr "à¸à¸²à¸£à¹€à¸‚ียนผิดพลาด" #: editor/plugins/asset_library_editor_plugin.cpp msgid "Request failed, too many redirects" @@ -5086,9 +4841,8 @@ msgid "Request failed, timeout" msgstr "à¸à¸²à¸£à¸£à¹‰à¸à¸‡à¸‚à¸à¸œà¸´à¸”พลาด รหัส:" #: editor/plugins/asset_library_editor_plugin.cpp -#, fuzzy msgid "Timeout." -msgstr "เวลา" +msgstr "หมดเวลา" #: editor/plugins/asset_library_editor_plugin.cpp msgid "Bad download hash, assuming file has been tampered with." @@ -5111,9 +4865,8 @@ msgid "Asset Download Error:" msgstr "ดาวน์โหลดทรัพยาà¸à¸£à¸œà¸´à¸”พลาด:" #: editor/plugins/asset_library_editor_plugin.cpp -#, fuzzy msgid "Downloading (%s / %s)..." -msgstr "à¸à¸³à¸¥à¸±à¸‡à¸”าวน์โหลด" +msgstr "à¸à¸³à¸¥à¸±à¸‡à¸”าวน์โหลด (%s / %s)..." #: editor/plugins/asset_library_editor_plugin.cpp msgid "Downloading..." @@ -5149,32 +4902,29 @@ msgstr "à¸à¸³à¸¥à¸±à¸‡à¸”าวน์โหลดไฟล์นี้à¸à¸¢à¸¹ #: editor/plugins/asset_library_editor_plugin.cpp msgid "Recently Updated" -msgstr "" +msgstr "à¸à¸±à¸žà¹€à¸”ทล่าสุด" #: editor/plugins/asset_library_editor_plugin.cpp msgid "Least Recently Updated" -msgstr "" +msgstr "à¸à¸±à¸žà¹€à¸”ทน้à¸à¸¢à¸ªà¸¸à¸”" #: editor/plugins/asset_library_editor_plugin.cpp msgid "Name (A-Z)" -msgstr "" +msgstr "ชื่ภ(A-Z)" #: editor/plugins/asset_library_editor_plugin.cpp msgid "Name (Z-A)" -msgstr "" +msgstr "ชื่ภ(Z-A)" #: editor/plugins/asset_library_editor_plugin.cpp -#, fuzzy msgid "License (A-Z)" -msgstr "สัà¸à¸à¸²à¸à¸™à¸¸à¸à¸²à¸•" +msgstr "สัà¸à¸à¸²à¸à¸™à¸¸à¸à¸²à¸• (A-Z)" #: editor/plugins/asset_library_editor_plugin.cpp -#, fuzzy msgid "License (Z-A)" -msgstr "สัà¸à¸à¸²à¸à¸™à¸¸à¸à¸²à¸•" +msgstr "สัà¸à¸à¸²à¸à¸™à¸¸à¸à¸²à¸• (Z-A)" #: editor/plugins/asset_library_editor_plugin.cpp -#, fuzzy msgid "First" msgstr "à¹à¸£à¸à¸ªà¸¸à¸”" @@ -5196,7 +4946,7 @@ msgstr "ทั้งหมด" #: editor/plugins/asset_library_editor_plugin.cpp msgid "No results for \"%s\"." -msgstr "" +msgstr "ไม่มีผลลัพธ์สำหรับ \"%s\"" #: editor/plugins/asset_library_editor_plugin.cpp msgid "Import..." @@ -5237,7 +4987,7 @@ msgstr "à¸à¸³à¸¥à¸±à¸‡à¹‚หลด..." #: editor/plugins/asset_library_editor_plugin.cpp msgid "Assets ZIP File" -msgstr "ไฟล์ ZIP" +msgstr "ทรัพยาà¸à¸£à¹„ฟล์ ZIP" #: editor/plugins/baked_lightmap_editor_plugin.cpp msgid "" @@ -5278,7 +5028,7 @@ msgstr "จุดà¸à¸³à¹€à¸™à¸´à¸”ตาราง:" #: editor/plugins/canvas_item_editor_plugin.cpp msgid "Grid Step:" -msgstr "ระยะห่างเส้น:" +msgstr "ระยะห่างเส้นà¸à¸£à¸´à¸”:" #: editor/plugins/canvas_item_editor_plugin.cpp msgid "Primary Line Every:" @@ -5384,63 +5134,52 @@ msgid "" msgstr "" #: editor/plugins/canvas_item_editor_plugin.cpp -#, fuzzy msgid "Top Left" -msgstr "ซ้าย" +msgstr "บนซ้าย" #: editor/plugins/canvas_item_editor_plugin.cpp -#, fuzzy msgid "Top Right" -msgstr "ขวา" +msgstr "บนขวา" #: editor/plugins/canvas_item_editor_plugin.cpp -#, fuzzy msgid "Bottom Right" -msgstr "ย้ายไปขวา" +msgstr "ล่างขวา" #: editor/plugins/canvas_item_editor_plugin.cpp -#, fuzzy msgid "Bottom Left" -msgstr "มุมล่าง" +msgstr "ล่างซ้าย" #: editor/plugins/canvas_item_editor_plugin.cpp -#, fuzzy msgid "Center Left" -msgstr "ย่à¸à¸«à¸™à¹‰à¸²à¸‹à¹‰à¸²à¸¢" +msgstr "à¸à¸¥à¸²à¸‡à¸‹à¹‰à¸²à¸¢" #: editor/plugins/canvas_item_editor_plugin.cpp -#, fuzzy msgid "Center Top" -msgstr "ให้สิ่งที่เลืà¸à¸à¸à¸¢à¸¹à¹ˆà¸à¸¥à¸²à¸‡à¸ˆà¸" +msgstr "à¸à¸¥à¸²à¸‡à¸šà¸™" #: editor/plugins/canvas_item_editor_plugin.cpp -#, fuzzy msgid "Center Right" -msgstr "ย่à¸à¸«à¸™à¹‰à¸²à¸‚วา" +msgstr "à¸à¸¥à¸²à¸‡à¸‚วา" #: editor/plugins/canvas_item_editor_plugin.cpp -#, fuzzy msgid "Center Bottom" -msgstr "ล่าง" +msgstr "à¸à¸¥à¸²à¸‡à¸¥à¹ˆà¸²à¸‡" #: editor/plugins/canvas_item_editor_plugin.cpp msgid "Center" -msgstr "" +msgstr "à¸à¸¥à¸²à¸‡" #: editor/plugins/canvas_item_editor_plugin.cpp -#, fuzzy msgid "Left Wide" -msgstr "มุมซ้าย" +msgstr "ความà¸à¸§à¹‰à¸²à¸‡à¸‹à¹‰à¸²à¸¢" #: editor/plugins/canvas_item_editor_plugin.cpp -#, fuzzy msgid "Top Wide" -msgstr "มุมบน" +msgstr "ความà¸à¸§à¹‰à¸²à¸‡à¸šà¸™" #: editor/plugins/canvas_item_editor_plugin.cpp -#, fuzzy msgid "Right Wide" -msgstr "มุมขวา" +msgstr "ความà¸à¸§à¹‰à¸²à¸‡à¸‚วา" #: editor/plugins/canvas_item_editor_plugin.cpp #, fuzzy @@ -5449,11 +5188,11 @@ msgstr "มุมล่าง" #: editor/plugins/canvas_item_editor_plugin.cpp msgid "VCenter Wide" -msgstr "" +msgstr "ความà¸à¸§à¹‰à¸²à¸‡ VCenter" #: editor/plugins/canvas_item_editor_plugin.cpp msgid "HCenter Wide" -msgstr "" +msgstr "ความà¸à¸§à¹‰à¸²à¸‡ HCenter" #: editor/plugins/canvas_item_editor_plugin.cpp #, fuzzy @@ -5461,9 +5200,8 @@ msgid "Full Rect" msgstr "ชื่à¸à¹€à¸•็ม" #: editor/plugins/canvas_item_editor_plugin.cpp -#, fuzzy msgid "Keep Ratio" -msgstr "à¸à¸±à¸•ราส่วนเวลา:" +msgstr "รัà¸à¸©à¸²à¸à¸±à¸•ราส่วน" #: editor/plugins/canvas_item_editor_plugin.cpp msgid "Anchors only" @@ -5483,6 +5221,8 @@ msgid "" "Game Camera Override\n" "Overrides game camera with editor viewport camera." msgstr "" +"เขียนทับà¸à¸¥à¹‰à¸à¸‡à¸‚à¸à¸‡à¹€à¸à¸¡à¸ªà¹Œ\n" +"เขียนทับà¸à¸¥à¹‰à¸à¸‡à¸‚à¸à¸‡à¹€à¸à¸¡à¸ªà¹Œà¸”้วยเà¸à¸”ิเตà¸à¸£à¹Œà¸‚à¸à¸‡à¸§à¸´à¸§à¸žà¸à¸£à¹Œà¸•ขà¸à¸‡à¸à¸¥à¹‰à¸à¸‡" #: editor/plugins/canvas_item_editor_plugin.cpp #: editor/plugins/spatial_editor_plugin.cpp @@ -5490,18 +5230,18 @@ msgid "" "Game Camera Override\n" "No game instance running." msgstr "" +"เขียนทับà¸à¸¥à¹‰à¸à¸‡à¸‚à¸à¸‡à¹€à¸à¸¡à¸ªà¹Œ\n" +"ไม่มีà¸à¸´à¸™à¸ªà¹à¸•นซ์ขà¸à¸‡à¹€à¸à¸¡à¸ªà¹Œà¸—ำงานà¸à¸¢à¸¹à¹ˆ" #: editor/plugins/canvas_item_editor_plugin.cpp #: editor/plugins/spatial_editor_plugin.cpp -#, fuzzy msgid "Lock Selected" -msgstr "เครื่à¸à¸‡à¸¡à¸·à¸à¹€à¸¥à¸·à¸à¸" +msgstr "ล็à¸à¸à¸—ี่เลืà¸à¸" #: editor/plugins/canvas_item_editor_plugin.cpp #: editor/plugins/spatial_editor_plugin.cpp -#, fuzzy msgid "Unlock Selected" -msgstr "ลบสิ่งที่เลืà¸à¸" +msgstr "ปลดล็à¸à¸„ที่เลืà¸à¸" #: editor/plugins/canvas_item_editor_plugin.cpp #: editor/plugins/spatial_editor_plugin.cpp @@ -5551,7 +5291,6 @@ msgstr "" #: editor/plugins/canvas_item_editor_plugin.cpp #: editor/plugins/texture_region_editor_plugin.cpp #: editor/plugins/tile_set_editor_plugin.cpp scene/gui/graph_edit.cpp -#, fuzzy msgid "Zoom Reset" msgstr "รีเซ็ตà¸à¸²à¸£à¸‹à¸¹à¸¡" @@ -5588,9 +5327,8 @@ msgstr "โหมดหมุน" #: editor/plugins/canvas_item_editor_plugin.cpp #: editor/plugins/spatial_editor_plugin.cpp -#, fuzzy msgid "Scale Mode" -msgstr "โหมดปรับขนาด (R)" +msgstr "โหมดปรับขนาด" #: editor/plugins/canvas_item_editor_plugin.cpp #: editor/plugins/spatial_editor_plugin.cpp @@ -5610,9 +5348,8 @@ msgid "Pan Mode" msgstr "โหมดมุมมà¸à¸‡" #: editor/plugins/canvas_item_editor_plugin.cpp -#, fuzzy msgid "Ruler Mode" -msgstr "โหมดà¸à¸²à¸£à¸—ำงาน:" +msgstr "โหมดไม้บรรทัด" #: editor/plugins/canvas_item_editor_plugin.cpp #, fuzzy @@ -5630,9 +5367,8 @@ msgid "Toggle grid snapping." msgstr "เปิด/ปิด à¸à¸²à¸£à¸ˆà¸³à¸à¸±à¸”" #: editor/plugins/canvas_item_editor_plugin.cpp -#, fuzzy msgid "Use Grid Snap" -msgstr "จำà¸à¸±à¸”ด้วยเส้นตาราง" +msgstr "ใช้à¸à¸²à¸£à¹€à¸‚้าหาเส้นà¸à¸£à¸´à¸”" #: editor/plugins/canvas_item_editor_plugin.cpp #, fuzzy @@ -5709,12 +5445,12 @@ msgstr "ปลดล็à¸à¸„วัตถุที่เลืà¸à¸" #: editor/plugins/canvas_item_editor_plugin.cpp #: editor/plugins/spatial_editor_plugin.cpp msgid "Makes sure the object's children are not selectable." -msgstr "ทำให้เลืà¸à¸à¹‚หนดลูà¸à¹„ม่ได้" +msgstr "เลืà¸à¸à¹‚หนดลูà¸à¹„ม่ได้" #: editor/plugins/canvas_item_editor_plugin.cpp #: editor/plugins/spatial_editor_plugin.cpp msgid "Restores the object's children's ability to be selected." -msgstr "ทำให้เลืà¸à¸à¹‚หนดลูà¸à¹„ด้เหมืà¸à¸™à¹€à¸”ิม" +msgstr "เลืà¸à¸à¹‚หนดลูà¸à¹„ด้" #: editor/plugins/canvas_item_editor_plugin.cpp #, fuzzy @@ -5740,9 +5476,8 @@ msgid "View" msgstr "มุมมà¸à¸‡" #: editor/plugins/canvas_item_editor_plugin.cpp -#, fuzzy msgid "Always Show Grid" -msgstr "à¹à¸ªà¸”งเส้นตาราง" +msgstr "à¹à¸ªà¸”งเส้นà¸à¸£à¸´à¸”" #: editor/plugins/canvas_item_editor_plugin.cpp msgid "Show Helpers" @@ -5768,7 +5503,7 @@ msgstr "1 มุมมà¸à¸‡" #: editor/plugins/canvas_item_editor_plugin.cpp msgid "Show Group And Lock Icons" -msgstr "" +msgstr "à¹à¸ªà¸”งà¸à¸¥à¸¸à¹ˆà¸¡à¹à¸¥à¸°à¸¥à¹‡à¸à¸„ไà¸à¸„à¸à¸™" #: editor/plugins/canvas_item_editor_plugin.cpp msgid "Center Selection" @@ -5832,11 +5567,11 @@ msgstr "ลบท่าทาง" #: editor/plugins/canvas_item_editor_plugin.cpp msgid "Multiply grid step by 2" -msgstr "เพิ่มความถี่เส้นตารางขึ้น 2 เท่า" +msgstr "เพิ่มความถี่เส้นà¸à¸£à¸´à¸”ขึ้น 2 เท่า" #: editor/plugins/canvas_item_editor_plugin.cpp msgid "Divide grid step by 2" -msgstr "ลดความถี่เส้นตารางลงครึ่งหนึ่ง" +msgstr "ลดความถี่à¸à¸£à¸´à¸”ลงครึ่งหนึ่ง" #: editor/plugins/canvas_item_editor_plugin.cpp #, fuzzy @@ -5853,7 +5588,7 @@ msgstr "à¸à¸³à¸¥à¸±à¸‡à¹€à¸žà¸´à¹ˆà¸¡ %s..." #: editor/plugins/canvas_item_editor_plugin.cpp msgid "Cannot instantiate multiple nodes without root." -msgstr "à¸à¸´à¸™à¸ªà¹à¸•นซ์หลาย ๆ โหนดโดยที่ไม่มีโหนดราà¸à¹„ม่ได้" +msgstr "à¸à¸´à¸™à¸ªà¹à¸•นซ์หลาย ๆ โหนดโดยที่ไม่มีโหนดà¹à¸¡à¹ˆà¹„ม่ได้" #: editor/plugins/canvas_item_editor_plugin.cpp #: editor/plugins/spatial_editor_plugin.cpp editor/scene_tree_dock.cpp @@ -5879,9 +5614,8 @@ msgstr "" "ลาภ& วาง + Alt: เปลี่ยนประเภทโหนด" #: editor/plugins/collision_polygon_editor_plugin.cpp -#, fuzzy msgid "Create Polygon3D" -msgstr "สร้างรูปหลายเหลี่ยม" +msgstr "สร้าง Polygon3D" #: editor/plugins/collision_polygon_editor_plugin.cpp msgid "Edit Poly" @@ -5904,9 +5638,8 @@ msgstr "โหลด Mask à¸à¸²à¸£à¸›à¸°à¸—ุ" #: editor/plugins/cpu_particles_editor_plugin.cpp #: editor/plugins/particles_2d_editor_plugin.cpp #: editor/plugins/particles_editor_plugin.cpp -#, fuzzy msgid "Restart" -msgstr "เริ่มใหม่ทันที" +msgstr "เริ่มใหม่" #: editor/plugins/cpu_particles_2d_editor_plugin.cpp #: editor/plugins/particles_2d_editor_plugin.cpp @@ -5938,7 +5671,7 @@ msgstr "Snap (พิà¸à¹€à¸‹à¸¥):" #: editor/plugins/cpu_particles_2d_editor_plugin.cpp #: editor/plugins/particles_2d_editor_plugin.cpp msgid "Border Pixels" -msgstr "" +msgstr "พิà¸à¹€à¸‹à¸¥à¸‚à¸à¸š" #: editor/plugins/cpu_particles_2d_editor_plugin.cpp #: editor/plugins/particles_2d_editor_plugin.cpp @@ -6006,12 +5739,10 @@ msgid "Load Curve Preset" msgstr "โหลดเส้นโค้งตัวà¸à¸¢à¹ˆà¸²à¸‡" #: editor/plugins/curve_editor_plugin.cpp -#, fuzzy msgid "Add Point" msgstr "เพิ่มจุด" #: editor/plugins/curve_editor_plugin.cpp -#, fuzzy msgid "Remove Point" msgstr "ลบจุด" @@ -6053,7 +5784,7 @@ msgstr "สร้าง GI Probe" #: editor/plugins/gradient_editor_plugin.cpp msgid "Gradient Edited" -msgstr "" +msgstr "à¹à¸à¹‰à¹„ขเà¸à¸£à¹€à¸”ียนต์" #: editor/plugins/item_list_editor_plugin.cpp msgid "Item %d" @@ -6408,7 +6139,7 @@ msgstr "โหนดไม่มี geometry (หน้า)" #: editor/plugins/particles_editor_plugin.cpp msgid "\"%s\" doesn't inherit from Spatial." -msgstr "" +msgstr "\"%s\" ไม่ได้สืบทà¸à¸”มาจาภSpatial" #: editor/plugins/particles_editor_plugin.cpp #, fuzzy @@ -6610,6 +6341,8 @@ msgid "" "No texture in this polygon.\n" "Set a texture to be able to edit UV." msgstr "" +"ไม่มีเทà¸à¹€à¸ˆà¸à¸£à¹Œà¹ƒà¸™à¸£à¸¹à¸›à¸«à¸¥à¸²à¸¢à¹€à¸«à¸¥à¸µà¹ˆà¸¢à¸¡à¸™à¸µà¹‰\n" +"ตั้งเทà¸à¹€à¸ˆà¸à¸£à¹Œà¹€à¸žà¸·à¹ˆà¸à¸—ี่จะà¹à¸à¹‰à¹„ข UV ได้" #: editor/plugins/polygon_2d_editor_plugin.cpp msgid "Create UV Map" @@ -6622,9 +6355,8 @@ msgid "" msgstr "" #: editor/plugins/polygon_2d_editor_plugin.cpp -#, fuzzy msgid "Create Polygon & UV" -msgstr "สร้างรูปหลายเหลี่ยม" +msgstr "สร้าง Polygon à¹à¸¥à¸° UV" #: editor/plugins/polygon_2d_editor_plugin.cpp #, fuzzy @@ -6674,7 +6406,7 @@ msgstr "à¹à¸à¹‰à¹„ข UV รูปหลายเหลี่ยม 2D" #: editor/plugins/polygon_2d_editor_plugin.cpp msgid "UV" -msgstr "" +msgstr "UV" #: editor/plugins/polygon_2d_editor_plugin.cpp #, fuzzy @@ -6722,13 +6454,15 @@ msgstr "ปรับขนาดรูปหลายเหลี่ยม" #: editor/plugins/polygon_2d_editor_plugin.cpp msgid "Create a custom polygon. Enables custom polygon rendering." -msgstr "" +msgstr "สร้างรูปหลายเหลี่ยมà¹à¸šà¸šà¸à¸³à¸«à¸™à¸”เà¸à¸‡ เปิดà¸à¸²à¸£à¹€à¸£à¸™à¹€à¸”à¸à¸£à¹Œà¸£à¸¹à¸›à¸«à¸¥à¸²à¸¢à¹€à¸«à¸¥à¸µà¹ˆà¸¢à¸¡à¹à¸šà¸šà¸à¸³à¸«à¸™à¸”เà¸à¸‡" #: editor/plugins/polygon_2d_editor_plugin.cpp msgid "" "Remove a custom polygon. If none remain, custom polygon rendering is " "disabled." msgstr "" +"ลบรูปหลายเหลี่ยมà¹à¸šà¸šà¸à¸³à¸«à¸™à¸”เà¸à¸‡ " +"ถ้าไม่มีรูปหลายเหลี่ยมà¸à¸¢à¸¹à¹ˆà¸ˆà¸°à¸›à¸´à¸”à¸à¸²à¸£à¹€à¸£à¸™à¹€à¸”à¸à¸£à¹Œà¸£à¸¹à¸›à¸«à¸¥à¸²à¸¢à¹€à¸«à¸¥à¸µà¹ˆà¸¢à¸¡à¹à¸šà¸šà¸à¸³à¸«à¸™à¸”เà¸à¸‡" #: editor/plugins/polygon_2d_editor_plugin.cpp msgid "Paint weights with specified intensity." @@ -6740,7 +6474,7 @@ msgstr "" #: editor/plugins/polygon_2d_editor_plugin.cpp msgid "Radius:" -msgstr "" +msgstr "รัศมี:" #: editor/plugins/polygon_2d_editor_plugin.cpp msgid "Polygon->UV" @@ -6755,9 +6489,8 @@ msgid "Clear UV" msgstr "ลบ UV" #: editor/plugins/polygon_2d_editor_plugin.cpp -#, fuzzy msgid "Grid Settings" -msgstr "à¸à¸²à¸£à¸•ั้งค่า GridMap" +msgstr "ตั้งค่าเส้นà¸à¸£à¸´à¸”" #: editor/plugins/polygon_2d_editor_plugin.cpp msgid "Snap" @@ -6769,36 +6502,31 @@ msgstr "จำà¸à¸±à¸”à¸à¸²à¸£à¹€à¸„ลื่à¸à¸™à¸¢à¹‰à¸²à¸¢" #: editor/plugins/polygon_2d_editor_plugin.cpp msgid "Grid" -msgstr "เส้นตาราง" +msgstr "เส้นà¸à¸£à¸´à¸”" #: editor/plugins/polygon_2d_editor_plugin.cpp msgid "Show Grid" -msgstr "à¹à¸ªà¸”งเส้นตาราง" +msgstr "à¹à¸ªà¸”งเส้นà¸à¸£à¸´à¸”" #: editor/plugins/polygon_2d_editor_plugin.cpp -#, fuzzy msgid "Configure Grid:" -msgstr "ตั้งค่าà¸à¸²à¸£à¸ˆà¸³à¸à¸±à¸”" +msgstr "ตั้งค่าเส้นà¸à¸£à¸´à¸”:" #: editor/plugins/polygon_2d_editor_plugin.cpp -#, fuzzy msgid "Grid Offset X:" -msgstr "จุดà¸à¸³à¹€à¸™à¸´à¸”ตาราง:" +msgstr "จุดเริ่มเส้นà¸à¸£à¸´à¸”à¹à¸à¸™ X:" #: editor/plugins/polygon_2d_editor_plugin.cpp -#, fuzzy msgid "Grid Offset Y:" -msgstr "จุดà¸à¸³à¹€à¸™à¸´à¸”ตาราง:" +msgstr "จุดเริ่มเส้นà¸à¸£à¸´à¸”à¹à¸à¸™ Y:" #: editor/plugins/polygon_2d_editor_plugin.cpp -#, fuzzy msgid "Grid Step X:" -msgstr "ระยะห่างเส้น:" +msgstr "ระยะห่างà¸à¸£à¸´à¸”à¹à¸à¸™ X:" #: editor/plugins/polygon_2d_editor_plugin.cpp -#, fuzzy msgid "Grid Step Y:" -msgstr "ระยะห่างเส้น:" +msgstr "ระยะห่างà¸à¸£à¸´à¸”à¹à¸à¸™ Y:" #: editor/plugins/polygon_2d_editor_plugin.cpp #, fuzzy @@ -6898,33 +6626,28 @@ msgid "Error Saving" msgstr "ผิดพลาดขณะบันทึà¸" #: editor/plugins/script_editor_plugin.cpp -#, fuzzy msgid "Error importing theme." msgstr "ผิดพลาดขณะนำเข้าธีม" #: editor/plugins/script_editor_plugin.cpp -#, fuzzy msgid "Error Importing" msgstr "ผิดพลาดขณะนำเข้า" #: editor/plugins/script_editor_plugin.cpp -#, fuzzy msgid "New Text File..." -msgstr "สร้างโฟลเดà¸à¸£à¹Œ..." +msgstr "สร้างไฟล์ข้à¸à¸„วามใหม่" #: editor/plugins/script_editor_plugin.cpp -#, fuzzy msgid "Open File" msgstr "เปิดไฟล์" #: editor/plugins/script_editor_plugin.cpp -#, fuzzy msgid "Save File As..." -msgstr "บันทึà¸à¹€à¸›à¹‡à¸™..." +msgstr "บันทึà¸à¹„ฟล์เป็น..." #: editor/plugins/script_editor_plugin.cpp msgid "Can't obtain the script for running." -msgstr "" +msgstr "ไม่สามารถเรียà¸à¹ƒà¸Šà¹‰à¸ªà¸„ริปต์ได้" #: editor/plugins/script_editor_plugin.cpp msgid "Script failed reloading, check console for errors." @@ -6956,9 +6679,8 @@ msgid "Save Theme As..." msgstr "บันทึà¸à¸˜à¸µà¸¡à¹€à¸›à¹‡à¸™" #: editor/plugins/script_editor_plugin.cpp -#, fuzzy msgid "%s Class Reference" -msgstr " ตำราà¸à¹‰à¸²à¸‡à¸à¸´à¸‡à¸„ลาส" +msgstr "%s à¸à¹‰à¸²à¸‡à¸à¸´à¸‡à¸„ลาส" #: editor/plugins/script_editor_plugin.cpp #: editor/plugins/script_text_editor.cpp @@ -7013,9 +6735,8 @@ msgid "File" msgstr "ไฟล์" #: editor/plugins/script_editor_plugin.cpp -#, fuzzy msgid "Open..." -msgstr "เปิด" +msgstr "เปิด..." #: editor/plugins/script_editor_plugin.cpp msgid "Reopen Closed Script" @@ -7047,9 +6768,8 @@ msgid "Theme" msgstr "ธีม" #: editor/plugins/script_editor_plugin.cpp -#, fuzzy msgid "Import Theme..." -msgstr "นำเข้าธีม" +msgstr "นำเข้าธีม..." #: editor/plugins/script_editor_plugin.cpp msgid "Reload Theme" @@ -7069,7 +6789,7 @@ msgstr "ปิดคู่มืà¸" #: editor/plugins/script_editor_plugin.cpp editor/project_manager.cpp msgid "Run" -msgstr "รัน" +msgstr "เริ่ม" #: editor/plugins/script_editor_plugin.cpp editor/script_editor_debugger.cpp msgid "Step Into" @@ -7090,25 +6810,15 @@ msgstr "ทำต่à¸à¹„ป" #: editor/plugins/script_editor_plugin.cpp msgid "Keep Debugger Open" -msgstr "เปิดตัวà¹à¸à¹‰à¹„ขจุดบà¸à¸žà¸£à¹ˆà¸à¸‡à¸„้างไว้" +msgstr "เปิดตัวดีบัà¸à¸„้างไว้" #: editor/plugins/script_editor_plugin.cpp -#, fuzzy msgid "Debug with External Editor" -msgstr "à¹à¸à¹‰à¸ˆà¸¸à¸”บà¸à¸žà¸£à¹ˆà¸à¸‡à¸”้วยโปรà¹à¸à¸£à¸¡à¸à¸·à¹ˆà¸™" +msgstr "ดีบัà¸à¸”้วยเà¸à¸”ิเตà¸à¸£à¹Œà¸à¸·à¹ˆà¸™" #: editor/plugins/script_editor_plugin.cpp -#, fuzzy msgid "Open Godot online documentation." -msgstr "เปิดคู่มืà¸" - -#: editor/plugins/script_editor_plugin.cpp -msgid "Request Docs" -msgstr "" - -#: editor/plugins/script_editor_plugin.cpp -msgid "Help improve the Godot documentation by giving feedback." -msgstr "" +msgstr "เปิดคู่มืà¸à¸à¸à¸™à¹„ลน์" #: editor/plugins/script_editor_plugin.cpp msgid "Search the reference documentation." @@ -7146,22 +6856,19 @@ msgstr "บันทึà¸à¸à¸µà¸à¸„รั้ง" #: editor/plugins/script_editor_plugin.cpp editor/script_editor_debugger.cpp msgid "Debugger" -msgstr "ตัวà¹à¸à¹‰à¹„ขจุดบà¸à¸žà¸£à¹ˆà¸à¸‡" +msgstr "ตัวดีบัà¸" #: editor/plugins/script_editor_plugin.cpp -#, fuzzy msgid "Search Results" -msgstr "ค้นหาในคู่มืà¸" +msgstr "ผลà¸à¸²à¸£à¸„้นหา" #: editor/plugins/script_editor_plugin.cpp -#, fuzzy msgid "Clear Recent Scripts" -msgstr "ล้างรายà¸à¸²à¸£à¸‰à¸²à¸à¸¥à¹ˆà¸²à¸ªà¸¸à¸”" +msgstr "เคลียร์สคริปต์ล่าสุด" #: editor/plugins/script_text_editor.cpp -#, fuzzy msgid "Connections to method:" -msgstr "เชื่à¸à¸¡à¹„ปยังโหนด:" +msgstr "เชื่à¸à¸¡à¹„ปยังเมธà¸à¸”:" #: editor/plugins/script_text_editor.cpp editor/script_editor_debugger.cpp #, fuzzy @@ -7169,9 +6876,8 @@ msgid "Source" msgstr "ต้นฉบับ:" #: editor/plugins/script_text_editor.cpp -#, fuzzy msgid "Target" -msgstr "ตำà¹à¸«à¸™à¹ˆà¸‡à¸—ี่à¸à¸¢à¸¹à¹ˆ:" +msgstr "เป้าหมาย" #: editor/plugins/script_text_editor.cpp #, fuzzy @@ -7186,7 +6892,7 @@ msgstr "บรรทัด:" #: editor/plugins/script_text_editor.cpp msgid "(ignore)" -msgstr "" +msgstr "(ละเว้น)" #: editor/plugins/script_text_editor.cpp #, fuzzy @@ -7229,17 +6935,17 @@ msgstr "à¸à¸±à¸à¸©à¸£à¹à¸£à¸à¸žà¸´à¸¡à¸žà¹Œà¹ƒà¸«à¸à¹ˆ" #: editor/plugins/script_text_editor.cpp editor/plugins/text_editor.cpp msgid "Syntax Highlighter" -msgstr "" +msgstr "ไฮไลท์ไวยาà¸à¸£à¸“์" #: editor/plugins/script_text_editor.cpp #: editor/plugins/shader_editor_plugin.cpp editor/plugins/text_editor.cpp msgid "Go To" -msgstr "" +msgstr "ไปยัง" #: editor/plugins/script_text_editor.cpp #: editor/plugins/shader_editor_plugin.cpp editor/plugins/text_editor.cpp msgid "Bookmarks" -msgstr "" +msgstr "บุ๊คมาร์ค" #: editor/plugins/script_text_editor.cpp #, fuzzy @@ -7576,6 +7282,11 @@ msgstr "ต้à¸à¸‡à¹€à¸¥à¸·à¸à¸à¹€à¸žà¸µà¸¢à¸‡à¹‚หนดเดียว" #: editor/plugins/spatial_editor_plugin.cpp #, fuzzy +msgid "Auto Orthogonal Enabled" +msgstr "ขนาน" + +#: editor/plugins/spatial_editor_plugin.cpp +#, fuzzy msgid "Lock View Rotation" msgstr "à¹à¸ªà¸”งข้à¸à¸¡à¸¹à¸¥" @@ -7667,17 +7378,17 @@ msgid "Freelook Slow Modifier" msgstr "ปรับความเร็วมุมมà¸à¸‡à¸à¸´à¸ªà¸£à¸°" #: editor/plugins/spatial_editor_plugin.cpp +#, fuzzy +msgid "View Rotation Locked" +msgstr "à¹à¸ªà¸”งข้à¸à¸¡à¸¹à¸¥" + +#: editor/plugins/spatial_editor_plugin.cpp msgid "" "Note: The FPS value displayed is the editor's framerate.\n" "It cannot be used as a reliable indication of in-game performance." msgstr "" #: editor/plugins/spatial_editor_plugin.cpp -#, fuzzy -msgid "View Rotation Locked" -msgstr "à¹à¸ªà¸”งข้à¸à¸¡à¸¹à¸¥" - -#: editor/plugins/spatial_editor_plugin.cpp msgid "XForm Dialog" msgstr "เครื่à¸à¸‡à¸¡à¸·à¸à¹€à¸„ลื่à¸à¸™à¸¢à¹‰à¸²à¸¢" @@ -7807,9 +7518,8 @@ msgstr "à¹à¸ªà¸”งเส้นตาราง" #: editor/plugins/spatial_editor_plugin.cpp #: modules/gridmap/grid_map_editor_plugin.cpp -#, fuzzy msgid "Settings..." -msgstr "ตัวเลืà¸à¸" +msgstr "ตั้งค่า..." #: editor/plugins/spatial_editor_plugin.cpp msgid "Snap Settings" @@ -7915,9 +7625,8 @@ msgid "LightOccluder2D Preview" msgstr "สร้างรูปหลายเหลี่ยมà¸à¸±à¹‰à¸™à¹à¸ªà¸‡" #: editor/plugins/sprite_editor_plugin.cpp -#, fuzzy msgid "Sprite is empty!" -msgstr "ตำà¹à¸«à¸™à¹ˆà¸‡à¸šà¸±à¸™à¸—ึà¸à¸§à¹ˆà¸²à¸‡à¹€à¸›à¸¥à¹ˆà¸²!" +msgstr "สไปรต์ว่างเปล่า!" #: editor/plugins/sprite_editor_plugin.cpp msgid "Can't convert a sprite using animation frames to mesh." @@ -7937,9 +7646,8 @@ msgid "Invalid geometry, can't create polygon." msgstr "" #: editor/plugins/sprite_editor_plugin.cpp -#, fuzzy msgid "Convert to Polygon2D" -msgstr "ย้ายรูปหลายเหลี่ยม" +msgstr "à¹à¸›à¸¥à¸‡à¹€à¸›à¹‡à¸™ Polygon2D" #: editor/plugins/sprite_editor_plugin.cpp msgid "Invalid geometry, can't create collision polygon." @@ -7960,23 +7668,20 @@ msgid "Create LightOccluder2D Sibling" msgstr "สร้างรูปหลายเหลี่ยมà¸à¸±à¹‰à¸™à¹à¸ªà¸‡" #: editor/plugins/sprite_editor_plugin.cpp -#, fuzzy msgid "Sprite" -msgstr "SpriteFrames" +msgstr "สไปรต์" #: editor/plugins/sprite_editor_plugin.cpp msgid "Simplification: " -msgstr "" +msgstr "ลดความซับซ้à¸à¸™: " #: editor/plugins/sprite_editor_plugin.cpp -#, fuzzy msgid "Shrink (Pixels): " -msgstr "Snap (พิà¸à¹€à¸‹à¸¥):" +msgstr "หด (พิà¸à¹€à¸‹à¸¥): " #: editor/plugins/sprite_editor_plugin.cpp -#, fuzzy msgid "Grow (Pixels): " -msgstr "Snap (พิà¸à¹€à¸‹à¸¥):" +msgstr "ขยาย (พิà¸à¹€à¸‹à¸¥): " #: editor/plugins/sprite_editor_plugin.cpp #, fuzzy @@ -7984,28 +7689,24 @@ msgid "Update Preview" msgstr "ตัวà¸à¸¢à¹ˆà¸²à¸‡ Atlas" #: editor/plugins/sprite_editor_plugin.cpp -#, fuzzy msgid "Settings:" -msgstr "ตัวเลืà¸à¸" +msgstr "ตั้งค่า:" #: editor/plugins/sprite_frames_editor_plugin.cpp -#, fuzzy msgid "No Frames Selected" -msgstr "ให้สิ่งที่เลืà¸à¸à¹€à¸•็มจà¸" +msgstr "ไม่มีเฟรมที่เลืà¸à¸" #: editor/plugins/sprite_frames_editor_plugin.cpp -#, fuzzy msgid "Add %d Frame(s)" -msgstr "เพิ่มเฟรม" +msgstr "เพิ่ม %d เฟรม(วินาที)" #: editor/plugins/sprite_frames_editor_plugin.cpp msgid "Add Frame" msgstr "เพิ่มเฟรม" #: editor/plugins/sprite_frames_editor_plugin.cpp -#, fuzzy msgid "Unable to load images" -msgstr "โหลดรูปไม่ได้:" +msgstr "โหลดรูปไม่ได้" #: editor/plugins/sprite_frames_editor_plugin.cpp msgid "ERROR: Couldn't load frame resource!" @@ -8032,19 +7733,16 @@ msgid "(empty)" msgstr "(ว่างเปล่า)" #: editor/plugins/sprite_frames_editor_plugin.cpp -#, fuzzy msgid "Move Frame" -msgstr "วางเฟรม" +msgstr "เลื่à¸à¸™à¹€à¸Ÿà¸£à¸¡" #: editor/plugins/sprite_frames_editor_plugin.cpp -#, fuzzy msgid "Animations:" -msgstr "à¹à¸à¸™à¸´à¹€à¸¡à¸Šà¸±à¸™" +msgstr "à¹à¸à¸™à¸´à¹€à¸¡à¸Šà¸±à¸™:" #: editor/plugins/sprite_frames_editor_plugin.cpp -#, fuzzy msgid "New Animation" -msgstr "à¹à¸à¸™à¸´à¹€à¸¡à¸Šà¸±à¸™" +msgstr "à¹à¸à¸™à¸´à¹€à¸¡à¸Šà¸±à¸™à¹ƒà¸«à¸¡à¹ˆ" #: editor/plugins/sprite_frames_editor_plugin.cpp msgid "Speed (FPS):" @@ -8055,18 +7753,16 @@ msgid "Loop" msgstr "วน" #: editor/plugins/sprite_frames_editor_plugin.cpp -#, fuzzy msgid "Animation Frames:" -msgstr "เฟรมà¹à¸à¸™à¸´à¹€à¸¡à¸Šà¸±à¸™" +msgstr "เฟรมà¹à¸à¸™à¸´à¹€à¸¡à¸Šà¸±à¸™:" #: editor/plugins/sprite_frames_editor_plugin.cpp -#, fuzzy msgid "Add a Texture from File" -msgstr "เพิ่มโหนดจาà¸à¸œà¸±à¸‡" +msgstr "เพิ่มเทà¸à¹€à¸ˆà¸à¸£à¹Œà¸ˆà¸²à¸à¹„ฟล์" #: editor/plugins/sprite_frames_editor_plugin.cpp msgid "Add Frames from a Sprite Sheet" -msgstr "" +msgstr "เพิ่มเฟรมจาà¸à¸ªà¹„ปรต์ชีต" #: editor/plugins/sprite_frames_editor_plugin.cpp msgid "Insert Empty (Before)" @@ -8085,32 +7781,28 @@ msgid "Move (After)" msgstr "ย้าย (หลัง)" #: editor/plugins/sprite_frames_editor_plugin.cpp -#, fuzzy msgid "Select Frames" -msgstr "สà¹à¸•ค" +msgstr "เลืà¸à¸à¹€à¸Ÿà¸£à¸¡" #: editor/plugins/sprite_frames_editor_plugin.cpp msgid "Horizontal:" -msgstr "" +msgstr "à¹à¸™à¸§à¸™à¸à¸™:" #: editor/plugins/sprite_frames_editor_plugin.cpp -#, fuzzy msgid "Vertical:" -msgstr "มุมรูปทรง" +msgstr "à¹à¸™à¸§à¸•ั้ง:" #: editor/plugins/sprite_frames_editor_plugin.cpp -#, fuzzy msgid "Select/Clear All Frames" -msgstr "เลืà¸à¸à¸—ั้งหมด" +msgstr "เลืà¸à¸/เคลียร์เฟรมทั้งหมด" #: editor/plugins/sprite_frames_editor_plugin.cpp -#, fuzzy msgid "Create Frames from Sprite Sheet" -msgstr "สร้างจาà¸à¸‰à¸²à¸" +msgstr "สร้างเฟรมจาà¸à¸ªà¹„ปรต์ชีต" #: editor/plugins/sprite_frames_editor_plugin.cpp msgid "SpriteFrames" -msgstr "SpriteFrames" +msgstr "สไปรต์เฟรม" #: editor/plugins/texture_region_editor_plugin.cpp msgid "Set Region Rect" @@ -8127,9 +7819,8 @@ msgstr "โหมดà¸à¸²à¸£à¸ˆà¸³à¸à¸±à¸”:" #: editor/plugins/texture_region_editor_plugin.cpp #: scene/resources/visual_shader.cpp -#, fuzzy msgid "None" -msgstr "<ไม่มี>" +msgstr "ไม่มี" #: editor/plugins/texture_region_editor_plugin.cpp msgid "Pixel Snap" @@ -8137,7 +7828,7 @@ msgstr "จำà¸à¸±à¸”ให้ย้ายเป็นพิà¸à¹€à¸‹à¸¥" #: editor/plugins/texture_region_editor_plugin.cpp msgid "Grid Snap" -msgstr "จำà¸à¸±à¸”ด้วยเส้นตาราง" +msgstr "เข้าหาเส้นà¸à¸£à¸´à¸”" #: editor/plugins/texture_region_editor_plugin.cpp msgid "Auto Slice" @@ -8177,9 +7868,8 @@ msgid "Remove All" msgstr "ลบทั้งหมด" #: editor/plugins/theme_editor_plugin.cpp -#, fuzzy msgid "Edit Theme" -msgstr "à¹à¸à¹‰à¹„ขธีม..." +msgstr "à¹à¸à¹‰à¹„ขธีม" #: editor/plugins/theme_editor_plugin.cpp msgid "Theme editing menu." @@ -8211,9 +7901,8 @@ msgid "Toggle Button" msgstr "ปุ่มเมาส์" #: editor/plugins/theme_editor_plugin.cpp -#, fuzzy msgid "Disabled Button" -msgstr "เมาส์à¸à¸¥à¸²à¸‡" +msgstr "ปิดà¸à¸²à¸£à¸—ำงานปุ่ม" #: editor/plugins/theme_editor_plugin.cpp msgid "Item" @@ -8248,17 +7937,15 @@ msgstr "" #: editor/plugins/theme_editor_plugin.cpp msgid "Submenu" -msgstr "" +msgstr "เมนูย่à¸à¸¢" #: editor/plugins/theme_editor_plugin.cpp -#, fuzzy msgid "Subitem 1" -msgstr "ไà¸à¹€à¸—ม" +msgstr "ไà¸à¹€à¸—มย่à¸à¸¢ 1" #: editor/plugins/theme_editor_plugin.cpp -#, fuzzy msgid "Subitem 2" -msgstr "ไà¸à¹€à¸—ม" +msgstr "ไà¸à¹€à¸—มย่à¸à¸¢ 2" #: editor/plugins/theme_editor_plugin.cpp msgid "Has" @@ -8286,18 +7973,16 @@ msgid "Tab 3" msgstr "à¹à¸—็บ 3" #: editor/plugins/theme_editor_plugin.cpp -#, fuzzy msgid "Editable Item" -msgstr "à¹à¸à¹‰à¹„ขโหนดลูà¸à¹„ด้" +msgstr "ไà¸à¹€à¸—มที่สามารถà¹à¸à¹‰à¹„ขได้" #: editor/plugins/theme_editor_plugin.cpp msgid "Subtree" -msgstr "" +msgstr "ผังย่à¸à¸¢" #: editor/plugins/theme_editor_plugin.cpp -#, fuzzy msgid "Has,Many,Options" -msgstr "มี,มาà¸à¸¡à¸²à¸¢,หลาย,ตัวเลืà¸à¸!" +msgstr "มี,หลาย,ตัวเลืà¸à¸" #: editor/plugins/theme_editor_plugin.cpp msgid "Data Type:" @@ -8321,28 +8006,25 @@ msgid "Color" msgstr "สี" #: editor/plugins/theme_editor_plugin.cpp -#, fuzzy msgid "Theme File" -msgstr "ธีม" +msgstr "ไฟล์ธีม" #: editor/plugins/tile_map_editor_plugin.cpp msgid "Erase Selection" msgstr "ลบที่เลืà¸à¸" #: editor/plugins/tile_map_editor_plugin.cpp -#, fuzzy msgid "Fix Invalid Tiles" -msgstr "ชื่à¸à¸œà¸´à¸”พลาด" +msgstr "à¹à¸à¹‰à¹„ขไทล์ที่ไม่ถูà¸à¸•้à¸à¸‡" #: editor/plugins/tile_map_editor_plugin.cpp #: modules/gridmap/grid_map_editor_plugin.cpp -#, fuzzy msgid "Cut Selection" -msgstr "ให้สิ่งที่เลืà¸à¸à¸à¸¢à¸¹à¹ˆà¸à¸¥à¸²à¸‡à¸ˆà¸" +msgstr "ตัดที่เลืà¸à¸" #: editor/plugins/tile_map_editor_plugin.cpp msgid "Paint TileMap" -msgstr "วาด TileMap" +msgstr "วาดไทล์à¹à¸¡à¸ž" #: editor/plugins/tile_map_editor_plugin.cpp msgid "Line Draw" @@ -8354,16 +8036,15 @@ msgstr "วาดสี่เหลี่ยม" #: editor/plugins/tile_map_editor_plugin.cpp msgid "Bucket Fill" -msgstr "ถมเต็ม" +msgstr "เทสี" #: editor/plugins/tile_map_editor_plugin.cpp msgid "Erase TileMap" -msgstr "ลบ TileMap" +msgstr "ลบไทล์à¹à¸¡à¸ž" #: editor/plugins/tile_map_editor_plugin.cpp -#, fuzzy msgid "Find Tile" -msgstr "ค้นหา tile" +msgstr "ค้นหาไทล์" #: editor/plugins/tile_map_editor_plugin.cpp msgid "Transpose" @@ -8375,14 +8056,12 @@ msgid "Disable Autotile" msgstr "Autotiles" #: editor/plugins/tile_map_editor_plugin.cpp -#, fuzzy msgid "Enable Priority" -msgstr "à¹à¸à¹‰à¹„ขตัวà¸à¸£à¸à¸‡" +msgstr "เปิดà¸à¸²à¸£à¸ˆà¸±à¸”ลำดับความสำคัà¸" #: editor/plugins/tile_map_editor_plugin.cpp -#, fuzzy msgid "Filter tiles" -msgstr "คัดà¸à¸£à¸à¸‡à¹„ฟล์..." +msgstr "ตัวà¸à¸£à¸à¸‡à¹„ทล์" #: editor/plugins/tile_map_editor_plugin.cpp msgid "Give a TileSet resource to this TileMap to use its tiles." @@ -8390,35 +8069,35 @@ msgstr "" #: editor/plugins/tile_map_editor_plugin.cpp msgid "Paint Tile" -msgstr "วาด Tile" +msgstr "วาดไทล์" #: editor/plugins/tile_map_editor_plugin.cpp msgid "" "Shift+LMB: Line Draw\n" "Shift+Ctrl+LMB: Rectangle Paint" msgstr "" +"Shift+LMB: วาดเส้น\n" +"Shift+Ctrl+LMB: วาดสี่เหลี่ยม" #: editor/plugins/tile_map_editor_plugin.cpp msgid "Pick Tile" -msgstr "เลืà¸à¸ Tile" +msgstr "เลืà¸à¸à¹„ทล์" #: editor/plugins/tile_map_editor_plugin.cpp -#, fuzzy msgid "Rotate Left" -msgstr "โหมดหมุน" +msgstr "หมุนซ้าย" #: editor/plugins/tile_map_editor_plugin.cpp -#, fuzzy msgid "Rotate Right" -msgstr "ย้ายไปขวา" +msgstr "หมุนขวา" #: editor/plugins/tile_map_editor_plugin.cpp msgid "Flip Horizontally" -msgstr "" +msgstr "พลิà¸à¹à¸™à¸§à¸™à¸à¸™" #: editor/plugins/tile_map_editor_plugin.cpp msgid "Flip Vertically" -msgstr "" +msgstr "พลิà¸à¹à¸™à¸§à¸•ั้ง" #: editor/plugins/tile_map_editor_plugin.cpp #, fuzzy @@ -8426,14 +8105,12 @@ msgid "Clear Transform" msgstr "เคลื่à¸à¸™à¸¢à¹‰à¸²à¸¢" #: editor/plugins/tile_set_editor_plugin.cpp -#, fuzzy msgid "Add Texture(s) to TileSet." -msgstr "เพิ่มโหนดจาà¸à¸œà¸±à¸‡" +msgstr "เพิ่มเทà¸à¹€à¸ˆà¸à¸£à¹Œà¹ƒà¸«à¹‰à¹„ทล์เซต" #: editor/plugins/tile_set_editor_plugin.cpp -#, fuzzy msgid "Remove selected Texture from TileSet." -msgstr "ลบรายà¸à¸²à¸£" +msgstr "ลบเทà¸à¹€à¸ˆà¸à¸£à¹Œà¸—ี่เลืà¸à¸à¸ˆà¸²à¸à¹„ทล์เซต" #: editor/plugins/tile_set_editor_plugin.cpp msgid "Create from Scene" @@ -8445,7 +8122,7 @@ msgstr "รวมจาà¸à¸‰à¸²à¸" #: editor/plugins/tile_set_editor_plugin.cpp msgid "New Single Tile" -msgstr "" +msgstr "ไทล์เดี่ยวใหม่" #: editor/plugins/tile_set_editor_plugin.cpp #, fuzzy @@ -8458,22 +8135,20 @@ msgid "New Atlas" msgstr "%s ใหม่" #: editor/plugins/tile_set_editor_plugin.cpp -#, fuzzy msgid "Next Coordinate" -msgstr "ไปชั้นบน" +msgstr "พิà¸à¸±à¸”ถัดไป" #: editor/plugins/tile_set_editor_plugin.cpp msgid "Select the next shape, subtile, or Tile." -msgstr "" +msgstr "เลืà¸à¸à¸£à¸¹à¸›à¸£à¹ˆà¸²à¸‡, ไทล์ย่à¸à¸¢ หรืà¸à¹„ทล์à¸à¸±à¸™à¸–ัดไป" #: editor/plugins/tile_set_editor_plugin.cpp -#, fuzzy msgid "Previous Coordinate" -msgstr "ไปชั้นล่าง" +msgstr "พิà¸à¸±à¸”à¸à¹ˆà¸à¸™à¸«à¸™à¹‰à¸²" #: editor/plugins/tile_set_editor_plugin.cpp msgid "Select the previous shape, subtile, or Tile." -msgstr "" +msgstr "เลืà¸à¸à¸£à¸¹à¸›à¸£à¹ˆà¸²à¸‡, ไทล์ย่à¸à¸¢à¸«à¸£à¸·à¸à¹„ทล์à¸à¹ˆà¸à¸™à¸«à¸™à¹‰à¸²" #: editor/plugins/tile_set_editor_plugin.cpp #, fuzzy @@ -8481,9 +8156,8 @@ msgid "Region" msgstr "โหมดà¸à¸²à¸£à¸—ำงาน:" #: editor/plugins/tile_set_editor_plugin.cpp -#, fuzzy msgid "Collision" -msgstr "โหนดà¹à¸à¸™à¸´à¹€à¸¡à¸Šà¸±à¸™" +msgstr "ขà¸à¸šà¹€à¸‚ตà¸à¸²à¸£à¸Šà¸™" #: editor/plugins/tile_set_editor_plugin.cpp #, fuzzy @@ -8501,9 +8175,8 @@ msgid "Bitmask" msgstr "โหมดหมุน" #: editor/plugins/tile_set_editor_plugin.cpp -#, fuzzy msgid "Priority" -msgstr "วิธีà¸à¸²à¸£à¸ªà¹ˆà¸‡à¸à¸à¸:" +msgstr "à¸à¸²à¸£à¸ˆà¸±à¸”ลำดับความสำคัà¸" #: editor/plugins/tile_set_editor_plugin.cpp #, fuzzy @@ -8516,9 +8189,8 @@ msgid "Region Mode" msgstr "โหมดà¸à¸²à¸£à¸—ำงาน:" #: editor/plugins/tile_set_editor_plugin.cpp -#, fuzzy msgid "Collision Mode" -msgstr "โหนดà¹à¸à¸™à¸´à¹€à¸¡à¸Šà¸±à¸™" +msgstr "โหมดขà¸à¸šà¹€à¸‚ตà¸à¸²à¸£à¸Šà¸™" #: editor/plugins/tile_set_editor_plugin.cpp #, fuzzy @@ -8536,14 +8208,12 @@ msgid "Bitmask Mode" msgstr "โหมดหมุน" #: editor/plugins/tile_set_editor_plugin.cpp -#, fuzzy msgid "Priority Mode" -msgstr "วิธีà¸à¸²à¸£à¸ªà¹ˆà¸‡à¸à¸à¸:" +msgstr "โหมดà¸à¸²à¸£à¸ˆà¸±à¸”ลำดับความสำคัà¸" #: editor/plugins/tile_set_editor_plugin.cpp -#, fuzzy msgid "Icon Mode" -msgstr "โหมดมุมมà¸à¸‡" +msgstr "โหมดไà¸à¸„à¸à¸™" #: editor/plugins/tile_set_editor_plugin.cpp #, fuzzy @@ -8565,26 +8235,24 @@ msgid "Erase bitmask." msgstr "คลิà¸à¸‚วา: ลบจุด" #: editor/plugins/tile_set_editor_plugin.cpp -#, fuzzy msgid "Create a new rectangle." -msgstr "สร้าง %s ใหม่" +msgstr "สร้างสี่เหลี่ยมใหม่" #: editor/plugins/tile_set_editor_plugin.cpp -#, fuzzy msgid "Create a new polygon." -msgstr "สร้างรูปหลายเหลี่ยมจาà¸à¸„วามว่างเปล่า" +msgstr "สร้างรูปหลายเหลี่ยมใหม่" #: editor/plugins/tile_set_editor_plugin.cpp msgid "Keep polygon inside region Rect." -msgstr "" +msgstr "ให้รูปหลายเหลี่ยมà¸à¸¢à¸¹à¹ˆà¹ƒà¸™à¸‚à¸à¸šà¹€à¸‚ตขà¸à¸‡à¸ªà¸µà¹ˆà¹€à¸«à¸¥à¸µà¹ˆà¸¢à¸¡" #: editor/plugins/tile_set_editor_plugin.cpp msgid "Enable snap and show grid (configurable via the Inspector)." -msgstr "" +msgstr "โชว์เส้นà¸à¸£à¸´à¸” à¹à¸¥à¸° จุดตามà¸à¸£à¸´à¸” (ตั้งค่าใน Inspector)" #: editor/plugins/tile_set_editor_plugin.cpp msgid "Display Tile Names (Hold Alt Key)" -msgstr "" +msgstr "à¹à¸ªà¸”งชื่à¸à¹„ทล์ (à¸à¸”Altค้างไว้)" #: editor/plugins/tile_set_editor_plugin.cpp msgid "" @@ -8609,13 +8277,12 @@ msgid "Merge from scene?" msgstr "รวมจาà¸à¸‰à¸²à¸?" #: editor/plugins/tile_set_editor_plugin.cpp -#, fuzzy msgid "Remove Texture" -msgstr "ลบà¹à¸¡à¹ˆà¹à¸šà¸š" +msgstr "ลบเทà¸à¹€à¸ˆà¸à¸£à¹Œ" #: editor/plugins/tile_set_editor_plugin.cpp msgid "%s file(s) were not added because was already on the list." -msgstr "" +msgstr "%s ไฟล์ไม่สามารถเพิ่มเข้าได้ เนื่à¸à¸‡à¸ˆà¸²à¸à¸à¸¢à¸¹à¹ˆà¹ƒà¸™à¸¥à¸´à¸ªà¸•์เรียบร้à¸à¸¢à¹à¸¥à¹‰à¸§" #: editor/plugins/tile_set_editor_plugin.cpp msgid "" @@ -8636,20 +8303,20 @@ msgid "" msgstr "เลืà¸à¸à¹„ทล์ย่à¸à¸¢à¸—ี่à¸à¸³à¸¥à¸±à¸‡à¸›à¸£à¸±à¸šà¹à¸•่ง" #: editor/plugins/tile_set_editor_plugin.cpp -#, fuzzy msgid "Delete polygon." -msgstr "ลบจุด" +msgstr "ลบรูปหลายเหลี่ยม" #: editor/plugins/tile_set_editor_plugin.cpp -#, fuzzy msgid "" "LMB: Set bit on.\n" "RMB: Set bit off.\n" "Shift+LMB: Set wildcard bit.\n" "Click on another Tile to edit it." msgstr "" -"คลิà¸à¸‹à¹‰à¸²à¸¢: à¸à¸³à¸«à¸™à¸”ค่าบิต เปิด\n" -"คลิà¸à¸‚วา: à¸à¸³à¸«à¸™à¸”ค่าบิต ปิด" +"คลิà¸à¸‹à¹‰à¸²à¸¢: เปิด bit.\n" +"คลิà¸à¸‚วา: ปิด bit.\n" +"Shift+คลิà¸à¸‹à¹‰à¸²à¸¢: ตั้ง wildcard bit.\n" +"คลิà¸à¹„ทล์à¸à¸±à¸™à¸à¸·à¹ˆà¸™à¹€à¸žà¸·à¹ˆà¸à¸›à¸£à¸±à¸šà¹à¸•่ง" #: editor/plugins/tile_set_editor_plugin.cpp #, fuzzy @@ -8660,11 +8327,12 @@ msgid "" msgstr "เลืà¸à¸à¸£à¸¹à¸›à¸ าพย่à¸à¸¢à¹€à¸žà¸·à¹ˆà¸à¸—ำเป็นไà¸à¸„à¸à¸™ ภาพนี้จะใช้à¹à¸ªà¸”งเมื่à¸à¸à¸²à¸£" #: editor/plugins/tile_set_editor_plugin.cpp -#, fuzzy msgid "" "Select sub-tile to change its priority.\n" "Click on another Tile to edit it." -msgstr "เลืà¸à¸à¹„ทล์ย่à¸à¸¢à¹€à¸žà¸·à¹ˆà¸à¸ˆà¸±à¸”ลำดับความสำคัà¸" +msgstr "" +"เลืà¸à¸à¹„ทล์ย่à¸à¸¢à¹€à¸žà¸·à¹ˆà¸à¸ˆà¸±à¸”ลำดับความสำคัà¸\n" +"คลิà¸à¹„ทล์à¸à¸±à¸™à¸à¸·à¹ˆà¸™à¹€à¸žà¸·à¹ˆà¸à¹à¸à¹‰à¹„ขไทล์นั้น" #: editor/plugins/tile_set_editor_plugin.cpp #, fuzzy @@ -8674,18 +8342,16 @@ msgid "" msgstr "เลืà¸à¸à¹„ทล์ย่à¸à¸¢à¹€à¸žà¸·à¹ˆà¸à¸ˆà¸±à¸”ลำดับความสำคัà¸" #: editor/plugins/tile_set_editor_plugin.cpp -#, fuzzy msgid "Set Tile Region" -msgstr "à¸à¸³à¸«à¸™à¸”ขà¸à¸šà¹€à¸‚ต Texture" +msgstr "ตั้งขà¸à¸šà¹€à¸‚ตไทล์" #: editor/plugins/tile_set_editor_plugin.cpp -#, fuzzy msgid "Create Tile" -msgstr "สร้างโฟลเดà¸à¸£à¹Œ" +msgstr "สร้างไทล์" #: editor/plugins/tile_set_editor_plugin.cpp msgid "Set Tile Icon" -msgstr "" +msgstr "ตั้งไà¸à¸„à¸à¸™à¹„ทล์" #: editor/plugins/tile_set_editor_plugin.cpp #, fuzzy @@ -8727,9 +8393,8 @@ msgid "Make Polygon Convex" msgstr "ย้ายรูปหลายเหลี่ยม" #: editor/plugins/tile_set_editor_plugin.cpp -#, fuzzy msgid "Remove Tile" -msgstr "ลบà¹à¸¡à¹ˆà¹à¸šà¸š" +msgstr "ลบไทล์" #: editor/plugins/tile_set_editor_plugin.cpp #, fuzzy @@ -8747,13 +8412,12 @@ msgid "Remove Navigation Polygon" msgstr "สร้างรูปทรงนำทาง" #: editor/plugins/tile_set_editor_plugin.cpp -#, fuzzy msgid "Edit Tile Priority" -msgstr "à¹à¸à¹‰à¹„ขตัวà¸à¸£à¸à¸‡" +msgstr "à¹à¸à¹‰à¸¥à¸³à¸”ับความสำคัà¸à¸‚à¸à¸‡à¹„ทล์" #: editor/plugins/tile_set_editor_plugin.cpp msgid "Edit Tile Z Index" -msgstr "" +msgstr "à¹à¸à¹‰à¹„ขดัชนี Z ขà¸à¸‡à¹„ทล์" #: editor/plugins/tile_set_editor_plugin.cpp #, fuzzy @@ -8761,14 +8425,12 @@ msgid "Make Convex" msgstr "ย้ายรูปหลายเหลี่ยม" #: editor/plugins/tile_set_editor_plugin.cpp -#, fuzzy msgid "Make Concave" -msgstr "ย้ายรูปหลายเหลี่ยม" +msgstr "ทำให้เว้า" #: editor/plugins/tile_set_editor_plugin.cpp -#, fuzzy msgid "Create Collision Polygon" -msgstr "สร้างรูปทรงนำทาง" +msgstr "สร้างรูปหลายเหลี่ยมขà¸à¸‡à¹€à¸‚ตà¸à¸²à¸£à¸Šà¸™" #: editor/plugins/tile_set_editor_plugin.cpp #, fuzzy @@ -8776,18 +8438,16 @@ msgid "Create Occlusion Polygon" msgstr "สร้างรูปหลายเหลี่ยมà¸à¸±à¹‰à¸™à¹à¸ªà¸‡" #: editor/plugins/tile_set_editor_plugin.cpp -#, fuzzy msgid "This property can't be changed." -msgstr "ทำไม่ได้ถ้าไม่มีฉาà¸" +msgstr "ไม่สามารถเปลี่ยนà¹à¸›à¸¥à¸‡à¸„ุณสมบัติได้" #: editor/plugins/tile_set_editor_plugin.cpp -#, fuzzy msgid "TileSet" -msgstr "Tile Set" +msgstr "ไทล์เซต" #: editor/plugins/version_control_editor_plugin.cpp msgid "No VCS addons are available." -msgstr "" +msgstr "ไม่พบส่วนเสริม VCS" #: editor/plugins/version_control_editor_plugin.cpp msgid "Error" @@ -8816,9 +8476,8 @@ msgid "Version Control System" msgstr "" #: editor/plugins/version_control_editor_plugin.cpp -#, fuzzy msgid "Initialize" -msgstr "à¸à¸±à¸à¸©à¸£à¹à¸£à¸à¸žà¸´à¸¡à¸žà¹Œà¹ƒà¸«à¸à¹ˆ" +msgstr "เริ่มต้น" #: editor/plugins/version_control_editor_plugin.cpp msgid "Staging area" @@ -8830,7 +8489,6 @@ msgid "Detect new changes" msgstr "สร้าง %s ใหม่" #: editor/plugins/version_control_editor_plugin.cpp -#, fuzzy msgid "Changes" msgstr "เปลี่ยน" @@ -8839,14 +8497,12 @@ msgid "Modified" msgstr "" #: editor/plugins/version_control_editor_plugin.cpp -#, fuzzy msgid "Renamed" -msgstr "เปลี่ยนชื่à¸" +msgstr "เปลี่ยนชื่à¸à¹à¸¥à¹‰à¸§" #: editor/plugins/version_control_editor_plugin.cpp -#, fuzzy msgid "Deleted" -msgstr "ลบ" +msgstr "ลบà¹à¸¥à¹‰à¸§" #: editor/plugins/version_control_editor_plugin.cpp #, fuzzy @@ -8892,26 +8548,23 @@ msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp msgid "(GLES3 only)" -msgstr "" +msgstr "(GLES3 เท่านั้น)" #: editor/plugins/visual_shader_editor_plugin.cpp -#, fuzzy msgid "Add Output" -msgstr "เพิ่มà¸à¸´à¸™à¸žà¸¸à¸•" +msgstr "เพิ่มเà¸à¸²à¸—์พุต" #: editor/plugins/visual_shader_editor_plugin.cpp -#, fuzzy msgid "Scalar" -msgstr "à¸à¸±à¸•ราส่วน:" +msgstr "สเà¸à¸¥à¸²à¸£à¹Œ" #: editor/plugins/visual_shader_editor_plugin.cpp -#, fuzzy msgid "Vector" -msgstr "คุณสมบัติ" +msgstr "เวà¸à¹€à¸•à¸à¸£à¹Œ" #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Boolean" -msgstr "" +msgstr "บูลีน" #: editor/plugins/visual_shader_editor_plugin.cpp #, fuzzy @@ -8919,43 +8572,36 @@ msgid "Sampler" msgstr "ไฟล์เสียง" #: editor/plugins/visual_shader_editor_plugin.cpp -#, fuzzy msgid "Add input port" -msgstr "เพิ่มà¸à¸´à¸™à¸žà¸¸à¸•" +msgstr "เพิ่มพà¸à¸£à¹Œà¸•à¸à¸´à¸™à¸žà¸¸à¸•" #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Add output port" -msgstr "" +msgstr "เพิ่มพà¸à¸£à¹Œà¸•เà¸à¸²à¸•์พุต" #: editor/plugins/visual_shader_editor_plugin.cpp -#, fuzzy msgid "Change input port type" -msgstr "เปลี่ยนประเภท" +msgstr "เปลี่ยนชนิดพà¸à¸£à¹Œà¸•à¸à¸´à¸™à¸žà¸¸à¸•" #: editor/plugins/visual_shader_editor_plugin.cpp -#, fuzzy msgid "Change output port type" -msgstr "เปลี่ยนประเภท" +msgstr "เปลี่ยนชนิดพà¸à¸£à¹Œà¸•เà¸à¸²à¸•์พุต" #: editor/plugins/visual_shader_editor_plugin.cpp -#, fuzzy msgid "Change input port name" -msgstr "เปลี่ยนชื่à¸à¸à¸´à¸™à¸žà¸¸à¸•" +msgstr "เปลี่ยนชื่à¸à¸žà¸à¸£à¹Œà¸•à¸à¸´à¸™à¸žà¸¸à¸•" #: editor/plugins/visual_shader_editor_plugin.cpp -#, fuzzy msgid "Change output port name" -msgstr "เปลี่ยนชื่à¸à¸à¸´à¸™à¸žà¸¸à¸•" +msgstr "เปลี่ยนชื่à¸à¸žà¸à¸£à¹Œà¸•เà¸à¸²à¸•์พุต" #: editor/plugins/visual_shader_editor_plugin.cpp -#, fuzzy msgid "Remove input port" -msgstr "ลบจุด" +msgstr "ลบพà¸à¸£à¹Œà¸•à¸à¸´à¸™à¸žà¸¸à¸•" #: editor/plugins/visual_shader_editor_plugin.cpp -#, fuzzy msgid "Remove output port" -msgstr "ลบจุด" +msgstr "ลบพà¸à¸£à¹Œà¸•เà¸à¸²à¸•์พุต" #: editor/plugins/visual_shader_editor_plugin.cpp #, fuzzy @@ -8963,26 +8609,22 @@ msgid "Set expression" msgstr "à¹à¸à¹‰à¹„ขสมà¸à¸²à¸£" #: editor/plugins/visual_shader_editor_plugin.cpp -#, fuzzy msgid "Resize VisualShader node" -msgstr "Shader" +msgstr "ปรับขนาดโหนดเวà¸à¸£à¹Œà¸Šà¸§à¸¥à¹€à¸Šà¸”เดà¸à¸£à¹Œ" #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Set Uniform Name" -msgstr "" +msgstr "ตั้งชื่à¸à¸¢à¸¹à¸™à¸´à¸Ÿà¸à¸£à¹Œà¸¡" #: editor/plugins/visual_shader_editor_plugin.cpp -#, fuzzy msgid "Set Input Default Port" -msgstr "à¸à¸³à¸«à¸™à¸”เป็นค่าเริ่มต้นขà¸à¸‡ '%s'" +msgstr "à¸à¸³à¸«à¸™à¸”พà¸à¸£à¹Œà¸•à¸à¸´à¸™à¸žà¸¸à¸•เริ่มต้น" #: editor/plugins/visual_shader_editor_plugin.cpp -#, fuzzy msgid "Add Node to Visual Shader" -msgstr "Shader" +msgstr "เพิ่มโหนดไปยังเวà¸à¸£à¹Œà¸Šà¸§à¸¥à¹€à¸Šà¸”เดà¸à¸£à¹Œ" #: editor/plugins/visual_shader_editor_plugin.cpp -#, fuzzy msgid "Duplicate Nodes" msgstr "ทำซ้ำโหนด" @@ -8992,13 +8634,12 @@ msgid "Paste Nodes" msgstr "วางโหนด" #: editor/plugins/visual_shader_editor_plugin.cpp -#, fuzzy msgid "Delete Nodes" msgstr "ลบโหนด" #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Visual Shader Input Type Changed" -msgstr "" +msgstr "เปลี่ยนชนิดขà¸à¸‡à¸à¸´à¸™à¸žà¸¸à¸•เวà¸à¸£à¹Œà¸Šà¸§à¸¥à¹€à¸Šà¸”เดà¸à¸£à¹Œ" #: editor/plugins/visual_shader_editor_plugin.cpp #, fuzzy @@ -9006,9 +8647,8 @@ msgid "Vertex" msgstr "มุมรูปทรง" #: editor/plugins/visual_shader_editor_plugin.cpp -#, fuzzy msgid "Fragment" -msgstr "ตัวà¹à¸›à¸£:" +msgstr "à¹à¸Ÿà¸£à¸à¹€à¸¡à¸™à¸•์" #: editor/plugins/visual_shader_editor_plugin.cpp #, fuzzy @@ -9021,44 +8661,40 @@ msgid "Show resulted shader code." msgstr "สร้างโหนด" #: editor/plugins/visual_shader_editor_plugin.cpp -#, fuzzy msgid "Create Shader Node" -msgstr "สร้างโหนด" +msgstr "สร้างโหนดเชดเดà¸à¸£à¹Œ" #: editor/plugins/visual_shader_editor_plugin.cpp -#, fuzzy msgid "Color function." -msgstr "ไปยังฟังà¸à¹Œà¸Šà¸±à¸™..." +msgstr "ฟังà¸à¹Œà¸Šà¸±à¸™à¸ªà¸µ" #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Color operator." -msgstr "" +msgstr "à¸à¸²à¸£à¸”ำเนินà¸à¸²à¸£à¸ªà¸µ" #: editor/plugins/visual_shader_editor_plugin.cpp -#, fuzzy msgid "Grayscale function." -msgstr "สร้างฟังà¸à¹Œà¸Šà¸±à¸™" +msgstr "ฟังà¸à¹Œà¸Šà¸±à¸™à¸‚าว-ดำ" #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Converts HSV vector to RGB equivalent." -msgstr "" +msgstr "à¹à¸›à¸¥à¸‡à¹€à¸§à¸à¹€à¸•à¸à¸£à¹Œ HSV เป็น RGB" #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Converts RGB vector to HSV equivalent." -msgstr "" +msgstr "à¹à¸›à¸¥à¸‡à¹€à¸§à¸à¹€à¸•à¸à¸£à¹Œ RGB เป็น HSV" #: editor/plugins/visual_shader_editor_plugin.cpp -#, fuzzy msgid "Sepia function." -msgstr "เปลี่ยนชื่à¸à¸Ÿà¸±à¸‡à¸à¹Œà¸Šà¸±à¸™" +msgstr "ฟังà¸à¹Œà¸Šà¸±à¸™à¸‹à¸µà¹€à¸›à¸µà¸¢" #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Burn operator." -msgstr "" +msgstr "ดำเนินà¸à¸²à¸£ Burn" #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Darken operator." -msgstr "" +msgstr "ดำเนินà¸à¸²à¸£ Darken" #: editor/plugins/visual_shader_editor_plugin.cpp #, fuzzy @@ -9067,7 +8703,7 @@ msgstr "เฉพาะที่à¹à¸•à¸à¸•่าง" #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Dodge operator." -msgstr "" +msgstr "ดำเนินà¸à¸²à¸£ Dodge" #: editor/plugins/visual_shader_editor_plugin.cpp #, fuzzy @@ -9076,19 +8712,19 @@ msgstr "à¹à¸à¹‰à¹„ขเครื่à¸à¸‡à¸«à¸¡à¸²à¸¢à¸ªà¹€à¸à¸¥à¸²à¸£à¹Œ" #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Lighten operator." -msgstr "" +msgstr "ดำเนินà¸à¸²à¸£ Lighten" #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Overlay operator." -msgstr "" +msgstr "ดำเนินà¸à¸²à¸£ Overlay" #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Screen operator." -msgstr "" +msgstr "ดำเนินà¸à¸²à¸£ Screen" #: editor/plugins/visual_shader_editor_plugin.cpp msgid "SoftLight operator." -msgstr "" +msgstr "ดำเนินà¸à¸²à¸£ SoftLight" #: editor/plugins/visual_shader_editor_plugin.cpp #, fuzzy @@ -9102,165 +8738,161 @@ msgstr "เคลื่à¸à¸™à¸¢à¹‰à¸²à¸¢" #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Returns the boolean result of the %s comparison between two parameters." -msgstr "" +msgstr "คืนค่าผลบูลีนจาà¸à¸à¸²à¸£à¹€à¸›à¸£à¸µà¸¢à¸šà¹€à¸—ียบระหว่างสà¸à¸‡à¸•ัวà¹à¸›à¸£à¸‚à¸à¸‡ %s" #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Equal (==)" -msgstr "" +msgstr "เทียบเท่า (==)" #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Greater Than (>)" -msgstr "" +msgstr "มาà¸à¸à¸§à¹ˆà¸² (>)" #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Greater Than or Equal (>=)" -msgstr "" +msgstr "มาà¸à¸à¸§à¹ˆà¸²à¸«à¸£à¸·à¸à¹€à¸—่าà¸à¸±à¸š (>=)" #: editor/plugins/visual_shader_editor_plugin.cpp msgid "" "Returns an associated vector if the provided scalars are equal, greater or " "less." -msgstr "" +msgstr "คืนค่าเวà¸à¹€à¸•à¸à¸£à¹Œà¸—ี่เà¸à¸µà¹ˆà¸¢à¸§à¸‚้à¸à¸‡à¸–้าสเà¸à¸¥à¸²à¸£à¹Œà¸—ี่ให้มีค่าเท่าà¸à¸±à¸š มาà¸à¸à¸§à¹ˆà¸²à¸«à¸£à¸·à¸à¸™à¹‰à¸à¸¢à¸à¸§à¹ˆà¸²" #: editor/plugins/visual_shader_editor_plugin.cpp msgid "" "Returns the boolean result of the comparison between INF and a scalar " "parameter." -msgstr "" +msgstr "คืนค่าบูลีนจาà¸à¸à¸²à¸£à¹€à¸›à¸£à¸µà¸¢à¸šà¹€à¸—ียบค่า INF à¸à¸±à¸šà¸žà¸²à¸£à¸²à¸¡à¸´à¹€à¸•à¸à¸£à¹Œà¸Šà¸™à¸´à¸”สเà¸à¸¥à¸²à¸£à¹Œ" #: editor/plugins/visual_shader_editor_plugin.cpp msgid "" "Returns the boolean result of the comparison between NaN and a scalar " "parameter." -msgstr "" +msgstr "คืนค่าบูลีนซึ่งเปรียบเทียบค่าระหว่าง NaN à¸à¸±à¸šà¸žà¸²à¸£à¸²à¸¡à¸´à¹€à¸•à¸à¸£à¹Œà¸ªà¹€à¸à¸¥à¸²à¸£à¹Œ" #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Less Than (<)" -msgstr "" +msgstr "น้à¸à¸¢à¸à¸§à¹ˆà¸²(<)" #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Less Than or Equal (<=)" -msgstr "" +msgstr "น้à¸à¸¢à¸à¸§à¹ˆà¸²à¸«à¸£à¸·à¸à¹€à¸—่าà¸à¸±à¸š(<=)" #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Not Equal (!=)" -msgstr "" +msgstr "ไม่เท่าà¸à¸±à¸š (!=)" #: editor/plugins/visual_shader_editor_plugin.cpp msgid "" "Returns an associated vector if the provided boolean value is true or false." -msgstr "" +msgstr "คืนค่าเวà¸à¹€à¸•à¸à¸£à¹Œà¸—ี่เà¸à¸µà¹ˆà¸¢à¸§à¸‚้à¸à¸‡à¸–้าบูลีนที่ให้มีค่าเท่าà¸à¸±à¸š true หรืภfalse" #: editor/plugins/visual_shader_editor_plugin.cpp msgid "" "Returns an associated scalar if the provided boolean value is true or false." -msgstr "" +msgstr "คืนค่าสเà¸à¸¥à¸²à¸£à¹Œà¸—ี่เà¸à¸µà¹ˆà¸¢à¸§à¸‚้à¸à¸‡à¸–้าต่าบูลีนที่ให้มีค่า true หรืภfalse" #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Returns the boolean result of the comparison between two parameters." -msgstr "" +msgstr "คืนค่าบูลีนจาà¸à¸à¸²à¸£à¹€à¸›à¸£à¸µà¸¢à¸šà¹€à¸—ียบพารามิเตà¸à¸£à¹Œà¸ªà¸à¸‡à¸•ัว" #: editor/plugins/visual_shader_editor_plugin.cpp msgid "" "Returns the boolean result of the comparison between INF (or NaN) and a " "scalar parameter." -msgstr "" +msgstr "คืนค่าบูลีนจาà¸à¸à¸²à¸£à¹€à¸›à¸£à¸µà¸¢à¸šà¹€à¸—ียบค่า INF (หรืภNaN) à¹à¸¥à¸°à¸žà¸²à¸£à¸²à¸¡à¸´à¹€à¸•à¸à¸£à¹Œà¸ªà¹€à¸à¸¥à¸²à¸£à¹Œ" #: editor/plugins/visual_shader_editor_plugin.cpp -#, fuzzy msgid "Boolean constant." -msgstr "à¹à¸à¹‰à¹„ขค่าคงที่เวà¸à¹€à¸•à¸à¸£à¹Œ" +msgstr "ค่าคงที่บูลีน" #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Boolean uniform." -msgstr "" +msgstr "ยูนิฟà¸à¸£à¹Œà¸¡à¸šà¸¹à¸¥à¸µà¸™" #: editor/plugins/visual_shader_editor_plugin.cpp msgid "'%s' input parameter for all shader modes." -msgstr "" +msgstr "'%s' พารามิเตà¸à¸£à¹Œà¸‚à¸à¸‡à¸à¸´à¸™à¸žà¸¸à¸•สำหรับโหมดเชดเดà¸à¸£à¹Œà¸—ั้งหมด" #: editor/plugins/visual_shader_editor_plugin.cpp -#, fuzzy msgid "Input parameter." -msgstr "จำà¸à¸±à¸”ด้วยโหนดà¹à¸¡à¹ˆ" +msgstr "พารามิเตà¸à¸£à¹Œà¸à¸´à¸™à¸žà¸¸à¸•" #: editor/plugins/visual_shader_editor_plugin.cpp msgid "'%s' input parameter for vertex and fragment shader modes." -msgstr "" +msgstr "'%s' พารามิเตà¸à¸£à¹Œà¸à¸´à¸™à¸žà¸¸à¸•สำหรับโหมดเวà¸à¸£à¹Œà¹€à¸—็à¸à¸‹à¹Œà¹€à¸Šà¸”เดà¸à¸£à¹Œà¹à¸¥à¸°à¹à¸Ÿà¸£à¸à¹€à¸¡à¸™à¸•์เชดเดà¸à¸£à¹Œ" #: editor/plugins/visual_shader_editor_plugin.cpp msgid "'%s' input parameter for fragment and light shader modes." -msgstr "" +msgstr "'%s' พารามิเตà¸à¸£à¹Œà¸à¸´à¸™à¸žà¸¸à¸•สำหรับโหมดà¹à¸Ÿà¸£à¸à¹€à¸¡à¸™à¸•์เชดเดà¸à¸£à¹Œà¹à¸¥à¸°à¹‚หมดไลท์เชดเดà¸à¸£à¹Œ" #: editor/plugins/visual_shader_editor_plugin.cpp msgid "'%s' input parameter for fragment shader mode." -msgstr "" +msgstr "'%s' พารามิเตà¸à¸£à¹Œà¸à¸´à¸™à¸žà¸¸à¸•สำหรับโหมดà¹à¸Ÿà¸£à¸à¹€à¸¡à¸™à¸•์เชดเดà¸à¸£à¹Œ" #: editor/plugins/visual_shader_editor_plugin.cpp msgid "'%s' input parameter for light shader mode." -msgstr "" +msgstr "'%s' พารามิเตà¸à¸£à¹Œà¸à¸´à¸™à¸žà¸¸à¸•สำหรับโหมดไลท์เชดเดà¸à¸£à¹Œ" #: editor/plugins/visual_shader_editor_plugin.cpp msgid "'%s' input parameter for vertex shader mode." -msgstr "" +msgstr "'%s' พารามิเตà¸à¸£à¹Œà¸à¸´à¸™à¸žà¸¸à¸•สำหรับโหมดเวà¸à¸£à¹Œà¹€à¸—็à¸à¸‹à¹Œà¹€à¸Šà¸”เดà¸à¸£à¹Œ" #: editor/plugins/visual_shader_editor_plugin.cpp msgid "'%s' input parameter for vertex and fragment shader mode." -msgstr "" +msgstr "'%s' พารามิเตà¸à¸£à¹Œà¸à¸´à¸™à¸žà¸¸à¸•สำหรับโหมดเวà¸à¸£à¹Œà¹€à¸—็à¸à¸‹à¹Œà¹€à¸Šà¸”เดà¸à¸£à¹Œà¹à¸¥à¸°à¹à¸Ÿà¸£à¸à¹€à¸¡à¸™à¸•์เชดเดà¸à¸£à¹Œ" #: editor/plugins/visual_shader_editor_plugin.cpp -#, fuzzy msgid "Scalar function." -msgstr "à¹à¸à¹‰à¹„ขฟังà¸à¹Œà¸Šà¸±à¸™à¸ªà¹€à¸à¸¥à¸²à¸£à¹Œ" +msgstr "ฟังà¸à¹Œà¸Šà¸±à¸™à¸ªà¹€à¸à¸¥à¸²à¸£à¹Œ" #: editor/plugins/visual_shader_editor_plugin.cpp -#, fuzzy msgid "Scalar operator." -msgstr "à¹à¸à¹‰à¹„ขเครื่à¸à¸‡à¸«à¸¡à¸²à¸¢à¸ªà¹€à¸à¸¥à¸²à¸£à¹Œ" +msgstr "ตัวดำเนินà¸à¸²à¸£à¸ªà¹€à¸à¸¥à¸²à¸£à¹Œ" #: editor/plugins/visual_shader_editor_plugin.cpp msgid "E constant (2.718282). Represents the base of the natural logarithm." -msgstr "" +msgstr "ค่าคงที่ E (2.718282) à¹à¸ªà¸”งในรูปลà¸à¸à¸²à¸¥à¸´à¸—ึมà¸à¸²à¸™à¸˜à¸£à¸£à¸¡à¸Šà¸²à¸•ิ" #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Epsilon constant (0.00001). Smallest possible scalar number." -msgstr "" +msgstr "ค่าคงที่เà¸à¸žà¸‹à¸´à¸¥à¸à¸™ (0.00001) ค่าที่เล็à¸à¸—ี่สุดขà¸à¸‡à¸ªà¹€à¸à¸¥à¸²à¸£à¹Œ" #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Phi constant (1.618034). Golden ratio." -msgstr "" +msgstr "ค่าฟาย (1.618034) สัดส่วนทà¸à¸‡à¸„ำ" #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Pi/4 constant (0.785398) or 45 degrees." -msgstr "" +msgstr "ค่าพายส่วน 4 (0.785398) หรืภ45à¸à¸‡à¸¨à¸²" #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Pi/2 constant (1.570796) or 90 degrees." -msgstr "" +msgstr "ค่าพายส่วน2 (1.570796) หรืภ90 à¸à¸‡à¸¨à¸²" #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Pi constant (3.141593) or 180 degrees." -msgstr "" +msgstr "ค่าพาย (3.141593) หรืภ180 à¸à¸‡à¸¨à¸²" #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Tau constant (6.283185) or 360 degrees." -msgstr "" +msgstr "ค่าเทา (6.283185) หรืภ360 à¸à¸‡à¸¨à¸²" #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Sqrt2 constant (1.414214). Square root of 2." -msgstr "" +msgstr "ค่ารูท2 (1.414214)" #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Returns the absolute value of the parameter." -msgstr "" +msgstr "คืนค่าสัมบูรณ์ขà¸à¸‡à¸žà¸²à¸£à¸²à¸¡à¸´à¹€à¸•à¸à¸£à¹Œ" #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Returns the arc-cosine of the parameter." -msgstr "" +msgstr "คืนค่า arc-cosine ขà¸à¸‡à¸žà¸²à¸£à¸²à¸¡à¸´à¹€à¸•à¸à¸£à¹Œ" #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Returns the inverse hyperbolic cosine of the parameter." -msgstr "" +msgstr "คืนค่า arc cosh ขà¸à¸‡à¸žà¸²à¸£à¸²à¸¡à¸´à¹€à¸•à¸à¸£à¹Œ" #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Returns the arc-sine of the parameter." @@ -9276,121 +8908,121 @@ msgstr "คืนค่า arc tan ขà¸à¸‡à¸žà¸²à¸£à¸²à¸¡à¸´à¹€à¸•à¸à¸£à¹Œ" #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Returns the arc-tangent of the parameters." -msgstr "" +msgstr "คืนค่า arc tan ขà¸à¸‡à¸žà¸²à¸£à¸²à¸¡à¸´à¹€à¸•à¸à¸£à¹Œ" #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Returns the inverse hyperbolic tangent of the parameter." -msgstr "" +msgstr "คืนค่า tanh ขà¸à¸‡à¸žà¸²à¸£à¸²à¸¡à¸´à¹€à¸•à¸à¸£à¹Œ" #: editor/plugins/visual_shader_editor_plugin.cpp msgid "" "Finds the nearest integer that is greater than or equal to the parameter." -msgstr "" +msgstr "หาจำนวนเต็มใà¸à¸¥à¹‰à¸—ี่สุดที่มาà¸à¸à¸§à¹ˆà¸²à¸«à¸£à¸·à¸à¹€à¸—่าà¸à¸±à¸šà¸„่าพารามิเตà¸à¸£à¹Œ" #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Constrains a value to lie between two further values." -msgstr "" +msgstr "จำà¸à¸±à¸”ค่าไว้ระหว่างà¸à¸µà¸à¸ªà¸à¸‡à¸„่า" #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Returns the cosine of the parameter." -msgstr "" +msgstr "คืนค่า cos ขà¸à¸‡à¸žà¸²à¸£à¸²à¸¡à¸´à¹€à¸•à¸à¸£à¹Œ" #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Returns the hyperbolic cosine of the parameter." -msgstr "" +msgstr "คืนค่า cosh ขà¸à¸‡à¸žà¸²à¸£à¸²à¸¡à¸´à¹€à¸•à¸à¸£à¹Œ" #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Converts a quantity in radians to degrees." -msgstr "" +msgstr "à¹à¸›à¸¥à¸‡à¹€à¸£à¹€à¸”ียนเป็นà¸à¸‡à¸¨à¸²" #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Base-e Exponential." -msgstr "" +msgstr "เลขยà¸à¸à¸³à¸¥à¸±à¸‡à¸à¸²à¸™ e" #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Base-2 Exponential." -msgstr "" +msgstr "เลขยà¸à¸à¸³à¸¥à¸±à¸‡à¸à¸²à¸™ 2" #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Finds the nearest integer less than or equal to the parameter." -msgstr "" +msgstr "หาค่าจำนวนเต็มที่ใà¸à¸¥à¹‰à¸—ี่สุดที่น้à¸à¸¢à¸à¸§à¹ˆà¸²à¸«à¸£à¸·à¸à¹€à¸—่าà¸à¸±à¸šà¸žà¸²à¸£à¸²à¸¡à¸´à¹€à¸•à¸à¸£à¹Œ" #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Computes the fractional part of the argument." -msgstr "" +msgstr "คำนวณสัดส่วนจาà¸à¸à¸²à¸à¸´à¸§à¹€à¸¡à¸™à¸•์" #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Returns the inverse of the square root of the parameter." -msgstr "" +msgstr "คืนค่ารูทสà¸à¸‡à¸‚à¸à¸‡à¸žà¸²à¸£à¸²à¸¡à¸´à¹€à¸•à¸à¸£à¹Œ" #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Natural logarithm." -msgstr "" +msgstr "ลà¸à¸à¸²à¸¥à¸´à¸—ึมà¸à¸²à¸™à¸˜à¸£à¸£à¸¡à¸Šà¸²à¸•ิ" #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Base-2 logarithm." -msgstr "" +msgstr "ลà¸à¸à¸²à¸¥à¸´à¸—ึมà¸à¸²à¸™ 2" #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Returns the greater of two values." -msgstr "" +msgstr "คืนค่ามาà¸à¸ªà¸¸à¸” จาà¸à¸ªà¸à¸‡à¸„่า" #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Returns the lesser of two values." -msgstr "" +msgstr "คืนค่าน้à¸à¸¢à¸ªà¸¸à¸” จาà¸à¸ªà¸à¸‡à¸„่า" #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Linear interpolation between two scalars." -msgstr "" +msgstr "ค่าประมาณเชิงเส้นระหว่างสเà¸à¸¥à¸²à¸£à¹Œà¸ªà¸à¸‡à¸„่า" #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Returns the opposite value of the parameter." -msgstr "" +msgstr "คืนค่าตรงà¸à¸±à¸™à¸‚้ามจาà¸à¸žà¸²à¸£à¸²à¸¡à¸´à¹€à¸•à¸à¸£à¹Œ" #: editor/plugins/visual_shader_editor_plugin.cpp msgid "1.0 - scalar" -msgstr "" +msgstr "1.0 - สเà¸à¸¥à¸²à¸£à¹Œ" #: editor/plugins/visual_shader_editor_plugin.cpp msgid "" "Returns the value of the first parameter raised to the power of the second." -msgstr "" +msgstr "คืนค่าพารามิเตà¸à¸£à¹Œà¸•ัวà¹à¸£à¸à¸¢à¸à¸à¸³à¸¥à¸±à¸‡à¸”้วยพารามิเตà¸à¸£à¹Œà¸•ัวที่สà¸à¸‡" #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Converts a quantity in degrees to radians." -msgstr "" +msgstr "à¹à¸›à¸¥à¸‡à¸„่าà¸à¸‡à¸¨à¸²à¹€à¸›à¹‡à¸™à¹€à¸£à¹€à¸”ียน" #: editor/plugins/visual_shader_editor_plugin.cpp msgid "1.0 / scalar" -msgstr "" +msgstr "1.0 / สเà¸à¸¥à¸²à¸£à¹Œ" #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Finds the nearest integer to the parameter." -msgstr "" +msgstr "หาจำนวนเต็มที่ใà¸à¸¥à¹‰à¸à¸±à¸šà¸žà¸²à¸£à¸²à¸¡à¸´à¹€à¸•à¸à¸£à¹Œà¸¡à¸²à¸à¸—ี่สุด" #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Finds the nearest even integer to the parameter." -msgstr "" +msgstr "หาเลขคู่ที่ใà¸à¸¥à¹‰à¸à¸±à¸šà¸žà¸²à¸£à¸²à¸¡à¸´à¹€à¸•à¸à¸£à¹Œà¸¡à¸²à¸à¸—ี่สุด" #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Clamps the value between 0.0 and 1.0." -msgstr "" +msgstr "จำà¸à¸±à¸”ค่าให้à¸à¸¢à¸¹à¹‹à¸£à¸°à¸«à¸§à¹ˆà¸²à¸‡ 0.0 à¸à¸±à¸š 1.0" #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Extracts the sign of the parameter." -msgstr "" +msgstr "หาเครื่à¸à¸‡à¸«à¸¡à¸²à¸¢à¸‚à¸à¸‡à¸žà¸²à¸£à¸²à¸žà¸´à¹€à¸•à¸à¸£à¹Œ (บวà¸/ลบ)" #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Returns the sine of the parameter." -msgstr "" +msgstr "คืนค่า sine ขà¸à¸‡à¸žà¸²à¸£à¸²à¸¡à¸´à¹€à¸•à¸à¸£à¹Œ" #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Returns the hyperbolic sine of the parameter." -msgstr "" +msgstr "คืนค่า sinh ขà¸à¸‡à¸žà¸²à¸£à¸²à¸¡à¸´à¹€à¸•à¸à¸£à¹Œ" #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Returns the square root of the parameter." -msgstr "" +msgstr "คืนค่ารูทสà¸à¸‡à¸‚à¸à¸‡à¸žà¸²à¸£à¸²à¸¡à¸´à¹€à¸•à¸à¸£à¹Œ" #: editor/plugins/visual_shader_editor_plugin.cpp msgid "" @@ -9400,6 +9032,10 @@ msgid "" "'edge1'. Otherwise the return value is interpolated between 0.0 and 1.0 " "using Hermite polynomials." msgstr "" +"SmoothStep function( สเà¸à¸¥à¸²à¸£à¹Œ(edge0), สเà¸à¸¥à¸²à¸£à¹Œ(edge1), สเà¸à¸¥à¸²à¸£à¹Œ(x) )\n" +"\n" +"คืนค่า 0.0 ถ้า x น้à¸à¸¢à¸à¸§à¹ˆà¸² 'edge0' à¹à¸¥à¸° 1.0 ถ้ามาà¸à¸à¸§à¹ˆà¸² 'edge1' หรืà¸à¸„ืนค่าระหว่าง 0.0 - " +"1.0 โดยใช้ Hermite polynomials" #: editor/plugins/visual_shader_editor_plugin.cpp msgid "" @@ -9407,56 +9043,57 @@ msgid "" "\n" "Returns 0.0 if 'x' is smaller than 'edge' and otherwise 1.0." msgstr "" +"Step function( สเà¸à¸¥à¸²à¸£à¹Œ(edge), สเà¸à¸¥à¸²à¸£à¹Œ(x) )\n" +"\n" +"คืนค่า 0.0 ถ้า x น้à¸à¸¢à¸à¸§à¹ˆà¸² edge ถ้าไม่ใช่จะคืนค่า 1.0" #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Returns the tangent of the parameter." -msgstr "" +msgstr "คืนค่า tan ขà¸à¸‡à¸žà¸²à¸£à¸²à¸¡à¸´à¹€à¸•à¸à¸£à¹Œ" #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Returns the hyperbolic tangent of the parameter." -msgstr "" +msgstr "คืนค่า tanh ขà¸à¸‡à¸žà¸²à¸£à¸²à¸¡à¸´à¹€à¸•à¸à¸£à¹Œ" #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Finds the truncated value of the parameter." -msgstr "" +msgstr "หาค่าตัดหลัà¸à¸—ศนิยม(truncated value) ขà¸à¸‡à¸žà¸²à¸£à¸²à¸¡à¸´à¹€à¸•à¸à¸£à¹Œ" #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Adds scalar to scalar." -msgstr "" +msgstr "บวà¸à¸ªà¹€à¸à¸¥à¸²à¸£à¹Œà¸”้วยสเà¸à¸¥à¸²à¸£à¹Œ" #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Divides scalar by scalar." -msgstr "" +msgstr "หารสเà¸à¸¥à¸²à¸£à¹Œà¸”้วยสเà¸à¸¥à¸²à¸£à¹Œ" #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Multiplies scalar by scalar." -msgstr "" +msgstr "คูณสเà¸à¸¥à¸²à¸£à¹Œà¸”้วยสเà¸à¸¥à¸²à¸£à¹Œ" #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Returns the remainder of the two scalars." -msgstr "" +msgstr "คืนค่าเศษผลหารขà¸à¸‡à¸ªà¹€à¸à¸¥à¸²à¸£à¹Œà¸ªà¸à¸‡à¸à¸±à¸™" #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Subtracts scalar from scalar." -msgstr "" +msgstr "ลบสเà¸à¸¥à¸²à¸£à¹Œà¸”้วยสเà¸à¸¥à¸²à¸£à¹Œ" #: editor/plugins/visual_shader_editor_plugin.cpp -#, fuzzy msgid "Scalar constant." -msgstr "à¹à¸à¹‰à¹„ขค่าคงที่สเà¸à¸¥à¸²à¸£à¹Œ" +msgstr "ค่าคงที่สเà¸à¸¥à¸²à¸£à¹Œ" #: editor/plugins/visual_shader_editor_plugin.cpp -#, fuzzy msgid "Scalar uniform." -msgstr "à¹à¸à¹‰à¹„ขสเà¸à¸¥à¸²à¸£à¹Œ Uniform" +msgstr "ยูนิฟà¸à¸£à¹Œà¸¡à¸ªà¹€à¸à¸¥à¸²à¸£à¹Œ" #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Perform the cubic texture lookup." -msgstr "" +msgstr "ทำà¸à¸²à¸£à¸„้นหาเทà¸à¹€à¸ˆà¸à¸£à¹Œà¸¥à¸¹à¸à¸šà¸²à¸¨à¸à¹Œ" #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Perform the texture lookup." -msgstr "" +msgstr "ทำà¸à¸²à¸£à¸„้นหาเทà¸à¹€à¸ˆà¸à¸£à¹Œ" #: editor/plugins/visual_shader_editor_plugin.cpp #, fuzzy @@ -9499,23 +9136,23 @@ msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Calculates the determinant of a transform." -msgstr "" +msgstr "คำนวณดีเทà¸à¸£à¹Œà¸¡à¸´à¹à¸™à¸™à¸•์ขà¸à¸‡à¸—รานฟà¸à¸£à¹Œà¸¡" #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Calculates the inverse of a transform." -msgstr "" +msgstr "คำนวณà¸à¸´à¸™à¹€à¸§à¸à¸£à¹Œà¸ªà¸‚à¸à¸‡à¸—รานฟà¸à¸£à¹Œà¸¡" #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Calculates the transpose of a transform." -msgstr "" +msgstr "คำนวณทรานสโพสขà¸à¸‡à¸—รานฟà¸à¸£à¹Œà¸¡" #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Multiplies transform by transform." -msgstr "" +msgstr "คูณทรานฟà¸à¸£à¹Œà¸¡à¸”้วยทรานฟà¸à¸£à¹Œà¸¡" #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Multiplies vector by transform." -msgstr "" +msgstr "คูณเวà¸à¹€à¸•à¸à¸£à¹Œà¸”้วยทรานฟà¸à¸£à¹Œà¸¡" #: editor/plugins/visual_shader_editor_plugin.cpp #, fuzzy @@ -9528,34 +9165,32 @@ msgid "Transform uniform." msgstr "ยà¸à¹€à¸¥à¸´à¸à¸à¸²à¸£à¹€à¸„ลื่à¸à¸™à¸¢à¹‰à¸²à¸¢" #: editor/plugins/visual_shader_editor_plugin.cpp -#, fuzzy msgid "Vector function." -msgstr "ไปยังฟังà¸à¹Œà¸Šà¸±à¸™..." +msgstr "ฟังà¸à¹Œà¸Šà¸±à¸™à¹€à¸§à¸à¹€à¸•à¸à¸£à¹Œ" #: editor/plugins/visual_shader_editor_plugin.cpp -#, fuzzy msgid "Vector operator." -msgstr "à¹à¸à¹‰à¹„ขเครื่à¸à¸‡à¸«à¸¡à¸²à¸¢à¹€à¸§à¸à¹€à¸•à¸à¸£à¹Œ" +msgstr "ตัวดำเนินà¸à¸²à¸£à¹€à¸§à¸à¹€à¸•à¸à¸£à¹Œ" #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Composes vector from three scalars." -msgstr "" +msgstr "สร้างเวà¸à¹€à¸•à¸à¸£à¹Œà¸ˆà¸²à¸à¸ªà¹€à¸à¸¥à¸²à¸£à¹Œà¸ªà¸²à¸¡à¸•ัว" #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Decomposes vector to three scalars." -msgstr "" +msgstr "สร้างสเà¸à¸¥à¸²à¸£à¹Œà¸ªà¸²à¸¡à¸•ัวจาà¸à¹€à¸§à¸à¹€à¸•à¸à¸£à¹Œ" #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Calculates the cross product of two vectors." -msgstr "" +msgstr "หาผลคูณเชิงเวà¸à¹€à¸•à¸à¸£à¹Œ(cross product) ขà¸à¸‡à¹€à¸§à¸à¹€à¸•à¸à¸£à¹Œà¸ªà¸à¸‡à¸•ัว" #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Returns the distance between two points." -msgstr "" +msgstr "คืนค่าระยะห่างระหว่างสà¸à¸‡à¸ˆà¸¸à¸”" #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Calculates the dot product of two vectors." -msgstr "" +msgstr "คำนวณผลคูณเชิงสเà¸à¸¥à¸¥à¸²à¸£à¹Œ (dot) ขà¸à¸‡à¹€à¸§à¸à¹€à¸•à¸à¸£à¹Œà¸ªà¸à¸‡à¸•ัว" #: editor/plugins/visual_shader_editor_plugin.cpp msgid "" @@ -9567,27 +9202,27 @@ msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Calculates the length of a vector." -msgstr "" +msgstr "หาขนาดเวà¸à¹€à¸•à¸à¸£à¹Œ" #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Linear interpolation between two vectors." -msgstr "" +msgstr "à¸à¸²à¸£à¸›à¸£à¸°à¸¡à¸²à¸“ค่าเชิงเส้นระหว่างสà¸à¸‡à¹€à¸§à¸à¹€à¸•à¸à¸£à¹Œ" #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Linear interpolation between two vectors using scalar." -msgstr "" +msgstr "à¸à¸²à¸£à¸›à¸£à¸°à¸¡à¸²à¸“ค่าเชิงเส้นระหว่างสà¸à¸‡à¹€à¸§à¸à¹€à¸•à¸à¸£à¹Œà¹‚ดยใช้สเà¸à¸¥à¸²à¸£à¹Œ" #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Calculates the normalize product of vector." -msgstr "" +msgstr "คำนวณหาเวà¸à¹€à¸•à¸à¸£à¹Œà¸«à¸™à¹ˆà¸§à¸¢à¸‚à¸à¸‡à¹€à¸§à¸à¹€à¸•à¸à¸£à¹Œ" #: editor/plugins/visual_shader_editor_plugin.cpp msgid "1.0 - vector" -msgstr "" +msgstr "1.0 - เวà¸à¹€à¸•à¸à¸£à¹Œ" #: editor/plugins/visual_shader_editor_plugin.cpp msgid "1.0 / vector" -msgstr "" +msgstr "1.0 / เวà¸à¹€à¸•à¸à¸£à¹Œ" #: editor/plugins/visual_shader_editor_plugin.cpp msgid "" @@ -9597,7 +9232,7 @@ msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Returns the vector that points in the direction of refraction." -msgstr "" +msgstr "คืนค่าเวà¸à¹€à¸•à¸à¸£à¹Œà¸—ี่มีทิศทางที่เà¸à¸´à¸”จาà¸à¸à¸²à¸£à¸«à¸±à¸à¹€à¸«" #: editor/plugins/visual_shader_editor_plugin.cpp msgid "" @@ -9607,6 +9242,10 @@ msgid "" "'edge1'. Otherwise the return value is interpolated between 0.0 and 1.0 " "using Hermite polynomials." msgstr "" +"SmoothStep function( เวà¸à¹€à¸•à¸à¸£à¹Œ(edge0), เวà¸à¹€à¸•à¸à¸£à¹Œ(edge1), เวà¸à¹€à¸•à¸à¸£à¹Œ(x) ).\n" +"\n" +"คืนค่า 0.0 ถ้า 'x' น้à¸à¸¢à¸à¸§à¹ˆà¸² 'edge0' à¹à¸¥à¸° 1.0 ถ้า 'x' มาà¸à¸à¸§à¹ˆà¸² 'edge1' " +"นà¸à¸à¸™à¸±à¹‰à¸™à¸ˆà¸°à¸„ืนค่าระหว่าง 0.0 à¸à¸±à¸š 1.0 โดยใช้สูตรพหุนามเฮà¸à¹„มท์ (Hermite polynomials)" #: editor/plugins/visual_shader_editor_plugin.cpp msgid "" @@ -9616,6 +9255,10 @@ msgid "" "'edge1'. Otherwise the return value is interpolated between 0.0 and 1.0 " "using Hermite polynomials." msgstr "" +"SmoothStep function( สเà¸à¸¥à¸²à¸£à¹Œ(edge0), สเà¸à¸¥à¸²à¸£à¹Œ(edge1), เวà¸à¹€à¸•à¸à¸£à¹Œ(x) )\n" +"\n" +"คืนค่า 0.0 ถ้า 'x' น้à¸à¸¢à¸à¸§à¹ˆà¸² 'edge0' à¹à¸¥à¸° 1.0 ถ้า 'x' มาà¸à¸à¸§à¹ˆà¸² 'edge1' " +"นà¸à¸à¸™à¸±à¹‰à¸™à¸ˆà¸°à¸„ืนค่าระหว่าง 0.0 à¸à¸±à¸š 1.0 โดยใช้สูตรพหุนามเฮà¸à¹„มท์ (Hermite polynomials)" #: editor/plugins/visual_shader_editor_plugin.cpp msgid "" @@ -9623,6 +9266,9 @@ msgid "" "\n" "Returns 0.0 if 'x' is smaller than 'edge' and otherwise 1.0." msgstr "" +"Step function( เวà¸à¹€à¸•à¸à¸£à¹Œ(edge), เวà¸à¹€à¸•à¸à¸£à¹Œ(x) ).\n" +"\n" +"คืนค่า 0.0 ถ้า x น้à¸à¸¢à¸à¸§à¹ˆà¸² edge ถ้าไม่ใช่ คืนค่า 1.0" #: editor/plugins/visual_shader_editor_plugin.cpp msgid "" @@ -9630,36 +9276,37 @@ msgid "" "\n" "Returns 0.0 if 'x' is smaller than 'edge' and otherwise 1.0." msgstr "" +"Step function( สเà¸à¸¥à¸²à¸£à¹Œ(edge), เวà¸à¹€à¸•à¸à¸£à¹Œ(x) ).\n" +"\n" +"คืนค่า 0.0 ถ้า 'x' น้à¸à¸¢à¸à¸§à¹ˆà¸² 'edge' ถ้าไม่ใช่จะคืนค่า 1.0" #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Adds vector to vector." -msgstr "" +msgstr "บวà¸à¹€à¸§à¸à¹€à¸•à¸à¸£à¹Œà¸”้วยเวà¸à¹€à¸•à¸à¸£à¹Œ" #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Divides vector by vector." -msgstr "" +msgstr "หารเวà¸à¹€à¸•à¸à¸£à¹Œà¸”้วยเวà¸à¹€à¸•à¸à¸£à¹Œ" #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Multiplies vector by vector." -msgstr "" +msgstr "คูณเวà¸à¹€à¸•à¸à¸£à¹Œà¸”้วยเวà¸à¹€à¸•à¸à¸£à¹Œ" #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Returns the remainder of the two vectors." -msgstr "" +msgstr "คืนค่าเศษหารขà¸à¸‡à¹€à¸§à¸à¹€à¸•à¸à¸£à¹Œà¸ªà¸à¸‡à¹€à¸§à¸à¹€à¸•à¸à¸£à¹Œ" #: editor/plugins/visual_shader_editor_plugin.cpp msgid "Subtracts vector from vector." -msgstr "" +msgstr "ลบเวà¸à¹€à¸•à¸à¸£à¹Œà¸”้วยเวà¸à¹€à¸•à¸à¸£à¹Œ" #: editor/plugins/visual_shader_editor_plugin.cpp -#, fuzzy msgid "Vector constant." -msgstr "à¹à¸à¹‰à¹„ขค่าคงที่เวà¸à¹€à¸•à¸à¸£à¹Œ" +msgstr "ค่าคงที่เวà¸à¹€à¸•à¸à¸£à¹Œ" #: editor/plugins/visual_shader_editor_plugin.cpp -#, fuzzy msgid "Vector uniform." -msgstr "à¹à¸à¹‰à¹„ขเวà¸à¹€à¸•à¸à¸£à¹Œ Uniform" +msgstr "ยูนิฟà¸à¸£à¹Œà¸¡à¹€à¸§à¸à¹€à¸•à¸à¸£à¹Œ" #: editor/plugins/visual_shader_editor_plugin.cpp msgid "" @@ -9684,11 +9331,11 @@ msgstr "" #: editor/plugins/visual_shader_editor_plugin.cpp msgid "(Fragment/Light mode only) Scalar derivative function." -msgstr "" +msgstr "(โหมดà¹à¸Ÿà¸£à¸à¹€à¸¡à¸™à¸•์/à¹à¸ªà¸‡ เท่านั้น) ฟังà¸à¹Œà¸Šà¸±à¸™à¸à¸™à¸¸à¸žà¸±à¸™à¸˜à¹Œà¸ªà¹€à¸à¸¥à¸²à¸£à¹Œ" #: editor/plugins/visual_shader_editor_plugin.cpp msgid "(Fragment/Light mode only) Vector derivative function." -msgstr "" +msgstr "(โหมดà¹à¸Ÿà¸£à¸à¹€à¸¡à¸™à¸•์/à¹à¸ªà¸‡ เท่านั้น) ฟังà¸à¹Œà¸Šà¸±à¸™à¸à¸™à¸¸à¸žà¸±à¸™à¸˜à¹Œà¹€à¸§à¸à¹€à¸•à¸à¸£à¹Œ" #: editor/plugins/visual_shader_editor_plugin.cpp msgid "" @@ -9718,41 +9365,37 @@ msgstr "" msgid "" "(Fragment/Light mode only) (Vector) Sum of absolute derivative in 'x' and " "'y'." -msgstr "" +msgstr "(โหมดà¹à¸Ÿà¸£à¸à¹€à¸¡à¸™à¸•์/à¹à¸ªà¸‡ เท่านั้น) (เวà¸à¹€à¸•à¸à¸£à¹Œ) ผลรวมขà¸à¸‡à¸à¸™à¸¸à¸žà¸±à¸™à¸˜à¹Œà¸ªà¸±à¸¡à¸šà¸¹à¸£à¸“์ใน 'x' à¹à¸¥à¸° 'y'" #: editor/plugins/visual_shader_editor_plugin.cpp msgid "" "(Fragment/Light mode only) (Scalar) Sum of absolute derivative in 'x' and " "'y'." -msgstr "" +msgstr "(โหมดà¹à¸Ÿà¸£à¸à¹€à¸¡à¸™à¸•์/à¹à¸ªà¸‡ เท่านั้น) (สเà¸à¸¥à¸²à¸£à¹Œ) ผลรวมขà¸à¸‡à¸à¸™à¸¸à¸žà¸±à¸™à¸˜à¹Œà¸ªà¸±à¸¡à¸šà¸¹à¸£à¸“์ใน 'x' à¹à¸¥à¸° 'y'" #: editor/plugins/visual_shader_editor_plugin.cpp -#, fuzzy msgid "VisualShader" -msgstr "Shader" +msgstr "เวà¸à¸£à¹Œà¸Šà¸§à¸¥à¹€à¸Šà¸”เดà¸à¸£à¹Œ" #: editor/plugins/visual_shader_editor_plugin.cpp -#, fuzzy msgid "Edit Visual Property" -msgstr "à¹à¸à¹‰à¹„ขตัวà¸à¸£à¸à¸‡" +msgstr "à¹à¸à¹‰à¹„ขคุณสมบัติเวà¸à¸£à¹Œà¸Šà¸§à¸¥" #: editor/plugins/visual_shader_editor_plugin.cpp -#, fuzzy msgid "Visual Shader Mode Changed" -msgstr "จำนวนครั้งที่เปลี่ยน Shader" +msgstr "เปลี่ยนโหมดเวà¸à¸£à¹Œà¸Šà¸§à¸¥à¹€à¸Šà¸”เดà¸à¸£à¹Œà¹à¸¥à¹‰à¸§" #: editor/project_export.cpp msgid "Runnable" -msgstr "รันได้" +msgstr "สามารถรันได้" #: editor/project_export.cpp -#, fuzzy msgid "Add initial export..." -msgstr "เพิ่มà¸à¸´à¸™à¸žà¸¸à¸•" +msgstr "เพิ่มà¸à¸²à¸£à¸ªà¹ˆà¸‡à¸à¸à¸à¹€à¸£à¸´à¹ˆà¸¡à¸•้น..." #: editor/project_export.cpp msgid "Add previous patches..." -msgstr "" +msgstr "เพิ่มà¹à¸žà¸—ช์à¸à¹ˆà¸à¸™à¸«à¸™à¹‰à¸²..." #: editor/project_export.cpp msgid "Delete patch '%s' from list?" @@ -9776,19 +9419,16 @@ msgid "" msgstr "" #: editor/project_export.cpp -#, fuzzy msgid "Release" -msgstr "เพิ่งปล่à¸à¸¢" +msgstr "เผยà¹à¸žà¸£à¹ˆ" #: editor/project_export.cpp -#, fuzzy msgid "Exporting All" -msgstr "ส่งà¸à¸à¸à¸ªà¸³à¸«à¸£à¸±à¸š %s" +msgstr "ส่งà¸à¸à¸à¸—ั้งหมด" #: editor/project_export.cpp -#, fuzzy msgid "The given export path doesn't exist:" -msgstr "ไม่พบไฟล์" +msgstr "ไม่พบที่à¸à¸¢à¸¹à¹ˆà¸ªà¹ˆà¸‡à¸à¸à¸:" #: editor/project_export.cpp msgid "Export templates for this platform are missing/corrupted:" @@ -9809,17 +9449,16 @@ msgid "" msgstr "" #: editor/project_export.cpp -#, fuzzy msgid "Export Path" -msgstr "ส่งà¸à¸à¸à¹‚ปรเจà¸à¸•์" +msgstr "ไดเรà¸à¸—à¸à¸£à¸µà¸ªà¹ˆà¸‡à¸à¸à¸" #: editor/project_export.cpp msgid "Resources" -msgstr "รีซà¸à¸£à¹Œà¸ª" +msgstr "ทรัพยาà¸à¸£" #: editor/project_export.cpp msgid "Export all resources in the project" -msgstr "ส่งà¸à¸à¸à¸—ุà¸à¸£à¸µà¸‹à¸à¸£à¹Œà¸ªà¹ƒà¸™à¹‚ปรเจà¸à¸•์" +msgstr "ส่งà¸à¸à¸à¸—รัพยาà¸à¸£à¸—ั้งหมดในโปรเจà¸à¸•์" #: editor/project_export.cpp msgid "Export selected scenes (and dependencies)" @@ -9877,9 +9516,8 @@ msgid "Feature List:" msgstr "รายชื่à¸à¸Ÿà¸µà¹€à¸ˆà¸à¸£à¹Œ:" #: editor/project_export.cpp -#, fuzzy msgid "Script" -msgstr "สคริปต์ใหม่" +msgstr "สคริปต์" #: editor/project_export.cpp msgid "Script Export Mode:" @@ -9899,7 +9537,7 @@ msgstr "เข้ารหัส (ใส่คีย์ด้านล่าง) #: editor/project_export.cpp msgid "Invalid Encryption Key (must be 64 characters long)" -msgstr "" +msgstr "คีย์เข้ารหัสไม่ถูà¸à¸•้à¸à¸‡ (ต้à¸à¸‡à¸¡à¸µ 64 à¸à¸±à¸à¸©à¸£)" #: editor/project_export.cpp msgid "Script Encryption Key (256-bits as hex):" @@ -9914,23 +9552,20 @@ msgid "Export Project" msgstr "ส่งà¸à¸à¸à¹‚ปรเจà¸à¸•์" #: editor/project_export.cpp -#, fuzzy msgid "Export mode?" -msgstr "วิธีà¸à¸²à¸£à¸ªà¹ˆà¸‡à¸à¸à¸:" +msgstr "ส่งà¸à¸à¸à¹‚หมด?" #: editor/project_export.cpp -#, fuzzy msgid "Export All" -msgstr "ส่งà¸à¸à¸" +msgstr "ส่งà¸à¸à¸à¸—ั้งหมด" #: editor/project_export.cpp editor/project_manager.cpp -#, fuzzy msgid "ZIP File" -msgstr " ไฟล์" +msgstr "ไฟล์ ZIP" #: editor/project_export.cpp msgid "Godot Game Pack" -msgstr "" +msgstr "Godot เà¸à¸¡à¹à¸žà¹‡à¸„" #: editor/project_export.cpp msgid "Export templates for this platform are missing:" @@ -9945,50 +9580,45 @@ msgid "Export With Debug" msgstr "ส่งà¸à¸à¸à¸žà¸£à¹‰à¸à¸¡à¸à¸²à¸£à¹à¸à¹‰à¹„ขจุดบà¸à¸žà¸£à¹ˆà¸à¸‡" #: editor/project_manager.cpp -#, fuzzy msgid "The path specified doesn't exist." -msgstr "ไม่พบไฟล์" +msgstr "ไม่พบที่à¸à¸¢à¸¹à¹ˆà¸—ี่ระบุเà¸à¸²à¹„ว้" #: editor/project_manager.cpp -#, fuzzy msgid "Error opening package file (it's not in ZIP format)." -msgstr "ผิดพลาดขณะเปิดไฟล์à¹à¸žà¸„เà¸à¸ˆ, ไม่ใช่รูปà¹à¸šà¸š zip" +msgstr "ผิดพลาดขณะเปิดไฟล์à¹à¸žà¸„เà¸à¸ˆ (ไม่ใช่ไฟล์นามสà¸à¸¸à¸¥ zip)" #: editor/project_manager.cpp -#, fuzzy msgid "" "Invalid \".zip\" project file; it doesn't contain a \"project.godot\" file." -msgstr "à¸à¸£à¸¸à¸“าเลืà¸à¸à¹‚ฟลเดà¸à¸£à¹Œà¸—ี่ไม่มีไฟล์ 'project.godot'" +msgstr "ไฟล์โปรเจà¸à¸•์ \".zip\" ผิดพลาด เนื่à¸à¸‡à¸ˆà¸²à¸à¹„ม่มีไฟล์ \"project.godot\"" #: editor/project_manager.cpp msgid "Please choose an empty folder." msgstr "à¸à¸£à¸¸à¸“าเลืà¸à¸à¹‚ฟลเดà¸à¸£à¹Œà¸§à¹ˆà¸²à¸‡à¹€à¸›à¸¥à¹ˆà¸²" #: editor/project_manager.cpp -#, fuzzy msgid "Please choose a \"project.godot\" or \".zip\" file." -msgstr "à¸à¸£à¸¸à¸“าเลืà¸à¸à¹„ฟล์ 'project.godot'" +msgstr "à¸à¸£à¸¸à¸“าเลืà¸à¸à¹„ฟล์ \"project.godot\" หรืà¸à¹„ฟล์ \".zip\"" #: editor/project_manager.cpp msgid "This directory already contains a Godot project." -msgstr "" +msgstr "ไดเรà¸à¸—à¸à¸£à¸µà¸™à¸µà¹‰à¸¡à¸µà¹‚ปรเจà¸à¸•์ Godot à¸à¸¢à¸¹à¹ˆà¹à¸¥à¹‰à¸§" #: editor/project_manager.cpp msgid "New Game Project" -msgstr "โปรเจà¸à¸•์ใหม่" +msgstr "โปรเจà¸à¸•์เà¸à¸¡à¹ƒà¸«à¸¡à¹ˆ" #: editor/project_manager.cpp msgid "Imported Project" msgstr "นำเข้าโปรเจà¸à¸•์à¹à¸¥à¹‰à¸§" #: editor/project_manager.cpp -#, fuzzy msgid "Invalid Project Name." -msgstr "ชื่à¸à¹‚ปรเจà¸à¸•์:" +msgstr "ชื่à¸à¹‚ปรเจà¸à¸•์ไม่ถูà¸à¸•้à¸à¸‡" #: editor/project_manager.cpp msgid "Couldn't create folder." -msgstr "ไม่สามารถสร้างโฟลเดà¸à¸£à¹Œ" +msgstr "ไม่สามารถสร้างโฟลเดà¸à¸£à¹Œà¹„ด้" #: editor/project_manager.cpp msgid "There is already a folder in this path with the specified name." @@ -10054,17 +9684,16 @@ msgid "Project Path:" msgstr "ที่à¸à¸¢à¸¹à¹ˆà¹‚ปรเจà¸à¸•์:" #: editor/project_manager.cpp -#, fuzzy msgid "Project Installation Path:" -msgstr "ที่à¸à¸¢à¸¹à¹ˆà¹‚ปรเจà¸à¸•์:" +msgstr "ที่à¸à¸¢à¸¹à¹ˆà¸—ี่ใช้ติดตั้งโปรเจà¸à¸•์:" #: editor/project_manager.cpp msgid "Renderer:" -msgstr "" +msgstr "ตัวเรนเดà¸à¸£à¹Œ:" #: editor/project_manager.cpp msgid "OpenGL ES 3.0" -msgstr "" +msgstr "OpenGL ES 3.0" #: editor/project_manager.cpp msgid "" @@ -10073,10 +9702,14 @@ msgid "" "Incompatible with older hardware\n" "Not recommended for web games" msgstr "" +"à¸à¸²à¸£à¹à¸ªà¸”งผลที่ดีà¸à¸§à¹ˆà¸²\n" +"คุณสมบัติที่มาà¸à¸à¸§à¹ˆà¸²\n" +"ไม่รà¸à¸‡à¸£à¸±à¸šà¸®à¸²à¸£à¹Œà¸”à¹à¸§à¸£à¹Œà¸£à¸¸à¹ˆà¸™à¹€à¸à¹ˆà¸²\n" +"ไม่เหมาะสำหรับเà¸à¸¡à¸ªà¹Œà¸šà¸™à¹€à¸§à¹‡à¸š" #: editor/project_manager.cpp msgid "OpenGL ES 2.0" -msgstr "" +msgstr "OpenGL ES 2.0" #: editor/project_manager.cpp msgid "" @@ -10085,28 +9718,30 @@ msgid "" "Works on most hardware\n" "Recommended for web games" msgstr "" +"คุณภาพà¸à¸²à¸£à¹à¸ªà¸”งผลน้à¸à¸¢à¸à¸§à¹ˆà¸²\n" +"ระบบที่น้à¸à¸¢à¸à¸§à¹ˆà¸²\n" +"ทำงานได้บนฮาร์ดà¹à¸§à¸£à¹Œà¸ªà¹ˆà¸§à¸™à¹ƒà¸«à¸à¹ˆ\n" +"เหมาะสำหรับสร้างเà¸à¸¡à¸ªà¹Œà¸šà¸™à¹€à¸§à¹‡à¸š" #: editor/project_manager.cpp msgid "Renderer can be changed later, but scenes may need to be adjusted." -msgstr "" +msgstr "ตัวเรนเดà¸à¸£à¹Œà¸ªà¸²à¸¡à¸²à¸£à¸–เปลี่ยนทีหลังได้ à¹à¸•่ฉาà¸à¸ˆà¸³à¹€à¸›à¹‡à¸™à¸•้à¸à¸‡à¸›à¸£à¸±à¸šà¹à¸•่ง" #: editor/project_manager.cpp msgid "Unnamed Project" msgstr "โปรเจà¸à¸•์ไม่มีชื่à¸" #: editor/project_manager.cpp -#, fuzzy msgid "Missing Project" -msgstr "นำเข้าโปรเจà¸à¸•์ที่มีà¸à¸¢à¸¹à¹ˆà¹€à¸”ิม" +msgstr "โปรเจà¸à¸•์หายไป" #: editor/project_manager.cpp msgid "Error: Project is missing on the filesystem." -msgstr "" +msgstr "Error:โปรเจà¸à¸•์หายไปจาà¸à¸£à¸°à¸šà¸šà¹„ฟล์" #: editor/project_manager.cpp -#, fuzzy msgid "Can't open project at '%s'." -msgstr "ไม่สามารถเปิดโปรเจà¸à¸•์" +msgstr "ไม่สามารถเปิดโปรเจà¸à¸•์ที่ '%s'" #: editor/project_manager.cpp msgid "Are you sure to open more than one project?" @@ -10142,6 +9777,7 @@ msgid "" "The project settings were created by a newer engine version, whose settings " "are not compatible with this version." msgstr "" +"à¸à¸²à¸£à¸•ั้งค่าโปรเจà¸à¸•์ถูà¸à¸ªà¸£à¹‰à¸²à¸‡à¹‚ดยโดยเà¸à¸™à¸ˆà¸´à¹‰à¸™à¸£à¸¸à¹ˆà¸™à¹ƒà¸«à¸¡à¹ˆà¸à¸§à¹ˆà¸² ซึ่งà¸à¸²à¸£à¸•ั้งค่านี้ไม่สามารถเข้าà¸à¸±à¸™à¹„ด้à¸à¸±à¸šà¹€à¸à¸™à¸ˆà¸´à¹‰à¸™à¸£à¸¸à¹ˆà¸™à¸™à¸µà¹‰" #: editor/project_manager.cpp #, fuzzy @@ -10162,9 +9798,8 @@ msgstr "" "à¸à¸£à¸¸à¸“าเปิดà¹à¸à¹‰à¹„ขโปรเจà¸à¸•์เพื่à¸à¸™à¸³à¹€à¸‚้าไฟล์" #: editor/project_manager.cpp -#, fuzzy msgid "Are you sure to run %d projects at once?" -msgstr "ยืนยันà¸à¸²à¸£à¸£à¸±à¸™à¹‚ปรเจà¸à¸•์มาà¸à¸à¸§à¹ˆà¸² 1 โปรเจà¸à¸•์?" +msgstr "ยืนยันà¸à¸²à¸£à¸£à¸±à¸™à¹‚ปรเจà¸à¸•์ %d โปรเจà¸à¸•์ทีเดียว?" #: editor/project_manager.cpp #, fuzzy @@ -10181,40 +9816,40 @@ msgid "" msgstr "ลบโปรเจà¸à¸•์à¸à¸à¸à¸ˆà¸²à¸à¸£à¸²à¸¢à¸Šà¸·à¹ˆà¸? (โฟลเดà¸à¸£à¹Œà¸ˆà¸°à¹„ม่ถูà¸à¸¥à¸š)" #: editor/project_manager.cpp -#, fuzzy msgid "" "Remove all missing projects from the list?\n" "The project folders' contents won't be modified." -msgstr "ลบโปรเจà¸à¸•์à¸à¸à¸à¸ˆà¸²à¸à¸£à¸²à¸¢à¸Šà¸·à¹ˆà¸? (โฟลเดà¸à¸£à¹Œà¸ˆà¸°à¹„ม่ถูà¸à¸¥à¸š)" +msgstr "" +"ลบโปรเจà¸à¸•์ที่หายไปà¸à¸à¸à¸ˆà¸²à¸à¸£à¸²à¸¢à¸Šà¸·à¹ˆà¸à¸«à¸£à¸·à¸à¹„ม่?\n" +"เนื้à¸à¸«à¸²à¹‚ฟลเดà¸à¸£à¹Œà¹‚ปรเจà¸à¸•์จะไม่ถูà¸à¹à¸à¹‰à¹„ข" #: editor/project_manager.cpp -#, fuzzy msgid "" "Language changed.\n" "The interface will update after restarting the editor or project manager." msgstr "" "เปลี่ยนภาษาà¹à¸¥à¹‰à¸§\n" -"à¸à¸²à¸£à¹€à¸›à¸¥à¸µà¹ˆà¸¢à¸™à¹à¸›à¸¥à¸‡à¸ˆà¸°à¸¡à¸µà¸œà¸¥à¹€à¸¡à¸·à¹ˆà¸à¹€à¸›à¸´à¸”โปรà¹à¸à¸£à¸¡à¹à¸à¹‰à¹„ขหรืà¸à¸•ัวจัดà¸à¸²à¸£à¹‚ปรเจà¸à¸•์ใหม่" +"à¸à¸²à¸£à¹€à¸›à¸¥à¸µà¹ˆà¸¢à¸™à¹à¸›à¸¥à¸‡à¸ˆà¸°à¸¡à¸µà¸œà¸¥à¹€à¸¡à¸·à¹ˆà¸à¹€à¸›à¸´à¸”เà¸à¸”ิเตà¸à¸£à¹Œà¸«à¸£à¸·à¸à¸•ัวจัดà¸à¸²à¸£à¹‚ปรเจà¸à¸•์ใหม่" #: editor/project_manager.cpp -#, fuzzy msgid "" "Are you sure to scan %s folders for existing Godot projects?\n" "This could take a while." -msgstr "จะทำà¸à¸²à¸£à¸ªà¹à¸à¸™à¸«à¸²à¹‚ปรเจà¸à¸•์ใน %s โฟลเดà¸à¸£à¹Œ ยืนยัน?" +msgstr "" +"ทำà¸à¸²à¸£à¸ªà¹à¸à¸™à¸«à¸²à¹‚ปรเจà¸à¸•์ ในโฟลเดà¸à¸£à¹Œ %s หรืà¸à¹„ม่?\n" +"à¸à¸²à¸ˆà¸ˆà¸°à¹ƒà¸Šà¹‰à¹€à¸§à¸¥à¸²à¸ªà¸±à¸à¸„รู่" #: editor/project_manager.cpp msgid "Project Manager" msgstr "ตัวจัดà¸à¸²à¸£à¹‚ปรเจà¸à¸•์" #: editor/project_manager.cpp -#, fuzzy msgid "Projects" msgstr "โปรเจà¸à¸•์" #: editor/project_manager.cpp msgid "Last Modified" -msgstr "" +msgstr "à¹à¸à¹‰à¹„ขล่าสุด" #: editor/project_manager.cpp msgid "Scan" @@ -10229,9 +9864,8 @@ msgid "New Project" msgstr "โปรเจà¸à¸•์ใหม่" #: editor/project_manager.cpp -#, fuzzy msgid "Remove Missing" -msgstr "ลบจุด" +msgstr "ลบที่หายไป" #: editor/project_manager.cpp msgid "Templates" @@ -10254,6 +9888,13 @@ msgstr "" "คุณยังไม่มีโปรเจà¸à¸•์ใด ๆ\n" "ต้à¸à¸‡à¸à¸²à¸£à¸ªà¸³à¸£à¸§à¸ˆà¹‚ปรเจà¸à¸•์ตัวà¸à¸¢à¹ˆà¸²à¸‡à¹ƒà¸™à¹à¸«à¸¥à¹ˆà¸‡à¸£à¸§à¸¡à¸—รัพยาà¸à¸£à¸«à¸£à¸·à¸à¹„ม่?" +#: editor/project_manager.cpp +msgid "" +"The search box filters projects by name and last path component.\n" +"To filter projects by name and full path, the query must contain at least " +"one `/` character." +msgstr "" + #: editor/project_settings_editor.cpp msgid "Key " msgstr "ปุ่ม " @@ -10295,9 +9936,8 @@ msgid "Add Input Action Event" msgstr "เพิ่มปุ่มà¸à¸”ขà¸à¸‡à¸à¸²à¸£à¸à¸£à¸°à¸—ำ" #: editor/project_settings_editor.cpp -#, fuzzy msgid "All Devices" -msgstr "à¸à¸¸à¸›à¸à¸£à¸“์" +msgstr "à¸à¸¸à¸›à¸à¸£à¸“์ทั้งหมด" #: editor/project_settings_editor.cpp msgid "Device" @@ -10342,14 +9982,12 @@ msgid "Wheel Right Button" msgstr "เมาส์ขวา" #: editor/project_settings_editor.cpp -#, fuzzy msgid "X Button 1" -msgstr "ปุ่ม 6" +msgstr "X ปุ่ม 1" #: editor/project_settings_editor.cpp -#, fuzzy msgid "X Button 2" -msgstr "ปุ่ม 6" +msgstr "X ปุ่ม 2" #: editor/project_settings_editor.cpp msgid "Joypad Axis Index:" @@ -10435,7 +10073,7 @@ msgstr "ผิดพลาดขณะบันทึà¸à¸„่า" #: editor/project_settings_editor.cpp msgid "Settings saved OK." -msgstr "บันทึà¸à¹à¸¥à¹‰à¸§" +msgstr "บันทึà¸à¸à¸²à¸£à¸•ั้งค่าà¹à¸¥à¹‰à¸§" #: editor/project_settings_editor.cpp #, fuzzy @@ -10496,7 +10134,7 @@ msgstr "à¸à¸³à¸«à¸™à¸”เฉพาะ..." #: editor/project_settings_editor.cpp editor/settings_config_dialog.cpp msgid "The editor must be restarted for changes to take effect." -msgstr "" +msgstr "ต้à¸à¸‡à¹€à¸›à¸´à¸”เà¸à¸”ิเตà¸à¸£à¹Œà¹ƒà¸«à¸¡à¹ˆà¹€à¸žà¸·à¹ˆà¸à¹ƒà¸«à¹‰à¸à¸²à¸£à¹€à¸›à¸¥à¸µà¹ˆà¸¢à¸™à¹à¸›à¸¥à¸‡à¸¡à¸µà¸œà¸¥" #: editor/project_settings_editor.cpp msgid "Input Map" @@ -10507,9 +10145,8 @@ msgid "Action:" msgstr "à¸à¸²à¸£à¸à¸£à¸°à¸—ำ:" #: editor/project_settings_editor.cpp -#, fuzzy msgid "Action" -msgstr "à¸à¸²à¸£à¸à¸£à¸°à¸—ำ:" +msgstr "à¸à¸²à¸£à¸à¸£à¸°à¸—ำ" #: editor/project_settings_editor.cpp msgid "Deadzone" @@ -10541,7 +10178,7 @@ msgstr "à¸à¸²à¸£à¹à¸—นที่" #: editor/project_settings_editor.cpp msgid "Resources:" -msgstr "รีซà¸à¸£à¹Œà¸ª:" +msgstr "ทรัพยาà¸à¸£:" #: editor/project_settings_editor.cpp msgid "Remaps by Locale:" @@ -10556,7 +10193,6 @@ msgid "Locales Filter" msgstr "ตัวà¸à¸£à¸à¸‡à¸ ูมิภาค" #: editor/project_settings_editor.cpp -#, fuzzy msgid "Show All Locales" msgstr "à¹à¸ªà¸”งทุà¸à¸ ูมิภาค" @@ -10603,7 +10239,7 @@ msgstr "ไฟล์..." #: editor/property_editor.cpp msgid "Dir..." -msgstr "โฟลเดà¸à¸£à¹Œ..." +msgstr "ไดเรà¸à¸—à¸à¸£à¸µ..." #: editor/property_editor.cpp msgid "Assign" @@ -10644,11 +10280,11 @@ msgstr "เปลี่ยนชื่à¸" #: editor/rename_dialog.cpp msgid "Prefix" -msgstr "" +msgstr "คำนำหน้า" #: editor/rename_dialog.cpp msgid "Suffix" -msgstr "" +msgstr "คำต่à¸à¸—้าย" #: editor/rename_dialog.cpp #, fuzzy @@ -10656,37 +10292,32 @@ msgid "Use Regular Expressions" msgstr "à¹à¸à¹‰à¹„ขสมà¸à¸²à¸£" #: editor/rename_dialog.cpp -#, fuzzy msgid "Advanced Options" -msgstr "ตัวเลืà¸à¸à¸à¸²à¸£à¸ˆà¸³à¸à¸±à¸”" +msgstr "ตัวเลืà¸à¸à¸‚ั้นสูง" #: editor/rename_dialog.cpp msgid "Substitute" -msgstr "" +msgstr "à¸à¸²à¸£à¹à¸—นที่" #: editor/rename_dialog.cpp -#, fuzzy msgid "Node name" -msgstr "ชื่à¸à¹‚หนด:" +msgstr "ชื่à¸à¹‚หนด" #: editor/rename_dialog.cpp msgid "Node's parent name, if available" -msgstr "" +msgstr "ชื่à¸à¹‚หนดà¹à¸¡à¹ˆ (ถ้ามี)" #: editor/rename_dialog.cpp -#, fuzzy msgid "Node type" -msgstr "หาประเภทขà¸à¸‡à¹‚หนด" +msgstr "ชนิดโหนด" #: editor/rename_dialog.cpp -#, fuzzy msgid "Current scene name" -msgstr "ฉาà¸à¸›à¸±à¸ˆà¸ˆà¸¸à¸šà¸±à¸™" +msgstr "ชื่à¸à¸‰à¸²à¸à¸›à¸±à¸ˆà¸ˆà¸¸à¸šà¸±à¸™" #: editor/rename_dialog.cpp -#, fuzzy msgid "Root node name" -msgstr "ชื่à¸à¹‚หนดราà¸:" +msgstr "ชื่à¸à¹‚หนดà¹à¸¡à¹ˆ" #: editor/rename_dialog.cpp msgid "" @@ -10696,7 +10327,7 @@ msgstr "" #: 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" @@ -10704,12 +10335,11 @@ msgstr "" #: editor/rename_dialog.cpp msgid "Initial value for the counter" -msgstr "" +msgstr "ค่าเริ่มต้นในà¸à¸²à¸£à¸™à¸±à¸š" #: editor/rename_dialog.cpp -#, fuzzy msgid "Step" -msgstr "ขนาด:" +msgstr "ขั้น" #: editor/rename_dialog.cpp msgid "Amount by which counter is incremented for each node" @@ -10747,14 +10377,12 @@ msgid "Case" msgstr "" #: editor/rename_dialog.cpp -#, fuzzy msgid "To Lowercase" -msgstr "ตัวพิมพ์เล็à¸" +msgstr "ไปตัวพิมพ์เล็à¸" #: editor/rename_dialog.cpp -#, fuzzy msgid "To Uppercase" -msgstr "ตัวพิมพ์ใหà¸à¹ˆ" +msgstr "ไปตัวพิมพ์ใหà¸à¹ˆ" #: editor/rename_dialog.cpp #, fuzzy @@ -10767,9 +10395,8 @@ msgid "Regular Expression Error" msgstr "à¹à¸à¹‰à¹„ขสมà¸à¸²à¸£" #: editor/rename_dialog.cpp -#, fuzzy msgid "At character %s" -msgstr "ตัวà¸à¸±à¸à¸©à¸£à¸—ี่ใช้ได้:" +msgstr "ตัวà¸à¸±à¸à¸©à¸£à¸—ี่ใช้ได้ %s" #: editor/reparent_dialog.cpp editor/scene_tree_dock.cpp msgid "Reparent Node" @@ -10826,9 +10453,8 @@ msgid "Instance Scene(s)" msgstr "à¸à¸´à¸™à¸ªà¹à¸•นซ์ฉาà¸" #: editor/scene_tree_dock.cpp -#, fuzzy msgid "Replace with Branch Scene" -msgstr "บันทึà¸à¸à¸´à¹ˆà¸‡à¹€à¸›à¹‡à¸™à¸‰à¸²à¸" +msgstr "à¹à¸—นที่ด้วยฉาà¸à¸¢à¹ˆà¸à¸¢" #: editor/scene_tree_dock.cpp msgid "Instance Child Scene" @@ -10867,32 +10493,28 @@ msgid "Instantiated scenes can't become root" msgstr "" #: editor/scene_tree_dock.cpp -#, fuzzy msgid "Make node as Root" -msgstr "เข้าใจ!" +msgstr "ทำโหนดให้เป็นโหนดà¹à¸¡à¹ˆ" #: editor/scene_tree_dock.cpp -#, fuzzy msgid "Delete %d nodes?" -msgstr "ลบโหนด" +msgstr "ลบโหนด %d ?" #: editor/scene_tree_dock.cpp -#, fuzzy msgid "Delete the root node \"%s\"?" -msgstr "ลบโหนด" +msgstr "ลบโหนดà¹à¸¡à¹ˆ \"%s\"?" #: editor/scene_tree_dock.cpp msgid "Delete node \"%s\" and its children?" -msgstr "" +msgstr "ลบโหนด \"%s\" à¹à¸¥à¸°à¹‚หนดลูà¸?" #: editor/scene_tree_dock.cpp -#, fuzzy msgid "Delete node \"%s\"?" -msgstr "ลบโหนด" +msgstr "ลบโหนด \"%s\"?" #: editor/scene_tree_dock.cpp msgid "Can not perform with the root node." -msgstr "ทำà¸à¸±à¸šà¹‚หนดราà¸à¹„ม่ได้" +msgstr "ไม่สามารถà¸à¸£à¸°à¸—ำà¸à¸±à¸šà¹‚หนดà¹à¸¡à¹ˆà¹„ด้" #: editor/scene_tree_dock.cpp msgid "This operation can't be done on instanced scenes." @@ -10920,34 +10542,28 @@ msgid "Make Local" msgstr "ระยะใà¸à¸¥à¹‰" #: editor/scene_tree_dock.cpp -#, fuzzy msgid "New Scene Root" -msgstr "เข้าใจ!" +msgstr "ฉาà¸à¹à¸¡à¹ˆà¹ƒà¸«à¸¡à¹ˆ" #: editor/scene_tree_dock.cpp -#, fuzzy msgid "Create Root Node:" -msgstr "สร้างโหนด" +msgstr "สร้างโหนดà¹à¸¡à¹ˆ:" #: editor/scene_tree_dock.cpp -#, fuzzy msgid "2D Scene" -msgstr "ฉาà¸" +msgstr "ฉาภ2D" #: editor/scene_tree_dock.cpp -#, fuzzy msgid "3D Scene" -msgstr "ฉาà¸" +msgstr "ฉาภ3D" #: editor/scene_tree_dock.cpp -#, fuzzy msgid "User Interface" -msgstr "ลบà¸à¸²à¸£à¸ªà¸·à¸šà¸—à¸à¸”" +msgstr "à¸à¸´à¸™à¹€à¸•à¸à¸£à¹Œà¹€à¸Ÿà¸ª" #: editor/scene_tree_dock.cpp -#, fuzzy msgid "Other Node" -msgstr "ลบโหนด" +msgstr "โหนดà¸à¸·à¹ˆà¸™à¹†" #: editor/scene_tree_dock.cpp msgid "Can't operate on nodes from a foreign scene!" @@ -10959,16 +10575,15 @@ msgstr "ทำà¸à¸±à¸šà¹‚หนดที่ฉาà¸à¸›à¸±à¸ˆà¸ˆà¸¸à¸šà¸±à¸™à¸ª #: editor/scene_tree_dock.cpp msgid "Attach Script" -msgstr "เชื่à¸à¸¡à¸ªà¸„ริปต์" +msgstr "à¹à¸™à¸šà¸ªà¸„ริปต์" #: editor/scene_tree_dock.cpp msgid "Remove Node(s)" msgstr "ลบโหนด" #: editor/scene_tree_dock.cpp -#, fuzzy msgid "Change type of node(s)" -msgstr "เปลี่ยนชื่à¸à¸à¸´à¸™à¸žà¸¸à¸•" +msgstr "เปลี่ยนชนิดขà¸à¸‡à¹‚หนด" #: editor/scene_tree_dock.cpp msgid "" @@ -11001,7 +10616,6 @@ msgid "Load As Placeholder" msgstr "โหลดเป็นตัวà¹à¸—น" #: editor/scene_tree_dock.cpp -#, fuzzy msgid "Open Documentation" msgstr "เปิดคู่มืà¸" @@ -11010,23 +10624,20 @@ msgid "Add Child Node" msgstr "เพิ่มโหนดลูà¸" #: editor/scene_tree_dock.cpp -#, fuzzy msgid "Expand/Collapse All" -msgstr "ยุบโฟลเดà¸à¸£à¹Œ" +msgstr "ขยาย/ยุบทั้งหมด" #: editor/scene_tree_dock.cpp msgid "Change Type" -msgstr "เปลี่ยนประเภท" +msgstr "เปลี่ยนชนิด" #: editor/scene_tree_dock.cpp -#, fuzzy msgid "Reparent to New Node" msgstr "หาโหนดà¹à¸¡à¹ˆà¹ƒà¸«à¸¡à¹ˆ" #: editor/scene_tree_dock.cpp -#, fuzzy msgid "Make Scene Root" -msgstr "เข้าใจ!" +msgstr "ตั้งเป็นฉาà¸à¹à¸¡à¹ˆ" #: editor/scene_tree_dock.cpp msgid "Merge From Scene" @@ -11045,7 +10656,6 @@ msgid "Delete (No Confirm)" msgstr "ลบ (ไม่ยืนยัน)" #: editor/scene_tree_dock.cpp -#, fuzzy msgid "Add/Create a New Node." msgstr "เพิ่ม/สร้างโหนดใหม่" @@ -11057,7 +10667,7 @@ 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." @@ -11081,9 +10691,8 @@ msgid "Toggle Visible" msgstr "ซ่à¸à¸™/à¹à¸ªà¸”ง" #: editor/scene_tree_editor.cpp -#, fuzzy msgid "Unlock Node" -msgstr "เลืà¸à¸à¹‚หนด" +msgstr "ปลดล็à¸à¸„โหนด" #: editor/scene_tree_editor.cpp #, fuzzy @@ -11091,9 +10700,8 @@ msgid "Button Group" msgstr "ปุ่ม 7" #: editor/scene_tree_editor.cpp -#, fuzzy msgid "(Connecting From)" -msgstr "เชื่à¸à¸¡à¸•่à¸à¸œà¸´à¸”พลาด" +msgstr "(เชื่à¸à¸¡à¸•่à¸à¸ˆà¸²à¸)" #: editor/scene_tree_editor.cpp msgid "Node configuration warning:" @@ -11127,12 +10735,10 @@ msgstr "" "คลิà¸à¹€à¸žà¸·à¹ˆà¸à¹à¸ªà¸”งà¹à¸œà¸‡à¸à¸¥à¸¸à¹ˆà¸¡" #: editor/scene_tree_editor.cpp -#, fuzzy msgid "Open Script:" -msgstr "เปิดสคริปต์" +msgstr "เปิดสคริปต์:" #: editor/scene_tree_editor.cpp -#, fuzzy msgid "" "Node is locked.\n" "Click to unlock it." @@ -11158,6 +10764,8 @@ msgid "" "AnimationPlayer is pinned.\n" "Click to unpin." msgstr "" +"ปัà¸à¸«à¸¡à¸¸à¸” AnimationPlayer à¹à¸¥à¹‰à¸§\n" +"คลิà¸à¹€à¸žà¸·à¹ˆà¸à¹€à¸¥à¸´à¸à¸›à¸±à¸à¸«à¸¡à¸¸à¸”" #: editor/scene_tree_editor.cpp msgid "Invalid node name, the following characters are not allowed:" @@ -11180,14 +10788,12 @@ msgid "Select a Node" msgstr "เลืà¸à¸à¹‚หนด" #: editor/script_create_dialog.cpp -#, fuzzy msgid "Path is empty." -msgstr "ตำà¹à¸«à¸™à¹ˆà¸‡à¸—ี่à¸à¸¢à¸¹à¹ˆà¸§à¹ˆà¸²à¸‡à¹€à¸›à¸¥à¹ˆà¸²" +msgstr "ที่à¸à¸¢à¸¹à¹ˆà¸§à¹ˆà¸²à¸‡à¹€à¸›à¸¥à¹ˆà¸²" #: editor/script_create_dialog.cpp -#, fuzzy msgid "Filename is empty." -msgstr "ตำà¹à¸«à¸™à¹ˆà¸‡à¸šà¸±à¸™à¸—ึà¸à¸§à¹ˆà¸²à¸‡à¹€à¸›à¸¥à¹ˆà¸²!" +msgstr "ชื่à¸à¹„ฟล์ว่างเปล่า" #: editor/script_create_dialog.cpp #, fuzzy @@ -11200,9 +10806,8 @@ msgid "Invalid base path." msgstr "ตำà¹à¸«à¸™à¹ˆà¸‡à¹€à¸£à¸´à¹ˆà¸¡à¸•้นไม่ถูà¸à¸•้à¸à¸‡" #: editor/script_create_dialog.cpp -#, fuzzy msgid "A directory with the same name exists." -msgstr "มีโฟลเดà¸à¸£à¹Œà¸Šà¸·à¹ˆà¸à¸™à¸µà¹‰à¸à¸¢à¸¹à¹ˆà¹à¸¥à¹‰à¸§" +msgstr "มีไดเรà¸à¸—à¸à¸£à¸µà¸Šà¸·à¹ˆà¸à¸™à¸µà¹‰à¸à¸¢à¸¹à¹ˆà¹à¸¥à¹‰à¸§" #: editor/script_create_dialog.cpp #, fuzzy @@ -11227,21 +10832,18 @@ msgid "Error loading script from %s" msgstr "ผิดพลาดขณะโหลดสคริปต์จาภ%s" #: editor/script_create_dialog.cpp -#, fuzzy msgid "Overrides" -msgstr "à¸à¸³à¸«à¸™à¸”เฉพาะ..." +msgstr "à¹à¸—นที่" #: editor/script_create_dialog.cpp msgid "N/A" msgstr "ไม่มี" #: editor/script_create_dialog.cpp -#, fuzzy msgid "Open Script / Choose Location" -msgstr "เปิดตัวà¹à¸à¹‰à¹„ขสคริปต์" +msgstr "เปิดสคริปต์ / เลืà¸à¸à¸—ี่à¸à¸¢à¸¹à¹ˆ" #: editor/script_create_dialog.cpp -#, fuzzy msgid "Open Script" msgstr "เปิดสคริปต์" @@ -11251,19 +10853,16 @@ msgid "File exists, it will be reused." msgstr "มีไฟล์นี้à¸à¸¢à¸¹à¹ˆà¹à¸¥à¹‰à¸§ จะนำมาใช้" #: editor/script_create_dialog.cpp -#, fuzzy msgid "Invalid class name." msgstr "ชื่à¸à¸„ลาสไม่ถูà¸à¸•้à¸à¸‡" #: editor/script_create_dialog.cpp -#, fuzzy msgid "Invalid inherited parent name or path." msgstr "ชื่à¸à¸«à¸£à¸·à¸à¸•ำà¹à¸«à¸™à¹ˆà¸‡à¸—ีสืบทà¸à¸”ไม่ถูà¸à¸•้à¸à¸‡" #: editor/script_create_dialog.cpp -#, fuzzy msgid "Script path/name is valid." -msgstr "สคริปต์ถูà¸à¸•้à¸à¸‡" +msgstr "ที่à¸à¸¢à¸¹à¹ˆ/ชื่à¸à¸‚à¸à¸‡à¸ªà¸„ริปต์ถูà¸à¸•้à¸à¸‡" #: editor/script_create_dialog.cpp #, fuzzy @@ -11276,29 +10875,30 @@ msgid "Built-in script (into scene file)." msgstr "à¸à¸±à¸‡à¸ªà¸„ริปต์ในไฟล์ฉาà¸" #: editor/script_create_dialog.cpp -#, fuzzy msgid "Will create a new script file." -msgstr "สร้างสคริปต์ใหม่" +msgstr "จะทำà¸à¸²à¸£à¸ªà¸£à¹‰à¸²à¸‡à¸ªà¸„ริปต์ใหม่" #: editor/script_create_dialog.cpp -#, fuzzy msgid "Will load an existing script file." -msgstr "โหลดสคริปต์จาà¸à¸”ิสà¸à¹Œ" +msgstr "จะทำà¸à¸²à¸£à¹‚หลดไฟล์สคริปต์ที่มีà¸à¸¢à¸¹à¹ˆ" #: editor/script_create_dialog.cpp -#, fuzzy msgid "Script file already exists." -msgstr "มีà¸à¸²à¸£à¸à¸£à¸°à¸—ำ '%s' à¸à¸¢à¸¹à¹ˆà¹à¸¥à¹‰à¸§!" +msgstr "ไฟล์สคริปต์มีà¸à¸¢à¸¹à¹ˆà¹à¸¥à¹‰à¸§" + +#: editor/script_create_dialog.cpp +msgid "" +"Note: Built-in scripts have some limitations and can't be edited using an " +"external editor." +msgstr "" #: editor/script_create_dialog.cpp -#, fuzzy msgid "Class Name:" -msgstr "ชื่à¸à¸„ลาส" +msgstr "ชื่à¸à¸„ลาส:" #: editor/script_create_dialog.cpp -#, fuzzy msgid "Template:" -msgstr "à¹à¸¡à¹ˆà¹à¸šà¸š" +msgstr "à¹à¸¡à¹ˆà¹à¸šà¸š:" #: editor/script_create_dialog.cpp #, fuzzy @@ -11318,38 +10918,32 @@ msgid "Bytes:" msgstr "ไบต์:" #: editor/script_editor_debugger.cpp -#, fuzzy msgid "Warning:" -msgstr "คำเตืà¸à¸™" +msgstr "คำเตืà¸à¸™:" #: editor/script_editor_debugger.cpp msgid "Error:" msgstr "ผิดพลาด:" #: editor/script_editor_debugger.cpp -#, fuzzy msgid "C++ Error" -msgstr "คัดลà¸à¸à¸œà¸´à¸”พลาด" +msgstr "C++ ผิดพลาด" #: editor/script_editor_debugger.cpp -#, fuzzy msgid "C++ Error:" -msgstr "ผิดพลาด:" +msgstr "C++ ผิดพลาด:" #: editor/script_editor_debugger.cpp -#, fuzzy msgid "C++ Source" -msgstr "ต้นฉบับ:" +msgstr "C++ ต้นฉบับ" #: editor/script_editor_debugger.cpp -#, fuzzy msgid "Source:" msgstr "ต้นฉบับ:" #: editor/script_editor_debugger.cpp -#, fuzzy msgid "C++ Source:" -msgstr "ต้นฉบับ:" +msgstr "C++ ต้นฉบับ:" #: editor/script_editor_debugger.cpp #, fuzzy @@ -11375,9 +10969,8 @@ msgid "Video RAM" msgstr "หน่วยความจำวีดีโà¸" #: editor/script_editor_debugger.cpp -#, fuzzy msgid "Skip Breakpoints" -msgstr "ลบจุด" +msgstr "ข้ามเบรà¸à¸žà¸à¸¢à¸•์" #: editor/script_editor_debugger.cpp msgid "Inspect Previous Instance" @@ -11393,7 +10986,7 @@ msgstr "สà¹à¸•ค" #: editor/script_editor_debugger.cpp msgid "Profiler" -msgstr "ประสิทธิภาพ" +msgstr "ตัวตรวจวิเคราะห์ประสิทธิภาพ (Profiler)" #: editor/script_editor_debugger.cpp #, fuzzy @@ -11425,12 +11018,17 @@ msgid "Total:" msgstr "ทั้งหมด:" #: editor/script_editor_debugger.cpp +#, fuzzy +msgid "Export list to a CSV file" +msgstr "ส่งà¸à¸à¸à¹‚ปรไฟล์" + +#: editor/script_editor_debugger.cpp msgid "Resource Path" msgstr "ตำà¹à¸«à¸™à¹ˆà¸‡à¸£à¸µà¸‹à¸à¸£à¹Œà¸ª" #: editor/script_editor_debugger.cpp msgid "Type" -msgstr "ประเภท" +msgstr "ชนิด" #: editor/script_editor_debugger.cpp msgid "Format" @@ -11438,7 +11036,7 @@ msgstr "รูปà¹à¸šà¸š" #: editor/script_editor_debugger.cpp msgid "Usage" -msgstr "ใช้" +msgstr "à¸à¸²à¸£à¹ƒà¸Šà¹‰" #: editor/script_editor_debugger.cpp msgid "Misc" @@ -11462,26 +11060,23 @@ msgstr "à¸à¸³à¸«à¸™à¸”จาà¸à¸œà¸±à¸‡" #: editor/script_editor_debugger.cpp msgid "Export measures as CSV" -msgstr "" +msgstr "ส่งà¸à¸à¸à¸„่าเป็น CSV" #: editor/settings_config_dialog.cpp -#, fuzzy msgid "Erase Shortcut" -msgstr "à¸à¸à¸à¸™à¸¸à¹ˆà¸¡à¸™à¸§à¸¥" +msgstr "ลบทางลัด" #: editor/settings_config_dialog.cpp -#, fuzzy msgid "Restore Shortcut" -msgstr "ทางลัด" +msgstr "คืนค่าทางลัด" #: editor/settings_config_dialog.cpp -#, fuzzy msgid "Change Shortcut" -msgstr "à¹à¸à¹‰à¹„ขà¸à¸²à¸£à¸•รึง" +msgstr "à¹à¸à¹‰à¹„ขทางลัด" #: editor/settings_config_dialog.cpp msgid "Editor Settings" -msgstr "ตัวเลืà¸à¸à¹‚ปรà¹à¸à¸£à¸¡à¸ªà¸£à¹‰à¸²à¸‡à¹€à¸à¸¡" +msgstr "ตั้งค่าเà¸à¸”ิเตà¸à¸£à¹Œ" #: editor/settings_config_dialog.cpp msgid "Shortcuts" @@ -11501,11 +11096,11 @@ msgstr "à¹à¸à¹‰à¹„ขà¸à¸‡à¸¨à¸²à¸à¸²à¸£à¹€à¸›à¸¥à¹ˆà¸‡à¹€à¸ªà¸µà¸¢à¸‡à¸‚ภ#: editor/spatial_editor_gizmos.cpp msgid "Change Camera FOV" -msgstr "ปรับขà¸à¸šà¹€à¸‚ตà¸à¸²à¸£à¸¡à¸à¸‡à¹€à¸«à¹‡à¸™à¸‚à¸à¸‡à¸à¸¥à¹‰à¸à¸‡" +msgstr "ปรับà¸à¸¥à¹‰à¸à¸‡ FOV" #: editor/spatial_editor_gizmos.cpp msgid "Change Camera Size" -msgstr "ปรับขนาดà¸à¸¥à¹‰à¸à¸‡" +msgstr "เปลี่ยนขนาดà¸à¸¥à¹‰à¸à¸‡" #: editor/spatial_editor_gizmos.cpp #, fuzzy @@ -11537,7 +11132,6 @@ msgid "Change Capsule Shape Height" msgstr "ปรับความสูงทรงà¹à¸„ปซูล" #: editor/spatial_editor_gizmos.cpp -#, fuzzy msgid "Change Cylinder Shape Radius" msgstr "ปรับรัศมีทรงà¹à¸„ปซูล" @@ -11551,14 +11145,12 @@ msgid "Change Ray Shape Length" msgstr "ปรับความยาวรังสี" #: modules/csg/csg_gizmos.cpp -#, fuzzy msgid "Change Cylinder Radius" -msgstr "ปรับรัศมีà¹à¸ªà¸‡" +msgstr "ปรับรัศมีทรงà¸à¸£à¸°à¸šà¸à¸" #: modules/csg/csg_gizmos.cpp -#, fuzzy msgid "Change Cylinder Height" -msgstr "ปรับความสูงทรงà¹à¸„ปซูล" +msgstr "ปรับความสูงทรงà¸à¸£à¸°à¸šà¸à¸" #: modules/csg/csg_gizmos.cpp #, fuzzy @@ -11608,12 +11200,11 @@ msgstr "GDNativeLibrary" #: modules/gdnative/gdnative_library_singleton_editor.cpp msgid "Enabled GDNative Singleton" -msgstr "" +msgstr "เปิดà¸à¸²à¸£à¸—ำงานซิงเà¸à¸´à¸¥à¸•ัน GDNative" #: modules/gdnative/gdnative_library_singleton_editor.cpp -#, fuzzy msgid "Disabled GDNative Singleton" -msgstr "ปิดà¸à¸²à¸£à¸à¸±à¸žà¹€à¸”ทตัวหมุน" +msgstr "ปิดà¸à¸²à¸£à¸—ำงานซิงเà¸à¸´à¸¥à¸•ัน GDNative" #: modules/gdnative/gdnative_library_singleton_editor.cpp msgid "Library" @@ -11628,9 +11219,8 @@ msgid "GDNative" msgstr "GDNative" #: modules/gdscript/gdscript_functions.cpp -#, fuzzy msgid "Step argument is zero!" -msgstr "ตัวà¹à¸›à¸£ step เป็นศูนย์!" +msgstr "ช่วงà¸à¸²à¸à¸´à¸§à¹€à¸¡à¸™à¸•์เป็นศูนย์!" #: modules/gdscript/gdscript_functions.cpp msgid "Not a script with an instance" @@ -11658,7 +11248,7 @@ msgstr "รูปà¹à¸šà¸šà¸”ิà¸à¸Šà¸±à¸™à¸™à¸²à¸£à¸µà¸—ี่เà¸à¹‡à¸šà¸ #: modules/gdscript/gdscript_functions.cpp msgid "Invalid instance dictionary (invalid subclasses)" -msgstr "ดิà¸à¸Šà¸±à¸™à¸™à¸²à¸£à¸µà¸—ี่เà¸à¹‡à¸šà¸à¸´à¸™à¸ªà¹à¸•นซ์ผิดพลาด (คลาสย่à¸à¸¢à¸œà¸´à¸”พลาด)" +msgstr "ดิà¸à¸Šà¸±à¸™à¸™à¸²à¸£à¸µà¸à¸´à¸™à¸ªà¹à¸•นซ์ผิดพลาด (คลาสย่à¸à¸¢à¸œà¸´à¸”พลาด)" #: modules/gdscript/gdscript_functions.cpp msgid "Object can't provide a length." @@ -11767,18 +11357,16 @@ msgid "Cursor Clear Rotation" msgstr "เคà¸à¸£à¹Œà¹€à¸‹à¸à¸£à¹Œà¸¥à¸šà¸à¸²à¸£à¸«à¸¡à¸¸à¸™" #: modules/gridmap/grid_map_editor_plugin.cpp -#, fuzzy msgid "Paste Selects" -msgstr "ลบที่เลืà¸à¸" +msgstr "วางที่เลืà¸à¸" #: modules/gridmap/grid_map_editor_plugin.cpp msgid "Clear Selection" msgstr "ลบที่เลืà¸à¸" #: modules/gridmap/grid_map_editor_plugin.cpp -#, fuzzy msgid "Fill Selection" -msgstr "เลืà¸à¸à¸—ั้งหมด" +msgstr "เติมส่วนที่เลืà¸à¸" #: modules/gridmap/grid_map_editor_plugin.cpp msgid "GridMap Settings" @@ -11819,7 +11407,7 @@ msgstr "à¸à¸³à¸¥à¸±à¸‡à¸ˆà¸±à¸”à¸à¸²à¸£à¹‚ครงร่าง..." #: modules/recast/navigation_mesh_generator.cpp msgid "Calculating grid size..." -msgstr "à¸à¸³à¸¥à¸±à¸‡à¸„ำนวณขนาดตาราง..." +msgstr "à¸à¸³à¸¥à¸±à¸‡à¸„ำนวณขนาดà¸à¸£à¸´à¸”..." #: modules/recast/navigation_mesh_generator.cpp msgid "Creating heightfield..." @@ -11917,42 +11505,36 @@ msgid "Set Variable Type" msgstr "à¹à¸à¹‰à¹„ขประเภทตัวà¹à¸›à¸£" #: modules/visual_script/visual_script_editor.cpp -#, fuzzy msgid "Add Input Port" -msgstr "เพิ่มà¸à¸´à¸™à¸žà¸¸à¸•" +msgstr "เพิ่มพà¸à¸£à¹Œà¸•à¸à¸´à¸™à¸žà¸¸à¸•" #: modules/visual_script/visual_script_editor.cpp -#, fuzzy msgid "Add Output Port" -msgstr "เพิ่มà¸à¸´à¸™à¸žà¸¸à¸•" +msgstr "เพิ่มพà¸à¸£à¹Œà¸•เà¸à¸²à¸—์พุต" #: modules/visual_script/visual_script_editor.cpp -#, fuzzy msgid "Override an existing built-in function." -msgstr "ชื่à¸à¸œà¸´à¸”พลาด ต้à¸à¸‡à¹„ม่ใช้ชื่à¸à¹€à¸”ียวà¸à¸±à¸šà¸Šà¸™à¸´à¸”ตัวà¹à¸›à¸£" +msgstr "เขียนทับฟังà¸à¹Œà¸Šà¸±à¸™à¸šà¸´à¸§à¸—์à¸à¸´à¸™à¸—ี่มีà¸à¸¢à¸¹à¹ˆ" #: modules/visual_script/visual_script_editor.cpp -#, fuzzy msgid "Create a new function." -msgstr "สร้าง %s ใหม่" +msgstr "สร้างฟังà¸à¹Œà¸Šà¸±à¸™à¹ƒà¸«à¸¡à¹ˆ" #: modules/visual_script/visual_script_editor.cpp msgid "Variables:" msgstr "ตัวà¹à¸›à¸£:" #: modules/visual_script/visual_script_editor.cpp -#, fuzzy msgid "Create a new variable." -msgstr "สร้าง %s ใหม่" +msgstr "สร้างตัวà¹à¸›à¸£à¹ƒà¸«à¸¡à¹ˆ" #: modules/visual_script/visual_script_editor.cpp msgid "Signals:" msgstr "สัà¸à¸à¸²à¸“:" #: modules/visual_script/visual_script_editor.cpp -#, fuzzy msgid "Create a new signal." -msgstr "สร้างรูปหลายเหลี่ยมจาà¸à¸„วามว่างเปล่า" +msgstr "สร้างสัà¸à¸à¸²à¸“ใหม่" #: modules/visual_script/visual_script_editor.cpp msgid "Name is not a valid identifier:" @@ -11979,9 +11561,8 @@ msgid "Add Function" msgstr "เพิ่มฟังà¸à¹Œà¸Šà¸±à¸™" #: modules/visual_script/visual_script_editor.cpp -#, fuzzy msgid "Delete input port" -msgstr "ลบจุด" +msgstr "ลบพà¸à¸£à¹Œà¸•à¸à¸´à¸™à¸žà¸¸à¸•" #: modules/visual_script/visual_script_editor.cpp msgid "Add Variable" @@ -11992,14 +11573,12 @@ msgid "Add Signal" msgstr "เพิ่มสัà¸à¸à¸²à¸“" #: modules/visual_script/visual_script_editor.cpp -#, fuzzy msgid "Remove Input Port" -msgstr "ลบจุด" +msgstr "ลบพà¸à¸£à¹Œà¸•à¸à¸´à¸™à¸žà¸¸à¸•" #: modules/visual_script/visual_script_editor.cpp -#, fuzzy msgid "Remove Output Port" -msgstr "ลบจุด" +msgstr "ลบพà¸à¸£à¹Œà¸•เà¸à¸²à¸•์พุต" #: modules/visual_script/visual_script_editor.cpp msgid "Change Expression" @@ -12007,11 +11586,11 @@ msgstr "à¹à¸à¹‰à¹„ขสมà¸à¸²à¸£" #: modules/visual_script/visual_script_editor.cpp msgid "Remove VisualScript Nodes" -msgstr "ลบโหนด" +msgstr "ลบโหนด VisualScript" #: modules/visual_script/visual_script_editor.cpp msgid "Duplicate VisualScript Nodes" -msgstr "ทำซ้ำโหนด" +msgstr "ทำซ้ำโหนด VisualScript" #: modules/visual_script/visual_script_editor.cpp msgid "Hold %s to drop a Getter. Hold Shift to drop a generic signature." @@ -12069,26 +11648,23 @@ msgstr "ย้ายโหนด" #: modules/visual_script/visual_script_editor.cpp msgid "Remove VisualScript Node" -msgstr "ลบโหนด" +msgstr "ลบโหนด VisualScript" #: modules/visual_script/visual_script_editor.cpp msgid "Connect Nodes" msgstr "เชื่à¸à¸¡à¹‚หนด" #: modules/visual_script/visual_script_editor.cpp -#, fuzzy msgid "Disconnect Nodes" msgstr "ตัดà¸à¸²à¸£à¹€à¸Šà¸·à¹ˆà¸à¸¡à¸•่à¸à¹‚หนด" #: modules/visual_script/visual_script_editor.cpp -#, fuzzy msgid "Connect Node Data" -msgstr "เชื่à¸à¸¡à¹‚หนด" +msgstr "เชื่à¸à¸¡à¸•่à¸à¸‚้à¸à¸¡à¸¹à¸¥à¹‚หนด" #: modules/visual_script/visual_script_editor.cpp -#, fuzzy msgid "Connect Node Sequence" -msgstr "เชื่à¸à¸¡à¹‚หนด" +msgstr "เชื่à¸à¸¡à¸•่à¸à¸à¸±à¸šà¸¥à¸³à¸”ับขà¸à¸‡à¹‚หนด" #: modules/visual_script/visual_script_editor.cpp msgid "Script already has function '%s'" @@ -12099,9 +11675,8 @@ msgid "Change Input Value" msgstr "à¹à¸à¹‰à¹„ขค่าà¸à¸´à¸™à¸žà¸¸à¸•" #: modules/visual_script/visual_script_editor.cpp -#, fuzzy msgid "Resize Comment" -msgstr "à¹à¸à¹‰à¹„ข CanvasItem" +msgstr "à¹à¸à¹‰à¸‚นาดคà¸à¸¡à¹€à¸¡à¹‰à¸™à¸•์" #: modules/visual_script/visual_script_editor.cpp msgid "Can't copy the function node." @@ -12113,12 +11688,11 @@ msgstr "คลิปบà¸à¸£à¹Œà¸”ว่างเปล่า!" #: modules/visual_script/visual_script_editor.cpp msgid "Paste VisualScript Nodes" -msgstr "วางโหนด" +msgstr "วางโหนด VisualScript" #: modules/visual_script/visual_script_editor.cpp -#, fuzzy msgid "Can't create function with a function node." -msgstr "คัดลà¸à¸à¹‚หนดฟังà¸à¹Œà¸Šà¸±à¸™à¹„ม่ได้" +msgstr "ไม่สามารถสร้างฟังà¸à¹Œà¸Šà¸±à¸™à¹„ด้จาà¸à¹‚หนดฟังà¸à¹Œà¸Šà¸±à¸™" #: modules/visual_script/visual_script_editor.cpp msgid "Can't create function of nodes from nodes of multiple functions." @@ -12133,9 +11707,8 @@ msgid "Try to only have one sequence input in selection." msgstr "" #: modules/visual_script/visual_script_editor.cpp -#, fuzzy msgid "Create Function" -msgstr "เปลี่ยนชื่à¸à¸Ÿà¸±à¸‡à¸à¹Œà¸Šà¸±à¸™" +msgstr "สร้างฟังà¸à¹Œà¸Šà¸±à¸™" #: modules/visual_script/visual_script_editor.cpp msgid "Remove Function" @@ -12158,33 +11731,28 @@ msgid "Editing Signal:" msgstr "à¹à¸à¹‰à¹„ขสัà¸à¸à¸²à¸“:" #: modules/visual_script/visual_script_editor.cpp -#, fuzzy msgid "Make Tool:" -msgstr "ระยะใà¸à¸¥à¹‰" +msgstr "เครื่à¸à¸‡à¸¡à¸·à¸à¸ªà¸£à¹‰à¸²à¸‡:" #: modules/visual_script/visual_script_editor.cpp msgid "Members:" -msgstr "ตัวà¹à¸›à¸£:" +msgstr "สมาชิà¸:" #: modules/visual_script/visual_script_editor.cpp -#, fuzzy msgid "Change Base Type:" -msgstr "เปลี่ยนประเภท" +msgstr "เปลี่ยนประเภทà¸à¸²à¸™:" #: modules/visual_script/visual_script_editor.cpp -#, fuzzy msgid "Add Nodes..." -msgstr "เพิ่มโหนด" +msgstr "เพิ่มโหนด..." #: modules/visual_script/visual_script_editor.cpp -#, fuzzy msgid "Add Function..." -msgstr "เพิ่มฟังà¸à¹Œà¸Šà¸±à¸™" +msgstr "เพิ่มฟังà¸à¹Œà¸Šà¸±à¸™..." #: modules/visual_script/visual_script_editor.cpp -#, fuzzy msgid "function_name" -msgstr "ฟังà¸à¹Œà¸Šà¸±à¸™:" +msgstr "ชื่à¸à¸Ÿà¸±à¸‡à¸à¹Œà¸Šà¸±à¹ˆà¸™" #: modules/visual_script/visual_script_editor.cpp #, fuzzy @@ -12208,19 +11776,16 @@ msgid "Cut Nodes" msgstr "ตัดโหนด" #: modules/visual_script/visual_script_editor.cpp -#, fuzzy msgid "Make Function" -msgstr "เปลี่ยนชื่à¸à¸Ÿà¸±à¸‡à¸à¹Œà¸Šà¸±à¸™" +msgstr "สร้างฟังà¸à¹Œà¸Šà¸±à¸™" #: modules/visual_script/visual_script_editor.cpp -#, fuzzy msgid "Refresh Graph" -msgstr "รีเฟรช" +msgstr "รีเฟรชà¸à¸£à¸²à¸Ÿ" #: modules/visual_script/visual_script_editor.cpp -#, fuzzy msgid "Edit Member" -msgstr "ตัวà¹à¸›à¸£" +msgstr "à¹à¸à¹‰à¹„ขสมาชิà¸" #: modules/visual_script/visual_script_flow_control.cpp msgid "Input type not iterable: " @@ -12277,41 +11842,40 @@ msgid "" msgstr "ค่าคืนจาภ_step() ผิดพลาด ต้à¸à¸‡à¹€à¸›à¹‡à¸™à¸ˆà¸³à¸™à¸§à¸™à¹€à¸•็ม (ลำดับ) หรืà¸à¸ªà¸•ริง (ข้à¸à¸œà¸´à¸”พลาด)" #: modules/visual_script/visual_script_property_selector.cpp -#, fuzzy msgid "Search VisualScript" -msgstr "ลบโหนด" +msgstr "ค้นหาโหนด VisualScript" #: modules/visual_script/visual_script_property_selector.cpp msgid "Get %s" -msgstr "" +msgstr "รับ %s" #: modules/visual_script/visual_script_property_selector.cpp msgid "Set %s" -msgstr "" +msgstr "ตั้ง %s" #: platform/android/export/export.cpp msgid "Package name is missing." -msgstr "" +msgstr "ชื่à¸à¹à¸žà¹‡à¸„เà¸à¸ˆà¸«à¸²à¸¢à¹„ป" #: platform/android/export/export.cpp msgid "Package segments must be of non-zero length." -msgstr "" +msgstr "ส่วนขà¸à¸‡à¹à¸žà¹‡à¸„เà¸à¸ˆà¸ˆà¸°à¸•้à¸à¸‡à¸¡à¸µà¸„วามยาวไม่เป็นศูนย์" #: platform/android/export/export.cpp msgid "The character '%s' is not allowed in Android application package names." -msgstr "" +msgstr "ตัวà¸à¸±à¸à¸©à¸£ '%s' ไม่à¸à¸™à¸¸à¸à¸²à¸•ให้ใช้ในชื่à¸à¸‚à¸à¸‡ Android application package" #: platform/android/export/export.cpp msgid "A digit cannot be the first character in a package segment." -msgstr "" +msgstr "ไม่สามารถใช้ตัวเลขเป็นตัวà¹à¸£à¸à¹ƒà¸™à¸ªà¹ˆà¸§à¸™à¸‚à¸à¸‡à¹à¸žà¹‡à¸„เà¸à¸ˆ" #: platform/android/export/export.cpp msgid "The character '%s' cannot be the first character in a package segment." -msgstr "" +msgstr "ตัวà¸à¸±à¸à¸©à¸£ '%s' ไม่สามารถเป็นตัวà¸à¸±à¸à¸©à¸£à¸•ัวà¹à¸£à¸à¹ƒà¸™à¸ªà¹ˆà¸§à¸™à¸‚à¸à¸‡à¹à¸žà¹‡à¸„เà¸à¸ˆ" #: platform/android/export/export.cpp msgid "The package must have at least one '.' separator." -msgstr "" +msgstr "à¹à¸žà¹‡à¸„เà¸à¸ˆà¸ˆà¸³à¹€à¸›à¹‡à¸™à¸•้à¸à¸‡à¸¡à¸µ '.' à¸à¸¢à¹ˆà¸²à¸‡à¸™à¹‰à¸à¸¢à¸«à¸™à¸¶à¹ˆà¸‡à¸•ัว" #: platform/android/export/export.cpp msgid "Select device from the list" @@ -12319,11 +11883,11 @@ msgstr "เลืà¸à¸à¸à¸¸à¸›à¸à¸£à¸“์จาà¸à¸£à¸²à¸¢à¸Šà¸·à¹ˆà¸" #: platform/android/export/export.cpp msgid "ADB executable not configured in the Editor Settings." -msgstr "" +msgstr "ADB executable ยังไม่ได้à¸à¸³à¸«à¸™à¸”ค่าในตั้งค่าเà¸à¸”ิเตà¸à¸£à¹Œ" #: platform/android/export/export.cpp msgid "OpenJDK jarsigner not configured in the Editor Settings." -msgstr "" +msgstr "OpenJDK jarsigner ยังไม่ได้à¸à¸³à¸«à¸™à¸”ค่าในตั้งค่าเà¸à¸”ิเตà¸à¸£à¹Œ" #: platform/android/export/export.cpp msgid "Debug keystore not configured in the Editor Settings nor in the preset." @@ -12348,9 +11912,8 @@ msgid "Invalid public key for APK expansion." msgstr "" #: platform/android/export/export.cpp -#, fuzzy msgid "Invalid package name:" -msgstr "ชื่à¸à¸„ลาสไม่ถูà¸à¸•้à¸à¸‡" +msgstr "ชื่à¸à¹à¸žà¹‡à¸„เà¸à¸ˆà¸œà¸´à¸”พลาด:" #: platform/android/export/export.cpp msgid "" @@ -12368,7 +11931,7 @@ msgstr "" #: platform/android/export/export.cpp msgid "Building Android Project (gradle)" -msgstr "" +msgstr "à¸à¸³à¸¥à¸±à¸‡à¸ªà¸£à¹‰à¸²à¸‡à¹‚ปรเจคà¹à¸à¸™à¸”รà¸à¸¢à¸”์ (gradle)" #: platform/android/export/export.cpp msgid "" @@ -12391,7 +11954,7 @@ msgstr "ไม่สามารถใช้ชื่à¸à¸™à¸µà¹‰à¹„ด้:" #: platform/iphone/export/export.cpp msgid "App Store Team ID not specified - cannot configure the project." -msgstr "" +msgstr "App Store Team ID ยังไม่ได้ระบุ - ไม่สามารถà¸à¸³à¸«à¸™à¸”ค่าให้โปรเจà¸à¸•์ได้" #: platform/iphone/export/export.cpp #, fuzzy @@ -12404,7 +11967,7 @@ msgstr "" #: platform/javascript/export/export.cpp msgid "Stop HTTP Server" -msgstr "" +msgstr "หยุดเซิฟเวà¸à¸£à¹Œ HTTP" #: platform/javascript/export/export.cpp msgid "Run in Browser" @@ -12449,9 +12012,8 @@ msgid "Invalid package unique name." msgstr "ชื่à¸à¹€à¸‰à¸žà¸²à¸°à¹„ม่ถูà¸à¸•้à¸à¸‡" #: platform/uwp/export/export.cpp -#, fuzzy msgid "Invalid package publisher display name." -msgstr "ชื่à¸à¹€à¸‰à¸žà¸²à¸°à¹„ม่ถูà¸à¸•้à¸à¸‡" +msgstr "ชื่à¸à¹à¸ªà¸”งผู้จัดจำหน่ายà¹à¸žà¸„เà¸à¸ˆà¹„ม่ถูà¸à¸•้à¸à¸‡" #: platform/uwp/export/export.cpp msgid "Invalid product GUID." @@ -12505,7 +12067,7 @@ msgid "" "Only one visible CanvasModulate is allowed per scene (or set of instanced " "scenes). The first created one will work, while the rest will be ignored." msgstr "" -"จะมี CanvasModulate ที่มà¸à¸‡à¹€à¸«à¹‡à¸™à¹„ด้เพียงโหนดเดียวในฉาภ(หรืà¸à¸à¸¥à¸¸à¹ˆà¸¡à¸‚à¸à¸‡à¸‰à¸²à¸à¸—ี่เป็นà¸à¸´à¸™à¸ªà¹à¸•นซ์) " +"จะมี CanvasModulate ที่มà¸à¸‡à¹€à¸«à¹‡à¸™à¹„ด้ เพียงโหนดเดียวในฉาภ(หรืà¸à¸à¸¥à¸¸à¹ˆà¸¡à¸‚à¸à¸‡à¸‰à¸²à¸à¸—ี่เป็นà¸à¸´à¸™à¸ªà¹à¸•นซ์) " "โหนดà¹à¸£à¸à¹€à¸—่านั้นที่จะทำงานได้ปà¸à¸•ิ ที่เหลืà¸à¸ˆà¸°à¹„ม่ทำงาน" #: scene/2d/collision_object_2d.cpp @@ -12584,7 +12146,7 @@ msgid "" "node. It only provides navigation data." msgstr "" "NavigationPolygonInstance ต้à¸à¸‡à¹€à¸›à¹‡à¸™à¹‚หนดลูà¸/หลานขà¸à¸‡à¹‚หนด Navigation2D " -"เนื่à¸à¸‡à¸ˆà¸²à¸à¹‚หนดนี้ใช้เà¸à¹‡à¸šà¸‚้à¸à¸¡à¸¹à¸¥à¸à¸²à¸£à¸™à¸³à¸—างเท่านั้น" +"โดยจะให้ข้à¸à¸¡à¸¹à¸¥à¸à¸²à¸£à¸™à¸³à¸—างเท่านั้น" #: scene/2d/parallax_layer.cpp msgid "" @@ -12633,7 +12195,7 @@ msgstr "" #: scene/2d/skeleton_2d.cpp msgid "A Bone2D only works with a Skeleton2D or another Bone2D as parent node." -msgstr "" +msgstr "Bone2D สามารถทำงานได้à¸à¸±à¸š Skeleton2D หรืภBone2D ตัวà¸à¸·à¹ˆà¸™à¹‚ดยเป็นโหนดà¹à¸¡à¹ˆ" #: scene/2d/skeleton_2d.cpp msgid "" @@ -12676,9 +12238,8 @@ msgid "" msgstr "Controller id ต้à¸à¸‡à¹„ม่เป็น 0 ไม่เช่นนั้นตัวควบคุมนี้จะไม่เชื่à¸à¸¡à¸à¸±à¸šà¸à¸¸à¸›à¸à¸£à¸“์จริง" #: scene/3d/arvr_nodes.cpp -#, fuzzy msgid "ARVRAnchor must have an ARVROrigin node as its parent." -msgstr "ARVRAnchor ต้à¸à¸‡à¸¡à¸µ ARVROrigin เป็นโหนดà¹à¸¡à¹ˆ" +msgstr "ARVRAnchor ต้à¸à¸‡à¸¡à¸µà¹‚หนด ARVROrigin เป็นโหนดà¹à¸¡à¹ˆ" #: scene/3d/arvr_nodes.cpp #, fuzzy @@ -12688,9 +12249,8 @@ msgid "" msgstr "Anchor id ต้à¸à¸‡à¹„ม่เป็น 0 ไม่เช่นนั้น anchor นี้จะไม่เชื่à¸à¸¡à¸à¸±à¸š anchor จริง" #: scene/3d/arvr_nodes.cpp -#, fuzzy msgid "ARVROrigin requires an ARVRCamera child node." -msgstr "ARVROrigin ต้à¸à¸‡à¸¡à¸µ ARVRCamera เป็นโหนดลูà¸" +msgstr "ARVROrigin จำเป็นต้à¸à¸‡à¸¡à¸µ ARVRCamera เป็นโหนดลูà¸" #: scene/3d/baked_lightmap.cpp msgid "%d%%" @@ -12786,6 +12346,8 @@ msgid "" "GIProbes are not supported by the GLES2 video driver.\n" "Use a BakedLightmap instead." msgstr "" +"ไดรเวà¸à¸£à¹Œà¸§à¸µà¸”ีโภGLES2 ไม่สนับสนุน GIProbe\n" +"ใช้ BakedLightmap à¹à¸—น" #: scene/3d/light.cpp msgid "A SpotLight with an angle wider than 90 degrees cannot cast shadows." @@ -12801,7 +12363,7 @@ msgid "" "It only provides navigation data." msgstr "" "NavigationMeshInstance ต้à¸à¸‡à¹€à¸›à¹‡à¸™à¹‚หนดลูà¸/หลานขà¸à¸‡à¹‚หนด Navigation " -"โหนดนี้ใช้เพื่à¸à¹€à¸›à¹‡à¸™à¸‚้à¸à¸¡à¸¹à¸¥à¹ƒà¸™à¸à¸²à¸£à¸™à¸³à¸—างเท่านั้น" +"โดยจะให้ข้à¸à¸¡à¸¹à¸¥à¸à¸²à¸£à¸™à¸³à¸—างเท่านั้น" #: scene/3d/particles.cpp msgid "" @@ -12884,7 +12446,7 @@ msgstr "" #: scene/3d/world_environment.cpp msgid "" "Only one WorldEnvironment is allowed per scene (or set of instanced scenes)." -msgstr "จะมี WorldEnvironment ได้เพียงโหนดเดียวในฉาภ(หรืà¸à¸à¸¥à¸¸à¹ˆà¸¡à¸‚à¸à¸‡à¸‰à¸²à¸à¸—ี่เป็นà¸à¸´à¸™à¸ªà¹à¸•นซ์)" +msgstr "จะมี WorldEnvironment ได้เพียงà¸à¸±à¸™à¹€à¸”ียวในฉาภ(หรืà¸à¸à¸¥à¸¸à¹ˆà¸¡à¸‚à¸à¸‡à¸‰à¸²à¸à¸—ี่เป็นà¸à¸´à¸™à¸ªà¹à¸•นซ์)" #: scene/3d/world_environment.cpp msgid "" @@ -12897,23 +12459,20 @@ msgid "On BlendTree node '%s', animation not found: '%s'" msgstr "" #: scene/animation/animation_blend_tree.cpp -#, fuzzy msgid "Animation not found: '%s'" -msgstr "เครื่à¸à¸‡à¸¡à¸·à¸à¹à¸à¸™à¸´à¹€à¸¡à¸Šà¸±à¸™" +msgstr "ไม่พบà¹à¸à¸™à¸´à¹€à¸¡à¸Šà¸±à¸™: '%s'" #: scene/animation/animation_tree.cpp msgid "In node '%s', invalid animation: '%s'." msgstr "" #: scene/animation/animation_tree.cpp -#, fuzzy msgid "Invalid animation: '%s'." -msgstr "ผิดพลาด: ชื่à¸à¹à¸à¸™à¸´à¹€à¸¡à¸Šà¸±à¸™à¹„ม่ถูà¸à¸•้à¸à¸‡!" +msgstr "à¹à¸à¸™à¸´à¹€à¸¡à¸Šà¸±à¸™à¸œà¸´à¸”พลาด: '%s'." #: scene/animation/animation_tree.cpp -#, fuzzy msgid "Nothing connected to input '%s' of node '%s'." -msgstr "ลบà¸à¸²à¸£à¹€à¸Šà¸·à¹ˆà¸à¸¡à¹‚ยง '%s' à¸à¸±à¸š '%s'" +msgstr "ไม่มีà¸à¸²à¸£à¹€à¸Šà¸·à¹ˆà¸à¸¡à¸•่à¸à¹„ปที่à¸à¸´à¸™à¸žà¸¸à¸• '%s' ขà¸à¸‡à¹‚หนด '%s'." #: scene/animation/animation_tree.cpp msgid "No root AnimationNode for the graph is set." @@ -12943,6 +12502,9 @@ msgid "" "LMB: Set color\n" "RMB: Remove preset" msgstr "" +"สี: #%s\n" +"คลิà¸à¸‹à¹‰à¸²à¸¢: เลืà¸à¸à¸ªà¸µ\n" +"คลิà¸à¸‚วา: ลบสี" #: scene/gui/color_picker.cpp msgid "Pick a color from the editor window." @@ -12950,11 +12512,11 @@ msgstr "" #: scene/gui/color_picker.cpp msgid "HSV" -msgstr "" +msgstr "HSV" #: scene/gui/color_picker.cpp msgid "Raw" -msgstr "" +msgstr "Raw" #: scene/gui/color_picker.cpp msgid "Switch between hexadecimal and code values." @@ -13034,6 +12596,10 @@ msgstr "" "ให้à¹à¸à¹‰à¹„ขโหนดนี้ให้เป็นโหนดลูà¸à¸‚à¸à¸‡ Control à¹à¸•่ถ้าไม่ ให้ปรับเป็น render target à¹à¸¥à¸°à¸™à¸³à¹„ปใช้เป็น " "texture ขà¸à¸‡à¹‚หนดà¸à¸·à¹ˆà¸™" +#: scene/main/viewport.cpp +msgid "Viewport size must be greater than 0 to render anything." +msgstr "" + #: scene/resources/visual_shader_nodes.cpp #, fuzzy msgid "Invalid source for preview." @@ -13063,7 +12629,16 @@ msgstr "" #: servers/visual/shader_language.cpp msgid "Constants cannot be modified." -msgstr "" +msgstr "ค่าคงที่ไม่สามารถà¹à¸à¹‰à¹„ขได้" + +#~ msgid "Issue Tracker" +#~ msgstr "ติดตามปัà¸à¸«à¸²" + +#~ msgid "Request Docs" +#~ msgstr "ร้à¸à¸‡à¸‚à¸à¸„ู่มืà¸" + +#~ msgid "Help improve the Godot documentation by giving feedback." +#~ msgstr "ช่วยพัฒนาคู่มืà¸à¹‚ดยà¸à¸²à¸£à¹ƒà¸«à¹‰à¸‚้à¸à¹€à¸ªà¸™à¸à¹à¸™à¸°" #~ msgid "Replaced %d occurrence(s)." #~ msgstr "à¹à¸—นที่à¹à¸¥à¹‰à¸§ %d ครั้ง" diff --git a/editor/translations/tr.po b/editor/translations/tr.po index 83eb878d8c..fdb8f76605 100644 --- a/editor/translations/tr.po +++ b/editor/translations/tr.po @@ -43,12 +43,13 @@ # HALİL ATAÅž <halillatass@gmail.com>, 2019. # Zsosu Ktosu <zktosu@gmail.com>, 2020. # Mesut Aslan <kontinyu@gmail.com>, 2020. +# Kaan Genç <kaan@kaangenc.me>, 2020. msgid "" msgstr "" "Project-Id-Version: Godot Engine editor\n" "POT-Creation-Date: \n" -"PO-Revision-Date: 2020-03-11 12:20+0000\n" -"Last-Translator: Mesut Aslan <kontinyu@gmail.com>\n" +"PO-Revision-Date: 2020-04-23 20:21+0000\n" +"Last-Translator: Anonymous <noreply@weblate.org>\n" "Language-Team: Turkish <https://hosted.weblate.org/projects/godot-engine/" "godot/tr/>\n" "Language: tr\n" @@ -56,7 +57,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-dev\n" +"X-Generator: Weblate 4.0.2-dev\n" #: core/math/expression.cpp modules/gdscript/gdscript_functions.cpp #: modules/visual_script/visual_script_builtin_funcs.cpp @@ -1481,7 +1482,7 @@ msgstr "KendindenYüklenme'yi Taşı" msgid "Remove Autoload" msgstr "KendindenYüklenme'yi Kaldır" -#: editor/editor_autoload_settings.cpp +#: editor/editor_autoload_settings.cpp editor/editor_plugin_settings.cpp msgid "Enable" msgstr "Etkin" @@ -2961,8 +2962,12 @@ msgid "Q&A" msgstr "S&C" #: editor/editor_node.cpp -msgid "Issue Tracker" -msgstr "Sorun İzleyici" +msgid "Report a Bug" +msgstr "Hata Bildir" + +#: editor/editor_node.cpp +msgid "Send Docs Feedback" +msgstr "Belgelendirme Hatası Bildir" #: editor/editor_node.cpp editor/plugins/asset_library_editor_plugin.cpp msgid "Community" @@ -4013,7 +4018,7 @@ msgid "Reimport" msgstr "Yeniden İçe Aktar" #: editor/import_dock.cpp -msgid "Save scenes, re-import and restart" +msgid "Save Scenes, Re-Import, and Restart" msgstr "Sahneleri kaydet, tekrar içe aktar ve baÅŸtan baÅŸlat" #: editor/import_dock.cpp @@ -5898,16 +5903,15 @@ msgstr "Tekil Dışbükey Åžekil OluÅŸtur" #: editor/plugins/mesh_instance_editor_plugin.cpp msgid "Can't create multiple convex collision shapes for the scene root." -msgstr "" +msgstr "Sahne kökü için birden fazla dışbükey çarpışma ÅŸekli oluÅŸturulamaz." #: editor/plugins/mesh_instance_editor_plugin.cpp msgid "Couldn't create any collision shapes." msgstr "Herhangi bir çarpışma ÅŸekli oluÅŸturulamadı." #: editor/plugins/mesh_instance_editor_plugin.cpp -#, fuzzy msgid "Create Multiple Convex Shapes" -msgstr "Dışbükey Åžekil[ler] OluÅŸtur" +msgstr "Dışbükey Åžekilleri OluÅŸtur" #: editor/plugins/mesh_instance_editor_plugin.cpp msgid "Create Navigation Mesh" @@ -5963,6 +5967,9 @@ msgid "" "automatically.\n" "This is the most accurate (but slowest) option for collision detection." msgstr "" +"Bir StaticBody oluÅŸturur ve otomatik olarak çokgen tabanlı bir çarpışma " +"ÅŸekli atar.\n" +"Bu, çarpışma tespiti için en doÄŸru (ancak en yavaÅŸ) seçenektir." #: editor/plugins/mesh_instance_editor_plugin.cpp msgid "Create Trimesh Collision Sibling" @@ -5977,7 +5984,6 @@ msgstr "" "Bu en hassas (fakat en yavaÅŸ) çarpışma algılama seçeneÄŸidir." #: editor/plugins/mesh_instance_editor_plugin.cpp -#, fuzzy msgid "Create Single Convex Collision Sibling" msgstr "Dışbükey Çarpışma KomÅŸusu OluÅŸtur" @@ -5986,17 +5992,20 @@ msgid "" "Creates a single convex collision shape.\n" "This is the fastest (but least accurate) option for collision detection." msgstr "" +"Tek bir dışbükey çarpışma ÅŸekli oluÅŸturur.\n" +"Bu, çarpışma tespiti için en hızlı (ancak en az doÄŸru) seçenektir." #: editor/plugins/mesh_instance_editor_plugin.cpp -#, fuzzy msgid "Create Multiple Convex Collision Siblings" -msgstr "Dışbükey Çarpışma KomÅŸusu OluÅŸtur" +msgstr "Dışbükey Çarpışma KomÅŸuları OluÅŸtur" #: editor/plugins/mesh_instance_editor_plugin.cpp msgid "" "Creates a polygon-based collision shape.\n" "This is a performance middle-ground between the two above options." msgstr "" +"Poligon bazlı bir çarpışma ÅŸekli oluÅŸtur.\n" +"Bu performans açısından üstteki iki seçeneÄŸin arasındadır." #: editor/plugins/mesh_instance_editor_plugin.cpp msgid "Create Outline Mesh..." @@ -6009,6 +6018,10 @@ msgid "" "This can be used instead of the SpatialMaterial Grow property when using " "that property isn't possible." msgstr "" +"Durgun bir anahat kafesi oluÅŸturur. Anahat kafesi normalleri otomatik olarak " +"döndürülecekdir.\n" +"Bu SpatialMaterial Grow özelliÄŸi kullanılamadığı zaman onun yerine " +"kullanılabilir." #: editor/plugins/mesh_instance_editor_plugin.cpp msgid "View UV1" @@ -6857,14 +6870,6 @@ msgid "Open Godot online documentation." msgstr "Çevrimiçi Godot dökümanlarını aç." #: editor/plugins/script_editor_plugin.cpp -msgid "Request Docs" -msgstr "Belgeleri İste" - -#: editor/plugins/script_editor_plugin.cpp -msgid "Help improve the Godot documentation by giving feedback." -msgstr "Dönüt vererek Godot belgelerini iyileÅŸtirmeye yardımcı olun." - -#: editor/plugins/script_editor_plugin.cpp msgid "Search the reference documentation." msgstr "BaÅŸvuru belgelerinde arama yap." @@ -7300,6 +7305,10 @@ msgid "This operation requires a single selected node." msgstr "Bu iÅŸlem, seçilmiÅŸ tek bir düğüm gerektirir." #: editor/plugins/spatial_editor_plugin.cpp +msgid "Auto Orthogonal Enabled" +msgstr "Otomatik Dikey EtkinleÅŸtirildi" + +#: editor/plugins/spatial_editor_plugin.cpp msgid "Lock View Rotation" msgstr "Dönüşü Görüntülemeyi kilitle" @@ -7388,6 +7397,10 @@ msgid "Freelook Slow Modifier" msgstr "Serbestbakış Hız DeÄŸiÅŸtirici" #: editor/plugins/spatial_editor_plugin.cpp +msgid "View Rotation Locked" +msgstr "Dönme Kilitli Görünüm" + +#: editor/plugins/spatial_editor_plugin.cpp msgid "" "Note: The FPS value displayed is the editor's framerate.\n" "It cannot be used as a reliable indication of in-game performance." @@ -7396,10 +7409,6 @@ msgstr "" "Oyun içi performansın gösteri olarak ele alınamaz." #: editor/plugins/spatial_editor_plugin.cpp -msgid "View Rotation Locked" -msgstr "Dönme Kilitli Görünüm" - -#: editor/plugins/spatial_editor_plugin.cpp msgid "XForm Dialog" msgstr "XForm İletiÅŸim Kutusu" @@ -9582,32 +9591,27 @@ msgid "Export With Debug" msgstr "Hata Ayıklama İle Dışa Aktar" #: editor/project_manager.cpp -#, fuzzy msgid "The path specified doesn't exist." -msgstr "Yol mevcut deÄŸil." +msgstr "Belirtilen yol mevcut deÄŸil." #: editor/project_manager.cpp -#, fuzzy msgid "Error opening package file (it's not in ZIP format)." -msgstr "Paket dosyası açılırken hata oluÅŸtu, zip formatında deÄŸil." +msgstr "Paket dosyası açılırken hata (ZIP formatında deÄŸil)." #: editor/project_manager.cpp -#, fuzzy msgid "" "Invalid \".zip\" project file; it doesn't contain a \"project.godot\" file." -msgstr "Geçersiz '.zip' proje dosyası, 'project.godot' dosyası içermiyor." +msgstr "Geçersiz \".zip\" proje dosyası; \"project.godot\" dosyası içermiyor." #: editor/project_manager.cpp msgid "Please choose an empty folder." msgstr "Lütfen boÅŸ bir klasör seçin." #: editor/project_manager.cpp -#, fuzzy msgid "Please choose a \"project.godot\" or \".zip\" file." -msgstr "Lütfen bir 'project.godot' veya '.zip' dosyası seçin." +msgstr "Lütfen bir \"project.godot\" veya \".zip\" dosyası seçin." #: editor/project_manager.cpp -#, fuzzy msgid "This directory already contains a Godot project." msgstr "Bu dizinde zaten bir Godot projesi var." @@ -9917,6 +9921,13 @@ msgstr "" "Herhangi bir projen yok.\n" "Varlık Kütüphanesi'ndeki resmî örnek projeleri incelemek ister misin?" +#: editor/project_manager.cpp +msgid "" +"The search box filters projects by name and last path component.\n" +"To filter projects by name and full path, the query must contain at least " +"one `/` character." +msgstr "" + #: editor/project_settings_editor.cpp msgid "Key " msgstr "Anahtar " @@ -10306,9 +10317,8 @@ msgid "Suffix" msgstr "Son Ek" #: editor/rename_dialog.cpp -#, fuzzy msgid "Use Regular Expressions" -msgstr "Düzenli İfadeler" +msgstr "Düzenli İfadeler Kullan" #: editor/rename_dialog.cpp msgid "Advanced Options" @@ -10347,9 +10357,8 @@ msgstr "" "Sayaç seçeneklerini karşılaÅŸtırın." #: editor/rename_dialog.cpp -#, fuzzy msgid "Per-level Counter" -msgstr "Seviye Başına sayaç" +msgstr "Seviye Başına Sayaç" #: editor/rename_dialog.cpp msgid "If set the counter restarts for each group of child nodes" @@ -10388,12 +10397,10 @@ msgid "Keep" msgstr "Tut" #: editor/rename_dialog.cpp -#, fuzzy msgid "PascalCase to snake_case" msgstr "DeveÅžekilli'den alt_tireli'ye dönüştür" #: editor/rename_dialog.cpp -#, fuzzy msgid "snake_case to PascalCase" msgstr "alt_tireli'den DeveÅžekilli'ye dönüştür" @@ -10414,9 +10421,8 @@ msgid "Reset" msgstr "Sıfırla" #: editor/rename_dialog.cpp -#, fuzzy msgid "Regular Expression Error" -msgstr "Düzenli İfadeler" +msgstr "Düzenli İfade Hatası" #: editor/rename_dialog.cpp #, fuzzy @@ -10886,9 +10892,8 @@ msgid "Invalid inherited parent name or path." msgstr "Geçersiz devralınan üst ad veya yol." #: editor/script_create_dialog.cpp -#, fuzzy msgid "Script path/name is valid." -msgstr "Betik geçerli." +msgstr "Betik yolu/adı geçerli." #: editor/script_create_dialog.cpp msgid "Allowed: a-z, A-Z, 0-9, _ and ." @@ -10911,6 +10916,14 @@ msgid "Script file already exists." msgstr "Betik dosyası zaten mevcut." #: editor/script_create_dialog.cpp +msgid "" +"Note: Built-in scripts have some limitations and can't be edited using an " +"external editor." +msgstr "" +"Not: Gömülü betikler bazı sınırlandırmalara mahsustur ve dış bir düzenleyici " +"ile düzenlenemezler." + +#: editor/script_create_dialog.cpp msgid "Class Name:" msgstr "Sınıf İsmi:" @@ -10979,7 +10992,6 @@ msgid "Copy Error" msgstr "Hatayı Kopyala" #: editor/script_editor_debugger.cpp -#, fuzzy msgid "Video RAM" msgstr "Görüntü BelleÄŸi" @@ -11032,6 +11044,11 @@ msgid "Total:" msgstr "Toplam:" #: editor/script_editor_debugger.cpp +#, fuzzy +msgid "Export list to a CSV file" +msgstr "Profil Dışa Aktar" + +#: editor/script_editor_debugger.cpp msgid "Resource Path" msgstr "Kaynak Yolu" @@ -12383,6 +12400,7 @@ msgstr "" msgid "" "ConcavePolygonShape doesn't support RigidBody in another mode than static." msgstr "" +"ConcavePolygonShape static dışında bir modda RigidBody'i desteklemiyor." #: scene/3d/cpu_particles.cpp msgid "Nothing is visible because no mesh has been assigned." @@ -12682,6 +12700,11 @@ msgstr "" "yapın böylece bir boyut elde edebilir. Aksi takdirde, Görüntüleme için bunu " "bir RenderTarget yap ve dahili dokusunu herhangi bir düğüme ata." +#: scene/main/viewport.cpp +msgid "Viewport size must be greater than 0 to render anything." +msgstr "" +"Herhangi bir ÅŸeyi iÅŸlemek için görüntükapısı boyutu 0'dan büyük olmalıdır." + #: scene/resources/visual_shader_nodes.cpp msgid "Invalid source for preview." msgstr "Önizleme için geçersiz kaynak." @@ -12710,6 +12733,15 @@ msgstr "varyings yalnızca vertex iÅŸlevinde atanabilir." msgid "Constants cannot be modified." msgstr "Sabit deÄŸerler deÄŸiÅŸtirilemez." +#~ msgid "Issue Tracker" +#~ msgstr "Sorun İzleyici" + +#~ msgid "Request Docs" +#~ msgstr "Belgeleri İste" + +#~ msgid "Help improve the Godot documentation by giving feedback." +#~ msgstr "Dönüt vererek Godot belgelerini iyileÅŸtirmeye yardımcı olun." + #~ msgid "Replaced %d occurrence(s)." #~ msgstr "%d deÄŸiÅŸiklik gerçekleÅŸtirildi." diff --git a/editor/translations/uk.po b/editor/translations/uk.po index bfb614f493..46e671a8a8 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-02-21 23:32+0000\n" +"PO-Revision-Date: 2020-04-20 05:51+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 3.11.1\n" +"X-Generator: Weblate 4.0.2-dev\n" #: core/math/expression.cpp modules/gdscript/gdscript_functions.cpp #: modules/visual_script/visual_script_builtin_funcs.cpp @@ -1458,7 +1458,7 @@ msgstr "ПереміÑтити автозавантаженнÑ" msgid "Remove Autoload" msgstr "Видалити автозавантаженнÑ" -#: editor/editor_autoload_settings.cpp +#: editor/editor_autoload_settings.cpp editor/editor_plugin_settings.cpp msgid "Enable" msgstr "Ðктивувати" @@ -2945,8 +2945,12 @@ msgid "Q&A" msgstr "Ð—Ð°Ð¿Ð¸Ñ‚Ð°Ð½Ð½Ñ Ñ‚Ð° відповіді" #: editor/editor_node.cpp -msgid "Issue Tracker" -msgstr "ВідÑÑ‚ÐµÐ¶ÐµÐ½Ð½Ñ Ð¿Ð¾Ð¼Ð¸Ð»Ð¾Ðº" +msgid "Report a Bug" +msgstr "Повідомити про ваду" + +#: editor/editor_node.cpp +msgid "Send Docs Feedback" +msgstr "ÐадіÑлати відгук щодо документації" #: editor/editor_node.cpp editor/plugins/asset_library_editor_plugin.cpp msgid "Community" @@ -4001,7 +4005,7 @@ msgid "Reimport" msgstr "Переімпортувати" #: editor/import_dock.cpp -msgid "Save scenes, re-import and restart" +msgid "Save Scenes, Re-Import, and Restart" msgstr "Зберегти Ñцени, повторно імпортувати Ñ– перезапуÑтити" #: editor/import_dock.cpp @@ -5974,9 +5978,8 @@ msgstr "" "Цей найточніший (але найповільніший) варіант Ð´Ð»Ñ Ð²Ð¸ÑÐ²Ð»ÐµÐ½Ð½Ñ Ð·Ñ–Ñ‚ÐºÐ½ÐµÐ½ÑŒ." #: editor/plugins/mesh_instance_editor_plugin.cpp -#, fuzzy msgid "Create Single Convex Collision Sibling" -msgstr "Створити єдині опуклі облаÑті зіткненнÑ" +msgstr "Створити єдину опуклу облаÑть зіткненнÑ" #: editor/plugins/mesh_instance_editor_plugin.cpp msgid "" @@ -6865,14 +6868,6 @@ msgid "Open Godot online documentation." msgstr "Відкрити онлайнову документацію Godot." #: editor/plugins/script_editor_plugin.cpp -msgid "Request Docs" -msgstr "Запит щодо документації" - -#: editor/plugins/script_editor_plugin.cpp -msgid "Help improve the Godot documentation by giving feedback." -msgstr "Допоможіть у поліпшенні документації Godot наданнÑм відгуків." - -#: editor/plugins/script_editor_plugin.cpp msgid "Search the reference documentation." msgstr "Пошук довідкової документації." @@ -7310,6 +7305,10 @@ msgid "This operation requires a single selected node." msgstr "Ð¦Ñ Ð¾Ð¿ÐµÑ€Ð°Ñ†Ñ–Ñ Ð²Ð¸Ð¼Ð°Ð³Ð°Ñ” одного обраного вузла." #: editor/plugins/spatial_editor_plugin.cpp +msgid "Auto Orthogonal Enabled" +msgstr "Увімкнено автоматичну ортогоналізацію" + +#: editor/plugins/spatial_editor_plugin.cpp msgid "Lock View Rotation" msgstr "ЗафікÑувати Ð¾Ð±ÐµÑ€Ñ‚Ð°Ð½Ð½Ñ Ð¿ÐµÑ€ÐµÐ³Ð»Ñду" @@ -7398,6 +7397,10 @@ msgid "Freelook Slow Modifier" msgstr "Модифікатор швидкоÑті довільного оглÑду" #: editor/plugins/spatial_editor_plugin.cpp +msgid "View Rotation Locked" +msgstr "ÐžÐ±ÐµÑ€Ñ‚Ð°Ð½Ð½Ñ Ð¿ÐµÑ€ÐµÐ³Ð»Ñду заблоковано" + +#: editor/plugins/spatial_editor_plugin.cpp msgid "" "Note: The FPS value displayed is the editor's framerate.\n" "It cannot be used as a reliable indication of in-game performance." @@ -7407,10 +7410,6 @@ msgstr "" "грі." #: editor/plugins/spatial_editor_plugin.cpp -msgid "View Rotation Locked" -msgstr "ÐžÐ±ÐµÑ€Ñ‚Ð°Ð½Ð½Ñ Ð¿ÐµÑ€ÐµÐ³Ð»Ñду заблоковано" - -#: editor/plugins/spatial_editor_plugin.cpp msgid "XForm Dialog" msgstr "Вікно XForm" @@ -9932,6 +9931,13 @@ msgstr "" "Зараз проєктів немає.\n" "Хочете вивчити проєкти офіційних прикладів з бібліотеки даних?" +#: editor/project_manager.cpp +msgid "" +"The search box filters projects by name and last path component.\n" +"To filter projects by name and full path, the query must contain at least " +"one `/` character." +msgstr "" + #: editor/project_settings_editor.cpp msgid "Key " msgstr "Клавіша " @@ -10921,6 +10927,14 @@ msgid "Script file already exists." msgstr "Файл Ñкрипту вже Ñ–Ñнує." #: editor/script_create_dialog.cpp +msgid "" +"Note: Built-in scripts have some limitations and can't be edited using an " +"external editor." +msgstr "" +"ЗауваженнÑ: Ð´Ð»Ñ Ð²Ð±ÑƒÐ´Ð¾Ð²Ð°Ð½Ð¸Ñ… Ñкриптів передбачено певні Ð¾Ð±Ð¼ÐµÐ¶ÐµÐ½Ð½Ñ â€” Ñ—Ñ… не " +"можна редагувати у зовнішньому редакторі." + +#: editor/script_create_dialog.cpp msgid "Class Name:" msgstr "Ðазва клаÑу:" @@ -11041,6 +11055,11 @@ msgid "Total:" msgstr "Загалом:" #: editor/script_editor_debugger.cpp +#, fuzzy +msgid "Export list to a CSV file" +msgstr "ЕкÑпорт профілю" + +#: editor/script_editor_debugger.cpp msgid "Resource Path" msgstr "ШлÑÑ… до реÑурÑу" @@ -12415,6 +12434,8 @@ msgstr "" msgid "" "ConcavePolygonShape doesn't support RigidBody in another mode than static." msgstr "" +"У ConcavePolygonShape не передбачено підтримки RigidBody у режимі, " +"відмінному від Ñтатичного." #: scene/3d/cpu_particles.cpp msgid "Nothing is visible because no mesh has been assigned." @@ -12715,6 +12736,12 @@ msgstr "" "Control, щоб у неї був розмір. Крім того, можна зробити Ñ—Ñ— RenderTarget Ñ– " "пов'Ñзати Ñ—Ñ— внутрішню текÑтуру з одним із вузлів Ð´Ð»Ñ Ð¿Ð¾ÐºÐ°Ð·Ñƒ." +#: scene/main/viewport.cpp +msgid "Viewport size must be greater than 0 to render anything." +msgstr "" +"Щоб програма могла хоч щоÑÑŒ показати, розмір Ð¿Ð¾Ð»Ñ Ð¿ÐµÑ€ÐµÐ³Ð»Ñду має бути більшим " +"за 0." + #: scene/resources/visual_shader_nodes.cpp msgid "Invalid source for preview." msgstr "Ðекоректне джерело Ð´Ð»Ñ Ð¿Ð¾Ð¿ÐµÑ€ÐµÐ´Ð½ÑŒÐ¾Ð³Ð¾ переглÑду." @@ -12743,6 +12770,15 @@ msgstr "Змінні величини можна пов'Ñзувати лише msgid "Constants cannot be modified." msgstr "Сталі не можна змінювати." +#~ msgid "Issue Tracker" +#~ msgstr "ВідÑÑ‚ÐµÐ¶ÐµÐ½Ð½Ñ Ð¿Ð¾Ð¼Ð¸Ð»Ð¾Ðº" + +#~ msgid "Request Docs" +#~ msgstr "Запит щодо документації" + +#~ msgid "Help improve the Godot documentation by giving feedback." +#~ msgstr "Допоможіть у поліпшенні документації Godot наданнÑм відгуків." + #~ msgid "Replaced %d occurrence(s)." #~ msgstr "Замінено %d випадок(-ів)." diff --git a/editor/translations/ur_PK.po b/editor/translations/ur_PK.po index 815f92af6a..432a8d1137 100644 --- a/editor/translations/ur_PK.po +++ b/editor/translations/ur_PK.po @@ -1429,7 +1429,7 @@ msgstr "" msgid "Remove Autoload" msgstr "" -#: editor/editor_autoload_settings.cpp +#: editor/editor_autoload_settings.cpp editor/editor_plugin_settings.cpp msgid "Enable" msgstr "" @@ -2862,7 +2862,11 @@ msgid "Q&A" msgstr "" #: editor/editor_node.cpp -msgid "Issue Tracker" +msgid "Report a Bug" +msgstr "" + +#: editor/editor_node.cpp +msgid "Send Docs Feedback" msgstr "" #: editor/editor_node.cpp editor/plugins/asset_library_editor_plugin.cpp @@ -3907,7 +3911,7 @@ msgid "Reimport" msgstr "" #: editor/import_dock.cpp -msgid "Save scenes, re-import and restart" +msgid "Save Scenes, Re-Import, and Restart" msgstr "" #: editor/import_dock.cpp @@ -6762,14 +6766,6 @@ msgid "Open Godot online documentation." msgstr "" #: editor/plugins/script_editor_plugin.cpp -msgid "Request Docs" -msgstr "" - -#: editor/plugins/script_editor_plugin.cpp -msgid "Help improve the Godot documentation by giving feedback." -msgstr "" - -#: editor/plugins/script_editor_plugin.cpp msgid "Search the reference documentation." msgstr "" @@ -7209,6 +7205,10 @@ msgid "This operation requires a single selected node." msgstr "" #: editor/plugins/spatial_editor_plugin.cpp +msgid "Auto Orthogonal Enabled" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp msgid "Lock View Rotation" msgstr "" @@ -7298,13 +7298,13 @@ msgid "Freelook Slow Modifier" msgstr "" #: editor/plugins/spatial_editor_plugin.cpp -msgid "" -"Note: The FPS value displayed is the editor's framerate.\n" -"It cannot be used as a reliable indication of in-game performance." +msgid "View Rotation Locked" msgstr "" #: editor/plugins/spatial_editor_plugin.cpp -msgid "View Rotation Locked" +msgid "" +"Note: The FPS value displayed is the editor's framerate.\n" +"It cannot be used as a reliable indication of in-game performance." msgstr "" #: editor/plugins/spatial_editor_plugin.cpp @@ -9746,6 +9746,13 @@ msgid "" "Would you like to explore official example projects in the Asset Library?" msgstr "" +#: editor/project_manager.cpp +msgid "" +"The search box filters projects by name and last path component.\n" +"To filter projects by name and full path, the query must contain at least " +"one `/` character." +msgstr "" + #: editor/project_settings_editor.cpp msgid "Key " msgstr "" @@ -10719,6 +10726,12 @@ msgid "Script file already exists." msgstr "" #: editor/script_create_dialog.cpp +msgid "" +"Note: Built-in scripts have some limitations and can't be edited using an " +"external editor." +msgstr "" + +#: editor/script_create_dialog.cpp msgid "Class Name:" msgstr "" @@ -10845,6 +10858,10 @@ msgid "Total:" msgstr "" #: editor/script_editor_debugger.cpp +msgid "Export list to a CSV file" +msgstr "" + +#: editor/script_editor_debugger.cpp msgid "Resource Path" msgstr "" @@ -12370,6 +12387,10 @@ msgid "" "texture to some node for display." msgstr "" +#: scene/main/viewport.cpp +msgid "Viewport size must be greater than 0 to render anything." +msgstr "" + #: scene/resources/visual_shader_nodes.cpp msgid "Invalid source for preview." msgstr "" diff --git a/editor/translations/vi.po b/editor/translations/vi.po index 31b7f3ceb7..a52a3dedf3 100644 --- a/editor/translations/vi.po +++ b/editor/translations/vi.po @@ -1455,7 +1455,7 @@ msgstr "" msgid "Remove Autoload" msgstr "" -#: editor/editor_autoload_settings.cpp +#: editor/editor_autoload_settings.cpp editor/editor_plugin_settings.cpp msgid "Enable" msgstr "Mở" @@ -2927,8 +2927,13 @@ msgid "Q&A" msgstr "Há»i và Äáp" #: editor/editor_node.cpp -msgid "Issue Tracker" -msgstr "Theo dõi vấn Ä‘á»" +#, fuzzy +msgid "Report a Bug" +msgstr "Nháºp và o lại" + +#: editor/editor_node.cpp +msgid "Send Docs Feedback" +msgstr "" #: editor/editor_node.cpp editor/plugins/asset_library_editor_plugin.cpp msgid "Community" @@ -3974,7 +3979,8 @@ msgid "Reimport" msgstr "Nháºp và o lại" #: editor/import_dock.cpp -msgid "Save scenes, re-import and restart" +#, fuzzy +msgid "Save Scenes, Re-Import, and Restart" msgstr "Lưu các cảnh, nháºp và o lại và khởi động lại" #: editor/import_dock.cpp @@ -6849,14 +6855,6 @@ msgid "Open Godot online documentation." msgstr "" #: editor/plugins/script_editor_plugin.cpp -msgid "Request Docs" -msgstr "" - -#: editor/plugins/script_editor_plugin.cpp -msgid "Help improve the Godot documentation by giving feedback." -msgstr "" - -#: editor/plugins/script_editor_plugin.cpp msgid "Search the reference documentation." msgstr "" @@ -7303,6 +7301,10 @@ msgid "This operation requires a single selected node." msgstr "Hoạt động yêu cầu chá»n má»™t nút duy nhất." #: editor/plugins/spatial_editor_plugin.cpp +msgid "Auto Orthogonal Enabled" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp msgid "Lock View Rotation" msgstr "" @@ -7392,13 +7394,13 @@ msgid "Freelook Slow Modifier" msgstr "" #: editor/plugins/spatial_editor_plugin.cpp -msgid "" -"Note: The FPS value displayed is the editor's framerate.\n" -"It cannot be used as a reliable indication of in-game performance." +msgid "View Rotation Locked" msgstr "" #: editor/plugins/spatial_editor_plugin.cpp -msgid "View Rotation Locked" +msgid "" +"Note: The FPS value displayed is the editor's framerate.\n" +"It cannot be used as a reliable indication of in-game performance." msgstr "" #: editor/plugins/spatial_editor_plugin.cpp @@ -9864,6 +9866,13 @@ msgstr "" "Hiện giá» bạn không có project nà o.\n" "Bạn có muốn xem các project official và dụ trên Asset Library không?" +#: editor/project_manager.cpp +msgid "" +"The search box filters projects by name and last path component.\n" +"To filter projects by name and full path, the query must contain at least " +"one `/` character." +msgstr "" + #: editor/project_settings_editor.cpp msgid "Key " msgstr "" @@ -10857,6 +10866,12 @@ msgid "Script file already exists." msgstr "Tam giác đã tồn tại." #: editor/script_create_dialog.cpp +msgid "" +"Note: Built-in scripts have some limitations and can't be edited using an " +"external editor." +msgstr "" + +#: editor/script_create_dialog.cpp #, fuzzy msgid "Class Name:" msgstr "Lá»›p:" @@ -10989,6 +11004,11 @@ msgid "Total:" msgstr "" #: editor/script_editor_debugger.cpp +#, fuzzy +msgid "Export list to a CSV file" +msgstr "Xuất hồ sÆ¡" + +#: editor/script_editor_debugger.cpp msgid "Resource Path" msgstr "" @@ -12521,6 +12541,10 @@ msgid "" "texture to some node for display." msgstr "" +#: scene/main/viewport.cpp +msgid "Viewport size must be greater than 0 to render anything." +msgstr "" + #: scene/resources/visual_shader_nodes.cpp msgid "Invalid source for preview." msgstr "nguồn vô hiệu cho xem trước" @@ -12550,6 +12574,9 @@ msgstr "" msgid "Constants cannot be modified." msgstr "Không thể chỉnh sá»a hằng số." +#~ msgid "Issue Tracker" +#~ msgstr "Theo dõi vấn Ä‘á»" + #~ msgid "Replaced %d occurrence(s)." #~ msgstr "Äã thay thế %d biến cố." diff --git a/editor/translations/zh_CN.po b/editor/translations/zh_CN.po index e7108c6e61..953ec63714 100644 --- a/editor/translations/zh_CN.po +++ b/editor/translations/zh_CN.po @@ -64,7 +64,7 @@ msgid "" msgstr "" "Project-Id-Version: Chinese (Simplified) (Godot Engine)\n" "POT-Creation-Date: 2018-01-20 12:15+0200\n" -"PO-Revision-Date: 2020-03-08 22:33+0000\n" +"PO-Revision-Date: 2020-04-24 15:30+0000\n" "Last-Translator: Revan Ji <jiruifancr@gmail.com>\n" "Language-Team: Chinese (Simplified) <https://hosted.weblate.org/projects/" "godot-engine/godot/zh_Hans/>\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-dev\n" +"X-Generator: Weblate 4.0.2-dev\n" #: core/math/expression.cpp modules/gdscript/gdscript_functions.cpp #: modules/visual_script/visual_script_builtin_funcs.cpp @@ -1481,7 +1481,7 @@ msgstr "移动Autoload" msgid "Remove Autoload" msgstr "移除Autoload" -#: editor/editor_autoload_settings.cpp +#: editor/editor_autoload_settings.cpp editor/editor_plugin_settings.cpp msgid "Enable" msgstr "å¯ç”¨" @@ -2919,8 +2919,12 @@ msgid "Q&A" msgstr "é—®ç”" #: editor/editor_node.cpp -msgid "Issue Tracker" -msgstr "问题跟踪器" +msgid "Report a Bug" +msgstr "报告问题" + +#: editor/editor_node.cpp +msgid "Send Docs Feedback" +msgstr "å‘逿–‡æ¡£å馈" #: editor/editor_node.cpp editor/plugins/asset_library_editor_plugin.cpp msgid "Community" @@ -3957,8 +3961,8 @@ msgid "Reimport" msgstr "釿–°å¯¼å…¥" #: editor/import_dock.cpp -msgid "Save scenes, re-import and restart" -msgstr "ä¿å˜åœºæ™¯ï¼Œé‡æ–°å¯¼å…¥ï¼Œä»Žå¤´å¼€å§‹" +msgid "Save Scenes, Re-Import, and Restart" +msgstr "ä¿å˜åœºæ™¯ã€é‡æ–°å¯¼å…¥ï¼Œç„¶åŽé‡å¯" #: editor/import_dock.cpp msgid "Changing the type of an imported file requires editor restart." @@ -5675,7 +5679,7 @@ msgstr "从åƒç´ æ•获" #: editor/plugins/cpu_particles_2d_editor_plugin.cpp #: editor/plugins/particles_2d_editor_plugin.cpp msgid "Emission Colors" -msgstr "Emission Colors(å‘射颜色)" +msgstr "Emission Colors(自å‘光颜色)" #: editor/plugins/cpu_particles_editor_plugin.cpp msgid "CPUParticles" @@ -6774,14 +6778,6 @@ msgid "Open Godot online documentation." msgstr "打开Godot在线文档。" #: editor/plugins/script_editor_plugin.cpp -msgid "Request Docs" -msgstr "请求文档" - -#: editor/plugins/script_editor_plugin.cpp -msgid "Help improve the Godot documentation by giving feedback." -msgstr "通过æä¾›å馈帮助改进godot文档。" - -#: editor/plugins/script_editor_plugin.cpp msgid "Search the reference documentation." msgstr "æœç´¢æ–‡æ¡£ã€‚" @@ -7215,6 +7211,11 @@ msgid "This operation requires a single selected node." msgstr "æ¤æ“作åªèƒ½åº”用于å•个选ä¸èŠ‚ç‚¹ã€‚" #: editor/plugins/spatial_editor_plugin.cpp +#, fuzzy +msgid "Auto Orthogonal Enabled" +msgstr "æ£äº¤" + +#: editor/plugins/spatial_editor_plugin.cpp msgid "Lock View Rotation" msgstr "é”定视角旋转" @@ -7303,6 +7304,10 @@ msgid "Freelook Slow Modifier" msgstr "缓慢自由视图速度" #: editor/plugins/spatial_editor_plugin.cpp +msgid "View Rotation Locked" +msgstr "é”定视角旋转" + +#: editor/plugins/spatial_editor_plugin.cpp msgid "" "Note: The FPS value displayed is the editor's framerate.\n" "It cannot be used as a reliable indication of in-game performance." @@ -7311,10 +7316,6 @@ msgstr "" "它ä¸èƒ½ç”¨äºŽè¡¨çŽ°æ¸¸æˆä¸çš„实际性能。" #: editor/plugins/spatial_editor_plugin.cpp -msgid "View Rotation Locked" -msgstr "é”定视角旋转" - -#: editor/plugins/spatial_editor_plugin.cpp msgid "XForm Dialog" msgstr "XFormå¯¹è¯æ¡†" @@ -7906,7 +7907,7 @@ msgstr "å—体" #: editor/plugins/theme_editor_plugin.cpp msgid "Color" -msgstr "Color(颜色)" +msgstr "颜色" #: editor/plugins/theme_editor_plugin.cpp msgid "Theme File" @@ -9767,6 +9768,13 @@ msgstr "" "ä½ ç›®å‰æ²¡æœ‰ä»»ä½•项目。 \n" "æ˜¯å¦æŸ¥çœ‹ç´ æåº“ä¸çš„官方示例项目?" +#: editor/project_manager.cpp +msgid "" +"The search box filters projects by name and last path component.\n" +"To filter projects by name and full path, the query must contain at least " +"one `/` character." +msgstr "" + #: editor/project_settings_editor.cpp msgid "Key " msgstr "é”® " @@ -10740,6 +10748,12 @@ msgid "Script file already exists." msgstr "脚本文件已å˜åœ¨ã€‚" #: editor/script_create_dialog.cpp +msgid "" +"Note: Built-in scripts have some limitations and can't be edited using an " +"external editor." +msgstr "注æ„ï¼šå†…ç½®è„šæœ¬æœ‰å…¶å±€é™æ€§ï¼Œå¹¶ä¸”ä¸èƒ½ä½¿ç”¨å¤–部编辑器编辑。" + +#: editor/script_create_dialog.cpp msgid "Class Name:" msgstr "ç±»å:" @@ -10860,6 +10874,11 @@ msgid "Total:" msgstr "åˆè®¡:" #: editor/script_editor_debugger.cpp +#, fuzzy +msgid "Export list to a CSV file" +msgstr "导出é…置文件" + +#: editor/script_editor_debugger.cpp msgid "Resource Path" msgstr "资æºè·¯å¾„" @@ -12428,6 +12447,10 @@ msgstr "" "幕上显示其内容,使其æˆä¸ºå控件的所以它å¯ä»¥æœ‰ä¸€ä¸ªå°ºå¯¸å¤§å°å€¼ã€‚å¦åˆ™è¯·å°†å…¶è®¾ç½®ä¸º " "RenderTarget,并将其内部纹ç†åˆ†é…给其它节点显示。" +#: scene/main/viewport.cpp +msgid "Viewport size must be greater than 0 to render anything." +msgstr "Viewport大å°å¤§äºŽ0æ—¶æ‰èƒ½è¿›è¡Œæ¸²æŸ“。" + #: scene/resources/visual_shader_nodes.cpp msgid "Invalid source for preview." msgstr "预览的æºèµ„æºæ— 效。" @@ -12456,6 +12479,15 @@ msgstr "å˜é‡åªèƒ½åœ¨é¡¶ç‚¹å‡½æ•°ä¸æŒ‡å®šã€‚" msgid "Constants cannot be modified." msgstr "ä¸å…许修改常é‡ã€‚" +#~ msgid "Issue Tracker" +#~ msgstr "问题跟踪器" + +#~ msgid "Request Docs" +#~ msgstr "请求文档" + +#~ msgid "Help improve the Godot documentation by giving feedback." +#~ msgstr "通过æä¾›å馈帮助改进godot文档。" + #~ msgid "Replaced %d occurrence(s)." #~ msgstr "替æ¢äº†%d项。" diff --git a/editor/translations/zh_HK.po b/editor/translations/zh_HK.po index a228d6ee60..e3d9a84cfb 100644 --- a/editor/translations/zh_HK.po +++ b/editor/translations/zh_HK.po @@ -1533,7 +1533,7 @@ msgstr "移動Autoload" msgid "Remove Autoload" msgstr "移除Autoload" -#: editor/editor_autoload_settings.cpp +#: editor/editor_autoload_settings.cpp editor/editor_plugin_settings.cpp #, fuzzy msgid "Enable" msgstr "啟用" @@ -3070,7 +3070,12 @@ msgid "Q&A" msgstr "Q&A" #: editor/editor_node.cpp -msgid "Issue Tracker" +#, fuzzy +msgid "Report a Bug" +msgstr "å°Žå…¥" + +#: editor/editor_node.cpp +msgid "Send Docs Feedback" msgstr "" #: editor/editor_node.cpp editor/plugins/asset_library_editor_plugin.cpp @@ -4182,7 +4187,7 @@ msgid "Reimport" msgstr "å°Žå…¥" #: editor/import_dock.cpp -msgid "Save scenes, re-import and restart" +msgid "Save Scenes, Re-Import, and Restart" msgstr "" #: editor/import_dock.cpp @@ -7143,14 +7148,6 @@ msgid "Open Godot online documentation." msgstr "開啓最近的" #: editor/plugins/script_editor_plugin.cpp -msgid "Request Docs" -msgstr "" - -#: editor/plugins/script_editor_plugin.cpp -msgid "Help improve the Godot documentation by giving feedback." -msgstr "" - -#: editor/plugins/script_editor_plugin.cpp msgid "Search the reference documentation." msgstr "" @@ -7611,6 +7608,10 @@ msgid "This operation requires a single selected node." msgstr "" #: editor/plugins/spatial_editor_plugin.cpp +msgid "Auto Orthogonal Enabled" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp #, fuzzy msgid "Lock View Rotation" msgstr "本地化" @@ -7705,17 +7706,17 @@ msgid "Freelook Slow Modifier" msgstr "下滾" #: editor/plugins/spatial_editor_plugin.cpp +#, fuzzy +msgid "View Rotation Locked" +msgstr "本地化" + +#: editor/plugins/spatial_editor_plugin.cpp msgid "" "Note: The FPS value displayed is the editor's framerate.\n" "It cannot be used as a reliable indication of in-game performance." msgstr "" #: editor/plugins/spatial_editor_plugin.cpp -#, fuzzy -msgid "View Rotation Locked" -msgstr "本地化" - -#: editor/plugins/spatial_editor_plugin.cpp msgid "XForm Dialog" msgstr "" @@ -10229,6 +10230,13 @@ msgid "" "Would you like to explore official example projects in the Asset Library?" msgstr "" +#: editor/project_manager.cpp +msgid "" +"The search box filters projects by name and last path component.\n" +"To filter projects by name and full path, the query must contain at least " +"one `/` character." +msgstr "" + #: editor/project_settings_editor.cpp msgid "Key " msgstr "" @@ -11249,6 +11257,12 @@ msgid "Script file already exists." msgstr "AutoLoad '%s'å·²å˜åœ¨ï¼" #: editor/script_create_dialog.cpp +msgid "" +"Note: Built-in scripts have some limitations and can't be edited using an " +"external editor." +msgstr "" + +#: editor/script_create_dialog.cpp #, fuzzy msgid "Class Name:" msgstr "å稱:" @@ -11383,6 +11397,11 @@ msgid "Total:" msgstr "" #: editor/script_editor_debugger.cpp +#, fuzzy +msgid "Export list to a CSV file" +msgstr "匯出" + +#: editor/script_editor_debugger.cpp msgid "Resource Path" msgstr "" @@ -12946,6 +12965,10 @@ msgid "" "texture to some node for display." msgstr "" +#: scene/main/viewport.cpp +msgid "Viewport size must be greater than 0 to render anything." +msgstr "" + #: scene/resources/visual_shader_nodes.cpp #, fuzzy msgid "Invalid source for preview." diff --git a/editor/translations/zh_TW.po b/editor/translations/zh_TW.po index 466e8db554..6b3651b5f6 100644 --- a/editor/translations/zh_TW.po +++ b/editor/translations/zh_TW.po @@ -1521,7 +1521,7 @@ msgstr "移動 Autoload" msgid "Remove Autoload" msgstr "刪除 Autoload" -#: editor/editor_autoload_settings.cpp +#: editor/editor_autoload_settings.cpp editor/editor_plugin_settings.cpp msgid "Enable" msgstr "啟用" @@ -3062,8 +3062,12 @@ msgstr "Q&A" #: editor/editor_node.cpp #, fuzzy -msgid "Issue Tracker" -msgstr "å•題追蹤器" +msgid "Report a Bug" +msgstr "釿–°å°Žå…¥" + +#: editor/editor_node.cpp +msgid "Send Docs Feedback" +msgstr "" #: editor/editor_node.cpp editor/plugins/asset_library_editor_plugin.cpp msgid "Community" @@ -4155,7 +4159,8 @@ msgid "Reimport" msgstr "釿–°å°Žå…¥" #: editor/import_dock.cpp -msgid "Save scenes, re-import and restart" +#, fuzzy +msgid "Save Scenes, Re-Import, and Restart" msgstr "ä¿å˜å ´æ™¯ï¼Œé‡æ–°å°Žå…¥ä¸¦é‡æ–°å•Ÿå‹•" #: editor/import_dock.cpp @@ -7125,15 +7130,6 @@ msgid "Open Godot online documentation." msgstr "打開 Godot 線上文檔" #: editor/plugins/script_editor_plugin.cpp -msgid "Request Docs" -msgstr "請求檔案" - -#: editor/plugins/script_editor_plugin.cpp -#, fuzzy -msgid "Help improve the Godot documentation by giving feedback." -msgstr "é€šéŽæä¾›å›žé¥‹å¹«åŠ©æ”¹é€² Godot 文檔" - -#: editor/plugins/script_editor_plugin.cpp msgid "Search the reference documentation." msgstr "æœç´¢åƒè€ƒæ–‡æª”。" @@ -7589,6 +7585,11 @@ msgid "This operation requires a single selected node." msgstr "æ¤æ“作需è¦å–®å€‹é¸å®šçš„節點。" #: editor/plugins/spatial_editor_plugin.cpp +#, fuzzy +msgid "Auto Orthogonal Enabled" +msgstr "æ£äº¤" + +#: editor/plugins/spatial_editor_plugin.cpp msgid "Lock View Rotation" msgstr "鎖定視圖旋轉" @@ -7680,16 +7681,16 @@ msgid "Freelook Slow Modifier" msgstr "自由視圖速度調節" #: editor/plugins/spatial_editor_plugin.cpp +msgid "View Rotation Locked" +msgstr "視圖旋轉已鎖定" + +#: editor/plugins/spatial_editor_plugin.cpp msgid "" "Note: The FPS value displayed is the editor's framerate.\n" "It cannot be used as a reliable indication of in-game performance." msgstr "注æ„: 顯示的FPS值是編輯器的幀率。 它ä¸èƒ½ç”¨äºŽè¡¨ç¾éŠæˆ²å…§çš„實際性能" #: editor/plugins/spatial_editor_plugin.cpp -msgid "View Rotation Locked" -msgstr "視圖旋轉已鎖定" - -#: editor/plugins/spatial_editor_plugin.cpp msgid "XForm Dialog" msgstr "XFormå°è©±æ¡†" @@ -10217,6 +10218,13 @@ msgid "" "Would you like to explore official example projects in the Asset Library?" msgstr "" +#: editor/project_manager.cpp +msgid "" +"The search box filters projects by name and last path component.\n" +"To filter projects by name and full path, the query must contain at least " +"one `/` character." +msgstr "" + #: editor/project_settings_editor.cpp msgid "Key " msgstr "" @@ -11230,6 +11238,12 @@ msgid "Script file already exists." msgstr "Autoload「%sã€å·²ç¶“å˜åœ¨!" #: editor/script_create_dialog.cpp +msgid "" +"Note: Built-in scripts have some limitations and can't be edited using an " +"external editor." +msgstr "" + +#: editor/script_create_dialog.cpp #, fuzzy msgid "Class Name:" msgstr "Class:" @@ -11368,6 +11382,11 @@ msgid "Total:" msgstr "總計:" #: editor/script_editor_debugger.cpp +#, fuzzy +msgid "Export list to a CSV file" +msgstr "輸出專案" + +#: editor/script_editor_debugger.cpp msgid "Resource Path" msgstr "資æºè·¯å¾‘" @@ -12956,6 +12975,10 @@ msgid "" "texture to some node for display." msgstr "" +#: scene/main/viewport.cpp +msgid "Viewport size must be greater than 0 to render anything." +msgstr "" + #: scene/resources/visual_shader_nodes.cpp #, fuzzy msgid "Invalid source for preview." @@ -12987,6 +13010,17 @@ msgstr "" msgid "Constants cannot be modified." msgstr "" +#, fuzzy +#~ msgid "Issue Tracker" +#~ msgstr "å•題追蹤器" + +#~ msgid "Request Docs" +#~ msgstr "請求檔案" + +#, fuzzy +#~ msgid "Help improve the Godot documentation by giving feedback." +#~ msgstr "é€šéŽæä¾›å›žé¥‹å¹«åŠ©æ”¹é€² Godot 文檔" + #~ msgid "Replaced %d occurrence(s)." #~ msgstr "å–代了 %d 個。" diff --git a/main/main.cpp b/main/main.cpp index a53e52e485..dff7907e72 100644 --- a/main/main.cpp +++ b/main/main.cpp @@ -32,7 +32,7 @@ #include "core/crypto/crypto.h" #include "core/debugger/engine_debugger.h" -#include "core/input/input_filter.h" +#include "core/input/input.h" #include "core/input/input_map.h" #include "core/io/file_access_network.h" #include "core/io/file_access_pack.h" @@ -55,13 +55,13 @@ #include "main/splash.gen.h" #include "main/splash_editor.gen.h" #include "main/tests/test_main.h" +#include "modules/modules_enabled.gen.h" #include "modules/register_module_types.h" #include "platform/register_platform_apis.h" #include "scene/main/scene_tree.h" #include "scene/main/window.h" #include "scene/register_scene_types.h" #include "scene/resources/packed_scene.h" -#include "servers/arvr_server.h" #include "servers/audio_server.h" #include "servers/camera_server.h" #include "servers/display_server.h" @@ -72,6 +72,7 @@ #include "servers/register_server_types.h" #include "servers/rendering/rendering_server_raster.h" #include "servers/rendering/rendering_server_wrap_mt.h" +#include "servers/xr_server.h" #ifdef TOOLS_ENABLED #include "editor/doc_data.h" @@ -89,7 +90,7 @@ // Initialized in setup() static Engine *engine = nullptr; static ProjectSettings *globals = nullptr; -static InputFilter *input = nullptr; +static Input *input = nullptr; static InputMap *input_map = nullptr; static TranslationServer *translation_server = nullptr; static Performance *performance = nullptr; @@ -105,7 +106,7 @@ static AudioServer *audio_server = nullptr; static DisplayServer *display_server = nullptr; static RenderingServer *rendering_server = nullptr; static CameraServer *camera_server = nullptr; -static ARVRServer *arvr_server = nullptr; +static XRServer *xr_server = nullptr; static PhysicsServer3D *physics_server = nullptr; static PhysicsServer2D *physics_2d_server = nullptr; static NavigationServer3D *navigation_server = nullptr; @@ -478,6 +479,14 @@ Error Main::setup(const char *execpath, int argc, char *argv[], bool p_second_ph I = args.front(); while (I) { +#ifdef OSX_ENABLED + // Ignore the process serial number argument passed by macOS Gatekeeper. + // Otherwise, Godot would try to open a non-existent project on the first start and abort. + if (I->get().begins_with("-psn_")) { + I = I->next(); + continue; + } +#endif List<String>::Element *N = I->next(); @@ -1154,9 +1163,11 @@ Error Main::setup(const char *execpath, int argc, char *argv[], bool p_second_ph ProjectSettings::get_singleton()->set_custom_property_info("debug/settings/fps/force_fps", PropertyInfo(Variant::INT, "debug/settings/fps/force_fps", PROPERTY_HINT_RANGE, "0,120,1,or_greater")); GLOBAL_DEF("debug/settings/stdout/print_fps", false); + GLOBAL_DEF("debug/settings/stdout/verbose_stdout", false); - if (!OS::get_singleton()->_verbose_stdout) //overridden - OS::get_singleton()->_verbose_stdout = GLOBAL_DEF("debug/settings/stdout/verbose_stdout", false); + if (!OS::get_singleton()->_verbose_stdout) { // Not manually overridden. + OS::get_singleton()->_verbose_stdout = GLOBAL_GET("debug/settings/stdout/verbose_stdout"); + } if (frame_delay == 0) { frame_delay = GLOBAL_DEF("application/run/frame_delay_msec", 0); @@ -1238,7 +1249,7 @@ Error Main::setup2(Thread::ID p_main_tid_override) { /* Initialize Input */ - input = memnew(InputFilter); + input = memnew(Input); /* Iniitalize Display Server */ @@ -1297,8 +1308,8 @@ Error Main::setup2(Thread::ID p_main_tid_override) { audio_server = memnew(AudioServer); audio_server->init(); - // also init our arvr_server from here - arvr_server = memnew(ARVRServer); + // also init our xr_server from here + xr_server = memnew(XRServer); register_core_singletons(); @@ -1392,7 +1403,7 @@ Error Main::setup2(Thread::ID p_main_tid_override) { GLOBAL_DEF("application/config/windows_native_icon", String()); ProjectSettings::get_singleton()->set_custom_property_info("application/config/windows_native_icon", PropertyInfo(Variant::STRING, "application/config/windows_native_icon", PROPERTY_HINT_FILE, "*.ico")); - InputFilter *id = InputFilter::get_singleton(); + Input *id = Input::get_singleton(); if (id) { if (bool(GLOBAL_DEF("input_devices/pointing/emulate_touch_from_mouse", false)) && !(editor || project_manager)) { @@ -1427,7 +1438,7 @@ Error Main::setup2(Thread::ID p_main_tid_override) { Ref<Texture2D> cursor = ResourceLoader::load(ProjectSettings::get_singleton()->get("display/mouse_cursor/custom_image")); if (cursor.is_valid()) { Vector2 hotspot = ProjectSettings::get_singleton()->get("display/mouse_cursor/custom_image_hotspot"); - InputFilter::get_singleton()->set_custom_mouse_cursor(cursor, InputFilter::CURSOR_ARROW, hotspot); + Input::get_singleton()->set_custom_mouse_cursor(cursor, Input::CURSOR_ARROW, hotspot); } } #ifdef TOOLS_ENABLED @@ -1473,6 +1484,15 @@ Error Main::setup2(Thread::ID p_main_tid_override) { // We could add more, and make the CLI arg require a comma-separated list of profilers. EngineDebugger::get_singleton()->profiler_enable("scripts", true); } + + if (!project_manager) { + // If not running the project manager, and now that the engine is + // able to load resources, load the global shader variables. + // If running on editor, dont load the textures because the editor + // may want to import them first. Editor will reload those later. + rendering_server->global_variables_load_settings(!editor); + } + _start_success = true; locale = String(); @@ -1580,6 +1600,19 @@ bool Main::start() { DirAccessRef da = DirAccess::open(doc_tool); ERR_FAIL_COND_V_MSG(!da, false, "Argument supplied to --doctool must be a base Godot build directory."); } + +#ifndef MODULE_MONO_ENABLED + // Hack to define Mono-specific project settings even on non-Mono builds, + // so that we don't lose their descriptions and default values in DocData. + // Default values should be synced with mono_gd/gd_mono.cpp. + GLOBAL_DEF("mono/debugger_agent/port", 23685); + GLOBAL_DEF("mono/debugger_agent/wait_for_debugger", false); + GLOBAL_DEF("mono/debugger_agent/wait_timeout", 3000); + GLOBAL_DEF("mono/profiler/args", "log:calls,alloc,sample,output=output.mlpd"); + GLOBAL_DEF("mono/profiler/enabled", false); + GLOBAL_DEF("mono/unhandled_exception_policy", 0); +#endif + DocData doc; doc.generate(doc_base); @@ -1667,7 +1700,7 @@ bool Main::start() { return false; } - if (script_res->can_instance() /*&& script_res->inherits_from("SceneTreeScripted")*/) { + if (script_res->can_instance()) { StringName instance_type = script_res->get_instance_base_type(); Object *obj = ClassDB::instance(instance_type); @@ -1675,7 +1708,7 @@ bool Main::start() { if (!script_loop) { if (obj) memdelete(obj); - ERR_FAIL_V_MSG(false, "Can't load script '" + script + "', it does not inherit from a MainLoop type."); + ERR_FAIL_V_MSG(false, vformat("Can't load the script \"%s\" as it doesn't inherit from SceneTree or MainLoop.", script)); } script_loop->set_init_script(script_res); @@ -2272,13 +2305,16 @@ void Main::cleanup() { // Sync pending commands that may have been queued from a different thread during ScriptServer finalization RenderingServer::get_singleton()->sync(); + //clear global shader variables before scene and other graphics stuff is deinitialized. + rendering_server->global_variables_clear(); + #ifdef TOOLS_ENABLED EditorNode::unregister_editor_types(); #endif - if (arvr_server) { + if (xr_server) { // cleanup now before we pull the rug from underneath... - memdelete(arvr_server); + memdelete(xr_server); } ImageLoader::cleanup(); diff --git a/main/tests/test_shader_lang.cpp b/main/tests/test_shader_lang.cpp index 1e85f7f1d2..dbe2da86cf 100644 --- a/main/tests/test_shader_lang.cpp +++ b/main/tests/test_shader_lang.cpp @@ -342,7 +342,7 @@ MainLoop *test() { Set<String> types; types.insert("spatial"); - Error err = sl.compile(code, dt, rm, types); + Error err = sl.compile(code, dt, rm, types, NULL); if (err) { diff --git a/misc/dist/html/fixed-size.html b/misc/dist/html/fixed-size.html index 6c6a3a5d2d..e7a23b3f29 100644 --- a/misc/dist/html/fixed-size.html +++ b/misc/dist/html/fixed-size.html @@ -3,7 +3,7 @@ <head> <meta charset="utf-8" /> <link id='-gd-engine-icon' rel='icon' type='image/png' href='favicon.png' /> - <title></title> + <title>$GODOT_PROJECT_NAME</title> <style type="text/css"> body { diff --git a/misc/dist/html/full-size.html b/misc/dist/html/full-size.html index 92b65257d4..193f2a6aad 100644 --- a/misc/dist/html/full-size.html +++ b/misc/dist/html/full-size.html @@ -4,7 +4,7 @@ <meta charset='utf-8' /> <meta name='viewport' content='width=device-width, user-scalable=no' /> <link id='-gd-engine-icon' rel='icon' type='image/png' href='favicon.png' /> - <title></title> + <title>$GODOT_PROJECT_NAME</title> <style type='text/css'> body { diff --git a/misc/hooks/pre-commit-black b/misc/hooks/pre-commit-black index 2dcc2e8cf1..76d97294da 100755 --- a/misc/hooks/pre-commit-black +++ b/misc/hooks/pre-commit-black @@ -6,7 +6,7 @@ ################################################################## # SETTINGS # Set path to black binary. -BLACK=`which black` +BLACK=`which black 2>/dev/null` BLACK_OPTIONS="-l 120" # Remove any older patches from previous commits. Set to true or false. @@ -18,13 +18,22 @@ FILE_EXTS="py" # Use pygmentize instead of cat to parse diff with highlighting. # Install it with `pip install pygments` (Linux) or `easy_install Pygments` (Mac) -PYGMENTIZE=`which pygmentize` +PYGMENTIZE=`which pygmentize 2>/dev/null` if [ ! -z "$PYGMENTIZE" ]; then READER="pygmentize -l diff" else READER=cat fi +# Path to zenity +ZENITY=`which zenity 2>/dev/null` + +# Path to xmessage +XMSG=`which xmessage 2>/dev/null` + +# Path to powershell (Windows only) +PWSH=`which powershell 2>/dev/null` + ################################################################## # There should be no need to change anything below this line. @@ -53,6 +62,19 @@ else fi if [ ! -x "$BLACK" ] ; then + if [ ! -t 1 ] ; then + if [ -x "$ZENITY" ] ; then + $ZENITY --error --title="Error" --text="Error: black executable not found." + exit 1 + elif [ -x "$XMSG" ] ; then + $XMSG -center -title "Error" "Error: black executable not found." + exit 1 + elif [ \( \( "$OSTYPE" = "msys" \) -o \( "$OSTYPE" = "win32" \) \) -a \( -x "$PWSH" \) ]; then + winmessage="$(canonicalize_filename "./.git/hooks/winmessage.ps1")" + $PWSH -noprofile -executionpolicy bypass -file "$winmessage" -center -title "Error" --text "Error: black executable not found." + exit 1 + fi + fi printf "Error: black executable not found.\n" printf "Set the correct path in $(canonicalize_filename "$0").\n" exit 1 @@ -99,14 +121,62 @@ fi # a patch has been created, notify the user and exit printf "\nThe following differences were found between the code to commit " printf "and the black formatter rules:\n\n" -$READER "$patch" -printf "\n" -# Allows us to read user input below, assigns stdin to keyboard -exec < /dev/tty +if [ -t 1 ] ; then + $READER "$patch" + printf "\n" + # Allows us to read user input below, assigns stdin to keyboard + exec < /dev/tty + terminal="1" +else + cat "$patch" + printf "\n" + # Allows non zero zenity/powershell output + set +e + terminal="0" +fi while true; do - read -p "Do you want to apply that patch (Y - Apply, N - Do not apply, S - Apply and stage files)? [Y/N/S] " yn + if [ $terminal = "0" ] ; then + if [ -x "$ZENITY" ] ; then + ans=$($ZENITY --text-info --filename="$patch" --width=800 --height=600 --title="Do you want to apply that patch?" --ok-label="Apply" --cancel-label="Do not apply" --extra-button="Apply and stage") + if [ "$?" = "0" ] ; then + yn="Y" + else + if [ "$ans" = "Apply and stage" ] ; then + yn="S" + else + yn="N" + fi + fi + elif [ -x "$XMSG" ] ; then + $XMSG -file "$patch" -buttons "Apply":100,"Apply and stage":200,"Do not apply":0 -center -default "Do not apply" -geometry 800x600 -title "Do you want to apply that patch?" + ans=$? + if [ "$ans" = "100" ] ; then + yn="Y" + elif [ "$ans" = "200" ] ; then + yn="S" + else + yn="N" + fi + elif [ \( \( "$OSTYPE" = "msys" \) -o \( "$OSTYPE" = "win32" \) \) -a \( -x "$PWSH" \) ]; then + winmessage="$(canonicalize_filename "./.git/hooks/winmessage.ps1")" + $PWSH -noprofile -executionpolicy bypass -file "$winmessage" -file "$patch" -buttons "Apply":100,"Apply and stage":200,"Do not apply":0 -center -default "Do not apply" -geometry 800x600 -title "Do you want to apply that patch?" + ans=$? + if [ "$ans" = "100" ] ; then + yn="Y" + elif [ "$ans" = "200" ] ; then + yn="S" + else + yn="N" + fi + else + printf "Error: zenity, xmessage, or powershell executable not found.\n" + exit 1 + fi + else + read -p "Do you want to apply that patch (Y - Apply, N - Do not apply, S - Apply and stage files)? [Y/N/S] " yn + fi case $yn in [Yy] ) git apply $patch; printf "The patch was applied. You can now stage the changes and commit again.\n\n"; diff --git a/misc/hooks/pre-commit-clang-format b/misc/hooks/pre-commit-clang-format index c5cf4ecbb1..4e1fbdeb20 100755 --- a/misc/hooks/pre-commit-clang-format +++ b/misc/hooks/pre-commit-clang-format @@ -16,7 +16,7 @@ ################################################################## # SETTINGS # Set path to clang-format binary. -CLANG_FORMAT=`which clang-format` +CLANG_FORMAT=`which clang-format 2>/dev/null` # Remove any older patches from previous commits. Set to true or false. DELETE_OLD_PATCHES=false @@ -31,13 +31,22 @@ FILE_EXTS=".c .h .cpp .hpp .cc .hh .cxx .m .mm .inc .java .glsl" # Use pygmentize instead of cat to parse diff with highlighting. # Install it with `pip install pygments` (Linux) or `easy_install Pygments` (Mac) -PYGMENTIZE=`which pygmentize` +PYGMENTIZE=`which pygmentize 2>/dev/null` if [ ! -z "$PYGMENTIZE" ]; then READER="pygmentize -l diff" else READER=cat fi +# Path to zenity +ZENITY=`which zenity 2>/dev/null` + +# Path to xmessage +XMSG=`which xmessage 2>/dev/null` + +# Path to powershell (Windows only) +PWSH=`which powershell 2>/dev/null` + ################################################################## # There should be no need to change anything below this line. @@ -66,6 +75,19 @@ else fi if [ ! -x "$CLANG_FORMAT" ] ; then + if [ ! -t 1 ] ; then + if [ -x "$ZENITY" ] ; then + $ZENITY --error --title="Error" --text="Error: clang-format executable not found." + exit 1 + elif [ -x "$XMSG" ] ; then + $XMSG -center -title "Error" "Error: clang-format executable not found." + exit 1 + elif [ \( \( "$OSTYPE" = "msys" \) -o \( "$OSTYPE" = "win32" \) \) -a \( -x "$PWSH" \) ]; then + winmessage="$(canonicalize_filename "./.git/hooks/winmessage.ps1")" + $PWSH -noprofile -executionpolicy bypass -file "$winmessage" -center -title "Error" --text "Error: clang-format executable not found." + exit 1 + fi + fi printf "Error: clang-format executable not found.\n" printf "Set the correct path in $(canonicalize_filename "$0").\n" exit 1 @@ -117,14 +139,62 @@ fi # a patch has been created, notify the user and exit printf "\nThe following differences were found between the code to commit " printf "and the clang-format rules:\n\n" -$READER "$patch" -printf "\n" -# Allows us to read user input below, assigns stdin to keyboard -exec < /dev/tty +if [ -t 1 ] ; then + $READER "$patch" + printf "\n" + # Allows us to read user input below, assigns stdin to keyboard + exec < /dev/tty + terminal="1" +else + cat "$patch" + printf "\n" + # Allows non zero zenity/powershell output + set +e + terminal="0" +fi while true; do - read -p "Do you want to apply that patch (Y - Apply, N - Do not apply, S - Apply and stage files)? [Y/N/S] " yn + if [ $terminal = "0" ] ; then + if [ -x "$ZENITY" ] ; then + ans=$($ZENITY --text-info --filename="$patch" --width=800 --height=600 --title="Do you want to apply that patch?" --ok-label="Apply" --cancel-label="Do not apply" --extra-button="Apply and stage") + if [ "$?" = "0" ] ; then + yn="Y" + else + if [ "$ans" = "Apply and stage" ] ; then + yn="S" + else + yn="N" + fi + fi + elif [ -x "$XMSG" ] ; then + $XMSG -file "$patch" -buttons "Apply":100,"Apply and stage":200,"Do not apply":0 -center -default "Do not apply" -geometry 800x600 -title "Do you want to apply that patch?" + ans=$? + if [ "$ans" = "100" ] ; then + yn="Y" + elif [ "$ans" = "200" ] ; then + yn="S" + else + yn="N" + fi + elif [ \( \( "$OSTYPE" = "msys" \) -o \( "$OSTYPE" = "win32" \) \) -a \( -x "$PWSH" \) ]; then + winmessage="$(canonicalize_filename "./.git/hooks/winmessage.ps1")" + $PWSH -noprofile -executionpolicy bypass -file "$winmessage" -file "$patch" -buttons "Apply":100,"Apply and stage":200,"Do not apply":0 -center -default "Do not apply" -geometry 800x600 -title "Do you want to apply that patch?" + ans=$? + if [ "$ans" = "100" ] ; then + yn="Y" + elif [ "$ans" = "200" ] ; then + yn="S" + else + yn="N" + fi + else + printf "Error: zenity, xmessage, or powershell executable not found.\n" + exit 1 + fi + else + read -p "Do you want to apply that patch (Y - Apply, N - Do not apply, S - Apply and stage files)? [Y/N/S] " yn + fi case $yn in [Yy] ) git apply $patch; printf "The patch was applied. You can now stage the changes and commit again.\n\n"; diff --git a/misc/hooks/winmessage.ps1 b/misc/hooks/winmessage.ps1 new file mode 100755 index 0000000000..3672579544 --- /dev/null +++ b/misc/hooks/winmessage.ps1 @@ -0,0 +1,103 @@ +Param ( + [string]$file = "", + [string]$text = "", + [string]$buttons = "OK:0", + [string]$default = "", + [switch]$nearmouse = $false, + [switch]$center = $false, + [string]$geometry = "", + [int32]$timeout = 0, + [string]$title = "Message" +) +Add-Type -assembly System.Windows.Forms + +$global:Result = 0 + +$main_form = New-Object System.Windows.Forms.Form +$main_form.Text = $title + +$geometry_data = $geometry.Split("+") +if ($geometry_data.Length -ge 1) { + $size_data = $geometry_data[0].Split("x") + if ($size_data.Length -eq 2) { + $main_form.Width = $size_data[0] + $main_form.Height = $size_data[1] + } +} +if ($geometry_data.Length -eq 3) { + $main_form.StartPosition = [System.Windows.Forms.FormStartPosition]::Manual + $main_form.Location = New-Object System.Drawing.Point($geometry_data[1], $geometry_data[2]) +} +if ($nearmouse) { + $main_form.StartPosition = [System.Windows.Forms.FormStartPosition]::Manual + $main_form.Location = System.Windows.Forms.Cursor.Position +} +if ($center) { + $main_form.StartPosition = [System.Windows.Forms.FormStartPosition]::CenterScreen +} + +$main_form.SuspendLayout() + +$button_panel = New-Object System.Windows.Forms.FlowLayoutPanel +$button_panel.SuspendLayout() +$button_panel.FlowDirection = [System.Windows.Forms.FlowDirection]::RightToLeft +$button_panel.Dock = [System.Windows.Forms.DockStyle]::Bottom +$button_panel.Autosize = $true + +if ($file -ne "") { + $text = [IO.File]::ReadAllText($file).replace("`n", "`r`n") +} + +if ($text -ne "") { + $text_box = New-Object System.Windows.Forms.TextBox + $text_box.Multiline = $true + $text_box.ReadOnly = $true + $text_box.Autosize = $true + $text_box.Text = $text + $text_box.Select(0,0) + $text_box.Dock = [System.Windows.Forms.DockStyle]::Fill + $main_form.Controls.Add($text_box) +} + +$buttons_array = $buttons.Split(",") +foreach ($button in $buttons_array) { + $button_data = $button.Split(":") + $button_ctl = New-Object System.Windows.Forms.Button + if ($button_data.Length -eq 2) { + $button_ctl.Tag = $button_data[1] + } else { + $button_ctl.Tag = 100 + $buttons_array.IndexOf($button) + } + if ($default -eq $button_data[0]) { + $main_form.AcceptButton = $button_ctl + } + $button_ctl.Autosize = $true + $button_ctl.Text = $button_data[0] + $button_ctl.Add_Click( + { + Param($sender) + $global:Result = $sender.Tag + $main_form.Close() + } + ) + $button_panel.Controls.Add($button_ctl) +} +$main_form.Controls.Add($button_panel) + +$button_panel.ResumeLayout($false) +$main_form.ResumeLayout($false) + +if ($timeout -gt 0) { + $timer = New-Object System.Windows.Forms.Timer + $timer.Add_Tick( + { + $global:Result = 0 + $main_form.Close() + } + ) + $timer.Interval = $timeout + $timer.Start() +} +$dlg_res = $main_form.ShowDialog() + +[Environment]::Exit($global:Result) diff --git a/misc/travis/android-tools-linux.sh b/misc/travis/android-tools-linux.sh index d0c123ee6c..6114551861 100755 --- a/misc/travis/android-tools-linux.sh +++ b/misc/travis/android-tools-linux.sh @@ -24,12 +24,12 @@ ANDROID_SDK_URL=$ANDROID_BASE_URL/$ANDROID_SDK_FILENAME ANDROID_SDK_PATH=$GODOT_BUILD_TOOLS_PATH/$ANDROID_SDK_DIR ANDROID_SDK_SHA256=92ffee5a1d98d856634e8b71132e8a95d96c83a63fde1099be3d86df3106def9 -ANDROID_NDK_RELEASE=r20 +ANDROID_NDK_RELEASE=r21 ANDROID_NDK_DIR=android-ndk ANDROID_NDK_FILENAME=android-ndk-$ANDROID_NDK_RELEASE-linux-x86_64.zip ANDROID_NDK_URL=$ANDROID_BASE_URL/$ANDROID_NDK_FILENAME ANDROID_NDK_PATH=$GODOT_BUILD_TOOLS_PATH/$ANDROID_NDK_DIR -ANDROID_NDK_SHA1=8665fc84a1b1f0d6ab3b5fdd1e30200cc7b9adff +ANDROID_NDK_SHA1=afc9c0b9faad222898ac8168c78ad4ccac8a1b5c echo echo "Download and install Android development tools ..." @@ -76,7 +76,7 @@ yes | $ANDROID_SDK_DIR/tools/bin/sdkmanager --licenses > /dev/null echo "Installing: Android Build and Platform Tools ..." yes | $ANDROID_SDK_DIR/tools/bin/sdkmanager 'tools' > /dev/null yes | $ANDROID_SDK_DIR/tools/bin/sdkmanager 'platform-tools' > /dev/null -yes | $ANDROID_SDK_DIR/tools/bin/sdkmanager 'build-tools;28.0.3' > /dev/null +yes | $ANDROID_SDK_DIR/tools/bin/sdkmanager 'build-tools;29.0.3' > /dev/null echo EXPORT_VAL="export ANDROID_HOME=$ANDROID_SDK_PATH" diff --git a/modules/SCsub b/modules/SCsub index 1671b398e5..fb46c5f877 100644 --- a/modules/SCsub +++ b/modules/SCsub @@ -11,6 +11,7 @@ Export("env_modules") # Header with MODULE_*_ENABLED defines. env.CommandNoCache("modules_enabled.gen.h", Value(env.module_list), modules_builders.generate_modules_enabled) +vs_sources = [] # libmodule_<name>.a for each active module. for module in env.module_list: env.modules_sources = [] @@ -23,6 +24,8 @@ for module in env.module_list: lib = env_modules.add_library("module_%s" % module, env.modules_sources) env.Prepend(LIBS=[lib]) + if env["vsproj"]: + vs_sources += env.modules_sources # libmodules.a with only register_module_types. # Must be last so that all libmodule_<name>.a libraries are on the right side @@ -31,3 +34,5 @@ env.modules_sources = [] env_modules.add_source_files(env.modules_sources, "register_module_types.gen.cpp") lib = env_modules.add_library("modules", env.modules_sources) env.Prepend(LIBS=[lib]) +if env["vsproj"]: + env.modules_sources += vs_sources diff --git a/modules/arkit/arkit_interface.h b/modules/arkit/arkit_interface.h index 4f8f726816..1044f3cf6f 100644 --- a/modules/arkit/arkit_interface.h +++ b/modules/arkit/arkit_interface.h @@ -31,9 +31,9 @@ #ifndef ARKIT_INTERFACE_H #define ARKIT_INTERFACE_H -#include "servers/arvr/arvr_interface.h" -#include "servers/arvr/arvr_positional_tracker.h" #include "servers/camera/camera_feed.h" +#include "servers/xr/xr_interface.h" +#include "servers/xr/xr_positional_tracker.h" /** @author Bastiaan Olij <mux213@gmail.com> @@ -44,8 +44,8 @@ // forward declaration for some needed objects class ARKitShader; -class ARKitInterface : public ARVRInterface { - GDCLASS(ARKitInterface, ARVRInterface); +class ARKitInterface : public XRInterface { + GDCLASS(ARKitInterface, XRInterface); private: bool initialized; @@ -65,7 +65,7 @@ private: Vector<uint8_t> img_data[2]; struct anchor_map { - ARVRPositionalTracker *tracker; + XRPositionalTracker *tracker; unsigned char uuid[16]; }; @@ -73,7 +73,7 @@ private: unsigned int num_anchors; unsigned int max_anchors; anchor_map *anchors; - ARVRPositionalTracker *get_anchor_for_uuid(const unsigned char *p_uuid); + XRPositionalTracker *get_anchor_for_uuid(const unsigned char *p_uuid); void remove_anchor_for_uuid(const unsigned char *p_uuid); void remove_all_anchors(); @@ -108,9 +108,9 @@ public: virtual Size2 get_render_targetsize(); virtual bool is_stereo(); - virtual Transform get_transform_for_eye(ARVRInterface::Eyes p_eye, const Transform &p_cam_transform); - virtual CameraMatrix get_projection_for_eye(ARVRInterface::Eyes p_eye, real_t p_aspect, real_t p_z_near, real_t p_z_far); - virtual void commit_for_eye(ARVRInterface::Eyes p_eye, RID p_render_target, const Rect2 &p_screen_rect); + virtual Transform get_transform_for_eye(XRInterface::Eyes p_eye, const Transform &p_cam_transform); + virtual CameraMatrix get_projection_for_eye(XRInterface::Eyes p_eye, real_t p_aspect, real_t p_z_near, real_t p_z_far); + virtual void commit_for_eye(XRInterface::Eyes p_eye, RID p_render_target, const Rect2 &p_screen_rect); virtual void process(); diff --git a/modules/arkit/arkit_interface.mm b/modules/arkit/arkit_interface.mm index 031e1e115e..7de824815a 100644 --- a/modules/arkit/arkit_interface.mm +++ b/modules/arkit/arkit_interface.mm @@ -28,7 +28,7 @@ /* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ /*************************************************************************/ -#include "core/input/input_filter.h" +#include "core/input/input.h" #include "core/os/os.h" #include "scene/resources/surface_tool.h" #include "servers/rendering/rendering_server_globals.h" @@ -158,7 +158,7 @@ StringName ARKitInterface::get_name() const { } int ARKitInterface::get_capabilities() const { - return ARKitInterface::ARVR_MONO + ARKitInterface::ARVR_AR; + return ARKitInterface::XR_MONO + ARKitInterface::XR_AR; } Array ARKitInterface::raycast(Vector2 p_screen_coord) { @@ -218,8 +218,8 @@ bool ARKitInterface::is_initialized() const { } bool ARKitInterface::initialize() { - ARVRServer *arvr_server = ARVRServer::get_singleton(); - ERR_FAIL_NULL_V(arvr_server, false); + XRServer *xr_server = XRServer::get_singleton(); + ERR_FAIL_NULL_V(xr_server, false); if (!initialized) { print_line("initializing ARKit"); @@ -244,7 +244,7 @@ bool ARKitInterface::initialize() { transform = Transform(); // make this our primary interface - arvr_server->set_primary_interface(this); + xr_server->set_primary_interface(this); // make sure we have our feed setup if (feed.is_null()) { @@ -270,10 +270,10 @@ bool ARKitInterface::initialize() { void ARKitInterface::uninitialize() { if (initialized) { - ARVRServer *arvr_server = ARVRServer::get_singleton(); - if (arvr_server != NULL) { + XRServer *xr_server = XRServer::get_singleton(); + if (xr_server != NULL) { // no longer our primary interface - arvr_server->clear_primary_interface_if(this); + xr_server->clear_primary_interface_if(this); } if (feed.is_valid()) { @@ -303,22 +303,22 @@ Size2 ARKitInterface::get_render_targetsize() { return target_size; } -Transform ARKitInterface::get_transform_for_eye(ARVRInterface::Eyes p_eye, const Transform &p_cam_transform) { +Transform ARKitInterface::get_transform_for_eye(XRInterface::Eyes p_eye, const Transform &p_cam_transform) { _THREAD_SAFE_METHOD_ Transform transform_for_eye; - ARVRServer *arvr_server = ARVRServer::get_singleton(); - ERR_FAIL_NULL_V(arvr_server, transform_for_eye); + XRServer *xr_server = XRServer::get_singleton(); + ERR_FAIL_NULL_V(xr_server, transform_for_eye); if (initialized) { - float world_scale = arvr_server->get_world_scale(); + float world_scale = xr_server->get_world_scale(); // just scale our origin point of our transform, note that we really shouldn't be using world_scale in ARKit but.... transform_for_eye = transform; transform_for_eye.origin *= world_scale; - transform_for_eye = p_cam_transform * arvr_server->get_reference_frame() * transform_for_eye; + transform_for_eye = p_cam_transform * xr_server->get_reference_frame() * transform_for_eye; } else { // huh? well just return what we got.... transform_for_eye = p_cam_transform; @@ -327,7 +327,7 @@ Transform ARKitInterface::get_transform_for_eye(ARVRInterface::Eyes p_eye, const return transform_for_eye; } -CameraMatrix ARKitInterface::get_projection_for_eye(ARVRInterface::Eyes p_eye, real_t p_aspect, real_t p_z_near, real_t p_z_far) { +CameraMatrix ARKitInterface::get_projection_for_eye(XRInterface::Eyes p_eye, real_t p_aspect, real_t p_z_near, real_t p_z_far) { // Remember our near and far, it will be used in process when we obtain our projection from our ARKit session. z_near = p_z_near; z_far = p_z_far; @@ -335,7 +335,7 @@ CameraMatrix ARKitInterface::get_projection_for_eye(ARVRInterface::Eyes p_eye, r return projection; } -void ARKitInterface::commit_for_eye(ARVRInterface::Eyes p_eye, RID p_render_target, const Rect2 &p_screen_rect) { +void ARKitInterface::commit_for_eye(XRInterface::Eyes p_eye, RID p_render_target, const Rect2 &p_screen_rect) { _THREAD_SAFE_METHOD_ // We must have a valid render target @@ -356,7 +356,7 @@ void ARKitInterface::commit_for_eye(ARVRInterface::Eyes p_eye, RID p_render_targ VSG::rasterizer->blit_render_target_to_screen(p_render_target, screen_rect, 0); } -ARVRPositionalTracker *ARKitInterface::get_anchor_for_uuid(const unsigned char *p_uuid) { +XRPositionalTracker *ARKitInterface::get_anchor_for_uuid(const unsigned char *p_uuid) { if (anchors == NULL) { num_anchors = 0; max_anchors = 10; @@ -377,8 +377,8 @@ ARVRPositionalTracker *ARKitInterface::get_anchor_for_uuid(const unsigned char * ERR_FAIL_NULL_V(anchors, NULL); } - ARVRPositionalTracker *new_tracker = memnew(ARVRPositionalTracker); - new_tracker->set_type(ARVRServer::TRACKER_ANCHOR); + XRPositionalTracker *new_tracker = memnew(XRPositionalTracker); + new_tracker->set_type(XRServer::TRACKER_ANCHOR); char tracker_name[256]; sprintf(tracker_name, "Anchor %02x%02x%02x%02x-%02x%02x-%02x%02x-%02x%02x-%02x%02x%02x%02x%02x%02x", p_uuid[0], p_uuid[1], p_uuid[2], p_uuid[3], p_uuid[4], p_uuid[5], p_uuid[6], p_uuid[7], p_uuid[8], p_uuid[9], p_uuid[10], p_uuid[11], p_uuid[12], p_uuid[13], p_uuid[14], p_uuid[15]); @@ -388,7 +388,7 @@ ARVRPositionalTracker *ARKitInterface::get_anchor_for_uuid(const unsigned char * new_tracker->set_name(name); // add our tracker - ARVRServer::get_singleton()->add_tracker(new_tracker); + XRServer::get_singleton()->add_tracker(new_tracker); anchors[num_anchors].tracker = new_tracker; memcpy(anchors[num_anchors].uuid, p_uuid, 16); num_anchors++; @@ -401,7 +401,7 @@ void ARKitInterface::remove_anchor_for_uuid(const unsigned char *p_uuid) { for (unsigned int i = 0; i < num_anchors; i++) { if (memcmp(anchors[i].uuid, p_uuid, 16) == 0) { // remove our tracker - ARVRServer::get_singleton()->remove_tracker(anchors[i].tracker); + XRServer::get_singleton()->remove_tracker(anchors[i].tracker); memdelete(anchors[i].tracker); // bring remaining forward @@ -421,7 +421,7 @@ void ARKitInterface::remove_all_anchors() { if (anchors != NULL) { for (unsigned int i = 0; i < num_anchors; i++) { // remove our tracker - ARVRServer::get_singleton()->remove_tracker(anchors[i].tracker); + XRServer::get_singleton()->remove_tracker(anchors[i].tracker); memdelete(anchors[i].tracker); }; @@ -582,16 +582,16 @@ void ARKitInterface::process() { // strangely enough we have to states, rolling them up into one if (camera.trackingState == ARTrackingStateNotAvailable) { // no tracking, would be good if we black out the screen or something... - tracking_state = ARVRInterface::ARVR_NOT_TRACKING; + tracking_state = XRInterface::XR_NOT_TRACKING; } else { if (camera.trackingState == ARTrackingStateNormal) { - tracking_state = ARVRInterface::ARVR_NORMAL_TRACKING; + tracking_state = XRInterface::XR_NORMAL_TRACKING; } else if (camera.trackingStateReason == ARTrackingStateReasonExcessiveMotion) { - tracking_state = ARVRInterface::ARVR_EXCESSIVE_MOTION; + tracking_state = XRInterface::XR_EXCESSIVE_MOTION; } else if (camera.trackingStateReason == ARTrackingStateReasonInsufficientFeatures) { - tracking_state = ARVRInterface::ARVR_INSUFFICIENT_FEATURES; + tracking_state = XRInterface::XR_INSUFFICIENT_FEATURES; } else { - tracking_state = ARVRInterface::ARVR_UNKNOWN_TRACKING; + tracking_state = XRInterface::XR_UNKNOWN_TRACKING; } // copy our current frame transform @@ -665,7 +665,7 @@ void ARKitInterface::_add_or_update_anchor(void *p_anchor) { unsigned char uuid[16]; [anchor.identifier getUUIDBytes:uuid]; - ARVRPositionalTracker *tracker = get_anchor_for_uuid(uuid); + XRPositionalTracker *tracker = get_anchor_for_uuid(uuid); if (tracker != NULL) { // lets update our mesh! (using Arjens code as is for now) // we should also probably limit how often we do this... @@ -695,7 +695,7 @@ void ARKitInterface::_add_or_update_anchor(void *p_anchor) { } // Note, this also contains a scale factor which gives us an idea of the size of the anchor - // We may extract that in our ARVRAnchor class + // We may extract that in our XRAnchor class Basis b; matrix_float4x4 m44 = anchor.transform; b.elements[0].x = m44.columns[0][0]; diff --git a/modules/arkit/register_types.cpp b/modules/arkit/register_types.cpp index c78b35529b..91069ab364 100644 --- a/modules/arkit/register_types.cpp +++ b/modules/arkit/register_types.cpp @@ -37,7 +37,7 @@ void register_arkit_types() { Ref<ARKitInterface> arkit_interface; arkit_interface.instance(); - ARVRServer::get_singleton()->add_interface(arkit_interface); + XRServer::get_singleton()->add_interface(arkit_interface); } void unregister_arkit_types() { diff --git a/modules/bullet/SCsub b/modules/bullet/SCsub index 692c749886..b853ebfc63 100644 --- a/modules/bullet/SCsub +++ b/modules/bullet/SCsub @@ -175,6 +175,7 @@ if env["builtin_bullet"]: "BulletSoftBody/btDeformableContactProjection.cpp", "BulletSoftBody/btDeformableMultiBodyDynamicsWorld.cpp", "BulletSoftBody/btDeformableContactConstraint.cpp", + "BulletSoftBody/poly34.cpp", # clew "clew/clew.c", # LinearMath @@ -203,6 +204,8 @@ if env["builtin_bullet"]: # if env['target'] == "debug" or env['target'] == "release_debug": # env_bullet.Append(CPPDEFINES=['BT_DEBUG']) + env_bullet.Append(CPPDEFINES=["BT_USE_OLD_DAMPING_METHOD"]) + env_thirdparty = env_bullet.Clone() env_thirdparty.disable_warnings() env_thirdparty.add_source_files(env.modules_sources, thirdparty_sources) diff --git a/modules/bullet/config.py b/modules/bullet/config.py index e8ca273f61..d22f9454ed 100644 --- a/modules/bullet/config.py +++ b/modules/bullet/config.py @@ -4,14 +4,3 @@ def can_build(env, platform): def configure(env): pass - - -def get_doc_classes(): - return [ - "BulletPhysicsDirectBodyState3D", - "BulletPhysicsServer3D", - ] - - -def get_doc_path(): - return "doc_classes" diff --git a/modules/bullet/doc_classes/BulletPhysicsDirectBodyState3D.xml b/modules/bullet/doc_classes/BulletPhysicsDirectBodyState3D.xml deleted file mode 100644 index 1c0181bd9c..0000000000 --- a/modules/bullet/doc_classes/BulletPhysicsDirectBodyState3D.xml +++ /dev/null @@ -1,13 +0,0 @@ -<?xml version="1.0" encoding="UTF-8" ?> -<class name="BulletPhysicsDirectBodyState3D" inherits="PhysicsDirectBodyState3D" version="4.0"> - <brief_description> - </brief_description> - <description> - </description> - <tutorials> - </tutorials> - <methods> - </methods> - <constants> - </constants> -</class> diff --git a/modules/bullet/rigid_body_bullet.cpp b/modules/bullet/rigid_body_bullet.cpp index fc4e1d57de..e393396713 100644 --- a/modules/bullet/rigid_body_bullet.cpp +++ b/modules/bullet/rigid_body_bullet.cpp @@ -138,8 +138,8 @@ void BulletPhysicsDirectBodyState3D::apply_torque_impulse(const Vector3 &p_impul body->apply_torque_impulse(p_impulse); } -void BulletPhysicsDirectBodyState3D::set_sleep_state(bool p_enable) { - body->set_activation_state(p_enable); +void BulletPhysicsDirectBodyState3D::set_sleep_state(bool p_sleep) { + body->set_activation_state(!p_sleep); } bool BulletPhysicsDirectBodyState3D::is_sleeping() const { @@ -503,15 +503,18 @@ void RigidBodyBullet::set_param(PhysicsServer3D::BodyParameter p_param, real_t p } case PhysicsServer3D::BODY_PARAM_LINEAR_DAMP: linearDamp = p_value; - btBody->setDamping(linearDamp, angularDamp); + // Mark for updating total linear damping. + scratch_space_override_modificator(); break; case PhysicsServer3D::BODY_PARAM_ANGULAR_DAMP: angularDamp = p_value; - btBody->setDamping(linearDamp, angularDamp); + // Mark for updating total angular damping. + scratch_space_override_modificator(); break; case PhysicsServer3D::BODY_PARAM_GRAVITY_SCALE: gravity_scale = p_value; - /// The Bullet gravity will be is set by reload_space_override_modificator + // The Bullet gravity will be is set by reload_space_override_modificator. + // Mark for updating total gravity scale. scratch_space_override_modificator(); break; default: @@ -902,21 +905,20 @@ void RigidBodyBullet::on_exit_area(AreaBullet *p_area) { } void RigidBodyBullet::reload_space_override_modificator() { - // Make sure that kinematic bodies have their total gravity calculated if (!is_active() && PhysicsServer3D::BODY_MODE_KINEMATIC != mode) return; - Vector3 newGravity(space->get_gravity_direction() * space->get_gravity_magnitude()); - real_t newLinearDamp(linearDamp); - real_t newAngularDamp(angularDamp); + Vector3 newGravity(0.0, 0.0, 0.0); + real_t newLinearDamp = MAX(0.0, linearDamp); + real_t newAngularDamp = MAX(0.0, angularDamp); AreaBullet *currentArea; // Variable used to calculate new gravity for gravity point areas, it is pointed by currentGravity pointer Vector3 support_gravity(0, 0, 0); - int countCombined(0); - for (int i = areaWhereIamCount - 1; 0 <= i; --i) { + bool stopped = false; + for (int i = areaWhereIamCount - 1; (0 <= i) && !stopped; --i) { currentArea = areasWhereIam[i]; @@ -965,7 +967,6 @@ void RigidBodyBullet::reload_space_override_modificator() { newGravity += support_gravity; newLinearDamp += currentArea->get_spOv_linearDamp(); newAngularDamp += currentArea->get_spOv_angularDamp(); - ++countCombined; break; case PhysicsServer3D::AREA_SPACE_OVERRIDE_COMBINE_REPLACE: /// This area adds its gravity/damp values to whatever has been calculated @@ -974,32 +975,31 @@ void RigidBodyBullet::reload_space_override_modificator() { newGravity += support_gravity; newLinearDamp += currentArea->get_spOv_linearDamp(); newAngularDamp += currentArea->get_spOv_angularDamp(); - ++countCombined; - goto endAreasCycle; + stopped = true; + break; case PhysicsServer3D::AREA_SPACE_OVERRIDE_REPLACE: /// This area replaces any gravity/damp, even the default one, and /// stops taking into account the rest of the areas. newGravity = support_gravity; newLinearDamp = currentArea->get_spOv_linearDamp(); newAngularDamp = currentArea->get_spOv_angularDamp(); - countCombined = 1; - goto endAreasCycle; + stopped = true; + break; case PhysicsServer3D::AREA_SPACE_OVERRIDE_REPLACE_COMBINE: /// This area replaces any gravity/damp calculated so far, but keeps /// calculating the rest of the areas, down to the default one. newGravity = support_gravity; newLinearDamp = currentArea->get_spOv_linearDamp(); newAngularDamp = currentArea->get_spOv_angularDamp(); - countCombined = 1; break; } } -endAreasCycle: - if (1 < countCombined) { - newGravity /= countCombined; - newLinearDamp /= countCombined; - newAngularDamp /= countCombined; + // Add default gravity and damping from space. + if (!stopped) { + newGravity += space->get_gravity_direction() * space->get_gravity_magnitude(); + newLinearDamp += space->get_linear_damp(); + newAngularDamp += space->get_angular_damp(); } btVector3 newBtGravity; diff --git a/modules/bullet/rigid_body_bullet.h b/modules/bullet/rigid_body_bullet.h index 95491b1e62..420b5cc443 100644 --- a/modules/bullet/rigid_body_bullet.h +++ b/modules/bullet/rigid_body_bullet.h @@ -117,7 +117,7 @@ public: virtual void apply_impulse(const Vector3 &p_pos, const Vector3 &p_impulse); virtual void apply_torque_impulse(const Vector3 &p_impulse); - virtual void set_sleep_state(bool p_enable); + virtual void set_sleep_state(bool p_sleep); virtual bool is_sleeping() const; virtual int get_contact_count() const; diff --git a/modules/bullet/space_bullet.cpp b/modules/bullet/space_bullet.cpp index 1659664ff9..d49e635fd5 100644 --- a/modules/bullet/space_bullet.cpp +++ b/modules/bullet/space_bullet.cpp @@ -342,6 +342,8 @@ SpaceBullet::SpaceBullet() : godotFilterCallback(nullptr), gravityDirection(0, -1, 0), gravityMagnitude(10), + linear_damp(0.0), + angular_damp(0.0), contactDebugCount(0), delta_time(0.) { @@ -379,8 +381,11 @@ void SpaceBullet::set_param(PhysicsServer3D::AreaParameter p_param, const Varian update_gravity(); break; case PhysicsServer3D::AREA_PARAM_LINEAR_DAMP: + linear_damp = p_value; + break; case PhysicsServer3D::AREA_PARAM_ANGULAR_DAMP: - break; // No damp + angular_damp = p_value; + break; case PhysicsServer3D::AREA_PARAM_PRIORITY: // Priority is always 0, the lower break; @@ -401,8 +406,9 @@ Variant SpaceBullet::get_param(PhysicsServer3D::AreaParameter p_param) { case PhysicsServer3D::AREA_PARAM_GRAVITY_VECTOR: return gravityDirection; case PhysicsServer3D::AREA_PARAM_LINEAR_DAMP: + return linear_damp; case PhysicsServer3D::AREA_PARAM_ANGULAR_DAMP: - return 0; // No damp + return angular_damp; case PhysicsServer3D::AREA_PARAM_PRIORITY: return 0; // Priority is always 0, the lower case PhysicsServer3D::AREA_PARAM_GRAVITY_IS_POINT: diff --git a/modules/bullet/space_bullet.h b/modules/bullet/space_bullet.h index f9a8c063fd..3d4a2aeceb 100644 --- a/modules/bullet/space_bullet.h +++ b/modules/bullet/space_bullet.h @@ -108,6 +108,9 @@ class SpaceBullet : public RIDBullet { Vector3 gravityDirection; real_t gravityMagnitude; + real_t linear_damp; + real_t angular_damp; + Vector<AreaBullet *> areas; Vector<Vector3> contactDebug; @@ -177,6 +180,9 @@ public: void update_gravity(); + real_t get_linear_damp() const { return linear_damp; } + real_t get_angular_damp() const { return angular_damp; } + bool test_body_motion(RigidBodyBullet *p_body, const Transform &p_from, const Vector3 &p_motion, bool p_infinite_inertia, PhysicsServer3D::MotionResult *r_result, bool p_exclude_raycast_shapes); int test_ray_separation(RigidBodyBullet *p_body, const Transform &p_transform, bool p_infinite_inertia, Vector3 &r_recover_motion, PhysicsServer3D::SeparationResult *r_results, int p_result_max, float p_margin); 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_gizmos.cpp b/modules/csg/csg_gizmos.cpp index 4b27eea019..fa176cb94e 100644 --- a/modules/csg/csg_gizmos.cpp +++ b/modules/csg/csg_gizmos.cpp @@ -32,7 +32,7 @@ /////////// -CSGShapeNode3DGizmoPlugin::CSGShapeNode3DGizmoPlugin() { +CSGShape3DGizmoPlugin::CSGShape3DGizmoPlugin() { Color gizmo_color = EDITOR_DEF("editors/3d_gizmos/gizmo_colors/csg", Color(0.0, 0.4, 1, 0.15)); create_material("shape_union_material", gizmo_color); @@ -49,7 +49,7 @@ CSGShapeNode3DGizmoPlugin::CSGShapeNode3DGizmoPlugin() { create_handle_material("handles"); } -String CSGShapeNode3DGizmoPlugin::get_handle_name(const EditorNode3DGizmo *p_gizmo, int p_idx) const { +String CSGShape3DGizmoPlugin::get_handle_name(const EditorNode3DGizmo *p_gizmo, int p_idx) const { CSGShape3D *cs = Object::cast_to<CSGShape3D>(p_gizmo->get_spatial_node()); @@ -76,7 +76,7 @@ String CSGShapeNode3DGizmoPlugin::get_handle_name(const EditorNode3DGizmo *p_giz return ""; } -Variant CSGShapeNode3DGizmoPlugin::get_handle_value(EditorNode3DGizmo *p_gizmo, int p_idx) const { +Variant CSGShape3DGizmoPlugin::get_handle_value(EditorNode3DGizmo *p_gizmo, int p_idx) const { CSGShape3D *cs = Object::cast_to<CSGShape3D>(p_gizmo->get_spatial_node()); @@ -110,7 +110,7 @@ Variant CSGShapeNode3DGizmoPlugin::get_handle_value(EditorNode3DGizmo *p_gizmo, return Variant(); } -void CSGShapeNode3DGizmoPlugin::set_handle(EditorNode3DGizmo *p_gizmo, int p_idx, Camera3D *p_camera, const Point2 &p_point) { +void CSGShape3DGizmoPlugin::set_handle(EditorNode3DGizmo *p_gizmo, int p_idx, Camera3D *p_camera, const Point2 &p_point) { CSGShape3D *cs = Object::cast_to<CSGShape3D>(p_gizmo->get_spatial_node()); @@ -207,7 +207,7 @@ void CSGShapeNode3DGizmoPlugin::set_handle(EditorNode3DGizmo *p_gizmo, int p_idx s->set_outer_radius(d); } } -void CSGShapeNode3DGizmoPlugin::commit_handle(EditorNode3DGizmo *p_gizmo, int p_idx, const Variant &p_restore, bool p_cancel) { +void CSGShape3DGizmoPlugin::commit_handle(EditorNode3DGizmo *p_gizmo, int p_idx, const Variant &p_restore, bool p_cancel) { CSGShape3D *cs = Object::cast_to<CSGShape3D>(p_gizmo->get_spatial_node()); @@ -299,23 +299,23 @@ void CSGShapeNode3DGizmoPlugin::commit_handle(EditorNode3DGizmo *p_gizmo, int p_ ur->commit_action(); } } -bool CSGShapeNode3DGizmoPlugin::has_gizmo(Node3D *p_spatial) { +bool CSGShape3DGizmoPlugin::has_gizmo(Node3D *p_spatial) { return Object::cast_to<CSGSphere3D>(p_spatial) || Object::cast_to<CSGBox3D>(p_spatial) || Object::cast_to<CSGCylinder3D>(p_spatial) || Object::cast_to<CSGTorus3D>(p_spatial) || Object::cast_to<CSGMesh3D>(p_spatial) || Object::cast_to<CSGPolygon3D>(p_spatial); } -String CSGShapeNode3DGizmoPlugin::get_name() const { - return "CSGShapes"; +String CSGShape3DGizmoPlugin::get_name() const { + return "CSGShape3D"; } -int CSGShapeNode3DGizmoPlugin::get_priority() const { +int CSGShape3DGizmoPlugin::get_priority() const { return -1; } -bool CSGShapeNode3DGizmoPlugin::is_selectable_when_hidden() const { +bool CSGShape3DGizmoPlugin::is_selectable_when_hidden() const { return true; } -void CSGShapeNode3DGizmoPlugin::redraw(EditorNode3DGizmo *p_gizmo) { +void CSGShape3DGizmoPlugin::redraw(EditorNode3DGizmo *p_gizmo) { CSGShape3D *cs = Object::cast_to<CSGShape3D>(p_gizmo->get_spatial_node()); @@ -419,6 +419,6 @@ void CSGShapeNode3DGizmoPlugin::redraw(EditorNode3DGizmo *p_gizmo) { } EditorPluginCSG::EditorPluginCSG(EditorNode *p_editor) { - Ref<CSGShapeNode3DGizmoPlugin> gizmo_plugin = Ref<CSGShapeNode3DGizmoPlugin>(memnew(CSGShapeNode3DGizmoPlugin)); + Ref<CSGShape3DGizmoPlugin> gizmo_plugin = Ref<CSGShape3DGizmoPlugin>(memnew(CSGShape3DGizmoPlugin)); Node3DEditor::get_singleton()->add_gizmo_plugin(gizmo_plugin); } diff --git a/modules/csg/csg_gizmos.h b/modules/csg/csg_gizmos.h index 90a059b31c..7763989b2a 100644 --- a/modules/csg/csg_gizmos.h +++ b/modules/csg/csg_gizmos.h @@ -35,9 +35,9 @@ #include "editor/editor_plugin.h" #include "editor/node_3d_editor_gizmos.h" -class CSGShapeNode3DGizmoPlugin : public EditorNode3DGizmoPlugin { +class CSGShape3DGizmoPlugin : public EditorNode3DGizmoPlugin { - GDCLASS(CSGShapeNode3DGizmoPlugin, EditorNode3DGizmoPlugin); + GDCLASS(CSGShape3DGizmoPlugin, EditorNode3DGizmoPlugin); public: bool has_gizmo(Node3D *p_spatial); @@ -51,7 +51,7 @@ public: void set_handle(EditorNode3DGizmo *p_gizmo, int p_idx, Camera3D *p_camera, const Point2 &p_point); void commit_handle(EditorNode3DGizmo *p_gizmo, int p_idx, const Variant &p_restore, bool p_cancel); - CSGShapeNode3DGizmoPlugin(); + CSGShape3DGizmoPlugin(); }; class EditorPluginCSG : public EditorPlugin { diff --git a/modules/csg/csg_shape.cpp b/modules/csg/csg_shape.cpp index 5557da3014..d38ddf3f90 100644 --- a/modules/csg/csg_shape.cpp +++ b/modules/csg/csg_shape.cpp @@ -296,20 +296,18 @@ void CSGShape3D::_update_shape() { int mat = n->faces[i].material; ERR_CONTINUE(mat < -1 || mat >= face_count.size()); int idx = mat == -1 ? face_count.size() - 1 : mat; - if (n->faces[i].smooth) { - Plane p(n->faces[i].vertices[0], n->faces[i].vertices[1], n->faces[i].vertices[2]); + Plane p(n->faces[i].vertices[0], n->faces[i].vertices[1], n->faces[i].vertices[2]); - for (int j = 0; j < 3; j++) { - Vector3 v = n->faces[i].vertices[j]; - Vector3 add; - if (vec_map.lookup(v, add)) { - add += p.normal; - } else { - add = p.normal; - } - vec_map.set(v, add); + for (int j = 0; j < 3; j++) { + Vector3 v = n->faces[i].vertices[j]; + Vector3 add; + if (vec_map.lookup(v, add)) { + add += p.normal; + } else { + add = p.normal; } + vec_map.set(v, add); } face_count.write[idx]++; diff --git a/modules/dds/texture_loader_dds.cpp b/modules/dds/texture_loader_dds.cpp index ae21156b8b..294d594135 100644 --- a/modules/dds/texture_loader_dds.cpp +++ b/modules/dds/texture_loader_dds.cpp @@ -94,7 +94,7 @@ static const DDSFormatInfo dds_format_info[DDS_MAX] = { { "GRAYSCALE_ALPHA", false, false, 1, 2, Image::FORMAT_LA8 } }; -RES ResourceFormatDDS::load(const String &p_path, const String &p_original_path, Error *r_error, bool p_use_sub_threads, float *r_progress) { +RES ResourceFormatDDS::load(const String &p_path, const String &p_original_path, Error *r_error, bool p_use_sub_threads, float *r_progress, bool p_no_cache) { if (r_error) *r_error = ERR_CANT_OPEN; diff --git a/modules/dds/texture_loader_dds.h b/modules/dds/texture_loader_dds.h index 5b89f16277..ef08967df7 100644 --- a/modules/dds/texture_loader_dds.h +++ b/modules/dds/texture_loader_dds.h @@ -36,7 +36,7 @@ class ResourceFormatDDS : public ResourceFormatLoader { public: - virtual RES load(const String &p_path, const String &p_original_path = "", Error *r_error = nullptr, bool p_use_sub_threads = false, float *r_progress = nullptr); + virtual RES load(const String &p_path, const String &p_original_path = "", Error *r_error = nullptr, bool p_use_sub_threads = false, float *r_progress = nullptr, bool p_no_cache = false); virtual void get_recognized_extensions(List<String> *p_extensions) const; virtual bool handles_type(const String &p_type) const; virtual String get_resource_type(const String &p_path) const; diff --git a/modules/etc/texture_loader_pkm.cpp b/modules/etc/texture_loader_pkm.cpp index ad0cc91c96..bfb2098dff 100644 --- a/modules/etc/texture_loader_pkm.cpp +++ b/modules/etc/texture_loader_pkm.cpp @@ -42,7 +42,7 @@ struct ETC1Header { uint16_t origHeight; }; -RES ResourceFormatPKM::load(const String &p_path, const String &p_original_path, Error *r_error, bool p_use_sub_threads, float *r_progress) { +RES ResourceFormatPKM::load(const String &p_path, const String &p_original_path, Error *r_error, bool p_use_sub_threads, float *r_progress, bool p_no_cache) { if (r_error) *r_error = ERR_CANT_OPEN; diff --git a/modules/etc/texture_loader_pkm.h b/modules/etc/texture_loader_pkm.h index 989e203994..6507e0bdec 100644 --- a/modules/etc/texture_loader_pkm.h +++ b/modules/etc/texture_loader_pkm.h @@ -36,7 +36,7 @@ class ResourceFormatPKM : public ResourceFormatLoader { public: - virtual RES load(const String &p_path, const String &p_original_path = "", Error *r_error = nullptr, bool p_use_sub_threads = false, float *r_progress = nullptr); + virtual RES load(const String &p_path, const String &p_original_path = "", Error *r_error = nullptr, bool p_use_sub_threads = false, float *r_progress = nullptr, bool p_no_cache = false); virtual void get_recognized_extensions(List<String> *p_extensions) const; virtual bool handles_type(const String &p_type) const; virtual String get_resource_type(const String &p_path) const; diff --git a/modules/gdnative/SCsub b/modules/gdnative/SCsub index a788175b07..cab05549d2 100644 --- a/modules/gdnative/SCsub +++ b/modules/gdnative/SCsub @@ -17,7 +17,7 @@ env_gdnative.Prepend(CPPPATH=["#modules/gdnative/include/"]) Export("env_gdnative") SConscript("net/SCsub") -SConscript("arvr/SCsub") +SConscript("xr/SCsub") SConscript("pluginscript/SCsub") SConscript("videodecoder/SCsub") diff --git a/modules/gdnative/config.py b/modules/gdnative/config.py index 37e25a46d4..4b997e4bfe 100644 --- a/modules/gdnative/config.py +++ b/modules/gdnative/config.py @@ -9,7 +9,7 @@ def configure(env): def get_doc_classes(): return [ "@NativeScript", - "ARVRInterfaceGDNative", + "XRInterfaceGDNative", "GDNative", "GDNativeLibrary", "MultiplayerPeerGDNative", diff --git a/modules/gdnative/doc_classes/ARVRInterfaceGDNative.xml b/modules/gdnative/doc_classes/ARVRInterfaceGDNative.xml deleted file mode 100644 index e8405b64a3..0000000000 --- a/modules/gdnative/doc_classes/ARVRInterfaceGDNative.xml +++ /dev/null @@ -1,15 +0,0 @@ -<?xml version="1.0" encoding="UTF-8" ?> -<class name="ARVRInterfaceGDNative" inherits="ARVRInterface" version="4.0"> - <brief_description> - GDNative wrapper for an ARVR interface. - </brief_description> - <description> - 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. - </description> - <tutorials> - </tutorials> - <methods> - </methods> - <constants> - </constants> -</class> diff --git a/modules/gdnative/doc_classes/GDNativeLibrary.xml b/modules/gdnative/doc_classes/GDNativeLibrary.xml index 601e132d42..1aab864102 100644 --- a/modules/gdnative/doc_classes/GDNativeLibrary.xml +++ b/modules/gdnative/doc_classes/GDNativeLibrary.xml @@ -4,7 +4,7 @@ An external library containing functions or script classes to use in Godot. </brief_description> <description> - 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 platform and architecture that the project will run on. + A GDNative library can implement [NativeScript]s, global functions to call with the [GDNative] class, or low-level engine extensions through interfaces such as [XRInterfaceGDNative]. The library must be compiled for each platform and architecture that the project will run on. </description> <tutorials> <link>https://docs.godotengine.org/en/latest/tutorials/plugins/gdnative/gdnative-c-example.html</link> diff --git a/modules/gdnative/doc_classes/XRInterfaceGDNative.xml b/modules/gdnative/doc_classes/XRInterfaceGDNative.xml new file mode 100644 index 0000000000..13de815793 --- /dev/null +++ b/modules/gdnative/doc_classes/XRInterfaceGDNative.xml @@ -0,0 +1,15 @@ +<?xml version="1.0" encoding="UTF-8" ?> +<class name="XRInterfaceGDNative" inherits="XRInterface" version="4.0"> + <brief_description> + GDNative wrapper for an XR interface. + </brief_description> + <description> + 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. + </description> + <tutorials> + </tutorials> + <methods> + </methods> + <constants> + </constants> +</class> diff --git a/modules/gdnative/gdnative.cpp b/modules/gdnative/gdnative.cpp index d3426044ec..a131e3a78f 100644 --- a/modules/gdnative/gdnative.cpp +++ b/modules/gdnative/gdnative.cpp @@ -493,7 +493,7 @@ Error GDNative::get_symbol(StringName p_procedure_name, void *&r_handle, bool p_ return result; } -RES GDNativeLibraryResourceLoader::load(const String &p_path, const String &p_original_path, Error *r_error, bool p_use_sub_threads, float *r_progress) { +RES GDNativeLibraryResourceLoader::load(const String &p_path, const String &p_original_path, Error *r_error, bool p_use_sub_threads, float *r_progress, bool p_no_cache) { Ref<GDNativeLibrary> lib; lib.instance(); diff --git a/modules/gdnative/gdnative.h b/modules/gdnative/gdnative.h index 9ef9c706d1..6d26c2141d 100644 --- a/modules/gdnative/gdnative.h +++ b/modules/gdnative/gdnative.h @@ -166,7 +166,7 @@ public: class GDNativeLibraryResourceLoader : public ResourceFormatLoader { public: - virtual RES load(const String &p_path, const String &p_original_path, Error *r_error, bool p_use_sub_threads = false, float *r_progress = nullptr); + virtual RES load(const String &p_path, const String &p_original_path, Error *r_error, bool p_use_sub_threads = false, float *r_progress = nullptr, bool p_no_cache = false); virtual void get_recognized_extensions(List<String> *p_extensions) const; virtual bool handles_type(const String &p_type) const; virtual String get_resource_type(const String &p_path) const; 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 e1d6c0c867..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"], @@ -5935,8 +5935,8 @@ ] }, { - "name": "arvr", - "type": "ARVR", + "name": "xr", + "type": "XR", "version": { "major": 1, "minor": 1 @@ -5944,24 +5944,24 @@ "next": null, "api": [ { - "name": "godot_arvr_register_interface", + "name": "godot_xr_register_interface", "return_type": "void", "arguments": [ - ["const godot_arvr_interface_gdnative *", "p_interface"] + ["const godot_xr_interface_gdnative *", "p_interface"] ] }, { - "name": "godot_arvr_get_worldscale", + "name": "godot_xr_get_worldscale", "return_type": "godot_real", "arguments": [] }, { - "name": "godot_arvr_get_reference_frame", + "name": "godot_xr_get_reference_frame", "return_type": "godot_transform", "arguments": [] }, { - "name": "godot_arvr_blit", + "name": "godot_xr_blit", "return_type": "void", "arguments": [ ["godot_int", "p_eye"], @@ -5970,14 +5970,14 @@ ] }, { - "name": "godot_arvr_get_texid", + "name": "godot_xr_get_texid", "return_type": "godot_int", "arguments": [ ["godot_rid *", "p_render_target"] ] }, { - "name": "godot_arvr_add_controller", + "name": "godot_xr_add_controller", "return_type": "godot_int", "arguments": [ ["char *", "p_device_name"], @@ -5987,14 +5987,14 @@ ] }, { - "name": "godot_arvr_remove_controller", + "name": "godot_xr_remove_controller", "return_type": "void", "arguments": [ ["godot_int", "p_controller_id"] ] }, { - "name": "godot_arvr_set_controller_transform", + "name": "godot_xr_set_controller_transform", "return_type": "void", "arguments": [ ["godot_int", "p_controller_id"], @@ -6004,7 +6004,7 @@ ] }, { - "name": "godot_arvr_set_controller_button", + "name": "godot_xr_set_controller_button", "return_type": "void", "arguments": [ ["godot_int", "p_controller_id"], @@ -6013,7 +6013,7 @@ ] }, { - "name": "godot_arvr_set_controller_axis", + "name": "godot_xr_set_controller_axis", "return_type": "void", "arguments": [ ["godot_int", "p_controller_id"], @@ -6023,7 +6023,7 @@ ] }, { - "name": "godot_arvr_get_controller_rumble", + "name": "godot_xr_get_controller_rumble", "return_type": "godot_real", "arguments": [ ["godot_int", "p_controller_id"] diff --git a/modules/gdnative/gdnative_builders.py b/modules/gdnative/gdnative_builders.py index 2d84f93d87..620935795f 100644 --- a/modules/gdnative/gdnative_builders.py +++ b/modules/gdnative/gdnative_builders.py @@ -19,7 +19,7 @@ def _build_gdnative_api_struct_header(api): "", "#include <gdnative/gdnative.h>", "#include <android/godot_android.h>", - "#include <arvr/godot_arvr.h>", + "#include <xr/godot_xr.h>", "#include <nativescript/godot_nativescript.h>", "#include <net/godot_net.h>", "#include <pluginscript/godot_pluginscript.h>", 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/gdnative/include/nativescript/godot_nativescript.h b/modules/gdnative/include/nativescript/godot_nativescript.h index 1b131c8cf0..0fb5180103 100644 --- a/modules/gdnative/include/nativescript/godot_nativescript.h +++ b/modules/gdnative/include/nativescript/godot_nativescript.h @@ -54,7 +54,6 @@ typedef enum { GODOT_PROPERTY_HINT_ENUM, ///< hint_text= "val1,val2,val3,etc" GODOT_PROPERTY_HINT_EXP_EASING, /// exponential easing function (Math::ease) GODOT_PROPERTY_HINT_LENGTH, ///< hint_text= "length" (as integer) - GODOT_PROPERTY_HINT_SPRITE_FRAME, // FIXME: Obsolete: drop whenever we can break compat GODOT_PROPERTY_HINT_KEY_ACCEL, ///< hint_text= "length" (as integer) GODOT_PROPERTY_HINT_FLAGS, ///< hint_text= "flag1,flag2,etc" (as bit flags) GODOT_PROPERTY_HINT_LAYERS_2D_RENDER, @@ -96,8 +95,7 @@ typedef enum { GODOT_PROPERTY_USAGE_INTERNATIONALIZED = 64, //hint for internationalized strings GODOT_PROPERTY_USAGE_GROUP = 128, //used for grouping props in the editor GODOT_PROPERTY_USAGE_CATEGORY = 256, - GODOT_PROPERTY_USAGE_STORE_IF_NONZERO = 512, // FIXME: Obsolete: drop whenever we can break compat - GODOT_PROPERTY_USAGE_STORE_IF_NONONE = 1024, // FIXME: Obsolete: drop whenever we can break compat + GODOT_PROPERTY_USAGE_SUBGROUP = 512, GODOT_PROPERTY_USAGE_NO_INSTANCE_STATE = 2048, GODOT_PROPERTY_USAGE_RESTART_IF_CHANGED = 4096, GODOT_PROPERTY_USAGE_SCRIPT_VARIABLE = 8192, diff --git a/modules/gdnative/include/arvr/godot_arvr.h b/modules/gdnative/include/xr/godot_xr.h index aaef31a855..22f7f021c4 100644 --- a/modules/gdnative/include/arvr/godot_arvr.h +++ b/modules/gdnative/include/xr/godot_xr.h @@ -1,5 +1,5 @@ /*************************************************************************/ -/* godot_arvr.h */ +/* godot_xr.h */ /*************************************************************************/ /* This file is part of: */ /* GODOT ENGINE */ @@ -28,8 +28,8 @@ /* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ /*************************************************************************/ -#ifndef GODOT_NATIVEARVR_H -#define GODOT_NATIVEARVR_H +#ifndef GODOT_NATIVEXR_H +#define GODOT_NATIVEXR_H #include <gdnative/gdnative.h> @@ -61,32 +61,31 @@ typedef struct { void (*fill_projection_for_eye)(void *, godot_real *, godot_int, godot_real, godot_real, godot_real); void (*commit_for_eye)(void *, godot_int, godot_rid *, godot_rect2 *); void (*process)(void *); - // only in 1.1 onwards godot_int (*get_external_texture_for_eye)(void *, godot_int); void (*notification)(void *, godot_int); godot_int (*get_camera_feed_id)(void *); -} godot_arvr_interface_gdnative; +} godot_xr_interface_gdnative; -void GDAPI godot_arvr_register_interface(const godot_arvr_interface_gdnative *p_interface); +void GDAPI godot_xr_register_interface(const godot_xr_interface_gdnative *p_interface); -// helper functions to access ARVRServer data -godot_real GDAPI godot_arvr_get_worldscale(); -godot_transform GDAPI godot_arvr_get_reference_frame(); +// helper functions to access XRServer data +godot_real GDAPI godot_xr_get_worldscale(); +godot_transform GDAPI godot_xr_get_reference_frame(); // helper functions for rendering -void GDAPI godot_arvr_blit(godot_int p_eye, godot_rid *p_render_target, godot_rect2 *p_rect); -godot_int GDAPI godot_arvr_get_texid(godot_rid *p_render_target); +void GDAPI godot_xr_blit(godot_int p_eye, godot_rid *p_render_target, godot_rect2 *p_rect); +godot_int GDAPI godot_xr_get_texid(godot_rid *p_render_target); -// helper functions for updating ARVR controllers -godot_int GDAPI godot_arvr_add_controller(char *p_device_name, godot_int p_hand, godot_bool p_tracks_orientation, godot_bool p_tracks_position); -void GDAPI godot_arvr_remove_controller(godot_int p_controller_id); -void GDAPI godot_arvr_set_controller_transform(godot_int p_controller_id, godot_transform *p_transform, godot_bool p_tracks_orientation, godot_bool p_tracks_position); -void GDAPI godot_arvr_set_controller_button(godot_int p_controller_id, godot_int p_button, godot_bool p_is_pressed); -void GDAPI godot_arvr_set_controller_axis(godot_int p_controller_id, godot_int p_axis, godot_real p_value, godot_bool p_can_be_negative); -godot_real GDAPI godot_arvr_get_controller_rumble(godot_int p_controller_id); +// helper functions for updating XR controllers +godot_int GDAPI godot_xr_add_controller(char *p_device_name, godot_int p_hand, godot_bool p_tracks_orientation, godot_bool p_tracks_position); +void GDAPI godot_xr_remove_controller(godot_int p_controller_id); +void GDAPI godot_xr_set_controller_transform(godot_int p_controller_id, godot_transform *p_transform, godot_bool p_tracks_orientation, godot_bool p_tracks_position); +void GDAPI godot_xr_set_controller_button(godot_int p_controller_id, godot_int p_button, godot_bool p_is_pressed); +void GDAPI godot_xr_set_controller_axis(godot_int p_controller_id, godot_int p_axis, godot_real p_value, godot_bool p_can_be_negative); +godot_real GDAPI godot_xr_get_controller_rumble(godot_int p_controller_id); #ifdef __cplusplus } #endif -#endif /* !GODOT_NATIVEARVR_H */ +#endif /* !GODOT_NATIVEXR_H */ diff --git a/modules/gdnative/nativescript/nativescript.cpp b/modules/gdnative/nativescript/nativescript.cpp index bf458c15ee..ed3ec44bf7 100644 --- a/modules/gdnative/nativescript/nativescript.cpp +++ b/modules/gdnative/nativescript/nativescript.cpp @@ -111,6 +111,13 @@ void NativeScript::_placeholder_erased(PlaceHolderScriptInstance *p_placeholder) #endif +bool NativeScript::inherits_script(const Ref<Script> &p_script) const { +#ifndef _MSC_VER +#warning inheritance needs to be implemented in NativeScript +#endif + return false; +} + void NativeScript::set_class_name(String p_class_name) { class_name = p_class_name; } @@ -1931,7 +1938,7 @@ void NativeReloadNode::_notification(int p_what) { #endif } -RES ResourceFormatLoaderNativeScript::load(const String &p_path, const String &p_original_path, Error *r_error, bool p_use_sub_threads, float *r_progress) { +RES ResourceFormatLoaderNativeScript::load(const String &p_path, const String &p_original_path, Error *r_error, bool p_use_sub_threads, float *r_progress, bool p_no_cache) { return ResourceFormatLoaderText::singleton->load(p_path, p_original_path, r_error); } diff --git a/modules/gdnative/nativescript/nativescript.h b/modules/gdnative/nativescript/nativescript.h index 75bbb42664..7e7598e06c 100644 --- a/modules/gdnative/nativescript/nativescript.h +++ b/modules/gdnative/nativescript/nativescript.h @@ -133,6 +133,8 @@ protected: public: inline NativeScriptDesc *get_script_desc() const; + bool inherits_script(const Ref<Script> &p_script) const; + void set_class_name(String p_class_name); String get_class_name() const; @@ -406,7 +408,7 @@ public: class ResourceFormatLoaderNativeScript : public ResourceFormatLoader { public: - virtual RES load(const String &p_path, const String &p_original_path = "", Error *r_error = nullptr, bool p_use_sub_threads = false, float *r_progress = nullptr); + virtual RES load(const String &p_path, const String &p_original_path = "", Error *r_error = nullptr, bool p_use_sub_threads = false, float *r_progress = nullptr, bool p_no_cache = false); virtual void get_recognized_extensions(List<String> *p_extensions) const; virtual bool handles_type(const String &p_type) const; virtual String get_resource_type(const String &p_path) const; diff --git a/modules/gdnative/pluginscript/pluginscript_loader.cpp b/modules/gdnative/pluginscript/pluginscript_loader.cpp index 3fb22b3f8d..64582cc517 100644 --- a/modules/gdnative/pluginscript/pluginscript_loader.cpp +++ b/modules/gdnative/pluginscript/pluginscript_loader.cpp @@ -39,7 +39,7 @@ ResourceFormatLoaderPluginScript::ResourceFormatLoaderPluginScript(PluginScriptL _language = language; } -RES ResourceFormatLoaderPluginScript::load(const String &p_path, const String &p_original_path, Error *r_error, bool p_use_sub_threads, float *r_progress) { +RES ResourceFormatLoaderPluginScript::load(const String &p_path, const String &p_original_path, Error *r_error, bool p_use_sub_threads, float *r_progress, bool p_no_cache) { if (r_error) *r_error = ERR_FILE_CANT_OPEN; diff --git a/modules/gdnative/pluginscript/pluginscript_loader.h b/modules/gdnative/pluginscript/pluginscript_loader.h index c929be53bd..e47754490a 100644 --- a/modules/gdnative/pluginscript/pluginscript_loader.h +++ b/modules/gdnative/pluginscript/pluginscript_loader.h @@ -44,7 +44,7 @@ class ResourceFormatLoaderPluginScript : public ResourceFormatLoader { public: ResourceFormatLoaderPluginScript(PluginScriptLanguage *language); - virtual RES load(const String &p_path, const String &p_original_path = "", Error *r_error = nullptr, bool p_use_sub_threads = false, float *r_progress = nullptr); + virtual RES load(const String &p_path, const String &p_original_path = "", Error *r_error = nullptr, bool p_use_sub_threads = false, float *r_progress = nullptr, bool p_no_cache = false); virtual void get_recognized_extensions(List<String> *p_extensions) const; virtual bool handles_type(const String &p_type) const; virtual String get_resource_type(const String &p_path) const; diff --git a/modules/gdnative/pluginscript/pluginscript_script.cpp b/modules/gdnative/pluginscript/pluginscript_script.cpp index a4c84dc0ca..6b303c8716 100644 --- a/modules/gdnative/pluginscript/pluginscript_script.cpp +++ b/modules/gdnative/pluginscript/pluginscript_script.cpp @@ -140,6 +140,13 @@ bool PluginScript::can_instance() const { return can; } +bool PluginScript::inherits_script(const Ref<Script> &p_script) const { +#ifndef _MSC_VER +#warning inheritance needs to be implemented in PluginScript +#endif + return false; +} + Ref<Script> PluginScript::get_base_script() const { if (_ref_base_parent.is_valid()) { return Ref<PluginScript>(_ref_base_parent); diff --git a/modules/gdnative/pluginscript/pluginscript_script.h b/modules/gdnative/pluginscript/pluginscript_script.h index 5c93ae38f5..70b9ca980b 100644 --- a/modules/gdnative/pluginscript/pluginscript_script.h +++ b/modules/gdnative/pluginscript/pluginscript_script.h @@ -72,6 +72,8 @@ private: protected: static void _bind_methods(); + bool inherits_script(const Ref<Script> &p_script) const; + PluginScriptInstance *_create_instance(const Variant **p_args, int p_argcount, Object *p_owner, Callable::CallError &r_error); Variant _new(const Variant **p_args, int p_argcount, Callable::CallError &r_error); diff --git a/modules/gdnative/register_types.cpp b/modules/gdnative/register_types.cpp index 397a020689..67a286ee2e 100644 --- a/modules/gdnative/register_types.cpp +++ b/modules/gdnative/register_types.cpp @@ -34,11 +34,11 @@ #include "gdnative.h" -#include "arvr/register_types.h" #include "nativescript/register_types.h" #include "net/register_types.h" #include "pluginscript/register_types.h" #include "videodecoder/register_types.h" +#include "xr/register_types.h" #include "core/engine.h" #include "core/io/resource_loader.h" @@ -240,7 +240,7 @@ void register_gdnative_types() { GDNativeCallRegistry::singleton->register_native_call_type("standard_varcall", cb_standard_varcall); register_net_types(); - register_arvr_types(); + register_xr_types(); register_nativescript_types(); register_pluginscript_types(); register_videodecoder_types(); @@ -305,7 +305,7 @@ void unregister_gdnative_types() { unregister_videodecoder_types(); unregister_pluginscript_types(); unregister_nativescript_types(); - unregister_arvr_types(); + unregister_xr_types(); unregister_net_types(); memdelete(GDNativeCallRegistry::singleton); diff --git a/modules/gdnative/videodecoder/video_stream_gdnative.cpp b/modules/gdnative/videodecoder/video_stream_gdnative.cpp index fa9f6be5c1..f7d87595af 100644 --- a/modules/gdnative/videodecoder/video_stream_gdnative.cpp +++ b/modules/gdnative/videodecoder/video_stream_gdnative.cpp @@ -373,7 +373,7 @@ void VideoStreamGDNative::set_audio_track(int p_track) { /* --- NOTE ResourceFormatLoaderVideoStreamGDNative starts here. ----- */ -RES ResourceFormatLoaderVideoStreamGDNative::load(const String &p_path, const String &p_original_path, Error *r_error, bool p_use_sub_threads, float *r_progress) { +RES ResourceFormatLoaderVideoStreamGDNative::load(const String &p_path, const String &p_original_path, Error *r_error, bool p_use_sub_threads, float *r_progress, bool p_no_cache) { FileAccess *f = FileAccess::open(p_path, FileAccess::READ); if (!f) { if (r_error) { diff --git a/modules/gdnative/videodecoder/video_stream_gdnative.h b/modules/gdnative/videodecoder/video_stream_gdnative.h index fbc0d4016f..092e10a0f5 100644 --- a/modules/gdnative/videodecoder/video_stream_gdnative.h +++ b/modules/gdnative/videodecoder/video_stream_gdnative.h @@ -199,7 +199,7 @@ public: class ResourceFormatLoaderVideoStreamGDNative : public ResourceFormatLoader { public: - virtual RES load(const String &p_path, const String &p_original_path = "", Error *r_error = nullptr, bool p_use_sub_threads = false, float *r_progress = nullptr); + virtual RES load(const String &p_path, const String &p_original_path = "", Error *r_error = nullptr, bool p_use_sub_threads = false, float *r_progress = nullptr, bool p_no_cache = false); virtual void get_recognized_extensions(List<String> *p_extensions) const; virtual bool handles_type(const String &p_type) const; virtual String get_resource_type(const String &p_path) const; diff --git a/modules/gdnative/arvr/SCsub b/modules/gdnative/xr/SCsub index 0b2db3b504..0b2db3b504 100644 --- a/modules/gdnative/arvr/SCsub +++ b/modules/gdnative/xr/SCsub diff --git a/modules/gdnative/arvr/config.py b/modules/gdnative/xr/config.py index d22f9454ed..d22f9454ed 100644 --- a/modules/gdnative/arvr/config.py +++ b/modules/gdnative/xr/config.py diff --git a/modules/gdnative/arvr/register_types.cpp b/modules/gdnative/xr/register_types.cpp index 0f6e2bca1a..da3a7dc4b8 100644 --- a/modules/gdnative/arvr/register_types.cpp +++ b/modules/gdnative/xr/register_types.cpp @@ -29,11 +29,12 @@ /*************************************************************************/ #include "register_types.h" -#include "arvr_interface_gdnative.h" +#include "xr_interface_gdnative.h" -void register_arvr_types() { - ClassDB::register_class<ARVRInterfaceGDNative>(); +void register_xr_types() { + ClassDB::register_class<XRInterfaceGDNative>(); + ClassDB::add_compatibility_class("ARVRInterfaceGDNative", "XRInterfaceGDNative"); } -void unregister_arvr_types() { +void unregister_xr_types() { } diff --git a/modules/gdnative/arvr/register_types.h b/modules/gdnative/xr/register_types.h index b0de6f7c14..2501d28651 100644 --- a/modules/gdnative/arvr/register_types.h +++ b/modules/gdnative/xr/register_types.h @@ -28,10 +28,10 @@ /* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ /*************************************************************************/ -#ifndef ARVR_REGISTER_TYPES_H -#define ARVR_REGISTER_TYPES_H +#ifndef XR_REGISTER_TYPES_H +#define XR_REGISTER_TYPES_H -void register_arvr_types(); -void unregister_arvr_types(); +void register_xr_types(); +void unregister_xr_types(); -#endif // ARVR_REGISTER_TYPES_H +#endif // XR_REGISTER_TYPES_H diff --git a/modules/gdnative/arvr/arvr_interface_gdnative.cpp b/modules/gdnative/xr/xr_interface_gdnative.cpp index f14691027a..d65089a123 100644 --- a/modules/gdnative/arvr/arvr_interface_gdnative.cpp +++ b/modules/gdnative/xr/xr_interface_gdnative.cpp @@ -1,5 +1,5 @@ /*************************************************************************/ -/* arvr_interface_gdnative.cpp */ +/* xr_interface_gdnative.cpp */ /*************************************************************************/ /* This file is part of: */ /* GODOT ENGINE */ @@ -28,17 +28,17 @@ /* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ /*************************************************************************/ -#include "arvr_interface_gdnative.h" -#include "core/input/input_filter.h" -#include "servers/arvr/arvr_positional_tracker.h" +#include "xr_interface_gdnative.h" +#include "core/input/input.h" #include "servers/rendering/rendering_server_globals.h" +#include "servers/xr/xr_positional_tracker.h" -void ARVRInterfaceGDNative::_bind_methods() { +void XRInterfaceGDNative::_bind_methods() { ADD_PROPERTY_DEFAULT("interface_is_initialized", false); ADD_PROPERTY_DEFAULT("ar_is_anchor_detection_enabled", false); } -ARVRInterfaceGDNative::ARVRInterfaceGDNative() { +XRInterfaceGDNative::XRInterfaceGDNative() { print_verbose("Construct gdnative interface\n"); // we won't have our data pointer until our library gets set @@ -47,7 +47,7 @@ ARVRInterfaceGDNative::ARVRInterfaceGDNative() { interface = nullptr; } -ARVRInterfaceGDNative::~ARVRInterfaceGDNative() { +XRInterfaceGDNative::~XRInterfaceGDNative() { print_verbose("Destruct gdnative interface\n"); if (interface != nullptr && is_initialized()) { @@ -58,7 +58,7 @@ ARVRInterfaceGDNative::~ARVRInterfaceGDNative() { cleanup(); } -void ARVRInterfaceGDNative::cleanup() { +void XRInterfaceGDNative::cleanup() { if (interface != nullptr) { interface->destructor(data); data = nullptr; @@ -66,7 +66,7 @@ void ARVRInterfaceGDNative::cleanup() { } } -void ARVRInterfaceGDNative::set_interface(const godot_arvr_interface_gdnative *p_interface) { +void XRInterfaceGDNative::set_interface(const godot_xr_interface_gdnative *p_interface) { // this should only be called once, just being paranoid.. if (interface) { cleanup(); @@ -79,7 +79,7 @@ void ARVRInterfaceGDNative::set_interface(const godot_arvr_interface_gdnative *p data = interface->constructor((godot_object *)this); } -StringName ARVRInterfaceGDNative::get_name() const { +StringName XRInterfaceGDNative::get_name() const { ERR_FAIL_COND_V(interface == nullptr, StringName()); @@ -92,7 +92,7 @@ StringName ARVRInterfaceGDNative::get_name() const { return name; } -int ARVRInterfaceGDNative::get_capabilities() const { +int XRInterfaceGDNative::get_capabilities() const { int capabilities; ERR_FAIL_COND_V(interface == nullptr, 0); // 0 = None @@ -102,32 +102,28 @@ int ARVRInterfaceGDNative::get_capabilities() const { return capabilities; } -bool ARVRInterfaceGDNative::get_anchor_detection_is_enabled() const { +bool XRInterfaceGDNative::get_anchor_detection_is_enabled() const { ERR_FAIL_COND_V(interface == nullptr, false); return interface->get_anchor_detection_is_enabled(data); } -void ARVRInterfaceGDNative::set_anchor_detection_is_enabled(bool p_enable) { +void XRInterfaceGDNative::set_anchor_detection_is_enabled(bool p_enable) { ERR_FAIL_COND(interface == nullptr); interface->set_anchor_detection_is_enabled(data, p_enable); } -int ARVRInterfaceGDNative::get_camera_feed_id() { +int XRInterfaceGDNative::get_camera_feed_id() { ERR_FAIL_COND_V(interface == nullptr, 0); - if ((interface->version.major > 1) || ((interface->version.major) == 1 && (interface->version.minor >= 1))) { - return (unsigned int)interface->get_camera_feed_id(data); - } else { - return 0; - } + return (unsigned int)interface->get_camera_feed_id(data); } -bool ARVRInterfaceGDNative::is_stereo() { +bool XRInterfaceGDNative::is_stereo() { bool stereo; ERR_FAIL_COND_V(interface == nullptr, false); @@ -137,14 +133,14 @@ bool ARVRInterfaceGDNative::is_stereo() { return stereo; } -bool ARVRInterfaceGDNative::is_initialized() const { +bool XRInterfaceGDNative::is_initialized() const { ERR_FAIL_COND_V(interface == nullptr, false); return interface->is_initialized(data); } -bool ARVRInterfaceGDNative::initialize() { +bool XRInterfaceGDNative::initialize() { ERR_FAIL_COND_V(interface == nullptr, false); bool initialized = interface->initialize(data); @@ -152,28 +148,28 @@ bool ARVRInterfaceGDNative::initialize() { if (initialized) { // if we successfully initialize our interface and we don't have a primary interface yet, this becomes our primary interface - ARVRServer *arvr_server = ARVRServer::get_singleton(); - if ((arvr_server != nullptr) && (arvr_server->get_primary_interface() == nullptr)) { - arvr_server->set_primary_interface(this); + XRServer *xr_server = XRServer::get_singleton(); + if ((xr_server != nullptr) && (xr_server->get_primary_interface() == nullptr)) { + xr_server->set_primary_interface(this); }; }; return initialized; } -void ARVRInterfaceGDNative::uninitialize() { +void XRInterfaceGDNative::uninitialize() { ERR_FAIL_COND(interface == nullptr); - ARVRServer *arvr_server = ARVRServer::get_singleton(); - if (arvr_server != nullptr) { + XRServer *xr_server = XRServer::get_singleton(); + if (xr_server != nullptr) { // Whatever happens, make sure this is no longer our primary interface - arvr_server->clear_primary_interface_if(this); + xr_server->clear_primary_interface_if(this); } interface->uninitialize(data); } -Size2 ARVRInterfaceGDNative::get_render_targetsize() { +Size2 XRInterfaceGDNative::get_render_targetsize() { ERR_FAIL_COND_V(interface == nullptr, Size2()); @@ -183,7 +179,7 @@ Size2 ARVRInterfaceGDNative::get_render_targetsize() { return *vec; } -Transform ARVRInterfaceGDNative::get_transform_for_eye(ARVRInterface::Eyes p_eye, const Transform &p_cam_transform) { +Transform XRInterfaceGDNative::get_transform_for_eye(XRInterface::Eyes p_eye, const Transform &p_cam_transform) { Transform *ret; ERR_FAIL_COND_V(interface == nullptr, Transform()); @@ -195,7 +191,7 @@ Transform ARVRInterfaceGDNative::get_transform_for_eye(ARVRInterface::Eyes p_eye return *ret; } -CameraMatrix ARVRInterfaceGDNative::get_projection_for_eye(ARVRInterface::Eyes p_eye, real_t p_aspect, real_t p_z_near, real_t p_z_far) { +CameraMatrix XRInterfaceGDNative::get_projection_for_eye(XRInterface::Eyes p_eye, real_t p_aspect, real_t p_z_near, real_t p_z_far) { CameraMatrix cm; ERR_FAIL_COND_V(interface == nullptr, CameraMatrix()); @@ -205,37 +201,30 @@ CameraMatrix ARVRInterfaceGDNative::get_projection_for_eye(ARVRInterface::Eyes p return cm; } -unsigned int ARVRInterfaceGDNative::get_external_texture_for_eye(ARVRInterface::Eyes p_eye) { +unsigned int XRInterfaceGDNative::get_external_texture_for_eye(XRInterface::Eyes p_eye) { ERR_FAIL_COND_V(interface == nullptr, 0); - if ((interface->version.major > 1) || ((interface->version.major) == 1 && (interface->version.minor >= 1))) { - return (unsigned int)interface->get_external_texture_for_eye(data, (godot_int)p_eye); - } else { - return 0; - } + return (unsigned int)interface->get_external_texture_for_eye(data, (godot_int)p_eye); } -void ARVRInterfaceGDNative::commit_for_eye(ARVRInterface::Eyes p_eye, RID p_render_target, const Rect2 &p_screen_rect) { +void XRInterfaceGDNative::commit_for_eye(XRInterface::Eyes p_eye, RID p_render_target, const Rect2 &p_screen_rect) { ERR_FAIL_COND(interface == nullptr); interface->commit_for_eye(data, (godot_int)p_eye, (godot_rid *)&p_render_target, (godot_rect2 *)&p_screen_rect); } -void ARVRInterfaceGDNative::process() { +void XRInterfaceGDNative::process() { ERR_FAIL_COND(interface == nullptr); interface->process(data); } -void ARVRInterfaceGDNative::notification(int p_what) { +void XRInterfaceGDNative::notification(int p_what) { ERR_FAIL_COND(interface == nullptr); - // this is only available in interfaces that implement 1.1 or later - if ((interface->version.major > 1) || ((interface->version.major == 1) && (interface->version.minor > 0))) { - interface->notification(data, p_what); - } + interface->notification(data, p_what); } ///////////////////////////////////////////////////////////////////////////////////// @@ -243,30 +232,30 @@ void ARVRInterfaceGDNative::notification(int p_what) { extern "C" { -void GDAPI godot_arvr_register_interface(const godot_arvr_interface_gdnative *p_interface) { - // If our major version is 0 or bigger then 10, we're likely looking at our constructor pointer from an older plugin - ERR_FAIL_COND_MSG((p_interface->version.major == 0) || (p_interface->version.major > 10), "GDNative ARVR interfaces build for Godot 3.0 are not supported."); +void GDAPI godot_xr_register_interface(const godot_xr_interface_gdnative *p_interface) { + // Must be on a version 4 plugin + ERR_FAIL_COND_MSG(p_interface->version.major < 4, "GDNative XR interfaces build for Godot 3.x are not supported."); - Ref<ARVRInterfaceGDNative> new_interface; + Ref<XRInterfaceGDNative> new_interface; new_interface.instance(); - new_interface->set_interface((const godot_arvr_interface_gdnative *)p_interface); - ARVRServer::get_singleton()->add_interface(new_interface); + new_interface->set_interface((const godot_xr_interface_gdnative *)p_interface); + XRServer::get_singleton()->add_interface(new_interface); } -godot_real GDAPI godot_arvr_get_worldscale() { - ARVRServer *arvr_server = ARVRServer::get_singleton(); - ERR_FAIL_NULL_V(arvr_server, 1.0); +godot_real GDAPI godot_xr_get_worldscale() { + XRServer *xr_server = XRServer::get_singleton(); + ERR_FAIL_NULL_V(xr_server, 1.0); - return arvr_server->get_world_scale(); + return xr_server->get_world_scale(); } -godot_transform GDAPI godot_arvr_get_reference_frame() { +godot_transform GDAPI godot_xr_get_reference_frame() { godot_transform reference_frame; Transform *reference_frame_ptr = (Transform *)&reference_frame; - ARVRServer *arvr_server = ARVRServer::get_singleton(); - if (arvr_server != nullptr) { - *reference_frame_ptr = arvr_server->get_reference_frame(); + XRServer *xr_server = XRServer::get_singleton(); + if (xr_server != nullptr) { + *reference_frame_ptr = xr_server->get_reference_frame(); } else { godot_transform_new_identity(&reference_frame); } @@ -274,17 +263,17 @@ godot_transform GDAPI godot_arvr_get_reference_frame() { return reference_frame; } -void GDAPI godot_arvr_blit(godot_int p_eye, godot_rid *p_render_target, godot_rect2 *p_rect) { +void GDAPI godot_xr_blit(godot_int p_eye, godot_rid *p_render_target, godot_rect2 *p_rect) { // blits out our texture as is, handy for preview display of one of the eyes that is already rendered with lens distortion on an external HMD - ARVRInterface::Eyes eye = (ARVRInterface::Eyes)p_eye; + XRInterface::Eyes eye = (XRInterface::Eyes)p_eye; #if 0 RID *render_target = (RID *)p_render_target; #endif Rect2 screen_rect = *(Rect2 *)p_rect; - if (eye == ARVRInterface::EYE_LEFT) { + if (eye == XRInterface::EYE_LEFT) { screen_rect.size.x /= 2.0; - } else if (p_eye == ARVRInterface::EYE_RIGHT) { + } else if (p_eye == XRInterface::EYE_RIGHT) { screen_rect.size.x /= 2.0; screen_rect.position.x += screen_rect.size.x; } @@ -296,7 +285,7 @@ void GDAPI godot_arvr_blit(godot_int p_eye, godot_rid *p_render_target, godot_re #endif } -godot_int GDAPI godot_arvr_get_texid(godot_rid *p_render_target) { +godot_int GDAPI godot_xr_get_texid(godot_rid *p_render_target) { // In order to send off our textures to display on our hardware we need the opengl texture ID instead of the render target RID // This is a handy function to expose that. #if 0 @@ -313,20 +302,20 @@ godot_int GDAPI godot_arvr_get_texid(godot_rid *p_render_target) { return texid; } -godot_int GDAPI godot_arvr_add_controller(char *p_device_name, godot_int p_hand, godot_bool p_tracks_orientation, godot_bool p_tracks_position) { - ARVRServer *arvr_server = ARVRServer::get_singleton(); - ERR_FAIL_NULL_V(arvr_server, 0); +godot_int GDAPI godot_xr_add_controller(char *p_device_name, godot_int p_hand, godot_bool p_tracks_orientation, godot_bool p_tracks_position) { + XRServer *xr_server = XRServer::get_singleton(); + ERR_FAIL_NULL_V(xr_server, 0); - InputFilter *input = InputFilter::get_singleton(); + Input *input = Input::get_singleton(); ERR_FAIL_NULL_V(input, 0); - ARVRPositionalTracker *new_tracker = memnew(ARVRPositionalTracker); + XRPositionalTracker *new_tracker = memnew(XRPositionalTracker); new_tracker->set_name(p_device_name); - new_tracker->set_type(ARVRServer::TRACKER_CONTROLLER); + new_tracker->set_type(XRServer::TRACKER_CONTROLLER); if (p_hand == 1) { - new_tracker->set_hand(ARVRPositionalTracker::TRACKER_LEFT_HAND); + new_tracker->set_hand(XRPositionalTracker::TRACKER_LEFT_HAND); } else if (p_hand == 2) { - new_tracker->set_hand(ARVRPositionalTracker::TRACKER_RIGHT_HAND); + new_tracker->set_hand(XRPositionalTracker::TRACKER_RIGHT_HAND); } // also register as joystick... @@ -346,20 +335,20 @@ godot_int GDAPI godot_arvr_add_controller(char *p_device_name, godot_int p_hand, } // add our tracker to our server and remember its pointer - arvr_server->add_tracker(new_tracker); + xr_server->add_tracker(new_tracker); // note, this ID is only unique within controllers! return new_tracker->get_tracker_id(); } -void GDAPI godot_arvr_remove_controller(godot_int p_controller_id) { - ARVRServer *arvr_server = ARVRServer::get_singleton(); - ERR_FAIL_NULL(arvr_server); +void GDAPI godot_xr_remove_controller(godot_int p_controller_id) { + XRServer *xr_server = XRServer::get_singleton(); + ERR_FAIL_NULL(xr_server); - InputFilter *input = InputFilter::get_singleton(); + Input *input = Input::get_singleton(); ERR_FAIL_NULL(input); - ARVRPositionalTracker *remove_tracker = arvr_server->find_by_type_and_id(ARVRServer::TRACKER_CONTROLLER, p_controller_id); + XRPositionalTracker *remove_tracker = xr_server->find_by_type_and_id(XRServer::TRACKER_CONTROLLER, p_controller_id); if (remove_tracker != nullptr) { // unset our joystick if applicable int joyid = remove_tracker->get_joy_id(); @@ -369,16 +358,16 @@ void GDAPI godot_arvr_remove_controller(godot_int p_controller_id) { } // remove our tracker from our server - arvr_server->remove_tracker(remove_tracker); + xr_server->remove_tracker(remove_tracker); memdelete(remove_tracker); } } -void GDAPI godot_arvr_set_controller_transform(godot_int p_controller_id, godot_transform *p_transform, godot_bool p_tracks_orientation, godot_bool p_tracks_position) { - ARVRServer *arvr_server = ARVRServer::get_singleton(); - ERR_FAIL_NULL(arvr_server); +void GDAPI godot_xr_set_controller_transform(godot_int p_controller_id, godot_transform *p_transform, godot_bool p_tracks_orientation, godot_bool p_tracks_position) { + XRServer *xr_server = XRServer::get_singleton(); + ERR_FAIL_NULL(xr_server); - ARVRPositionalTracker *tracker = arvr_server->find_by_type_and_id(ARVRServer::TRACKER_CONTROLLER, p_controller_id); + XRPositionalTracker *tracker = xr_server->find_by_type_and_id(XRServer::TRACKER_CONTROLLER, p_controller_id); if (tracker != nullptr) { Transform *transform = (Transform *)p_transform; if (p_tracks_orientation) { @@ -390,14 +379,14 @@ void GDAPI godot_arvr_set_controller_transform(godot_int p_controller_id, godot_ } } -void GDAPI godot_arvr_set_controller_button(godot_int p_controller_id, godot_int p_button, godot_bool p_is_pressed) { - ARVRServer *arvr_server = ARVRServer::get_singleton(); - ERR_FAIL_NULL(arvr_server); +void GDAPI godot_xr_set_controller_button(godot_int p_controller_id, godot_int p_button, godot_bool p_is_pressed) { + XRServer *xr_server = XRServer::get_singleton(); + ERR_FAIL_NULL(xr_server); - InputFilter *input = InputFilter::get_singleton(); + Input *input = Input::get_singleton(); ERR_FAIL_NULL(input); - ARVRPositionalTracker *tracker = arvr_server->find_by_type_and_id(ARVRServer::TRACKER_CONTROLLER, p_controller_id); + XRPositionalTracker *tracker = xr_server->find_by_type_and_id(XRServer::TRACKER_CONTROLLER, p_controller_id); if (tracker != nullptr) { int joyid = tracker->get_joy_id(); if (joyid != -1) { @@ -406,18 +395,18 @@ void GDAPI godot_arvr_set_controller_button(godot_int p_controller_id, godot_int } } -void GDAPI godot_arvr_set_controller_axis(godot_int p_controller_id, godot_int p_axis, godot_real p_value, godot_bool p_can_be_negative) { - ARVRServer *arvr_server = ARVRServer::get_singleton(); - ERR_FAIL_NULL(arvr_server); +void GDAPI godot_xr_set_controller_axis(godot_int p_controller_id, godot_int p_axis, godot_real p_value, godot_bool p_can_be_negative) { + XRServer *xr_server = XRServer::get_singleton(); + ERR_FAIL_NULL(xr_server); - InputFilter *input = InputFilter::get_singleton(); + Input *input = Input::get_singleton(); ERR_FAIL_NULL(input); - ARVRPositionalTracker *tracker = arvr_server->find_by_type_and_id(ARVRServer::TRACKER_CONTROLLER, p_controller_id); + XRPositionalTracker *tracker = xr_server->find_by_type_and_id(XRServer::TRACKER_CONTROLLER, p_controller_id); if (tracker != nullptr) { int joyid = tracker->get_joy_id(); if (joyid != -1) { - InputFilter::JoyAxis jx; + Input::JoyAxis jx; jx.min = p_can_be_negative ? -1 : 0; jx.value = p_value; input->joy_axis(joyid, p_axis, jx); @@ -425,11 +414,11 @@ void GDAPI godot_arvr_set_controller_axis(godot_int p_controller_id, godot_int p } } -godot_real GDAPI godot_arvr_get_controller_rumble(godot_int p_controller_id) { - ARVRServer *arvr_server = ARVRServer::get_singleton(); - ERR_FAIL_NULL_V(arvr_server, 0.0); +godot_real GDAPI godot_xr_get_controller_rumble(godot_int p_controller_id) { + XRServer *xr_server = XRServer::get_singleton(); + ERR_FAIL_NULL_V(xr_server, 0.0); - ARVRPositionalTracker *tracker = arvr_server->find_by_type_and_id(ARVRServer::TRACKER_CONTROLLER, p_controller_id); + XRPositionalTracker *tracker = xr_server->find_by_type_and_id(XRServer::TRACKER_CONTROLLER, p_controller_id); if (tracker != nullptr) { return tracker->get_rumble(); } diff --git a/modules/gdnative/arvr/arvr_interface_gdnative.h b/modules/gdnative/xr/xr_interface_gdnative.h index e38eb435c6..64f1282a7e 100644 --- a/modules/gdnative/arvr/arvr_interface_gdnative.h +++ b/modules/gdnative/xr/xr_interface_gdnative.h @@ -1,5 +1,5 @@ /*************************************************************************/ -/* arvr_interface_gdnative.h */ +/* xr_interface_gdnative.h */ /*************************************************************************/ /* This file is part of: */ /* GODOT ENGINE */ @@ -28,11 +28,11 @@ /* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ /*************************************************************************/ -#ifndef ARVR_INTERFACE_GDNATIVE_H -#define ARVR_INTERFACE_GDNATIVE_H +#ifndef XR_INTERFACE_GDNATIVE_H +#define XR_INTERFACE_GDNATIVE_H #include "modules/gdnative/gdnative.h" -#include "servers/arvr/arvr_interface.h" +#include "servers/xr/xr_interface.h" /** @authors Hinsbart & Karroffel & Mux213 @@ -40,23 +40,23 @@ This subclass of our AR/VR interface forms a bridge to GDNative. */ -class ARVRInterfaceGDNative : public ARVRInterface { - GDCLASS(ARVRInterfaceGDNative, ARVRInterface); +class XRInterfaceGDNative : public XRInterface { + GDCLASS(XRInterfaceGDNative, XRInterface); void cleanup(); protected: - const godot_arvr_interface_gdnative *interface; + const godot_xr_interface_gdnative *interface; void *data; static void _bind_methods(); public: /** general interface information **/ - ARVRInterfaceGDNative(); - ~ARVRInterfaceGDNative(); + XRInterfaceGDNative(); + ~XRInterfaceGDNative(); - void set_interface(const godot_arvr_interface_gdnative *p_interface); + void set_interface(const godot_xr_interface_gdnative *p_interface); virtual StringName get_name() const; virtual int get_capabilities() const; @@ -73,19 +73,19 @@ public: /** rendering and internal **/ virtual Size2 get_render_targetsize(); virtual bool is_stereo(); - virtual Transform get_transform_for_eye(ARVRInterface::Eyes p_eye, const Transform &p_cam_transform); + virtual Transform get_transform_for_eye(XRInterface::Eyes p_eye, const Transform &p_cam_transform); // we expose a Vector<float> version of this function to GDNative - Vector<float> _get_projection_for_eye(ARVRInterface::Eyes p_eye, real_t p_aspect, real_t p_z_near, real_t p_z_far); + Vector<float> _get_projection_for_eye(XRInterface::Eyes p_eye, real_t p_aspect, real_t p_z_near, real_t p_z_far); - // and a CameraMatrix version to ARVRServer - virtual CameraMatrix get_projection_for_eye(ARVRInterface::Eyes p_eye, real_t p_aspect, real_t p_z_near, real_t p_z_far); + // and a CameraMatrix version to XRServer + virtual CameraMatrix get_projection_for_eye(XRInterface::Eyes p_eye, real_t p_aspect, real_t p_z_near, real_t p_z_far); - virtual unsigned int get_external_texture_for_eye(ARVRInterface::Eyes p_eye); - virtual void commit_for_eye(ARVRInterface::Eyes p_eye, RID p_render_target, const Rect2 &p_screen_rect); + virtual unsigned int get_external_texture_for_eye(XRInterface::Eyes p_eye); + virtual void commit_for_eye(XRInterface::Eyes p_eye, RID p_render_target, const Rect2 &p_screen_rect); virtual void process(); virtual void notification(int p_what); }; -#endif // ARVR_INTERFACE_GDNATIVE_H +#endif // XR_INTERFACE_GDNATIVE_H diff --git a/modules/gdscript/config.py b/modules/gdscript/config.py index 185a10bcb2..6fc227e7f5 100644 --- a/modules/gdscript/config.py +++ b/modules/gdscript/config.py @@ -11,7 +11,6 @@ def get_doc_classes(): "@GDScript", "GDScript", "GDScriptFunctionState", - "GDScriptNativeClass", ] 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/doc_classes/GDScriptNativeClass.xml b/modules/gdscript/doc_classes/GDScriptNativeClass.xml deleted file mode 100644 index 0a8982de8e..0000000000 --- a/modules/gdscript/doc_classes/GDScriptNativeClass.xml +++ /dev/null @@ -1,19 +0,0 @@ -<?xml version="1.0" encoding="UTF-8" ?> -<class name="GDScriptNativeClass" inherits="Reference" version="4.0"> - <brief_description> - </brief_description> - <description> - </description> - <tutorials> - </tutorials> - <methods> - <method name="new"> - <return type="Variant"> - </return> - <description> - </description> - </method> - </methods> - <constants> - </constants> -</class> diff --git a/modules/gdscript/gdscript.cpp b/modules/gdscript/gdscript.cpp index d8332cf79a..0316581604 100644 --- a/modules/gdscript/gdscript.cpp +++ b/modules/gdscript/gdscript.cpp @@ -895,6 +895,24 @@ Ref<GDScript> GDScript::get_base() const { return base; } +bool GDScript::inherits_script(const Ref<Script> &p_script) const { + Ref<GDScript> gd = p_script; + if (gd.is_null()) { + return false; + } + + const GDScript *s = this; + + while (s) { + if (s == p_script.ptr()) { + return true; + } + s = s->_base; + } + + return false; +} + bool GDScript::has_script_signal(const StringName &p_signal) const { if (_signals.has(p_signal)) return true; @@ -2257,7 +2275,7 @@ Ref<GDScript> GDScriptLanguage::get_orphan_subclass(const String &p_qualified_na /*************** RESOURCE ***************/ -RES ResourceFormatLoaderGDScript::load(const String &p_path, const String &p_original_path, Error *r_error, bool p_use_sub_threads, float *r_progress) { +RES ResourceFormatLoaderGDScript::load(const String &p_path, const String &p_original_path, Error *r_error, bool p_use_sub_threads, float *r_progress, bool p_no_cache) { if (r_error) *r_error = ERR_FILE_CANT_OPEN; diff --git a/modules/gdscript/gdscript.h b/modules/gdscript/gdscript.h index 2c5876372b..5fdc25669f 100644 --- a/modules/gdscript/gdscript.h +++ b/modules/gdscript/gdscript.h @@ -151,6 +151,8 @@ protected: public: virtual bool is_valid() const { return valid; } + bool inherits_script(const Ref<Script> &p_script) const; + const Map<StringName, Ref<GDScript>> &get_subclasses() const { return subclasses; } const Map<StringName, Variant> &get_constants() const { return constants; } const Set<StringName> &get_members() const { return members; } @@ -545,7 +547,7 @@ public: class ResourceFormatLoaderGDScript : public ResourceFormatLoader { public: - virtual RES load(const String &p_path, const String &p_original_path = "", Error *r_error = nullptr, bool p_use_sub_threads = false, float *r_progress = nullptr); + virtual RES load(const String &p_path, const String &p_original_path = "", Error *r_error = nullptr, bool p_use_sub_threads = false, float *r_progress = nullptr, bool p_no_cache = false); virtual void get_recognized_extensions(List<String> *p_extensions) const; virtual bool handles_type(const String &p_type) const; virtual String get_resource_type(const String &p_path) const; diff --git a/modules/gdscript/gdscript_editor.cpp b/modules/gdscript/gdscript_editor.cpp index 1e3cbd661e..7ad0682637 100644 --- a/modules/gdscript/gdscript_editor.cpp +++ b/modules/gdscript/gdscript_editor.cpp @@ -2057,7 +2057,7 @@ static void _find_identifiers_in_base(const GDScriptCompletionContext &p_context List<PropertyInfo> pinfo; ClassDB::get_property_list(type, &pinfo); for (List<PropertyInfo>::Element *E = pinfo.front(); E; E = E->next()) { - if (E->get().usage & (PROPERTY_USAGE_GROUP | PROPERTY_USAGE_CATEGORY)) { + if (E->get().usage & (PROPERTY_USAGE_GROUP | PROPERTY_USAGE_SUBGROUP | PROPERTY_USAGE_CATEGORY)) { continue; } if (E->get().name.find("/") != -1) { @@ -2098,7 +2098,7 @@ static void _find_identifiers_in_base(const GDScriptCompletionContext &p_context if (!p_only_functions) { List<PropertyInfo> members; - p_base.value.get_property_list(&members); + tmp.get_property_list(&members); for (List<PropertyInfo>::Element *E = members.front(); E; E = E->next()) { if (String(E->get().name).find("/") == -1) { @@ -2150,7 +2150,7 @@ static void _find_identifiers(const GDScriptCompletionContext &p_context, bool p } const GDScriptParser::ClassNode *clss = p_context._class; - bool _static = !p_context.function || p_context.function->_static; + bool _static = p_context.function && p_context.function->_static; while (clss) { GDScriptCompletionContext c = p_context; @@ -2236,6 +2236,8 @@ static void _find_call_arguments(const GDScriptCompletionContext &p_context, con const String quote_style = EDITOR_DEF("text_editor/completion/use_single_quotes", false) ? "'" : "\""; +#define IS_METHOD_SIGNAL(m_method) (m_method == "connect" || m_method == "disconnect" || m_method == "is_connected" || m_method == "emit_signal") + while (base_type.has_type) { switch (base_type.kind) { case GDScriptParser::DataType::CLASS: { @@ -2252,7 +2254,7 @@ static void _find_call_arguments(const GDScriptCompletionContext &p_context, con } } - if ((p_method == "connect" || p_method == "emit_signal") && p_argidx == 0) { + if (IS_METHOD_SIGNAL(p_method) && p_argidx == 0) { for (int i = 0; i < base_type.class_type->_signals.size(); i++) { ScriptCodeCompletionOption option(base_type.class_type->_signals[i].name.operator String(), ScriptCodeCompletionOption::KIND_SIGNAL); option.insert_text = quote_style + option.display + quote_style; @@ -2265,7 +2267,7 @@ static void _find_call_arguments(const GDScriptCompletionContext &p_context, con case GDScriptParser::DataType::GDSCRIPT: { Ref<GDScript> gds = base_type.script_type; if (gds.is_valid()) { - if ((p_method == "connect" || p_method == "emit_signal") && p_argidx == 0) { + if (IS_METHOD_SIGNAL(p_method) && p_argidx == 0) { List<MethodInfo> signals; gds->get_script_signal_list(&signals); for (List<MethodInfo>::Element *E = signals.front(); E; E = E->next()) { @@ -2327,7 +2329,7 @@ static void _find_call_arguments(const GDScriptCompletionContext &p_context, con } } - if ((p_method == "connect" || p_method == "emit_signal") && p_argidx == 0) { + if (IS_METHOD_SIGNAL(p_method) && p_argidx == 0) { List<MethodInfo> signals; ClassDB::get_signal_list(class_name, &signals); for (List<MethodInfo>::Element *E = signals.front(); E; E = E->next()) { @@ -2336,6 +2338,7 @@ static void _find_call_arguments(const GDScriptCompletionContext &p_context, con r_result.insert(option.display, option); } } +#undef IS_METHOD_SIGNAL if (ClassDB::is_parent_class(class_name, "Node") && (p_method == "get_node" || p_method == "has_node") && p_argidx == 0) { // Get autoloads diff --git a/modules/gdscript/gdscript_function.cpp b/modules/gdscript/gdscript_function.cpp index ca4d6f6de9..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 { @@ -337,15 +336,10 @@ Variant GDScriptFunction::call(GDScriptInstance *p_instance, const Variant **p_a } if (!argument_types[i].is_type(*p_args[i], true)) { - if (argument_types[i].is_type(Variant(), true)) { - memnew_placement(&stack[i], Variant); - continue; - } else { - r_err.error = Callable::CallError::CALL_ERROR_INVALID_ARGUMENT; - r_err.argument = i; - r_err.expected = argument_types[i].kind == GDScriptDataType::BUILTIN ? argument_types[i].builtin_type : Variant::OBJECT; - return Variant(); - } + r_err.error = Callable::CallError::CALL_ERROR_INVALID_ARGUMENT; + r_err.argument = i; + r_err.expected = argument_types[i].kind == GDScriptDataType::BUILTIN ? argument_types[i].builtin_type : Variant::OBJECT; + return Variant(); } if (argument_types[i].kind == GDScriptDataType::BUILTIN) { Variant arg = Variant::construct(argument_types[i].builtin_type, &p_args[i], 1, r_err); @@ -1285,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; @@ -1838,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; @@ -1851,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..58161d6f53 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); diff --git a/modules/gdscript/gdscript_parser.cpp b/modules/gdscript/gdscript_parser.cpp index a99d4b96f7..a37fc579e7 100644 --- a/modules/gdscript/gdscript_parser.cpp +++ b/modules/gdscript/gdscript_parser.cpp @@ -746,6 +746,13 @@ GDScriptParser::Node *GDScriptParser::_parse_expression(Node *p_parent, bool p_s if (tokenizer->get_token() == GDScriptTokenizer::TK_CURSOR) { _make_completable_call(0); completion_node = op; + + if (op->arguments[0]->type == GDScriptParser::Node::Type::TYPE_BUILT_IN_FUNCTION) { + BuiltInFunctionNode *bn = static_cast<BuiltInFunctionNode *>(op->arguments[0]); + if (bn->function == GDScriptFunctions::Function::RESOURCE_LOAD) { + completion_type = COMPLETION_RESOURCE_PATH; + } + } } if (!replaced) { if (!_parse_arguments(op, op->arguments, p_static, true, p_parsing_constant)) @@ -827,6 +834,7 @@ GDScriptParser::Node *GDScriptParser::_parse_expression(Node *p_parent, bool p_s //check from singletons ConstantNode *constant = alloc_node<ConstantNode>(); constant->value = GDScriptLanguage::get_singleton()->get_named_globals_map()[identifier]; + constant->datatype = _type_from_variant(constant->value); expr = constant; bfn = true; } @@ -837,6 +845,7 @@ GDScriptParser::Node *GDScriptParser::_parse_expression(Node *p_parent, bool p_s if (scr.is_valid() && scr->is_valid()) { ConstantNode *constant = alloc_node<ConstantNode>(); constant->value = scr; + constant->datatype = _type_from_variant(constant->value); expr = constant; bfn = true; } @@ -852,6 +861,7 @@ GDScriptParser::Node *GDScriptParser::_parse_expression(Node *p_parent, bool p_s if (parent_constants.has(identifier)) { ConstantNode *constant = alloc_node<ConstantNode>(); constant->value = parent_constants[identifier]; + constant->datatype = _type_from_variant(constant->value); expr = constant; bfn = true; } @@ -2022,6 +2032,38 @@ GDScriptParser::Node *GDScriptParser::_parse_and_reduce_expression(Node *p_paren return expr; } +bool GDScriptParser::_reduce_export_var_type(Variant &p_value, int p_line) { + + if (p_value.get_type() == Variant::ARRAY) { + Array arr = p_value; + for (int i = 0; i < arr.size(); i++) { + if (!_reduce_export_var_type(arr[i], p_line)) return false; + } + return true; + } + + if (p_value.get_type() == Variant::DICTIONARY) { + Dictionary dict = p_value; + for (int i = 0; i < dict.size(); i++) { + Variant value = dict.get_value_at_index(i); + if (!_reduce_export_var_type(value, p_line)) return false; + } + return true; + } + + // validate type + DataType type = _type_from_variant(p_value); + if (type.kind == DataType::BUILTIN) { + return true; + } else if (type.kind == DataType::NATIVE) { + if (ClassDB::is_parent_class(type.native_type, "Resource")) { + return true; + } + } + _set_error("Invalid export type. Only built-in and native resource types can be exported.", p_line); + return false; +} + bool GDScriptParser::_recover_from_completion() { if (!completion_found) { @@ -2386,6 +2428,7 @@ void GDScriptParser::_generate_pattern(PatternNode *p_pattern, Node *p_node_to_m // a bind always matches ConstantNode *true_value = alloc_node<ConstantNode>(); true_value->value = Variant(true); + true_value->datatype = _type_from_variant(true_value->value); p_resulting_node = true_value; } break; case PatternNode::PT_ARRAY: { @@ -2432,6 +2475,7 @@ void GDScriptParser::_generate_pattern(PatternNode *p_pattern, Node *p_node_to_m // size ConstantNode *length = alloc_node<ConstantNode>(); length->value = Variant(open_ended ? p_pattern->array.size() - 1 : p_pattern->array.size()); + length->datatype = _type_from_variant(length->value); OperatorNode *call = alloc_node<OperatorNode>(); call->op = OperatorNode::OP_CALL; @@ -2465,6 +2509,7 @@ void GDScriptParser::_generate_pattern(PatternNode *p_pattern, Node *p_node_to_m ConstantNode *index = alloc_node<ConstantNode>(); index->value = Variant(i); + index->datatype = _type_from_variant(index->value); OperatorNode *indexed_value = alloc_node<OperatorNode>(); indexed_value->op = OperatorNode::OP_INDEX; @@ -2525,6 +2570,7 @@ void GDScriptParser::_generate_pattern(PatternNode *p_pattern, Node *p_node_to_m // size ConstantNode *length = alloc_node<ConstantNode>(); length->value = Variant(open_ended ? p_pattern->dictionary.size() - 1 : p_pattern->dictionary.size()); + length->datatype = _type_from_variant(length->value); OperatorNode *call = alloc_node<OperatorNode>(); call->op = OperatorNode::OP_CALL; @@ -2601,6 +2647,7 @@ void GDScriptParser::_generate_pattern(PatternNode *p_pattern, Node *p_node_to_m // simply generate a `true` ConstantNode *true_value = alloc_node<ConstantNode>(); true_value->value = Variant(true); + true_value->datatype = _type_from_variant(true_value->value); p_resulting_node = true_value; } break; default: { @@ -2683,6 +2730,7 @@ void GDScriptParser::_transform_match_statment(MatchNode *p_match_statement) { LocalVarNode *local_var = branch->body->variables[e->key()]; local_var->assign = e->value(); local_var->set_datatype(local_var->assign->get_datatype()); + local_var->assignments++; IdentifierNode *id2 = alloc_node<IdentifierNode>(); id2->name = local_var->name; @@ -2785,6 +2833,7 @@ void GDScriptParser::_parse_block(BlockNode *p_block, bool p_static) { return; } + _mark_line_as_safe(line); NewLineNode *nl2 = alloc_node<NewLineNode>(); nl2->line = line; p_block->statements.push_back(nl2); @@ -3298,6 +3347,8 @@ void GDScriptParser::_parse_block(BlockNode *p_block, bool p_static) { return; } + int assert_line = tokenizer->get_token_line(); + tokenizer->advance(); Vector<Node *> args; @@ -3307,25 +3358,27 @@ 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; } AssertNode *an = alloc_node<AssertNode>(); an->condition = _reduce_expression(args[0], p_static); + an->line = assert_line; if (args.size() == 2) { an->message = _reduce_expression(args[1], p_static); } else { ConstantNode *message_node = alloc_node<ConstantNode>(); message_node->value = String(); + message_node->datatype = _type_from_variant(message_node->value); an->message = message_node; } 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; @@ -3673,6 +3726,12 @@ void GDScriptParser::_parse_class(ClassNode *p_class) { _set_error("A constant named \"" + String(name) + "\" already exists in the outer class scope (at line" + itos(outer_class->constant_expressions[name].expression->line) + ")."); return; } + for (int i = 0; i < outer_class->variables.size(); i++) { + if (outer_class->variables[i].identifier == name) { + _set_error("A variable named \"" + String(name) + "\" already exists in the outer class scope (at line " + itos(outer_class->variables[i].line) + ")."); + return; + } + } outer_class = outer_class->owner; } @@ -4863,6 +4922,9 @@ void GDScriptParser::_parse_class(ClassNode *p_class) { _set_error("Can't accept a null constant expression for inferring export type."); return; } + + if (!_reduce_export_var_type(cn->value, member.line)) return; + member._export.type = cn->value.get_type(); member._export.usage |= PROPERTY_USAGE_SCRIPT_VARIABLE; if (cn->value.get_type() == Variant::OBJECT) { @@ -6229,11 +6291,13 @@ GDScriptParser::Node *GDScriptParser::_get_default_value_for_type(const DataType ConstantNode *c = alloc_node<ConstantNode>(); Callable::CallError err; c->value = Variant::construct(p_type.builtin_type, nullptr, 0, err); + c->datatype = _type_from_variant(c->value); result = c; } } else { ConstantNode *c = alloc_node<ConstantNode>(); c->value = Variant(); + c->datatype = _type_from_variant(c->value); result = c; } @@ -6562,6 +6626,7 @@ GDScriptParser::DataType GDScriptParser::_reduce_node_type(Node *p_node) { node_type = _reduce_identifier_type(&base_type, member_id->name, op->line, true); #ifdef DEBUG_ENABLED if (!node_type.has_type) { + _mark_line_as_unsafe(op->line); _add_warning(GDScriptWarning::UNSAFE_PROPERTY_ACCESS, op->line, member_id->name.operator String(), base_type.to_string()); } #endif // DEBUG_ENABLED @@ -7364,6 +7429,8 @@ bool GDScriptParser::_get_member_type(const DataType &p_base_type, const StringN } } +#define IS_USAGE_MEMBER(m_usage) (!(m_usage & (PROPERTY_USAGE_GROUP | PROPERTY_USAGE_SUBGROUP | PROPERTY_USAGE_CATEGORY))) + // Check other script types while (scr.is_valid()) { Map<StringName, Variant> constants; @@ -7376,7 +7443,7 @@ bool GDScriptParser::_get_member_type(const DataType &p_base_type, const StringN List<PropertyInfo> properties; scr->get_script_property_list(&properties); for (List<PropertyInfo>::Element *E = properties.front(); E; E = E->next()) { - if (E->get().name == p_member) { + if (E->get().name == p_member && IS_USAGE_MEMBER(E->get().usage)) { r_member_type = _type_from_property(E->get()); return true; } @@ -7418,7 +7485,7 @@ bool GDScriptParser::_get_member_type(const DataType &p_base_type, const StringN List<PropertyInfo> properties; ClassDB::get_property_list(native, &properties); for (List<PropertyInfo>::Element *E = properties.front(); E; E = E->next()) { - if (E->get().name == p_member) { + if (E->get().name == p_member && IS_USAGE_MEMBER(E->get().usage)) { // Check if a getter exists StringName getter_name = ClassDB::get_property_getter(native, p_member); if (getter_name != StringName()) { @@ -7458,7 +7525,7 @@ bool GDScriptParser::_get_member_type(const DataType &p_base_type, const StringN List<PropertyInfo> properties; ClassDB::get_property_list(native, &properties); for (List<PropertyInfo>::Element *E = properties.front(); E; E = E->next()) { - if (E->get().name == p_member) { + if (E->get().name == p_member && IS_USAGE_MEMBER(E->get().usage)) { // Check if a getter exists StringName getter_name = ClassDB::get_property_getter(native, p_member); if (getter_name != StringName()) { @@ -7480,6 +7547,7 @@ bool GDScriptParser::_get_member_type(const DataType &p_base_type, const StringN } } } +#undef IS_USAGE_MEMBER return false; } @@ -8060,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); @@ -8107,6 +8180,7 @@ void GDScriptParser::_check_block_types(BlockNode *p_block) { ConstantNode *tgt_type = alloc_node<ConstantNode>(); tgt_type->line = lv->line; tgt_type->value = (int)lv->datatype.builtin_type; + tgt_type->datatype = _type_from_variant(tgt_type->value); OperatorNode *convert_call = alloc_node<OperatorNode>(); convert_call->line = lv->line; @@ -8242,6 +8316,7 @@ void GDScriptParser::_check_block_types(BlockNode *p_block) { ConstantNode *tgt_type = alloc_node<ConstantNode>(); tgt_type->line = op->line; tgt_type->value = (int)lh_type.builtin_type; + tgt_type->datatype = _type_from_variant(tgt_type->value); OperatorNode *convert_call = alloc_node<OperatorNode>(); convert_call->line = op->line; diff --git a/modules/gdscript/gdscript_parser.h b/modules/gdscript/gdscript_parser.h index eca5f83f7a..f254352423 100644 --- a/modules/gdscript/gdscript_parser.h +++ b/modules/gdscript/gdscript_parser.h @@ -613,6 +613,7 @@ private: Node *_parse_expression(Node *p_parent, bool p_static, bool p_allow_assign = false, bool p_parsing_constant = false); Node *_reduce_expression(Node *p_node, bool p_to_const = false); Node *_parse_and_reduce_expression(Node *p_parent, bool p_static, bool p_reduce_const = false, bool p_allow_assign = false); + bool _reduce_export_var_type(Variant &p_value, int p_line = 0); PatternNode *_parse_pattern(bool p_static); void _parse_pattern_block(BlockNode *p_block, Vector<PatternBranchNode *> &p_branches, bool p_static); diff --git a/modules/gdscript/gdscript_tokenizer.h b/modules/gdscript/gdscript_tokenizer.h index 1b432ae8c1..180ec3c77e 100644 --- a/modules/gdscript/gdscript_tokenizer.h +++ b/modules/gdscript/gdscript_tokenizer.h @@ -32,6 +32,7 @@ #define GDSCRIPT_TOKENIZER_H #include "core/pair.h" +#include "core/set.h" #include "core/string_name.h" #include "core/ustring.h" #include "core/variant.h" diff --git a/modules/gridmap/grid_map_editor_plugin.cpp b/modules/gridmap/grid_map_editor_plugin.cpp index eb8feb5bc7..9c3101945a 100644 --- a/modules/gridmap/grid_map_editor_plugin.cpp +++ b/modules/gridmap/grid_map_editor_plugin.cpp @@ -29,7 +29,7 @@ /*************************************************************************/ #include "grid_map_editor_plugin.h" -#include "core/input/input_filter.h" +#include "core/input/input.h" #include "editor/editor_scale.h" #include "editor/editor_settings.h" #include "editor/plugins/node_3d_editor_plugin.h" diff --git a/modules/mobile_vr/doc_classes/MobileVRInterface.xml b/modules/mobile_vr/doc_classes/MobileVRInterface.xml index 7552abe61d..120535bd41 100644 --- a/modules/mobile_vr/doc_classes/MobileVRInterface.xml +++ b/modules/mobile_vr/doc_classes/MobileVRInterface.xml @@ -1,5 +1,5 @@ <?xml version="1.0" encoding="UTF-8" ?> -<class name="MobileVRInterface" inherits="ARVRInterface" version="4.0"> +<class name="MobileVRInterface" inherits="XRInterface" version="4.0"> <brief_description> Generic mobile VR implementation. </brief_description> @@ -8,9 +8,9 @@ Note that even though there is no positional tracking, the camera will assume the headset is at a height of 1.85 meters. You can change this by setting [member eye_height]. You can initialise this interface as follows: [codeblock] - var interface = ARVRServer.find_interface("Native mobile") + var interface = XRServer.find_interface("Native mobile") if interface and interface.initialize(): - get_viewport().arvr = true + get_viewport().xr = true [/codeblock] </description> <tutorials> @@ -25,7 +25,7 @@ The width of the display in centimeters. </member> <member name="eye_height" type="float" setter="set_eye_height" getter="get_eye_height" default="1.85"> - The height at which the camera is placed in relation to the ground (i.e. [ARVROrigin] node). + The height at which the camera is placed in relation to the ground (i.e. [XROrigin3D] node). </member> <member name="iod" type="float" setter="set_iod" getter="get_iod" default="6.0"> The interocular distance, also known as the interpupillary distance. The distance between the pupils of the left and right eye. diff --git a/modules/mobile_vr/mobile_vr_interface.cpp b/modules/mobile_vr/mobile_vr_interface.cpp index 6b5a70435d..48276c0d3d 100644 --- a/modules/mobile_vr/mobile_vr_interface.cpp +++ b/modules/mobile_vr/mobile_vr_interface.cpp @@ -29,7 +29,8 @@ /*************************************************************************/ #include "mobile_vr_interface.h" -#include "core/input/input_filter.h" + +#include "core/input/input.h" #include "core/os/os.h" #include "servers/display_server.h" #include "servers/rendering/rendering_server_globals.h" @@ -39,7 +40,7 @@ StringName MobileVRInterface::get_name() const { }; int MobileVRInterface::get_capabilities() const { - return ARVRInterface::ARVR_STEREO; + return XRInterface::XR_STEREO; }; Vector3 MobileVRInterface::scale_magneto(const Vector3 &p_magnetometer) { @@ -118,7 +119,7 @@ void MobileVRInterface::set_position_from_sensors() { float delta_time = (double)ticks_elapsed / 1000000.0; // few things we need - InputFilter *input = InputFilter::get_singleton(); + Input *input = Input::get_singleton(); Vector3 down(0.0, -1.0, 0.0); // Down is Y negative Vector3 north(0.0, 0.0, 1.0); // North is Z positive @@ -165,7 +166,7 @@ void MobileVRInterface::set_position_from_sensors() { rotate.rotate(orientation.get_axis(2), gyro.z * delta_time); orientation = rotate * orientation; - tracking_state = ARVRInterface::ARVR_NORMAL_TRACKING; + tracking_state = XRInterface::XR_NORMAL_TRACKING; }; ///@TODO improve this, the magnetometer is very fidgity sometimes flipping the axis for no apparent reason (probably a bug on my part) @@ -177,7 +178,7 @@ void MobileVRInterface::set_position_from_sensors() { transform_quat = transform_quat.slerp(acc_mag_quat, 0.1); orientation = Basis(transform_quat); - tracking_state = ARVRInterface::ARVR_NORMAL_TRACKING; + tracking_state = XRInterface::XR_NORMAL_TRACKING; } else if (has_grav) { // use gravity vector to make sure down is down... // transform gravity into our world space @@ -297,8 +298,8 @@ bool MobileVRInterface::is_initialized() const { }; bool MobileVRInterface::initialize() { - ARVRServer *arvr_server = ARVRServer::get_singleton(); - ERR_FAIL_NULL_V(arvr_server, false); + XRServer *xr_server = XRServer::get_singleton(); + ERR_FAIL_NULL_V(xr_server, false); if (!initialized) { // reset our sensor data and orientation @@ -314,7 +315,7 @@ bool MobileVRInterface::initialize() { orientation = Basis(); // make this our primary interface - arvr_server->set_primary_interface(this); + xr_server->set_primary_interface(this); last_ticks = OS::get_singleton()->get_ticks_usec(); @@ -326,10 +327,10 @@ bool MobileVRInterface::initialize() { void MobileVRInterface::uninitialize() { if (initialized) { - ARVRServer *arvr_server = ARVRServer::get_singleton(); - if (arvr_server != nullptr) { + XRServer *xr_server = XRServer::get_singleton(); + if (xr_server != nullptr) { // no longer our primary interface - arvr_server->clear_primary_interface_if(this); + xr_server->clear_primary_interface_if(this); } initialized = false; @@ -348,22 +349,22 @@ Size2 MobileVRInterface::get_render_targetsize() { return target_size; }; -Transform MobileVRInterface::get_transform_for_eye(ARVRInterface::Eyes p_eye, const Transform &p_cam_transform) { +Transform MobileVRInterface::get_transform_for_eye(XRInterface::Eyes p_eye, const Transform &p_cam_transform) { _THREAD_SAFE_METHOD_ Transform transform_for_eye; - ARVRServer *arvr_server = ARVRServer::get_singleton(); - ERR_FAIL_NULL_V(arvr_server, transform_for_eye); + XRServer *xr_server = XRServer::get_singleton(); + ERR_FAIL_NULL_V(xr_server, transform_for_eye); if (initialized) { - float world_scale = arvr_server->get_world_scale(); + float world_scale = xr_server->get_world_scale(); // we don't need to check for the existence of our HMD, doesn't effect our values... // note * 0.01 to convert cm to m and * 0.5 as we're moving half in each direction... - if (p_eye == ARVRInterface::EYE_LEFT) { + if (p_eye == XRInterface::EYE_LEFT) { transform_for_eye.origin.x = -(intraocular_dist * 0.01 * 0.5 * world_scale); - } else if (p_eye == ARVRInterface::EYE_RIGHT) { + } else if (p_eye == XRInterface::EYE_RIGHT) { transform_for_eye.origin.x = intraocular_dist * 0.01 * 0.5 * world_scale; } else { // for mono we don't reposition, we want our center position. @@ -374,7 +375,7 @@ Transform MobileVRInterface::get_transform_for_eye(ARVRInterface::Eyes p_eye, co hmd_transform.basis = orientation; hmd_transform.origin = Vector3(0.0, eye_height * world_scale, 0.0); - transform_for_eye = p_cam_transform * (arvr_server->get_reference_frame()) * hmd_transform * transform_for_eye; + transform_for_eye = p_cam_transform * (xr_server->get_reference_frame()) * hmd_transform * transform_for_eye; } else { // huh? well just return what we got.... transform_for_eye = p_cam_transform; @@ -383,12 +384,12 @@ Transform MobileVRInterface::get_transform_for_eye(ARVRInterface::Eyes p_eye, co return transform_for_eye; }; -CameraMatrix MobileVRInterface::get_projection_for_eye(ARVRInterface::Eyes p_eye, real_t p_aspect, real_t p_z_near, real_t p_z_far) { +CameraMatrix MobileVRInterface::get_projection_for_eye(XRInterface::Eyes p_eye, real_t p_aspect, real_t p_z_near, real_t p_z_far) { _THREAD_SAFE_METHOD_ CameraMatrix eye; - if (p_eye == ARVRInterface::EYE_MONO) { + if (p_eye == XRInterface::EYE_MONO) { ///@TODO for now hardcode some of this, what is really needed here is that this needs to be in sync with the real cameras properties // which probably means implementing a specific class for iOS and Android. For now this is purely here as an example. // Note also that if you use a normal viewport with AR/VR turned off you can still use the tracker output of this interface @@ -396,13 +397,13 @@ CameraMatrix MobileVRInterface::get_projection_for_eye(ARVRInterface::Eyes p_eye // This will make more sense when we implement ARkit on iOS (probably a separate interface). eye.set_perspective(60.0, p_aspect, p_z_near, p_z_far, false); } else { - eye.set_for_hmd(p_eye == ARVRInterface::EYE_LEFT ? 1 : 2, p_aspect, intraocular_dist, display_width, display_to_lens, oversample, p_z_near, p_z_far); + eye.set_for_hmd(p_eye == XRInterface::EYE_LEFT ? 1 : 2, p_aspect, intraocular_dist, display_width, display_to_lens, oversample, p_z_near, p_z_far); }; return eye; }; -void MobileVRInterface::commit_for_eye(ARVRInterface::Eyes p_eye, RID p_render_target, const Rect2 &p_screen_rect) { +void MobileVRInterface::commit_for_eye(XRInterface::Eyes p_eye, RID p_render_target, const Rect2 &p_screen_rect) { _THREAD_SAFE_METHOD_ // We must have a valid render target @@ -417,9 +418,9 @@ void MobileVRInterface::commit_for_eye(ARVRInterface::Eyes p_eye, RID p_render_t // we output half a screen dest.size.x *= 0.5; - if (p_eye == ARVRInterface::EYE_LEFT) { + if (p_eye == XRInterface::EYE_LEFT) { eye_center.x = ((-intraocular_dist / 2.0) + (display_width / 4.0)) / (display_width / 2.0); - } else if (p_eye == ARVRInterface::EYE_RIGHT) { + } else if (p_eye == XRInterface::EYE_RIGHT) { dest.position.x = dest.size.x; eye_center.x = ((intraocular_dist / 2.0) - (display_width / 4.0)) / (display_width / 2.0); } diff --git a/modules/mobile_vr/mobile_vr_interface.h b/modules/mobile_vr/mobile_vr_interface.h index c762c9b799..3a9ed1314a 100644 --- a/modules/mobile_vr/mobile_vr_interface.h +++ b/modules/mobile_vr/mobile_vr_interface.h @@ -31,8 +31,8 @@ #ifndef MOBILE_VR_INTERFACE_H #define MOBILE_VR_INTERFACE_H -#include "servers/arvr/arvr_interface.h" -#include "servers/arvr/arvr_positional_tracker.h" +#include "servers/xr/xr_interface.h" +#include "servers/xr/xr_positional_tracker.h" /** @author Bastiaan Olij <mux213@gmail.com> @@ -47,8 +47,8 @@ more advanced interfaces. */ -class MobileVRInterface : public ARVRInterface { - GDCLASS(MobileVRInterface, ARVRInterface); +class MobileVRInterface : public XRInterface { + GDCLASS(MobileVRInterface, XRInterface); private: bool initialized; @@ -137,9 +137,9 @@ public: virtual Size2 get_render_targetsize(); virtual bool is_stereo(); - virtual Transform get_transform_for_eye(ARVRInterface::Eyes p_eye, const Transform &p_cam_transform); - virtual CameraMatrix get_projection_for_eye(ARVRInterface::Eyes p_eye, real_t p_aspect, real_t p_z_near, real_t p_z_far); - virtual void commit_for_eye(ARVRInterface::Eyes p_eye, RID p_render_target, const Rect2 &p_screen_rect); + virtual Transform get_transform_for_eye(XRInterface::Eyes p_eye, const Transform &p_cam_transform); + virtual CameraMatrix get_projection_for_eye(XRInterface::Eyes p_eye, real_t p_aspect, real_t p_z_near, real_t p_z_far); + virtual void commit_for_eye(XRInterface::Eyes p_eye, RID p_render_target, const Rect2 &p_screen_rect); virtual void process(); virtual void notification(int p_what); diff --git a/modules/mobile_vr/register_types.cpp b/modules/mobile_vr/register_types.cpp index faf6c3b151..75638d47c4 100644 --- a/modules/mobile_vr/register_types.cpp +++ b/modules/mobile_vr/register_types.cpp @@ -37,7 +37,7 @@ void register_mobile_vr_types() { Ref<MobileVRInterface> mobile_vr; mobile_vr.instance(); - ARVRServer::get_singleton()->add_interface(mobile_vr); + XRServer::get_singleton()->add_interface(mobile_vr); } void unregister_mobile_vr_types() { diff --git a/modules/mono/csharp_script.cpp b/modules/mono/csharp_script.cpp index 0b5d3c8dbc..f5911275c9 100644 --- a/modules/mono/csharp_script.cpp +++ b/modules/mono/csharp_script.cpp @@ -3536,6 +3536,18 @@ void CSharpScript::get_script_signal_list(List<MethodInfo> *r_signals) const { } } +bool CSharpScript::inherits_script(const Ref<Script> &p_script) const { + Ref<CSharpScript> cs = p_script; + if (cs.is_null()) { + return false; + } + +#ifndef _MSC_VER +#warning TODO: Implement CSharpScript::inherits_script and other relevant changes after GH-38063. +#endif + return false; +} + Ref<Script> CSharpScript::get_base_script() const { // TODO search in metadata file once we have it, not important any way? @@ -3673,7 +3685,7 @@ CSharpScript::~CSharpScript() { /*************** RESOURCE ***************/ -RES ResourceFormatLoaderCSharpScript::load(const String &p_path, const String &p_original_path, Error *r_error, bool p_use_sub_threads, float *r_progress) { +RES ResourceFormatLoaderCSharpScript::load(const String &p_path, const String &p_original_path, Error *r_error, bool p_use_sub_threads, float *r_progress, bool p_no_cache) { if (r_error) *r_error = ERR_FILE_CANT_OPEN; diff --git a/modules/mono/csharp_script.h b/modules/mono/csharp_script.h index 29c33b50bb..05e2857538 100644 --- a/modules/mono/csharp_script.h +++ b/modules/mono/csharp_script.h @@ -194,6 +194,8 @@ public: virtual bool is_tool() const { return tool; } virtual bool is_valid() const { return valid; } + bool inherits_script(const Ref<Script> &p_script) const; + virtual Ref<Script> get_base_script() const; virtual ScriptLanguage *get_language() const; @@ -530,7 +532,7 @@ public: class ResourceFormatLoaderCSharpScript : public ResourceFormatLoader { public: - virtual RES load(const String &p_path, const String &p_original_path = "", Error *r_error = nullptr, bool p_use_sub_threads = false, float *r_progress = nullptr); + virtual RES load(const String &p_path, const String &p_original_path = "", Error *r_error = nullptr, bool p_use_sub_threads = false, float *r_progress = nullptr, bool p_no_cache = false); virtual void get_recognized_extensions(List<String> *p_extensions) const; virtual bool handles_type(const String &p_type) const; virtual String get_resource_type(const String &p_path) const; diff --git a/modules/mono/editor/GodotTools/GodotTools.Core/FileUtils.cs b/modules/mono/editor/GodotTools/GodotTools.Core/FileUtils.cs new file mode 100644 index 0000000000..85760a3705 --- /dev/null +++ b/modules/mono/editor/GodotTools/GodotTools.Core/FileUtils.cs @@ -0,0 +1,27 @@ +using System.IO; + +namespace GodotTools.Core +{ + public static class FileUtils + { + public static void SaveBackupCopy(string filePath) + { + string backupPathBase = filePath + ".old"; + string backupPath = backupPathBase; + + const int maxAttempts = 5; + int attempt = 1; + + while (File.Exists(backupPath) && attempt <= maxAttempts) + { + backupPath = backupPathBase + "." + (attempt); + attempt++; + } + + if (attempt > maxAttempts + 1) + return; + + File.Copy(filePath, backupPath, overwrite: true); + } + } +} diff --git a/modules/mono/editor/GodotTools/GodotTools.Core/GodotTools.Core.csproj b/modules/mono/editor/GodotTools/GodotTools.Core/GodotTools.Core.csproj index 2c35ef540a..c9ea7d3a2c 100644 --- a/modules/mono/editor/GodotTools/GodotTools.Core/GodotTools.Core.csproj +++ b/modules/mono/editor/GodotTools/GodotTools.Core/GodotTools.Core.csproj @@ -31,6 +31,7 @@ <Reference Include="System" /> </ItemGroup> <ItemGroup> + <Compile Include="FileUtils.cs" /> <Compile Include="ProcessExtensions.cs" /> <Compile Include="Properties\AssemblyInfo.cs" /> <Compile Include="StringExtensions.cs" /> diff --git a/modules/mono/editor/GodotTools/GodotTools.ProjectEditor/DotNetSolution.cs b/modules/mono/editor/GodotTools/GodotTools.ProjectEditor/DotNetSolution.cs index 9afd9adeb1..6f318aab4a 100644 --- a/modules/mono/editor/GodotTools/GodotTools.ProjectEditor/DotNetSolution.cs +++ b/modules/mono/editor/GodotTools/GodotTools.ProjectEditor/DotNetSolution.cs @@ -153,7 +153,12 @@ EndProject"; var result = regex.Replace(input,m => dict[m.Value]); if (result != input) + { + // Save a copy of the solution before replacing it + FileUtils.SaveBackupCopy(slnPath); + File.WriteAllText(slnPath, result); + } } } } diff --git a/modules/mono/editor/GodotTools/GodotTools.ProjectEditor/ProjectUtils.cs b/modules/mono/editor/GodotTools/GodotTools.ProjectEditor/ProjectUtils.cs index 1776b46e6a..f2ebef1a7d 100644 --- a/modules/mono/editor/GodotTools/GodotTools.ProjectEditor/ProjectUtils.cs +++ b/modules/mono/editor/GodotTools/GodotTools.ProjectEditor/ProjectUtils.cs @@ -9,8 +9,28 @@ using Microsoft.Build.Construction; namespace GodotTools.ProjectEditor { + public sealed class MSBuildProject + { + public ProjectRootElement Root { get; } + + public bool HasUnsavedChanges { get; set; } + + public void Save() => Root.Save(); + + public MSBuildProject(ProjectRootElement root) + { + Root = root; + } + } + public static class ProjectUtils { + public static MSBuildProject Open(string path) + { + var root = ProjectRootElement.Open(path); + return root != null ? new MSBuildProject(root) : null; + } + public static void AddItemToProjectChecked(string projectPath, string itemType, string include) { var dir = Directory.GetParent(projectPath).FullName; @@ -43,7 +63,6 @@ namespace GodotTools.ProjectEditor public static void RemoveItemFromProjectChecked(string projectPath, string itemType, string include) { - var dir = Directory.GetParent(projectPath).FullName; var root = ProjectRootElement.Open(projectPath); Debug.Assert(root != null); @@ -150,12 +169,9 @@ namespace GodotTools.ProjectEditor } /// Simple function to make sure the Api assembly references are configured correctly - public static void FixApiHintPath(string projectPath) + public static void FixApiHintPath(MSBuildProject project) { - var root = ProjectRootElement.Open(projectPath); - Debug.Assert(root != null); - - bool dirty = false; + var root = project.Root; void AddPropertyIfNotPresent(string name, string condition, string value) { @@ -170,7 +186,7 @@ namespace GodotTools.ProjectEditor } root.AddProperty(name, value).Condition = " " + condition + " "; - dirty = true; + project.HasUnsavedChanges = true; } AddPropertyIfNotPresent(name: "ApiConfiguration", @@ -212,7 +228,7 @@ namespace GodotTools.ProjectEditor } referenceWithHintPath.AddMetadata("HintPath", hintPath); - dirty = true; + project.HasUnsavedChanges = true; return; } @@ -221,14 +237,14 @@ namespace GodotTools.ProjectEditor { // Found a Reference item without a HintPath referenceWithoutHintPath.AddMetadata("HintPath", hintPath); - dirty = true; + project.HasUnsavedChanges = true; return; } } // Found no Reference item at all. Add it. root.AddItem("Reference", referenceName).Condition = " " + condition + " "; - dirty = true; + project.HasUnsavedChanges = true; } const string coreProjectName = "GodotSharp"; @@ -242,17 +258,11 @@ namespace GodotTools.ProjectEditor SetReferenceHintPath(coreProjectName, coreCondition, coreHintPath); SetReferenceHintPath(editorProjectName, editorCondition, editorHintPath); - - if (dirty) - root.Save(); } - public static void MigrateFromOldConfigNames(string projectPath) + public static void MigrateFromOldConfigNames(MSBuildProject project) { - var root = ProjectRootElement.Open(projectPath); - Debug.Assert(root != null); - - bool dirty = false; + var root = project.Root; bool hasGodotProjectGeneratorVersion = false; bool foundOldConfiguration = false; @@ -267,7 +277,7 @@ namespace GodotTools.ProjectEditor { configItem.Value = "Debug"; foundOldConfiguration = true; - dirty = true; + project.HasUnsavedChanges = true; } } @@ -275,7 +285,7 @@ namespace GodotTools.ProjectEditor { root.PropertyGroups.First(g => g.Condition == string.Empty)? .AddProperty("GodotProjectGeneratorVersion", Assembly.GetExecutingAssembly().GetName().Version.ToString()); - dirty = true; + project.HasUnsavedChanges = true; } if (!foundOldConfiguration) @@ -301,7 +311,7 @@ namespace GodotTools.ProjectEditor foreach (var propertyGroup in root.PropertyGroups.Where(g => g.Condition.Trim() == oldCondition)) { propertyGroup.Condition = " " + newCondition + " "; - dirty = true; + project.HasUnsavedChanges = true; } foreach (var propertyGroup in root.PropertyGroups) @@ -309,14 +319,14 @@ namespace GodotTools.ProjectEditor foreach (var prop in propertyGroup.Properties.Where(p => p.Condition.Trim() == oldCondition)) { prop.Condition = " " + newCondition + " "; - dirty = true; + project.HasUnsavedChanges = true; } } foreach (var itemGroup in root.ItemGroups.Where(g => g.Condition.Trim() == oldCondition)) { itemGroup.Condition = " " + newCondition + " "; - dirty = true; + project.HasUnsavedChanges = true; } foreach (var itemGroup in root.ItemGroups) @@ -324,7 +334,7 @@ namespace GodotTools.ProjectEditor foreach (var item in itemGroup.Items.Where(item => item.Condition.Trim() == oldCondition)) { item.Condition = " " + newCondition + " "; - dirty = true; + project.HasUnsavedChanges = true; } } } @@ -340,10 +350,6 @@ namespace GodotTools.ProjectEditor MigrateConfigurationConditions("Release", "ExportRelease"); MigrateConfigurationConditions("Tools", "Debug"); // Must be last } - - - if (dirty) - root.Save(); } } } diff --git a/modules/mono/editor/GodotTools/GodotTools/Export/ExportPlugin.cs b/modules/mono/editor/GodotTools/GodotTools/Export/ExportPlugin.cs index d782d4e61b..2ceb4888a2 100644 --- a/modules/mono/editor/GodotTools/GodotTools/Export/ExportPlugin.cs +++ b/modules/mono/editor/GodotTools/GodotTools/Export/ExportPlugin.cs @@ -168,13 +168,13 @@ namespace GodotTools.Export // Add dependency assemblies - var dependencies = new Godot.Collections.Dictionary<string, string>(); + var assemblies = new Godot.Collections.Dictionary<string, string>(); string projectDllName = GodotSharpEditor.ProjectAssemblyName; string projectDllSrcDir = Path.Combine(GodotSharpDirs.ResTempAssembliesBaseDir, buildConfig); string projectDllSrcPath = Path.Combine(projectDllSrcDir, $"{projectDllName}.dll"); - dependencies[projectDllName] = projectDllSrcPath; + assemblies[projectDllName] = projectDllSrcPath; if (platform == OS.Platforms.Android) { @@ -184,15 +184,15 @@ namespace GodotTools.Export if (!File.Exists(monoAndroidAssemblyPath)) throw new FileNotFoundException("Assembly not found: 'Mono.Android'", monoAndroidAssemblyPath); - dependencies["Mono.Android"] = monoAndroidAssemblyPath; + assemblies["Mono.Android"] = monoAndroidAssemblyPath; } string bclDir = DeterminePlatformBclDir(platform); - var initialDependencies = dependencies.Duplicate(); - internal_GetExportedAssemblyDependencies(initialDependencies, buildConfig, bclDir, dependencies); + var initialAssemblies = assemblies.Duplicate(); + internal_GetExportedAssemblyDependencies(initialAssemblies, buildConfig, bclDir, assemblies); - AddI18NAssemblies(dependencies, bclDir); + AddI18NAssemblies(assemblies, bclDir); string outputDataDir = null; @@ -211,20 +211,32 @@ namespace GodotTools.Export Directory.CreateDirectory(outputDataGameAssembliesDir); } - foreach (var dependency in dependencies) + foreach (var assembly in assemblies) { - string dependSrcPath = dependency.Value; - - if (assembliesInsidePck) - { - string dependDstPath = Path.Combine(resAssembliesDir, dependSrcPath.GetFile()); - AddFile(dependSrcPath, dependDstPath); - } - else + void AddToAssembliesDir(string fileSrcPath) { - string dependDstPath = Path.Combine(outputDataDir, "Assemblies", dependSrcPath.GetFile()); - File.Copy(dependSrcPath, dependDstPath); + if (assembliesInsidePck) + { + string fileDstPath = Path.Combine(resAssembliesDir, fileSrcPath.GetFile()); + AddFile(fileSrcPath, fileDstPath); + } + else + { + Debug.Assert(outputDataDir != null); + string fileDstPath = Path.Combine(outputDataDir, "Assemblies", fileSrcPath.GetFile()); + File.Copy(fileSrcPath, fileDstPath); + } } + + string assemblySrcPath = assembly.Value; + + string assemblyPathWithoutExtension = Path.ChangeExtension(assemblySrcPath, null); + string pdbSrcPath = assemblyPathWithoutExtension + ".pdb"; + + AddToAssembliesDir(assemblySrcPath); + + if (File.Exists(pdbSrcPath)) + AddToAssembliesDir(pdbSrcPath); } // AOT compilation @@ -254,7 +266,7 @@ namespace GodotTools.Export ToolchainPath = aotToolchainPath }; - AotBuilder.CompileAssemblies(this, aotOpts, features, platform, isDebug, bclDir, outputDir, outputDataDir, dependencies); + AotBuilder.CompileAssemblies(this, aotOpts, features, platform, isDebug, bclDir, outputDir, outputDataDir, assemblies); } } @@ -366,7 +378,7 @@ namespace GodotTools.Export if (PlatformRequiresCustomBcl(platform)) throw new FileNotFoundException($"Missing BCL (Base Class Library) for platform: {platform}"); - platformBclDir = typeof(object).Assembly.Location; // Use the one we're running on + platformBclDir = typeof(object).Assembly.Location.GetBaseDir(); // Use the one we're running on } } @@ -425,7 +437,7 @@ namespace GodotTools.Export } [MethodImpl(MethodImplOptions.InternalCall)] - private static extern void internal_GetExportedAssemblyDependencies(Godot.Collections.Dictionary<string, string> initialDependencies, - string buildConfig, string customBclDir, Godot.Collections.Dictionary<string, string> dependencies); + private static extern void internal_GetExportedAssemblyDependencies(Godot.Collections.Dictionary<string, string> initialAssemblies, + string buildConfig, string customBclDir, Godot.Collections.Dictionary<string, string> dependencyAssemblies); } } diff --git a/modules/mono/editor/GodotTools/GodotTools/GodotSharpEditor.cs b/modules/mono/editor/GodotTools/GodotTools/GodotSharpEditor.cs index c9d7dd26f8..c070cb16d9 100644 --- a/modules/mono/editor/GodotTools/GodotTools/GodotSharpEditor.cs +++ b/modules/mono/editor/GodotTools/GodotTools/GodotSharpEditor.cs @@ -1,4 +1,5 @@ using Godot; +using GodotTools.Core; using GodotTools.Export; using GodotTools.Utils; using System; @@ -442,13 +443,27 @@ namespace GodotTools { // Migrate solution from old configuration names to: Debug, ExportDebug and ExportRelease DotNetSolution.MigrateFromOldConfigNames(GodotSharpDirs.ProjectSlnPath); + + var msbuildProject = ProjectUtils.Open(GodotSharpDirs.ProjectCsProjPath) + ?? throw new Exception("Cannot open C# project"); + + // NOTE: The order in which changes are made to the project is important + // Migrate csproj from old configuration names to: Debug, ExportDebug and ExportRelease - ProjectUtils.MigrateFromOldConfigNames(GodotSharpDirs.ProjectCsProjPath); + ProjectUtils.MigrateFromOldConfigNames(msbuildProject); - // Apply the other fixes after configurations are migrated + // Apply the other fixes only after configurations have been migrated // Make sure the existing project has Api assembly references configured correctly - ProjectUtils.FixApiHintPath(GodotSharpDirs.ProjectCsProjPath); + ProjectUtils.FixApiHintPath(msbuildProject); + + if (msbuildProject.HasUnsavedChanges) + { + // Save a copy of the project before replacing it + FileUtils.SaveBackupCopy(GodotSharpDirs.ProjectCsProjPath); + + msbuildProject.Save(); + } } catch (Exception e) { diff --git a/modules/mono/editor/bindings_generator.cpp b/modules/mono/editor/bindings_generator.cpp index 71bb8ff851..bdf9cf965f 100644 --- a/modules/mono/editor/bindings_generator.cpp +++ b/modules/mono/editor/bindings_generator.cpp @@ -566,8 +566,12 @@ String BindingsGenerator::bbcode_to_xml(const String &p_bbcode, const TypeInterf code_tag = true; pos = brk_end + 1; tag_stack.push_front(tag); + } else if (tag == "kbd") { + // keyboard combinations are not supported in xml comments + pos = brk_end + 1; + tag_stack.push_front(tag); } else if (tag == "center") { - // center is alignment not supported in xml comments + // center alignment is not supported in xml comments pos = brk_end + 1; tag_stack.push_front(tag); } else if (tag == "br") { @@ -2383,7 +2387,7 @@ bool BindingsGenerator::_populate_object_type_interfaces() { for (const List<PropertyInfo>::Element *E = property_list.front(); E; E = E->next()) { const PropertyInfo &property = E->get(); - if (property.usage & PROPERTY_USAGE_GROUP || property.usage & PROPERTY_USAGE_CATEGORY) + if (property.usage & PROPERTY_USAGE_GROUP || property.usage & PROPERTY_USAGE_SUBGROUP || property.usage & PROPERTY_USAGE_CATEGORY) continue; PropertyInterface iprop; diff --git a/modules/mono/editor/editor_internal_calls.cpp b/modules/mono/editor/editor_internal_calls.cpp index 283d4beb8e..c3e7e67ae9 100644 --- a/modules/mono/editor/editor_internal_calls.cpp +++ b/modules/mono/editor/editor_internal_calls.cpp @@ -231,14 +231,14 @@ int32_t godot_icall_ScriptClassParser_ParseFile(MonoString *p_filepath, MonoObje return err; } -uint32_t godot_icall_ExportPlugin_GetExportedAssemblyDependencies(MonoObject *p_initial_dependencies, - MonoString *p_build_config, MonoString *p_custom_bcl_dir, MonoObject *r_dependencies) { - Dictionary initial_dependencies = GDMonoMarshal::mono_object_to_variant(p_initial_dependencies); +uint32_t godot_icall_ExportPlugin_GetExportedAssemblyDependencies(MonoObject *p_initial_assemblies, + MonoString *p_build_config, MonoString *p_custom_bcl_dir, MonoObject *r_assembly_dependencies) { + Dictionary initial_dependencies = GDMonoMarshal::mono_object_to_variant(p_initial_assemblies); String build_config = GDMonoMarshal::mono_string_to_godot(p_build_config); String custom_bcl_dir = GDMonoMarshal::mono_string_to_godot(p_custom_bcl_dir); - Dictionary dependencies = GDMonoMarshal::mono_object_to_variant(r_dependencies); + Dictionary assembly_dependencies = GDMonoMarshal::mono_object_to_variant(r_assembly_dependencies); - return GodotSharpExport::get_exported_assembly_dependencies(initial_dependencies, build_config, custom_bcl_dir, dependencies); + return GodotSharpExport::get_exported_assembly_dependencies(initial_dependencies, build_config, custom_bcl_dir, assembly_dependencies); } MonoString *godot_icall_Internal_UpdateApiAssembliesFromPrebuilt(MonoString *p_config) { diff --git a/modules/mono/editor/godotsharp_export.cpp b/modules/mono/editor/godotsharp_export.cpp index 324013e5e2..4126da16be 100644 --- a/modules/mono/editor/godotsharp_export.cpp +++ b/modules/mono/editor/godotsharp_export.cpp @@ -50,13 +50,13 @@ String get_assemblyref_name(MonoImage *p_image, int index) { return String::utf8(mono_metadata_string_heap(p_image, cols[MONO_ASSEMBLYREF_NAME])); } -Error get_assembly_dependencies(GDMonoAssembly *p_assembly, const Vector<String> &p_search_dirs, Dictionary &r_dependencies) { +Error get_assembly_dependencies(GDMonoAssembly *p_assembly, const Vector<String> &p_search_dirs, Dictionary &r_assembly_dependencies) { MonoImage *image = p_assembly->get_image(); for (int i = 0; i < mono_image_get_table_rows(image, MONO_TABLE_ASSEMBLYREF); i++) { String ref_name = get_assemblyref_name(image, i); - if (r_dependencies.has(ref_name)) + if (r_assembly_dependencies.has(ref_name)) continue; GDMonoAssembly *ref_assembly = nullptr; @@ -93,17 +93,17 @@ Error get_assembly_dependencies(GDMonoAssembly *p_assembly, const Vector<String> ERR_FAIL_COND_V_MSG(!ref_assembly, ERR_CANT_RESOLVE, "Cannot load assembly (refonly): '" + ref_name + "'."); // Use the path we got from the search. Don't try to get the path from the loaded assembly as we can't trust it will be from the selected BCL dir. - r_dependencies[ref_name] = path; + r_assembly_dependencies[ref_name] = path; - Error err = get_assembly_dependencies(ref_assembly, p_search_dirs, r_dependencies); + Error err = get_assembly_dependencies(ref_assembly, p_search_dirs, r_assembly_dependencies); ERR_FAIL_COND_V_MSG(err != OK, err, "Cannot load one of the dependencies for the assembly: '" + ref_name + "'."); } return OK; } -Error get_exported_assembly_dependencies(const Dictionary &p_initial_dependencies, - const String &p_build_config, const String &p_custom_bcl_dir, Dictionary &r_dependencies) { +Error get_exported_assembly_dependencies(const Dictionary &p_initial_assemblies, + const String &p_build_config, const String &p_custom_bcl_dir, Dictionary &r_assembly_dependencies) { MonoDomain *export_domain = GDMonoUtils::create_domain("GodotEngine.Domain.ProjectExport"); ERR_FAIL_NULL_V(export_domain, FAILED); _GDMONO_SCOPE_EXIT_DOMAIN_UNLOAD_(export_domain); @@ -113,16 +113,16 @@ Error get_exported_assembly_dependencies(const Dictionary &p_initial_dependencie Vector<String> search_dirs; GDMonoAssembly::fill_search_dirs(search_dirs, p_build_config, p_custom_bcl_dir); - for (const Variant *key = p_initial_dependencies.next(); key; key = p_initial_dependencies.next(key)) { + for (const Variant *key = p_initial_assemblies.next(); key; key = p_initial_assemblies.next(key)) { String assembly_name = *key; - String assembly_path = p_initial_dependencies[*key]; + String assembly_path = p_initial_assemblies[*key]; GDMonoAssembly *assembly = nullptr; bool load_success = GDMono::get_singleton()->load_assembly_from(assembly_name, assembly_path, &assembly, /* refonly: */ true); ERR_FAIL_COND_V_MSG(!load_success, ERR_CANT_RESOLVE, "Cannot load assembly (refonly): '" + assembly_name + "'."); - Error err = get_assembly_dependencies(assembly, search_dirs, r_dependencies); + Error err = get_assembly_dependencies(assembly, search_dirs, r_assembly_dependencies); if (err != OK) return err; } diff --git a/modules/mono/editor/godotsharp_export.h b/modules/mono/editor/godotsharp_export.h index 36138f81b7..9ab57755de 100644 --- a/modules/mono/editor/godotsharp_export.h +++ b/modules/mono/editor/godotsharp_export.h @@ -41,8 +41,8 @@ namespace GodotSharpExport { Error get_assembly_dependencies(GDMonoAssembly *p_assembly, const Vector<String> &p_search_dirs, Dictionary &r_dependencies); -Error get_exported_assembly_dependencies(const Dictionary &p_initial_dependencies, - const String &p_build_config, const String &p_custom_lib_dir, Dictionary &r_dependencies); +Error get_exported_assembly_dependencies(const Dictionary &p_initial_assemblies, + const String &p_build_config, const String &p_custom_lib_dir, Dictionary &r_assembly_dependencies); } // namespace GodotSharpExport diff --git a/modules/mono/glue/GodotSharp/GodotSharp/Core/Array.cs b/modules/mono/glue/GodotSharp/GodotSharp/Core/Array.cs index aba1065498..a963810d63 100644 --- a/modules/mono/glue/GodotSharp/GodotSharp/Core/Array.cs +++ b/modules/mono/glue/GodotSharp/GodotSharp/Core/Array.cs @@ -15,10 +15,7 @@ namespace Godot.Collections public override bool IsInvalid { - get - { - return handle == IntPtr.Zero; - } + get { return handle == IntPtr.Zero; } } protected override bool ReleaseHandle() @@ -43,7 +40,8 @@ namespace Godot.Collections if (collection == null) throw new NullReferenceException($"Parameter '{nameof(collection)} cannot be null.'"); - MarshalUtils.EnumerableToArray(collection, GetPtr()); + foreach (object element in collection) + Add(element); } internal Array(ArraySafeHandle handle) @@ -272,14 +270,8 @@ namespace Godot.Collections public T this[int index] { - get - { - return (T)Array.godot_icall_Array_At_Generic(GetPtr(), index, elemTypeEncoding, elemTypeClass); - } - set - { - objectArray[index] = value; - } + get { return (T)Array.godot_icall_Array_At_Generic(GetPtr(), index, elemTypeEncoding, elemTypeClass); } + set { objectArray[index] = value; } } public int IndexOf(T item) @@ -301,18 +293,12 @@ namespace Godot.Collections public int Count { - get - { - return objectArray.Count; - } + get { return objectArray.Count; } } public bool IsReadOnly { - get - { - return objectArray.IsReadOnly; - } + get { return objectArray.IsReadOnly; } } public void Add(T item) diff --git a/modules/mono/glue/GodotSharp/GodotSharp/Core/Color.cs b/modules/mono/glue/GodotSharp/GodotSharp/Core/Color.cs index 1d1a49945f..facaf74606 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() diff --git a/modules/mono/glue/GodotSharp/GodotSharp/Core/Dictionary.cs b/modules/mono/glue/GodotSharp/GodotSharp/Core/Dictionary.cs index d72109de92..213fc181c1 100644 --- a/modules/mono/glue/GodotSharp/GodotSharp/Core/Dictionary.cs +++ b/modules/mono/glue/GodotSharp/GodotSharp/Core/Dictionary.cs @@ -15,10 +15,7 @@ namespace Godot.Collections public override bool IsInvalid { - get - { - return handle == IntPtr.Zero; - } + get { return handle == IntPtr.Zero; } } protected override bool ReleaseHandle() @@ -45,7 +42,8 @@ namespace Godot.Collections if (dictionary == null) throw new NullReferenceException($"Parameter '{nameof(dictionary)} cannot be null.'"); - MarshalUtils.IDictionaryToDictionary(dictionary, GetPtr()); + foreach (DictionaryEntry entry in dictionary) + Add(entry.Key, entry.Value); } internal Dictionary(DictionarySafeHandle handle) @@ -330,14 +328,8 @@ namespace Godot.Collections public TValue this[TKey key] { - get - { - return (TValue)Dictionary.godot_icall_Dictionary_GetValue_Generic(objectDict.GetPtr(), key, valTypeEncoding, valTypeClass); - } - set - { - objectDict[key] = value; - } + get { return (TValue)Dictionary.godot_icall_Dictionary_GetValue_Generic(objectDict.GetPtr(), key, valTypeEncoding, valTypeClass); } + set { objectDict[key] = value; } } public ICollection<TKey> Keys @@ -385,18 +377,12 @@ namespace Godot.Collections public int Count { - get - { - return objectDict.Count; - } + get { return objectDict.Count; } } public bool IsReadOnly { - get - { - return objectDict.IsReadOnly; - } + get { return objectDict.IsReadOnly; } } public void Add(KeyValuePair<TKey, TValue> item) @@ -440,7 +426,8 @@ namespace Godot.Collections public bool Remove(KeyValuePair<TKey, TValue> item) { - return Dictionary.godot_icall_Dictionary_Remove(GetPtr(), item.Key, item.Value); ; + return Dictionary.godot_icall_Dictionary_Remove(GetPtr(), item.Key, item.Value); + ; } // IEnumerable<KeyValuePair<TKey, TValue>> diff --git a/modules/mono/glue/GodotSharp/GodotSharp/Core/MarshalUtils.cs b/modules/mono/glue/GodotSharp/GodotSharp/Core/MarshalUtils.cs index a1d63a62ef..c59d083080 100644 --- a/modules/mono/glue/GodotSharp/GodotSharp/Core/MarshalUtils.cs +++ b/modules/mono/glue/GodotSharp/GodotSharp/Core/MarshalUtils.cs @@ -16,10 +16,8 @@ namespace Godot /// <exception cref="System.InvalidOperationException"> /// <paramref name="type"/> is not a generic type. That is, IsGenericType returns false. /// </exception> - static bool TypeIsGenericArray(Type type) - { - return type.GetGenericTypeDefinition() == typeof(Godot.Collections.Array<>); - } + static bool TypeIsGenericArray(Type type) => + type.GetGenericTypeDefinition() == typeof(Godot.Collections.Array<>); /// <summary> /// Returns <see langword="true"/> if the generic type definition of <paramref name="type"/> @@ -28,10 +26,20 @@ namespace Godot /// <exception cref="System.InvalidOperationException"> /// <paramref name="type"/> is not a generic type. That is, IsGenericType returns false. /// </exception> - static bool TypeIsGenericDictionary(Type type) - { - return type.GetGenericTypeDefinition() == typeof(Godot.Collections.Dictionary<,>); - } + static bool TypeIsGenericDictionary(Type type) => + type.GetGenericTypeDefinition() == typeof(Godot.Collections.Dictionary<,>); + + static bool TypeIsSystemGenericList(Type type) => + type.GetGenericTypeDefinition() == typeof(System.Collections.Generic.List<>); + + static bool TypeIsSystemGenericDictionary(Type type) => + type.GetGenericTypeDefinition() == typeof(System.Collections.Generic.Dictionary<,>); + + static bool TypeIsGenericIEnumerable(Type type) => type.GetGenericTypeDefinition() == typeof(IEnumerable<>); + + static bool TypeIsGenericICollection(Type type) => type.GetGenericTypeDefinition() == typeof(ICollection<>); + + static bool TypeIsGenericIDictionary(Type type) => type.GetGenericTypeDefinition() == typeof(IDictionary<,>); static void ArrayGetElementType(Type arrayType, out Type elementType) { @@ -45,105 +53,6 @@ namespace Godot valueType = genericArgs[1]; } - static bool GenericIEnumerableIsAssignableFromType(Type type) - { - if (type.IsGenericType && type.GetGenericTypeDefinition() == typeof(IEnumerable<>)) - return true; - - foreach (var interfaceType in type.GetInterfaces()) - { - if (interfaceType.IsGenericType && interfaceType.GetGenericTypeDefinition() == typeof(IEnumerable<>)) - return true; - } - - Type baseType = type.BaseType; - - if (baseType == null) - return false; - - return GenericIEnumerableIsAssignableFromType(baseType); - } - - static bool GenericIDictionaryIsAssignableFromType(Type type) - { - if (type.IsGenericType && type.GetGenericTypeDefinition() == typeof(IDictionary<,>)) - return true; - - foreach (var interfaceType in type.GetInterfaces()) - { - if (interfaceType.IsGenericType && interfaceType.GetGenericTypeDefinition() == typeof(IDictionary<,>)) - return true; - } - - Type baseType = type.BaseType; - - if (baseType == null) - return false; - - return GenericIDictionaryIsAssignableFromType(baseType); - } - - static bool GenericIEnumerableIsAssignableFromType(Type type, out Type elementType) - { - if (type.IsGenericType && type.GetGenericTypeDefinition() == typeof(IEnumerable<>)) - { - elementType = type.GetGenericArguments()[0]; - return true; - } - - foreach (var interfaceType in type.GetInterfaces()) - { - if (interfaceType.IsGenericType && interfaceType.GetGenericTypeDefinition() == typeof(IEnumerable<>)) - { - elementType = interfaceType.GetGenericArguments()[0]; - return true; - } - } - - Type baseType = type.BaseType; - - if (baseType == null) - { - elementType = null; - return false; - } - - return GenericIEnumerableIsAssignableFromType(baseType, out elementType); - } - - static bool GenericIDictionaryIsAssignableFromType(Type type, out Type keyType, out Type valueType) - { - if (type.IsGenericType && type.GetGenericTypeDefinition() == typeof(IDictionary<,>)) - { - var genericArgs = type.GetGenericArguments(); - keyType = genericArgs[0]; - valueType = genericArgs[1]; - return true; - } - - foreach (var interfaceType in type.GetInterfaces()) - { - if (interfaceType.IsGenericType && interfaceType.GetGenericTypeDefinition() == typeof(IDictionary<,>)) - { - var genericArgs = interfaceType.GetGenericArguments(); - keyType = genericArgs[0]; - valueType = genericArgs[1]; - return true; - } - } - - Type baseType = type.BaseType; - - if (baseType == null) - { - keyType = null; - valueType = null; - return false; - } - - return GenericIDictionaryIsAssignableFromType(baseType, out keyType, out valueType); - } - static Type MakeGenericArrayType(Type elemType) { return typeof(Godot.Collections.Array<>).MakeGenericType(elemType); @@ -153,60 +62,5 @@ namespace Godot { return typeof(Godot.Collections.Dictionary<,>).MakeGenericType(keyType, valueType); } - - // TODO Add support for IEnumerable<T> and IDictionary<TKey, TValue> - // TODO: EnumerableToArray and IDictionaryToDictionary can be optimized - - internal static void EnumerableToArray(IEnumerable enumerable, IntPtr godotArrayPtr) - { - if (enumerable is ICollection collection) - { - int count = collection.Count; - - object[] tempArray = new object[count]; - collection.CopyTo(tempArray, 0); - - for (int i = 0; i < count; i++) - { - Array.godot_icall_Array_Add(godotArrayPtr, tempArray[i]); - } - } - else - { - foreach (object element in enumerable) - { - Array.godot_icall_Array_Add(godotArrayPtr, element); - } - } - } - - internal static void IDictionaryToDictionary(IDictionary dictionary, IntPtr godotDictionaryPtr) - { - foreach (DictionaryEntry entry in dictionary) - { - Dictionary.godot_icall_Dictionary_Add(godotDictionaryPtr, entry.Key, entry.Value); - } - } - - internal static void GenericIDictionaryToDictionary(object dictionary, IntPtr godotDictionaryPtr) - { -#if DEBUG - if (!GenericIDictionaryIsAssignableFromType(dictionary.GetType())) - throw new InvalidOperationException("The type does not implement IDictionary<,>"); -#endif - - // TODO: Can we optimize this? - - var keys = ((IEnumerable)dictionary.GetType().GetProperty("Keys").GetValue(dictionary)).GetEnumerator(); - var values = ((IEnumerable)dictionary.GetType().GetProperty("Values").GetValue(dictionary)).GetEnumerator(); - - while (keys.MoveNext() && values.MoveNext()) - { - object key = keys.Current; - object value = values.Current; - - Dictionary.godot_icall_Dictionary_Add(godotDictionaryPtr, key, value); - } - } } } 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/godotsharp_dirs.cpp b/modules/mono/godotsharp_dirs.cpp index fe8b925257..d596163926 100644 --- a/modules/mono/godotsharp_dirs.cpp +++ b/modules/mono/godotsharp_dirs.cpp @@ -40,7 +40,7 @@ #endif #ifdef ANDROID_ENABLED -#include "mono_gd/support/mono-support.h" +#include "mono_gd/support/android_support.h" #endif #include "mono_gd/gd_mono.h" diff --git a/modules/mono/mono_gd/gd_mono.cpp b/modules/mono/mono_gd/gd_mono.cpp index 306a1997ab..3298c5da4c 100644 --- a/modules/mono/mono_gd/gd_mono.cpp +++ b/modules/mono/mono_gd/gd_mono.cpp @@ -129,12 +129,8 @@ void gd_mono_profiler_init() { } } -#if defined(DEBUG_ENABLED) - void gd_mono_debug_init() { - mono_debug_init(MONO_DEBUG_FORMAT_MONO); - CharString da_args = OS::get_singleton()->get_environment("GODOT_MONO_DEBUGGER_AGENT").utf8(); #ifdef TOOLS_ENABLED @@ -159,6 +155,10 @@ void gd_mono_debug_init() { return; // Exported games don't use the project settings to setup the debugger agent #endif + // Debugging enabled + + mono_debug_init(MONO_DEBUG_FORMAT_MONO); + // --debugger-agent=help const char *options[] = { "--soft-breakpoints", @@ -167,7 +167,6 @@ void gd_mono_debug_init() { mono_jit_parse_options(2, (char **)options); } -#endif // defined(DEBUG_ENABLED) #endif // !defined(JAVASCRIPT_ENABLED) #if defined(JAVASCRIPT_ENABLED) @@ -175,6 +174,7 @@ MonoDomain *gd_initialize_mono_runtime() { const char *vfs_prefix = "managed"; int enable_debugging = 0; + // TODO: Provide a way to enable debugging on WASM release builds. #ifdef DEBUG_ENABLED enable_debugging = 1; #endif @@ -185,9 +185,7 @@ MonoDomain *gd_initialize_mono_runtime() { } #else MonoDomain *gd_initialize_mono_runtime() { -#ifdef DEBUG_ENABLED gd_mono_debug_init(); -#endif #if defined(IPHONE_ENABLED) || defined(ANDROID_ENABLED) // I don't know whether this actually matters or not @@ -1389,7 +1387,10 @@ bool _GodotSharp::is_runtime_initialized() { void _GodotSharp::_reload_assemblies(bool p_soft_reload) { #ifdef GD_MONO_HOT_RELOAD - CSharpLanguage::get_singleton()->reload_assemblies(p_soft_reload); + // This method may be called more than once with `call_deferred`, so we need to check + // again if reloading is needed to avoid reloading multiple times unnecessarily. + if (CSharpLanguage::get_singleton()->is_assembly_reloading_needed()) + CSharpLanguage::get_singleton()->reload_assemblies(p_soft_reload); #endif } diff --git a/modules/mono/mono_gd/gd_mono_assembly.cpp b/modules/mono/mono_gd/gd_mono_assembly.cpp index 8439769d84..0f211eebc6 100644 --- a/modules/mono/mono_gd/gd_mono_assembly.cpp +++ b/modules/mono/mono_gd/gd_mono_assembly.cpp @@ -277,12 +277,25 @@ no_pdb: #endif + bool need_manual_load_hook = mono_image_get_assembly(image) != nullptr; // Re-using an existing image with an assembly loaded + status = MONO_IMAGE_OK; MonoAssembly *assembly = mono_assembly_load_from_full(image, image_filename.utf8().get_data(), &status, p_refonly); ERR_FAIL_COND_V_MSG(status != MONO_IMAGE_OK || !assembly, nullptr, "Failed to load assembly for image"); + if (need_manual_load_hook) { + // For some reason if an assembly survived domain reloading (maybe because it's referenced somewhere else), + // the mono internal search hook don't detect it, yet mono_image_open_from_data_with_name re-uses the image + // and assembly, and mono_assembly_load_from_full doesn't call the load hook. We need to call it manually. + String name = String::utf8(mono_assembly_name_get_name(mono_assembly_get_name(assembly))); + bool has_extension = name.ends_with(".dll") || name.ends_with(".exe"); + GDMonoAssembly *loaded_asm = GDMono::get_singleton()->get_loaded_assembly(has_extension ? name.get_basename() : name); + if (!loaded_asm) + assembly_load_hook(assembly, nullptr); + } + // Decrement refcount which was previously incremented by mono_image_open_from_data_with_name mono_image_close(image); diff --git a/modules/mono/mono_gd/gd_mono_cache.cpp b/modules/mono/mono_gd/gd_mono_cache.cpp index facc0da780..5ddf18d544 100644 --- a/modules/mono/mono_gd/gd_mono_cache.cpp +++ b/modules/mono/mono_gd/gd_mono_cache.cpp @@ -84,6 +84,7 @@ void CachedData::clear_corlib_cache() { class_IntPtr = nullptr; class_System_Collections_IEnumerable = nullptr; + class_System_Collections_ICollection = nullptr; class_System_Collections_IDictionary = nullptr; #ifdef DEBUG_ENABLED @@ -171,22 +172,18 @@ void CachedData::clear_godot_api_cache() { methodthunk_MarshalUtils_TypeIsGenericArray.nullify(); methodthunk_MarshalUtils_TypeIsGenericDictionary.nullify(); + methodthunk_MarshalUtils_TypeIsSystemGenericList.nullify(); + methodthunk_MarshalUtils_TypeIsSystemGenericDictionary.nullify(); + methodthunk_MarshalUtils_TypeIsGenericIEnumerable.nullify(); + methodthunk_MarshalUtils_TypeIsGenericICollection.nullify(); + methodthunk_MarshalUtils_TypeIsGenericIDictionary.nullify(); methodthunk_MarshalUtils_ArrayGetElementType.nullify(); methodthunk_MarshalUtils_DictionaryGetKeyValueTypes.nullify(); - methodthunk_MarshalUtils_GenericIEnumerableIsAssignableFromType.nullify(); - methodthunk_MarshalUtils_GenericIDictionaryIsAssignableFromType.nullify(); - methodthunk_MarshalUtils_GenericIEnumerableIsAssignableFromType_with_info.nullify(); - methodthunk_MarshalUtils_GenericIDictionaryIsAssignableFromType_with_info.nullify(); - methodthunk_MarshalUtils_MakeGenericArrayType.nullify(); methodthunk_MarshalUtils_MakeGenericDictionaryType.nullify(); - methodthunk_MarshalUtils_EnumerableToArray.nullify(); - methodthunk_MarshalUtils_IDictionaryToDictionary.nullify(); - methodthunk_MarshalUtils_GenericIDictionaryToDictionary.nullify(); - // End of MarshalUtils methods task_scheduler_handle = Ref<MonoGCHandleRef>(); @@ -213,6 +210,7 @@ void update_corlib_cache() { CACHE_CLASS_AND_CHECK(IntPtr, GDMono::get_singleton()->get_corlib_assembly()->get_class(mono_get_intptr_class())); CACHE_CLASS_AND_CHECK(System_Collections_IEnumerable, GDMono::get_singleton()->get_corlib_assembly()->get_class("System.Collections", "IEnumerable")); + CACHE_CLASS_AND_CHECK(System_Collections_ICollection, GDMono::get_singleton()->get_corlib_assembly()->get_class("System.Collections", "ICollection")); CACHE_CLASS_AND_CHECK(System_Collections_IDictionary, GDMono::get_singleton()->get_corlib_assembly()->get_class("System.Collections", "IDictionary")); #ifdef DEBUG_ENABLED @@ -297,22 +295,18 @@ void update_godot_api_cache() { CACHE_METHOD_THUNK_AND_CHECK(MarshalUtils, TypeIsGenericArray, GODOT_API_CLASS(MarshalUtils)->get_method("TypeIsGenericArray", 1)); CACHE_METHOD_THUNK_AND_CHECK(MarshalUtils, TypeIsGenericDictionary, GODOT_API_CLASS(MarshalUtils)->get_method("TypeIsGenericDictionary", 1)); + CACHE_METHOD_THUNK_AND_CHECK(MarshalUtils, TypeIsSystemGenericList, GODOT_API_CLASS(MarshalUtils)->get_method("TypeIsSystemGenericList", 1)); + CACHE_METHOD_THUNK_AND_CHECK(MarshalUtils, TypeIsSystemGenericDictionary, GODOT_API_CLASS(MarshalUtils)->get_method("TypeIsSystemGenericDictionary", 1)); + CACHE_METHOD_THUNK_AND_CHECK(MarshalUtils, TypeIsGenericIEnumerable, GODOT_API_CLASS(MarshalUtils)->get_method("TypeIsGenericIEnumerable", 1)); + CACHE_METHOD_THUNK_AND_CHECK(MarshalUtils, TypeIsGenericICollection, GODOT_API_CLASS(MarshalUtils)->get_method("TypeIsGenericICollection", 1)); + CACHE_METHOD_THUNK_AND_CHECK(MarshalUtils, TypeIsGenericIDictionary, GODOT_API_CLASS(MarshalUtils)->get_method("TypeIsGenericIDictionary", 1)); CACHE_METHOD_THUNK_AND_CHECK(MarshalUtils, ArrayGetElementType, GODOT_API_CLASS(MarshalUtils)->get_method("ArrayGetElementType", 2)); CACHE_METHOD_THUNK_AND_CHECK(MarshalUtils, DictionaryGetKeyValueTypes, GODOT_API_CLASS(MarshalUtils)->get_method("DictionaryGetKeyValueTypes", 3)); - CACHE_METHOD_THUNK_AND_CHECK(MarshalUtils, GenericIEnumerableIsAssignableFromType, GODOT_API_CLASS(MarshalUtils)->get_method("GenericIEnumerableIsAssignableFromType", 1)); - CACHE_METHOD_THUNK_AND_CHECK(MarshalUtils, GenericIDictionaryIsAssignableFromType, GODOT_API_CLASS(MarshalUtils)->get_method("GenericIDictionaryIsAssignableFromType", 1)); - CACHE_METHOD_THUNK_AND_CHECK(MarshalUtils, GenericIEnumerableIsAssignableFromType_with_info, GODOT_API_CLASS(MarshalUtils)->get_method("GenericIEnumerableIsAssignableFromType", 2)); - CACHE_METHOD_THUNK_AND_CHECK(MarshalUtils, GenericIDictionaryIsAssignableFromType_with_info, GODOT_API_CLASS(MarshalUtils)->get_method("GenericIDictionaryIsAssignableFromType", 3)); - CACHE_METHOD_THUNK_AND_CHECK(MarshalUtils, MakeGenericArrayType, GODOT_API_CLASS(MarshalUtils)->get_method("MakeGenericArrayType", 1)); CACHE_METHOD_THUNK_AND_CHECK(MarshalUtils, MakeGenericDictionaryType, GODOT_API_CLASS(MarshalUtils)->get_method("MakeGenericDictionaryType", 2)); - CACHE_METHOD_THUNK_AND_CHECK(MarshalUtils, EnumerableToArray, GODOT_API_CLASS(MarshalUtils)->get_method("EnumerableToArray", 2)); - CACHE_METHOD_THUNK_AND_CHECK(MarshalUtils, IDictionaryToDictionary, GODOT_API_CLASS(MarshalUtils)->get_method("IDictionaryToDictionary", 2)); - CACHE_METHOD_THUNK_AND_CHECK(MarshalUtils, GenericIDictionaryToDictionary, GODOT_API_CLASS(MarshalUtils)->get_method("GenericIDictionaryToDictionary", 2)); - // End of MarshalUtils methods #ifdef DEBUG_ENABLED diff --git a/modules/mono/mono_gd/gd_mono_cache.h b/modules/mono/mono_gd/gd_mono_cache.h index 21c8ed4efe..3cf2bd6ce5 100644 --- a/modules/mono/mono_gd/gd_mono_cache.h +++ b/modules/mono/mono_gd/gd_mono_cache.h @@ -58,6 +58,7 @@ struct CachedData { GDMonoClass *class_IntPtr; // System.IntPtr GDMonoClass *class_System_Collections_IEnumerable; + GDMonoClass *class_System_Collections_ICollection; GDMonoClass *class_System_Collections_IDictionary; #ifdef DEBUG_ENABLED @@ -141,22 +142,18 @@ struct CachedData { GDMonoMethodThunkR<MonoBoolean, MonoReflectionType *> methodthunk_MarshalUtils_TypeIsGenericArray; GDMonoMethodThunkR<MonoBoolean, MonoReflectionType *> methodthunk_MarshalUtils_TypeIsGenericDictionary; + GDMonoMethodThunkR<MonoBoolean, MonoReflectionType *> methodthunk_MarshalUtils_TypeIsSystemGenericList; + GDMonoMethodThunkR<MonoBoolean, MonoReflectionType *> methodthunk_MarshalUtils_TypeIsSystemGenericDictionary; + GDMonoMethodThunkR<MonoBoolean, MonoReflectionType *> methodthunk_MarshalUtils_TypeIsGenericIEnumerable; + GDMonoMethodThunkR<MonoBoolean, MonoReflectionType *> methodthunk_MarshalUtils_TypeIsGenericICollection; + GDMonoMethodThunkR<MonoBoolean, MonoReflectionType *> methodthunk_MarshalUtils_TypeIsGenericIDictionary; GDMonoMethodThunk<MonoReflectionType *, MonoReflectionType **> methodthunk_MarshalUtils_ArrayGetElementType; GDMonoMethodThunk<MonoReflectionType *, MonoReflectionType **, MonoReflectionType **> methodthunk_MarshalUtils_DictionaryGetKeyValueTypes; - GDMonoMethodThunkR<MonoBoolean, MonoReflectionType *> methodthunk_MarshalUtils_GenericIEnumerableIsAssignableFromType; - GDMonoMethodThunkR<MonoBoolean, MonoReflectionType *> methodthunk_MarshalUtils_GenericIDictionaryIsAssignableFromType; - GDMonoMethodThunkR<MonoBoolean, MonoReflectionType *, MonoReflectionType **> methodthunk_MarshalUtils_GenericIEnumerableIsAssignableFromType_with_info; - GDMonoMethodThunkR<MonoBoolean, MonoReflectionType *, MonoReflectionType **, MonoReflectionType **> methodthunk_MarshalUtils_GenericIDictionaryIsAssignableFromType_with_info; - GDMonoMethodThunkR<MonoReflectionType *, MonoReflectionType *> methodthunk_MarshalUtils_MakeGenericArrayType; GDMonoMethodThunkR<MonoReflectionType *, MonoReflectionType *, MonoReflectionType *> methodthunk_MarshalUtils_MakeGenericDictionaryType; - GDMonoMethodThunk<MonoObject *, Array *> methodthunk_MarshalUtils_EnumerableToArray; - GDMonoMethodThunk<MonoObject *, Dictionary *> methodthunk_MarshalUtils_IDictionaryToDictionary; - GDMonoMethodThunk<MonoObject *, Dictionary *> methodthunk_MarshalUtils_GenericIDictionaryToDictionary; - // End of MarshalUtils methods Ref<MonoGCHandleRef> task_scheduler_handle; @@ -186,14 +183,6 @@ inline void clear_godot_api_cache() { cached_data.clear_godot_api_cache(); } -_FORCE_INLINE_ bool tools_godot_api_check() { -#ifdef TOOLS_ENABLED - return cached_data.godot_api_cache_updated; -#else - return true; // Assume it's updated if this was called, otherwise it's a bug -#endif -} - } // namespace GDMonoCache #define CACHED_CLASS(m_class) (GDMonoCache::cached_data.class_##m_class) diff --git a/modules/mono/mono_gd/gd_mono_class.cpp b/modules/mono/mono_gd/gd_mono_class.cpp index ede4203e35..2c65f7e3a0 100644 --- a/modules/mono/mono_gd/gd_mono_class.cpp +++ b/modules/mono/mono_gd/gd_mono_class.cpp @@ -31,6 +31,7 @@ #include "gd_mono_class.h" #include <mono/metadata/attrdefs.h> +#include <mono/metadata/debug-helpers.h> #include "gd_mono_assembly.h" #include "gd_mono_cache.h" @@ -55,7 +56,11 @@ String GDMonoClass::get_full_name() const { return get_full_name(mono_class); } -MonoType *GDMonoClass::get_mono_type() { +String GDMonoClass::get_type_desc() const { + return GDMonoUtils::get_type_desc(get_mono_type()); +} + +MonoType *GDMonoClass::get_mono_type() const { // Careful, you cannot compare two MonoType*. // There is mono_metadata_type_equal, how is this different from comparing two MonoClass*? return get_mono_type(mono_class); @@ -264,6 +269,12 @@ bool GDMonoClass::implements_interface(GDMonoClass *p_interface) { return mono_class_implements_interface(mono_class, p_interface->get_mono_ptr()); } +bool GDMonoClass::has_public_parameterless_ctor() { + + GDMonoMethod *ctor = get_method(".ctor", 0); + return ctor && ctor->get_visibility() == IMonoClassMember::PUBLIC; +} + GDMonoMethod *GDMonoClass::get_method(const StringName &p_name, int p_params_count) { MethodKey key = MethodKey(p_name, p_params_count); @@ -328,6 +339,9 @@ GDMonoMethod *GDMonoClass::get_method_with_desc(const String &p_description, boo MonoMethod *method = mono_method_desc_search_in_class(desc, mono_class); mono_method_desc_free(desc); + if (!method) + return nullptr; + ERR_FAIL_COND_V(mono_method_get_class(method) != mono_class, nullptr); return get_method(method); diff --git a/modules/mono/mono_gd/gd_mono_class.h b/modules/mono/mono_gd/gd_mono_class.h index 0c9a8cdafe..9237aae057 100644 --- a/modules/mono/mono_gd/gd_mono_class.h +++ b/modules/mono/mono_gd/gd_mono_class.h @@ -31,8 +31,6 @@ #ifndef GD_MONO_CLASS_H #define GD_MONO_CLASS_H -#include <mono/metadata/debug-helpers.h> - #include "core/map.h" #include "core/ustring.h" @@ -107,7 +105,8 @@ public: static MonoType *get_mono_type(MonoClass *p_mono_class); String get_full_name() const; - MonoType *get_mono_type(); + String get_type_desc() const; + MonoType *get_mono_type() const; uint32_t get_flags() const; bool is_static() const; @@ -137,6 +136,7 @@ public: void fetch_methods_with_godot_api_checks(GDMonoClass *p_native_base); bool implements_interface(GDMonoClass *p_interface); + bool has_public_parameterless_ctor(); GDMonoMethod *get_method(const StringName &p_name, int p_params_count = 0); GDMonoMethod *get_method(MonoMethod *p_raw_method); diff --git a/modules/mono/mono_gd/gd_mono_field.cpp b/modules/mono/mono_gd/gd_mono_field.cpp index 3f4e5fe5ac..e76cb84d43 100644 --- a/modules/mono/mono_gd/gd_mono_field.cpp +++ b/modules/mono/mono_gd/gd_mono_field.cpp @@ -322,6 +322,13 @@ void GDMonoField::set_value_from_variant(MonoObject *p_object, const Variant &p_ break; } + GDMonoClass *array_type_class = GDMono::get_singleton()->get_class(array_type->eklass); + if (CACHED_CLASS(GodotObject)->is_assignable_from(array_type_class)) { + MonoArray *managed = GDMonoMarshal::Array_to_mono_array(p_value.operator ::Array(), array_type_class); + mono_field_set_value(p_object, mono_field, managed); + break; + } + ERR_FAIL_MSG("Attempted to convert Variant to a managed array of unmarshallable element type."); } break; @@ -353,56 +360,22 @@ void GDMonoField::set_value_from_variant(MonoObject *p_object, const Variant &p_ break; } - if (CACHED_CLASS(Dictionary) == type_class) { + // Godot.Collections.Dictionary or IDictionary + if (CACHED_CLASS(Dictionary) == type_class || type_class == CACHED_CLASS(System_Collections_IDictionary)) { MonoObject *managed = GDMonoUtils::create_managed_from(p_value.operator Dictionary(), CACHED_CLASS(Dictionary)); mono_field_set_value(p_object, mono_field, managed); break; } - if (CACHED_CLASS(Array) == type_class) { + // Godot.Collections.Array or ICollection or IEnumerable + if (CACHED_CLASS(Array) == type_class || + type_class == CACHED_CLASS(System_Collections_ICollection) || + type_class == CACHED_CLASS(System_Collections_IEnumerable)) { MonoObject *managed = GDMonoUtils::create_managed_from(p_value.operator Array(), CACHED_CLASS(Array)); mono_field_set_value(p_object, mono_field, managed); break; } - // The order in which we check the following interfaces is very important (dictionaries and generics first) - - MonoReflectionType *reftype = mono_type_get_object(mono_domain_get(), type_class->get_mono_type()); - - MonoReflectionType *key_reftype, *value_reftype; - if (GDMonoUtils::Marshal::generic_idictionary_is_assignable_from(reftype, &key_reftype, &value_reftype)) { - MonoObject *managed = GDMonoUtils::create_managed_from(p_value.operator Dictionary(), - GDMonoUtils::Marshal::make_generic_dictionary_type(key_reftype, value_reftype)); - mono_field_set_value(p_object, mono_field, managed); - break; - } - - if (type_class->implements_interface(CACHED_CLASS(System_Collections_IDictionary))) { - MonoObject *managed = GDMonoUtils::create_managed_from(p_value.operator Dictionary(), CACHED_CLASS(Dictionary)); - mono_field_set_value(p_object, mono_field, managed); - break; - } - - MonoReflectionType *elem_reftype; - if (GDMonoUtils::Marshal::generic_ienumerable_is_assignable_from(reftype, &elem_reftype)) { - MonoObject *managed = GDMonoUtils::create_managed_from(p_value.operator Array(), - GDMonoUtils::Marshal::make_generic_array_type(elem_reftype)); - mono_field_set_value(p_object, mono_field, managed); - break; - } - - if (type_class->implements_interface(CACHED_CLASS(System_Collections_IEnumerable))) { - if (GDMonoCache::tools_godot_api_check()) { - MonoObject *managed = GDMonoUtils::create_managed_from(p_value.operator Array(), CACHED_CLASS(Array)); - mono_field_set_value(p_object, mono_field, managed); - break; - } else { - MonoObject *managed = (MonoObject *)GDMonoMarshal::Array_to_mono_array(p_value.operator Array()); - mono_field_set_value(p_object, mono_field, managed); - break; - } - } - ERR_FAIL_MSG("Attempted to set the value of a field of unmarshallable type: '" + type_class->get_name() + "'."); } break; @@ -535,52 +508,62 @@ void GDMonoField::set_value_from_variant(MonoObject *p_object, const Variant &p_ case MONO_TYPE_GENERICINST: { MonoReflectionType *reftype = mono_type_get_object(mono_domain_get(), type.type_class->get_mono_type()); + // Godot.Collections.Dictionary<TKey, TValue> if (GDMonoUtils::Marshal::type_is_generic_dictionary(reftype)) { MonoObject *managed = GDMonoUtils::create_managed_from(p_value.operator Dictionary(), type.type_class); mono_field_set_value(p_object, mono_field, managed); break; } + // Godot.Collections.Array<T> if (GDMonoUtils::Marshal::type_is_generic_array(reftype)) { MonoObject *managed = GDMonoUtils::create_managed_from(p_value.operator Array(), type.type_class); mono_field_set_value(p_object, mono_field, managed); break; } - // The order in which we check the following interfaces is very important (dictionaries and generics first) - - MonoReflectionType *key_reftype, *value_reftype; - if (GDMonoUtils::Marshal::generic_idictionary_is_assignable_from(reftype, &key_reftype, &value_reftype)) { - MonoObject *managed = GDMonoUtils::create_managed_from(p_value.operator Dictionary(), - GDMonoUtils::Marshal::make_generic_dictionary_type(key_reftype, value_reftype)); + // System.Collections.Generic.Dictionary<TKey, TValue> + if (GDMonoUtils::Marshal::type_is_system_generic_dictionary(reftype)) { + MonoReflectionType *key_reftype = nullptr; + MonoReflectionType *value_reftype = nullptr; + GDMonoUtils::Marshal::dictionary_get_key_value_types(reftype, &key_reftype, &value_reftype); + MonoObject *managed = GDMonoMarshal::Dictionary_to_system_generic_dict(p_value.operator Dictionary(), + type.type_class, key_reftype, value_reftype); mono_field_set_value(p_object, mono_field, managed); break; } - if (type.type_class->implements_interface(CACHED_CLASS(System_Collections_IDictionary))) { - MonoObject *managed = GDMonoUtils::create_managed_from(p_value.operator Dictionary(), CACHED_CLASS(Dictionary)); + // System.Collections.Generic.List<T> + if (GDMonoUtils::Marshal::type_is_system_generic_list(reftype)) { + MonoReflectionType *elem_reftype = nullptr; + GDMonoUtils::Marshal::array_get_element_type(reftype, &elem_reftype); + MonoObject *managed = GDMonoMarshal::Array_to_system_generic_list(p_value.operator Array(), + type.type_class, elem_reftype); mono_field_set_value(p_object, mono_field, managed); break; } - MonoReflectionType *elem_reftype; - if (GDMonoUtils::Marshal::generic_ienumerable_is_assignable_from(reftype, &elem_reftype)) { - MonoObject *managed = GDMonoUtils::create_managed_from(p_value.operator Array(), - GDMonoUtils::Marshal::make_generic_array_type(elem_reftype)); + // IDictionary<TKey, TValue> + if (GDMonoUtils::Marshal::type_is_generic_idictionary(reftype)) { + MonoReflectionType *key_reftype; + MonoReflectionType *value_reftype; + GDMonoUtils::Marshal::dictionary_get_key_value_types(reftype, &key_reftype, &value_reftype); + GDMonoClass *godot_dict_class = GDMonoUtils::Marshal::make_generic_dictionary_type(key_reftype, value_reftype); + + MonoObject *managed = GDMonoUtils::create_managed_from(p_value.operator Dictionary(), godot_dict_class); mono_field_set_value(p_object, mono_field, managed); break; } - if (type.type_class->implements_interface(CACHED_CLASS(System_Collections_IEnumerable))) { - if (GDMonoCache::tools_godot_api_check()) { - MonoObject *managed = GDMonoUtils::create_managed_from(p_value.operator Array(), CACHED_CLASS(Array)); - mono_field_set_value(p_object, mono_field, managed); - break; - } else { - MonoObject *managed = (MonoObject *)GDMonoMarshal::Array_to_mono_array(p_value.operator Array()); - mono_field_set_value(p_object, mono_field, managed); - break; - } + // ICollection<T> or IEnumerable<T> + if (GDMonoUtils::Marshal::type_is_generic_icollection(reftype) || GDMonoUtils::Marshal::type_is_generic_ienumerable(reftype)) { + MonoReflectionType *elem_reftype; + GDMonoUtils::Marshal::array_get_element_type(reftype, &elem_reftype); + GDMonoClass *godot_array_class = GDMonoUtils::Marshal::make_generic_array_type(elem_reftype); + + MonoObject *managed = GDMonoUtils::create_managed_from(p_value.operator Array(), godot_array_class); + mono_field_set_value(p_object, mono_field, managed); + break; } } break; diff --git a/modules/mono/mono_gd/gd_mono_marshal.cpp b/modules/mono/mono_gd/gd_mono_marshal.cpp index 1878038f44..91ee07388b 100644 --- a/modules/mono/mono_gd/gd_mono_marshal.cpp +++ b/modules/mono/mono_gd/gd_mono_marshal.cpp @@ -154,6 +154,10 @@ Variant::Type managed_to_variant_type(const ManagedType &p_type, bool *r_nil_is_ if (array_type->eklass == CACHED_CLASS_RAW(Color)) return Variant::PACKED_COLOR_ARRAY; + + GDMonoClass *array_type_class = GDMono::get_singleton()->get_class(array_type->eklass); + if (CACHED_CLASS(GodotObject)->is_assignable_from(array_type_class)) + return Variant::ARRAY; } break; case MONO_TYPE_CLASS: { @@ -184,23 +188,14 @@ Variant::Type managed_to_variant_type(const ManagedType &p_type, bool *r_nil_is_ return Variant::ARRAY; } - // The order in which we check the following interfaces is very important (dictionaries and generics first) - - MonoReflectionType *reftype = mono_type_get_object(mono_domain_get(), type_class->get_mono_type()); - - if (GDMonoUtils::Marshal::generic_idictionary_is_assignable_from(reftype)) { - return Variant::DICTIONARY; - } - - if (type_class->implements_interface(CACHED_CLASS(System_Collections_IDictionary))) { + // IDictionary + if (p_type.type_class == CACHED_CLASS(System_Collections_IDictionary)) { return Variant::DICTIONARY; } - if (GDMonoUtils::Marshal::generic_ienumerable_is_assignable_from(reftype)) { - return Variant::ARRAY; - } - - if (type_class->implements_interface(CACHED_CLASS(System_Collections_IEnumerable))) { + // ICollection or IEnumerable + if (p_type.type_class == CACHED_CLASS(System_Collections_ICollection) || + p_type.type_class == CACHED_CLASS(System_Collections_IEnumerable)) { return Variant::ARRAY; } } break; @@ -214,27 +209,33 @@ Variant::Type managed_to_variant_type(const ManagedType &p_type, bool *r_nil_is_ case MONO_TYPE_GENERICINST: { MonoReflectionType *reftype = mono_type_get_object(mono_domain_get(), p_type.type_class->get_mono_type()); + // Godot.Collections.Dictionary<TKey, TValue> if (GDMonoUtils::Marshal::type_is_generic_dictionary(reftype)) { return Variant::DICTIONARY; } + // Godot.Collections.Array<T> if (GDMonoUtils::Marshal::type_is_generic_array(reftype)) { return Variant::ARRAY; } - // The order in which we check the following interfaces is very important (dictionaries and generics first) - - if (GDMonoUtils::Marshal::generic_idictionary_is_assignable_from(reftype)) - return Variant::DICTIONARY; - - if (p_type.type_class->implements_interface(CACHED_CLASS(System_Collections_IDictionary))) { + // System.Collections.Generic.Dictionary<TKey, TValue> + if (GDMonoUtils::Marshal::type_is_system_generic_dictionary(reftype)) { return Variant::DICTIONARY; } - if (GDMonoUtils::Marshal::generic_ienumerable_is_assignable_from(reftype)) + // System.Collections.Generic.List<T> + if (GDMonoUtils::Marshal::type_is_system_generic_list(reftype)) { return Variant::ARRAY; + } - if (p_type.type_class->implements_interface(CACHED_CLASS(System_Collections_IEnumerable))) { + // IDictionary<TKey, TValue> + if (GDMonoUtils::Marshal::type_is_generic_idictionary(reftype)) { + return Variant::DICTIONARY; + } + + // ICollection<T> or IEnumerable<T> + if (GDMonoUtils::Marshal::type_is_generic_icollection(reftype) || GDMonoUtils::Marshal::type_is_generic_ienumerable(reftype)) { return Variant::ARRAY; } } break; @@ -252,10 +253,20 @@ Variant::Type managed_to_variant_type(const ManagedType &p_type, bool *r_nil_is_ bool try_get_array_element_type(const ManagedType &p_array_type, ManagedType &r_elem_type) { switch (p_array_type.type_encoding) { + case MONO_TYPE_ARRAY: + case MONO_TYPE_SZARRAY: { + MonoArrayType *array_type = mono_type_get_array_type(p_array_type.type_class->get_mono_type()); + GDMonoClass *array_type_class = GDMono::get_singleton()->get_class(array_type->eklass); + r_elem_type = ManagedType::from_class(array_type_class); + return true; + } break; case MONO_TYPE_GENERICINST: { MonoReflectionType *array_reftype = mono_type_get_object(mono_domain_get(), p_array_type.type_class->get_mono_type()); - if (GDMonoUtils::Marshal::type_is_generic_array(array_reftype)) { + if (GDMonoUtils::Marshal::type_is_generic_array(array_reftype) || + GDMonoUtils::Marshal::type_is_system_generic_list(array_reftype) || + GDMonoUtils::Marshal::type_is_generic_icollection(array_reftype) || + GDMonoUtils::Marshal::type_is_generic_ienumerable(array_reftype)) { MonoReflectionType *elem_reftype; GDMonoUtils::Marshal::array_get_element_type(array_reftype, &elem_reftype); @@ -263,12 +274,6 @@ bool try_get_array_element_type(const ManagedType &p_array_type, ManagedType &r_ r_elem_type = ManagedType::from_reftype(elem_reftype); return true; } - - MonoReflectionType *elem_reftype; - if (GDMonoUtils::Marshal::generic_ienumerable_is_assignable_from(array_reftype, &elem_reftype)) { - r_elem_type = ManagedType::from_reftype(elem_reftype); - return true; - } } break; default: { } break; @@ -282,7 +287,9 @@ bool try_get_dictionary_key_value_types(const ManagedType &p_dictionary_type, Ma case MONO_TYPE_GENERICINST: { MonoReflectionType *dict_reftype = mono_type_get_object(mono_domain_get(), p_dictionary_type.type_class->get_mono_type()); - if (GDMonoUtils::Marshal::type_is_generic_dictionary(dict_reftype)) { + if (GDMonoUtils::Marshal::type_is_generic_dictionary(dict_reftype) || + GDMonoUtils::Marshal::type_is_system_generic_dictionary(dict_reftype) || + GDMonoUtils::Marshal::type_is_generic_idictionary(dict_reftype)) { MonoReflectionType *key_reftype; MonoReflectionType *value_reftype; @@ -292,13 +299,6 @@ bool try_get_dictionary_key_value_types(const ManagedType &p_dictionary_type, Ma r_value_type = ManagedType::from_reftype(value_reftype); return true; } - - MonoReflectionType *key_reftype, *value_reftype; - if (GDMonoUtils::Marshal::generic_idictionary_is_assignable_from(dict_reftype, &key_reftype, &value_reftype)) { - r_key_type = ManagedType::from_reftype(key_reftype); - r_value_type = ManagedType::from_reftype(value_reftype); - return true; - } } break; default: { } break; @@ -577,6 +577,10 @@ MonoObject *variant_to_mono_object(const Variant *p_var, const ManagedType &p_ty if (array_type->eklass == CACHED_CLASS_RAW(Color)) return (MonoObject *)PackedColorArray_to_mono_array(p_var->operator PackedColorArray()); + GDMonoClass *array_type_class = GDMono::get_singleton()->get_class(array_type->eklass); + if (CACHED_CLASS(GodotObject)->is_assignable_from(array_type_class)) + return (MonoObject *)Array_to_mono_array(p_var->operator Array(), array_type_class); + ERR_FAIL_V_MSG(nullptr, "Attempted to convert Variant to a managed array of unmarshallable element type."); } break; @@ -600,41 +604,17 @@ MonoObject *variant_to_mono_object(const Variant *p_var, const ManagedType &p_ty return GDMonoUtils::create_managed_from(p_var->operator RID()); } - if (CACHED_CLASS(Dictionary) == type_class) { + // Godot.Collections.Dictionary or IDictionary + if (CACHED_CLASS(Dictionary) == type_class || CACHED_CLASS(System_Collections_IDictionary) == type_class) { return GDMonoUtils::create_managed_from(p_var->operator Dictionary(), CACHED_CLASS(Dictionary)); } - if (CACHED_CLASS(Array) == type_class) { + // Godot.Collections.Array or ICollection or IEnumerable + if (CACHED_CLASS(Array) == type_class || + CACHED_CLASS(System_Collections_ICollection) == type_class || + CACHED_CLASS(System_Collections_IEnumerable) == type_class) { return GDMonoUtils::create_managed_from(p_var->operator Array(), CACHED_CLASS(Array)); } - - // The order in which we check the following interfaces is very important (dictionaries and generics first) - - MonoReflectionType *reftype = mono_type_get_object(mono_domain_get(), type_class->get_mono_type()); - - MonoReflectionType *key_reftype, *value_reftype; - if (GDMonoUtils::Marshal::generic_idictionary_is_assignable_from(reftype, &key_reftype, &value_reftype)) { - return GDMonoUtils::create_managed_from(p_var->operator Dictionary(), - GDMonoUtils::Marshal::make_generic_dictionary_type(key_reftype, value_reftype)); - } - - if (type_class->implements_interface(CACHED_CLASS(System_Collections_IDictionary))) { - return GDMonoUtils::create_managed_from(p_var->operator Dictionary(), CACHED_CLASS(Dictionary)); - } - - MonoReflectionType *elem_reftype; - if (GDMonoUtils::Marshal::generic_ienumerable_is_assignable_from(reftype, &elem_reftype)) { - return GDMonoUtils::create_managed_from(p_var->operator Array(), - GDMonoUtils::Marshal::make_generic_array_type(elem_reftype)); - } - - if (type_class->implements_interface(CACHED_CLASS(System_Collections_IEnumerable))) { - if (GDMonoCache::tools_godot_api_check()) { - return GDMonoUtils::create_managed_from(p_var->operator Array(), CACHED_CLASS(Array)); - } else { - return (MonoObject *)GDMonoMarshal::Array_to_mono_array(p_var->operator Array()); - } - } } break; case MONO_TYPE_OBJECT: { // Variant @@ -755,38 +735,48 @@ MonoObject *variant_to_mono_object(const Variant *p_var, const ManagedType &p_ty case MONO_TYPE_GENERICINST: { MonoReflectionType *reftype = mono_type_get_object(mono_domain_get(), p_type.type_class->get_mono_type()); + // Godot.Collections.Dictionary<TKey, TValue> if (GDMonoUtils::Marshal::type_is_generic_dictionary(reftype)) { return GDMonoUtils::create_managed_from(p_var->operator Dictionary(), p_type.type_class); } + // Godot.Collections.Array<T> if (GDMonoUtils::Marshal::type_is_generic_array(reftype)) { return GDMonoUtils::create_managed_from(p_var->operator Array(), p_type.type_class); } - // The order in which we check the following interfaces is very important (dictionaries and generics first) - - MonoReflectionType *key_reftype, *value_reftype; - if (GDMonoUtils::Marshal::generic_idictionary_is_assignable_from(reftype, &key_reftype, &value_reftype)) { - return GDMonoUtils::create_managed_from(p_var->operator Dictionary(), - GDMonoUtils::Marshal::make_generic_dictionary_type(key_reftype, value_reftype)); + // System.Collections.Generic.Dictionary<TKey, TValue> + if (GDMonoUtils::Marshal::type_is_system_generic_dictionary(reftype)) { + MonoReflectionType *key_reftype = nullptr; + MonoReflectionType *value_reftype = nullptr; + GDMonoUtils::Marshal::dictionary_get_key_value_types(reftype, &key_reftype, &value_reftype); + return Dictionary_to_system_generic_dict(p_var->operator Dictionary(), p_type.type_class, key_reftype, value_reftype); } - if (p_type.type_class->implements_interface(CACHED_CLASS(System_Collections_IDictionary))) { - return GDMonoUtils::create_managed_from(p_var->operator Dictionary(), CACHED_CLASS(Dictionary)); + // System.Collections.Generic.List<T> + if (GDMonoUtils::Marshal::type_is_system_generic_list(reftype)) { + MonoReflectionType *elem_reftype = nullptr; + GDMonoUtils::Marshal::array_get_element_type(reftype, &elem_reftype); + return Array_to_system_generic_list(p_var->operator Array(), p_type.type_class, elem_reftype); } - MonoReflectionType *elem_reftype; - if (GDMonoUtils::Marshal::generic_ienumerable_is_assignable_from(reftype, &elem_reftype)) { - return GDMonoUtils::create_managed_from(p_var->operator Array(), - GDMonoUtils::Marshal::make_generic_array_type(elem_reftype)); + // IDictionary<TKey, TValue> + if (GDMonoUtils::Marshal::type_is_generic_idictionary(reftype)) { + MonoReflectionType *key_reftype; + MonoReflectionType *value_reftype; + GDMonoUtils::Marshal::dictionary_get_key_value_types(reftype, &key_reftype, &value_reftype); + GDMonoClass *godot_dict_class = GDMonoUtils::Marshal::make_generic_dictionary_type(key_reftype, value_reftype); + + return GDMonoUtils::create_managed_from(p_var->operator Dictionary(), godot_dict_class); } - if (p_type.type_class->implements_interface(CACHED_CLASS(System_Collections_IEnumerable))) { - if (GDMonoCache::tools_godot_api_check()) { - return GDMonoUtils::create_managed_from(p_var->operator Array(), CACHED_CLASS(Array)); - } else { - return (MonoObject *)GDMonoMarshal::Array_to_mono_array(p_var->operator Array()); - } + // ICollection<T> or IEnumerable<T> + if (GDMonoUtils::Marshal::type_is_generic_icollection(reftype) || GDMonoUtils::Marshal::type_is_generic_ienumerable(reftype)) { + MonoReflectionType *elem_reftype; + GDMonoUtils::Marshal::array_get_element_type(reftype, &elem_reftype); + GDMonoClass *godot_array_class = GDMonoUtils::Marshal::make_generic_array_type(elem_reftype); + + return GDMonoUtils::create_managed_from(p_var->operator Array(), godot_array_class); } } break; } break; @@ -922,6 +912,10 @@ Variant mono_object_to_variant_impl(MonoObject *p_obj, const ManagedType &p_type if (array_type->eklass == CACHED_CLASS_RAW(Color)) return mono_array_to_PackedColorArray((MonoArray *)p_obj); + GDMonoClass *array_type_class = GDMono::get_singleton()->get_class(array_type->eklass); + if (CACHED_CLASS(GodotObject)->is_assignable_from(array_type_class)) + return mono_array_to_Array((MonoArray *)p_obj); + if (p_fail_with_err) { ERR_FAIL_V_MSG(Variant(), "Attempted to convert a managed array of unmarshallable element type to Variant."); } else { @@ -957,44 +951,27 @@ Variant mono_object_to_variant_impl(MonoObject *p_obj, const ManagedType &p_type return ptr ? Variant(*ptr) : Variant(); } - if (CACHED_CLASS(Array) == type_class) { + // Godot.Collections.Dictionary + if (CACHED_CLASS(Dictionary) == type_class) { MonoException *exc = nullptr; - Array *ptr = CACHED_METHOD_THUNK(Array, GetPtr).invoke(p_obj, &exc); + Dictionary *ptr = CACHED_METHOD_THUNK(Dictionary, GetPtr).invoke(p_obj, &exc); UNHANDLED_EXCEPTION(exc); return ptr ? Variant(*ptr) : Variant(); } - if (CACHED_CLASS(Dictionary) == type_class) { + // Godot.Collections.Array + if (CACHED_CLASS(Array) == type_class) { MonoException *exc = nullptr; - Dictionary *ptr = CACHED_METHOD_THUNK(Dictionary, GetPtr).invoke(p_obj, &exc); + Array *ptr = CACHED_METHOD_THUNK(Array, GetPtr).invoke(p_obj, &exc); UNHANDLED_EXCEPTION(exc); return ptr ? Variant(*ptr) : Variant(); } - - // The order in which we check the following interfaces is very important (dictionaries and generics first) - - MonoReflectionType *reftype = mono_type_get_object(mono_domain_get(), type_class->get_mono_type()); - - if (GDMonoUtils::Marshal::generic_idictionary_is_assignable_from(reftype)) { - return GDMonoUtils::Marshal::generic_idictionary_to_dictionary(p_obj); - } - - if (type_class->implements_interface(CACHED_CLASS(System_Collections_IDictionary))) { - return GDMonoUtils::Marshal::idictionary_to_dictionary(p_obj); - } - - if (GDMonoUtils::Marshal::generic_ienumerable_is_assignable_from(reftype)) { - return GDMonoUtils::Marshal::enumerable_to_array(p_obj); - } - - if (type_class->implements_interface(CACHED_CLASS(System_Collections_IEnumerable))) { - return GDMonoUtils::Marshal::enumerable_to_array(p_obj); - } } break; case MONO_TYPE_GENERICINST: { MonoReflectionType *reftype = mono_type_get_object(mono_domain_get(), p_type.type_class->get_mono_type()); + // Godot.Collections.Dictionary<TKey, TValue> if (GDMonoUtils::Marshal::type_is_generic_dictionary(reftype)) { MonoException *exc = nullptr; MonoObject *ret = p_type.type_class->get_method("GetPtr")->invoke(p_obj, &exc); @@ -1002,6 +979,7 @@ Variant mono_object_to_variant_impl(MonoObject *p_obj, const ManagedType &p_type return *unbox<Dictionary *>(ret); } + // Godot.Collections.Array<T> if (GDMonoUtils::Marshal::type_is_generic_array(reftype)) { MonoException *exc = nullptr; MonoObject *ret = p_type.type_class->get_method("GetPtr")->invoke(p_obj, &exc); @@ -1009,22 +987,19 @@ Variant mono_object_to_variant_impl(MonoObject *p_obj, const ManagedType &p_type return *unbox<Array *>(ret); } - // The order in which we check the following interfaces is very important (dictionaries and generics first) - - if (GDMonoUtils::Marshal::generic_idictionary_is_assignable_from(reftype)) { - return GDMonoUtils::Marshal::generic_idictionary_to_dictionary(p_obj); - } - - if (p_type.type_class->implements_interface(CACHED_CLASS(System_Collections_IDictionary))) { - return GDMonoUtils::Marshal::idictionary_to_dictionary(p_obj); + // System.Collections.Generic.Dictionary<TKey, TValue> + if (GDMonoUtils::Marshal::type_is_system_generic_dictionary(reftype)) { + MonoReflectionType *key_reftype = nullptr; + MonoReflectionType *value_reftype = nullptr; + GDMonoUtils::Marshal::dictionary_get_key_value_types(reftype, &key_reftype, &value_reftype); + return system_generic_dict_to_Dictionary(p_obj, p_type.type_class, key_reftype, value_reftype); } - if (GDMonoUtils::Marshal::generic_ienumerable_is_assignable_from(reftype)) { - return GDMonoUtils::Marshal::enumerable_to_array(p_obj); - } - - if (p_type.type_class->implements_interface(CACHED_CLASS(System_Collections_IEnumerable))) { - return GDMonoUtils::Marshal::enumerable_to_array(p_obj); + // System.Collections.Generic.List<T> + if (GDMonoUtils::Marshal::type_is_system_generic_list(reftype)) { + MonoReflectionType *elem_reftype = nullptr; + GDMonoUtils::Marshal::array_get_element_type(reftype, &elem_reftype); + return system_generic_list_to_Array(p_obj, p_type.type_class, elem_reftype); } } break; } @@ -1081,6 +1056,80 @@ String mono_object_to_variant_string(MonoObject *p_obj, MonoException **r_exc) { } } +MonoObject *Dictionary_to_system_generic_dict(const Dictionary &p_dict, GDMonoClass *p_class, MonoReflectionType *p_key_reftype, MonoReflectionType *p_value_reftype) { + String ctor_desc = ":.ctor(System.Collections.Generic.IDictionary`2<" + GDMonoUtils::get_type_desc(p_key_reftype) + + ", " + GDMonoUtils::get_type_desc(p_value_reftype) + ">)"; + GDMonoMethod *ctor = p_class->get_method_with_desc(ctor_desc, true); + CRASH_COND(ctor == nullptr); + + MonoObject *mono_object = mono_object_new(mono_domain_get(), p_class->get_mono_ptr()); + ERR_FAIL_NULL_V(mono_object, nullptr); + + GDMonoClass *godot_dict_class = GDMonoUtils::Marshal::make_generic_dictionary_type(p_key_reftype, p_value_reftype); + MonoObject *godot_dict = GDMonoUtils::create_managed_from(p_dict, godot_dict_class); + + void *ctor_args[1] = { godot_dict }; + + MonoException *exc = nullptr; + ctor->invoke_raw(mono_object, ctor_args, &exc); + UNHANDLED_EXCEPTION(exc); + + return mono_object; +} + +Dictionary system_generic_dict_to_Dictionary(MonoObject *p_obj, [[maybe_unused]] GDMonoClass *p_class, MonoReflectionType *p_key_reftype, MonoReflectionType *p_value_reftype) { + GDMonoClass *godot_dict_class = GDMonoUtils::Marshal::make_generic_dictionary_type(p_key_reftype, p_value_reftype); + String ctor_desc = ":.ctor(System.Collections.Generic.IDictionary`2<" + GDMonoUtils::get_type_desc(p_key_reftype) + + ", " + GDMonoUtils::get_type_desc(p_value_reftype) + ">)"; + GDMonoMethod *godot_dict_ctor = godot_dict_class->get_method_with_desc(ctor_desc, true); + CRASH_COND(godot_dict_ctor == nullptr); + + MonoObject *godot_dict = mono_object_new(mono_domain_get(), godot_dict_class->get_mono_ptr()); + ERR_FAIL_NULL_V(godot_dict, Dictionary()); + + void *ctor_args[1] = { p_obj }; + + MonoException *exc = nullptr; + godot_dict_ctor->invoke_raw(godot_dict, ctor_args, &exc); + UNHANDLED_EXCEPTION(exc); + + exc = nullptr; + MonoObject *ret = godot_dict_class->get_method("GetPtr")->invoke(godot_dict, &exc); + UNHANDLED_EXCEPTION(exc); + + return *unbox<Dictionary *>(ret); +} + +MonoObject *Array_to_system_generic_list(const Array &p_array, GDMonoClass *p_class, MonoReflectionType *p_elem_reftype) { + GDMonoClass *elem_class = ManagedType::from_reftype(p_elem_reftype).type_class; + + String ctor_desc = ":.ctor(System.Collections.Generic.IEnumerable`1<" + elem_class->get_type_desc() + ">)"; + GDMonoMethod *ctor = p_class->get_method_with_desc(ctor_desc, true); + CRASH_COND(ctor == nullptr); + + MonoObject *mono_object = mono_object_new(mono_domain_get(), p_class->get_mono_ptr()); + ERR_FAIL_NULL_V(mono_object, nullptr); + + void *ctor_args[1] = { Array_to_mono_array(p_array, elem_class) }; + + MonoException *exc = nullptr; + ctor->invoke_raw(mono_object, ctor_args, &exc); + UNHANDLED_EXCEPTION(exc); + + return mono_object; +} + +Array system_generic_list_to_Array(MonoObject *p_obj, GDMonoClass *p_class, [[maybe_unused]] MonoReflectionType *p_elem_reftype) { + GDMonoMethod *to_array = p_class->get_method("ToArray", 0); + CRASH_COND(to_array == nullptr); + + MonoException *exc = nullptr; + MonoArray *mono_array = (MonoArray *)to_array->invoke_raw(p_obj, nullptr, &exc); + UNHANDLED_EXCEPTION(exc); + + return mono_array_to_Array(mono_array); +} + MonoArray *Array_to_mono_array(const Array &p_array) { int length = p_array.size(); MonoArray *ret = mono_array_new(mono_domain_get(), CACHED_CLASS_RAW(MonoObject), length); @@ -1093,6 +1142,18 @@ MonoArray *Array_to_mono_array(const Array &p_array) { return ret; } +MonoArray *Array_to_mono_array(const Array &p_array, GDMonoClass *p_array_type_class) { + int length = p_array.size(); + MonoArray *ret = mono_array_new(mono_domain_get(), p_array_type_class->get_mono_ptr(), length); + + for (int i = 0; i < length; i++) { + MonoObject *boxed = variant_to_mono_object(p_array[i]); + mono_array_setref(ret, i, boxed); + } + + return ret; +} + Array mono_array_to_Array(MonoArray *p_array) { Array ret; if (!p_array) diff --git a/modules/mono/mono_gd/gd_mono_marshal.h b/modules/mono/mono_gd/gd_mono_marshal.h index 8b405291a7..f2d887e6d6 100644 --- a/modules/mono/mono_gd/gd_mono_marshal.h +++ b/modules/mono/mono_gd/gd_mono_marshal.h @@ -123,9 +123,18 @@ Variant mono_object_to_variant_no_err(MonoObject *p_obj, const ManagedType &p_ty /// If the MonoObject* cannot be converted to Variant, then 'ToString()' is called instead. String mono_object_to_variant_string(MonoObject *p_obj, MonoException **r_exc); +// System.Collections.Generic + +MonoObject *Dictionary_to_system_generic_dict(const Dictionary &p_dict, GDMonoClass *p_class, MonoReflectionType *p_key_reftype, MonoReflectionType *p_value_reftype); +Dictionary system_generic_dict_to_Dictionary(MonoObject *p_obj, GDMonoClass *p_class, MonoReflectionType *p_key_reftype, MonoReflectionType *p_value_reftype); + +MonoObject *Array_to_system_generic_list(const Array &p_array, GDMonoClass *p_class, MonoReflectionType *p_elem_reftype); +Array system_generic_list_to_Array(MonoObject *p_obj, GDMonoClass *p_class, MonoReflectionType *p_elem_reftype); + // Array MonoArray *Array_to_mono_array(const Array &p_array); +MonoArray *Array_to_mono_array(const Array &p_array, GDMonoClass *p_array_type_class); Array mono_array_to_Array(MonoArray *p_array); // PackedInt32Array diff --git a/modules/mono/mono_gd/gd_mono_method.cpp b/modules/mono/mono_gd/gd_mono_method.cpp index c8cc5247c6..432aa74a6f 100644 --- a/modules/mono/mono_gd/gd_mono_method.cpp +++ b/modules/mono/mono_gd/gd_mono_method.cpp @@ -30,13 +30,14 @@ #include "gd_mono_method.h" +#include <mono/metadata/attrdefs.h> +#include <mono/metadata/debug-helpers.h> + #include "gd_mono_cache.h" #include "gd_mono_class.h" #include "gd_mono_marshal.h" #include "gd_mono_utils.h" -#include <mono/metadata/attrdefs.h> - void GDMonoMethod::_update_signature() { // Apparently MonoMethodSignature needs not to be freed. // mono_method_signature caches the result, we don't need to cache it ourselves. diff --git a/modules/mono/mono_gd/gd_mono_utils.cpp b/modules/mono/mono_gd/gd_mono_utils.cpp index 00119ced88..f9d492dabb 100644 --- a/modules/mono/mono_gd/gd_mono_utils.cpp +++ b/modules/mono/mono_gd/gd_mono_utils.cpp @@ -30,6 +30,7 @@ #include "gd_mono_utils.h" +#include <mono/metadata/debug-helpers.h> #include <mono/metadata/exception.h> #include "core/debugger/engine_debugger.h" @@ -358,6 +359,14 @@ MonoDomain *create_domain(const String &p_friendly_name) { return domain; } +String get_type_desc(MonoType *p_type) { + return mono_type_full_name(p_type); +} + +String get_type_desc(MonoReflectionType *p_reftype) { + return get_type_desc(mono_reflection_type_get_type(p_reftype)); +} + String get_exception_name_and_message(MonoException *p_exc) { String res; @@ -584,75 +593,56 @@ bool type_is_generic_dictionary(MonoReflectionType *p_reftype) { return (bool)res; } -void array_get_element_type(MonoReflectionType *p_array_reftype, MonoReflectionType **r_elem_reftype) { - MonoException *exc = nullptr; - CACHED_METHOD_THUNK(MarshalUtils, ArrayGetElementType).invoke(p_array_reftype, r_elem_reftype, &exc); - UNHANDLED_EXCEPTION(exc); -} - -void dictionary_get_key_value_types(MonoReflectionType *p_dict_reftype, MonoReflectionType **r_key_reftype, MonoReflectionType **r_value_reftype) { - MonoException *exc = nullptr; - CACHED_METHOD_THUNK(MarshalUtils, DictionaryGetKeyValueTypes).invoke(p_dict_reftype, r_key_reftype, r_value_reftype, &exc); - UNHANDLED_EXCEPTION(exc); -} - -bool generic_ienumerable_is_assignable_from(MonoReflectionType *p_reftype) { +bool type_is_system_generic_list(MonoReflectionType *p_reftype) { NO_GLUE_RET(false); MonoException *exc = nullptr; - MonoBoolean res = CACHED_METHOD_THUNK(MarshalUtils, GenericIEnumerableIsAssignableFromType).invoke(p_reftype, &exc); + MonoBoolean res = CACHED_METHOD_THUNK(MarshalUtils, TypeIsSystemGenericList).invoke(p_reftype, &exc); UNHANDLED_EXCEPTION(exc); return (bool)res; } -bool generic_idictionary_is_assignable_from(MonoReflectionType *p_reftype) { +bool type_is_system_generic_dictionary(MonoReflectionType *p_reftype) { NO_GLUE_RET(false); MonoException *exc = nullptr; - MonoBoolean res = CACHED_METHOD_THUNK(MarshalUtils, GenericIDictionaryIsAssignableFromType).invoke(p_reftype, &exc); + MonoBoolean res = CACHED_METHOD_THUNK(MarshalUtils, TypeIsSystemGenericDictionary).invoke(p_reftype, &exc); UNHANDLED_EXCEPTION(exc); return (bool)res; } -bool generic_ienumerable_is_assignable_from(MonoReflectionType *p_reftype, MonoReflectionType **r_elem_reftype) { +bool type_is_generic_ienumerable(MonoReflectionType *p_reftype) { NO_GLUE_RET(false); MonoException *exc = nullptr; - MonoBoolean res = CACHED_METHOD_THUNK(MarshalUtils, GenericIEnumerableIsAssignableFromType_with_info).invoke(p_reftype, r_elem_reftype, &exc); + MonoBoolean res = CACHED_METHOD_THUNK(MarshalUtils, TypeIsGenericIEnumerable).invoke(p_reftype, &exc); UNHANDLED_EXCEPTION(exc); return (bool)res; } -bool generic_idictionary_is_assignable_from(MonoReflectionType *p_reftype, MonoReflectionType **r_key_reftype, MonoReflectionType **r_value_reftype) { +bool type_is_generic_icollection(MonoReflectionType *p_reftype) { NO_GLUE_RET(false); MonoException *exc = nullptr; - MonoBoolean res = CACHED_METHOD_THUNK(MarshalUtils, GenericIDictionaryIsAssignableFromType_with_info).invoke(p_reftype, r_key_reftype, r_value_reftype, &exc); + MonoBoolean res = CACHED_METHOD_THUNK(MarshalUtils, TypeIsGenericICollection).invoke(p_reftype, &exc); UNHANDLED_EXCEPTION(exc); return (bool)res; } -Array enumerable_to_array(MonoObject *p_enumerable) { - NO_GLUE_RET(Array()); - Array result; +bool type_is_generic_idictionary(MonoReflectionType *p_reftype) { + NO_GLUE_RET(false); MonoException *exc = nullptr; - CACHED_METHOD_THUNK(MarshalUtils, EnumerableToArray).invoke(p_enumerable, &result, &exc); + MonoBoolean res = CACHED_METHOD_THUNK(MarshalUtils, TypeIsGenericIDictionary).invoke(p_reftype, &exc); UNHANDLED_EXCEPTION(exc); - return result; + return (bool)res; } -Dictionary idictionary_to_dictionary(MonoObject *p_idictionary) { - NO_GLUE_RET(Dictionary()); - Dictionary result; +void array_get_element_type(MonoReflectionType *p_array_reftype, MonoReflectionType **r_elem_reftype) { MonoException *exc = nullptr; - CACHED_METHOD_THUNK(MarshalUtils, IDictionaryToDictionary).invoke(p_idictionary, &result, &exc); + CACHED_METHOD_THUNK(MarshalUtils, ArrayGetElementType).invoke(p_array_reftype, r_elem_reftype, &exc); UNHANDLED_EXCEPTION(exc); - return result; } -Dictionary generic_idictionary_to_dictionary(MonoObject *p_generic_idictionary) { - NO_GLUE_RET(Dictionary()); - Dictionary result; +void dictionary_get_key_value_types(MonoReflectionType *p_dict_reftype, MonoReflectionType **r_key_reftype, MonoReflectionType **r_value_reftype) { MonoException *exc = nullptr; - CACHED_METHOD_THUNK(MarshalUtils, GenericIDictionaryToDictionary).invoke(p_generic_idictionary, &result, &exc); + CACHED_METHOD_THUNK(MarshalUtils, DictionaryGetKeyValueTypes).invoke(p_dict_reftype, r_key_reftype, r_value_reftype, &exc); UNHANDLED_EXCEPTION(exc); - return result; } GDMonoClass *make_generic_array_type(MonoReflectionType *p_elem_reftype) { diff --git a/modules/mono/mono_gd/gd_mono_utils.h b/modules/mono/mono_gd/gd_mono_utils.h index b850e1be9b..e3011ade5d 100644 --- a/modules/mono/mono_gd/gd_mono_utils.h +++ b/modules/mono/mono_gd/gd_mono_utils.h @@ -52,22 +52,18 @@ namespace Marshal { bool type_is_generic_array(MonoReflectionType *p_reftype); bool type_is_generic_dictionary(MonoReflectionType *p_reftype); +bool type_is_system_generic_list(MonoReflectionType *p_reftype); +bool type_is_system_generic_dictionary(MonoReflectionType *p_reftype); +bool type_is_generic_ienumerable(MonoReflectionType *p_reftype); +bool type_is_generic_icollection(MonoReflectionType *p_reftype); +bool type_is_generic_idictionary(MonoReflectionType *p_reftype); void array_get_element_type(MonoReflectionType *p_array_reftype, MonoReflectionType **r_elem_reftype); void dictionary_get_key_value_types(MonoReflectionType *p_dict_reftype, MonoReflectionType **r_key_reftype, MonoReflectionType **r_value_reftype); -bool generic_ienumerable_is_assignable_from(MonoReflectionType *p_reftype); -bool generic_idictionary_is_assignable_from(MonoReflectionType *p_reftype); -bool generic_ienumerable_is_assignable_from(MonoReflectionType *p_reftype, MonoReflectionType **r_elem_reftype); -bool generic_idictionary_is_assignable_from(MonoReflectionType *p_reftype, MonoReflectionType **r_key_reftype, MonoReflectionType **r_value_reftype); - GDMonoClass *make_generic_array_type(MonoReflectionType *p_elem_reftype); GDMonoClass *make_generic_dictionary_type(MonoReflectionType *p_key_reftype, MonoReflectionType *p_value_reftype); -Array enumerable_to_array(MonoObject *p_enumerable); -Dictionary idictionary_to_dictionary(MonoObject *p_idictionary); -Dictionary generic_idictionary_to_dictionary(MonoObject *p_generic_idictionary); - } // namespace Marshal _FORCE_INLINE_ void hash_combine(uint32_t &p_hash, const uint32_t &p_with_hash) { @@ -115,6 +111,9 @@ MonoObject *create_managed_from(const Dictionary &p_from, GDMonoClass *p_class); MonoDomain *create_domain(const String &p_friendly_name); +String get_type_desc(MonoType *p_type); +String get_type_desc(MonoReflectionType *p_reftype); + String get_exception_name_and_message(MonoException *p_exc); void set_exception_message(MonoException *p_exc, String message); diff --git a/modules/opensimplex/noise_texture.cpp b/modules/opensimplex/noise_texture.cpp index ec67030a65..2018f90e9f 100644 --- a/modules/opensimplex/noise_texture.cpp +++ b/modules/opensimplex/noise_texture.cpp @@ -137,14 +137,19 @@ void NoiseTexture::_queue_update() { Ref<Image> NoiseTexture::_generate_texture() { - if (noise.is_null()) return Ref<Image>(); + // Prevent memdelete due to unref() on other thread. + Ref<OpenSimplexNoise> ref_noise = noise; + + if (ref_noise.is_null()) { + return Ref<Image>(); + } Ref<Image> image; if (seamless) { - image = noise->get_seamless_image(size.x); + image = ref_noise->get_seamless_image(size.x); } else { - image = noise->get_image(size.x, size.y); + image = ref_noise->get_image(size.x, size.y); } if (as_normalmap) { diff --git a/modules/pvr/texture_loader_pvr.cpp b/modules/pvr/texture_loader_pvr.cpp index 10d4d71f5e..a8e8a9a2f1 100644 --- a/modules/pvr/texture_loader_pvr.cpp +++ b/modules/pvr/texture_loader_pvr.cpp @@ -51,7 +51,7 @@ enum PVRFLags { }; -RES ResourceFormatPVR::load(const String &p_path, const String &p_original_path, Error *r_error, bool p_use_sub_threads, float *r_progress) { +RES ResourceFormatPVR::load(const String &p_path, const String &p_original_path, Error *r_error, bool p_use_sub_threads, float *r_progress, bool p_no_cache) { if (r_error) *r_error = ERR_CANT_OPEN; diff --git a/modules/pvr/texture_loader_pvr.h b/modules/pvr/texture_loader_pvr.h index 642323db35..07ef129689 100644 --- a/modules/pvr/texture_loader_pvr.h +++ b/modules/pvr/texture_loader_pvr.h @@ -36,7 +36,7 @@ class ResourceFormatPVR : public ResourceFormatLoader { public: - virtual RES load(const String &p_path, const String &p_original_path, Error *r_error = nullptr, bool p_use_sub_threads = false, float *r_progress = nullptr); + virtual RES load(const String &p_path, const String &p_original_path, Error *r_error = nullptr, bool p_use_sub_threads = false, float *r_progress = nullptr, bool p_no_cache = false); virtual void get_recognized_extensions(List<String> *p_extensions) const; virtual bool handles_type(const String &p_type) const; virtual String get_resource_type(const String &p_path) const; diff --git a/modules/theora/video_stream_theora.cpp b/modules/theora/video_stream_theora.cpp index e5fb6f996d..b9f276fb12 100644 --- a/modules/theora/video_stream_theora.cpp +++ b/modules/theora/video_stream_theora.cpp @@ -725,7 +725,7 @@ void VideoStreamTheora::_bind_methods() { //////////// -RES ResourceFormatLoaderTheora::load(const String &p_path, const String &p_original_path, Error *r_error, bool p_use_sub_threads, float *r_progress) { +RES ResourceFormatLoaderTheora::load(const String &p_path, const String &p_original_path, Error *r_error, bool p_use_sub_threads, float *r_progress, bool p_no_cache) { FileAccess *f = FileAccess::open(p_path, FileAccess::READ); if (!f) { diff --git a/modules/theora/video_stream_theora.h b/modules/theora/video_stream_theora.h index cd7bff7adb..f98368ed8b 100644 --- a/modules/theora/video_stream_theora.h +++ b/modules/theora/video_stream_theora.h @@ -187,7 +187,7 @@ public: class ResourceFormatLoaderTheora : public ResourceFormatLoader { public: - virtual RES load(const String &p_path, const String &p_original_path = "", Error *r_error = nullptr, bool p_use_sub_threads = false, float *r_progress = nullptr); + virtual RES load(const String &p_path, const String &p_original_path = "", Error *r_error = nullptr, bool p_use_sub_threads = false, float *r_progress = nullptr, bool p_no_cache = false); virtual void get_recognized_extensions(List<String> *p_extensions) const; virtual bool handles_type(const String &p_type) const; virtual String get_resource_type(const String &p_path) const; 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/modules/upnp/upnp.cpp b/modules/upnp/upnp.cpp index 856f4188aa..988bf3017d 100644 --- a/modules/upnp/upnp.cpp +++ b/modules/upnp/upnp.cpp @@ -44,9 +44,8 @@ bool UPNP::is_common_device(const String &dev) const { } int UPNP::discover(int timeout, int ttl, const String &device_filter) { - ERR_FAIL_COND_V(timeout < 0, UPNP_RESULT_INVALID_PARAM); - ERR_FAIL_COND_V(ttl < 0, UPNP_RESULT_INVALID_PARAM); - ERR_FAIL_COND_V(ttl > 255, UPNP_RESULT_INVALID_PARAM); + ERR_FAIL_COND_V_MSG(timeout < 0, UPNP_RESULT_INVALID_PARAM, "The response's wait time can't be negative."); + ERR_FAIL_COND_V_MSG(ttl < 0 || ttl > 255, UPNP_RESULT_INVALID_PARAM, "The time-to-live must be set between 0 and 255 (inclusive)."); devices.clear(); @@ -264,7 +263,7 @@ void UPNP::clear_devices() { } Ref<UPNPDevice> UPNP::get_gateway() const { - ERR_FAIL_COND_V(devices.size() < 1, nullptr); + ERR_FAIL_COND_V_MSG(devices.size() < 1, nullptr, "Couldn't find any UPNPDevices."); for (int i = 0; i < devices.size(); i++) { Ref<UPNPDevice> dev = get_device(i); diff --git a/modules/upnp/upnp_device.cpp b/modules/upnp/upnp_device.cpp index c21826d14d..40eb6106a0 100644 --- a/modules/upnp/upnp_device.cpp +++ b/modules/upnp/upnp_device.cpp @@ -35,7 +35,7 @@ #include <miniupnpc/upnpcommands.h> String UPNPDevice::query_external_address() const { - ERR_FAIL_COND_V(!is_valid_gateway(), ""); + ERR_FAIL_COND_V_MSG(!is_valid_gateway(), "", "The Internet Gateway Device must be valid."); char addr[16]; int i = UPNP_GetExternalIPAddress( @@ -43,17 +43,17 @@ String UPNPDevice::query_external_address() const { igd_service_type.utf8().get_data(), (char *)&addr); - ERR_FAIL_COND_V(i != UPNPCOMMAND_SUCCESS, ""); + ERR_FAIL_COND_V_MSG(i != UPNPCOMMAND_SUCCESS, "", "Couldn't get external IP address."); return String(addr); } int UPNPDevice::add_port_mapping(int port, int port_internal, String desc, String proto, int duration) const { - ERR_FAIL_COND_V(!is_valid_gateway(), UPNP::UPNP_RESULT_INVALID_GATEWAY); - ERR_FAIL_COND_V(port < 1 || port > 65535, UPNP::UPNP_RESULT_INVALID_PORT); - ERR_FAIL_COND_V(port_internal < 0 || port_internal > 65535, UPNP::UPNP_RESULT_INVALID_PORT); // Needs to allow 0 because 0 signifies "use external port as internal port" - ERR_FAIL_COND_V(proto != "UDP" && proto != "TCP", UPNP::UPNP_RESULT_INVALID_PROTOCOL); - ERR_FAIL_COND_V(duration < 0, UPNP::UPNP_RESULT_INVALID_DURATION); + ERR_FAIL_COND_V_MSG(!is_valid_gateway(), UPNP::UPNP_RESULT_INVALID_GATEWAY, "The Internet Gateway Device must be valid."); + ERR_FAIL_COND_V_MSG(port < 1 || port > 65535, UPNP::UPNP_RESULT_INVALID_PORT, "The port number must be set between 1 and 65535 (inclusive)."); + ERR_FAIL_COND_V_MSG(port_internal < 0 || port_internal > 65535, UPNP::UPNP_RESULT_INVALID_PORT, "The port number must be set between 0 and 65535 (inclusive)."); // Needs to allow 0 because 0 signifies "use external port as internal port" + ERR_FAIL_COND_V_MSG(proto != "UDP" && proto != "TCP", UPNP::UPNP_RESULT_INVALID_PROTOCOL, "The protocol must be either TCP or UDP."); + ERR_FAIL_COND_V_MSG(duration < 0, UPNP::UPNP_RESULT_INVALID_DURATION, "The port mapping's lease duration can't be negative."); if (port_internal < 1) { port_internal = port; @@ -70,14 +70,14 @@ int UPNPDevice::add_port_mapping(int port, int port_internal, String desc, Strin nullptr, // Remote host, always nullptr as IGDs don't support it duration > 0 ? itos(duration).utf8().get_data() : nullptr); - ERR_FAIL_COND_V(i != UPNPCOMMAND_SUCCESS, UPNP::upnp_result(i)); + ERR_FAIL_COND_V_MSG(i != UPNPCOMMAND_SUCCESS, UPNP::upnp_result(i), "Couldn't add port mapping."); return UPNP::UPNP_RESULT_SUCCESS; } int UPNPDevice::delete_port_mapping(int port, String proto) const { - ERR_FAIL_COND_V(port < 1 || port > 65535, UPNP::UPNP_RESULT_INVALID_PORT); - ERR_FAIL_COND_V(proto != "UDP" && proto != "TCP", UPNP::UPNP_RESULT_INVALID_PROTOCOL); + ERR_FAIL_COND_V_MSG(port < 1 || port > 65535, UPNP::UPNP_RESULT_INVALID_PORT, "The port number must be set between 1 and 65535 (inclusive)."); + ERR_FAIL_COND_V_MSG(proto != "UDP" && proto != "TCP", UPNP::UPNP_RESULT_INVALID_PROTOCOL, "The protocol must be either TCP or UDP."); int i = UPNP_DeletePortMapping( igd_control_url.utf8().get_data(), @@ -87,7 +87,7 @@ int UPNPDevice::delete_port_mapping(int port, String proto) const { nullptr // Remote host, always nullptr as IGDs don't support it ); - ERR_FAIL_COND_V(i != UPNPCOMMAND_SUCCESS, UPNP::upnp_result(i)); + ERR_FAIL_COND_V_MSG(i != UPNPCOMMAND_SUCCESS, UPNP::upnp_result(i), "Couldn't delete port mapping."); return UPNP::UPNP_RESULT_SUCCESS; } diff --git a/modules/visual_script/visual_script.cpp b/modules/visual_script/visual_script.cpp index b52dfe1733..fe1d82f977 100644 --- a/modules/visual_script/visual_script.cpp +++ b/modules/visual_script/visual_script.cpp @@ -727,6 +727,26 @@ void VisualScript::rename_variable(const StringName &p_name, const StringName &p variables[p_new_name] = variables[p_name]; variables.erase(p_name); + + List<StringName> funcs; + get_function_list(&funcs); + for (List<StringName>::Element *F = funcs.front(); F; F = F->next()) { // loop through all the functions + List<int> ids; + get_node_list(F->get(), &ids); + for (List<int>::Element *E = ids.front(); E; E = E->next()) { + Ref<VisualScriptVariableGet> nodeget = get_node(F->get(), E->get()); + if (nodeget.is_valid()) { + if (nodeget->get_variable() == p_name) + nodeget->set_variable(p_new_name); + } else { + Ref<VisualScriptVariableSet> nodeset = get_node(F->get(), E->get()); + if (nodeset.is_valid()) { + if (nodeset->get_variable() == p_name) + nodeset->set_variable(p_new_name); + } + } + } + } } void VisualScript::add_custom_signal(const StringName &p_name) { @@ -1440,6 +1460,10 @@ VisualScript::VisualScript() { is_tool_script = false; } +bool VisualScript::inherits_script(const Ref<Script> &p_script) const { + return this == p_script.ptr(); //there is no inheritance in visual scripts, so this is enough +} + StringName VisualScript::get_default_func() const { return StringName("f_312843592"); } diff --git a/modules/visual_script/visual_script.h b/modules/visual_script/visual_script.h index 29309aa156..c154e56703 100644 --- a/modules/visual_script/visual_script.h +++ b/modules/visual_script/visual_script.h @@ -272,6 +272,8 @@ protected: static void _bind_methods(); public: + bool inherits_script(const Ref<Script> &p_script) const; + // TODO: Remove it in future when breaking changes are acceptable StringName get_default_func() const; void add_function(const StringName &p_name); diff --git a/modules/visual_script/visual_script_builtin_funcs.cpp b/modules/visual_script/visual_script_builtin_funcs.cpp index 39d8f7c082..bb291b1cb6 100644 --- a/modules/visual_script/visual_script_builtin_funcs.cpp +++ b/modules/visual_script/visual_script_builtin_funcs.cpp @@ -506,10 +506,12 @@ PropertyInfo VisualScriptBuiltinFunc::get_output_value_port_info(int p_idx) cons case MATH_CEIL: { t = Variant::FLOAT; } break; - case MATH_POSMOD: - case MATH_ROUND: { + case MATH_POSMOD: { t = Variant::INT; } break; + case MATH_ROUND: { + t = Variant::FLOAT; + } break; case MATH_ABS: { t = Variant::NIL; } break; diff --git a/modules/visual_script/visual_script_editor.cpp b/modules/visual_script/visual_script_editor.cpp index 30522930c7..9a4076bec4 100644 --- a/modules/visual_script/visual_script_editor.cpp +++ b/modules/visual_script/visual_script_editor.cpp @@ -30,7 +30,7 @@ #include "visual_script_editor.h" -#include "core/input/input_filter.h" +#include "core/input/input.h" #include "core/object.h" #include "core/os/keyboard.h" #include "core/script_language.h" @@ -350,8 +350,11 @@ static Color _color_from_type(Variant::Type p_type, bool dark_theme = true) { case Variant::STRING: color = Color(0.42, 0.65, 0.93); break; case Variant::VECTOR2: color = Color(0.74, 0.57, 0.95); break; + case Variant::VECTOR2I: color = Color(0.74, 0.57, 0.95); break; case Variant::RECT2: color = Color(0.95, 0.57, 0.65); break; + case Variant::RECT2I: color = Color(0.95, 0.57, 0.65); break; case Variant::VECTOR3: color = Color(0.84, 0.49, 0.93); break; + case Variant::VECTOR3I: color = Color(0.84, 0.49, 0.93); break; case Variant::TRANSFORM2D: color = Color(0.77, 0.93, 0.41); break; case Variant::PLANE: color = Color(0.97, 0.44, 0.44); break; case Variant::QUAT: color = Color(0.93, 0.41, 0.64); break; @@ -389,8 +392,11 @@ static Color _color_from_type(Variant::Type p_type, bool dark_theme = true) { case Variant::STRING: color = Color(0.27, 0.56, 0.91); break; case Variant::VECTOR2: color = Color(0.68, 0.46, 0.93); break; + case Variant::VECTOR2I: color = Color(0.68, 0.46, 0.93); break; case Variant::RECT2: color = Color(0.93, 0.46, 0.56); break; + case Variant::RECT2I: color = Color(0.93, 0.46, 0.56); break; case Variant::VECTOR3: color = Color(0.86, 0.42, 0.93); break; + case Variant::VECTOR3I: color = Color(0.86, 0.42, 0.93); break; case Variant::TRANSFORM2D: color = Color(0.59, 0.81, 0.1); break; case Variant::PLANE: color = Color(0.97, 0.44, 0.44); break; case Variant::QUAT: color = Color(0.93, 0.41, 0.64); break; @@ -510,8 +516,11 @@ void VisualScriptEditor::_update_graph(int p_only_id) { Control::get_theme_icon("float", "EditorIcons"), Control::get_theme_icon("String", "EditorIcons"), Control::get_theme_icon("Vector2", "EditorIcons"), + Control::get_theme_icon("Vector2i", "EditorIcons"), Control::get_theme_icon("Rect2", "EditorIcons"), + Control::get_theme_icon("Rect2i", "EditorIcons"), Control::get_theme_icon("Vector3", "EditorIcons"), + Control::get_theme_icon("Vector3i", "EditorIcons"), Control::get_theme_icon("Transform2D", "EditorIcons"), Control::get_theme_icon("Plane", "EditorIcons"), Control::get_theme_icon("Quat", "EditorIcons"), @@ -522,6 +531,8 @@ void VisualScriptEditor::_update_graph(int p_only_id) { Control::get_theme_icon("NodePath", "EditorIcons"), Control::get_theme_icon("RID", "EditorIcons"), Control::get_theme_icon("MiniObject", "EditorIcons"), + Control::get_theme_icon("Callable", "EditorIcons"), + Control::get_theme_icon("Signal", "EditorIcons"), Control::get_theme_icon("Dictionary", "EditorIcons"), Control::get_theme_icon("Array", "EditorIcons"), Control::get_theme_icon("PackedByteArray", "EditorIcons"), @@ -974,8 +985,11 @@ void VisualScriptEditor::_update_members() { Control::get_theme_icon("float", "EditorIcons"), Control::get_theme_icon("String", "EditorIcons"), Control::get_theme_icon("Vector2", "EditorIcons"), + Control::get_theme_icon("Vector2i", "EditorIcons"), Control::get_theme_icon("Rect2", "EditorIcons"), + Control::get_theme_icon("Rect2i", "EditorIcons"), Control::get_theme_icon("Vector3", "EditorIcons"), + Control::get_theme_icon("Vector3i", "EditorIcons"), Control::get_theme_icon("Transform2D", "EditorIcons"), Control::get_theme_icon("Plane", "EditorIcons"), Control::get_theme_icon("Quat", "EditorIcons"), @@ -986,6 +1000,8 @@ void VisualScriptEditor::_update_members() { Control::get_theme_icon("NodePath", "EditorIcons"), Control::get_theme_icon("RID", "EditorIcons"), Control::get_theme_icon("MiniObject", "EditorIcons"), + Control::get_theme_icon("Callable", "EditorIcons"), + Control::get_theme_icon("Signal", "EditorIcons"), Control::get_theme_icon("Dictionary", "EditorIcons"), Control::get_theme_icon("Array", "EditorIcons"), Control::get_theme_icon("PackedByteArray", "EditorIcons"), @@ -1057,9 +1073,9 @@ void VisualScriptEditor::_member_selected() { if (ti->get_parent() == members->get_root()->get_children()) { #ifdef OSX_ENABLED - bool held_ctrl = InputFilter::get_singleton()->is_key_pressed(KEY_META); + bool held_ctrl = Input::get_singleton()->is_key_pressed(KEY_META); #else - bool held_ctrl = InputFilter::get_singleton()->is_key_pressed(KEY_CONTROL); + bool held_ctrl = Input::get_singleton()->is_key_pressed(KEY_CONTROL); #endif if (held_ctrl) { ERR_FAIL_COND(!script->has_function(selected)); @@ -1155,6 +1171,8 @@ void VisualScriptEditor::_member_edited() { undo_redo->add_undo_method(script.ptr(), "rename_variable", new_name, name); undo_redo->add_do_method(this, "_update_members"); undo_redo->add_undo_method(this, "_update_members"); + undo_redo->add_do_method(this, "_update_graph"); + undo_redo->add_undo_method(this, "_update_graph"); undo_redo->add_do_method(this, "emit_signal", "edited_script_changed"); undo_redo->add_undo_method(this, "emit_signal", "edited_script_changed"); undo_redo->commit_action(); @@ -1262,7 +1280,7 @@ void VisualScriptEditor::_add_func_input() { } func_input_vbox->add_child(hbox); - hbox->set_meta("id", hbox->get_position_in_parent()); + hbox->set_meta("id", hbox->get_index()); delete_button->connect("pressed", callable_mp(this, &VisualScriptEditor::_remove_func_input), varray(hbox)); @@ -1360,7 +1378,7 @@ void VisualScriptEditor::_member_button(Object *p_item, int p_column, int p_butt } } else if (ti->get_parent() == root->get_children()) { selected = ti->get_text(0); - function_name_edit->set_position(InputFilter::get_singleton()->get_mouse_position() - Vector2(60, -10)); + function_name_edit->set_position(Input::get_singleton()->get_mouse_position() - Vector2(60, -10)); function_name_edit->popup(); function_name_box->set_text(selected); function_name_box->select_all(); @@ -1722,7 +1740,7 @@ void VisualScriptEditor::_input(const Ref<InputEvent> &p_event) { Ref<InputEventMouseButton> key = p_event; if (key.is_valid() && !key->is_pressed()) { - mouse_up_position = InputFilter::get_singleton()->get_mouse_position(); + mouse_up_position = Input::get_singleton()->get_mouse_position(); } } @@ -1732,7 +1750,7 @@ void VisualScriptEditor::_graph_gui_input(const Ref<InputEvent> &p_event) { if (key.is_valid() && key->is_pressed() && key->get_button_mask() == BUTTON_RIGHT) { saved_position = graph->get_local_mouse_position(); - Point2 gpos = InputFilter::get_singleton()->get_mouse_position(); + Point2 gpos = Input::get_singleton()->get_mouse_position(); _generic_search(script->get_instance_base_type(), gpos); } } @@ -1986,9 +2004,9 @@ void VisualScriptEditor::drop_data_fw(const Point2 &p_point, const Variant &p_da if (String(d["type"]) == "visual_script_variable_drag") { #ifdef OSX_ENABLED - bool use_set = InputFilter::get_singleton()->is_key_pressed(KEY_META); + bool use_set = Input::get_singleton()->is_key_pressed(KEY_META); #else - bool use_set = InputFilter::get_singleton()->is_key_pressed(KEY_CONTROL); + bool use_set = Input::get_singleton()->is_key_pressed(KEY_CONTROL); #endif Vector2 ofs = graph->get_scroll_ofs() + p_point; if (graph->is_using_snap()) { @@ -2181,9 +2199,9 @@ void VisualScriptEditor::drop_data_fw(const Point2 &p_point, const Variant &p_da } #ifdef OSX_ENABLED - bool use_node = InputFilter::get_singleton()->is_key_pressed(KEY_META); + bool use_node = Input::get_singleton()->is_key_pressed(KEY_META); #else - bool use_node = InputFilter::get_singleton()->is_key_pressed(KEY_CONTROL); + bool use_node = Input::get_singleton()->is_key_pressed(KEY_CONTROL); #endif Array nodes = d["nodes"]; @@ -2245,7 +2263,7 @@ void VisualScriptEditor::drop_data_fw(const Point2 &p_point, const Variant &p_da Node *sn = _find_script_node(get_tree()->get_edited_scene_root(), get_tree()->get_edited_scene_root(), script); - if (!sn && !InputFilter::get_singleton()->is_key_pressed(KEY_SHIFT)) { + if (!sn && !Input::get_singleton()->is_key_pressed(KEY_SHIFT)) { EditorNode::get_singleton()->show_warning(vformat(TTR("Can't drop properties because script '%s' is not used in this scene.\nDrop holding 'Shift' to just copy the signature."), get_name())); return; } @@ -2265,12 +2283,12 @@ void VisualScriptEditor::drop_data_fw(const Point2 &p_point, const Variant &p_da ofs /= EDSCALE; #ifdef OSX_ENABLED - bool use_get = InputFilter::get_singleton()->is_key_pressed(KEY_META); + bool use_get = Input::get_singleton()->is_key_pressed(KEY_META); #else - bool use_get = InputFilter::get_singleton()->is_key_pressed(KEY_CONTROL); + bool use_get = Input::get_singleton()->is_key_pressed(KEY_CONTROL); #endif - if (!node || InputFilter::get_singleton()->is_key_pressed(KEY_SHIFT)) { + if (!node || Input::get_singleton()->is_key_pressed(KEY_SHIFT)) { if (use_get) undo_redo->create_action(TTR("Add Getter Property")); @@ -3917,7 +3935,9 @@ void VisualScriptEditor::_notification(int p_what) { switch (p_what) { case NOTIFICATION_READY: { variable_editor->connect("changed", callable_mp(this, &VisualScriptEditor::_update_members)); + variable_editor->connect("changed", callable_mp(this, &VisualScriptEditor::_update_graph), varray(-1), CONNECT_DEFERRED); signal_editor->connect("changed", callable_mp(this, &VisualScriptEditor::_update_members)); + signal_editor->connect("changed", callable_mp(this, &VisualScriptEditor::_update_graph), varray(-1), CONNECT_DEFERRED); [[fallthrough]]; } case NOTIFICATION_THEME_CHANGED: { @@ -4629,6 +4649,7 @@ void VisualScriptEditor::_bind_methods() { ClassDB::bind_method("_input", &VisualScriptEditor::_input); ClassDB::bind_method("_update_graph_connections", &VisualScriptEditor::_update_graph_connections); + ClassDB::bind_method("_update_members", &VisualScriptEditor::_update_members); ClassDB::bind_method("_generic_search", &VisualScriptEditor::_generic_search); } diff --git a/modules/visual_script/visual_script_flow_control.cpp b/modules/visual_script/visual_script_flow_control.cpp index 475893e86d..8a644c6860 100644 --- a/modules/visual_script/visual_script_flow_control.cpp +++ b/modules/visual_script/visual_script_flow_control.cpp @@ -934,6 +934,6 @@ void register_visual_script_flow_control_nodes() { VisualScriptLanguage::singleton->add_register_func("flow_control/iterator", create_node_generic<VisualScriptIterator>); VisualScriptLanguage::singleton->add_register_func("flow_control/sequence", create_node_generic<VisualScriptSequence>); VisualScriptLanguage::singleton->add_register_func("flow_control/switch", create_node_generic<VisualScriptSwitch>); - //VisualScriptLanguage::singleton->add_register_func("flow_control/input_filter", create_node_generic<VisualScriptInputFilter>); + //VisualScriptLanguage::singleton->add_register_func("flow_control/input", create_node_generic<VisualScriptInputFilter>); VisualScriptLanguage::singleton->add_register_func("flow_control/type_cast", create_node_generic<VisualScriptTypeCast>); } diff --git a/modules/visual_script/visual_script_nodes.cpp b/modules/visual_script/visual_script_nodes.cpp index 97c2686cd5..52399d29d0 100644 --- a/modules/visual_script/visual_script_nodes.cpp +++ b/modules/visual_script/visual_script_nodes.cpp @@ -32,7 +32,7 @@ #include "core/engine.h" #include "core/global_constants.h" -#include "core/input/input_filter.h" +#include "core/input/input.h" #include "core/os/os.h" #include "core/project_settings.h" #include "scene/main/node.h" @@ -3870,16 +3870,16 @@ public: switch (mode) { case VisualScriptInputAction::MODE_PRESSED: { - *p_outputs[0] = InputFilter::get_singleton()->is_action_pressed(action); + *p_outputs[0] = Input::get_singleton()->is_action_pressed(action); } break; case VisualScriptInputAction::MODE_RELEASED: { - *p_outputs[0] = !InputFilter::get_singleton()->is_action_pressed(action); + *p_outputs[0] = !Input::get_singleton()->is_action_pressed(action); } break; case VisualScriptInputAction::MODE_JUST_PRESSED: { - *p_outputs[0] = InputFilter::get_singleton()->is_action_just_pressed(action); + *p_outputs[0] = Input::get_singleton()->is_action_just_pressed(action); } break; case VisualScriptInputAction::MODE_JUST_RELEASED: { - *p_outputs[0] = InputFilter::get_singleton()->is_action_just_released(action); + *p_outputs[0] = Input::get_singleton()->is_action_just_released(action); } break; } @@ -4184,9 +4184,12 @@ void register_visual_script_nodes() { VisualScriptLanguage::singleton->add_register_func("operators/logic/select", create_node_generic<VisualScriptSelect>); VisualScriptLanguage::singleton->add_register_func("functions/deconstruct/" + Variant::get_type_name(Variant::Type::VECTOR2), create_node_deconst_typed<Variant::Type::VECTOR2>); + VisualScriptLanguage::singleton->add_register_func("functions/deconstruct/" + Variant::get_type_name(Variant::Type::VECTOR2I), create_node_deconst_typed<Variant::Type::VECTOR2I>); VisualScriptLanguage::singleton->add_register_func("functions/deconstruct/" + Variant::get_type_name(Variant::Type::VECTOR3), create_node_deconst_typed<Variant::Type::VECTOR3>); + VisualScriptLanguage::singleton->add_register_func("functions/deconstruct/" + Variant::get_type_name(Variant::Type::VECTOR3I), create_node_deconst_typed<Variant::Type::VECTOR3I>); VisualScriptLanguage::singleton->add_register_func("functions/deconstruct/" + Variant::get_type_name(Variant::Type::COLOR), create_node_deconst_typed<Variant::Type::COLOR>); VisualScriptLanguage::singleton->add_register_func("functions/deconstruct/" + Variant::get_type_name(Variant::Type::RECT2), create_node_deconst_typed<Variant::Type::RECT2>); + VisualScriptLanguage::singleton->add_register_func("functions/deconstruct/" + Variant::get_type_name(Variant::Type::RECT2I), create_node_deconst_typed<Variant::Type::RECT2I>); VisualScriptLanguage::singleton->add_register_func("functions/deconstruct/" + Variant::get_type_name(Variant::Type::TRANSFORM2D), create_node_deconst_typed<Variant::Type::TRANSFORM2D>); VisualScriptLanguage::singleton->add_register_func("functions/deconstruct/" + Variant::get_type_name(Variant::Type::PLANE), create_node_deconst_typed<Variant::Type::PLANE>); VisualScriptLanguage::singleton->add_register_func("functions/deconstruct/" + Variant::get_type_name(Variant::Type::QUAT), create_node_deconst_typed<Variant::Type::QUAT>); diff --git a/modules/webm/video_stream_webm.cpp b/modules/webm/video_stream_webm.cpp index ca78d664f7..a2d0f78f5f 100644 --- a/modules/webm/video_stream_webm.cpp +++ b/modules/webm/video_stream_webm.cpp @@ -474,7 +474,7 @@ void VideoStreamWebm::set_audio_track(int p_track) { //////////// -RES ResourceFormatLoaderWebm::load(const String &p_path, const String &p_original_path, Error *r_error, bool p_use_sub_threads, float *r_progress) { +RES ResourceFormatLoaderWebm::load(const String &p_path, const String &p_original_path, Error *r_error, bool p_use_sub_threads, float *r_progress, bool p_no_cache) { FileAccess *f = FileAccess::open(p_path, FileAccess::READ); if (!f) { diff --git a/modules/webm/video_stream_webm.h b/modules/webm/video_stream_webm.h index bc209e0057..6677fb85aa 100644 --- a/modules/webm/video_stream_webm.h +++ b/modules/webm/video_stream_webm.h @@ -128,7 +128,7 @@ public: class ResourceFormatLoaderWebm : public ResourceFormatLoader { public: - virtual RES load(const String &p_path, const String &p_original_path = "", Error *r_error = nullptr, bool p_use_sub_threads = false, float *r_progress = nullptr); + virtual RES load(const String &p_path, const String &p_original_path = "", Error *r_error = nullptr, bool p_use_sub_threads = false, float *r_progress = nullptr, bool p_no_cache = false); virtual void get_recognized_extensions(List<String> *p_extensions) const; virtual bool handles_type(const String &p_type) const; virtual String get_resource_type(const String &p_path) const; diff --git a/modules/xatlas_unwrap/register_types.cpp b/modules/xatlas_unwrap/register_types.cpp index e293dfd50c..8c5525bed3 100644 --- a/modules/xatlas_unwrap/register_types.cpp +++ b/modules/xatlas_unwrap/register_types.cpp @@ -32,14 +32,91 @@ #include "core/error_macros.h" +#include "core/crypto/crypto_core.h" + #include "thirdparty/xatlas/xatlas.h" #include <stdio.h> #include <stdlib.h> -extern bool (*array_mesh_lightmap_unwrap_callback)(float p_texel_size, const float *p_vertices, const float *p_normals, int p_vertex_count, const int *p_indices, const int *p_face_materials, int p_index_count, float **r_uv, int **r_vertex, int *r_vertex_count, int **r_index, int *r_index_count, int *r_size_hint_x, int *r_size_hint_y); +extern bool (*array_mesh_lightmap_unwrap_callback)(float p_texel_size, const float *p_vertices, const float *p_normals, int p_vertex_count, const int *p_indices, int p_index_count, float **r_uv, int **r_vertex, int *r_vertex_count, int **r_index, int *r_index_count, int *r_size_hint_x, int *r_size_hint_y, int *&r_cache_data, unsigned int &r_cache_size, bool &r_used_cache); + +bool xatlas_mesh_lightmap_unwrap_callback(float p_texel_size, const float *p_vertices, const float *p_normals, int p_vertex_count, const int *p_indices, int p_index_count, float **r_uvs, int **r_vertices, int *r_vertex_count, int **r_indices, int *r_index_count, int *r_size_hint_x, int *r_size_hint_y, int *&r_cache_data, unsigned int &r_cache_size, bool &r_used_cache) { + + CryptoCore::MD5Context ctx; + ctx.start(); + + ctx.update((unsigned char *)&p_texel_size, sizeof(float)); + ctx.update((unsigned char *)p_indices, sizeof(int) * p_index_count); + ctx.update((unsigned char *)p_vertices, sizeof(float) * p_vertex_count); + ctx.update((unsigned char *)p_normals, sizeof(float) * p_vertex_count); + + unsigned char hash[16]; + ctx.finish(hash); + + bool cached = false; + unsigned int cache_idx = 0; + + if (r_used_cache && r_cache_size) { + //Check if hash is in cache data + + int *cache_data = r_cache_data; + int n_entries = cache_data[0]; + unsigned int r_idx = 1; + for (int i = 0; i < n_entries; ++i) { + if (memcmp(&cache_data[r_idx], hash, 16) == 0) { + cached = true; + cache_idx = r_idx; + break; + } + + r_idx += 4; // hash + r_idx += 2; // size hint + + int vertex_count = cache_data[r_idx]; + r_idx += 1; // vertex count + r_idx += vertex_count; // vertex + r_idx += vertex_count * 2; // uvs + + int index_count = cache_data[r_idx]; + r_idx += 1; // index count + r_idx += index_count; // indices + } + } -bool xatlas_mesh_lightmap_unwrap_callback(float p_texel_size, const float *p_vertices, const float *p_normals, int p_vertex_count, const int *p_indices, const int *p_face_materials, int p_index_count, float **r_uv, int **r_vertex, int *r_vertex_count, int **r_index, int *r_index_count, int *r_size_hint_x, int *r_size_hint_y) { + if (r_used_cache && cached) { + int *cache_data = r_cache_data; + + // Return cache data pointer to the caller + r_cache_data = &cache_data[cache_idx]; + + cache_idx += 4; + + // Load size + *r_size_hint_x = cache_data[cache_idx]; + *r_size_hint_y = cache_data[cache_idx + 1]; + cache_idx += 2; + + // Load vertices + *r_vertex_count = cache_data[cache_idx]; + cache_idx++; + *r_vertices = &cache_data[cache_idx]; + cache_idx += *r_vertex_count; + + // Load UVs + *r_uvs = (float *)&cache_data[cache_idx]; + cache_idx += *r_vertex_count * 2; + + // Load indices + *r_index_count = cache_data[cache_idx]; + cache_idx++; + *r_indices = &cache_data[cache_idx]; + + // Return cache data size to the caller + r_cache_size = sizeof(int) * (4 + 2 + 1 + *r_vertex_count + (*r_vertex_count * 2) + 1 + *r_index_count); // hash + size hint + vertex_count + vertices + uvs + index_count + indices + r_used_cache = true; + return true; + } //set up input mesh xatlas::MeshDecl input_mesh; @@ -82,16 +159,16 @@ bool xatlas_mesh_lightmap_unwrap_callback(float p_texel_size, const float *p_ver const xatlas::Mesh &output = atlas->meshes[0]; - *r_vertex = (int *)malloc(sizeof(int) * output.vertexCount); - *r_uv = (float *)malloc(sizeof(float) * output.vertexCount * 2); - *r_index = (int *)malloc(sizeof(int) * output.indexCount); + *r_vertices = (int *)malloc(sizeof(int) * output.vertexCount); + *r_uvs = (float *)malloc(sizeof(float) * output.vertexCount * 2); + *r_indices = (int *)malloc(sizeof(int) * output.indexCount); float max_x = 0; float max_y = 0; for (uint32_t i = 0; i < output.vertexCount; i++) { - (*r_vertex)[i] = output.vertexArray[i].xref; - (*r_uv)[i * 2 + 0] = output.vertexArray[i].uv[0] / w; - (*r_uv)[i * 2 + 1] = output.vertexArray[i].uv[1] / h; + (*r_vertices)[i] = output.vertexArray[i].xref; + (*r_uvs)[i * 2 + 0] = output.vertexArray[i].uv[0] / w; + (*r_uvs)[i * 2 + 1] = output.vertexArray[i].uv[1] / h; max_x = MAX(max_x, output.vertexArray[i].uv[0]); max_y = MAX(max_y, output.vertexArray[i].uv[1]); } @@ -100,13 +177,54 @@ bool xatlas_mesh_lightmap_unwrap_callback(float p_texel_size, const float *p_ver *r_vertex_count = output.vertexCount; for (uint32_t i = 0; i < output.indexCount; i++) { - (*r_index)[i] = output.indexArray[i]; + (*r_indices)[i] = output.indexArray[i]; } *r_index_count = output.indexCount; xatlas::Destroy(atlas); - printf("Done\n"); + + if (r_used_cache) { + unsigned int new_cache_size = 4 + 2 + 1 + *r_vertex_count + (*r_vertex_count * 2) + 1 + *r_index_count; // hash + size hint + vertex_count + vertices + uvs + index_count + indices + new_cache_size *= sizeof(int); + int *new_cache_data = (int *)memalloc(new_cache_size); + unsigned int new_cache_idx = 0; + + // hash + memcpy(&new_cache_data[new_cache_idx], hash, 16); + new_cache_idx += 4; + + // size hint + new_cache_data[new_cache_idx] = *r_size_hint_x; + new_cache_data[new_cache_idx + 1] = *r_size_hint_y; + new_cache_idx += 2; + + // vertex count + new_cache_data[new_cache_idx] = *r_vertex_count; + new_cache_idx++; + + // vertices + memcpy(&new_cache_data[new_cache_idx], *r_vertices, sizeof(int) * *r_vertex_count); + new_cache_idx += *r_vertex_count; + + // uvs + memcpy(&new_cache_data[new_cache_idx], *r_uvs, sizeof(float) * *r_vertex_count * 2); + new_cache_idx += *r_vertex_count * 2; + + // index count + new_cache_data[new_cache_idx] = *r_index_count; + new_cache_idx++; + + // indices + memcpy(&new_cache_data[new_cache_idx], *r_indices, sizeof(int) * *r_index_count); + new_cache_idx += *r_index_count; + + // Return cache data to the caller + r_cache_data = new_cache_data; + r_cache_size = new_cache_size; + r_used_cache = false; + } + return true; } diff --git a/platform/android/SCsub b/platform/android/SCsub index f39eb8b889..ec42bc42b5 100644 --- a/platform/android/SCsub +++ b/platform/android/SCsub @@ -17,8 +17,8 @@ android_files = [ "java_godot_io_wrapper.cpp", "jni_utils.cpp", "android_keys_utils.cpp", - "vulkan/vk_renderer_jni.cpp", - "plugin/godot_plugin_jni.cpp", + "display_server_android.cpp", + "vulkan/vulkan_context_android.cpp", ] env_android = env.Clone() diff --git a/platform/android/api/api.cpp b/platform/android/api/api.cpp index ef11b12971..4fe868d4f0 100644 --- a/platform/android/api/api.cpp +++ b/platform/android/api/api.cpp @@ -32,6 +32,7 @@ #include "core/engine.h" #include "java_class_wrapper.h" +#include "jni_singleton.h" #if !defined(ANDROID_ENABLED) static JavaClassWrapper *java_class_wrapper = nullptr; @@ -40,7 +41,11 @@ static JavaClassWrapper *java_class_wrapper = nullptr; void register_android_api() { #if !defined(ANDROID_ENABLED) + // On Android platforms, the `java_class_wrapper` instantiation and the + // `JNISingleton` registration occurs in + // `platform/android/java_godot_lib_jni.cpp#Java_org_godotengine_godot_GodotLib_setup` java_class_wrapper = memnew(JavaClassWrapper); // Dummy + ClassDB::register_class<JNISingleton>(); #endif ClassDB::register_class<JavaClass>(); diff --git a/platform/android/api/jni_singleton.h b/platform/android/api/jni_singleton.h new file mode 100644 index 0000000000..917c3f5029 --- /dev/null +++ b/platform/android/api/jni_singleton.h @@ -0,0 +1,242 @@ +/*************************************************************************/ +/* jni_singleton.h */ +/*************************************************************************/ +/* This file is part of: */ +/* GODOT ENGINE */ +/* https://godotengine.org */ +/*************************************************************************/ +/* Copyright (c) 2007-2020 Juan Linietsky, Ariel Manzur. */ +/* Copyright (c) 2014-2020 Godot Engine contributors (cf. AUTHORS.md). */ +/* */ +/* Permission is hereby granted, free of charge, to any person obtaining */ +/* a copy of this software and associated documentation files (the */ +/* "Software"), to deal in the Software without restriction, including */ +/* without limitation the rights to use, copy, modify, merge, publish, */ +/* distribute, sublicense, and/or sell copies of the Software, and to */ +/* permit persons to whom the Software is furnished to do so, subject to */ +/* the following conditions: */ +/* */ +/* The above copyright notice and this permission notice shall be */ +/* included in all copies or substantial portions of the Software. */ +/* */ +/* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, */ +/* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF */ +/* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.*/ +/* IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY */ +/* CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, */ +/* TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE */ +/* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ +/*************************************************************************/ + +#ifndef JNI_SINGLETON_H +#define JNI_SINGLETON_H + +#include <core/engine.h> +#include <core/variant.h> +#ifdef ANDROID_ENABLED +#include <platform/android/jni_utils.h> +#endif + +class JNISingleton : public Object { + + GDCLASS(JNISingleton, Object); + +#ifdef ANDROID_ENABLED + struct MethodData { + + jmethodID method; + Variant::Type ret_type; + Vector<Variant::Type> argtypes; + }; + + jobject instance; + Map<StringName, MethodData> method_map; +#endif + +public: + virtual Variant call(const StringName &p_method, const Variant **p_args, int p_argcount, Callable::CallError &r_error) { +#ifdef ANDROID_ENABLED + Map<StringName, MethodData>::Element *E = method_map.find(p_method); + + // Check the method we're looking for is in the JNISingleton map and that + // the arguments match. + bool call_error = !E || E->get().argtypes.size() != p_argcount; + if (!call_error) { + for (int i = 0; i < p_argcount; i++) { + + if (!Variant::can_convert(p_args[i]->get_type(), E->get().argtypes[i])) { + call_error = true; + break; + } + } + } + + if (call_error) { + // The method is not in this map, defaulting to the regular instance calls. + return Object::call(p_method, p_args, p_argcount, r_error); + } + + ERR_FAIL_COND_V(!instance, Variant()); + + r_error.error = Callable::CallError::CALL_OK; + + jvalue *v = nullptr; + + if (p_argcount) { + + v = (jvalue *)alloca(sizeof(jvalue) * p_argcount); + } + + JNIEnv *env = ThreadAndroid::get_env(); + + int res = env->PushLocalFrame(16); + + ERR_FAIL_COND_V(res != 0, Variant()); + + List<jobject> to_erase; + for (int i = 0; i < p_argcount; i++) { + + jvalret vr = _variant_to_jvalue(env, E->get().argtypes[i], p_args[i]); + v[i] = vr.val; + if (vr.obj) + to_erase.push_back(vr.obj); + } + + Variant ret; + + switch (E->get().ret_type) { + + case Variant::NIL: { + + env->CallVoidMethodA(instance, E->get().method, v); + } break; + case Variant::BOOL: { + + ret = env->CallBooleanMethodA(instance, E->get().method, v) == JNI_TRUE; + } break; + case Variant::INT: { + + ret = env->CallIntMethodA(instance, E->get().method, v); + } break; + case Variant::FLOAT: { + + ret = env->CallFloatMethodA(instance, E->get().method, v); + } break; + case Variant::STRING: { + + jobject o = env->CallObjectMethodA(instance, E->get().method, v); + ret = jstring_to_string((jstring)o, env); + env->DeleteLocalRef(o); + } break; + case Variant::PACKED_STRING_ARRAY: { + + jobjectArray arr = (jobjectArray)env->CallObjectMethodA(instance, E->get().method, v); + + ret = _jobject_to_variant(env, arr); + + env->DeleteLocalRef(arr); + } break; + case Variant::PACKED_INT32_ARRAY: { + + jintArray arr = (jintArray)env->CallObjectMethodA(instance, E->get().method, v); + + int fCount = env->GetArrayLength(arr); + Vector<int> sarr; + sarr.resize(fCount); + + int *w = sarr.ptrw(); + env->GetIntArrayRegion(arr, 0, fCount, w); + ret = sarr; + env->DeleteLocalRef(arr); + } break; + case Variant::PACKED_FLOAT32_ARRAY: { + + jfloatArray arr = (jfloatArray)env->CallObjectMethodA(instance, E->get().method, v); + + int fCount = env->GetArrayLength(arr); + Vector<float> sarr; + sarr.resize(fCount); + + float *w = sarr.ptrw(); + env->GetFloatArrayRegion(arr, 0, fCount, w); + ret = sarr; + env->DeleteLocalRef(arr); + } break; + +#ifndef _MSC_VER +#warning This is missing 64 bits arrays, I have no idea how to do it in JNI +#endif + case Variant::DICTIONARY: { + + jobject obj = env->CallObjectMethodA(instance, E->get().method, v); + ret = _jobject_to_variant(env, obj); + env->DeleteLocalRef(obj); + + } break; + default: { + + env->PopLocalFrame(nullptr); + ERR_FAIL_V(Variant()); + } break; + } + + while (to_erase.size()) { + env->DeleteLocalRef(to_erase.front()->get()); + to_erase.pop_front(); + } + + env->PopLocalFrame(nullptr); + + return ret; +#else // ANDROID_ENABLED + + // Defaulting to the regular instance calls. + return Object::call(p_method, p_args, p_argcount, r_error); +#endif + } + +#ifdef ANDROID_ENABLED + jobject get_instance() const { + + return instance; + } + + void set_instance(jobject p_instance) { + + instance = p_instance; + } + + void add_method(const StringName &p_name, jmethodID p_method, const Vector<Variant::Type> &p_args, Variant::Type p_ret_type) { + + MethodData md; + md.method = p_method; + md.argtypes = p_args; + md.ret_type = p_ret_type; + method_map[p_name] = md; + } + + void add_signal(const StringName &p_name, const Vector<Variant::Type> &p_args) { + if (p_args.size() == 0) + ADD_SIGNAL(MethodInfo(p_name)); + else if (p_args.size() == 1) + ADD_SIGNAL(MethodInfo(p_name, PropertyInfo(p_args[0], "arg1"))); + else if (p_args.size() == 2) + ADD_SIGNAL(MethodInfo(p_name, PropertyInfo(p_args[0], "arg1"), PropertyInfo(p_args[1], "arg2"))); + else if (p_args.size() == 3) + ADD_SIGNAL(MethodInfo(p_name, PropertyInfo(p_args[0], "arg1"), PropertyInfo(p_args[1], "arg2"), PropertyInfo(p_args[2], "arg3"))); + else if (p_args.size() == 4) + ADD_SIGNAL(MethodInfo(p_name, PropertyInfo(p_args[0], "arg1"), PropertyInfo(p_args[1], "arg2"), PropertyInfo(p_args[2], "arg3"), PropertyInfo(p_args[3], "arg4"))); + else if (p_args.size() == 5) + ADD_SIGNAL(MethodInfo(p_name, PropertyInfo(p_args[0], "arg1"), PropertyInfo(p_args[1], "arg2"), PropertyInfo(p_args[2], "arg3"), PropertyInfo(p_args[3], "arg4"), PropertyInfo(p_args[4], "arg5"))); + } + +#endif + + JNISingleton() { +#ifdef ANDROID_ENABLED + instance = nullptr; +#endif + } +}; + +#endif // JNI_SINGLETON_H diff --git a/platform/android/detect.py b/platform/android/detect.py index ed0643e3b3..6da1e5f3d6 100644 --- a/platform/android/detect.py +++ b/platform/android/detect.py @@ -25,7 +25,7 @@ def get_opts(): return [ ("ANDROID_NDK_ROOT", "Path to the Android NDK", os.environ.get("ANDROID_NDK_ROOT", 0)), - ("ndk_platform", 'Target platform (android-<api>, e.g. "android-18")', "android-18"), + ("ndk_platform", 'Target platform (android-<api>, e.g. "android-24")', "android-24"), EnumVariable("android_arch", "Target architecture", "armv7", ("armv7", "arm64v8", "x86", "x86_64")), BoolVariable("android_neon", "Enable NEON support (armv7 only)", True), ] @@ -102,7 +102,7 @@ def configure(env): neon_text = "" if env["android_arch"] == "armv7" and env["android_neon"]: neon_text = " (with NEON)" - print("Building for Android (" + env["android_arch"] + ")" + neon_text) + print("Building for Android, platform " + env["ndk_platform"] + " (" + env["android_arch"] + ")" + neon_text) can_vectorize = True if env["android_arch"] == "x86": @@ -314,8 +314,8 @@ def configure(env): ) env.Prepend(CPPPATH=["#platform/android"]) - env.Append(CPPDEFINES=["ANDROID_ENABLED", "UNIX_ENABLED", "NO_FCNTL"]) - env.Append(LIBS=["OpenSLES", "EGL", "GLESv3", "GLESv2", "android", "log", "z", "dl"]) + env.Append(CPPDEFINES=["ANDROID_ENABLED", "UNIX_ENABLED", "VULKAN_ENABLED", "NO_FCNTL"]) + env.Append(LIBS=["OpenSLES", "EGL", "GLESv2", "vulkan", "android", "log", "z", "dl"]) # Return NDK version string in source.properties (adapted from the Chromium project). diff --git a/platform/android/display_server_android.cpp b/platform/android/display_server_android.cpp new file mode 100644 index 0000000000..60d10b2457 --- /dev/null +++ b/platform/android/display_server_android.cpp @@ -0,0 +1,655 @@ +/*************************************************************************/ +/* display_server_android.cpp */ +/*************************************************************************/ +/* This file is part of: */ +/* GODOT ENGINE */ +/* https://godotengine.org */ +/*************************************************************************/ +/* Copyright (c) 2007-2020 Juan Linietsky, Ariel Manzur. */ +/* Copyright (c) 2014-2020 Godot Engine contributors (cf. AUTHORS.md). */ +/* */ +/* Permission is hereby granted, free of charge, to any person obtaining */ +/* a copy of this software and associated documentation files (the */ +/* "Software"), to deal in the Software without restriction, including */ +/* without limitation the rights to use, copy, modify, merge, publish, */ +/* distribute, sublicense, and/or sell copies of the Software, and to */ +/* permit persons to whom the Software is furnished to do so, subject to */ +/* the following conditions: */ +/* */ +/* The above copyright notice and this permission notice shall be */ +/* included in all copies or substantial portions of the Software. */ +/* */ +/* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, */ +/* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF */ +/* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.*/ +/* IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY */ +/* CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, */ +/* TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE */ +/* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ +/*************************************************************************/ + +#include "display_server_android.h" + +#include "android_keys_utils.h" +#include "core/project_settings.h" +#include "java_godot_io_wrapper.h" +#include "java_godot_wrapper.h" +#include "os_android.h" + +#if defined(OPENGL_ENABLED) +#include "drivers/gles2/rasterizer_gles2.h" +#endif +#if defined(VULKAN_ENABLED) +#include "drivers/vulkan/rendering_device_vulkan.h" +#include "platform/android/vulkan/vulkan_context_android.h" +#include "servers/rendering/rasterizer_rd/rasterizer_rd.h" +#endif + +DisplayServerAndroid *DisplayServerAndroid::get_singleton() { + return (DisplayServerAndroid *)DisplayServer::get_singleton(); +} + +bool DisplayServerAndroid::has_feature(Feature p_feature) const { + switch (p_feature) { + //case FEATURE_CONSOLE_WINDOW: + //case FEATURE_CURSOR_SHAPE: + //case FEATURE_CUSTOM_CURSOR_SHAPE: + //case FEATURE_GLOBAL_MENU: + //case FEATURE_HIDPI: + //case FEATURE_ICON: + //case FEATURE_IME: + //case FEATURE_MOUSE: + //case FEATURE_MOUSE_WARP: + //case FEATURE_NATIVE_DIALOG: + //case FEATURE_NATIVE_ICON: + //case FEATURE_NATIVE_VIDEO: + //case FEATURE_WINDOW_TRANSPARENCY: + case FEATURE_CLIPBOARD: + case FEATURE_KEEP_SCREEN_ON: + case FEATURE_ORIENTATION: + case FEATURE_TOUCHSCREEN: + case FEATURE_VIRTUAL_KEYBOARD: + return true; + default: + return false; + } +} + +String DisplayServerAndroid::get_name() const { + return "Android"; +} + +void DisplayServerAndroid::clipboard_set(const String &p_text) { + GodotJavaWrapper *godot_java = OS_Android::get_singleton()->get_godot_java(); + ERR_FAIL_COND(!godot_java); + + if (godot_java->has_set_clipboard()) { + godot_java->set_clipboard(p_text); + } else { + DisplayServer::clipboard_set(p_text); + } +} + +String DisplayServerAndroid::clipboard_get() const { + GodotJavaWrapper *godot_java = OS_Android::get_singleton()->get_godot_java(); + ERR_FAIL_COND_V(!godot_java, String()); + + if (godot_java->has_get_clipboard()) { + return godot_java->get_clipboard(); + } else { + return DisplayServer::clipboard_get(); + } +} + +void DisplayServerAndroid::screen_set_keep_on(bool p_enable) { + GodotJavaWrapper *godot_java = OS_Android::get_singleton()->get_godot_java(); + ERR_FAIL_COND(!godot_java); + + godot_java->set_keep_screen_on(p_enable); + keep_screen_on = p_enable; +} + +bool DisplayServerAndroid::screen_is_kept_on() const { + return keep_screen_on; +} + +void DisplayServerAndroid::screen_set_orientation(DisplayServer::ScreenOrientation p_orientation, int p_screen) { + GodotIOJavaWrapper *godot_io_java = OS_Android::get_singleton()->get_godot_io_java(); + ERR_FAIL_COND(!godot_io_java); + + godot_io_java->set_screen_orientation(p_orientation); +} + +DisplayServer::ScreenOrientation DisplayServerAndroid::screen_get_orientation(int p_screen) const { + GodotIOJavaWrapper *godot_io_java = OS_Android::get_singleton()->get_godot_io_java(); + ERR_FAIL_COND_V(!godot_io_java, SCREEN_LANDSCAPE); + + return (ScreenOrientation)godot_io_java->get_screen_orientation(); +} + +int DisplayServerAndroid::get_screen_count() const { + return 1; +} + +Point2i DisplayServerAndroid::screen_get_position(int p_screen) const { + return Point2i(0, 0); +} + +Size2i DisplayServerAndroid::screen_get_size(int p_screen) const { + return OS_Android::get_singleton()->get_display_size(); +} + +Rect2i DisplayServerAndroid::screen_get_usable_rect(int p_screen) const { + Size2i display_size = OS_Android::get_singleton()->get_display_size(); + return Rect2i(0, 0, display_size.width, display_size.height); +} + +int DisplayServerAndroid::screen_get_dpi(int p_screen) const { + GodotIOJavaWrapper *godot_io_java = OS_Android::get_singleton()->get_godot_io_java(); + ERR_FAIL_COND_V(!godot_io_java, 0); + + return godot_io_java->get_screen_dpi(); +} + +bool DisplayServerAndroid::screen_is_touchscreen(int p_screen) const { + return true; +} + +void DisplayServerAndroid::virtual_keyboard_show(const String &p_existing_text, const Rect2 &p_screen_rect, int p_max_length) { + GodotIOJavaWrapper *godot_io_java = OS_Android::get_singleton()->get_godot_io_java(); + ERR_FAIL_COND(!godot_io_java); + + if (godot_io_java->has_vk()) { + godot_io_java->show_vk(p_existing_text, p_max_length); + } else { + ERR_PRINT("Virtual keyboard not available"); + } +} + +void DisplayServerAndroid::virtual_keyboard_hide() { + GodotIOJavaWrapper *godot_io_java = OS_Android::get_singleton()->get_godot_io_java(); + ERR_FAIL_COND(!godot_io_java); + + if (godot_io_java->has_vk()) { + godot_io_java->hide_vk(); + } else { + ERR_PRINT("Virtual keyboard not available"); + } +} + +int DisplayServerAndroid::virtual_keyboard_get_height() const { + GodotIOJavaWrapper *godot_io_java = OS_Android::get_singleton()->get_godot_io_java(); + ERR_FAIL_COND_V(!godot_io_java, 0); + + return godot_io_java->get_vk_height(); +} + +void DisplayServerAndroid::window_set_window_event_callback(const Callable &p_callable, DisplayServer::WindowID p_window) { + window_event_callback = p_callable; +} + +void DisplayServerAndroid::window_set_input_event_callback(const Callable &p_callable, DisplayServer::WindowID p_window) { + input_event_callback = p_callable; +} + +void DisplayServerAndroid::window_set_input_text_callback(const Callable &p_callable, DisplayServer::WindowID p_window) { + input_text_callback = p_callable; +} + +void DisplayServerAndroid::window_set_rect_changed_callback(const Callable &p_callable, DisplayServer::WindowID p_window) { + // Not supported on Android. +} + +void DisplayServerAndroid::window_set_drop_files_callback(const Callable &p_callable, DisplayServer::WindowID p_window) { + // Not supported on Android. +} + +void DisplayServerAndroid::_window_callback(const Callable &p_callable, const Variant &p_arg) const { + if (!p_callable.is_null()) { + const Variant *argp = &p_arg; + Variant ret; + Callable::CallError ce; + p_callable.call((const Variant **)&argp, 1, ret, ce); + } +} + +void DisplayServerAndroid::send_window_event(DisplayServer::WindowEvent p_event) const { + _window_callback(window_event_callback, int(p_event)); +} + +void DisplayServerAndroid::send_input_event(const Ref<InputEvent> &p_event) const { + _window_callback(input_event_callback, p_event); +} + +void DisplayServerAndroid::send_input_text(const String &p_text) const { + _window_callback(input_text_callback, p_text); +} + +void DisplayServerAndroid::_dispatch_input_events(const Ref<InputEvent> &p_event) { + DisplayServerAndroid::get_singleton()->send_input_event(p_event); +} + +Vector<DisplayServer::WindowID> DisplayServerAndroid::get_window_list() const { + Vector<WindowID> ret; + ret.push_back(MAIN_WINDOW_ID); + return ret; +} + +DisplayServer::WindowID DisplayServerAndroid::get_window_at_screen_position(const Point2i &p_position) const { + return MAIN_WINDOW_ID; +} + +void DisplayServerAndroid::window_attach_instance_id(ObjectID p_instance, DisplayServer::WindowID p_window) { + window_attached_instance_id = p_instance; +} + +ObjectID DisplayServerAndroid::window_get_attached_instance_id(DisplayServer::WindowID p_window) const { + return window_attached_instance_id; +} + +void DisplayServerAndroid::window_set_title(const String &p_title, DisplayServer::WindowID p_window) { + // Not supported on Android. +} + +int DisplayServerAndroid::window_get_current_screen(DisplayServer::WindowID p_window) const { + return SCREEN_OF_MAIN_WINDOW; +} + +void DisplayServerAndroid::window_set_current_screen(int p_screen, DisplayServer::WindowID p_window) { + // Not supported on Android. +} + +Point2i DisplayServerAndroid::window_get_position(DisplayServer::WindowID p_window) const { + return Point2i(); +} + +void DisplayServerAndroid::window_set_position(const Point2i &p_position, DisplayServer::WindowID p_window) { + // Not supported on Android. +} + +void DisplayServerAndroid::window_set_transient(DisplayServer::WindowID p_window, DisplayServer::WindowID p_parent) { + // Not supported on Android. +} + +void DisplayServerAndroid::window_set_max_size(const Size2i p_size, DisplayServer::WindowID p_window) { + // Not supported on Android. +} + +Size2i DisplayServerAndroid::window_get_max_size(DisplayServer::WindowID p_window) const { + return Size2i(); +} + +void DisplayServerAndroid::window_set_min_size(const Size2i p_size, DisplayServer::WindowID p_window) { + // Not supported on Android. +} + +Size2i DisplayServerAndroid::window_get_min_size(DisplayServer::WindowID p_window) const { + return Size2i(); +} + +void DisplayServerAndroid::window_set_size(const Size2i p_size, DisplayServer::WindowID p_window) { + // Not supported on Android. +} + +Size2i DisplayServerAndroid::window_get_size(DisplayServer::WindowID p_window) const { + return OS_Android::get_singleton()->get_display_size(); +} + +Size2i DisplayServerAndroid::window_get_real_size(DisplayServer::WindowID p_window) const { + return OS_Android::get_singleton()->get_display_size(); +} + +void DisplayServerAndroid::window_set_mode(DisplayServer::WindowMode p_mode, DisplayServer::WindowID p_window) { + // Not supported on Android. +} + +DisplayServer::WindowMode DisplayServerAndroid::window_get_mode(DisplayServer::WindowID p_window) const { + return WINDOW_MODE_FULLSCREEN; +} + +bool DisplayServerAndroid::window_is_maximize_allowed(DisplayServer::WindowID p_window) const { + return false; +} + +void DisplayServerAndroid::window_set_flag(DisplayServer::WindowFlags p_flag, bool p_enabled, DisplayServer::WindowID p_window) { + // Not supported on Android. +} + +bool DisplayServerAndroid::window_get_flag(DisplayServer::WindowFlags p_flag, DisplayServer::WindowID p_window) const { + return false; +} + +void DisplayServerAndroid::window_request_attention(DisplayServer::WindowID p_window) { + // Not supported on Android. +} + +void DisplayServerAndroid::window_move_to_foreground(DisplayServer::WindowID p_window) { + // Not supported on Android. +} + +bool DisplayServerAndroid::window_can_draw(DisplayServer::WindowID p_window) const { + return true; +} + +bool DisplayServerAndroid::can_any_window_draw() const { + return true; +} + +void DisplayServerAndroid::alert(const String &p_alert, const String &p_title) { + GodotJavaWrapper *godot_java = OS_Android::get_singleton()->get_godot_java(); + ERR_FAIL_COND(!godot_java); + + godot_java->alert(p_alert, p_title); +} + +void DisplayServerAndroid::process_events() { + // Nothing to do +} + +Vector<String> DisplayServerAndroid::get_rendering_drivers_func() { + Vector<String> drivers; + +#ifdef OPENGL_ENABLED + drivers.push_back("opengl"); +#endif +#ifdef VULKAN_ENABLED + drivers.push_back("vulkan"); +#endif + + return drivers; +} + +DisplayServer *DisplayServerAndroid::create_func(const String &p_rendering_driver, DisplayServer::WindowMode p_mode, uint32_t p_flags, const Vector2i &p_resolution, Error &r_error) { + return memnew(DisplayServerAndroid(p_rendering_driver, p_mode, p_flags, p_resolution, r_error)); +} + +void DisplayServerAndroid::register_android_driver() { + register_create_function("android", create_func, get_rendering_drivers_func); +} + +DisplayServerAndroid::DisplayServerAndroid(const String &p_rendering_driver, DisplayServer::WindowMode p_mode, uint32_t p_flags, const Vector2i &p_resolution, Error &r_error) { + rendering_driver = p_rendering_driver; + + // TODO: rendering_driver is broken, change when different drivers are supported again + rendering_driver = "vulkan"; + + keep_screen_on = GLOBAL_GET("display/window/energy_saving/keep_screen_on"); + +#if defined(OPENGL_ENABLED) + if (rendering_driver == "opengl") { + bool gl_initialization_error = false; + + if (RasterizerGLES2::is_viable() == OK) { + RasterizerGLES2::register_config(); + RasterizerGLES2::make_current(); + } else { + gl_initialization_error = true; + } + + if (gl_initialization_error) { + OS::get_singleton()->alert("Your device does not support any of the supported OpenGL versions.\n" + "Please try updating your Android version.", + "Unable to initialize video driver"); + return; + } + } +#endif + +#if defined(VULKAN_ENABLED) + context_vulkan = nullptr; + rendering_device_vulkan = nullptr; + + if (rendering_driver == "vulkan") { + ANativeWindow *native_window = OS_Android::get_singleton()->get_native_window(); + ERR_FAIL_COND(!native_window); + + context_vulkan = memnew(VulkanContextAndroid); + if (context_vulkan->initialize() != OK) { + memdelete(context_vulkan); + context_vulkan = nullptr; + ERR_FAIL_MSG("Failed to initialize Vulkan context"); + } + + Size2i display_size = OS_Android::get_singleton()->get_display_size(); + if (context_vulkan->window_create(native_window, display_size.width, display_size.height) == -1) { + memdelete(context_vulkan); + context_vulkan = nullptr; + ERR_FAIL_MSG("Failed to create Vulkan window."); + } + + rendering_device_vulkan = memnew(RenderingDeviceVulkan); + rendering_device_vulkan->initialize(context_vulkan); + + RasterizerRD::make_current(); + } +#endif + + Input::get_singleton()->set_event_dispatch_function(_dispatch_input_events); +} + +DisplayServerAndroid::~DisplayServerAndroid() { +#if defined(VULKAN_ENABLED) + if (rendering_driver == "vulkan") { + if (rendering_device_vulkan) { + rendering_device_vulkan->finalize(); + memdelete(rendering_device_vulkan); + } + + if (context_vulkan) { + memdelete(context_vulkan); + } + } +#endif +} + +void DisplayServerAndroid::process_joy_event(DisplayServerAndroid::JoypadEvent p_event) { + switch (p_event.type) { + case JOY_EVENT_BUTTON: + Input::get_singleton()->joy_button(p_event.device, p_event.index, p_event.pressed); + break; + case JOY_EVENT_AXIS: + Input::JoyAxis value; + value.min = -1; + value.value = p_event.value; + Input::get_singleton()->joy_axis(p_event.device, p_event.index, value); + break; + case JOY_EVENT_HAT: + Input::get_singleton()->joy_hat(p_event.device, p_event.hat); + break; + default: + return; + } +} + +void DisplayServerAndroid::process_key_event(int p_keycode, int p_scancode, int p_unicode_char, bool p_pressed) { + Ref<InputEventKey> ev; + ev.instance(); + int val = p_unicode_char; + int keycode = android_get_keysym(p_keycode); + int phy_keycode = android_get_keysym(p_scancode); + ev->set_keycode(keycode); + ev->set_physical_keycode(phy_keycode); + ev->set_unicode(val); + ev->set_pressed(p_pressed); + + if (val == '\n') { + ev->set_keycode(KEY_ENTER); + } else if (val == 61448) { + ev->set_keycode(KEY_BACKSPACE); + ev->set_unicode(KEY_BACKSPACE); + } else if (val == 61453) { + ev->set_keycode(KEY_ENTER); + ev->set_unicode(KEY_ENTER); + } else if (p_keycode == 4) { + OS_Android::get_singleton()->main_loop_request_go_back(); + } + + Input::get_singleton()->parse_input_event(ev); +} + +void DisplayServerAndroid::process_touch(int p_what, int p_pointer, const Vector<DisplayServerAndroid::TouchPos> &p_points) { + switch (p_what) { + case 0: { //gesture begin + if (touch.size()) { + //end all if exist + for (int i = 0; i < touch.size(); i++) { + + Ref<InputEventScreenTouch> ev; + ev.instance(); + ev->set_index(touch[i].id); + ev->set_pressed(false); + ev->set_position(touch[i].pos); + Input::get_singleton()->parse_input_event(ev); + } + } + + touch.resize(p_points.size()); + for (int i = 0; i < p_points.size(); i++) { + touch.write[i].id = p_points[i].id; + touch.write[i].pos = p_points[i].pos; + } + + //send touch + for (int i = 0; i < touch.size(); i++) { + + Ref<InputEventScreenTouch> ev; + ev.instance(); + ev->set_index(touch[i].id); + ev->set_pressed(true); + ev->set_position(touch[i].pos); + Input::get_singleton()->parse_input_event(ev); + } + + } break; + case 1: { //motion + ERR_FAIL_COND(touch.size() != p_points.size()); + + for (int i = 0; i < touch.size(); i++) { + + int idx = -1; + for (int j = 0; j < p_points.size(); j++) { + + if (touch[i].id == p_points[j].id) { + idx = j; + break; + } + } + + ERR_CONTINUE(idx == -1); + + if (touch[i].pos == p_points[idx].pos) + continue; //no move unncesearily + + Ref<InputEventScreenDrag> ev; + ev.instance(); + ev->set_index(touch[i].id); + ev->set_position(p_points[idx].pos); + ev->set_relative(p_points[idx].pos - touch[i].pos); + Input::get_singleton()->parse_input_event(ev); + touch.write[i].pos = p_points[idx].pos; + } + + } break; + case 2: { //release + if (touch.size()) { + //end all if exist + for (int i = 0; i < touch.size(); i++) { + + Ref<InputEventScreenTouch> ev; + ev.instance(); + ev->set_index(touch[i].id); + ev->set_pressed(false); + ev->set_position(touch[i].pos); + Input::get_singleton()->parse_input_event(ev); + } + touch.clear(); + } + } break; + case 3: { // add touch + for (int i = 0; i < p_points.size(); i++) { + if (p_points[i].id == p_pointer) { + TouchPos tp = p_points[i]; + touch.push_back(tp); + + Ref<InputEventScreenTouch> ev; + ev.instance(); + + ev->set_index(tp.id); + ev->set_pressed(true); + ev->set_position(tp.pos); + Input::get_singleton()->parse_input_event(ev); + + break; + } + } + } break; + case 4: { // remove touch + for (int i = 0; i < touch.size(); i++) { + if (touch[i].id == p_pointer) { + + Ref<InputEventScreenTouch> ev; + ev.instance(); + ev->set_index(touch[i].id); + ev->set_pressed(false); + ev->set_position(touch[i].pos); + Input::get_singleton()->parse_input_event(ev); + touch.remove(i); + + break; + } + } + } break; + } +} + +void DisplayServerAndroid::process_hover(int p_type, Point2 p_pos) { + // https://developer.android.com/reference/android/view/MotionEvent.html#ACTION_HOVER_ENTER + switch (p_type) { + case 7: // hover move + case 9: // hover enter + case 10: { // hover exit + Ref<InputEventMouseMotion> ev; + ev.instance(); + ev->set_position(p_pos); + ev->set_global_position(p_pos); + ev->set_relative(p_pos - hover_prev_pos); + Input::get_singleton()->parse_input_event(ev); + hover_prev_pos = p_pos; + } break; + } +} + +void DisplayServerAndroid::process_double_tap(Point2 p_pos) { + Ref<InputEventMouseButton> ev; + ev.instance(); + ev->set_position(p_pos); + ev->set_global_position(p_pos); + ev->set_pressed(false); + ev->set_doubleclick(true); + Input::get_singleton()->parse_input_event(ev); +} + +void DisplayServerAndroid::process_scroll(Point2 p_pos) { + Ref<InputEventPanGesture> ev; + ev.instance(); + ev->set_position(p_pos); + ev->set_delta(p_pos - scroll_prev_pos); + Input::get_singleton()->parse_input_event(ev); + scroll_prev_pos = p_pos; +} + +void DisplayServerAndroid::process_accelerometer(const Vector3 &p_accelerometer) { + Input::get_singleton()->set_accelerometer(p_accelerometer); +} + +void DisplayServerAndroid::process_gravity(const Vector3 &p_gravity) { + Input::get_singleton()->set_gravity(p_gravity); +} + +void DisplayServerAndroid::process_magnetometer(const Vector3 &p_magnetometer) { + Input::get_singleton()->set_magnetometer(p_magnetometer); +} + +void DisplayServerAndroid::process_gyroscope(const Vector3 &p_gyroscope) { + Input::get_singleton()->set_gyroscope(p_gyroscope); +} diff --git a/platform/android/display_server_android.h b/platform/android/display_server_android.h new file mode 100644 index 0000000000..2096ba68f1 --- /dev/null +++ b/platform/android/display_server_android.h @@ -0,0 +1,174 @@ +/*************************************************************************/ +/* display_server_android.h */ +/*************************************************************************/ +/* This file is part of: */ +/* GODOT ENGINE */ +/* https://godotengine.org */ +/*************************************************************************/ +/* Copyright (c) 2007-2020 Juan Linietsky, Ariel Manzur. */ +/* Copyright (c) 2014-2020 Godot Engine contributors (cf. AUTHORS.md). */ +/* */ +/* Permission is hereby granted, free of charge, to any person obtaining */ +/* a copy of this software and associated documentation files (the */ +/* "Software"), to deal in the Software without restriction, including */ +/* without limitation the rights to use, copy, modify, merge, publish, */ +/* distribute, sublicense, and/or sell copies of the Software, and to */ +/* permit persons to whom the Software is furnished to do so, subject to */ +/* the following conditions: */ +/* */ +/* The above copyright notice and this permission notice shall be */ +/* included in all copies or substantial portions of the Software. */ +/* */ +/* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, */ +/* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF */ +/* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.*/ +/* IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY */ +/* CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, */ +/* TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE */ +/* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ +/*************************************************************************/ + +#ifndef DISPLAY_SERVER_ANDROID_H +#define DISPLAY_SERVER_ANDROID_H + +#include "servers/display_server.h" + +#if defined(VULKAN_ENABLED) +class VulkanContextAndroid; +class RenderingDeviceVulkan; +#endif + +class DisplayServerAndroid : public DisplayServer { +public: + struct TouchPos { + int id; + Point2 pos; + }; + + enum { + JOY_EVENT_BUTTON = 0, + JOY_EVENT_AXIS = 1, + JOY_EVENT_HAT = 2 + }; + + struct JoypadEvent { + + int device; + int type; + int index; + bool pressed; + float value; + int hat; + }; + +private: + String rendering_driver; + + bool keep_screen_on; + + Vector<TouchPos> touch; + Point2 hover_prev_pos; // needed to calculate the relative position on hover events + Point2 scroll_prev_pos; // needed to calculate the relative position on scroll events + +#if defined(VULKAN_ENABLED) + VulkanContextAndroid *context_vulkan; + RenderingDeviceVulkan *rendering_device_vulkan; +#endif + + ObjectID window_attached_instance_id; + + Callable window_event_callback; + Callable input_event_callback; + Callable input_text_callback; + + void _window_callback(const Callable &p_callable, const Variant &p_arg) const; + + static void _dispatch_input_events(const Ref<InputEvent> &p_event); + +public: + static DisplayServerAndroid *get_singleton(); + + virtual bool has_feature(Feature p_feature) const; + virtual String get_name() const; + + virtual void clipboard_set(const String &p_text); + virtual String clipboard_get() const; + + virtual void screen_set_keep_on(bool p_enable); + virtual bool screen_is_kept_on() const; + + virtual void screen_set_orientation(ScreenOrientation p_orientation, int p_screen = SCREEN_OF_MAIN_WINDOW); + virtual ScreenOrientation screen_get_orientation(int p_screen = SCREEN_OF_MAIN_WINDOW) const; + + virtual int get_screen_count() const; + virtual Point2i screen_get_position(int p_screen = SCREEN_OF_MAIN_WINDOW) const; + virtual Size2i screen_get_size(int p_screen = SCREEN_OF_MAIN_WINDOW) const; + virtual Rect2i screen_get_usable_rect(int p_screen = SCREEN_OF_MAIN_WINDOW) const; + virtual int screen_get_dpi(int p_screen = SCREEN_OF_MAIN_WINDOW) const; + virtual bool screen_is_touchscreen(int p_screen = SCREEN_OF_MAIN_WINDOW) const; + + virtual void virtual_keyboard_show(const String &p_existing_text, const Rect2 &p_screen_rect = Rect2(), int p_max_length = -1); + virtual void virtual_keyboard_hide(); + virtual int virtual_keyboard_get_height() const; + + virtual void window_set_window_event_callback(const Callable &p_callable, WindowID p_window = MAIN_WINDOW_ID); + virtual void window_set_input_event_callback(const Callable &p_callable, WindowID p_window = MAIN_WINDOW_ID); + virtual void window_set_input_text_callback(const Callable &p_callable, WindowID p_window = MAIN_WINDOW_ID); + virtual void window_set_rect_changed_callback(const Callable &p_callable, WindowID p_window = MAIN_WINDOW_ID); + virtual void window_set_drop_files_callback(const Callable &p_callable, WindowID p_window = MAIN_WINDOW_ID); + + void send_window_event(WindowEvent p_event) const; + void send_input_event(const Ref<InputEvent> &p_event) const; + void send_input_text(const String &p_text) const; + + virtual Vector<WindowID> get_window_list() const; + virtual WindowID get_window_at_screen_position(const Point2i &p_position) const; + virtual void window_attach_instance_id(ObjectID p_instance, WindowID p_window = MAIN_WINDOW_ID); + virtual ObjectID window_get_attached_instance_id(WindowID p_window = MAIN_WINDOW_ID) const; + virtual void window_set_title(const String &p_title, WindowID p_window = MAIN_WINDOW_ID); + virtual int window_get_current_screen(WindowID p_window = MAIN_WINDOW_ID) const; + virtual void window_set_current_screen(int p_screen, WindowID p_window = MAIN_WINDOW_ID); + virtual Point2i window_get_position(WindowID p_window = MAIN_WINDOW_ID) const; + virtual void window_set_position(const Point2i &p_position, WindowID p_window = MAIN_WINDOW_ID); + virtual void window_set_transient(WindowID p_window, WindowID p_parent); + virtual void window_set_max_size(const Size2i p_size, WindowID p_window = MAIN_WINDOW_ID); + virtual Size2i window_get_max_size(WindowID p_window = MAIN_WINDOW_ID) const; + virtual void window_set_min_size(const Size2i p_size, WindowID p_window = MAIN_WINDOW_ID); + virtual Size2i window_get_min_size(WindowID p_window = MAIN_WINDOW_ID) const; + virtual void window_set_size(const Size2i p_size, WindowID p_window = MAIN_WINDOW_ID); + virtual Size2i window_get_size(WindowID p_window = MAIN_WINDOW_ID) const; + virtual Size2i window_get_real_size(WindowID p_window = MAIN_WINDOW_ID) const; + virtual void window_set_mode(WindowMode p_mode, WindowID p_window = MAIN_WINDOW_ID); + virtual WindowMode window_get_mode(WindowID p_window = MAIN_WINDOW_ID) const; + virtual bool window_is_maximize_allowed(WindowID p_window = MAIN_WINDOW_ID) const; + virtual void window_set_flag(WindowFlags p_flag, bool p_enabled, WindowID p_window = MAIN_WINDOW_ID); + virtual bool window_get_flag(WindowFlags p_flag, WindowID p_window = MAIN_WINDOW_ID) const; + virtual void window_request_attention(WindowID p_window = MAIN_WINDOW_ID); + virtual void window_move_to_foreground(WindowID p_window = MAIN_WINDOW_ID); + virtual bool window_can_draw(WindowID p_window = MAIN_WINDOW_ID) const; + virtual bool can_any_window_draw() const; + + virtual void alert(const String &p_alert, const String &p_title); + + virtual void process_events(); + + void process_accelerometer(const Vector3 &p_accelerometer); + void process_gravity(const Vector3 &p_gravity); + void process_magnetometer(const Vector3 &p_magnetometer); + void process_gyroscope(const Vector3 &p_gyroscope); + void process_touch(int p_what, int p_pointer, const Vector<TouchPos> &p_points); + void process_hover(int p_type, Point2 p_pos); + void process_double_tap(Point2 p_pos); + void process_scroll(Point2 p_pos); + void process_joy_event(JoypadEvent p_event); + void process_key_event(int p_keycode, int p_scancode, int p_unicode_char, bool p_pressed); + + static DisplayServer *create_func(const String &p_rendering_driver, WindowMode p_mode, uint32_t p_flags, const Vector2i &p_resolution, Error &r_error); + static Vector<String> get_rendering_drivers_func(); + static void register_android_driver(); + + DisplayServerAndroid(const String &p_rendering_driver, WindowMode p_mode, uint32_t p_flags, const Vector2i &p_resolution, Error &r_error); + ~DisplayServerAndroid(); +}; + +#endif // DISPLAY_SERVER_ANDROID_H diff --git a/platform/android/export/export.cpp b/platform/android/export/export.cpp index b6c30d120c..d4fc52eaa9 100644 --- a/platform/android/export/export.cpp +++ b/platform/android/export/export.cpp @@ -1179,14 +1179,32 @@ class EditorExportPlatformAndroid : public EditorExportPlatform { static String _parse_string(const uint8_t *p_bytes, bool p_utf8) { uint32_t offset = 0; - uint32_t len = decode_uint16(&p_bytes[offset]); + uint32_t len = 0; if (p_utf8) { - //don't know how to read extended utf8, this will have to be for now - len >>= 8; + uint8_t byte = p_bytes[offset]; + if (byte & 0x80) + offset += 2; + else + offset += 1; + byte = p_bytes[offset]; + offset++; + if (byte & 0x80) { + len = byte & 0x7F; + len = (len << 8) + p_bytes[offset]; + offset++; + } else { + len = byte; + } + } else { + len = decode_uint16(&p_bytes[offset]); + offset += 2; + if (len & 0x8000) { + len &= 0x7FFF; + len = (len << 16) + decode_uint16(&p_bytes[offset]); + offset += 2; + } } - offset += 2; - //printf("len %i, unicode: %i\n",len,int(p_utf8)); if (p_utf8) { @@ -1699,7 +1717,7 @@ public: valid = false; } else { Error errn; - DirAccessRef da = DirAccess::open(sdk_path.plus_file("tools"), &errn); + DirAccessRef da = DirAccess::open(sdk_path.plus_file("platform-tools"), &errn); if (errn != OK) { err += TTR("Invalid Android SDK path for custom build in Editor Settings.") + "\n"; valid = false; @@ -1932,6 +1950,7 @@ public: ImageLoader::load_image(path, launcher_adaptive_icon_background_image); } + Vector<String> invalid_abis(enabled_abis); while (ret == UNZ_OK) { //get filename @@ -1977,6 +1996,7 @@ public: bool enabled = false; for (int i = 0; i < enabled_abis.size(); ++i) { if (file.begins_with("lib/" + enabled_abis[i] + "/")) { + invalid_abis.erase(enabled_abis[i]); enabled = true; break; } @@ -2016,6 +2036,13 @@ public: ret = unzGoToNextFile(pkg); } + if (!invalid_abis.empty()) { + String unsupported_arch = String(", ").join(invalid_abis); + EditorNode::add_io_error("Missing libraries in the export template for the selected architectures: " + unsupported_arch + ".\n" + + "Please build a template with all required libraries, or uncheck the missing architectures in the export preset."); + CLEANUP_AND_RETURN(ERR_FILE_NOT_FOUND); + } + if (ep.step("Adding files...", 1)) { CLEANUP_AND_RETURN(ERR_SKIP); } diff --git a/platform/android/java/app/build.gradle b/platform/android/java/app/build.gradle index 1a3bb77670..9ae47d6174 100644 --- a/platform/android/java/app/build.gradle +++ b/platform/android/java/app/build.gradle @@ -56,6 +56,11 @@ android { compileSdkVersion versions.compileSdk buildToolsVersion versions.buildTools + compileOptions { + sourceCompatibility 1.8 + targetCompatibility 1.8 + } + defaultConfig { // Feel free to modify the application id to your own. applicationId getExportPackageName() @@ -71,7 +76,9 @@ android { packagingOptions { exclude 'META-INF/LICENSE' exclude 'META-INF/NOTICE' - doNotStrip '**/*.so' + + // Should be uncommented for development purpose within Android Studio + // doNotStrip '**/*.so' } // Both signing and zip-aligning will be done at export time diff --git a/platform/android/java/app/config.gradle b/platform/android/java/app/config.gradle index 96cfd272f2..aa98194a10 100644 --- a/platform/android/java/app/config.gradle +++ b/platform/android/java/app/config.gradle @@ -3,7 +3,7 @@ ext.versions = [ compileSdk : 29, minSdk : 18, targetSdk : 29, - buildTools : '29.0.1', + buildTools : '29.0.3', supportCoreUtils : '28.0.0', kotlinVersion : '1.3.61', v4Support : '28.0.0' diff --git a/platform/android/java/app/settings.gradle b/platform/android/java/app/settings.gradle new file mode 100644 index 0000000000..33b863c7bf --- /dev/null +++ b/platform/android/java/app/settings.gradle @@ -0,0 +1,2 @@ +// Empty settings.gradle file to denote this directory as being the root project +// of the Godot custom build. diff --git a/platform/android/java/lib/AndroidManifest.xml b/platform/android/java/lib/AndroidManifest.xml index b133585f99..fa39bc0f1d 100644 --- a/platform/android/java/lib/AndroidManifest.xml +++ b/platform/android/java/lib/AndroidManifest.xml @@ -13,7 +13,7 @@ <instrumentation android:icon="@mipmap/icon" android:label="@string/godot_project_name_string" - android:name=".GodotInstrumentation" + android:name="org.godotengine.godot.GodotInstrumentation" android:targetPackage="org.godotengine.godot" /> </manifest> diff --git a/platform/android/java/lib/build.gradle b/platform/android/java/lib/build.gradle index 062f91e08e..19eee5a315 100644 --- a/platform/android/java/lib/build.gradle +++ b/platform/android/java/lib/build.gradle @@ -1,4 +1,5 @@ apply plugin: 'com.android.library' +apply plugin: 'kotlin-android' dependencies { implementation libraries.supportCoreUtils @@ -11,7 +12,6 @@ def pathToRootDir = "../../../../" android { compileSdkVersion versions.compileSdk buildToolsVersion versions.buildTools - useLibrary 'org.apache.http.legacy' defaultConfig { minSdkVersion versions.minSdk @@ -26,7 +26,9 @@ android { packagingOptions { exclude 'META-INF/LICENSE' exclude 'META-INF/NOTICE' - doNotStrip '**/*.so' + + // Should be uncommented for development purpose within Android Studio + // doNotStrip '**/*.so' } sourceSets { diff --git a/platform/android/java/lib/res/drawable-hdpi/notify_panel_notification_icon_bg.png b/platform/android/java/lib/res/drawable-hdpi/notify_panel_notification_icon_bg.png Binary files differdeleted file mode 100644 index f849d8e90d..0000000000 --- a/platform/android/java/lib/res/drawable-hdpi/notify_panel_notification_icon_bg.png +++ /dev/null diff --git a/platform/android/java/lib/res/drawable-mdpi/notify_panel_notification_icon_bg.png b/platform/android/java/lib/res/drawable-mdpi/notify_panel_notification_icon_bg.png Binary files differdeleted file mode 100644 index 1dfb28b33a..0000000000 --- a/platform/android/java/lib/res/drawable-mdpi/notify_panel_notification_icon_bg.png +++ /dev/null diff --git a/platform/android/java/lib/res/drawable-xhdpi/notify_panel_notification_icon_bg.png b/platform/android/java/lib/res/drawable-xhdpi/notify_panel_notification_icon_bg.png Binary files differdeleted file mode 100644 index 372b763ec5..0000000000 --- a/platform/android/java/lib/res/drawable-xhdpi/notify_panel_notification_icon_bg.png +++ /dev/null diff --git a/platform/android/java/lib/res/drawable-xxhdpi/notify_panel_notification_icon_bg.png b/platform/android/java/lib/res/drawable-xxhdpi/notify_panel_notification_icon_bg.png Binary files differdeleted file mode 100644 index 302a972049..0000000000 --- a/platform/android/java/lib/res/drawable-xxhdpi/notify_panel_notification_icon_bg.png +++ /dev/null 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 1798a1df3a..bf0d1c6273 100644 --- a/platform/android/java/lib/src/org/godotengine/godot/Godot.java +++ b/platform/android/java/lib/src/org/godotengine/godot/Godot.java @@ -153,7 +153,7 @@ public abstract class Godot extends FragmentActivity implements SensorEventListe private String[] command_line; private boolean use_apk_expansion; - public GodotView mView; + public GodotRenderView mRenderView; private boolean godot_initialized = false; private SensorManager mSensorManager; @@ -213,34 +213,41 @@ public abstract class Godot extends FragmentActivity implements SensorEventListe setContentView(layout); // GodotEditText layout - GodotEditText edittext = new GodotEditText(this); - edittext.setLayoutParams(new ViewGroup.LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.WRAP_CONTENT)); + GodotEditText editText = new GodotEditText(this); + editText.setLayoutParams(new ViewGroup.LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.WRAP_CONTENT)); // ...add to FrameLayout - layout.addView(edittext); + layout.addView(editText); - mView = new GodotView(this, xrMode, use_32_bits, use_debug_opengl); - layout.addView(mView, new LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.MATCH_PARENT)); - edittext.setView(mView); - io.setEdit(edittext); + GodotLib.setup(command_line); - mView.getViewTreeObserver().addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() { + final String videoDriver = GodotLib.getGlobal("rendering/quality/driver/driver_name"); + if (videoDriver.equals("Vulkan")) { + mRenderView = new GodotVulkanRenderView(this); + } else { + mRenderView = new GodotGLRenderView(this, xrMode, use_32_bits, use_debug_opengl); + } + + View view = mRenderView.getView(); + layout.addView(view, new LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.MATCH_PARENT)); + editText.setView(mRenderView); + io.setEdit(editText); + + view.getViewTreeObserver().addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() { @Override public void onGlobalLayout() { Point fullSize = new Point(); getWindowManager().getDefaultDisplay().getSize(fullSize); Rect gameSize = new Rect(); - mView.getWindowVisibleDisplayFrame(gameSize); + mRenderView.getView().getWindowVisibleDisplayFrame(gameSize); final int keyboardHeight = fullSize.y - gameSize.bottom; GodotLib.setVirtualKeyboardHeight(keyboardHeight); } }); - final String[] current_command_line = command_line; - mView.queueEvent(new Runnable() { + mRenderView.queueOnRenderThread(new Runnable() { @Override public void run() { - GodotLib.setup(current_command_line); // Must occur after GodotLib.setup has completed. for (GodotPlugin plugin : pluginRegistry.getAllPlugins()) { @@ -384,7 +391,7 @@ public abstract class Godot extends FragmentActivity implements SensorEventListe */ @Keep private Surface getSurface() { - return mView.getHolder().getSurface(); + return mRenderView.getView().getHolder().getSurface(); } /** @@ -617,7 +624,7 @@ public abstract class Godot extends FragmentActivity implements SensorEventListe } return; } - mView.onPause(); + mRenderView.onActivityPaused(); mSensorManager.unregisterListener(this); @@ -655,7 +662,7 @@ public abstract class Godot extends FragmentActivity implements SensorEventListe return; } - mView.onResume(); + mRenderView.onActivityResumed(); mSensorManager.registerListener(this, mAccelerometer, SensorManager.SENSOR_DELAY_GAME); mSensorManager.registerListener(this, mGravity, SensorManager.SENSOR_DELAY_GAME); @@ -721,8 +728,8 @@ public abstract class Godot extends FragmentActivity implements SensorEventListe final float z = adjustedValues[2]; final int typeOfSensor = event.sensor.getType(); - if (mView != null) { - mView.queueEvent(new Runnable() { + if (mRenderView != null) { + mRenderView.queueOnRenderThread(new Runnable() { @Override public void run() { if (typeOfSensor == Sensor.TYPE_ACCELEROMETER) { @@ -773,8 +780,8 @@ public abstract class Godot extends FragmentActivity implements SensorEventListe } } - if (shouldQuit && mView != null) { - mView.queueEvent(new Runnable() { + if (shouldQuit && mRenderView != null) { + mRenderView.queueOnRenderThread(new Runnable() { @Override public void run() { GodotLib.back(); @@ -789,8 +796,8 @@ public abstract class Godot extends FragmentActivity implements SensorEventListe * This must be called after the render thread has started. */ public final void runOnRenderThread(@NonNull Runnable action) { - if (mView != null) { - mView.queueEvent(action); + if (mRenderView != null) { + mRenderView.queueOnRenderThread(action); } } @@ -847,7 +854,7 @@ public abstract class Godot extends FragmentActivity implements SensorEventListe if (evcount == 0) return true; - if (mView != null) { + if (mRenderView != null) { final int[] arr = new int[event.getPointerCount() * 3]; for (int i = 0; i < event.getPointerCount(); i++) { @@ -860,7 +867,7 @@ public abstract class Godot extends FragmentActivity implements SensorEventListe //System.out.printf("gaction: %d\n",event.getAction()); final int action = event.getAction() & MotionEvent.ACTION_MASK; - mView.queueEvent(new Runnable() { + mRenderView.queueOnRenderThread(new Runnable() { @Override public void run() { switch (action) { @@ -911,7 +918,7 @@ public abstract class Godot extends FragmentActivity implements SensorEventListe for (int i = cc.length; --i >= 0; cnt += cc[i] != 0 ? 1 : 0) ; if (cnt == 0) return super.onKeyMultiple(inKeyCode, repeatCount, event); - mView.queueEvent(new Runnable() { + mRenderView.queueOnRenderThread(new Runnable() { // This method will be called on the rendering thread: public void run() { for (int i = 0, n = cc.length; i < n; i++) { @@ -1033,6 +1040,6 @@ public abstract class Godot extends FragmentActivity implements SensorEventListe progress.mOverallTotal)); } public void initInputDevices() { - mView.initInputDevices(); + mRenderView.initInputDevices(); } } diff --git a/platform/android/java/lib/src/org/godotengine/godot/GodotView.java b/platform/android/java/lib/src/org/godotengine/godot/GodotGLRenderView.java index 8d3c2ae319..9be93243b8 100644 --- a/platform/android/java/lib/src/org/godotengine/godot/GodotView.java +++ b/platform/android/java/lib/src/org/godotengine/godot/GodotGLRenderView.java @@ -1,5 +1,5 @@ /*************************************************************************/ -/* GodotView.java */ +/* GodotGLRenderView.java */ /*************************************************************************/ /* This file is part of: */ /* GODOT ENGINE */ @@ -35,6 +35,7 @@ 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; @@ -64,16 +65,14 @@ import org.godotengine.godot.xr.regular.RegularFallbackConfigChooser; * that matches it exactly (with regards to red/green/blue/alpha channels * bit depths). Failure to do so would result in an EGL_BAD_MATCH error. */ -public class GodotView extends GLSurfaceView { - - private static String TAG = GodotView.class.getSimpleName(); +public class GodotGLRenderView extends GLSurfaceView implements GodotRenderView { private final Godot activity; private final GodotInputHandler inputHandler; private final GestureDetector detector; private final GodotRenderer godotRenderer; - public GodotView(Godot activity, XRMode xrMode, boolean p_use_32_bits, boolean p_use_debug_opengl) { + public GodotGLRenderView(Godot activity, XRMode xrMode, boolean p_use_32_bits, boolean p_use_debug_opengl) { super(activity); GLUtils.use_32 = p_use_32_bits; GLUtils.use_debug_opengl = p_use_debug_opengl; @@ -85,10 +84,36 @@ public class GodotView extends GLSurfaceView { init(xrMode, false, 16, 0); } + @Override + public SurfaceView getView() { + return this; + } + + @Override public void initInputDevices() { this.inputHandler.initInputDevices(); } + @Override + public void queueOnRenderThread(Runnable event) { + queueEvent(event); + } + + @Override + public void onActivityPaused() { + onPause(); + } + + @Override + public void onActivityResumed() { + onResume(); + } + + @Override + public void onBackPressed() { + activity.onBackPressed(); + } + @SuppressLint("ClickableViewAccessibility") @Override public boolean onTouchEvent(MotionEvent event) { @@ -170,10 +195,6 @@ public class GodotView extends GLSurfaceView { setRenderer(godotRenderer); } - public void onBackPressed() { - activity.onBackPressed(); - } - @Override public void onResume() { super.onResume(); 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 68ce40ba10..016a3a8d18 100644 --- a/platform/android/java/lib/src/org/godotengine/godot/GodotIO.java +++ b/platform/android/java/lib/src/org/godotengine/godot/GodotIO.java @@ -53,8 +53,6 @@ public class GodotIO { Godot activity; GodotEditText edit; - MediaPlayer mediaPlayer; - final int SCREEN_LANDSCAPE = 0; final int SCREEN_PORTRAIT = 1; final int SCREEN_REVERSE_LANDSCAPE = 2; @@ -530,44 +528,14 @@ public class GodotIO { activity.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_FULL_SENSOR); } break; } - }; - - public void setEdit(GodotEditText _edit) { - edit = _edit; - } - - public void playVideo(String p_path) { - Uri filePath = Uri.parse(p_path); - mediaPlayer = new MediaPlayer(); - - try { - mediaPlayer.setAudioStreamType(AudioManager.STREAM_MUSIC); - mediaPlayer.setDataSource(activity.getApplicationContext(), filePath); - mediaPlayer.prepare(); - mediaPlayer.start(); - } catch (IOException e) { - System.out.println("IOError while playing video"); - } } - public boolean isVideoPlaying() { - if (mediaPlayer != null) { - return mediaPlayer.isPlaying(); - } - return false; + public int getScreenOrientation() { + return activity.getRequestedOrientation(); } - public void pauseVideo() { - if (mediaPlayer != null) { - mediaPlayer.pause(); - } - } - - public void stopVideo() { - if (mediaPlayer != null) { - mediaPlayer.release(); - mediaPlayer = null; - } + public void setEdit(GodotEditText _edit) { + edit = _edit; } public static final int SYSTEM_DIR_DESKTOP = 0; 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 89a65aea24..71fe822233 100644 --- a/platform/android/java/lib/src/org/godotengine/godot/GodotLib.java +++ b/platform/android/java/lib/src/org/godotengine/godot/GodotLib.java @@ -32,6 +32,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; @@ -72,11 +73,11 @@ public class GodotLib { public static native void resize(int width, int height); /** - * Invoked on the GL thread when the underlying Android surface is created or recreated. + * Invoked on the render thread when the underlying Android surface is created or recreated. + * @param p_surface * @param p_32_bits - * @see android.opengl.GLSurfaceView.Renderer#onSurfaceCreated(GL10, EGLConfig) */ - public static native void newcontext(boolean p_32_bits); + public static native void newcontext(Surface p_surface, boolean p_32_bits); /** * Forward {@link Activity#onBackPressed()} event from the main thread to the GL thread. diff --git a/platform/android/vulkan/vk_renderer_jni.h b/platform/android/java/lib/src/org/godotengine/godot/GodotRenderView.java index 017766fea2..170c433c9c 100644 --- a/platform/android/vulkan/vk_renderer_jni.h +++ b/platform/android/java/lib/src/org/godotengine/godot/GodotRenderView.java @@ -1,5 +1,5 @@ /*************************************************************************/ -/* vk_renderer_jni.h */ +/* GodotRenderView.java */ /*************************************************************************/ /* This file is part of: */ /* GODOT ENGINE */ @@ -28,19 +28,20 @@ /* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ /*************************************************************************/ -#ifndef VK_RENDERER_JNI_H -#define VK_RENDERER_JNI_H +package org.godotengine.godot; -#include <android/log.h> -#include <jni.h> +import android.view.SurfaceView; -extern "C" { -JNIEXPORT void JNICALL Java_org_godotengine_godot_vulkan_VkRenderer_nativeOnVkSurfaceCreated(JNIEnv *env, jobject obj, jobject j_surface); -JNIEXPORT void JNICALL Java_org_godotengine_godot_vulkan_VkRenderer_nativeOnVkSurfaceChanged(JNIEnv *env, jobject object, jobject j_surface, jint width, jint height); -JNIEXPORT void JNICALL Java_org_godotengine_godot_vulkan_VkRenderer_nativeOnVkResume(JNIEnv *env, jobject obj); -JNIEXPORT void JNICALL Java_org_godotengine_godot_vulkan_VkRenderer_nativeOnVkDrawFrame(JNIEnv *env, jobject obj); -JNIEXPORT void JNICALL Java_org_godotengine_godot_vulkan_VkRenderer_nativeOnVkPause(JNIEnv *env, jobject obj); -JNIEXPORT void JNICALL Java_org_godotengine_godot_vulkan_VkRenderer_nativeOnVkDestroy(JNIEnv *env, jobject obj); -} +public interface GodotRenderView { + + abstract public SurfaceView getView(); + + abstract public void initInputDevices(); -#endif // VK_RENDERER_JNI_H + abstract public void queueOnRenderThread(Runnable event); + + abstract public void onActivityPaused(); + abstract public void onActivityResumed(); + + abstract public void onBackPressed(); +} 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 ee9a2aee4f..3e5bb4a4c9 100644 --- a/platform/android/java/lib/src/org/godotengine/godot/GodotRenderer.java +++ b/platform/android/java/lib/src/org/godotengine/godot/GodotRenderer.java @@ -70,7 +70,7 @@ class GodotRenderer implements GLSurfaceView.Renderer { } public void onSurfaceCreated(GL10 gl, EGLConfig config) { - GodotLib.newcontext(GLUtils.use_32); + GodotLib.newcontext(null, GLUtils.use_32); for (GodotPlugin plugin : pluginRegistry.getAllPlugins()) { plugin.onGLSurfaceCreated(gl, config); } diff --git a/platform/android/java/lib/src/org/godotengine/godot/GodotVulkanRenderView.java b/platform/android/java/lib/src/org/godotengine/godot/GodotVulkanRenderView.java new file mode 100644 index 0000000000..30197d5729 --- /dev/null +++ b/platform/android/java/lib/src/org/godotengine/godot/GodotVulkanRenderView.java @@ -0,0 +1,142 @@ +/*************************************************************************/ +/* GodotVulkanRenderView.java */ +/*************************************************************************/ +/* This file is part of: */ +/* GODOT ENGINE */ +/* https://godotengine.org */ +/*************************************************************************/ +/* Copyright (c) 2007-2020 Juan Linietsky, Ariel Manzur. */ +/* Copyright (c) 2014-2020 Godot Engine contributors (cf. AUTHORS.md). */ +/* */ +/* Permission is hereby granted, free of charge, to any person obtaining */ +/* a copy of this software and associated documentation files (the */ +/* "Software"), to deal in the Software without restriction, including */ +/* without limitation the rights to use, copy, modify, merge, publish, */ +/* distribute, sublicense, and/or sell copies of the Software, and to */ +/* permit persons to whom the Software is furnished to do so, subject to */ +/* the following conditions: */ +/* */ +/* The above copyright notice and this permission notice shall be */ +/* included in all copies or substantial portions of the Software. */ +/* */ +/* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, */ +/* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF */ +/* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.*/ +/* IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY */ +/* CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, */ +/* TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE */ +/* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ +/*************************************************************************/ + +package org.godotengine.godot; + +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 { + + private final Godot mActivity; + private final GodotInputHandler mInputHandler; + private final GestureDetector mGestureDetector; + private final VkRenderer mRenderer; + + public GodotVulkanRenderView(Godot activity) { + super(activity); + + mActivity = activity; + mInputHandler = new GodotInputHandler(this); + mGestureDetector = new GestureDetector(mActivity, new GodotGestureHandler(this)); + mRenderer = new VkRenderer(); + + setFocusableInTouchMode(true); + startRenderer(mRenderer); + } + + @Override + public SurfaceView getView() { + return this; + } + + @Override + public void initInputDevices() { + mInputHandler.initInputDevices(); + } + + @Override + public void queueOnRenderThread(Runnable event) { + queueOnVkThread(event); + } + + @Override + public void onActivityPaused() { + onPause(); + } + + @Override + public void onActivityResumed() { + onResume(); + } + + @Override + public void onBackPressed() { + mActivity.onBackPressed(); + } + + @SuppressLint("ClickableViewAccessibility") + @Override + public boolean onTouchEvent(MotionEvent event) { + super.onTouchEvent(event); + mGestureDetector.onTouchEvent(event); + return mActivity.gotTouchEvent(event); + } + + @Override + public boolean onKeyUp(final int keyCode, KeyEvent event) { + return mInputHandler.onKeyUp(keyCode, event) || super.onKeyUp(keyCode, event); + } + + @Override + public boolean onKeyDown(final int keyCode, KeyEvent event) { + return mInputHandler.onKeyDown(keyCode, event) || super.onKeyDown(keyCode, event); + } + + @Override + public boolean onGenericMotionEvent(MotionEvent event) { + return mInputHandler.onGenericMotionEvent(event) || super.onGenericMotionEvent(event); + } + + @Override + public void onResume() { + super.onResume(); + + queueOnVkThread(new Runnable() { + @Override + public void run() { + // Resume the renderer + mRenderer.onVkResume(); + GodotLib.focusin(); + } + }); + } + + @Override + public void onPause() { + super.onPause(); + + queueOnVkThread(new Runnable() { + @Override + public void run() { + GodotLib.focusout(); + // Pause the renderer + mRenderer.onVkPause(); + } + }); + } +} 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 e901b4b36d..92bb118e44 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 @@ -51,7 +51,7 @@ public class GodotEditText extends EditText { // =========================================================== // Fields // =========================================================== - private GodotView mView; + private GodotRenderView mRenderView; private GodotTextInputWrapper mInputWrapper; private EditHandler sHandler = new EditHandler(this); private String mOriginText; @@ -76,22 +76,22 @@ public class GodotEditText extends EditText { // =========================================================== public GodotEditText(final Context context) { super(context); - this.initView(); + initView(); } public GodotEditText(final Context context, final AttributeSet attrs) { super(context, attrs); - this.initView(); + initView(); } public GodotEditText(final Context context, final AttributeSet attrs, final int defStyle) { super(context, attrs, defStyle); - this.initView(); + initView(); } protected void initView() { - this.setPadding(0, 0, 0, 0); - this.setImeOptions(EditorInfo.IME_FLAG_NO_EXTRACT_UI); + setPadding(0, 0, 0, 0); + setImeOptions(EditorInfo.IME_FLAG_NO_EXTRACT_UI); } private void handleMessage(final Message msg) { @@ -106,7 +106,7 @@ public class GodotEditText extends EditText { edit.mInputWrapper.setOriginText(text); edit.addTextChangedListener(edit.mInputWrapper); setMaxInputLength(edit, msg.arg1); - final InputMethodManager imm = (InputMethodManager)mView.getContext().getSystemService(Context.INPUT_METHOD_SERVICE); + final InputMethodManager imm = (InputMethodManager)mRenderView.getView().getContext().getSystemService(Context.INPUT_METHOD_SERVICE); imm.showSoftInput(edit, 0); } } break; @@ -115,9 +115,9 @@ public class GodotEditText extends EditText { GodotEditText edit = (GodotEditText)msg.obj; edit.removeTextChangedListener(mInputWrapper); - final InputMethodManager imm = (InputMethodManager)mView.getContext().getSystemService(Context.INPUT_METHOD_SERVICE); + final InputMethodManager imm = (InputMethodManager)mRenderView.getView().getContext().getSystemService(Context.INPUT_METHOD_SERVICE); imm.hideSoftInputFromWindow(edit.getWindowToken(), 0); - edit.mView.requestFocus(); + edit.mRenderView.getView().requestFocus(); } break; } } @@ -135,12 +135,12 @@ public class GodotEditText extends EditText { // =========================================================== // Getter & Setter // =========================================================== - public void setView(final GodotView view) { - this.mView = view; + public void setView(final GodotRenderView view) { + mRenderView = view; if (mInputWrapper == null) - mInputWrapper = new GodotTextInputWrapper(mView, this); - this.setOnEditorActionListener(mInputWrapper); - view.requestFocus(); + mInputWrapper = new GodotTextInputWrapper(mRenderView, this); + setOnEditorActionListener(mInputWrapper); + view.getView().requestFocus(); } // =========================================================== @@ -152,7 +152,7 @@ public class GodotEditText extends EditText { /* Let GlSurfaceView get focus if back key is input. */ if (keyCode == KeyEvent.KEYCODE_BACK) { - this.mView.requestFocus(); + mRenderView.getView().requestFocus(); } return true; @@ -162,7 +162,7 @@ public class GodotEditText extends EditText { // Methods // =========================================================== public void showKeyboard(String p_existing_text, int p_max_input_length) { - this.mOriginText = p_existing_text; + mOriginText = p_existing_text; final Message msg = new Message(); msg.what = HANDLER_OPEN_IME_KEYBOARD; 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 1a38a9c3d2..b1e0f66373 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 @@ -34,22 +34,22 @@ import android.util.Log; import android.view.GestureDetector; import android.view.MotionEvent; import org.godotengine.godot.GodotLib; -import org.godotengine.godot.GodotView; +import org.godotengine.godot.GodotRenderView; /** - * Handles gesture input related events for the {@link GodotView} view. + * Handles gesture input related events for the {@link GodotRenderView} view. * https://developer.android.com/reference/android/view/GestureDetector.SimpleOnGestureListener */ public class GodotGestureHandler extends GestureDetector.SimpleOnGestureListener { - private final GodotView godotView; + private final GodotRenderView mRenderView; - public GodotGestureHandler(GodotView godotView) { - this.godotView = godotView; + public GodotGestureHandler(GodotRenderView godotView) { + mRenderView = godotView; } private void queueEvent(Runnable task) { - godotView.queueEvent(task); + mRenderView.queueOnRenderThread(task); } @Override 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 e00ca86c41..0e4fc65119 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 @@ -42,27 +42,27 @@ import java.util.Collections; import java.util.Comparator; import java.util.List; import org.godotengine.godot.GodotLib; -import org.godotengine.godot.GodotView; +import org.godotengine.godot.GodotRenderView; import org.godotengine.godot.input.InputManagerCompat.InputDeviceListener; /** - * Handles input related events for the {@link GodotView} view. + * Handles input related events for the {@link GodotRenderView} view. */ public class GodotInputHandler implements InputDeviceListener { - private final ArrayList<Joystick> joysticksDevices = new ArrayList<Joystick>(); + private final ArrayList<Joystick> mJoysticksDevices = new ArrayList<Joystick>(); - private final GodotView godotView; - private final InputManagerCompat inputManager; + private final GodotRenderView mRenderView; + private final InputManagerCompat mInputManager; - public GodotInputHandler(GodotView godotView) { - this.godotView = godotView; - this.inputManager = InputManagerCompat.Factory.getInputManager(godotView.getContext()); - this.inputManager.registerInputDeviceListener(this, null); + public GodotInputHandler(GodotRenderView godotView) { + mRenderView = godotView; + mInputManager = InputManagerCompat.Factory.getInputManager(mRenderView.getView().getContext()); + mInputManager.registerInputDeviceListener(this, null); } private void queueEvent(Runnable task) { - godotView.queueEvent(task); + mRenderView.queueOnRenderThread(task); } private boolean isKeyEvent_GameDevice(int source) { @@ -113,7 +113,7 @@ public class GodotInputHandler implements InputDeviceListener { public boolean onKeyDown(final int keyCode, KeyEvent event) { if (keyCode == KeyEvent.KEYCODE_BACK) { - godotView.onBackPressed(); + mRenderView.onBackPressed(); // press 'back' button should not terminate program //normal handle 'back' event in game logic return true; @@ -164,7 +164,7 @@ public class GodotInputHandler implements InputDeviceListener { // Check if the device exists if (device_id > -1) { - Joystick joy = joysticksDevices.get(device_id); + Joystick joy = mJoysticksDevices.get(device_id); for (int i = 0; i < joy.axes.size(); i++) { InputDevice.MotionRange range = joy.axes.get(i); @@ -208,11 +208,11 @@ public class GodotInputHandler implements InputDeviceListener { public void initInputDevices() { /* initially add input devices*/ - int[] deviceIds = inputManager.getInputDeviceIds(); + int[] deviceIds = mInputManager.getInputDeviceIds(); for (int deviceId : deviceIds) { - InputDevice device = inputManager.getInputDevice(deviceId); + InputDevice device = mInputManager.getInputDevice(deviceId); if (DEBUG) { - Log.v("GodotView", String.format("init() deviceId:%d, Name:%s\n", deviceId, device.getName())); + Log.v("GodotInputHandler", String.format("init() deviceId:%d, Name:%s\n", deviceId, device.getName())); } onInputDeviceAdded(deviceId); } @@ -224,13 +224,13 @@ public class GodotInputHandler implements InputDeviceListener { // Check if the device has not been already added if (id < 0) { - InputDevice device = inputManager.getInputDevice(deviceId); + InputDevice device = mInputManager.getInputDevice(deviceId); //device can be null if deviceId is not found if (device != null) { int sources = device.getSources(); if (((sources & InputDevice.SOURCE_GAMEPAD) == InputDevice.SOURCE_GAMEPAD) || ((sources & InputDevice.SOURCE_JOYSTICK) == InputDevice.SOURCE_JOYSTICK)) { - id = joysticksDevices.size(); + id = mJoysticksDevices.size(); Joystick joy = new Joystick(); joy.device_id = deviceId; @@ -249,7 +249,7 @@ public class GodotInputHandler implements InputDeviceListener { } } - joysticksDevices.add(joy); + mJoysticksDevices.add(joy); final int device_id = id; final String name = joy.name; @@ -270,7 +270,7 @@ public class GodotInputHandler implements InputDeviceListener { // Check if the evice has not been already removed if (device_id > -1) { - joysticksDevices.remove(device_id); + mJoysticksDevices.remove(device_id); queueEvent(new Runnable() { @Override @@ -360,8 +360,8 @@ public class GodotInputHandler implements InputDeviceListener { } private int findJoystickDevice(int device_id) { - for (int i = 0; i < joysticksDevices.size(); i++) { - if (joysticksDevices.get(i).device_id == device_id) { + for (int i = 0; i < mJoysticksDevices.size(); i++) { + if (mJoysticksDevices.get(i).device_id == device_id) { return i; } } 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 18f2d57661..e12ff266bf 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 @@ -48,7 +48,7 @@ public class GodotTextInputWrapper implements TextWatcher, OnEditorActionListene // =========================================================== // Fields // =========================================================== - private final GodotView mView; + private final GodotRenderView mRenderView; private final GodotEditText mEdit; private String mOriginText; @@ -56,9 +56,9 @@ public class GodotTextInputWrapper implements TextWatcher, OnEditorActionListene // Constructors // =========================================================== - public GodotTextInputWrapper(final GodotView view, final GodotEditText edit) { - this.mView = view; - this.mEdit = edit; + public GodotTextInputWrapper(final GodotRenderView view, final GodotEditText edit) { + mRenderView = view; + mEdit = edit; } // =========================================================== @@ -66,13 +66,13 @@ public class GodotTextInputWrapper implements TextWatcher, OnEditorActionListene // =========================================================== private boolean isFullScreenEdit() { - final TextView textField = this.mEdit; + final TextView textField = mEdit; final InputMethodManager imm = (InputMethodManager)textField.getContext().getSystemService(Context.INPUT_METHOD_SERVICE); return imm.isFullscreenMode(); } public void setOriginText(final String originText) { - this.mOriginText = originText; + mOriginText = originText; } // =========================================================== @@ -87,7 +87,7 @@ public class GodotTextInputWrapper implements TextWatcher, OnEditorActionListene public void beforeTextChanged(final CharSequence pCharSequence, final int start, final int count, final int after) { //Log.d(TAG, "beforeTextChanged(" + pCharSequence + ")start: " + start + ",count: " + count + ",after: " + after); - mView.queueEvent(new Runnable() { + mRenderView.queueOnRenderThread(new Runnable() { @Override public void run() { for (int i = 0; i < count; ++i) { @@ -106,7 +106,7 @@ public class GodotTextInputWrapper implements TextWatcher, OnEditorActionListene for (int i = start; i < start + count; ++i) { newChars[i - start] = pCharSequence.charAt(i); } - mView.queueEvent(new Runnable() { + mRenderView.queueOnRenderThread(new Runnable() { @Override public void run() { for (int i = 0; i < count; ++i) { @@ -124,10 +124,10 @@ public class GodotTextInputWrapper implements TextWatcher, OnEditorActionListene @Override public boolean onEditorAction(final TextView pTextView, final int pActionID, final KeyEvent pKeyEvent) { - if (this.mEdit == pTextView && this.isFullScreenEdit()) { + if (mEdit == pTextView && isFullScreenEdit()) { final String characters = pKeyEvent.getCharacters(); - mView.queueEvent(new Runnable() { + mRenderView.queueOnRenderThread(new Runnable() { @Override public void run() { for (int i = 0; i < characters.length(); i++) { @@ -144,7 +144,7 @@ public class GodotTextInputWrapper implements TextWatcher, OnEditorActionListene GodotLib.key(KeyEvent.KEYCODE_ENTER, KeyEvent.KEYCODE_ENTER, 0, true); GodotLib.key(KeyEvent.KEYCODE_ENTER, KeyEvent.KEYCODE_ENTER, 0, false); - this.mView.requestFocus(); + mRenderView.getView().requestFocus(); return true; } return false; 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 e3683704e1..a051164d15 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 @@ -34,6 +34,8 @@ import android.app.Activity; import android.content.Intent; import android.support.annotation.NonNull; import android.support.annotation.Nullable; +import android.text.TextUtils; +import android.util.Log; import android.view.Surface; import android.view.View; import java.lang.reflect.Method; @@ -41,8 +43,10 @@ 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; /** @@ -70,7 +74,10 @@ import org.godotengine.godot.Godot; */ public abstract class GodotPlugin { + private static final String TAG = GodotPlugin.class.getSimpleName(); + private final Godot godot; + private final ConcurrentHashMap<String, SignalInfo> registeredSignals = new ConcurrentHashMap<>(); public GodotPlugin(Godot godot) { this.godot = godot; @@ -118,6 +125,13 @@ public abstract class GodotPlugin { nativeRegisterMethod(getPluginName(), method.getName(), method.getReturnType().getName(), pt); } + // Register the signals for this plugin. + for (SignalInfo signalInfo : getPluginSignals()) { + String signalName = signalInfo.getName(); + nativeRegisterSignal(getPluginName(), signalName, signalInfo.getParamTypesNames()); + registeredSignals.put(signalName, signalInfo); + } + // Get the list of gdnative libraries to register. Set<String> gdnativeLibrariesPaths = getPluginGDNativeLibrariesPaths(); if (!gdnativeLibrariesPaths.isEmpty()) { @@ -220,7 +234,17 @@ public abstract class GodotPlugin { * Returns the list of methods to be exposed to Godot. */ @NonNull - public abstract List<String> getPluginMethods(); + public List<String> getPluginMethods() { + return Collections.emptyList(); + } + + /** + * Returns the list of signals to be exposed to Godot. + */ + @NonNull + public Set<SignalInfo> getPluginSignals() { + return Collections.emptySet(); + } /** * Returns the paths for the plugin's gdnative libraries. @@ -253,6 +277,49 @@ public abstract class GodotPlugin { } /** + * Emit a registered Godot signal. + * @param signalName + * @param signalArgs + */ + protected void emitSignal(final String signalName, final Object... signalArgs) { + try { + // Check that the given signal is among the registered set. + SignalInfo signalInfo = registeredSignals.get(signalName); + if (signalInfo == null) { + throw new IllegalArgumentException( + "Signal " + signalName + " is not registered for this plugin."); + } + + // Validate the arguments count. + Class<?>[] signalParamTypes = signalInfo.getParamTypes(); + if (signalArgs.length != signalParamTypes.length) { + throw new IllegalArgumentException( + "Invalid arguments count. Should be " + signalParamTypes.length + " but is " + signalArgs.length); + } + + // Validate the argument's types. + for (int i = 0; i < signalParamTypes.length; i++) { + if (!signalParamTypes[i].isInstance(signalArgs[i])) { + throw new IllegalArgumentException( + "Invalid type for argument #" + i + ". Should be of type " + signalParamTypes[i].getName()); + } + } + + runOnRenderThread(new Runnable() { + @Override + public void run() { + nativeEmitSignal(getPluginName(), signalName, signalArgs); + } + }); + } catch (IllegalArgumentException exception) { + Log.w(TAG, exception.getMessage()); + if (BuildConfig.DEBUG) { + throw exception; + } + } + } + + /** * Used to setup a {@link GodotPlugin} instance. * @param p_name Name of the instance. */ @@ -272,4 +339,20 @@ public abstract class GodotPlugin { * @param gdnlibPaths Paths to the libraries relative to the 'assets' directory. */ private native void nativeRegisterGDNativeLibraries(String[] gdnlibPaths); + + /** + * Used to complete registration of the {@link GodotPlugin} instance's methods. + * @param pluginName Name of the plugin + * @param signalName Name of the signal to register + * @param signalParamTypes Signal parameters types + */ + private native void nativeRegisterSignal(String pluginName, String signalName, String[] signalParamTypes); + + /** + * Used to emit signal by {@link GodotPlugin} instance. + * @param pluginName Name of the plugin + * @param signalName Name of the signal to emit + * @param signalParams Signal parameters + */ + private native void nativeEmitSignal(String pluginName, String signalName, Object[] signalParams); } 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 new file mode 100644 index 0000000000..f907706889 --- /dev/null +++ b/platform/android/java/lib/src/org/godotengine/godot/plugin/SignalInfo.java @@ -0,0 +1,98 @@ +/*************************************************************************/ +/* SignalInfo.java */ +/*************************************************************************/ +/* This file is part of: */ +/* GODOT ENGINE */ +/* https://godotengine.org */ +/*************************************************************************/ +/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */ +/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */ +/* */ +/* Permission is hereby granted, free of charge, to any person obtaining */ +/* a copy of this software and associated documentation files (the */ +/* "Software"), to deal in the Software without restriction, including */ +/* without limitation the rights to use, copy, modify, merge, publish, */ +/* distribute, sublicense, and/or sell copies of the Software, and to */ +/* permit persons to whom the Software is furnished to do so, subject to */ +/* the following conditions: */ +/* */ +/* The above copyright notice and this permission notice shall be */ +/* included in all copies or substantial portions of the Software. */ +/* */ +/* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, */ +/* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF */ +/* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.*/ +/* IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY */ +/* CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, */ +/* TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE */ +/* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ +/*************************************************************************/ + +package org.godotengine.godot.plugin; + +import android.support.annotation.NonNull; +import android.text.TextUtils; +import java.util.Arrays; + +/** + * Store information about a {@link GodotPlugin}'s signal. + */ +public final class SignalInfo { + + private final String name; + private final Class<?>[] paramTypes; + private final String[] paramTypesNames; + + public SignalInfo(@NonNull String signalName, Class<?>... paramTypes) { + if (TextUtils.isEmpty(signalName)) { + throw new IllegalArgumentException("Invalid signal name: " + signalName); + } + + this.name = signalName; + this.paramTypes = paramTypes == null ? new Class<?>[ 0 ] : paramTypes; + this.paramTypesNames = new String[this.paramTypes.length]; + for (int i = 0; i < this.paramTypes.length; i++) { + this.paramTypesNames[i] = this.paramTypes[i].getName(); + } + } + + public String getName() { + return name; + } + + Class<?>[] getParamTypes() { + return paramTypes; + } + + String[] getParamTypesNames() { + return paramTypesNames; + } + + @Override + public String toString() { + return "SignalInfo{" + + + "name='" + name + '\'' + + ", paramsTypes=" + Arrays.toString(paramTypes) + + '}'; + } + + @Override + public boolean equals(Object o) { + if (this == o) { + return true; + } + if (!(o instanceof SignalInfo)) { + return false; + } + + SignalInfo that = (SignalInfo)o; + + return name.equals(that.name); + } + + @Override + public int hashCode() { + return name.hashCode(); + } +} diff --git a/platform/android/java/lib/src/org/godotengine/godot/vulkan/VkRenderer.kt b/platform/android/java/lib/src/org/godotengine/godot/vulkan/VkRenderer.kt index 67faad8ddd..608ad48df9 100644 --- a/platform/android/java/lib/src/org/godotengine/godot/vulkan/VkRenderer.kt +++ b/platform/android/java/lib/src/org/godotengine/godot/vulkan/VkRenderer.kt @@ -33,6 +33,11 @@ package org.godotengine.godot.vulkan import android.view.Surface +import org.godotengine.godot.Godot +import org.godotengine.godot.GodotLib +import org.godotengine.godot.plugin.GodotPlugin +import org.godotengine.godot.plugin.GodotPluginRegistry + /** * Responsible to setting up and driving the Vulkan rendering logic. * @@ -48,52 +53,64 @@ import android.view.Surface */ internal class VkRenderer { + private val pluginRegistry: GodotPluginRegistry = GodotPluginRegistry.getPluginRegistry() + /** * Called when the surface is created and signals the beginning of rendering. */ fun onVkSurfaceCreated(surface: Surface) { - nativeOnVkSurfaceCreated(surface) + // TODO: properly implement surface re-creation: + // GodotLib.newcontext should be called here once it's done. + //GodotLib.newcontext(surface, false) + + for (plugin in pluginRegistry.getAllPlugins()) { + plugin.onVkSurfaceCreated(surface) + } } /** * Called after the surface is created and whenever its size changes. */ fun onVkSurfaceChanged(surface: Surface, width: Int, height: Int) { - nativeOnVkSurfaceChanged(surface, width, height) + GodotLib.resize(width, height) + + // TODO: properly implement surface re-creation: + // Update the native renderer instead of restarting the app. + // GodotLib.newcontext should not be called here once it's done. + GodotLib.newcontext(surface, false) + + for (plugin in pluginRegistry.getAllPlugins()) { + plugin.onVkSurfaceChanged(surface, width, height) + } } /** * Called to draw the current frame. */ fun onVkDrawFrame() { - nativeOnVkDrawFrame() + GodotLib.step() + for (plugin in pluginRegistry.getAllPlugins()) { + plugin.onVkDrawFrame() + } } /** * Called when the rendering thread is resumed. */ fun onVkResume() { - nativeOnVkResume() + GodotLib.onRendererResumed() } /** * Called when the rendering thread is paused. */ fun onVkPause() { - nativeOnVkPause() + GodotLib.onRendererPaused() } /** * Called when the rendering thread is destroyed and used as signal to tear down the Vulkan logic. */ fun onVkDestroy() { - nativeOnVkDestroy() } - - private external fun nativeOnVkSurfaceCreated(surface: Surface) - private external fun nativeOnVkSurfaceChanged(surface: Surface, width: Int, height: Int) - private external fun nativeOnVkResume() - private external fun nativeOnVkDrawFrame() - private external fun nativeOnVkPause() - private external fun nativeOnVkDestroy() } diff --git a/platform/android/java/lib/src/org/godotengine/godot/vulkan/VkSurfaceView.kt b/platform/android/java/lib/src/org/godotengine/godot/vulkan/VkSurfaceView.kt index 1c594f3201..6b0e12b21a 100644 --- a/platform/android/java/lib/src/org/godotengine/godot/vulkan/VkSurfaceView.kt +++ b/platform/android/java/lib/src/org/godotengine/godot/vulkan/VkSurfaceView.kt @@ -49,7 +49,7 @@ import android.view.SurfaceView * UI thread. * </ul> */ -internal class VkSurfaceView(context: Context) : SurfaceView(context), SurfaceHolder.Callback { +open internal class VkSurfaceView(context: Context) : SurfaceView(context), SurfaceHolder.Callback { companion object { fun checkState(expression: Boolean, errorMessage: Any) { @@ -100,7 +100,7 @@ internal class VkSurfaceView(context: Context) : SurfaceView(context), SurfaceHo * * Must not be called before a [VkRenderer] has been set. */ - fun onResume() { + open fun onResume() { vkThread.onResume() } @@ -109,7 +109,7 @@ internal class VkSurfaceView(context: Context) : SurfaceView(context), SurfaceHo * * Must not be called before a [VkRenderer] has been set. */ - fun onPause() { + open fun onPause() { vkThread.onPause() } diff --git a/platform/android/java/lib/src/org/godotengine/godot/vulkan/VkThread.kt b/platform/android/java/lib/src/org/godotengine/godot/vulkan/VkThread.kt index 2e332840bf..7557c8aa22 100644 --- a/platform/android/java/lib/src/org/godotengine/godot/vulkan/VkThread.kt +++ b/platform/android/java/lib/src/org/godotengine/godot/vulkan/VkThread.kt @@ -219,9 +219,9 @@ internal class VkThread(private val vkSurfaceView: VkSurfaceView, private val vk vkRenderer.onVkDrawFrame() } } catch (ex: InterruptedException) { - Log.i(TAG, ex.message) + Log.i(TAG, "InterruptedException", ex) } catch (ex: IllegalStateException) { - Log.i(TAG, ex.message) + Log.i(TAG, "IllegalStateException", ex) } finally { threadExiting() } 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 f2b4c95a2c..31cf696195 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 @@ -51,7 +51,6 @@ public class RegularContextFactory implements GLSurfaceView.EGLContextFactory { private static int EGL_CONTEXT_CLIENT_VERSION = 0x3098; public EGLContext createContext(EGL10 egl, EGLDisplay display, EGLConfig eglConfig) { - String driver_name = GodotLib.getGlobal("rendering/quality/driver/driver_name"); // FIXME: Add support for Vulkan. Log.w(TAG, "creating OpenGL ES 2.0 context :"); diff --git a/platform/android/java/plugins/godotpayment/build.gradle b/platform/android/java/plugins/godotpayment/build.gradle index 4f376c4587..ffab86e26e 100644 --- a/platform/android/java/plugins/godotpayment/build.gradle +++ b/platform/android/java/plugins/godotpayment/build.gradle @@ -3,6 +3,7 @@ apply plugin: 'com.android.library' android { compileSdkVersion versions.compileSdk buildToolsVersion versions.buildTools + useLibrary 'org.apache.http.legacy' defaultConfig { minSdkVersion versions.minSdk 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 179cc08ed1..d42ded0c9b 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 @@ -34,8 +34,8 @@ import android.app.Activity; import android.app.ProgressDialog; import android.os.AsyncTask; import java.lang.ref.WeakReference; -import org.godotengine.godot.utils.HttpRequester; -import org.godotengine.godot.utils.RequestParams; +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/lib/src/org/godotengine/godot/utils/CustomSSLSocketFactory.java b/platform/android/java/plugins/godotpayment/src/main/java/org/godotengine/godot/plugin/payment/utils/CustomSSLSocketFactory.java index c78e8c1c66..9571769cd3 100644 --- a/platform/android/java/lib/src/org/godotengine/godot/utils/CustomSSLSocketFactory.java +++ b/platform/android/java/plugins/godotpayment/src/main/java/org/godotengine/godot/plugin/payment/utils/CustomSSLSocketFactory.java @@ -28,7 +28,8 @@ /* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ /*************************************************************************/ -package org.godotengine.godot.utils; +package org.godotengine.godot.plugin.payment.utils; + import java.io.IOException; import java.net.Socket; import java.net.UnknownHostException; diff --git a/platform/android/java/lib/src/org/godotengine/godot/utils/HttpRequester.java b/platform/android/java/plugins/godotpayment/src/main/java/org/godotengine/godot/plugin/payment/utils/HttpRequester.java index 68f9a83597..dcb983201e 100644 --- a/platform/android/java/lib/src/org/godotengine/godot/utils/HttpRequester.java +++ b/platform/android/java/plugins/godotpayment/src/main/java/org/godotengine/godot/plugin/payment/utils/HttpRequester.java @@ -28,7 +28,7 @@ /* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ /*************************************************************************/ -package org.godotengine.godot.utils; +package org.godotengine.godot.plugin.payment.utils; import android.content.Context; import android.content.SharedPreferences; @@ -61,6 +61,7 @@ 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/lib/src/org/godotengine/godot/utils/RequestParams.java b/platform/android/java/plugins/godotpayment/src/main/java/org/godotengine/godot/plugin/payment/utils/RequestParams.java index 25fa10647d..4be8b37473 100644 --- a/platform/android/java/lib/src/org/godotengine/godot/utils/RequestParams.java +++ b/platform/android/java/plugins/godotpayment/src/main/java/org/godotengine/godot/plugin/payment/utils/RequestParams.java @@ -28,10 +28,9 @@ /* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ /*************************************************************************/ -package org.godotengine.godot.utils; +package org.godotengine.godot.plugin.payment.utils; import java.util.ArrayList; -import java.util.Date; import java.util.HashMap; import java.util.List; import org.apache.http.NameValuePair; diff --git a/platform/android/java_godot_io_wrapper.cpp b/platform/android/java_godot_io_wrapper.cpp index 8d075f8e97..0da0bd6387 100644 --- a/platform/android/java_godot_io_wrapper.cpp +++ b/platform/android/java_godot_io_wrapper.cpp @@ -56,11 +56,8 @@ GodotIOJavaWrapper::GodotIOJavaWrapper(JNIEnv *p_env, jobject p_godot_io_instanc _show_keyboard = p_env->GetMethodID(cls, "showKeyboard", "(Ljava/lang/String;I)V"); _hide_keyboard = p_env->GetMethodID(cls, "hideKeyboard", "()V"); _set_screen_orientation = p_env->GetMethodID(cls, "setScreenOrientation", "(I)V"); + _get_screen_orientation = p_env->GetMethodID(cls, "getScreenOrientation", "()I"); _get_system_dir = p_env->GetMethodID(cls, "getSystemDir", "(I)Ljava/lang/String;"); - _play_video = p_env->GetMethodID(cls, "playVideo", "(Ljava/lang/String;)V"); - _is_video_playing = p_env->GetMethodID(cls, "isVideoPlaying", "()Z"); - _pause_video = p_env->GetMethodID(cls, "pauseVideo", "()V"); - _stop_video = p_env->GetMethodID(cls, "stopVideo", "()V"); } } @@ -157,40 +154,22 @@ void GodotIOJavaWrapper::set_screen_orientation(int p_orient) { } } -String GodotIOJavaWrapper::get_system_dir(int p_dir) { - if (_get_system_dir) { +int GodotIOJavaWrapper::get_screen_orientation() { + if (_get_screen_orientation) { JNIEnv *env = ThreadAndroid::get_env(); - jstring s = (jstring)env->CallObjectMethod(godot_io_instance, _get_system_dir, p_dir); - return jstring_to_string(s, env); + return env->CallIntMethod(godot_io_instance, _get_screen_orientation); } else { - return String("."); + return 0; } } -void GodotIOJavaWrapper::play_video(const String &p_path) { - // Why is this not here?!?! -} - -bool GodotIOJavaWrapper::is_video_playing() { - if (_is_video_playing) { +String GodotIOJavaWrapper::get_system_dir(int p_dir) { + if (_get_system_dir) { JNIEnv *env = ThreadAndroid::get_env(); - return env->CallBooleanMethod(godot_io_instance, _is_video_playing); + jstring s = (jstring)env->CallObjectMethod(godot_io_instance, _get_system_dir, p_dir); + return jstring_to_string(s, env); } else { - return false; - } -} - -void GodotIOJavaWrapper::pause_video() { - if (_pause_video) { - JNIEnv *env = ThreadAndroid::get_env(); - env->CallVoidMethod(godot_io_instance, _pause_video); - } -} - -void GodotIOJavaWrapper::stop_video() { - if (_stop_video) { - JNIEnv *env = ThreadAndroid::get_env(); - env->CallVoidMethod(godot_io_instance, _stop_video); + return String("."); } } diff --git a/platform/android/java_godot_io_wrapper.h b/platform/android/java_godot_io_wrapper.h index 7dfed52187..dbb3b564f6 100644 --- a/platform/android/java_godot_io_wrapper.h +++ b/platform/android/java_godot_io_wrapper.h @@ -54,11 +54,8 @@ private: jmethodID _show_keyboard = 0; jmethodID _hide_keyboard = 0; jmethodID _set_screen_orientation = 0; + jmethodID _get_screen_orientation = 0; jmethodID _get_system_dir = 0; - jmethodID _play_video = 0; - jmethodID _is_video_playing = 0; - jmethodID _pause_video = 0; - jmethodID _stop_video = 0; public: GodotIOJavaWrapper(JNIEnv *p_env, jobject p_godot_io_instance); @@ -78,11 +75,8 @@ public: int get_vk_height(); void set_vk_height(int p_height); void set_screen_orientation(int p_orient); + int get_screen_orientation(); String get_system_dir(int p_dir); - void play_video(const String &p_path); - bool is_video_playing(); - void pause_video(); - void stop_video(); }; #endif /* !JAVA_GODOT_IO_WRAPPER_H */ diff --git a/platform/android/java_godot_lib_jni.cpp b/platform/android/java_godot_lib_jni.cpp index 9d44ab4619..a6730903cc 100644 --- a/platform/android/java_godot_lib_jni.cpp +++ b/platform/android/java_godot_lib_jni.cpp @@ -34,13 +34,14 @@ #include "java_godot_wrapper.h" #include "android/asset_manager_jni.h" -#include "android_keys_utils.h" #include "api/java_class_wrapper.h" +#include "api/jni_singleton.h" #include "audio_driver_jandroid.h" #include "core/engine.h" -#include "core/input/input_filter.h" +#include "core/input/input.h" #include "core/project_settings.h" #include "dir_access_jandroid.h" +#include "display_server_android.h" #include "file_access_android.h" #include "file_access_jandroid.h" #include "jni_utils.h" @@ -52,6 +53,8 @@ #include <unistd.h> +#include <android/native_window_jni.h> + static JavaClassWrapper *java_class_wrapper = nullptr; static OS_Android *os_android = nullptr; static GodotJavaWrapper *godot_java = nullptr; @@ -160,22 +163,26 @@ JNIEXPORT void JNICALL Java_org_godotengine_godot_GodotLib_setup(JNIEnv *env, jc } java_class_wrapper = memnew(JavaClassWrapper(godot_java->get_activity())); + ClassDB::register_class<JNISingleton>(); } JNIEXPORT void JNICALL Java_org_godotengine_godot_GodotLib_resize(JNIEnv *env, jclass clazz, jint width, jint height) { if (os_android) - os_android->set_display_size(Size2(width, height)); + os_android->set_display_size(Size2i(width, height)); } -JNIEXPORT void JNICALL Java_org_godotengine_godot_GodotLib_newcontext(JNIEnv *env, jclass clazz, jboolean p_32_bits) { - +JNIEXPORT void JNICALL Java_org_godotengine_godot_GodotLib_newcontext(JNIEnv *env, jclass clazz, jobject p_surface, jboolean p_32_bits) { if (os_android) { if (step == 0) { // During startup os_android->set_context_is_16_bits(!p_32_bits); + if (p_surface) { + ANativeWindow *native_window = ANativeWindow_fromSurface(env, p_surface); + os_android->set_native_window(native_window); + } } else { - // GL context recreated because it was lost; restart app to let it reload everything + // Rendering context recreated because it was lost; restart app to let it reload everything os_android->main_loop_end(); godot_java->restart(env); step = -1; // Ensure no further steps are attempted @@ -195,7 +202,6 @@ JNIEXPORT void JNICALL Java_org_godotengine_godot_GodotLib_step(JNIEnv *env, jcl return; if (step == 0) { - // Since Godot is initialized on the UI thread, _main_thread_id was set to that thread's id, // but for Godot purposes, the main thread is the one running the game loop Main::setup2(Thread::get_caller_id()); @@ -213,10 +219,10 @@ JNIEXPORT void JNICALL Java_org_godotengine_godot_GodotLib_step(JNIEnv *env, jcl ++step; } - os_android->process_accelerometer(accelerometer); - os_android->process_gravity(gravity); - os_android->process_magnetometer(magnetometer); - os_android->process_gyroscope(gyroscope); + DisplayServerAndroid::get_singleton()->process_accelerometer(accelerometer); + DisplayServerAndroid::get_singleton()->process_gravity(gravity); + DisplayServerAndroid::get_singleton()->process_magnetometer(magnetometer); + DisplayServerAndroid::get_singleton()->process_gyroscope(gyroscope); if (os_android->main_loop_iterate()) { @@ -229,18 +235,18 @@ JNIEXPORT void JNICALL Java_org_godotengine_godot_GodotLib_touch(JNIEnv *env, jc if (step == 0) return; - Vector<OS_Android::TouchPos> points; + Vector<DisplayServerAndroid::TouchPos> points; for (int i = 0; i < count; i++) { jint p[3]; env->GetIntArrayRegion(positions, i * 3, 3, p); - OS_Android::TouchPos tp; + DisplayServerAndroid::TouchPos tp; tp.pos = Point2(p[1], p[2]); tp.id = p[0]; points.push_back(tp); } - os_android->process_touch(ev, pointer, points); + DisplayServerAndroid::get_singleton()->process_touch(ev, pointer, points); /* if (os_android) @@ -252,78 +258,78 @@ JNIEXPORT void JNICALL Java_org_godotengine_godot_GodotLib_hover(JNIEnv *env, jc if (step == 0) return; - os_android->process_hover(p_type, Point2(p_x, p_y)); + DisplayServerAndroid::get_singleton()->process_hover(p_type, Point2(p_x, p_y)); } JNIEXPORT void JNICALL Java_org_godotengine_godot_GodotLib_doubletap(JNIEnv *env, jclass clazz, jint p_x, jint p_y) { if (step == 0) return; - os_android->process_double_tap(Point2(p_x, p_y)); + DisplayServerAndroid::get_singleton()->process_double_tap(Point2(p_x, p_y)); } JNIEXPORT void JNICALL Java_org_godotengine_godot_GodotLib_scroll(JNIEnv *env, jclass clazz, jint p_x, jint p_y) { if (step == 0) return; - os_android->process_scroll(Point2(p_x, p_y)); + DisplayServerAndroid::get_singleton()->process_scroll(Point2(p_x, p_y)); } JNIEXPORT void JNICALL Java_org_godotengine_godot_GodotLib_joybutton(JNIEnv *env, jclass clazz, jint p_device, jint p_button, jboolean p_pressed) { if (step == 0) return; - OS_Android::JoypadEvent jevent; + DisplayServerAndroid::JoypadEvent jevent; jevent.device = p_device; - jevent.type = OS_Android::JOY_EVENT_BUTTON; + jevent.type = DisplayServerAndroid::JOY_EVENT_BUTTON; jevent.index = p_button; jevent.pressed = p_pressed; - os_android->process_joy_event(jevent); + DisplayServerAndroid::get_singleton()->process_joy_event(jevent); } JNIEXPORT void JNICALL Java_org_godotengine_godot_GodotLib_joyaxis(JNIEnv *env, jclass clazz, jint p_device, jint p_axis, jfloat p_value) { if (step == 0) return; - OS_Android::JoypadEvent jevent; + DisplayServerAndroid::JoypadEvent jevent; jevent.device = p_device; - jevent.type = OS_Android::JOY_EVENT_AXIS; + jevent.type = DisplayServerAndroid::JOY_EVENT_AXIS; jevent.index = p_axis; jevent.value = p_value; - os_android->process_joy_event(jevent); + DisplayServerAndroid::get_singleton()->process_joy_event(jevent); } JNIEXPORT void JNICALL Java_org_godotengine_godot_GodotLib_joyhat(JNIEnv *env, jclass clazz, jint p_device, jint p_hat_x, jint p_hat_y) { if (step == 0) return; - OS_Android::JoypadEvent jevent; + DisplayServerAndroid::JoypadEvent jevent; jevent.device = p_device; - jevent.type = OS_Android::JOY_EVENT_HAT; + jevent.type = DisplayServerAndroid::JOY_EVENT_HAT; int hat = 0; if (p_hat_x != 0) { if (p_hat_x < 0) - hat |= InputDefault::HAT_MASK_LEFT; + hat |= Input::HAT_MASK_LEFT; else - hat |= InputDefault::HAT_MASK_RIGHT; + hat |= Input::HAT_MASK_RIGHT; } if (p_hat_y != 0) { if (p_hat_y < 0) - hat |= InputDefault::HAT_MASK_UP; + hat |= Input::HAT_MASK_UP; else - hat |= InputDefault::HAT_MASK_DOWN; + hat |= Input::HAT_MASK_DOWN; } jevent.hat = hat; - os_android->process_joy_event(jevent); + DisplayServerAndroid::get_singleton()->process_joy_event(jevent); } JNIEXPORT void JNICALL Java_org_godotengine_godot_GodotLib_joyconnectionchanged(JNIEnv *env, jclass clazz, jint p_device, jboolean p_connected, jstring p_name) { if (os_android) { String name = jstring_to_string(p_name, env); - os_android->joy_connection_changed(p_device, p_connected, name); + Input::get_singleton()->joy_connection_changed(p_device, p_connected, name); } } @@ -331,29 +337,7 @@ JNIEXPORT void JNICALL Java_org_godotengine_godot_GodotLib_key(JNIEnv *env, jcla if (step == 0) return; - Ref<InputEventKey> ievent; - ievent.instance(); - int val = p_unicode_char; - int keycode = android_get_keysym(p_keycode); - int phy_keycode = android_get_keysym(p_scancode); - ievent->set_keycode(keycode); - ievent->set_physical_keycode(phy_keycode); - ievent->set_unicode(val); - ievent->set_pressed(p_pressed); - - if (val == '\n') { - ievent->set_keycode(KEY_ENTER); - } else if (val == 61448) { - ievent->set_keycode(KEY_BACKSPACE); - ievent->set_unicode(KEY_BACKSPACE); - } else if (val == 61453) { - ievent->set_keycode(KEY_ENTER); - ievent->set_unicode(KEY_ENTER); - } else if (p_keycode == 4) { - os_android->main_loop_request_go_back(); - } - - os_android->process_event(ievent); + DisplayServerAndroid::get_singleton()->process_key_event(p_keycode, p_scancode, p_unicode_char, p_pressed); } JNIEXPORT void JNICALL Java_org_godotengine_godot_GodotLib_accelerometer(JNIEnv *env, jclass clazz, jfloat x, jfloat y, jfloat z) { diff --git a/platform/android/java_godot_lib_jni.h b/platform/android/java_godot_lib_jni.h index a7a5970440..221d701e2b 100644 --- a/platform/android/java_godot_lib_jni.h +++ b/platform/android/java_godot_lib_jni.h @@ -41,7 +41,7 @@ JNIEXPORT void JNICALL Java_org_godotengine_godot_GodotLib_initialize(JNIEnv *en JNIEXPORT void JNICALL Java_org_godotengine_godot_GodotLib_ondestroy(JNIEnv *env, jclass clazz, jobject activity); JNIEXPORT void JNICALL Java_org_godotengine_godot_GodotLib_setup(JNIEnv *env, jclass clazz, jobjectArray p_cmdline); JNIEXPORT void JNICALL Java_org_godotengine_godot_GodotLib_resize(JNIEnv *env, jclass clazz, jint width, jint height); -JNIEXPORT void JNICALL Java_org_godotengine_godot_GodotLib_newcontext(JNIEnv *env, jclass clazz, jboolean p_32_bits); +JNIEXPORT void JNICALL Java_org_godotengine_godot_GodotLib_newcontext(JNIEnv *env, jclass clazz, jobject p_surface, jboolean p_32_bits); JNIEXPORT void JNICALL Java_org_godotengine_godot_GodotLib_step(JNIEnv *env, jclass clazz); JNIEXPORT void JNICALL Java_org_godotengine_godot_GodotLib_back(JNIEnv *env, jclass clazz); JNIEXPORT void JNICALL Java_org_godotengine_godot_GodotLib_touch(JNIEnv *env, jclass clazz, jint ev, jint pointer, jint count, jintArray positions); diff --git a/platform/android/jni_utils.h b/platform/android/jni_utils.h index b9ee243308..c2baa51b4a 100644 --- a/platform/android/jni_utils.h +++ b/platform/android/jni_utils.h @@ -53,190 +53,4 @@ Variant::Type get_jni_type(const String &p_type); const char *get_jni_sig(const String &p_type); -class JNISingleton : public Object { - - GDCLASS(JNISingleton, Object); - - struct MethodData { - - jmethodID method; - Variant::Type ret_type; - Vector<Variant::Type> argtypes; - }; - - jobject instance; - Map<StringName, MethodData> method_map; - -public: - virtual Variant call(const StringName &p_method, const Variant **p_args, int p_argcount, Callable::CallError &r_error) { - - ERR_FAIL_COND_V(!instance, Variant()); - - r_error.error = Callable::CallError::CALL_OK; - - Map<StringName, MethodData>::Element *E = method_map.find(p_method); - if (!E) { - - r_error.error = Callable::CallError::CALL_ERROR_INVALID_METHOD; - return Variant(); - } - - int ac = E->get().argtypes.size(); - if (ac < p_argcount) { - - r_error.error = Callable::CallError::CALL_ERROR_TOO_FEW_ARGUMENTS; - r_error.argument = ac; - return Variant(); - } - - if (ac > p_argcount) { - - r_error.error = Callable::CallError::CALL_ERROR_TOO_MANY_ARGUMENTS; - r_error.argument = ac; - return Variant(); - } - - for (int i = 0; i < p_argcount; i++) { - - if (!Variant::can_convert(p_args[i]->get_type(), E->get().argtypes[i])) { - - r_error.error = Callable::CallError::CALL_ERROR_INVALID_ARGUMENT; - r_error.argument = i; - r_error.expected = E->get().argtypes[i]; - } - } - - jvalue *v = nullptr; - - if (p_argcount) { - - v = (jvalue *)alloca(sizeof(jvalue) * p_argcount); - } - - JNIEnv *env = ThreadAndroid::get_env(); - - int res = env->PushLocalFrame(16); - - ERR_FAIL_COND_V(res != 0, Variant()); - - List<jobject> to_erase; - for (int i = 0; i < p_argcount; i++) { - - jvalret vr = _variant_to_jvalue(env, E->get().argtypes[i], p_args[i]); - v[i] = vr.val; - if (vr.obj) - to_erase.push_back(vr.obj); - } - - Variant ret; - - switch (E->get().ret_type) { - - case Variant::NIL: { - - env->CallVoidMethodA(instance, E->get().method, v); - } break; - case Variant::BOOL: { - - ret = env->CallBooleanMethodA(instance, E->get().method, v) == JNI_TRUE; - } break; - case Variant::INT: { - - ret = env->CallIntMethodA(instance, E->get().method, v); - } break; - case Variant::FLOAT: { - - ret = env->CallFloatMethodA(instance, E->get().method, v); - } break; - case Variant::STRING: { - - jobject o = env->CallObjectMethodA(instance, E->get().method, v); - ret = jstring_to_string((jstring)o, env); - env->DeleteLocalRef(o); - } break; - case Variant::PACKED_STRING_ARRAY: { - - jobjectArray arr = (jobjectArray)env->CallObjectMethodA(instance, E->get().method, v); - - ret = _jobject_to_variant(env, arr); - - env->DeleteLocalRef(arr); - } break; - case Variant::PACKED_INT32_ARRAY: { - - jintArray arr = (jintArray)env->CallObjectMethodA(instance, E->get().method, v); - - int fCount = env->GetArrayLength(arr); - Vector<int> sarr; - sarr.resize(fCount); - - int *w = sarr.ptrw(); - env->GetIntArrayRegion(arr, 0, fCount, w); - ret = sarr; - env->DeleteLocalRef(arr); - } break; - case Variant::PACKED_FLOAT32_ARRAY: { - - jfloatArray arr = (jfloatArray)env->CallObjectMethodA(instance, E->get().method, v); - - int fCount = env->GetArrayLength(arr); - Vector<float> sarr; - sarr.resize(fCount); - - float *w = sarr.ptrw(); - env->GetFloatArrayRegion(arr, 0, fCount, w); - ret = sarr; - env->DeleteLocalRef(arr); - } break; - -#ifndef _MSC_VER -#warning This is missing 64 bits arrays, I have no idea how to do it in JNI -#endif - case Variant::DICTIONARY: { - - jobject obj = env->CallObjectMethodA(instance, E->get().method, v); - ret = _jobject_to_variant(env, obj); - env->DeleteLocalRef(obj); - - } break; - default: { - - env->PopLocalFrame(nullptr); - ERR_FAIL_V(Variant()); - } break; - } - - while (to_erase.size()) { - env->DeleteLocalRef(to_erase.front()->get()); - to_erase.pop_front(); - } - - env->PopLocalFrame(nullptr); - - return ret; - } - - jobject get_instance() const { - - return instance; - } - void set_instance(jobject p_instance) { - - instance = p_instance; - } - - void add_method(const StringName &p_name, jmethodID p_method, const Vector<Variant::Type> &p_args, Variant::Type p_ret_type) { - - MethodData md; - md.method = p_method; - md.argtypes = p_args; - md.ret_type = p_ret_type; - method_map[p_name] = md; - } - - JNISingleton() { - instance = nullptr; - } -}; - #endif // JNI_UTILS_H diff --git a/platform/android/os_android.cpp b/platform/android/os_android.cpp index 344377d673..9ae18415ba 100644 --- a/platform/android/os_android.cpp +++ b/platform/android/os_android.cpp @@ -32,15 +32,11 @@ #include "core/io/file_access_buffered_fa.h" #include "core/project_settings.h" -#if defined(OPENGL_ENABLED) -#include "drivers/gles2/rasterizer_gles2.h" -#endif #include "drivers/unix/dir_access_unix.h" #include "drivers/unix/file_access_unix.h" #include "file_access_android.h" #include "main/main.h" -#include "servers/rendering/rendering_server_raster.h" -#include "servers/rendering/rendering_server_wrap_mt.h" +#include "platform/android/display_server_android.h" #include "dir_access_jandroid.h" #include "file_access_jandroid.h" @@ -60,29 +56,6 @@ public: virtual ~AndroidLogger() {} }; -int OS_Android::get_video_driver_count() const { - - return 2; -} - -const char *OS_Android::get_video_driver_name(int p_driver) const { - - switch (p_driver) { - case VIDEO_DRIVER_GLES2: - return "GLES2"; - } - ERR_FAIL_V_MSG(nullptr, "Invalid video driver index: " + itos(p_driver) + "."); -} -int OS_Android::get_audio_driver_count() const { - - return 1; -} - -const char *OS_Android::get_audio_driver_name(int p_driver) const { - - return "Android"; -} - void OS_Android::initialize_core() { OS_Unix::initialize_core(); @@ -110,71 +83,33 @@ void OS_Android::initialize_core() { NetSocketAndroid::make_default(); } -void OS_Android::set_opengl_extensions(const char *p_gl_extensions) { - - ERR_FAIL_COND(!p_gl_extensions); - gl_extensions = p_gl_extensions; -} - -int OS_Android::get_current_video_driver() const { - return video_driver_index; +void OS_Android::initialize() { + initialize_core(); } -Error OS_Android::initialize(const VideoMode &p_desired, int p_video_driver, int p_audio_driver) { +void OS_Android::initialize_joypads() { + Input::get_singleton()->set_fallback_mapping(godot_java->get_input_fallback_mapping()); - // FIXME: Add Vulkan support. Readd fallback code from Vulkan to GLES2? - -#if defined(OPENGL_ENABLED) - if (video_driver_index == VIDEO_DRIVER_GLES2) { - bool gl_initialization_error = false; - - if (RasterizerGLES2::is_viable() == OK) { - RasterizerGLES2::register_config(); - RasterizerGLES2::make_current(); - } else { - gl_initialization_error = true; - } - - if (gl_initialization_error) { - OS::get_singleton()->alert("Your device does not support any of the supported OpenGL versions.\n" - "Please try updating your Android version.", - "Unable to initialize video driver"); - return ERR_UNAVAILABLE; - } - } -#endif - - video_driver_index = p_video_driver; - - rendering_server = memnew(RenderingServerRaster); - if (get_render_thread_mode() != RENDER_THREAD_UNSAFE) { - rendering_server = memnew(RenderingServerWrapMT(rendering_server, false)); - } - - rendering_server->init(); - - AudioDriverManager::initialize(p_audio_driver); - - input = memnew(InputDefault); - input->set_fallback_mapping(godot_java->get_input_fallback_mapping()); - - return OK; + // This queries/updates the currently connected devices/joypads. + godot_java->init_input_devices(); } void OS_Android::set_main_loop(MainLoop *p_main_loop) { - main_loop = p_main_loop; - input->set_main_loop(p_main_loop); } void OS_Android::delete_main_loop() { - - memdelete(main_loop); + if (main_loop) { + memdelete(main_loop); + main_loop = nullptr; + } } void OS_Android::finalize() { +} - memdelete(input); +OS_Android *OS_Android::get_singleton() { + return (OS_Android *)OS::get_singleton(); } GodotJavaWrapper *OS_Android::get_godot_java() { @@ -185,12 +120,6 @@ GodotIOJavaWrapper *OS_Android::get_godot_io_java() { return godot_io_java; } -void OS_Android::alert(const String &p_alert, const String &p_title) { - - //print("ALERT: %s\n", p_alert.utf8().get_data()); - godot_java->alert(p_alert, p_title); -} - bool OS_Android::request_permission(const String &p_name) { return godot_java->request_permission(p_name); @@ -212,63 +141,6 @@ Error OS_Android::open_dynamic_library(const String p_path, void *&p_library_han return OK; } -void OS_Android::set_mouse_show(bool p_show) { - - //android has no mouse... -} - -void OS_Android::set_mouse_grab(bool p_grab) { - - //it really has no mouse...! -} - -bool OS_Android::is_mouse_grab_enabled() const { - - //*sigh* technology has evolved so much since i was a kid.. - return false; -} - -Point2 OS_Android::get_mouse_position() const { - - return Point2(); -} - -int OS_Android::get_mouse_button_state() const { - - return 0; -} - -void OS_Android::set_window_title(const String &p_title) { - //This queries/updates the currently connected devices/joypads - //Set_window_title is called when initializing the main loop (main.cpp) - //therefore this place is found to be suitable (I found no better). - godot_java->init_input_devices(); -} - -void OS_Android::set_video_mode(const VideoMode &p_video_mode, int p_screen) { -} - -OS::VideoMode OS_Android::get_video_mode(int p_screen) const { - - return default_videomode; -} - -void OS_Android::get_fullscreen_mode_list(List<VideoMode> *p_list, int p_screen) const { - - p_list->push_back(default_videomode); -} - -void OS_Android::set_keep_screen_on(bool p_enabled) { - OS::set_keep_screen_on(p_enabled); - - godot_java->set_keep_screen_on(p_enabled); -} - -Size2 OS_Android::get_window_size() const { - - return Vector2(default_videomode.width, default_videomode.height); -} - String OS_Android::get_name() const { return "Android"; @@ -279,11 +151,6 @@ MainLoop *OS_Android::get_main_loop() const { return main_loop; } -bool OS_Android::can_draw() const { - - return true; //always? -} - void OS_Android::main_loop_begin() { if (main_loop) @@ -304,277 +171,17 @@ void OS_Android::main_loop_end() { } void OS_Android::main_loop_focusout() { - - if (main_loop) - main_loop->notification(NOTIFICATION_WM_FOCUS_OUT); + DisplayServerAndroid::get_singleton()->send_window_event(DisplayServer::WINDOW_EVENT_FOCUS_OUT); audio_driver_android.set_pause(true); } void OS_Android::main_loop_focusin() { - - if (main_loop) - main_loop->notification(NOTIFICATION_WM_FOCUS_IN); + DisplayServerAndroid::get_singleton()->send_window_event(DisplayServer::WINDOW_EVENT_FOCUS_IN); audio_driver_android.set_pause(false); } -void OS_Android::process_joy_event(OS_Android::JoypadEvent p_event) { - - switch (p_event.type) { - case JOY_EVENT_BUTTON: - input->joy_button(p_event.device, p_event.index, p_event.pressed); - break; - case JOY_EVENT_AXIS: - InputDefault::JoyAxis value; - value.min = -1; - value.value = p_event.value; - input->joy_axis(p_event.device, p_event.index, value); - break; - case JOY_EVENT_HAT: - input->joy_hat(p_event.device, p_event.hat); - break; - default: - return; - } -} - -void OS_Android::process_event(Ref<InputEvent> p_event) { - - input->parse_input_event(p_event); -} - -void OS_Android::process_touch(int p_what, int p_pointer, const Vector<TouchPos> &p_points) { - - switch (p_what) { - case 0: { //gesture begin - - if (touch.size()) { - //end all if exist - for (int i = 0; i < touch.size(); i++) { - - Ref<InputEventScreenTouch> ev; - ev.instance(); - ev->set_index(touch[i].id); - ev->set_pressed(false); - ev->set_position(touch[i].pos); - input->parse_input_event(ev); - } - } - - touch.resize(p_points.size()); - for (int i = 0; i < p_points.size(); i++) { - touch.write[i].id = p_points[i].id; - touch.write[i].pos = p_points[i].pos; - } - - //send touch - for (int i = 0; i < touch.size(); i++) { - - Ref<InputEventScreenTouch> ev; - ev.instance(); - ev->set_index(touch[i].id); - ev->set_pressed(true); - ev->set_position(touch[i].pos); - input->parse_input_event(ev); - } - - } break; - case 1: { //motion - - ERR_FAIL_COND(touch.size() != p_points.size()); - - for (int i = 0; i < touch.size(); i++) { - - int idx = -1; - for (int j = 0; j < p_points.size(); j++) { - - if (touch[i].id == p_points[j].id) { - idx = j; - break; - } - } - - ERR_CONTINUE(idx == -1); - - if (touch[i].pos == p_points[idx].pos) - continue; //no move unncesearily - - Ref<InputEventScreenDrag> ev; - ev.instance(); - ev->set_index(touch[i].id); - ev->set_position(p_points[idx].pos); - ev->set_relative(p_points[idx].pos - touch[i].pos); - input->parse_input_event(ev); - touch.write[i].pos = p_points[idx].pos; - } - - } break; - case 2: { //release - - if (touch.size()) { - //end all if exist - for (int i = 0; i < touch.size(); i++) { - - Ref<InputEventScreenTouch> ev; - ev.instance(); - ev->set_index(touch[i].id); - ev->set_pressed(false); - ev->set_position(touch[i].pos); - input->parse_input_event(ev); - } - touch.clear(); - } - } break; - case 3: { // add touch - - for (int i = 0; i < p_points.size(); i++) { - if (p_points[i].id == p_pointer) { - TouchPos tp = p_points[i]; - touch.push_back(tp); - - Ref<InputEventScreenTouch> ev; - ev.instance(); - - ev->set_index(tp.id); - ev->set_pressed(true); - ev->set_position(tp.pos); - input->parse_input_event(ev); - - break; - } - } - } break; - case 4: { // remove touch - - for (int i = 0; i < touch.size(); i++) { - if (touch[i].id == p_pointer) { - - Ref<InputEventScreenTouch> ev; - ev.instance(); - ev->set_index(touch[i].id); - ev->set_pressed(false); - ev->set_position(touch[i].pos); - input->parse_input_event(ev); - touch.remove(i); - - break; - } - } - } break; - } -} - -void OS_Android::process_hover(int p_type, Point2 p_pos) { - // https://developer.android.com/reference/android/view/MotionEvent.html#ACTION_HOVER_ENTER - switch (p_type) { - case 7: // hover move - case 9: // hover enter - case 10: { // hover exit - Ref<InputEventMouseMotion> ev; - ev.instance(); - ev->set_position(p_pos); - ev->set_global_position(p_pos); - ev->set_relative(p_pos - hover_prev_pos); - input->parse_input_event(ev); - hover_prev_pos = p_pos; - } break; - } -} - -void OS_Android::process_double_tap(Point2 p_pos) { - Ref<InputEventMouseButton> ev; - ev.instance(); - ev->set_position(p_pos); - ev->set_global_position(p_pos); - ev->set_pressed(false); - ev->set_doubleclick(true); - input->parse_input_event(ev); -} - -void OS_Android::process_scroll(Point2 p_pos) { - Ref<InputEventPanGesture> ev; - ev.instance(); - ev->set_position(p_pos); - ev->set_delta(p_pos - scroll_prev_pos); - input->parse_input_event(ev); - scroll_prev_pos = p_pos; -} - -void OS_Android::process_accelerometer(const Vector3 &p_accelerometer) { - - input->set_accelerometer(p_accelerometer); -} - -void OS_Android::process_gravity(const Vector3 &p_gravity) { - - input->set_gravity(p_gravity); -} - -void OS_Android::process_magnetometer(const Vector3 &p_magnetometer) { - - input->set_magnetometer(p_magnetometer); -} - -void OS_Android::process_gyroscope(const Vector3 &p_gyroscope) { - - input->set_gyroscope(p_gyroscope); -} - -bool OS_Android::has_touchscreen_ui_hint() const { - - return true; -} - -bool OS_Android::has_virtual_keyboard() const { - - return true; -} - -int OS_Android::get_virtual_keyboard_height() const { - return godot_io_java->get_vk_height(); - - // ERR_PRINT("Cannot obtain virtual keyboard height."); - // return 0; -} - -void OS_Android::show_virtual_keyboard(const String &p_existing_text, const Rect2 &p_screen_rect, int p_max_input_length) { - - if (godot_io_java->has_vk()) { - godot_io_java->show_vk(p_existing_text, p_max_input_length); - } else { - - ERR_PRINT("Virtual keyboard not available"); - }; -} - -void OS_Android::hide_virtual_keyboard() { - - if (godot_io_java->has_vk()) { - - godot_io_java->hide_vk(); - } else { - - ERR_PRINT("Virtual keyboard not available"); - }; -} - -void OS_Android::init_video_mode(int p_video_width, int p_video_height) { - - default_videomode.width = p_video_width; - default_videomode.height = p_video_height; - default_videomode.fullscreen = true; - default_videomode.resizable = false; -} - void OS_Android::main_loop_request_go_back() { - - if (main_loop) - main_loop->notification(NOTIFICATION_WM_GO_BACK_REQUEST); -} - -void OS_Android::set_display_size(Size2 p_size) { - - default_videomode.width = p_size.x; - default_videomode.height = p_size.y; + DisplayServerAndroid::get_singleton()->send_window_event(DisplayServer::WINDOW_EVENT_GO_BACK_REQUEST); } Error OS_Android::shell_open(String p_uri) { @@ -597,26 +204,6 @@ String OS_Android::get_locale() const { return OS_Unix::get_locale(); } -void OS_Android::set_clipboard(const String &p_text) { - - // DO we really need the fallback to OS_Unix here?! - if (godot_java->has_set_clipboard()) { - godot_java->set_clipboard(p_text); - } else { - OS_Unix::set_clipboard(p_text); - } -} - -String OS_Android::get_clipboard() const { - - // DO we really need the fallback to OS_Unix here?! - if (godot_java->has_get_clipboard()) { - return godot_java->get_clipboard(); - } - - return OS_Unix::get_clipboard(); -} - String OS_Android::get_model_name() const { String model = godot_io_java->get_model(); @@ -626,11 +213,6 @@ String OS_Android::get_model_name() const { return OS_Unix::get_model_name(); } -int OS_Android::get_screen_dpi(int p_screen) const { - - return godot_io_java->get_screen_dpi(); -} - String OS_Android::get_user_data_dir() const { if (data_dir_cache != String()) @@ -662,11 +244,6 @@ String OS_Android::get_user_data_dir() const { return "."; } -void OS_Android::set_screen_orientation(ScreenOrientation p_orientation) { - - godot_io_java->set_screen_orientation(p_orientation); -} - String OS_Android::get_unique_id() const { String unique_id = godot_io_java->get_unique_id(); @@ -676,50 +253,46 @@ String OS_Android::get_unique_id() const { return OS::get_unique_id(); } -Error OS_Android::native_video_play(String p_path, float p_volume, String p_audio_track, String p_subtitle_track) { - // FIXME: Add support for volume, audio and subtitle tracks - - godot_io_java->play_video(p_path); - return OK; -} - -bool OS_Android::native_video_is_playing() const { - - return godot_io_java->is_video_playing(); -} - -void OS_Android::native_video_pause() { - - godot_io_java->pause_video(); -} - String OS_Android::get_system_dir(SystemDir p_dir) const { return godot_io_java->get_system_dir(p_dir); } -void OS_Android::native_video_stop() { +void OS_Android::set_display_size(const Size2i &p_size) { + display_size = p_size; +} - godot_io_java->stop_video(); +Size2i OS_Android::get_display_size() const { + return display_size; } void OS_Android::set_context_is_16_bits(bool p_is_16) { - +#if defined(OPENGL_ENABLED) //use_16bits_fbo = p_is_16; //if (rasterizer) // rasterizer->set_force_16_bits_fbo(p_is_16); +#endif } -void OS_Android::joy_connection_changed(int p_device, bool p_connected, String p_name) { - return input->joy_connection_changed(p_device, p_connected, p_name, ""); +void OS_Android::set_opengl_extensions(const char *p_gl_extensions) { +#if defined(OPENGL_ENABLED) + ERR_FAIL_COND(!p_gl_extensions); + gl_extensions = p_gl_extensions; +#endif } -bool OS_Android::is_joy_known(int p_device) { - return input->is_joy_mapped(p_device); +void OS_Android::set_native_window(ANativeWindow *p_native_window) { +#if defined(VULKAN_ENABLED) + native_window = p_native_window; +#endif } -String OS_Android::get_joy_guid(int p_device) const { - return input->get_joy_guid_remapped(p_device); +ANativeWindow *OS_Android::get_native_window() const { +#if defined(VULKAN_ENABLED) + return native_window; +#else + return nullptr; +#endif } void OS_Android::vibrate_handheld(int p_duration_ms) { @@ -747,19 +320,21 @@ bool OS_Android::_check_internal_feature_support(const String &p_feature) { } OS_Android::OS_Android(GodotJavaWrapper *p_godot_java, GodotIOJavaWrapper *p_godot_io_java, bool p_use_apk_expansion) { + display_size.width = 800; + display_size.height = 600; use_apk_expansion = p_use_apk_expansion; - default_videomode.width = 800; - default_videomode.height = 600; - default_videomode.fullscreen = true; - default_videomode.resizable = false; main_loop = nullptr; + +#if defined(OPENGL_ENABLED) gl_extensions = nullptr; - //rasterizer = nullptr; use_gl2 = false; +#endif - rendering_server = nullptr; +#if defined(VULKAN_ENABLED) + native_window = nullptr; +#endif godot_java = p_godot_java; godot_io_java = p_godot_io_java; @@ -769,6 +344,8 @@ OS_Android::OS_Android(GodotJavaWrapper *p_godot_java, GodotIOJavaWrapper *p_god _set_logger(memnew(CompositeLogger(loggers))); AudioDriverManager::add_driver(&audio_driver_android); + + DisplayServerAndroid::register_android_driver(); } OS_Android::~OS_Android() { diff --git a/platform/android/os_android.h b/platform/android/os_android.h index 8a91412ef6..cac7efaa88 100644 --- a/platform/android/os_android.h +++ b/platform/android/os_android.h @@ -33,78 +33,45 @@ #include "audio_driver_jandroid.h" #include "audio_driver_opensl.h" -#include "core/input/input_filter.h" #include "core/os/main_loop.h" #include "drivers/unix/os_unix.h" #include "servers/audio_server.h" -#include "servers/rendering/rasterizer.h" class GodotJavaWrapper; class GodotIOJavaWrapper; -class OS_Android : public OS_Unix { -public: - struct TouchPos { - int id; - Point2 pos; - }; - - enum { - JOY_EVENT_BUTTON = 0, - JOY_EVENT_AXIS = 1, - JOY_EVENT_HAT = 2 - }; - - struct JoypadEvent { - - int device; - int type; - int index; - bool pressed; - float value; - int hat; - }; +struct ANativeWindow; +class OS_Android : public OS_Unix { private: - Vector<TouchPos> touch; - Point2 hover_prev_pos; // needed to calculate the relative position on hover events - Point2 scroll_prev_pos; // needed to calculate the relative position on scroll events + Size2i display_size; - bool use_gl2; bool use_apk_expansion; +#if defined(OPENGL_ENABLED) bool use_16bits_fbo; + const char *gl_extensions; +#endif - RenderingServer *rendering_server; +#if defined(VULKAN_ENABLED) + ANativeWindow *native_window; +#endif mutable String data_dir_cache; //AudioDriverAndroid audio_driver_android; AudioDriverOpenSL audio_driver_android; - const char *gl_extensions; - - InputDefault *input; - VideoMode default_videomode; MainLoop *main_loop; GodotJavaWrapper *godot_java; GodotIOJavaWrapper *godot_io_java; - int video_driver_index; - public: - // functions used by main to initialize/deinitialize the OS - virtual int get_video_driver_count() const; - virtual const char *get_video_driver_name(int p_driver) const; - - virtual int get_audio_driver_count() const; - virtual const char *get_audio_driver_name(int p_driver) const; - - virtual int get_current_video_driver() const; - virtual void initialize_core(); - virtual Error initialize(const VideoMode &p_desired, int p_video_driver, int p_audio_driver); + virtual void initialize(); + + virtual void initialize_joypads(); virtual void set_main_loop(MainLoop *p_main_loop); virtual void delete_main_loop(); @@ -113,37 +80,19 @@ public: typedef int64_t ProcessID; - static OS *get_singleton(); + static OS_Android *get_singleton(); GodotJavaWrapper *get_godot_java(); GodotIOJavaWrapper *get_godot_io_java(); - virtual void alert(const String &p_alert, const String &p_title = "ALERT!"); virtual bool request_permission(const String &p_name); virtual bool request_permissions(); virtual Vector<String> get_granted_permissions() const; virtual Error open_dynamic_library(const String p_path, void *&p_library_handle, bool p_also_set_library_path = false); - virtual void set_mouse_show(bool p_show); - virtual void set_mouse_grab(bool p_grab); - virtual bool is_mouse_grab_enabled() const; - virtual Point2 get_mouse_position() const; - virtual int get_mouse_button_state() const; - virtual void set_window_title(const String &p_title); - - virtual void set_video_mode(const VideoMode &p_video_mode, int p_screen = 0); - virtual VideoMode get_video_mode(int p_screen = 0) const; - virtual void get_fullscreen_mode_list(List<VideoMode> *p_list, int p_screen = 0) const; - - virtual void set_keep_screen_on(bool p_enabled); - - virtual Size2 get_window_size() const; - virtual String get_name() const; virtual MainLoop *get_main_loop() const; - virtual bool can_draw() const; - void main_loop_begin(); bool main_loop_iterate(); void main_loop_request_go_back(); @@ -151,53 +100,25 @@ public: void main_loop_focusout(); void main_loop_focusin(); - virtual bool has_touchscreen_ui_hint() const; - - virtual bool has_virtual_keyboard() const; - virtual void show_virtual_keyboard(const String &p_existing_text, const Rect2 &p_screen_rect = Rect2(), int p_max_input_length = -1); - virtual void hide_virtual_keyboard(); - virtual int get_virtual_keyboard_height() const; - - void set_opengl_extensions(const char *p_gl_extensions); - void set_display_size(Size2 p_size); + void set_display_size(const Size2i &p_size); + Size2i get_display_size() const; void set_context_is_16_bits(bool p_is_16); + void set_opengl_extensions(const char *p_gl_extensions); - virtual void set_screen_orientation(ScreenOrientation p_orientation); + void set_native_window(ANativeWindow *p_native_window); + ANativeWindow *get_native_window() const; virtual Error shell_open(String p_uri); virtual String get_user_data_dir() const; virtual String get_resource_dir() const; virtual String get_locale() const; - virtual void set_clipboard(const String &p_text); - virtual String get_clipboard() const; virtual String get_model_name() const; - virtual int get_screen_dpi(int p_screen = 0) const; virtual String get_unique_id() const; virtual String get_system_dir(SystemDir p_dir) const; - void process_accelerometer(const Vector3 &p_accelerometer); - void process_gravity(const Vector3 &p_gravity); - void process_magnetometer(const Vector3 &p_magnetometer); - void process_gyroscope(const Vector3 &p_gyroscope); - void process_touch(int p_what, int p_pointer, const Vector<TouchPos> &p_points); - void process_hover(int p_type, Point2 p_pos); - void process_double_tap(Point2 p_pos); - void process_scroll(Point2 p_pos); - void process_joy_event(JoypadEvent p_event); - void process_event(Ref<InputEvent> p_event); - void init_video_mode(int p_video_width, int p_video_height); - - virtual Error native_video_play(String p_path, float p_volume, String p_audio_track, String p_subtitle_track); - virtual bool native_video_is_playing() const; - virtual void native_video_pause(); - virtual void native_video_stop(); - - virtual bool is_joy_known(int p_device); - virtual String get_joy_guid(int p_device) const; - void joy_connection_changed(int p_device, bool p_connected, String p_name); void vibrate_handheld(int p_duration_ms); virtual bool _check_internal_feature_support(const String &p_feature); diff --git a/platform/android/plugin/godot_plugin_jni.cpp b/platform/android/plugin/godot_plugin_jni.cpp index 7413236e5d..c3bfb2f2ed 100644 --- a/platform/android/plugin/godot_plugin_jni.cpp +++ b/platform/android/plugin/godot_plugin_jni.cpp @@ -33,6 +33,7 @@ #include <core/engine.h> #include <core/error_macros.h> #include <core/project_settings.h> +#include <platform/android/api/jni_singleton.h> #include <platform/android/jni_utils.h> #include <platform/android/string_android.h> @@ -43,7 +44,7 @@ extern "C" { JNIEXPORT void JNICALL Java_org_godotengine_godot_plugin_GodotPlugin_nativeRegisterSingleton(JNIEnv *env, jobject obj, jstring name) { String singname = jstring_to_string(name, env); - JNISingleton *s = memnew(JNISingleton); + JNISingleton *s = (JNISingleton *)ClassDB::instance("JNISingleton"); s->set_instance(env->NewGlobalRef(obj)); jni_singletons[singname] = s; @@ -86,6 +87,51 @@ JNIEXPORT void JNICALL Java_org_godotengine_godot_plugin_GodotPlugin_nativeRegis s->add_method(mname, mid, types, get_jni_type(retval)); } +JNIEXPORT void JNICALL Java_org_godotengine_godot_plugin_GodotPlugin_nativeRegisterSignal(JNIEnv *env, jobject obj, jstring j_plugin_name, jstring j_signal_name, jobjectArray j_signal_param_types) { + String singleton_name = jstring_to_string(j_plugin_name, env); + + ERR_FAIL_COND(!jni_singletons.has(singleton_name)); + + JNISingleton *singleton = jni_singletons.get(singleton_name); + + String signal_name = jstring_to_string(j_signal_name, env); + Vector<Variant::Type> types; + + int stringCount = env->GetArrayLength(j_signal_param_types); + + for (int i = 0; i < stringCount; i++) { + + jstring j_signal_param_type = (jstring)env->GetObjectArrayElement(j_signal_param_types, i); + const String signal_param_type = jstring_to_string(j_signal_param_type, env); + types.push_back(get_jni_type(signal_param_type)); + } + + singleton->add_signal(signal_name, types); +} + +JNIEXPORT void JNICALL Java_org_godotengine_godot_plugin_GodotPlugin_nativeEmitSignal(JNIEnv *env, jobject obj, jstring j_plugin_name, jstring j_signal_name, jobjectArray j_signal_params) { + String singleton_name = jstring_to_string(j_plugin_name, env); + + ERR_FAIL_COND(!jni_singletons.has(singleton_name)); + + JNISingleton *singleton = jni_singletons.get(singleton_name); + + String signal_name = jstring_to_string(j_signal_name, env); + + int count = env->GetArrayLength(j_signal_params); + const Variant *args[count]; + + for (int i = 0; i < count; i++) { + + jobject j_param = env->GetObjectArrayElement(j_signal_params, i); + Variant variant = _jobject_to_variant(env, j_param); + args[i] = &variant; + env->DeleteLocalRef(j_param); + }; + + singleton->emit_signal(signal_name, args, count); +} + JNIEXPORT void JNICALL Java_org_godotengine_godot_plugin_GodotPlugin_nativeRegisterGDNativeLibraries(JNIEnv *env, jobject obj, jobjectArray gdnlib_paths) { int gdnlib_count = env->GetArrayLength(gdnlib_paths); if (gdnlib_count == 0) { diff --git a/platform/android/plugin/godot_plugin_jni.h b/platform/android/plugin/godot_plugin_jni.h index 0d613d3bfe..80ce332e7c 100644 --- a/platform/android/plugin/godot_plugin_jni.h +++ b/platform/android/plugin/godot_plugin_jni.h @@ -37,6 +37,8 @@ extern "C" { JNIEXPORT void JNICALL Java_org_godotengine_godot_plugin_GodotPlugin_nativeRegisterSingleton(JNIEnv *env, jobject obj, jstring name); JNIEXPORT void JNICALL Java_org_godotengine_godot_plugin_GodotPlugin_nativeRegisterMethod(JNIEnv *env, jobject obj, jstring sname, jstring name, jstring ret, jobjectArray args); +JNIEXPORT void JNICALL Java_org_godotengine_godot_plugin_GodotPlugin_nativeRegisterSignal(JNIEnv *env, jobject obj, jstring j_plugin_name, jstring j_signal_name, jobjectArray j_signal_param_types); +JNIEXPORT void JNICALL Java_org_godotengine_godot_plugin_GodotPlugin_nativeEmitSignal(JNIEnv *env, jobject obj, jstring j_plugin_name, jstring j_signal_name, jobjectArray j_signal_params); JNIEXPORT void JNICALL Java_org_godotengine_godot_plugin_GodotPlugin_nativeRegisterGDNativeLibraries(JNIEnv *env, jobject obj, jobjectArray gdnlib_paths); } diff --git a/platform/android/vulkan/vulkan_context_android.cpp b/platform/android/vulkan/vulkan_context_android.cpp new file mode 100644 index 0000000000..5fb7a83da4 --- /dev/null +++ b/platform/android/vulkan/vulkan_context_android.cpp @@ -0,0 +1,60 @@ +/*************************************************************************/ +/* vulkan_context_android.cpp */ +/*************************************************************************/ +/* This file is part of: */ +/* GODOT ENGINE */ +/* https://godotengine.org */ +/*************************************************************************/ +/* Copyright (c) 2007-2020 Juan Linietsky, Ariel Manzur. */ +/* Copyright (c) 2014-2020 Godot Engine contributors (cf. AUTHORS.md). */ +/* */ +/* Permission is hereby granted, free of charge, to any person obtaining */ +/* a copy of this software and associated documentation files (the */ +/* "Software"), to deal in the Software without restriction, including */ +/* without limitation the rights to use, copy, modify, merge, publish, */ +/* distribute, sublicense, and/or sell copies of the Software, and to */ +/* permit persons to whom the Software is furnished to do so, subject to */ +/* the following conditions: */ +/* */ +/* The above copyright notice and this permission notice shall be */ +/* included in all copies or substantial portions of the Software. */ +/* */ +/* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, */ +/* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF */ +/* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.*/ +/* IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY */ +/* CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, */ +/* TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE */ +/* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ +/*************************************************************************/ + +#include "vulkan_context_android.h" +#include <vulkan/vulkan_android.h> + +const char *VulkanContextAndroid::_get_platform_surface_extension() const { + return VK_KHR_ANDROID_SURFACE_EXTENSION_NAME; +} + +int VulkanContextAndroid::window_create(ANativeWindow *p_window, int p_width, int p_height) { + VkAndroidSurfaceCreateInfoKHR createInfo; + createInfo.sType = VK_STRUCTURE_TYPE_ANDROID_SURFACE_CREATE_INFO_KHR; + createInfo.pNext = nullptr; + createInfo.flags = 0; + createInfo.window = p_window; + + VkSurfaceKHR surface; + VkResult err = vkCreateAndroidSurfaceKHR(_get_instance(), &createInfo, nullptr, &surface); + if (err != VK_SUCCESS) { + ERR_FAIL_V_MSG(-1, "vkCreateAndroidSurfaceKHR failed with error " + itos(err)); + } + + return _window_create(DisplayServer::MAIN_WINDOW_ID, surface, p_width, p_height); +} + +VulkanContextAndroid::VulkanContextAndroid() { + // TODO: fix validation layers + use_validation_layers = false; +} + +VulkanContextAndroid::~VulkanContextAndroid() { +} diff --git a/platform/android/vulkan/vk_renderer_jni.cpp b/platform/android/vulkan/vulkan_context_android.h index 3026e7daad..7e698ada4f 100644 --- a/platform/android/vulkan/vk_renderer_jni.cpp +++ b/platform/android/vulkan/vulkan_context_android.h @@ -1,5 +1,5 @@ /*************************************************************************/ -/* vk_renderer_jni.cpp */ +/* vulkan_context_android.h */ /*************************************************************************/ /* This file is part of: */ /* GODOT ENGINE */ @@ -28,31 +28,22 @@ /* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ /*************************************************************************/ -#include "vk_renderer_jni.h" +#ifndef VULKAN_CONTEXT_ANDROID_H +#define VULKAN_CONTEXT_ANDROID_H -extern "C" { +#include "drivers/vulkan/vulkan_context.h" -JNIEXPORT void JNICALL Java_org_godotengine_godot_vulkan_VkRenderer_nativeOnVkSurfaceCreated(JNIEnv *env, jobject obj, jobject j_surface) { - // TODO: complete -} +struct ANativeWindow; -JNIEXPORT void JNICALL Java_org_godotengine_godot_vulkan_VkRenderer_nativeOnVkSurfaceChanged(JNIEnv *env, jobject object, jobject j_surface, jint width, jint height) { - // TODO: complete -} +class VulkanContextAndroid : public VulkanContext { -JNIEXPORT void JNICALL Java_org_godotengine_godot_vulkan_VkRenderer_nativeOnVkResume(JNIEnv *env, jobject obj) { - // TODO: complete -} + virtual const char *_get_platform_surface_extension() const; -JNIEXPORT void JNICALL Java_org_godotengine_godot_vulkan_VkRenderer_nativeOnVkDrawFrame(JNIEnv *env, jobject obj) { - // TODO: complete -} +public: + int window_create(ANativeWindow *p_window, int p_width, int p_height); -JNIEXPORT void JNICALL Java_org_godotengine_godot_vulkan_VkRenderer_nativeOnVkPause(JNIEnv *env, jobject obj) { - // TODO: complete -} + VulkanContextAndroid(); + ~VulkanContextAndroid(); +}; -JNIEXPORT void JNICALL Java_org_godotengine_godot_vulkan_VkRenderer_nativeOnVkDestroy(JNIEnv *env, jobject obj) { - // TODO: complete -} -} +#endif // VULKAN_CONTEXT_ANDROID_H diff --git a/platform/haiku/haiku_direct_window.h b/platform/haiku/haiku_direct_window.h index 925bb9ac5d..4817abbb7a 100644 --- a/platform/haiku/haiku_direct_window.h +++ b/platform/haiku/haiku_direct_window.h @@ -35,7 +35,7 @@ #include <DirectWindow.h> -#include "core/input/input_filter.h" +#include "core/input/input.h" #include "core/os/os.h" #include "haiku_gl_view.h" diff --git a/platform/haiku/os_haiku.h b/platform/haiku/os_haiku.h index 64f5690dd1..d3ef9400d4 100644 --- a/platform/haiku/os_haiku.h +++ b/platform/haiku/os_haiku.h @@ -33,7 +33,7 @@ #include "audio_driver_media_kit.h" #include "context_gl_haiku.h" -#include "core/input/input_filter.h" +#include "core/input/input.h" #include "drivers/unix/os_unix.h" #include "haiku_application.h" #include "haiku_direct_window.h" diff --git a/platform/iphone/os_iphone.h b/platform/iphone/os_iphone.h index 96cf041c37..eb94e1d69b 100644 --- a/platform/iphone/os_iphone.h +++ b/platform/iphone/os_iphone.h @@ -33,7 +33,7 @@ #ifndef OS_IPHONE_H #define OS_IPHONE_H -#include "core/input/input_filter.h" +#include "core/input/input.h" #include "drivers/coreaudio/audio_driver_coreaudio.h" #include "drivers/unix/os_unix.h" #include "game_center.h" diff --git a/platform/javascript/export/export.cpp b/platform/javascript/export/export.cpp index 39faae2d17..36076a2af9 100644 --- a/platform/javascript/export/export.cpp +++ b/platform/javascript/export/export.cpp @@ -252,6 +252,7 @@ void EditorExportPlatformJavaScript::_fix_html(Vector<uint8_t> &p_html, const Re String current_line = lines[i]; current_line = current_line.replace("$GODOT_BASENAME", p_name); + current_line = current_line.replace("$GODOT_PROJECT_NAME", ProjectSettings::get_singleton()->get_setting("application/config/name")); current_line = current_line.replace("$GODOT_HEAD_INCLUDE", p_preset->get("html/head_include")); current_line = current_line.replace("$GODOT_DEBUG_ENABLED", p_debug ? "true" : "false"); str_export += current_line + "\n"; 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/javascript/os_javascript.h b/platform/javascript/os_javascript.h index 81fe4cf0cc..feb0f0651a 100644 --- a/platform/javascript/os_javascript.h +++ b/platform/javascript/os_javascript.h @@ -32,7 +32,7 @@ #define OS_JAVASCRIPT_H #include "audio_driver_javascript.h" -#include "core/input/input_filter.h" +#include "core/input/input.h" #include "drivers/unix/os_unix.h" #include "servers/audio_server.h" #include "servers/rendering/rasterizer.h" diff --git a/platform/linuxbsd/detect.py b/platform/linuxbsd/detect.py index 5d8b4fba48..07fa06bc06 100644 --- a/platform/linuxbsd/detect.py +++ b/platform/linuxbsd/detect.py @@ -217,15 +217,17 @@ def configure(env): env.ParseConfig("pkg-config libpng16 --cflags --libs") if not env["builtin_bullet"]: - # We need at least version 2.89 + # We need at least version 2.90 + min_bullet_version = "2.90" + import subprocess bullet_version = subprocess.check_output(["pkg-config", "bullet", "--modversion"]).strip() - if str(bullet_version) < "2.89": + if str(bullet_version) < min_bullet_version: # Abort as system bullet was requested but too old print( "Bullet: System version {0} does not match minimal requirements ({1}). Aborting.".format( - bullet_version, "2.89" + bullet_version, min_bullet_version ) ) sys.exit(255) diff --git a/platform/linuxbsd/display_server_x11.cpp b/platform/linuxbsd/display_server_x11.cpp index 47497eb95f..e38b0c13d0 100644 --- a/platform/linuxbsd/display_server_x11.cpp +++ b/platform/linuxbsd/display_server_x11.cpp @@ -208,7 +208,7 @@ void DisplayServerX11::_update_real_mouse_position(const WindowData &wd) { last_mouse_pos.x = win_x; last_mouse_pos.y = win_y; last_mouse_pos_valid = true; - InputFilter::get_singleton()->set_mouse_position(last_mouse_pos); + Input::get_singleton()->set_mouse_position(last_mouse_pos); } } } @@ -254,10 +254,10 @@ bool DisplayServerX11::_refresh_device_info() { bool absolute_mode = false; int resolution_x = 0; int resolution_y = 0; - int range_min_x = 0; - int range_min_y = 0; - int range_max_x = 0; - int range_max_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; @@ -392,7 +392,7 @@ void DisplayServerX11::mouse_set_mode(MouseMode p_mode) { XWarpPointer(x11_display, None, main_window.x11_window, 0, 0, 0, 0, (int)center.x, (int)center.y); - InputFilter::get_singleton()->set_mouse_position(center); + Input::get_singleton()->set_mouse_position(center); } } else { do_mouse_warp = false; @@ -1471,8 +1471,11 @@ DisplayServer::WindowMode DisplayServerX11::window_get_mode(WindowID p_window) c if (result == Success && data) { long *state = (long *)data; - if (state[0] == WM_IconicState) + if (state[0] == WM_IconicState) { + XFree(data); return WINDOW_MODE_MINIMIZED; + } + XFree(data); } } @@ -2074,7 +2077,7 @@ void DisplayServerX11::_handle_key_event(WindowID p_window, XKeyEvent *p_event, k->set_shift(true); } - InputFilter::get_singleton()->accumulate_input_event(k); + Input::get_singleton()->accumulate_input_event(k); } memfree(utf8string); return; @@ -2217,14 +2220,14 @@ void DisplayServerX11::_handle_key_event(WindowID p_window, XKeyEvent *p_event, k->set_metakey(false); } - bool last_is_pressed = InputFilter::get_singleton()->is_key_pressed(k->get_keycode()); + bool last_is_pressed = Input::get_singleton()->is_key_pressed(k->get_keycode()); if (k->is_pressed()) { if (last_is_pressed) { k->set_echo(true); } } - InputFilter::get_singleton()->accumulate_input_event(k); + Input::get_singleton()->accumulate_input_event(k); } void DisplayServerX11::_xim_destroy_callback(::XIM im, ::XPointer client_data, @@ -2483,12 +2486,12 @@ void DisplayServerX11::process_events() { // in a spurious mouse motion event being sent to Godot; remember it to be able to filter it out xi.mouse_pos_to_filter = pos; } - InputFilter::get_singleton()->accumulate_input_event(st); + Input::get_singleton()->accumulate_input_event(st); } else { if (!xi.state.has(index)) // Defensive break; xi.state.erase(index); - InputFilter::get_singleton()->accumulate_input_event(st); + Input::get_singleton()->accumulate_input_event(st); } } break; @@ -2507,7 +2510,7 @@ void DisplayServerX11::process_events() { sd->set_index(index); sd->set_position(pos); sd->set_relative(pos - curr_pos_elem->value()); - InputFilter::get_singleton()->accumulate_input_event(sd); + Input::get_singleton()->accumulate_input_event(sd); curr_pos_elem->value() = pos; } @@ -2577,7 +2580,7 @@ void DisplayServerX11::process_events() { case FocusOut: window_has_focus = false; - InputFilter::get_singleton()->release_pressed_events(); + Input::get_singleton()->release_pressed_events(); _send_window_event(windows[window_id], WINDOW_EVENT_FOCUS_OUT); window_focused = false; @@ -2606,7 +2609,7 @@ void DisplayServerX11::process_events() { st->set_index(E->key()); st->set_window_id(window_id); st->set_position(E->get()); - InputFilter::get_singleton()->accumulate_input_event(st); + Input::get_singleton()->accumulate_input_event(st); } xi.state.clear(); #endif @@ -2668,7 +2671,7 @@ void DisplayServerX11::process_events() { } } - InputFilter::get_singleton()->accumulate_input_event(mb); + Input::get_singleton()->accumulate_input_event(mb); } break; case MotionNotify: { @@ -2770,8 +2773,8 @@ void DisplayServerX11::process_events() { mm->set_button_mask(mouse_get_button_state()); mm->set_position(posi); mm->set_global_position(posi); - InputFilter::get_singleton()->set_mouse_position(posi); - mm->set_speed(InputFilter::get_singleton()->get_last_mouse_speed()); + Input::get_singleton()->set_mouse_position(posi); + mm->set_speed(Input::get_singleton()->get_last_mouse_speed()); mm->set_relative(rel); @@ -2782,7 +2785,7 @@ void DisplayServerX11::process_events() { // this is so that the relative motion doesn't get messed up // after we regain focus. if (window_has_focus || !mouse_mode_grab) - InputFilter::get_singleton()->accumulate_input_event(mm); + Input::get_singleton()->accumulate_input_event(mm); } break; case KeyPress: @@ -2975,7 +2978,7 @@ void DisplayServerX11::process_events() { */ } - InputFilter::get_singleton()->flush_accumulated_events(); + Input::get_singleton()->flush_accumulated_events(); } void DisplayServerX11::release_rendering_thread() { @@ -3370,7 +3373,7 @@ DisplayServerX11::WindowID DisplayServerX11::_create_window(WindowMode p_mode, u DisplayServerX11::DisplayServerX11(const String &p_rendering_driver, WindowMode p_mode, uint32_t p_flags, const Vector2i &p_resolution, Error &r_error) { - InputFilter::get_singleton()->set_event_dispatch_function(_dispatch_input_events); + Input::get_singleton()->set_event_dispatch_function(_dispatch_input_events); r_error = OK; @@ -3603,8 +3606,10 @@ DisplayServerX11::DisplayServerX11(const String &p_rendering_driver, WindowMode } } #endif - - WindowID main_window = _create_window(p_mode, p_flags, Rect2i(Point2(), p_resolution)); + Point2i window_position( + (screen_get_size(0).width - p_resolution.width) / 2, + (screen_get_size(0).height - p_resolution.height) / 2); + WindowID main_window = _create_window(p_mode, p_flags, Rect2i(window_position, p_resolution)); for (int i = 0; i < WINDOW_FLAG_MAX; i++) { if (p_flags & (1 << i)) { window_set_flag(WindowFlags(i), true, main_window); diff --git a/platform/linuxbsd/display_server_x11.h b/platform/linuxbsd/display_server_x11.h index 113e504e9b..8f090d3fad 100644 --- a/platform/linuxbsd/display_server_x11.h +++ b/platform/linuxbsd/display_server_x11.h @@ -35,7 +35,7 @@ #include "servers/display_server.h" -#include "core/input/input_filter.h" +#include "core/input/input.h" #include "drivers/alsa/audio_driver_alsa.h" #include "drivers/alsamidi/midi_driver_alsamidi.h" diff --git a/platform/linuxbsd/joypad_linux.cpp b/platform/linuxbsd/joypad_linux.cpp index 381eb909ba..5ceea788e0 100644 --- a/platform/linuxbsd/joypad_linux.cpp +++ b/platform/linuxbsd/joypad_linux.cpp @@ -71,7 +71,7 @@ void JoypadLinux::Joypad::reset() { dpad = 0; fd = -1; - InputFilter::JoyAxis jx; + Input::JoyAxis jx; jx.min = -1; jx.value = 0.0f; for (int i = 0; i < MAX_ABS; i++) { @@ -80,7 +80,7 @@ void JoypadLinux::Joypad::reset() { } } -JoypadLinux::JoypadLinux(InputFilter *in) { +JoypadLinux::JoypadLinux(Input *in) { exit_udev = false; input = in; joy_thread = Thread::create(joy_thread_func, this); @@ -436,11 +436,11 @@ void JoypadLinux::joypad_vibration_stop(int p_id, uint64_t p_timestamp) { joy.ff_effect_timestamp = p_timestamp; } -InputFilter::JoyAxis JoypadLinux::axis_correct(const input_absinfo *p_abs, int p_value) const { +Input::JoyAxis JoypadLinux::axis_correct(const input_absinfo *p_abs, int p_value) const { int min = p_abs->minimum; int max = p_abs->maximum; - InputFilter::JoyAxis jx; + Input::JoyAxis jx; if (min < 0) { jx.min = -1; @@ -492,11 +492,11 @@ void JoypadLinux::process_joypads() { case ABS_HAT0X: if (ev.value != 0) { if (ev.value < 0) - joy->dpad |= InputFilter::HAT_MASK_LEFT; + joy->dpad |= Input::HAT_MASK_LEFT; else - joy->dpad |= InputFilter::HAT_MASK_RIGHT; + joy->dpad |= Input::HAT_MASK_RIGHT; } else - joy->dpad &= ~(InputFilter::HAT_MASK_LEFT | InputFilter::HAT_MASK_RIGHT); + joy->dpad &= ~(Input::HAT_MASK_LEFT | Input::HAT_MASK_RIGHT); input->joy_hat(i, joy->dpad); break; @@ -504,11 +504,11 @@ void JoypadLinux::process_joypads() { case ABS_HAT0Y: if (ev.value != 0) { if (ev.value < 0) - joy->dpad |= InputFilter::HAT_MASK_UP; + joy->dpad |= Input::HAT_MASK_UP; else - joy->dpad |= InputFilter::HAT_MASK_DOWN; + joy->dpad |= Input::HAT_MASK_DOWN; } else - joy->dpad &= ~(InputFilter::HAT_MASK_UP | InputFilter::HAT_MASK_DOWN); + joy->dpad &= ~(Input::HAT_MASK_UP | Input::HAT_MASK_DOWN); input->joy_hat(i, joy->dpad); break; @@ -517,7 +517,7 @@ void JoypadLinux::process_joypads() { if (ev.code >= MAX_ABS) return; if (joy->abs_map[ev.code] != -1 && joy->abs_info[ev.code]) { - InputFilter::JoyAxis value = axis_correct(joy->abs_info[ev.code], ev.value); + Input::JoyAxis value = axis_correct(joy->abs_info[ev.code], ev.value); joy->curr_axis[joy->abs_map[ev.code]] = value; } break; diff --git a/platform/linuxbsd/joypad_linux.h b/platform/linuxbsd/joypad_linux.h index 1d2ed5bbc1..0d175193a5 100644 --- a/platform/linuxbsd/joypad_linux.h +++ b/platform/linuxbsd/joypad_linux.h @@ -33,7 +33,7 @@ #define JOYPAD_LINUX_H #ifdef JOYDEV_ENABLED -#include "core/input/input_filter.h" +#include "core/input/input.h" #include "core/os/mutex.h" #include "core/os/thread.h" @@ -41,7 +41,7 @@ struct input_absinfo; class JoypadLinux { public: - JoypadLinux(InputFilter *in); + JoypadLinux(Input *in); ~JoypadLinux(); void process_joypads(); @@ -53,7 +53,7 @@ private: }; struct Joypad { - InputFilter::JoyAxis curr_axis[MAX_ABS]; + Input::JoyAxis curr_axis[MAX_ABS]; int key_map[MAX_KEY]; int abs_map[MAX_ABS]; int dpad; @@ -74,7 +74,7 @@ private: bool exit_udev; Mutex joy_mutex; Thread *joy_thread; - InputFilter *input; + Input *input; Joypad joypads[JOYPADS_MAX]; Vector<String> attached_devices; @@ -95,7 +95,7 @@ private: void joypad_vibration_start(int p_id, float p_weak_magnitude, float p_strong_magnitude, float p_duration, uint64_t p_timestamp); void joypad_vibration_stop(int p_id, uint64_t p_timestamp); - InputFilter::JoyAxis axis_correct(const input_absinfo *p_abs, int p_value) const; + Input::JoyAxis axis_correct(const input_absinfo *p_abs, int p_value) const; }; #endif diff --git a/platform/linuxbsd/os_linuxbsd.cpp b/platform/linuxbsd/os_linuxbsd.cpp index 5b9a25bd8b..7b76f7394b 100644 --- a/platform/linuxbsd/os_linuxbsd.cpp +++ b/platform/linuxbsd/os_linuxbsd.cpp @@ -64,7 +64,7 @@ void OS_LinuxBSD::initialize() { void OS_LinuxBSD::initialize_joypads() { #ifdef JOYDEV_ENABLED - joypad = memnew(JoypadLinux(InputFilter::get_singleton())); + joypad = memnew(JoypadLinux(Input::get_singleton())); #endif } diff --git a/platform/linuxbsd/os_linuxbsd.h b/platform/linuxbsd/os_linuxbsd.h index 100cb53ba3..391f29e8a3 100644 --- a/platform/linuxbsd/os_linuxbsd.h +++ b/platform/linuxbsd/os_linuxbsd.h @@ -31,7 +31,7 @@ #ifndef OS_LINUXBSD_H #define OS_LINUXBSD_H -#include "core/input/input_filter.h" +#include "core/input/input.h" #include "crash_handler_linuxbsd.h" #include "drivers/alsa/audio_driver_alsa.h" #include "drivers/alsamidi/midi_driver_alsamidi.h" diff --git a/platform/osx/display_server_osx.h b/platform/osx/display_server_osx.h index 86ceb51763..8133dfe2c4 100644 --- a/platform/osx/display_server_osx.h +++ b/platform/osx/display_server_osx.h @@ -33,7 +33,7 @@ #define BitMap _QDBitMap // Suppress deprecated QuickDraw definition. -#include "core/input/input_filter.h" +#include "core/input/input.h" #include "servers/display_server.h" #if defined(OPENGL_ENABLED) diff --git a/platform/osx/display_server_osx.mm b/platform/osx/display_server_osx.mm index 074fc3be0d..9d92992332 100644 --- a/platform/osx/display_server_osx.mm +++ b/platform/osx/display_server_osx.mm @@ -55,6 +55,10 @@ #include <QuartzCore/CAMetalLayer.h> #endif +#ifndef NSAppKitVersionNumber10_14 +#define NSAppKitVersionNumber10_14 1671 +#endif + #define DS_OSX ((DisplayServerOSX *)(DisplayServerOSX::get_singleton())) static void _get_key_modifier_state(unsigned int p_osx_state, Ref<InputEventWithModifiers> r_state) { @@ -70,7 +74,7 @@ static Vector2i _get_mouse_pos(DisplayServerOSX::WindowData &p_wd, NSPoint p_loc p_wd.mouse_pos.x = p.x * p_backingScaleFactor; p_wd.mouse_pos.y = (contentRect.size.height - p.y) * p_backingScaleFactor; DS_OSX->last_mouse_pos = p_wd.mouse_pos; - InputFilter::get_singleton()->set_mouse_position(p_wd.mouse_pos); + Input::get_singleton()->set_mouse_position(p_wd.mouse_pos); return p_wd.mouse_pos; } @@ -120,7 +124,7 @@ static NSCursor *_cursorFromSelector(SEL selector, SEL fallback = nil) { k->set_physical_keycode(KEY_PERIOD); k->set_echo([event isARepeat]); - InputFilter::get_singleton()->accumulate_input_event(k); + Input::get_singleton()->accumulate_input_event(k); } } @@ -429,7 +433,7 @@ static NSCursor *_cursorFromSelector(SEL selector, SEL fallback = nil) { const CGFloat backingScaleFactor = (OS::get_singleton()->is_hidpi_allowed()) ? [wd.window_view backingScaleFactor] : 1.0; _get_mouse_pos(wd, [wd.window_object mouseLocationOutsideOfEventStream], backingScaleFactor); - InputFilter::get_singleton()->set_mouse_position(wd.mouse_pos); + Input::get_singleton()->set_mouse_position(wd.mouse_pos); DS_OSX->window_focused = true; DS_OSX->_send_window_event(wd, DisplayServerOSX::WINDOW_EVENT_FOCUS_IN); @@ -755,7 +759,7 @@ static void _mouseDownEvent(DisplayServer::WindowID window_id, NSEvent *event, i mb->set_doubleclick([event clickCount] == 2); } - InputFilter::get_singleton()->accumulate_input_event(mb); + Input::get_singleton()->accumulate_input_event(mb); } - (void)mouseDown:(NSEvent *)event { @@ -804,15 +808,15 @@ static void _mouseDownEvent(DisplayServer::WindowID window_id, NSEvent *event, i mm->set_tilt(Vector2(p.x, p.y)); } mm->set_global_position(pos); - mm->set_speed(InputFilter::get_singleton()->get_last_mouse_speed()); + mm->set_speed(Input::get_singleton()->get_last_mouse_speed()); Vector2i relativeMotion = Vector2i(); relativeMotion.x = [event deltaX] * backingScaleFactor; relativeMotion.y = [event deltaY] * backingScaleFactor; mm->set_relative(relativeMotion); _get_key_modifier_state([event modifierFlags], mm); - InputFilter::get_singleton()->set_mouse_position(wd.mouse_pos); - InputFilter::get_singleton()->accumulate_input_event(mm); + Input::get_singleton()->set_mouse_position(wd.mouse_pos); + Input::get_singleton()->accumulate_input_event(mm); } - (void)rightMouseDown:(NSEvent *)event { @@ -887,7 +891,7 @@ static void _mouseDownEvent(DisplayServer::WindowID window_id, NSEvent *event, i ev->set_position(_get_mouse_pos(wd, [event locationInWindow], backingScaleFactor)); ev->set_factor([event magnification] + 1.0); - InputFilter::get_singleton()->accumulate_input_event(ev); + Input::get_singleton()->accumulate_input_event(ev); } - (void)viewDidChangeBackingProperties { @@ -1353,7 +1357,7 @@ inline void sendScrollEvent(DisplayServer::WindowID window_id, int button, doubl DS_OSX->last_button_state |= mask; sc->set_button_mask(DS_OSX->last_button_state); - InputFilter::get_singleton()->accumulate_input_event(sc); + Input::get_singleton()->accumulate_input_event(sc); sc.instance(); sc->set_window_id(window_id); @@ -1365,7 +1369,7 @@ inline void sendScrollEvent(DisplayServer::WindowID window_id, int button, doubl DS_OSX->last_button_state &= ~mask; sc->set_button_mask(DS_OSX->last_button_state); - InputFilter::get_singleton()->accumulate_input_event(sc); + Input::get_singleton()->accumulate_input_event(sc); } inline void sendPanEvent(DisplayServer::WindowID window_id, double dx, double dy, int modifierFlags) { @@ -1380,7 +1384,7 @@ inline void sendPanEvent(DisplayServer::WindowID window_id, double dx, double dy pg->set_position(wd.mouse_pos); pg->set_delta(Vector2(-dx, -dy)); - InputFilter::get_singleton()->accumulate_input_event(pg); + Input::get_singleton()->accumulate_input_event(pg); } - (void)scrollWheel:(NSEvent *)event { @@ -3002,13 +3006,13 @@ DisplayServerOSX::LatinKeyboardVariant DisplayServerOSX::get_latin_keyboard_vari void DisplayServerOSX::_push_input(const Ref<InputEvent> &p_event) { Ref<InputEvent> ev = p_event; - InputFilter::get_singleton()->accumulate_input_event(ev); + Input::get_singleton()->accumulate_input_event(ev); } void DisplayServerOSX::_release_pressed_events() { _THREAD_SAFE_METHOD_ - if (InputFilter::get_singleton()) { - InputFilter::get_singleton()->release_pressed_events(); + if (Input::get_singleton()) { + Input::get_singleton()->release_pressed_events(); } } @@ -3084,7 +3088,7 @@ void DisplayServerOSX::process_events() { if (!drop_events) { _process_key_events(); - InputFilter::get_singleton()->flush_accumulated_events(); + Input::get_singleton()->flush_accumulated_events(); } [autoreleasePool drain]; @@ -3393,7 +3397,7 @@ bool DisplayServerOSX::is_console_visible() const { } DisplayServerOSX::DisplayServerOSX(const String &p_rendering_driver, WindowMode p_mode, uint32_t p_flags, const Vector2i &p_resolution, Error &r_error) { - InputFilter::get_singleton()->set_event_dispatch_function(_dispatch_input_events); + Input::get_singleton()->set_event_dispatch_function(_dispatch_input_events); r_error = OK; drop_events = false; @@ -3524,7 +3528,10 @@ DisplayServerOSX::DisplayServerOSX(const String &p_rendering_driver, WindowMode } #endif - WindowID main_window = _create_window(p_mode, Rect2i(Point2i(), p_resolution)); + Point2i window_position( + (screen_get_size(0).width - p_resolution.width) / 2, + (screen_get_size(0).height - p_resolution.height) / 2); + WindowID main_window = _create_window(p_mode, Rect2i(window_position, p_resolution)); for (int i = 0; i < WINDOW_FLAG_MAX; i++) { if (p_flags & (1 << i)) { window_set_flag(WindowFlags(i), true, main_window); diff --git a/platform/osx/joypad_osx.cpp b/platform/osx/joypad_osx.cpp index 643acd8944..7f5ec05967 100644 --- a/platform/osx/joypad_osx.cpp +++ b/platform/osx/joypad_osx.cpp @@ -395,38 +395,38 @@ bool joypad::check_ff_features() { static int process_hat_value(int p_min, int p_max, int p_value) { int range = (p_max - p_min + 1); int value = p_value - p_min; - int hat_value = InputFilter::HAT_MASK_CENTER; + int hat_value = Input::HAT_MASK_CENTER; if (range == 4) { value *= 2; } switch (value) { case 0: - hat_value = InputFilter::HAT_MASK_UP; + hat_value = Input::HAT_MASK_UP; break; case 1: - hat_value = InputFilter::HAT_MASK_UP | InputFilter::HAT_MASK_RIGHT; + hat_value = Input::HAT_MASK_UP | Input::HAT_MASK_RIGHT; break; case 2: - hat_value = InputFilter::HAT_MASK_RIGHT; + hat_value = Input::HAT_MASK_RIGHT; break; case 3: - hat_value = InputFilter::HAT_MASK_DOWN | InputFilter::HAT_MASK_RIGHT; + hat_value = Input::HAT_MASK_DOWN | Input::HAT_MASK_RIGHT; break; case 4: - hat_value = InputFilter::HAT_MASK_DOWN; + hat_value = Input::HAT_MASK_DOWN; break; case 5: - hat_value = InputFilter::HAT_MASK_DOWN | InputFilter::HAT_MASK_LEFT; + hat_value = Input::HAT_MASK_DOWN | Input::HAT_MASK_LEFT; break; case 6: - hat_value = InputFilter::HAT_MASK_LEFT; + hat_value = Input::HAT_MASK_LEFT; break; case 7: - hat_value = InputFilter::HAT_MASK_UP | InputFilter::HAT_MASK_LEFT; + hat_value = Input::HAT_MASK_UP | Input::HAT_MASK_LEFT; break; default: - hat_value = InputFilter::HAT_MASK_CENTER; + hat_value = Input::HAT_MASK_CENTER; break; } return hat_value; @@ -438,8 +438,8 @@ void JoypadOSX::poll_joypads() const { } } -static const InputFilter::JoyAxis axis_correct(int p_value, int p_min, int p_max) { - InputFilter::JoyAxis jx; +static const Input::JoyAxis axis_correct(int p_value, int p_min, int p_max) { + Input::JoyAxis jx; if (p_min < 0) { jx.min = -1; if (p_value < 0) { @@ -571,7 +571,7 @@ void JoypadOSX::config_hid_manager(CFArrayRef p_matching_array) const { } } -JoypadOSX::JoypadOSX(InputFilter *in) { +JoypadOSX::JoypadOSX(Input *in) { self = this; input = in; diff --git a/platform/osx/joypad_osx.h b/platform/osx/joypad_osx.h index 62027c6a30..fc176b0990 100644 --- a/platform/osx/joypad_osx.h +++ b/platform/osx/joypad_osx.h @@ -40,7 +40,7 @@ #include <ForceFeedback/ForceFeedbackConstants.h> #include <IOKit/hid/IOHIDLib.h> -#include "core/input/input_filter.h" +#include "core/input/input.h" struct rec_element { IOHIDElementRef ref; @@ -94,7 +94,7 @@ class JoypadOSX { }; private: - InputFilter *input; + Input *input; IOHIDManagerRef hid_manager; Vector<joypad> device_list; @@ -118,7 +118,7 @@ public: void _device_added(IOReturn p_res, IOHIDDeviceRef p_device); void _device_removed(IOReturn p_res, IOHIDDeviceRef p_device); - JoypadOSX(InputFilter *in); + JoypadOSX(Input *in); ~JoypadOSX(); }; diff --git a/platform/osx/os_osx.h b/platform/osx/os_osx.h index d2c67cff9f..9204a145bf 100644 --- a/platform/osx/os_osx.h +++ b/platform/osx/os_osx.h @@ -31,7 +31,7 @@ #ifndef OS_OSX_H #define OS_OSX_H -#include "core/input/input_filter.h" +#include "core/input/input.h" #include "crash_handler_osx.h" #include "drivers/coreaudio/audio_driver_coreaudio.h" #include "drivers/coremidi/midi_driver_coremidi.h" diff --git a/platform/osx/os_osx.mm b/platform/osx/os_osx.mm index 49cb056c9f..f132ed9514 100644 --- a/platform/osx/os_osx.mm +++ b/platform/osx/os_osx.mm @@ -60,39 +60,31 @@ public: switch (p_type) { case ERR_WARNING: - if (NSAppKitVersionNumber >= NSAppKitVersionNumber10_12) { - os_log_info(OS_LOG_DEFAULT, - "WARNING: %{public}s\nat: %{public}s (%{public}s:%i)", - err_details, p_function, p_file, p_line); - } + os_log_info(OS_LOG_DEFAULT, + "WARNING: %{public}s\nat: %{public}s (%{public}s:%i)", + err_details, p_function, p_file, p_line); logf_error("\E[1;33mWARNING:\E[0;93m %s\n", err_details); logf_error("\E[0;90m at: %s (%s:%i)\E[0m\n", p_function, p_file, p_line); break; case ERR_SCRIPT: - if (NSAppKitVersionNumber >= NSAppKitVersionNumber10_12) { - os_log_error(OS_LOG_DEFAULT, - "SCRIPT ERROR: %{public}s\nat: %{public}s (%{public}s:%i)", - err_details, p_function, p_file, p_line); - } + os_log_error(OS_LOG_DEFAULT, + "SCRIPT ERROR: %{public}s\nat: %{public}s (%{public}s:%i)", + err_details, p_function, p_file, p_line); logf_error("\E[1;35mSCRIPT ERROR:\E[0;95m %s\n", err_details); logf_error("\E[0;90m at: %s (%s:%i)\E[0m\n", p_function, p_file, p_line); break; case ERR_SHADER: - if (NSAppKitVersionNumber >= NSAppKitVersionNumber10_12) { - os_log_error(OS_LOG_DEFAULT, - "SHADER ERROR: %{public}s\nat: %{public}s (%{public}s:%i)", - err_details, p_function, p_file, p_line); - } + os_log_error(OS_LOG_DEFAULT, + "SHADER ERROR: %{public}s\nat: %{public}s (%{public}s:%i)", + err_details, p_function, p_file, p_line); logf_error("\E[1;36mSHADER ERROR:\E[0;96m %s\n", err_details); logf_error("\E[0;90m at: %s (%s:%i)\E[0m\n", p_function, p_file, p_line); break; case ERR_ERROR: default: - if (NSAppKitVersionNumber >= NSAppKitVersionNumber10_12) { - os_log_error(OS_LOG_DEFAULT, - "ERROR: %{public}s\nat: %{public}s (%{public}s:%i)", - err_details, p_function, p_file, p_line); - } + os_log_error(OS_LOG_DEFAULT, + "ERROR: %{public}s\nat: %{public}s (%{public}s:%i)", + err_details, p_function, p_file, p_line); logf_error("\E[1;31mERROR:\E[0;91m %s\n", err_details); logf_error("\E[0;90m at: %s (%s:%i)\E[0m\n", p_function, p_file, p_line); break; @@ -136,7 +128,7 @@ void OS_OSX::initialize_core() { } void OS_OSX::initialize_joypads() { - joypad_osx = memnew(JoypadOSX(InputFilter::get_singleton())); + joypad_osx = memnew(JoypadOSX(Input::get_singleton())); } void OS_OSX::initialize() { diff --git a/platform/server/os_server.h b/platform/server/os_server.h index 62028b26e4..b273e8d4e4 100644 --- a/platform/server/os_server.h +++ b/platform/server/os_server.h @@ -31,7 +31,7 @@ #ifndef OS_SERVER_H #define OS_SERVER_H -#include "core/input/input_filter.h" +#include "core/input/input.h" #include "drivers/dummy/texture_loader_dummy.h" #include "drivers/unix/os_unix.h" #ifdef __APPLE__ diff --git a/platform/uwp/joypad_uwp.h b/platform/uwp/joypad_uwp.h index 054b67ddc8..69431052e5 100644 --- a/platform/uwp/joypad_uwp.h +++ b/platform/uwp/joypad_uwp.h @@ -31,7 +31,7 @@ #ifndef JOYPAD_UWP_H #define JOYPAD_UWP_H -#include "core/input/input_filter.h" +#include "core/input/input.h" ref class JoypadUWP sealed { diff --git a/platform/uwp/os_uwp.h b/platform/uwp/os_uwp.h index ad0efa1d03..2233f6a413 100644 --- a/platform/uwp/os_uwp.h +++ b/platform/uwp/os_uwp.h @@ -32,7 +32,7 @@ #define OS_UWP_H #include "context_egl_uwp.h" -#include "core/input/input_filter.h" +#include "core/input/input.h" #include "core/math/transform_2d.h" #include "core/os/os.h" #include "core/ustring.h" diff --git a/platform/windows/crash_handler_windows.cpp b/platform/windows/crash_handler_windows.cpp index 1d9eba22d8..996d9722f5 100644 --- a/platform/windows/crash_handler_windows.cpp +++ b/platform/windows/crash_handler_windows.cpp @@ -38,11 +38,13 @@ // Backtrace code code based on: https://stackoverflow.com/questions/6205981/windows-c-stack-trace-from-a-running-app -#include <psapi.h> #include <algorithm> #include <iterator> +#include <string> #include <vector> +#include <psapi.h> + #pragma comment(lib, "psapi.lib") #pragma comment(lib, "dbghelp.lib") diff --git a/platform/windows/display_server_windows.cpp b/platform/windows/display_server_windows.cpp index ebe9a7d27a..e4fe7f04d0 100644 --- a/platform/windows/display_server_windows.cpp +++ b/platform/windows/display_server_windows.cpp @@ -666,7 +666,7 @@ void DisplayServerWindows::_update_real_mouse_position(WindowID p_window) { old_x = mouse_pos.x; old_y = mouse_pos.y; old_invalid = false; - InputFilter::get_singleton()->set_mouse_position(Point2i(mouse_pos.x, mouse_pos.y)); + Input::get_singleton()->set_mouse_position(Point2i(mouse_pos.x, mouse_pos.y)); } } } @@ -1511,7 +1511,7 @@ void DisplayServerWindows::process_events() { if (!drop_events) { _process_key_events(); - InputFilter::get_singleton()->flush_accumulated_events(); + Input::get_singleton()->flush_accumulated_events(); } } @@ -1715,7 +1715,7 @@ void DisplayServerWindows::_touch_event(WindowID p_window, bool p_pressed, float event->set_pressed(p_pressed); event->set_position(Vector2(p_x, p_y)); - InputFilter::get_singleton()->accumulate_input_event(event); + Input::get_singleton()->accumulate_input_event(event); } void DisplayServerWindows::_drag_event(WindowID p_window, float p_x, float p_y, int idx) { @@ -1735,7 +1735,7 @@ void DisplayServerWindows::_drag_event(WindowID p_window, float p_x, float p_y, event->set_position(Vector2(p_x, p_y)); event->set_relative(Vector2(p_x, p_y) - curr->get()); - InputFilter::get_singleton()->accumulate_input_event(event); + Input::get_singleton()->accumulate_input_event(event); curr->get() = Vector2(p_x, p_y); } @@ -1843,7 +1843,7 @@ LRESULT DisplayServerWindows::WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARA control_mem = false; shift_mem = false; } else { // WM_INACTIVE - InputFilter::get_singleton()->release_pressed_events(); + Input::get_singleton()->release_pressed_events(); _send_window_event(windows[window_id], WINDOW_EVENT_FOCUS_OUT); windows[window_id].window_focused = false; alt_mem = false; @@ -1940,7 +1940,7 @@ LRESULT DisplayServerWindows::WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARA mm->set_position(c); mm->set_global_position(c); - InputFilter::get_singleton()->set_mouse_position(c); + Input::get_singleton()->set_mouse_position(c); mm->set_speed(Vector2(0, 0)); if (raw->data.mouse.usFlags == MOUSE_MOVE_RELATIVE) { @@ -1973,7 +1973,7 @@ LRESULT DisplayServerWindows::WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARA } if (windows[window_id].window_has_focus && mm->get_relative() != Vector2()) - InputFilter::get_singleton()->accumulate_input_event(mm); + Input::get_singleton()->accumulate_input_event(mm); } delete[] lpb; } break; @@ -2001,7 +2001,7 @@ LRESULT DisplayServerWindows::WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARA break; } - if (InputFilter::get_singleton()->is_emulating_mouse_from_touch()) { + if (Input::get_singleton()->is_emulating_mouse_from_touch()) { // Universal translation enabled; ignore OS translation LPARAM extra = GetMessageExtraInfo(); if (IsTouchEvent(extra)) { @@ -2074,8 +2074,8 @@ LRESULT DisplayServerWindows::WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARA SetCursorPos(pos.x, pos.y); } - InputFilter::get_singleton()->set_mouse_position(mm->get_position()); - mm->set_speed(InputFilter::get_singleton()->get_last_mouse_speed()); + Input::get_singleton()->set_mouse_position(mm->get_position()); + mm->set_speed(Input::get_singleton()->get_last_mouse_speed()); if (old_invalid) { @@ -2088,7 +2088,7 @@ LRESULT DisplayServerWindows::WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARA old_x = mm->get_position().x; old_y = mm->get_position().y; if (windows[window_id].window_has_focus) { - InputFilter::get_singleton()->parse_input_event(mm); + Input::get_singleton()->parse_input_event(mm); } return 0; //Pointer event handled return 0 to avoid duplicate WM_MOUSEMOVE event @@ -2098,7 +2098,7 @@ LRESULT DisplayServerWindows::WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARA break; } - if (InputFilter::get_singleton()->is_emulating_mouse_from_touch()) { + if (Input::get_singleton()->is_emulating_mouse_from_touch()) { // Universal translation enabled; ignore OS translation LPARAM extra = GetMessageExtraInfo(); if (IsTouchEvent(extra)) { @@ -2161,8 +2161,8 @@ LRESULT DisplayServerWindows::WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARA SetCursorPos(pos.x, pos.y); } - InputFilter::get_singleton()->set_mouse_position(mm->get_position()); - mm->set_speed(InputFilter::get_singleton()->get_last_mouse_speed()); + Input::get_singleton()->set_mouse_position(mm->get_position()); + mm->set_speed(Input::get_singleton()->get_last_mouse_speed()); if (old_invalid) { @@ -2175,12 +2175,12 @@ LRESULT DisplayServerWindows::WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARA old_x = mm->get_position().x; old_y = mm->get_position().y; if (windows[window_id].window_has_focus) - InputFilter::get_singleton()->accumulate_input_event(mm); + Input::get_singleton()->accumulate_input_event(mm); } break; case WM_LBUTTONDOWN: case WM_LBUTTONUP: - if (InputFilter::get_singleton()->is_emulating_mouse_from_touch()) { + if (Input::get_singleton()->is_emulating_mouse_from_touch()) { // Universal translation enabled; ignore OS translations for left button LPARAM extra = GetMessageExtraInfo(); if (IsTouchEvent(extra)) { @@ -2347,7 +2347,7 @@ LRESULT DisplayServerWindows::WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARA mb->set_global_position(mb->get_position()); - InputFilter::get_singleton()->accumulate_input_event(mb); + Input::get_singleton()->accumulate_input_event(mb); if (mb->is_pressed() && mb->get_button_index() > 3 && mb->get_button_index() < 8) { //send release for mouse wheel Ref<InputEventMouseButton> mbd = mb->duplicate(); @@ -2355,7 +2355,7 @@ LRESULT DisplayServerWindows::WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARA last_button_state &= ~(1 << (mbd->get_button_index() - 1)); mbd->set_button_mask(last_button_state); mbd->set_pressed(false); - InputFilter::get_singleton()->accumulate_input_event(mbd); + Input::get_singleton()->accumulate_input_event(mbd); } } break; @@ -2444,7 +2444,7 @@ LRESULT DisplayServerWindows::WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARA } break; case WM_ENTERSIZEMOVE: { - InputFilter::get_singleton()->release_pressed_events(); + Input::get_singleton()->release_pressed_events(); move_timer_id = SetTimer(windows[window_id].hWnd, 1, USER_TIMER_MINIMUM, (TIMERPROC) nullptr); } break; case WM_EXITSIZEMOVE: { @@ -2652,7 +2652,7 @@ void DisplayServerWindows::_process_key_events() { if (k->get_unicode() < 32) k->set_unicode(0); - InputFilter::get_singleton()->accumulate_input_event(k); + Input::get_singleton()->accumulate_input_event(k); } //do nothing @@ -2693,7 +2693,7 @@ void DisplayServerWindows::_process_key_events() { k->set_echo((ke.uMsg == WM_KEYDOWN && (ke.lParam & (1 << 30)))); - InputFilter::get_singleton()->accumulate_input_event(k); + Input::get_singleton()->accumulate_input_event(k); } break; } @@ -2897,7 +2897,10 @@ DisplayServerWindows::DisplayServerWindows(const String &p_rendering_driver, Win } } #endif - WindowID main_window = _create_window(p_mode, 0, Rect2i(Point2i(), p_resolution)); + Point2i window_position( + (screen_get_size(0).width - p_resolution.width) / 2, + (screen_get_size(0).height - p_resolution.height) / 2); + WindowID main_window = _create_window(p_mode, 0, Rect2i(window_position, p_resolution)); for (int i = 0; i < WINDOW_FLAG_MAX; i++) { if (p_flags & (1 << i)) { window_set_flag(WindowFlags(i), true, main_window); @@ -2945,7 +2948,7 @@ DisplayServerWindows::DisplayServerWindows(const String &p_rendering_driver, Win r_error = OK; ((OS_Windows *)OS::get_singleton())->set_main_window(windows[MAIN_WINDOW_ID].hWnd); - InputFilter::get_singleton()->set_event_dispatch_function(_dispatch_input_events); + Input::get_singleton()->set_event_dispatch_function(_dispatch_input_events); } Vector<String> DisplayServerWindows::get_rendering_drivers_func() { diff --git a/platform/windows/display_server_windows.h b/platform/windows/display_server_windows.h index 5cd240ffb0..6243f54cfa 100644 --- a/platform/windows/display_server_windows.h +++ b/platform/windows/display_server_windows.h @@ -33,7 +33,7 @@ #include "servers/display_server.h" -#include "core/input/input_filter.h" +#include "core/input/input.h" #include "core/os/os.h" #include "core/project_settings.h" #include "crash_handler_windows.h" diff --git a/platform/windows/joypad_windows.cpp b/platform/windows/joypad_windows.cpp index 437c3b733d..2adf2a8652 100644 --- a/platform/windows/joypad_windows.cpp +++ b/platform/windows/joypad_windows.cpp @@ -54,7 +54,7 @@ JoypadWindows::JoypadWindows() { JoypadWindows::JoypadWindows(HWND *hwnd) { - input = InputFilter::get_singleton(); + input = Input::get_singleton(); hWnd = hwnd; joypad_count = 0; dinput = nullptr; @@ -436,46 +436,46 @@ void JoypadWindows::post_hat(int p_device, DWORD p_dpad) { // BOOL POVCentered = (LOWORD(dwPOV) == 0xFFFF);" // https://docs.microsoft.com/en-us/previous-versions/windows/desktop/ee416628(v%3Dvs.85)#remarks if (LOWORD(p_dpad) == 0xFFFF) { - dpad_val = InputFilter::HAT_MASK_CENTER; + dpad_val = Input::HAT_MASK_CENTER; } if (p_dpad == 0) { - dpad_val = InputFilter::HAT_MASK_UP; + dpad_val = Input::HAT_MASK_UP; } else if (p_dpad == 4500) { - dpad_val = (InputFilter::HAT_MASK_UP | InputFilter::HAT_MASK_RIGHT); + dpad_val = (Input::HAT_MASK_UP | Input::HAT_MASK_RIGHT); } else if (p_dpad == 9000) { - dpad_val = InputFilter::HAT_MASK_RIGHT; + dpad_val = Input::HAT_MASK_RIGHT; } else if (p_dpad == 13500) { - dpad_val = (InputFilter::HAT_MASK_RIGHT | InputFilter::HAT_MASK_DOWN); + dpad_val = (Input::HAT_MASK_RIGHT | Input::HAT_MASK_DOWN); } else if (p_dpad == 18000) { - dpad_val = InputFilter::HAT_MASK_DOWN; + dpad_val = Input::HAT_MASK_DOWN; } else if (p_dpad == 22500) { - dpad_val = (InputFilter::HAT_MASK_DOWN | InputFilter::HAT_MASK_LEFT); + dpad_val = (Input::HAT_MASK_DOWN | Input::HAT_MASK_LEFT); } else if (p_dpad == 27000) { - dpad_val = InputFilter::HAT_MASK_LEFT; + dpad_val = Input::HAT_MASK_LEFT; } else if (p_dpad == 31500) { - dpad_val = (InputFilter::HAT_MASK_LEFT | InputFilter::HAT_MASK_UP); + dpad_val = (Input::HAT_MASK_LEFT | Input::HAT_MASK_UP); } input->joy_hat(p_device, dpad_val); }; -InputFilter::JoyAxis JoypadWindows::axis_correct(int p_val, bool p_xinput, bool p_trigger, bool p_negate) const { +Input::JoyAxis JoypadWindows::axis_correct(int p_val, bool p_xinput, bool p_trigger, bool p_negate) const { - InputFilter::JoyAxis jx; + Input::JoyAxis jx; if (Math::abs(p_val) < MIN_JOY_AXIS) { jx.min = p_trigger ? 0 : -1; jx.value = 0.0f; diff --git a/platform/windows/joypad_windows.h b/platform/windows/joypad_windows.h index 0db789c335..fefdcf1673 100644 --- a/platform/windows/joypad_windows.h +++ b/platform/windows/joypad_windows.h @@ -117,7 +117,7 @@ private: HWND *hWnd; HANDLE xinput_dll; LPDIRECTINPUT8 dinput; - InputFilter *input; + Input *input; int id_to_change; int joypad_count; @@ -141,7 +141,7 @@ private: void joypad_vibration_start_xinput(int p_device, float p_weak_magnitude, float p_strong_magnitude, float p_duration, uint64_t p_timestamp); void joypad_vibration_stop_xinput(int p_device, uint64_t p_timestamp); - InputFilter::JoyAxis axis_correct(int p_val, bool p_xinput = false, bool p_trigger = false, bool p_negate = false) const; + Input::JoyAxis axis_correct(int p_val, bool p_xinput = false, bool p_trigger = false, bool p_negate = false) const; XInputGetState_t xinput_get_state; XInputSetState_t xinput_set_state; }; diff --git a/platform/windows/os_windows.h b/platform/windows/os_windows.h index 6bdfc75ebb..7226109e57 100644 --- a/platform/windows/os_windows.h +++ b/platform/windows/os_windows.h @@ -31,7 +31,7 @@ #ifndef OS_WINDOWS_H #define OS_WINDOWS_H -#include "core/input/input_filter.h" +#include "core/input/input.h" #include "core/os/os.h" #include "core/project_settings.h" #include "crash_handler_windows.h" diff --git a/scene/2d/area_2d.cpp b/scene/2d/area_2d.cpp index c46b6eeb5c..8ba334bc67 100644 --- a/scene/2d/area_2d.cpp +++ b/scene/2d/area_2d.cpp @@ -435,10 +435,10 @@ bool Area2D::is_monitorable() const { return monitorable; } -Array Area2D::get_overlapping_bodies() const { +TypedArray<Node2D> Area2D::get_overlapping_bodies() const { ERR_FAIL_COND_V_MSG(!monitoring, Array(), "Can't find overlapping bodies when monitoring is off."); - Array ret; + TypedArray<Node2D> ret; ret.resize(body_map.size()); int idx = 0; for (const Map<ObjectID, BodyState>::Element *E = body_map.front(); E; E = E->next()) { @@ -453,10 +453,10 @@ Array Area2D::get_overlapping_bodies() const { return ret; } -Array Area2D::get_overlapping_areas() const { +TypedArray<Area2D> Area2D::get_overlapping_areas() const { ERR_FAIL_COND_V_MSG(!monitoring, Array(), "Can't find overlapping bodies when monitoring is off."); - Array ret; + TypedArray<Area2D> ret; ret.resize(area_map.size()); int idx = 0; for (const Map<ObjectID, AreaState>::Element *E = area_map.front(); E; E = E->next()) { diff --git a/scene/2d/area_2d.h b/scene/2d/area_2d.h index c5e6635412..0e2c0ac672 100644 --- a/scene/2d/area_2d.h +++ b/scene/2d/area_2d.h @@ -178,8 +178,8 @@ public: void set_collision_layer_bit(int p_bit, bool p_value); bool get_collision_layer_bit(int p_bit) const; - Array get_overlapping_bodies() const; //function for script - Array get_overlapping_areas() const; //function for script + TypedArray<Node2D> get_overlapping_bodies() const; //function for script + TypedArray<Area2D> get_overlapping_areas() const; //function for script bool overlaps_area(Node *p_area) const; bool overlaps_body(Node *p_body) const; diff --git a/scene/2d/line_2d.cpp b/scene/2d/line_2d.cpp index c45eab70df..43c54ffd17 100644 --- a/scene/2d/line_2d.cpp +++ b/scene/2d/line_2d.cpp @@ -43,7 +43,7 @@ Line2D::Line2D() { _begin_cap_mode = LINE_CAP_NONE; _end_cap_mode = LINE_CAP_NONE; _width = 10; - _default_color = Color(0.4, 0.5, 1); + _default_color = Color(1, 1, 1); _texture_mode = LINE_TEXTURE_NONE; _sharp_limit = 2.f; _round_precision = 8; diff --git a/scene/2d/navigation_region_2d.cpp b/scene/2d/navigation_region_2d.cpp index d77fd5b097..19484442b1 100644 --- a/scene/2d/navigation_region_2d.cpp +++ b/scene/2d/navigation_region_2d.cpp @@ -95,7 +95,7 @@ Vector<Vector2> NavigationPolygon::get_vertices() const { return vertices; } -void NavigationPolygon::_set_polygons(const Array &p_array) { +void NavigationPolygon::_set_polygons(const TypedArray<Vector<int32_t>> &p_array) { { MutexLock lock(navmesh_generation); @@ -118,7 +118,7 @@ Array NavigationPolygon::_get_polygons() const { return ret; } -void NavigationPolygon::_set_outlines(const Array &p_array) { +void NavigationPolygon::_set_outlines(const TypedArray<Vector<int32_t>> &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 73e056a353..cbfe4299fb 100644 --- a/scene/2d/navigation_region_2d.h +++ b/scene/2d/navigation_region_2d.h @@ -55,10 +55,10 @@ class NavigationPolygon : public Resource { protected: static void _bind_methods(); - void _set_polygons(const Array &p_array); + void _set_polygons(const TypedArray<Vector<int32_t>> &p_array); Array _get_polygons() const; - void _set_outlines(const Array &p_array); + void _set_outlines(const TypedArray<Vector<int32_t>> &p_array); Array _get_outlines() const; public: diff --git a/scene/2d/path_2d.cpp b/scene/2d/path_2d.cpp index d55b21bc24..149d5c6b0d 100644 --- a/scene/2d/path_2d.cpp +++ b/scene/2d/path_2d.cpp @@ -102,7 +102,7 @@ void Path2D::_notification(int p_what) { #else const float line_width = 2; #endif - const Color color = Color(1.0, 1.0, 1.0, 1.0); + const Color color = Color(0.5, 0.6, 1.0, 0.7); for (int i = 0; i < curve->get_point_count(); i++) { @@ -162,7 +162,6 @@ void Path2D::_bind_methods() { Path2D::Path2D() { set_curve(Ref<Curve2D>(memnew(Curve2D))); //create one by default - set_self_modulate(Color(0.5, 0.6, 1.0, 0.7)); } ///////////////////////////////////////////////////////////////////////////////// @@ -321,16 +320,14 @@ void PathFollow2D::set_offset(float p_offset) { offset = p_offset; if (path) { - if (path->get_curve().is_valid() && path->get_curve()->get_baked_length()) { + if (path->get_curve().is_valid()) { float path_length = path->get_curve()->get_baked_length(); if (loop) { - while (offset > path_length) - offset -= path_length; - - while (offset < 0) - offset += path_length; - + offset = Math::fposmod(offset, path_length); + if (!Math::is_zero_approx(p_offset) && Math::is_zero_approx(offset)) { + offset = path_length; + } } else { offset = CLAMP(offset, 0, path_length); } diff --git a/scene/2d/physics_body_2d.cpp b/scene/2d/physics_body_2d.cpp index 21dc9537ec..de15f0efc2 100644 --- a/scene/2d/physics_body_2d.cpp +++ b/scene/2d/physics_body_2d.cpp @@ -139,7 +139,7 @@ PhysicsBody2D::PhysicsBody2D(PhysicsServer2D::BodyMode p_mode) : set_pickable(false); } -Array PhysicsBody2D::get_collision_exceptions() { +TypedArray<PhysicsBody2D> PhysicsBody2D::get_collision_exceptions() { List<RID> exceptions; PhysicsServer2D::get_singleton()->body_get_collision_exceptions(get_rid(), &exceptions); Array ret; @@ -739,11 +739,11 @@ RigidBody2D::CCDMode RigidBody2D::get_continuous_collision_detection_mode() cons return ccd_mode; } -Array RigidBody2D::get_colliding_bodies() const { +TypedArray<Node2D> RigidBody2D::get_colliding_bodies() const { ERR_FAIL_COND_V(!contact_monitor, Array()); - Array ret; + TypedArray<Node2D> ret; ret.resize(contact_monitor->body_map.size()); int idx = 0; for (const Map<ObjectID, BodyState>::Element *E = contact_monitor->body_map.front(); E; E = E->next()) { diff --git a/scene/2d/physics_body_2d.h b/scene/2d/physics_body_2d.h index 0d92a820e3..75f4f778bf 100644 --- a/scene/2d/physics_body_2d.h +++ b/scene/2d/physics_body_2d.h @@ -67,7 +67,7 @@ public: void set_collision_layer_bit(int p_bit, bool p_value); bool get_collision_layer_bit(int p_bit) const; - Array get_collision_exceptions(); + TypedArray<PhysicsBody2D> get_collision_exceptions(); void add_collision_exception_with(Node *p_node); //must be physicsbody void remove_collision_exception_with(Node *p_node); @@ -256,7 +256,7 @@ public: void add_force(const Vector2 &p_offset, const Vector2 &p_force); void add_torque(float p_torque); - Array get_colliding_bodies() const; //function for script + TypedArray<Node2D> get_colliding_bodies() const; //function for script virtual String get_configuration_warning() const; diff --git a/scene/2d/tile_map.cpp b/scene/2d/tile_map.cpp index 1cf12e4421..9628c01718 100644 --- a/scene/2d/tile_map.cpp +++ b/scene/2d/tile_map.cpp @@ -1691,27 +1691,27 @@ bool TileMap::is_centered_textures_enabled() const { return centered_textures; } -Array TileMap::get_used_cells() const { +TypedArray<Vector2i> TileMap::get_used_cells() const { - Array a; + TypedArray<Vector2i> a; a.resize(tile_map.size()); int i = 0; for (Map<PosKey, Cell>::Element *E = tile_map.front(); E; E = E->next()) { - Vector2 p(E->key().x, E->key().y); + Vector2i p(E->key().x, E->key().y); a[i++] = p; } return a; } -Array TileMap::get_used_cells_by_id(int p_id) const { +TypedArray<Vector2i> TileMap::get_used_cells_by_id(int p_id) const { - Array a; + TypedArray<Vector2i> a; for (Map<PosKey, Cell>::Element *E = tile_map.front(); E; E = E->next()) { if (E->value().id == p_id) { - Vector2 p(E->key().x, E->key().y); + Vector2i p(E->key().x, E->key().y); a.push_back(p); } } diff --git a/scene/2d/tile_map.h b/scene/2d/tile_map.h index d9490aae13..cc1537f583 100644 --- a/scene/2d/tile_map.h +++ b/scene/2d/tile_map.h @@ -328,8 +328,8 @@ public: void set_centered_textures(bool p_enable); bool is_centered_textures_enabled() const; - Array get_used_cells() const; - Array get_used_cells_by_id(int p_id) const; + TypedArray<Vector2i> get_used_cells() const; + TypedArray<Vector2i> get_used_cells_by_id(int p_id) const; Rect2 get_used_rect(); // Not const because of cache void set_occluder_light_mask(int p_mask); diff --git a/scene/2d/touch_screen_button.cpp b/scene/2d/touch_screen_button.cpp index 2cb979a0e0..85fd05ac15 100644 --- a/scene/2d/touch_screen_button.cpp +++ b/scene/2d/touch_screen_button.cpp @@ -30,7 +30,7 @@ #include "touch_screen_button.h" -#include "core/input/input_filter.h" +#include "core/input/input.h" #include "core/input/input_map.h" #include "core/os/os.h" #include "scene/main/window.h" @@ -290,7 +290,7 @@ void TouchScreenButton::_press(int p_finger_pressed) { if (action != StringName()) { - InputFilter::get_singleton()->action_press(action); + Input::get_singleton()->action_press(action); Ref<InputEventAction> iea; iea.instance(); iea->set_action(action); @@ -308,7 +308,7 @@ void TouchScreenButton::_release(bool p_exiting_tree) { if (action != StringName()) { - InputFilter::get_singleton()->action_release(action); + Input::get_singleton()->action_release(action); if (!p_exiting_tree) { Ref<InputEventAction> iea; diff --git a/scene/3d/area_3d.cpp b/scene/3d/area_3d.cpp index 17ae553e5e..b72483d71b 100644 --- a/scene/3d/area_3d.cpp +++ b/scene/3d/area_3d.cpp @@ -416,7 +416,7 @@ bool Area3D::is_monitoring() const { return monitoring; } -Array Area3D::get_overlapping_bodies() const { +TypedArray<Node3D> Area3D::get_overlapping_bodies() const { ERR_FAIL_COND_V(!monitoring, Array()); Array ret; @@ -451,7 +451,7 @@ bool Area3D::is_monitorable() const { return monitorable; } -Array Area3D::get_overlapping_areas() const { +TypedArray<Area3D> Area3D::get_overlapping_areas() const { ERR_FAIL_COND_V(!monitoring, Array()); Array ret; diff --git a/scene/3d/area_3d.h b/scene/3d/area_3d.h index ff6c0b6b08..f6503c6d2d 100644 --- a/scene/3d/area_3d.h +++ b/scene/3d/area_3d.h @@ -184,8 +184,8 @@ public: void set_collision_layer_bit(int p_bit, bool p_value); bool get_collision_layer_bit(int p_bit) const; - Array get_overlapping_bodies() const; - Array get_overlapping_areas() const; //function for script + TypedArray<Node3D> get_overlapping_bodies() const; + TypedArray<Area3D> get_overlapping_areas() const; //function for script bool overlaps_area(Node *p_area) const; bool overlaps_body(Node *p_body) const; diff --git a/scene/3d/audio_stream_player_3d.cpp b/scene/3d/audio_stream_player_3d.cpp index 097368853e..28a8b01437 100644 --- a/scene/3d/audio_stream_player_3d.cpp +++ b/scene/3d/audio_stream_player_3d.cpp @@ -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; } diff --git a/scene/3d/decal.cpp b/scene/3d/decal.cpp new file mode 100644 index 0000000000..4c824aedc4 --- /dev/null +++ b/scene/3d/decal.cpp @@ -0,0 +1,235 @@ +/*************************************************************************/ +/* decal.cpp */ +/*************************************************************************/ +/* This file is part of: */ +/* GODOT ENGINE */ +/* https://godotengine.org */ +/*************************************************************************/ +/* Copyright (c) 2007-2020 Juan Linietsky, Ariel Manzur. */ +/* Copyright (c) 2014-2020 Godot Engine contributors (cf. AUTHORS.md). */ +/* */ +/* Permission is hereby granted, free of charge, to any person obtaining */ +/* a copy of this software and associated documentation files (the */ +/* "Software"), to deal in the Software without restriction, including */ +/* without limitation the rights to use, copy, modify, merge, publish, */ +/* distribute, sublicense, and/or sell copies of the Software, and to */ +/* permit persons to whom the Software is furnished to do so, subject to */ +/* the following conditions: */ +/* */ +/* The above copyright notice and this permission notice shall be */ +/* included in all copies or substantial portions of the Software. */ +/* */ +/* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, */ +/* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF */ +/* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.*/ +/* IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY */ +/* CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, */ +/* TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE */ +/* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ +/*************************************************************************/ + +#include "decal.h" + +void Decal::set_extents(const Vector3 &p_extents) { + extents = p_extents; + RS::get_singleton()->decal_set_extents(decal, p_extents); + update_gizmo(); + _change_notify("extents"); +} + +Vector3 Decal::get_extents() const { + return extents; +} + +void Decal::set_texture(DecalTexture p_type, const Ref<Texture2D> &p_texture) { + ERR_FAIL_INDEX(p_type, TEXTURE_MAX); + textures[p_type] = p_texture; + RID texture_rid = p_texture.is_valid() ? p_texture->get_rid() : RID(); + RS::get_singleton()->decal_set_texture(decal, RS::DecalTexture(p_type), texture_rid); +} +Ref<Texture2D> Decal::get_texture(DecalTexture p_type) const { + ERR_FAIL_INDEX_V(p_type, TEXTURE_MAX, Ref<Texture2D>()); + return textures[p_type]; +} + +void Decal::set_emission_energy(float p_energy) { + emission_energy = p_energy; + RS::get_singleton()->decal_set_emission_energy(decal, emission_energy); +} +float Decal::get_emission_energy() const { + return emission_energy; +} + +void Decal::set_albedo_mix(float p_mix) { + albedo_mix = p_mix; + RS::get_singleton()->decal_set_albedo_mix(decal, albedo_mix); +} +float Decal::get_albedo_mix() const { + return albedo_mix; +} + +void Decal::set_upper_fade(float p_fade) { + upper_fade = p_fade; + RS::get_singleton()->decal_set_fade(decal, upper_fade, lower_fade); +} +float Decal::get_upper_fade() const { + return upper_fade; +} + +void Decal::set_lower_fade(float p_fade) { + lower_fade = p_fade; + RS::get_singleton()->decal_set_fade(decal, upper_fade, lower_fade); +} +float Decal::get_lower_fade() const { + return lower_fade; +} + +void Decal::set_normal_fade(float p_fade) { + normal_fade = p_fade; + RS::get_singleton()->decal_set_normal_fade(decal, normal_fade); +} +float Decal::get_normal_fade() const { + return normal_fade; +} + +void Decal::set_modulate(Color p_modulate) { + modulate = p_modulate; + RS::get_singleton()->decal_set_modulate(decal, p_modulate); +} + +Color Decal::get_modulate() const { + return modulate; +} + +void Decal::set_enable_distance_fade(bool p_enable) { + distance_fade_enabled = p_enable; + RS::get_singleton()->decal_set_distance_fade(decal, distance_fade_enabled, distance_fade_begin, distance_fade_length); +} +bool Decal::is_distance_fade_enabled() const { + return distance_fade_enabled; +} + +void Decal::set_distance_fade_begin(float p_distance) { + distance_fade_begin = p_distance; + RS::get_singleton()->decal_set_distance_fade(decal, distance_fade_enabled, distance_fade_begin, distance_fade_length); +} +float Decal::get_distance_fade_begin() const { + return distance_fade_begin; +} + +void Decal::set_distance_fade_length(float p_length) { + distance_fade_length = p_length; + RS::get_singleton()->decal_set_distance_fade(decal, distance_fade_enabled, distance_fade_begin, distance_fade_length); +} +float Decal::get_distance_fade_length() const { + return distance_fade_length; +} + +void Decal::set_cull_mask(uint32_t p_layers) { + cull_mask = p_layers; + RS::get_singleton()->decal_set_cull_mask(decal, cull_mask); +} +uint32_t Decal::get_cull_mask() const { + return cull_mask; +} + +AABB Decal::get_aabb() const { + + AABB aabb; + aabb.position = -extents; + aabb.size = extents * 2.0; + return aabb; +} +Vector<Face3> Decal::get_faces(uint32_t p_usage_flags) const { + + return Vector<Face3>(); +} + +void Decal::_bind_methods() { + + ClassDB::bind_method(D_METHOD("set_extents", "extents"), &Decal::set_extents); + ClassDB::bind_method(D_METHOD("get_extents"), &Decal::get_extents); + + ClassDB::bind_method(D_METHOD("set_texture", "type", "texture"), &Decal::set_texture); + ClassDB::bind_method(D_METHOD("get_texture", "type"), &Decal::get_texture); + + ClassDB::bind_method(D_METHOD("set_emission_energy", "energy"), &Decal::set_emission_energy); + ClassDB::bind_method(D_METHOD("get_emission_energy"), &Decal::get_emission_energy); + + ClassDB::bind_method(D_METHOD("set_albedo_mix", "energy"), &Decal::set_albedo_mix); + ClassDB::bind_method(D_METHOD("get_albedo_mix"), &Decal::get_albedo_mix); + + ClassDB::bind_method(D_METHOD("set_modulate", "color"), &Decal::set_modulate); + ClassDB::bind_method(D_METHOD("get_modulate"), &Decal::get_modulate); + + ClassDB::bind_method(D_METHOD("set_upper_fade", "fade"), &Decal::set_upper_fade); + ClassDB::bind_method(D_METHOD("get_upper_fade"), &Decal::get_upper_fade); + + ClassDB::bind_method(D_METHOD("set_lower_fade", "fade"), &Decal::set_lower_fade); + ClassDB::bind_method(D_METHOD("get_lower_fade"), &Decal::get_lower_fade); + + ClassDB::bind_method(D_METHOD("set_normal_fade", "fade"), &Decal::set_normal_fade); + ClassDB::bind_method(D_METHOD("get_normal_fade"), &Decal::get_normal_fade); + + ClassDB::bind_method(D_METHOD("set_enable_distance_fade", "enable"), &Decal::set_enable_distance_fade); + ClassDB::bind_method(D_METHOD("is_distance_fade_enabled"), &Decal::is_distance_fade_enabled); + + ClassDB::bind_method(D_METHOD("set_distance_fade_begin", "distance"), &Decal::set_distance_fade_begin); + ClassDB::bind_method(D_METHOD("get_distance_fade_begin"), &Decal::get_distance_fade_begin); + + ClassDB::bind_method(D_METHOD("set_distance_fade_length", "distance"), &Decal::set_distance_fade_length); + ClassDB::bind_method(D_METHOD("get_distance_fade_length"), &Decal::get_distance_fade_length); + + ClassDB::bind_method(D_METHOD("set_cull_mask", "mask"), &Decal::set_cull_mask); + ClassDB::bind_method(D_METHOD("get_cull_mask"), &Decal::get_cull_mask); + + ADD_PROPERTY(PropertyInfo(Variant::VECTOR3, "extents", PROPERTY_HINT_RANGE, "0,1024,0.001,or_greater"), "set_extents", "get_extents"); + ADD_GROUP("Textures", "texture_"); + ADD_PROPERTYI(PropertyInfo(Variant::OBJECT, "texture_albedo", PROPERTY_HINT_RESOURCE_TYPE, "Texture"), "set_texture", "get_texture", TEXTURE_ALBEDO); + ADD_PROPERTYI(PropertyInfo(Variant::OBJECT, "texture_normal", PROPERTY_HINT_RESOURCE_TYPE, "Texture"), "set_texture", "get_texture", TEXTURE_NORMAL); + ADD_PROPERTYI(PropertyInfo(Variant::OBJECT, "texture_orm", PROPERTY_HINT_RESOURCE_TYPE, "Texture"), "set_texture", "get_texture", TEXTURE_ORM); + ADD_PROPERTYI(PropertyInfo(Variant::OBJECT, "texture_emission", PROPERTY_HINT_RESOURCE_TYPE, "Texture"), "set_texture", "get_texture", TEXTURE_EMISSION); + ADD_GROUP("Parameters", ""); + ADD_PROPERTY(PropertyInfo(Variant::FLOAT, "emission_energy", PROPERTY_HINT_RANGE, "0,128,0.01"), "set_emission_energy", "get_emission_energy"); + ADD_PROPERTY(PropertyInfo(Variant::COLOR, "modulate"), "set_modulate", "get_modulate"); + ADD_PROPERTY(PropertyInfo(Variant::FLOAT, "albedo_mix", PROPERTY_HINT_RANGE, "0,1,0.01"), "set_albedo_mix", "get_albedo_mix"); + ADD_PROPERTY(PropertyInfo(Variant::FLOAT, "normal_fade", PROPERTY_HINT_RANGE, "0,1,0.01"), "set_normal_fade", "get_normal_fade"); + ADD_GROUP("Vertical Fade", ""); + ADD_PROPERTY(PropertyInfo(Variant::FLOAT, "upper_fade", PROPERTY_HINT_EXP_EASING, "attenuation"), "set_upper_fade", "get_upper_fade"); + ADD_PROPERTY(PropertyInfo(Variant::FLOAT, "lower_fade", PROPERTY_HINT_EXP_EASING, "attenuation"), "set_lower_fade", "get_lower_fade"); + ADD_GROUP("Distance Fade", "distance_fade_"); + ADD_PROPERTY(PropertyInfo(Variant::BOOL, "distance_fade_enabled"), "set_enable_distance_fade", "is_distance_fade_enabled"); + ADD_PROPERTY(PropertyInfo(Variant::FLOAT, "distance_fade_begin"), "set_distance_fade_begin", "get_distance_fade_begin"); + ADD_PROPERTY(PropertyInfo(Variant::FLOAT, "distance_fade_length"), "set_distance_fade_length", "get_distance_fade_length"); + ADD_GROUP("Cull Mask", ""); + ADD_PROPERTY(PropertyInfo(Variant::INT, "cull_mask", PROPERTY_HINT_LAYERS_3D_RENDER), "set_cull_mask", "get_cull_mask"); + + BIND_ENUM_CONSTANT(TEXTURE_ALBEDO); + BIND_ENUM_CONSTANT(TEXTURE_NORMAL); + BIND_ENUM_CONSTANT(TEXTURE_ORM); + BIND_ENUM_CONSTANT(TEXTURE_EMISSION); + BIND_ENUM_CONSTANT(TEXTURE_MAX); +} + +Decal::Decal() { + + extents = Vector3(1, 1, 1); + emission_energy = 1.0; + modulate = Color(1, 1, 1, 1); + albedo_mix = 1.0; + cull_mask = (1 << 20) - 1; + upper_fade = 0.3; + lower_fade = 0.3; + normal_fade = 0; + distance_fade_enabled = false; + distance_fade_begin = 10; + distance_fade_length = 1; + + decal = RenderingServer::get_singleton()->decal_create(); + RS::get_singleton()->instance_set_base(get_instance(), decal); +} + +Decal::~Decal() { + + RS::get_singleton()->free(decal); +} diff --git a/scene/3d/decal.h b/scene/3d/decal.h new file mode 100644 index 0000000000..665444829d --- /dev/null +++ b/scene/3d/decal.h @@ -0,0 +1,114 @@ +/*************************************************************************/ +/* decal.h */ +/*************************************************************************/ +/* This file is part of: */ +/* GODOT ENGINE */ +/* https://godotengine.org */ +/*************************************************************************/ +/* Copyright (c) 2007-2020 Juan Linietsky, Ariel Manzur. */ +/* Copyright (c) 2014-2020 Godot Engine contributors (cf. AUTHORS.md). */ +/* */ +/* Permission is hereby granted, free of charge, to any person obtaining */ +/* a copy of this software and associated documentation files (the */ +/* "Software"), to deal in the Software without restriction, including */ +/* without limitation the rights to use, copy, modify, merge, publish, */ +/* distribute, sublicense, and/or sell copies of the Software, and to */ +/* permit persons to whom the Software is furnished to do so, subject to */ +/* the following conditions: */ +/* */ +/* The above copyright notice and this permission notice shall be */ +/* included in all copies or substantial portions of the Software. */ +/* */ +/* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, */ +/* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF */ +/* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.*/ +/* IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY */ +/* CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, */ +/* TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE */ +/* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ +/*************************************************************************/ + +#ifndef DECAL_H +#define DECAL_H + +#include "scene/3d/visual_instance_3d.h" +#include "scene/resources/texture.h" +#include "servers/rendering_server.h" + +class Decal : public VisualInstance3D { + GDCLASS(Decal, VisualInstance3D); + +public: + enum DecalTexture { + TEXTURE_ALBEDO, + TEXTURE_NORMAL, + TEXTURE_ORM, + TEXTURE_EMISSION, + TEXTURE_MAX + }; + +private: + RID decal; + Vector3 extents; + Ref<Texture2D> textures[TEXTURE_MAX]; + float emission_energy; + float albedo_mix; + Color modulate; + uint32_t cull_mask; + float normal_fade; + float upper_fade; + float lower_fade; + bool distance_fade_enabled; + float distance_fade_begin; + float distance_fade_length; + +protected: + static void _bind_methods(); + +public: + void set_extents(const Vector3 &p_extents); + Vector3 get_extents() const; + + void set_texture(DecalTexture p_type, const Ref<Texture2D> &p_texture); + Ref<Texture2D> get_texture(DecalTexture p_type) const; + + void set_emission_energy(float p_energy); + float get_emission_energy() const; + + void set_albedo_mix(float p_mix); + float get_albedo_mix() const; + + void set_modulate(Color p_modulate); + Color get_modulate() const; + + void set_upper_fade(float p_energy); + float get_upper_fade() const; + + void set_lower_fade(float p_fade); + float get_lower_fade() const; + + void set_normal_fade(float p_fade); + float get_normal_fade() const; + + void set_enable_distance_fade(bool p_enable); + bool is_distance_fade_enabled() const; + + void set_distance_fade_begin(float p_distance); + float get_distance_fade_begin() const; + + void set_distance_fade_length(float p_length); + float get_distance_fade_length() const; + + void set_cull_mask(uint32_t p_layers); + uint32_t get_cull_mask() const; + + virtual AABB get_aabb() const; + virtual Vector<Face3> get_faces(uint32_t p_usage_flags) const; + + Decal(); + ~Decal(); +}; + +VARIANT_ENUM_CAST(Decal::DecalTexture); + +#endif // DECAL_H diff --git a/scene/3d/light_3d.cpp b/scene/3d/light_3d.cpp index be3b369724..c048f60ebd 100644 --- a/scene/3d/light_3d.cpp +++ b/scene/3d/light_3d.cpp @@ -70,7 +70,7 @@ void Light3D::set_shadow(bool p_enable) { shadow = p_enable; RS::get_singleton()->light_set_shadow(light, p_enable); - if (type == RenderingServer::LIGHT_SPOT) { + if (type == RenderingServer::LIGHT_SPOT || type == RenderingServer::LIGHT_OMNI) { update_configuration_warning(); } } @@ -166,6 +166,18 @@ Light3D::BakeMode Light3D::get_bake_mode() const { return bake_mode; } +void Light3D::set_projector(const Ref<Texture2D> &p_texture) { + + projector = p_texture; + RID tex_id = projector.is_valid() ? projector->get_rid() : RID(); + RS::get_singleton()->light_set_projector(light, tex_id); + update_configuration_warning(); +} + +Ref<Texture2D> Light3D::get_projector() const { + return projector; +} + void Light3D::_update_visibility() { if (!is_inside_tree()) @@ -217,8 +229,16 @@ bool Light3D::is_editor_only() const { void Light3D::_validate_property(PropertyInfo &property) const { - if (RenderingServer::get_singleton()->is_low_end() && property.name == "shadow_contact") { - property.usage = PROPERTY_USAGE_NOEDITOR | PROPERTY_USAGE_INTERNAL; + if (get_light_type() == RS::LIGHT_DIRECTIONAL && property.name == "light_size") { + property.usage = 0; + } + + if (get_light_type() == RS::LIGHT_DIRECTIONAL && property.name == "light_projector") { + property.usage = 0; + } + + if (get_light_type() != RS::LIGHT_DIRECTIONAL && property.name == "light_angular_distance") { + property.usage = 0; } } @@ -251,10 +271,16 @@ void Light3D::_bind_methods() { ClassDB::bind_method(D_METHOD("set_bake_mode", "bake_mode"), &Light3D::set_bake_mode); ClassDB::bind_method(D_METHOD("get_bake_mode"), &Light3D::get_bake_mode); + ClassDB::bind_method(D_METHOD("set_projector", "projector"), &Light3D::set_projector); + ClassDB::bind_method(D_METHOD("get_projector"), &Light3D::get_projector); + ADD_GROUP("Light", "light_"); ADD_PROPERTY(PropertyInfo(Variant::COLOR, "light_color", PROPERTY_HINT_COLOR_NO_ALPHA), "set_color", "get_color"); ADD_PROPERTYI(PropertyInfo(Variant::FLOAT, "light_energy", PROPERTY_HINT_RANGE, "0,16,0.01,or_greater"), "set_param", "get_param", PARAM_ENERGY); ADD_PROPERTYI(PropertyInfo(Variant::FLOAT, "light_indirect_energy", PROPERTY_HINT_RANGE, "0,16,0.01,or_greater"), "set_param", "get_param", PARAM_INDIRECT_ENERGY); + ADD_PROPERTY(PropertyInfo(Variant::OBJECT, "light_projector", PROPERTY_HINT_RESOURCE_TYPE, "Texture2D"), "set_projector", "get_projector"); + ADD_PROPERTYI(PropertyInfo(Variant::FLOAT, "light_size", PROPERTY_HINT_RANGE, "0,64,0.01,or_greater"), "set_param", "get_param", PARAM_SIZE); + ADD_PROPERTYI(PropertyInfo(Variant::FLOAT, "light_angular_distance", PROPERTY_HINT_RANGE, "0,90,0.01"), "set_param", "get_param", PARAM_SIZE); ADD_PROPERTY(PropertyInfo(Variant::BOOL, "light_negative"), "set_negative", "is_negative"); ADD_PROPERTYI(PropertyInfo(Variant::FLOAT, "light_specular", PROPERTY_HINT_RANGE, "0,1,0.01"), "set_param", "get_param", PARAM_SPECULAR); ADD_PROPERTY(PropertyInfo(Variant::INT, "light_bake_mode", PROPERTY_HINT_ENUM, "Disable,Indirect,All"), "set_bake_mode", "get_bake_mode"); @@ -262,9 +288,11 @@ void Light3D::_bind_methods() { ADD_GROUP("Shadow", "shadow_"); ADD_PROPERTY(PropertyInfo(Variant::BOOL, "shadow_enabled"), "set_shadow", "has_shadow"); ADD_PROPERTY(PropertyInfo(Variant::COLOR, "shadow_color", PROPERTY_HINT_COLOR_NO_ALPHA), "set_shadow_color", "get_shadow_color"); - ADD_PROPERTYI(PropertyInfo(Variant::FLOAT, "shadow_bias", PROPERTY_HINT_RANGE, "-16,16,0.01"), "set_param", "get_param", PARAM_SHADOW_BIAS); - ADD_PROPERTYI(PropertyInfo(Variant::FLOAT, "shadow_contact", PROPERTY_HINT_RANGE, "0,16,0.01"), "set_param", "get_param", PARAM_CONTACT_SHADOW_SIZE); + ADD_PROPERTYI(PropertyInfo(Variant::FLOAT, "shadow_bias", PROPERTY_HINT_RANGE, "0,10,0.001"), "set_param", "get_param", PARAM_SHADOW_BIAS); + ADD_PROPERTYI(PropertyInfo(Variant::FLOAT, "shadow_normal_bias", PROPERTY_HINT_RANGE, "0,10,0.001"), "set_param", "get_param", PARAM_SHADOW_NORMAL_BIAS); ADD_PROPERTY(PropertyInfo(Variant::BOOL, "shadow_reverse_cull_face"), "set_shadow_reverse_cull_face", "get_shadow_reverse_cull_face"); + ADD_PROPERTYI(PropertyInfo(Variant::FLOAT, "shadow_transmittance_bias", PROPERTY_HINT_RANGE, "-16,16,0.01"), "set_param", "get_param", PARAM_TRANSMITTANCE_BIAS); + ADD_PROPERTYI(PropertyInfo(Variant::FLOAT, "shadow_blur", PROPERTY_HINT_RANGE, "0.1,8,0.01"), "set_param", "get_param", PARAM_SHADOW_BLUR); ADD_GROUP("Editor", ""); ADD_PROPERTY(PropertyInfo(Variant::BOOL, "editor_only"), "set_editor_only", "is_editor_only"); ADD_GROUP("", ""); @@ -273,10 +301,10 @@ void Light3D::_bind_methods() { BIND_ENUM_CONSTANT(PARAM_INDIRECT_ENERGY); BIND_ENUM_CONSTANT(PARAM_SPECULAR); BIND_ENUM_CONSTANT(PARAM_RANGE); + BIND_ENUM_CONSTANT(PARAM_SIZE); BIND_ENUM_CONSTANT(PARAM_ATTENUATION); BIND_ENUM_CONSTANT(PARAM_SPOT_ANGLE); BIND_ENUM_CONSTANT(PARAM_SPOT_ATTENUATION); - BIND_ENUM_CONSTANT(PARAM_CONTACT_SHADOW_SIZE); BIND_ENUM_CONSTANT(PARAM_SHADOW_MAX_DISTANCE); BIND_ENUM_CONSTANT(PARAM_SHADOW_SPLIT_1_OFFSET); BIND_ENUM_CONSTANT(PARAM_SHADOW_SPLIT_2_OFFSET); @@ -284,7 +312,9 @@ void Light3D::_bind_methods() { BIND_ENUM_CONSTANT(PARAM_SHADOW_FADE_START); BIND_ENUM_CONSTANT(PARAM_SHADOW_NORMAL_BIAS); BIND_ENUM_CONSTANT(PARAM_SHADOW_BIAS); - BIND_ENUM_CONSTANT(PARAM_SHADOW_BIAS_SPLIT_SCALE); + BIND_ENUM_CONSTANT(PARAM_SHADOW_PANCAKE_SIZE); + BIND_ENUM_CONSTANT(PARAM_SHADOW_BLUR); + BIND_ENUM_CONSTANT(PARAM_TRANSMITTANCE_BIAS); BIND_ENUM_CONSTANT(PARAM_MAX); BIND_ENUM_CONSTANT(BAKE_DISABLED); @@ -318,17 +348,20 @@ Light3D::Light3D(RenderingServer::LightType p_type) { set_param(PARAM_INDIRECT_ENERGY, 1); set_param(PARAM_SPECULAR, 0.5); set_param(PARAM_RANGE, 5); + set_param(PARAM_SIZE, 0); set_param(PARAM_ATTENUATION, 1); set_param(PARAM_SPOT_ANGLE, 45); set_param(PARAM_SPOT_ATTENUATION, 1); - set_param(PARAM_CONTACT_SHADOW_SIZE, 0); set_param(PARAM_SHADOW_MAX_DISTANCE, 0); set_param(PARAM_SHADOW_SPLIT_1_OFFSET, 0.1); set_param(PARAM_SHADOW_SPLIT_2_OFFSET, 0.2); set_param(PARAM_SHADOW_SPLIT_3_OFFSET, 0.5); set_param(PARAM_SHADOW_FADE_START, 0.8); - set_param(PARAM_SHADOW_NORMAL_BIAS, 0.0); - set_param(PARAM_SHADOW_BIAS, 0.15); + set_param(PARAM_SHADOW_PANCAKE_SIZE, 20.0); + set_param(PARAM_SHADOW_BLUR, 1.0); + set_param(PARAM_SHADOW_BIAS, 0.02); + set_param(PARAM_SHADOW_NORMAL_BIAS, 1.0); + set_param(PARAM_TRANSMITTANCE_BIAS, 0.05); set_param(PARAM_SHADOW_FADE_START, 1); set_disable_scale(true); } @@ -398,10 +431,9 @@ void DirectionalLight3D::_bind_methods() { ADD_PROPERTYI(PropertyInfo(Variant::FLOAT, "directional_shadow_split_3", PROPERTY_HINT_RANGE, "0,1,0.001"), "set_param", "get_param", PARAM_SHADOW_SPLIT_3_OFFSET); ADD_PROPERTYI(PropertyInfo(Variant::FLOAT, "directional_shadow_fade_start", PROPERTY_HINT_RANGE, "0,1,0.01"), "set_param", "get_param", PARAM_SHADOW_FADE_START); ADD_PROPERTY(PropertyInfo(Variant::BOOL, "directional_shadow_blend_splits"), "set_blend_splits", "is_blend_splits_enabled"); - ADD_PROPERTYI(PropertyInfo(Variant::FLOAT, "directional_shadow_normal_bias", PROPERTY_HINT_RANGE, "0,16,0.01"), "set_param", "get_param", PARAM_SHADOW_NORMAL_BIAS); - ADD_PROPERTYI(PropertyInfo(Variant::FLOAT, "directional_shadow_bias_split_scale", PROPERTY_HINT_RANGE, "0,1,0.01"), "set_param", "get_param", PARAM_SHADOW_BIAS_SPLIT_SCALE); ADD_PROPERTY(PropertyInfo(Variant::INT, "directional_shadow_depth_range", PROPERTY_HINT_ENUM, "Stable,Optimized"), "set_shadow_depth_range", "get_shadow_depth_range"); ADD_PROPERTYI(PropertyInfo(Variant::FLOAT, "directional_shadow_max_distance", PROPERTY_HINT_EXP_RANGE, "0,8192,0.1,or_greater"), "set_param", "get_param", PARAM_SHADOW_MAX_DISTANCE); + ADD_PROPERTYI(PropertyInfo(Variant::FLOAT, "directional_shadow_pancake_size", PROPERTY_HINT_EXP_RANGE, "0,1024,0.1,or_greater"), "set_param", "get_param", PARAM_SHADOW_PANCAKE_SIZE); BIND_ENUM_CONSTANT(SHADOW_ORTHOGONAL); BIND_ENUM_CONSTANT(SHADOW_PARALLEL_2_SPLITS); @@ -414,11 +446,8 @@ void DirectionalLight3D::_bind_methods() { DirectionalLight3D::DirectionalLight3D() : Light3D(RenderingServer::LIGHT_DIRECTIONAL) { - set_param(PARAM_SHADOW_NORMAL_BIAS, 0.8); - set_param(PARAM_SHADOW_BIAS, 0.1); set_param(PARAM_SHADOW_MAX_DISTANCE, 100); set_param(PARAM_SHADOW_FADE_START, 0.8); - set_param(PARAM_SHADOW_BIAS_SPLIT_SCALE, 0.25); set_shadow_mode(SHADOW_PARALLEL_4_SPLITS); set_shadow_depth_range(SHADOW_DEPTH_RANGE_STABLE); @@ -436,6 +465,19 @@ OmniLight3D::ShadowMode OmniLight3D::get_shadow_mode() const { return shadow_mode; } +String OmniLight3D::get_configuration_warning() const { + String warning = Light3D::get_configuration_warning(); + + if (!has_shadow() && get_projector().is_valid()) { + if (warning != String()) { + warning += "\n\n"; + } + warning += TTR("Projector texture only works with shadows active."); + } + + return warning; +} + void OmniLight3D::_bind_methods() { ClassDB::bind_method(D_METHOD("set_shadow_mode", "mode"), &OmniLight3D::set_shadow_mode); @@ -467,6 +509,13 @@ String SpotLight3D::get_configuration_warning() const { warning += TTR("A SpotLight3D with an angle wider than 90 degrees cannot cast shadows."); } + if (!has_shadow() && get_projector().is_valid()) { + if (warning != String()) { + warning += "\n\n"; + } + warning += TTR("Projector texture only works with shadows active."); + } + return warning; } diff --git a/scene/3d/light_3d.h b/scene/3d/light_3d.h index 197e5854ec..6e78217342 100644 --- a/scene/3d/light_3d.h +++ b/scene/3d/light_3d.h @@ -46,10 +46,10 @@ public: PARAM_INDIRECT_ENERGY = RS::LIGHT_PARAM_INDIRECT_ENERGY, PARAM_SPECULAR = RS::LIGHT_PARAM_SPECULAR, PARAM_RANGE = RS::LIGHT_PARAM_RANGE, + PARAM_SIZE = RS::LIGHT_PARAM_SIZE, PARAM_ATTENUATION = RS::LIGHT_PARAM_ATTENUATION, PARAM_SPOT_ANGLE = RS::LIGHT_PARAM_SPOT_ANGLE, PARAM_SPOT_ATTENUATION = RS::LIGHT_PARAM_SPOT_ATTENUATION, - PARAM_CONTACT_SHADOW_SIZE = RS::LIGHT_PARAM_CONTACT_SHADOW_SIZE, PARAM_SHADOW_MAX_DISTANCE = RS::LIGHT_PARAM_SHADOW_MAX_DISTANCE, PARAM_SHADOW_SPLIT_1_OFFSET = RS::LIGHT_PARAM_SHADOW_SPLIT_1_OFFSET, PARAM_SHADOW_SPLIT_2_OFFSET = RS::LIGHT_PARAM_SHADOW_SPLIT_2_OFFSET, @@ -57,7 +57,9 @@ public: PARAM_SHADOW_FADE_START = RS::LIGHT_PARAM_SHADOW_FADE_START, PARAM_SHADOW_NORMAL_BIAS = RS::LIGHT_PARAM_SHADOW_NORMAL_BIAS, PARAM_SHADOW_BIAS = RS::LIGHT_PARAM_SHADOW_BIAS, - PARAM_SHADOW_BIAS_SPLIT_SCALE = RS::LIGHT_PARAM_SHADOW_BIAS_SPLIT_SCALE, + PARAM_SHADOW_PANCAKE_SIZE = RS::LIGHT_PARAM_SHADOW_PANCAKE_SIZE, + PARAM_SHADOW_BLUR = RS::LIGHT_PARAM_SHADOW_BLUR, + PARAM_TRANSMITTANCE_BIAS = RS::LIGHT_PARAM_TRANSMITTANCE_BIAS, PARAM_MAX = RS::LIGHT_PARAM_MAX }; @@ -79,6 +81,7 @@ private: bool editor_only; void _update_visibility(); BakeMode bake_mode; + Ref<Texture2D> projector; // bind helpers @@ -123,6 +126,9 @@ public: void set_bake_mode(BakeMode p_mode); BakeMode get_bake_mode() const; + void set_projector(const Ref<Texture2D> &p_texture); + Ref<Texture2D> get_projector() const; + virtual AABB get_aabb() const; virtual Vector<Face3> get_faces(uint32_t p_usage_flags) const; @@ -194,6 +200,8 @@ public: void set_shadow_mode(ShadowMode p_mode); ShadowMode get_shadow_mode() const; + virtual String get_configuration_warning() const; + OmniLight3D(); }; diff --git a/scene/3d/mesh_instance_3d.cpp b/scene/3d/mesh_instance_3d.cpp index d56a095a5b..cdc8db8aea 100644 --- a/scene/3d/mesh_instance_3d.cpp +++ b/scene/3d/mesh_instance_3d.cpp @@ -307,19 +307,22 @@ Ref<Material> MeshInstance3D::get_surface_material(int p_surface) const { Ref<Material> MeshInstance3D::get_active_material(int p_surface) const { - if (get_material_override() != Ref<Material>()) { - return get_material_override(); - } else if (p_surface < materials.size()) { - return materials[p_surface]; - } else { - Ref<Mesh> mesh = get_mesh(); + Ref<Material> material_override = get_material_override(); + if (material_override.is_valid()) { + return material_override; + } - if (mesh.is_null() || p_surface >= mesh->get_surface_count()) { - return Ref<Material>(); - } + Ref<Material> surface_material = get_surface_material(p_surface); + if (surface_material.is_valid()) { + return surface_material; + } + Ref<Mesh> mesh = get_mesh(); + if (mesh.is_valid()) { return mesh->surface_get_material(p_surface); } + + return Ref<Material>(); } void MeshInstance3D::_mesh_changed() { diff --git a/scene/3d/path_3d.cpp b/scene/3d/path_3d.cpp index f06135f53d..4a425d1e0e 100644 --- a/scene/3d/path_3d.cpp +++ b/scene/3d/path_3d.cpp @@ -316,16 +316,14 @@ void PathFollow3D::set_offset(float p_offset) { offset = p_offset; if (path) { - if (path->get_curve().is_valid() && path->get_curve()->get_baked_length()) { + if (path->get_curve().is_valid()) { float path_length = path->get_curve()->get_baked_length(); if (loop) { - while (offset > path_length) - offset -= path_length; - - while (offset < 0) - offset += path_length; - + offset = Math::fposmod(offset, path_length); + if (!Math::is_zero_approx(p_offset) && Math::is_zero_approx(offset)) { + offset = path_length; + } } else { offset = CLAMP(offset, 0, path_length); } diff --git a/scene/3d/physics_body_3d.cpp b/scene/3d/physics_body_3d.cpp index 2b6eb8ac8a..3991efc7c0 100644 --- a/scene/3d/physics_body_3d.cpp +++ b/scene/3d/physics_body_3d.cpp @@ -110,7 +110,7 @@ bool PhysicsBody3D::get_collision_layer_bit(int p_bit) const { return get_collision_layer() & (1 << p_bit); } -Array PhysicsBody3D::get_collision_exceptions() { +TypedArray<PhysicsBody3D> PhysicsBody3D::get_collision_exceptions() { List<RID> exceptions; PhysicsServer3D::get_singleton()->body_get_collision_exceptions(get_rid(), &exceptions); Array ret; @@ -2134,6 +2134,10 @@ void PhysicalBone3D::_bind_methods() { ClassDB::bind_method(D_METHOD("set_joint_offset", "offset"), &PhysicalBone3D::set_joint_offset); ClassDB::bind_method(D_METHOD("get_joint_offset"), &PhysicalBone3D::get_joint_offset); + ClassDB::bind_method(D_METHOD("set_joint_rotation", "euler"), &PhysicalBone3D::set_joint_rotation); + ClassDB::bind_method(D_METHOD("get_joint_rotation"), &PhysicalBone3D::get_joint_rotation); + ClassDB::bind_method(D_METHOD("set_joint_rotation_degrees", "euler_degrees"), &PhysicalBone3D::set_joint_rotation_degrees); + ClassDB::bind_method(D_METHOD("get_joint_rotation_degrees"), &PhysicalBone3D::get_joint_rotation_degrees); ClassDB::bind_method(D_METHOD("set_body_offset", "offset"), &PhysicalBone3D::set_body_offset); ClassDB::bind_method(D_METHOD("get_body_offset"), &PhysicalBone3D::get_body_offset); @@ -2159,9 +2163,23 @@ void PhysicalBone3D::_bind_methods() { ClassDB::bind_method(D_METHOD("set_gravity_scale", "gravity_scale"), &PhysicalBone3D::set_gravity_scale); ClassDB::bind_method(D_METHOD("get_gravity_scale"), &PhysicalBone3D::get_gravity_scale); + ClassDB::bind_method(D_METHOD("set_linear_damp", "linear_damp"), &PhysicalBone3D::set_linear_damp); + ClassDB::bind_method(D_METHOD("get_linear_damp"), &PhysicalBone3D::get_linear_damp); + + ClassDB::bind_method(D_METHOD("set_angular_damp", "angular_damp"), &PhysicalBone3D::set_angular_damp); + ClassDB::bind_method(D_METHOD("get_angular_damp"), &PhysicalBone3D::get_angular_damp); + + ClassDB::bind_method(D_METHOD("set_can_sleep", "able_to_sleep"), &PhysicalBone3D::set_can_sleep); + ClassDB::bind_method(D_METHOD("is_able_to_sleep"), &PhysicalBone3D::is_able_to_sleep); + + ClassDB::bind_method(D_METHOD("set_axis_lock", "axis", "lock"), &PhysicalBone3D::set_axis_lock); + ClassDB::bind_method(D_METHOD("get_axis_lock", "axis"), &PhysicalBone3D::get_axis_lock); + ADD_GROUP("Joint", "joint_"); ADD_PROPERTY(PropertyInfo(Variant::INT, "joint_type", PROPERTY_HINT_ENUM, "None,PinJoint,ConeJoint,HingeJoint,SliderJoint,6DOFJoint"), "set_joint_type", "get_joint_type"); ADD_PROPERTY(PropertyInfo(Variant::TRANSFORM, "joint_offset"), "set_joint_offset", "get_joint_offset"); + ADD_PROPERTY(PropertyInfo(Variant::VECTOR3, "joint_rotation_degrees", PROPERTY_HINT_NONE, "", PROPERTY_USAGE_EDITOR), "set_joint_rotation_degrees", "get_joint_rotation_degrees"); + ADD_PROPERTY(PropertyInfo(Variant::VECTOR3, "joint_rotation", PROPERTY_HINT_NONE, "", 0), "set_joint_rotation", "get_joint_rotation"); ADD_PROPERTY(PropertyInfo(Variant::TRANSFORM, "body_offset"), "set_body_offset", "get_body_offset"); @@ -2170,6 +2188,17 @@ void PhysicalBone3D::_bind_methods() { ADD_PROPERTY(PropertyInfo(Variant::FLOAT, "friction", PROPERTY_HINT_RANGE, "0,1,0.01"), "set_friction", "get_friction"); ADD_PROPERTY(PropertyInfo(Variant::FLOAT, "bounce", PROPERTY_HINT_RANGE, "0,1,0.01"), "set_bounce", "get_bounce"); ADD_PROPERTY(PropertyInfo(Variant::FLOAT, "gravity_scale", PROPERTY_HINT_RANGE, "-10,10,0.01"), "set_gravity_scale", "get_gravity_scale"); + ADD_PROPERTY(PropertyInfo(Variant::FLOAT, "linear_damp", PROPERTY_HINT_RANGE, "-1,100,0.001,or_greater"), "set_linear_damp", "get_linear_damp"); + ADD_PROPERTY(PropertyInfo(Variant::FLOAT, "angular_damp", PROPERTY_HINT_RANGE, "-1,100,0.001,or_greater"), "set_angular_damp", "get_angular_damp"); + ADD_PROPERTY(PropertyInfo(Variant::BOOL, "can_sleep"), "set_can_sleep", "is_able_to_sleep"); + + ADD_GROUP("Axis Lock", "axis_lock_"); + ADD_PROPERTYI(PropertyInfo(Variant::BOOL, "axis_lock_linear_x"), "set_axis_lock", "get_axis_lock", PhysicsServer3D::BODY_AXIS_LINEAR_X); + ADD_PROPERTYI(PropertyInfo(Variant::BOOL, "axis_lock_linear_y"), "set_axis_lock", "get_axis_lock", PhysicsServer3D::BODY_AXIS_LINEAR_Y); + ADD_PROPERTYI(PropertyInfo(Variant::BOOL, "axis_lock_linear_z"), "set_axis_lock", "get_axis_lock", PhysicsServer3D::BODY_AXIS_LINEAR_Z); + ADD_PROPERTYI(PropertyInfo(Variant::BOOL, "axis_lock_angular_x"), "set_axis_lock", "get_axis_lock", PhysicsServer3D::BODY_AXIS_ANGULAR_X); + ADD_PROPERTYI(PropertyInfo(Variant::BOOL, "axis_lock_angular_y"), "set_axis_lock", "get_axis_lock", PhysicsServer3D::BODY_AXIS_ANGULAR_Y); + ADD_PROPERTYI(PropertyInfo(Variant::BOOL, "axis_lock_angular_z"), "set_axis_lock", "get_axis_lock", PhysicsServer3D::BODY_AXIS_ANGULAR_Z); BIND_ENUM_CONSTANT(JOINT_TYPE_NONE); BIND_ENUM_CONSTANT(JOINT_TYPE_PIN); @@ -2187,6 +2216,19 @@ Skeleton3D *PhysicalBone3D::find_skeleton_parent(Node *p_parent) { return s ? s : find_skeleton_parent(p_parent->get_parent()); } +void PhysicalBone3D::_update_joint_offset() { + _fix_joint_offset(); + + set_ignore_transform_notification(true); + reset_to_rest_position(); + set_ignore_transform_notification(false); + +#ifdef TOOLS_ENABLED + if (get_gizmo().is_valid()) + get_gizmo()->redraw(); +#endif +} + void PhysicalBone3D::_fix_joint_offset() { // Clamp joint origin to bone origin if (parent_skeleton) { @@ -2370,16 +2412,31 @@ PhysicalBone3D::JointType PhysicalBone3D::get_joint_type() const { void PhysicalBone3D::set_joint_offset(const Transform &p_offset) { joint_offset = p_offset; - _fix_joint_offset(); + _update_joint_offset(); + _change_notify("joint_rotation_degrees"); +} - set_ignore_transform_notification(true); - reset_to_rest_position(); - set_ignore_transform_notification(false); +const Transform &PhysicalBone3D::get_joint_offset() const { + return joint_offset; +} -#ifdef TOOLS_ENABLED - if (get_gizmo().is_valid()) - get_gizmo()->redraw(); -#endif +void PhysicalBone3D::set_joint_rotation(const Vector3 &p_euler_rad) { + joint_offset.basis.set_euler_scale(p_euler_rad, joint_offset.basis.get_scale()); + + _update_joint_offset(); + _change_notify("joint_offset"); +} + +Vector3 PhysicalBone3D::get_joint_rotation() const { + return joint_offset.basis.get_rotation(); +} + +void PhysicalBone3D::set_joint_rotation_degrees(const Vector3 &p_euler_deg) { + set_joint_rotation(p_euler_deg * Math_PI / 180.0); +} + +Vector3 PhysicalBone3D::get_joint_rotation_degrees() const { + return get_joint_rotation() * 180.0 / Math_PI; } const Transform &PhysicalBone3D::get_body_offset() const { @@ -2390,20 +2447,7 @@ void PhysicalBone3D::set_body_offset(const Transform &p_offset) { body_offset = p_offset; body_offset_inverse = body_offset.affine_inverse(); - _fix_joint_offset(); - - set_ignore_transform_notification(true); - reset_to_rest_position(); - set_ignore_transform_notification(false); - -#ifdef TOOLS_ENABLED - if (get_gizmo().is_valid()) - get_gizmo()->redraw(); -#endif -} - -const Transform &PhysicalBone3D::get_joint_offset() const { - return joint_offset; + _update_joint_offset(); } void PhysicalBone3D::set_simulate_physics(bool p_simulate) { @@ -2496,6 +2540,43 @@ real_t PhysicalBone3D::get_gravity_scale() const { return gravity_scale; } +void PhysicalBone3D::set_linear_damp(real_t p_linear_damp) { + ERR_FAIL_COND(p_linear_damp < -1); + linear_damp = p_linear_damp; + PhysicsServer3D::get_singleton()->body_set_param(get_rid(), PhysicsServer3D::BODY_PARAM_LINEAR_DAMP, linear_damp); +} + +real_t PhysicalBone3D::get_linear_damp() const { + return linear_damp; +} + +void PhysicalBone3D::set_angular_damp(real_t p_angular_damp) { + ERR_FAIL_COND(p_angular_damp < -1); + angular_damp = p_angular_damp; + PhysicsServer3D::get_singleton()->body_set_param(get_rid(), PhysicsServer3D::BODY_PARAM_ANGULAR_DAMP, angular_damp); +} + +real_t PhysicalBone3D::get_angular_damp() const { + return angular_damp; +} + +void PhysicalBone3D::set_can_sleep(bool p_active) { + can_sleep = p_active; + PhysicsServer3D::get_singleton()->body_set_state(get_rid(), PhysicsServer3D::BODY_STATE_CAN_SLEEP, p_active); +} + +bool PhysicalBone3D::is_able_to_sleep() const { + return can_sleep; +} + +void PhysicalBone3D::set_axis_lock(PhysicsServer3D::BodyAxis p_axis, bool p_lock) { + PhysicsServer3D::get_singleton()->body_set_axis_lock(get_rid(), p_axis, p_lock); +} + +bool PhysicalBone3D::get_axis_lock(PhysicsServer3D::BodyAxis p_axis) const { + return PhysicsServer3D::get_singleton()->body_is_axis_locked(get_rid(), p_axis); +} + PhysicalBone3D::PhysicalBone3D() : PhysicsBody3D(PhysicsServer3D::BODY_MODE_STATIC), #ifdef TOOLS_ENABLED @@ -2510,7 +2591,10 @@ PhysicalBone3D::PhysicalBone3D() : bounce(0), mass(1), friction(1), - gravity_scale(1) { + gravity_scale(1), + linear_damp(-1), + angular_damp(-1), + can_sleep(true) { reset_physics_simulation_state(); } diff --git a/scene/3d/physics_body_3d.h b/scene/3d/physics_body_3d.h index bf7854b68d..0e719f5108 100644 --- a/scene/3d/physics_body_3d.h +++ b/scene/3d/physics_body_3d.h @@ -68,7 +68,7 @@ public: void set_collision_mask_bit(int p_bit, bool p_value); bool get_collision_mask_bit(int p_bit) const; - Array get_collision_exceptions(); + TypedArray<PhysicsBody3D> get_collision_exceptions(); void add_collision_exception_with(Node *p_node); //must be physicsbody void remove_collision_exception_with(Node *p_node); @@ -562,6 +562,9 @@ private: real_t mass; real_t friction; real_t gravity_scale; + real_t linear_damp; + real_t angular_damp; + bool can_sleep; protected: bool _set(const StringName &p_name, const Variant &p_value); @@ -575,6 +578,7 @@ protected: private: static Skeleton3D *find_skeleton_parent(Node *p_parent); + void _update_joint_offset(); void _fix_joint_offset(); void _reload_joint(); @@ -599,6 +603,12 @@ public: void set_joint_offset(const Transform &p_offset); const Transform &get_joint_offset() const; + void set_joint_rotation(const Vector3 &p_euler_rad); + Vector3 get_joint_rotation() const; + + void set_joint_rotation_degrees(const Vector3 &p_euler_deg); + Vector3 get_joint_rotation_degrees() const; + void set_body_offset(const Transform &p_offset); const Transform &get_body_offset() const; @@ -624,6 +634,18 @@ public: void set_gravity_scale(real_t p_gravity_scale); real_t get_gravity_scale() const; + void set_linear_damp(real_t p_linear_damp); + real_t get_linear_damp() const; + + void set_angular_damp(real_t p_angular_damp); + real_t get_angular_damp() const; + + void set_can_sleep(bool p_active); + bool is_able_to_sleep() const; + + void set_axis_lock(PhysicsServer3D::BodyAxis p_axis, bool p_lock); + bool get_axis_lock(PhysicsServer3D::BodyAxis p_axis) const; + void apply_central_impulse(const Vector3 &p_impulse); void apply_impulse(const Vector3 &p_pos, const Vector3 &p_impulse); diff --git a/scene/3d/skeleton_3d.cpp b/scene/3d/skeleton_3d.cpp index 59a6e23005..973822653a 100644 --- a/scene/3d/skeleton_3d.cpp +++ b/scene/3d/skeleton_3d.cpp @@ -33,6 +33,7 @@ #include "core/engine.h" #include "core/message_queue.h" #include "core/project_settings.h" +#include "core/type_info.h" #include "scene/3d/physics_body_3d.h" #include "scene/resources/surface_tool.h" @@ -770,7 +771,7 @@ void _pb_start_simulation(const Skeleton3D *p_skeleton, Node *p_node, const Vect } } -void Skeleton3D::physical_bones_start_simulation_on(const Array &p_bones) { +void Skeleton3D::physical_bones_start_simulation_on(const TypedArray<StringName> &p_bones) { set_physics_process_internal(false); Vector<int> sim_bones; @@ -780,12 +781,9 @@ void Skeleton3D::physical_bones_start_simulation_on(const Array &p_bones) { sim_bones.resize(p_bones.size()); int c = 0; for (int i = sim_bones.size() - 1; 0 <= i; --i) { - Variant::Type type = p_bones.get(i).get_type(); - if (Variant::STRING == type || Variant::STRING_NAME == type) { - int bone_id = find_bone(p_bones.get(i)); - if (bone_id != -1) - sim_bones.write[c++] = bone_id; - } + int bone_id = find_bone(p_bones[i]); + if (bone_id != -1) + sim_bones.write[c++] = bone_id; } sim_bones.resize(c); } diff --git a/scene/3d/skeleton_3d.h b/scene/3d/skeleton_3d.h index 08b8691658..0bccd3f8fc 100644 --- a/scene/3d/skeleton_3d.h +++ b/scene/3d/skeleton_3d.h @@ -222,7 +222,7 @@ private: public: void physical_bones_stop_simulation(); - void physical_bones_start_simulation_on(const Array &p_bones); + void physical_bones_start_simulation_on(const TypedArray<StringName> &p_bones); void physical_bones_add_collision_exception(RID p_exception); void physical_bones_remove_collision_exception(RID p_exception); #endif // _3D_DISABLED 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/spring_arm_3d.cpp b/scene/3d/spring_arm_3d.cpp index 281be3f7d3..0ffde7aa8f 100644 --- a/scene/3d/spring_arm_3d.cpp +++ b/scene/3d/spring_arm_3d.cpp @@ -45,15 +45,15 @@ void SpringArm3D::_notification(int p_what) { switch (p_what) { case NOTIFICATION_ENTER_TREE: if (!Engine::get_singleton()->is_editor_hint()) { - set_process_internal(true); + set_physics_process_internal(true); } break; case NOTIFICATION_EXIT_TREE: if (!Engine::get_singleton()->is_editor_hint()) { - set_process_internal(false); + set_physics_process_internal(false); } break; - case NOTIFICATION_INTERNAL_PROCESS: + case NOTIFICATION_INTERNAL_PHYSICS_PROCESS: process_spring(); break; } diff --git a/scene/3d/visual_instance_3d.cpp b/scene/3d/visual_instance_3d.cpp index 775a9b76e2..604bc53422 100644 --- a/scene/3d/visual_instance_3d.cpp +++ b/scene/3d/visual_instance_3d.cpp @@ -217,6 +217,62 @@ float GeometryInstance3D::get_lod_max_hysteresis() const { void GeometryInstance3D::_notification(int p_what) { } +const StringName *GeometryInstance3D::_instance_uniform_get_remap(const StringName p_name) const { + StringName *r = instance_uniform_property_remap.getptr(p_name); + if (!r) { + String s = p_name; + if (s.begins_with("shader_params/")) { + StringName name = s.replace("shader_params/", ""); + instance_uniform_property_remap[p_name] = name; + return instance_uniform_property_remap.getptr(p_name); + } + + return nullptr; + } + + return r; +} + +bool GeometryInstance3D::_set(const StringName &p_name, const Variant &p_value) { + const StringName *r = _instance_uniform_get_remap(p_name); + if (r) { + set_shader_instance_uniform(*r, p_value); + return true; + } + + return false; +} + +bool GeometryInstance3D::_get(const StringName &p_name, Variant &r_ret) const { + const StringName *r = _instance_uniform_get_remap(p_name); + if (r) { + r_ret = get_shader_instance_uniform(*r); + return true; + } + + return false; +} +void GeometryInstance3D::_get_property_list(List<PropertyInfo> *p_list) const { + List<PropertyInfo> pinfo; + RS::get_singleton()->instance_geometry_get_shader_parameter_list(get_instance(), &pinfo); + for (List<PropertyInfo>::Element *E = pinfo.front(); E; E = E->next()) { + PropertyInfo pi = E->get(); + bool has_def_value = false; + Variant def_value = RS::get_singleton()->instance_geometry_get_shader_parameter_default_value(get_instance(), pi.name); + if (def_value.get_type() != Variant::NIL) { + has_def_value = true; + } + if (instance_uniforms.has(pi.name)) { + pi.usage = PROPERTY_USAGE_EDITOR | PROPERTY_USAGE_STORAGE | (has_def_value ? (PROPERTY_USAGE_CHECKABLE | PROPERTY_USAGE_CHECKED) : 0); + } else { + pi.usage = PROPERTY_USAGE_EDITOR | (has_def_value ? PROPERTY_USAGE_CHECKABLE : 0); //do not save if not changed + } + + pi.name = "shader_params/" + pi.name; + p_list->push_back(pi); + } +} + void GeometryInstance3D::set_flag(Flags p_flag, bool p_value) { ERR_FAIL_INDEX(p_flag, FLAG_MAX); @@ -258,6 +314,22 @@ float GeometryInstance3D::get_extra_cull_margin() const { return extra_cull_margin; } +void GeometryInstance3D::set_shader_instance_uniform(const StringName &p_uniform, const Variant &p_value) { + + if (p_value.get_type() == Variant::NIL) { + Variant def_value = RS::get_singleton()->instance_geometry_get_shader_parameter_default_value(get_instance(), p_uniform); + RS::get_singleton()->instance_geometry_set_shader_parameter(get_instance(), p_uniform, def_value); + instance_uniforms.erase(p_value); + } else { + instance_uniforms[p_uniform] = p_value; + RS::get_singleton()->instance_geometry_set_shader_parameter(get_instance(), p_uniform, p_value); + } +} + +Variant GeometryInstance3D::get_shader_instance_uniform(const StringName &p_uniform) const { + + return RS::get_singleton()->instance_geometry_get_shader_parameter(get_instance(), p_uniform); +} void GeometryInstance3D::set_custom_aabb(AABB aabb) { RS::get_singleton()->instance_set_custom_aabb(get_instance(), aabb); @@ -280,6 +352,9 @@ void GeometryInstance3D::_bind_methods() { ClassDB::bind_method(D_METHOD("set_lod_max_distance", "mode"), &GeometryInstance3D::set_lod_max_distance); ClassDB::bind_method(D_METHOD("get_lod_max_distance"), &GeometryInstance3D::get_lod_max_distance); + ClassDB::bind_method(D_METHOD("set_shader_instance_uniform", "uniform", "value"), &GeometryInstance3D::set_shader_instance_uniform); + ClassDB::bind_method(D_METHOD("get_shader_instance_uniform", "uniform"), &GeometryInstance3D::get_shader_instance_uniform); + ClassDB::bind_method(D_METHOD("set_lod_min_hysteresis", "mode"), &GeometryInstance3D::set_lod_min_hysteresis); ClassDB::bind_method(D_METHOD("get_lod_min_hysteresis"), &GeometryInstance3D::get_lod_min_hysteresis); diff --git a/scene/3d/visual_instance_3d.h b/scene/3d/visual_instance_3d.h index 9476c28848..cc5f92066f 100644 --- a/scene/3d/visual_instance_3d.h +++ b/scene/3d/visual_instance_3d.h @@ -108,9 +108,18 @@ private: float lod_min_hysteresis; float lod_max_hysteresis; + mutable HashMap<StringName, Variant> instance_uniforms; + mutable HashMap<StringName, StringName> instance_uniform_property_remap; + float extra_cull_margin; + const StringName *_instance_uniform_get_remap(const StringName p_name) const; + protected: + bool _set(const StringName &p_name, const Variant &p_value); + bool _get(const StringName &p_name, Variant &r_ret) const; + void _get_property_list(List<PropertyInfo> *p_list) const; + void _notification(int p_what); static void _bind_methods(); @@ -139,6 +148,9 @@ public: void set_extra_cull_margin(float p_margin); float get_extra_cull_margin() const; + void set_shader_instance_uniform(const StringName &p_uniform, const Variant &p_value); + Variant get_shader_instance_uniform(const StringName &p_uniform) const; + void set_custom_aabb(AABB aabb); GeometryInstance3D(); diff --git a/scene/3d/voxelizer.cpp b/scene/3d/voxelizer.cpp index 203c3cd812..f30c58be55 100644 --- a/scene/3d/voxelizer.cpp +++ b/scene/3d/voxelizer.cpp @@ -592,22 +592,16 @@ void Voxelizer::plot_mesh(const Transform &p_xform, Ref<Mesh> &p_mesh, const Vec Vector<Vector3> vertices = a[Mesh::ARRAY_VERTEX]; const Vector3 *vr = vertices.ptr(); Vector<Vector2> uv = a[Mesh::ARRAY_TEX_UV]; - const Vector2 *uvr; + const Vector2 *uvr = nullptr; Vector<Vector3> normals = a[Mesh::ARRAY_NORMAL]; - const Vector3 *nr; + const Vector3 *nr = nullptr; Vector<int> index = a[Mesh::ARRAY_INDEX]; - bool read_uv = false; - bool read_normals = false; - if (uv.size()) { - uvr = uv.ptr(); - read_uv = true; } if (normals.size()) { - read_normals = true; nr = normals.ptr(); } @@ -626,13 +620,13 @@ void Voxelizer::plot_mesh(const Transform &p_xform, Ref<Mesh> &p_mesh, const Vec vtxs[k] = p_xform.xform(vr[ir[j * 3 + k]]); } - if (read_uv) { + if (uvr) { for (int k = 0; k < 3; k++) { uvs[k] = uvr[ir[j * 3 + k]]; } } - if (read_normals) { + if (nr) { for (int k = 0; k < 3; k++) { normal[k] = nr[ir[j * 3 + k]]; } @@ -659,13 +653,13 @@ void Voxelizer::plot_mesh(const Transform &p_xform, Ref<Mesh> &p_mesh, const Vec vtxs[k] = p_xform.xform(vr[j * 3 + k]); } - if (read_uv) { + if (uvr) { for (int k = 0; k < 3; k++) { uvs[k] = uvr[j * 3 + k]; } } - if (read_normals) { + if (nr) { for (int k = 0; k < 3; k++) { normal[k] = nr[j * 3 + k]; } diff --git a/scene/3d/arvr_nodes.cpp b/scene/3d/xr_nodes.cpp index 537c094ceb..6f41629bac 100644 --- a/scene/3d/arvr_nodes.cpp +++ b/scene/3d/xr_nodes.cpp @@ -1,5 +1,5 @@ /*************************************************************************/ -/* arvr_nodes.cpp */ +/* xr_nodes.cpp */ /*************************************************************************/ /* This file is part of: */ /* GODOT ENGINE */ @@ -28,25 +28,25 @@ /* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ /*************************************************************************/ -#include "arvr_nodes.h" -#include "core/input/input_filter.h" -#include "servers/arvr/arvr_interface.h" -#include "servers/arvr_server.h" +#include "xr_nodes.h" +#include "core/input/input.h" +#include "servers/xr/xr_interface.h" +#include "servers/xr_server.h" //////////////////////////////////////////////////////////////////////////////////////////////////// -void ARVRCamera::_notification(int p_what) { +void XRCamera3D::_notification(int p_what) { switch (p_what) { case NOTIFICATION_ENTER_TREE: { - // need to find our ARVROrigin parent and let it know we're its camera! - ARVROrigin *origin = Object::cast_to<ARVROrigin>(get_parent()); + // need to find our XROrigin3D parent and let it know we're its camera! + XROrigin3D *origin = Object::cast_to<XROrigin3D>(get_parent()); if (origin != nullptr) { origin->set_tracked_camera(this); } }; break; case NOTIFICATION_EXIT_TREE: { - // need to find our ARVROrigin parent and let it know we're no longer its camera! - ARVROrigin *origin = Object::cast_to<ARVROrigin>(get_parent()); + // need to find our XROrigin3D parent and let it know we're no longer its camera! + XROrigin3D *origin = Object::cast_to<XROrigin3D>(get_parent()); if (origin != nullptr) { origin->clear_tracked_camera_if(this); } @@ -54,26 +54,26 @@ void ARVRCamera::_notification(int p_what) { }; }; -String ARVRCamera::get_configuration_warning() const { +String XRCamera3D::get_configuration_warning() const { if (!is_visible() || !is_inside_tree()) return String(); - // must be child node of ARVROrigin! - ARVROrigin *origin = Object::cast_to<ARVROrigin>(get_parent()); + // must be child node of XROrigin3D! + XROrigin3D *origin = Object::cast_to<XROrigin3D>(get_parent()); if (origin == nullptr) { - return TTR("ARVRCamera must have an ARVROrigin node as its parent."); + return TTR("XRCamera3D must have an XROrigin3D node as its parent."); }; return String(); }; -Vector3 ARVRCamera::project_local_ray_normal(const Point2 &p_pos) const { - // get our ARVRServer - ARVRServer *arvr_server = ARVRServer::get_singleton(); - ERR_FAIL_NULL_V(arvr_server, Vector3()); +Vector3 XRCamera3D::project_local_ray_normal(const Point2 &p_pos) const { + // get our XRServer + XRServer *xr_server = XRServer::get_singleton(); + ERR_FAIL_NULL_V(xr_server, Vector3()); - Ref<ARVRInterface> arvr_interface = arvr_server->get_primary_interface(); - if (arvr_interface.is_null()) { + Ref<XRInterface> xr_interface = xr_server->get_primary_interface(); + if (xr_interface.is_null()) { // we might be in the editor or have VR turned off, just call superclass return Camera3D::project_local_ray_normal(p_pos); } @@ -84,20 +84,20 @@ Vector3 ARVRCamera::project_local_ray_normal(const Point2 &p_pos) const { Vector2 cpos = get_viewport()->get_camera_coords(p_pos); Vector3 ray; - CameraMatrix cm = arvr_interface->get_projection_for_eye(ARVRInterface::EYE_MONO, viewport_size.aspect(), get_znear(), get_zfar()); + CameraMatrix cm = xr_interface->get_projection_for_eye(XRInterface::EYE_MONO, viewport_size.aspect(), get_znear(), get_zfar()); Vector2 screen_he = cm.get_viewport_half_extents(); ray = Vector3(((cpos.x / viewport_size.width) * 2.0 - 1.0) * screen_he.x, ((1.0 - (cpos.y / viewport_size.height)) * 2.0 - 1.0) * screen_he.y, -get_znear()).normalized(); return ray; }; -Point2 ARVRCamera::unproject_position(const Vector3 &p_pos) const { - // get our ARVRServer - ARVRServer *arvr_server = ARVRServer::get_singleton(); - ERR_FAIL_NULL_V(arvr_server, Vector2()); +Point2 XRCamera3D::unproject_position(const Vector3 &p_pos) const { + // get our XRServer + XRServer *xr_server = XRServer::get_singleton(); + ERR_FAIL_NULL_V(xr_server, Vector2()); - Ref<ARVRInterface> arvr_interface = arvr_server->get_primary_interface(); - if (arvr_interface.is_null()) { + Ref<XRInterface> xr_interface = xr_server->get_primary_interface(); + if (xr_interface.is_null()) { // we might be in the editor or have VR turned off, just call superclass return Camera3D::unproject_position(p_pos); } @@ -106,7 +106,7 @@ Point2 ARVRCamera::unproject_position(const Vector3 &p_pos) const { Size2 viewport_size = get_viewport()->get_visible_rect().size; - CameraMatrix cm = arvr_interface->get_projection_for_eye(ARVRInterface::EYE_MONO, viewport_size.aspect(), get_znear(), get_zfar()); + CameraMatrix cm = xr_interface->get_projection_for_eye(XRInterface::EYE_MONO, viewport_size.aspect(), get_znear(), get_zfar()); Plane p(get_camera_transform().xform_inv(p_pos), 1.0); @@ -120,13 +120,13 @@ Point2 ARVRCamera::unproject_position(const Vector3 &p_pos) const { return res; }; -Vector3 ARVRCamera::project_position(const Point2 &p_point, float p_z_depth) const { - // get our ARVRServer - ARVRServer *arvr_server = ARVRServer::get_singleton(); - ERR_FAIL_NULL_V(arvr_server, Vector3()); +Vector3 XRCamera3D::project_position(const Point2 &p_point, float p_z_depth) const { + // get our XRServer + XRServer *xr_server = XRServer::get_singleton(); + ERR_FAIL_NULL_V(xr_server, Vector3()); - Ref<ARVRInterface> arvr_interface = arvr_server->get_primary_interface(); - if (arvr_interface.is_null()) { + Ref<XRInterface> xr_interface = xr_server->get_primary_interface(); + if (xr_interface.is_null()) { // we might be in the editor or have VR turned off, just call superclass return Camera3D::project_position(p_point, p_z_depth); } @@ -135,7 +135,7 @@ Vector3 ARVRCamera::project_position(const Point2 &p_point, float p_z_depth) con Size2 viewport_size = get_viewport()->get_visible_rect().size; - CameraMatrix cm = arvr_interface->get_projection_for_eye(ARVRInterface::EYE_MONO, viewport_size.aspect(), get_znear(), get_zfar()); + CameraMatrix cm = xr_interface->get_projection_for_eye(XRInterface::EYE_MONO, viewport_size.aspect(), get_znear(), get_zfar()); Vector2 vp_he = cm.get_viewport_half_extents(); @@ -149,13 +149,13 @@ Vector3 ARVRCamera::project_position(const Point2 &p_point, float p_z_depth) con return get_camera_transform().xform(p); }; -Vector<Plane> ARVRCamera::get_frustum() const { - // get our ARVRServer - ARVRServer *arvr_server = ARVRServer::get_singleton(); - ERR_FAIL_NULL_V(arvr_server, Vector<Plane>()); +Vector<Plane> XRCamera3D::get_frustum() const { + // get our XRServer + XRServer *xr_server = XRServer::get_singleton(); + ERR_FAIL_NULL_V(xr_server, Vector<Plane>()); - Ref<ARVRInterface> arvr_interface = arvr_server->get_primary_interface(); - if (arvr_interface.is_null()) { + Ref<XRInterface> xr_interface = xr_server->get_primary_interface(); + if (xr_interface.is_null()) { // we might be in the editor or have VR turned off, just call superclass return Camera3D::get_frustum(); } @@ -163,21 +163,21 @@ Vector<Plane> ARVRCamera::get_frustum() const { ERR_FAIL_COND_V(!is_inside_world(), Vector<Plane>()); Size2 viewport_size = get_viewport()->get_visible_rect().size; - CameraMatrix cm = arvr_interface->get_projection_for_eye(ARVRInterface::EYE_MONO, viewport_size.aspect(), get_znear(), get_zfar()); + CameraMatrix cm = xr_interface->get_projection_for_eye(XRInterface::EYE_MONO, viewport_size.aspect(), get_znear(), get_zfar()); return cm.get_projection_planes(get_camera_transform()); }; -ARVRCamera::ARVRCamera(){ +XRCamera3D::XRCamera3D(){ // nothing to do here yet for now.. }; -ARVRCamera::~ARVRCamera(){ +XRCamera3D::~XRCamera3D(){ // nothing to do here yet for now.. }; //////////////////////////////////////////////////////////////////////////////////////////////////// -void ARVRController::_notification(int p_what) { +void XRController3D::_notification(int p_what) { switch (p_what) { case NOTIFICATION_ENTER_TREE: { set_process_internal(true); @@ -186,12 +186,12 @@ void ARVRController::_notification(int p_what) { set_process_internal(false); }; break; case NOTIFICATION_INTERNAL_PROCESS: { - // get our ARVRServer - ARVRServer *arvr_server = ARVRServer::get_singleton(); - ERR_FAIL_NULL(arvr_server); + // get our XRServer + XRServer *xr_server = XRServer::get_singleton(); + ERR_FAIL_NULL(xr_server); // find the tracker for our controller - ARVRPositionalTracker *tracker = arvr_server->find_by_type_and_id(ARVRServer::TRACKER_CONTROLLER, controller_id); + XRPositionalTracker *tracker = xr_server->find_by_type_and_id(XRServer::TRACKER_CONTROLLER, controller_id); if (tracker == nullptr) { // this controller is currently turned off is_active = false; @@ -206,7 +206,7 @@ void ARVRController::_notification(int p_what) { // check button states for (int i = 0; i < 16; i++) { bool was_pressed = (button_states & mask) == mask; - bool is_pressed = InputFilter::get_singleton()->is_joy_button_pressed(joy_id, i); + bool is_pressed = Input::get_singleton()->is_joy_button_pressed(joy_id, i); if (!was_pressed && is_pressed) { emit_signal("button_pressed", i); @@ -236,49 +236,49 @@ void ARVRController::_notification(int p_what) { }; }; -void ARVRController::_bind_methods() { - ClassDB::bind_method(D_METHOD("set_controller_id", "controller_id"), &ARVRController::set_controller_id); - ClassDB::bind_method(D_METHOD("get_controller_id"), &ARVRController::get_controller_id); +void XRController3D::_bind_methods() { + ClassDB::bind_method(D_METHOD("set_controller_id", "controller_id"), &XRController3D::set_controller_id); + ClassDB::bind_method(D_METHOD("get_controller_id"), &XRController3D::get_controller_id); ADD_PROPERTY(PropertyInfo(Variant::INT, "controller_id", PROPERTY_HINT_RANGE, "0,32,1"), "set_controller_id", "get_controller_id"); - ClassDB::bind_method(D_METHOD("get_controller_name"), &ARVRController::get_controller_name); + ClassDB::bind_method(D_METHOD("get_controller_name"), &XRController3D::get_controller_name); // passthroughs to information about our related joystick - ClassDB::bind_method(D_METHOD("get_joystick_id"), &ARVRController::get_joystick_id); - ClassDB::bind_method(D_METHOD("is_button_pressed", "button"), &ARVRController::is_button_pressed); - ClassDB::bind_method(D_METHOD("get_joystick_axis", "axis"), &ARVRController::get_joystick_axis); + ClassDB::bind_method(D_METHOD("get_joystick_id"), &XRController3D::get_joystick_id); + ClassDB::bind_method(D_METHOD("is_button_pressed", "button"), &XRController3D::is_button_pressed); + ClassDB::bind_method(D_METHOD("get_joystick_axis", "axis"), &XRController3D::get_joystick_axis); - ClassDB::bind_method(D_METHOD("get_is_active"), &ARVRController::get_is_active); - ClassDB::bind_method(D_METHOD("get_hand"), &ARVRController::get_hand); + ClassDB::bind_method(D_METHOD("get_is_active"), &XRController3D::get_is_active); + ClassDB::bind_method(D_METHOD("get_hand"), &XRController3D::get_hand); - ClassDB::bind_method(D_METHOD("get_rumble"), &ARVRController::get_rumble); - ClassDB::bind_method(D_METHOD("set_rumble", "rumble"), &ARVRController::set_rumble); + ClassDB::bind_method(D_METHOD("get_rumble"), &XRController3D::get_rumble); + ClassDB::bind_method(D_METHOD("set_rumble", "rumble"), &XRController3D::set_rumble); ADD_PROPERTY(PropertyInfo(Variant::FLOAT, "rumble", PROPERTY_HINT_RANGE, "0.0,1.0,0.01"), "set_rumble", "get_rumble"); ADD_PROPERTY_DEFAULT("rumble", 0.0); - ClassDB::bind_method(D_METHOD("get_mesh"), &ARVRController::get_mesh); + ClassDB::bind_method(D_METHOD("get_mesh"), &XRController3D::get_mesh); ADD_SIGNAL(MethodInfo("button_pressed", PropertyInfo(Variant::INT, "button"))); ADD_SIGNAL(MethodInfo("button_release", PropertyInfo(Variant::INT, "button"))); ADD_SIGNAL(MethodInfo("mesh_updated", PropertyInfo(Variant::OBJECT, "mesh", PROPERTY_HINT_RESOURCE_TYPE, "Mesh"))); }; -void ARVRController::set_controller_id(int p_controller_id) { +void XRController3D::set_controller_id(int p_controller_id) { // We don't check any bounds here, this controller may not yet be active and just be a place holder until it is. // Note that setting this to 0 means this node is not bound to a controller yet. controller_id = p_controller_id; update_configuration_warning(); }; -int ARVRController::get_controller_id(void) const { +int XRController3D::get_controller_id(void) const { return controller_id; }; -String ARVRController::get_controller_name(void) const { - // get our ARVRServer - ARVRServer *arvr_server = ARVRServer::get_singleton(); - ERR_FAIL_NULL_V(arvr_server, String()); +String XRController3D::get_controller_name(void) const { + // get our XRServer + XRServer *xr_server = XRServer::get_singleton(); + ERR_FAIL_NULL_V(xr_server, String()); - ARVRPositionalTracker *tracker = arvr_server->find_by_type_and_id(ARVRServer::TRACKER_CONTROLLER, controller_id); + XRPositionalTracker *tracker = xr_server->find_by_type_and_id(XRServer::TRACKER_CONTROLLER, controller_id); if (tracker == nullptr) { return String("Not connected"); }; @@ -286,12 +286,12 @@ String ARVRController::get_controller_name(void) const { return tracker->get_name(); }; -int ARVRController::get_joystick_id() const { - // get our ARVRServer - ARVRServer *arvr_server = ARVRServer::get_singleton(); - ERR_FAIL_NULL_V(arvr_server, 0); +int XRController3D::get_joystick_id() const { + // get our XRServer + XRServer *xr_server = XRServer::get_singleton(); + ERR_FAIL_NULL_V(xr_server, 0); - ARVRPositionalTracker *tracker = arvr_server->find_by_type_and_id(ARVRServer::TRACKER_CONTROLLER, controller_id); + XRPositionalTracker *tracker = xr_server->find_by_type_and_id(XRServer::TRACKER_CONTROLLER, controller_id); if (tracker == nullptr) { // No tracker? no joystick id... (0 is our first joystick) return -1; @@ -300,30 +300,30 @@ int ARVRController::get_joystick_id() const { return tracker->get_joy_id(); }; -bool ARVRController::is_button_pressed(int p_button) const { +bool XRController3D::is_button_pressed(int p_button) const { int joy_id = get_joystick_id(); if (joy_id == -1) { return false; }; - return InputFilter::get_singleton()->is_joy_button_pressed(joy_id, p_button); + return Input::get_singleton()->is_joy_button_pressed(joy_id, p_button); }; -float ARVRController::get_joystick_axis(int p_axis) const { +float XRController3D::get_joystick_axis(int p_axis) const { int joy_id = get_joystick_id(); if (joy_id == -1) { return 0.0; }; - return InputFilter::get_singleton()->get_joy_axis(joy_id, p_axis); + return Input::get_singleton()->get_joy_axis(joy_id, p_axis); }; -real_t ARVRController::get_rumble() const { - // get our ARVRServer - ARVRServer *arvr_server = ARVRServer::get_singleton(); - ERR_FAIL_NULL_V(arvr_server, 0.0); +real_t XRController3D::get_rumble() const { + // get our XRServer + XRServer *xr_server = XRServer::get_singleton(); + ERR_FAIL_NULL_V(xr_server, 0.0); - ARVRPositionalTracker *tracker = arvr_server->find_by_type_and_id(ARVRServer::TRACKER_CONTROLLER, controller_id); + XRPositionalTracker *tracker = xr_server->find_by_type_and_id(XRServer::TRACKER_CONTROLLER, controller_id); if (tracker == nullptr) { return 0.0; }; @@ -331,46 +331,46 @@ real_t ARVRController::get_rumble() const { return tracker->get_rumble(); }; -void ARVRController::set_rumble(real_t p_rumble) { - // get our ARVRServer - ARVRServer *arvr_server = ARVRServer::get_singleton(); - ERR_FAIL_NULL(arvr_server); +void XRController3D::set_rumble(real_t p_rumble) { + // get our XRServer + XRServer *xr_server = XRServer::get_singleton(); + ERR_FAIL_NULL(xr_server); - ARVRPositionalTracker *tracker = arvr_server->find_by_type_and_id(ARVRServer::TRACKER_CONTROLLER, controller_id); + XRPositionalTracker *tracker = xr_server->find_by_type_and_id(XRServer::TRACKER_CONTROLLER, controller_id); if (tracker != nullptr) { tracker->set_rumble(p_rumble); }; }; -Ref<Mesh> ARVRController::get_mesh() const { +Ref<Mesh> XRController3D::get_mesh() const { return mesh; } -bool ARVRController::get_is_active() const { +bool XRController3D::get_is_active() const { return is_active; }; -ARVRPositionalTracker::TrackerHand ARVRController::get_hand() const { - // get our ARVRServer - ARVRServer *arvr_server = ARVRServer::get_singleton(); - ERR_FAIL_NULL_V(arvr_server, ARVRPositionalTracker::TRACKER_HAND_UNKNOWN); +XRPositionalTracker::TrackerHand XRController3D::get_hand() const { + // get our XRServer + XRServer *xr_server = XRServer::get_singleton(); + ERR_FAIL_NULL_V(xr_server, XRPositionalTracker::TRACKER_HAND_UNKNOWN); - ARVRPositionalTracker *tracker = arvr_server->find_by_type_and_id(ARVRServer::TRACKER_CONTROLLER, controller_id); + XRPositionalTracker *tracker = xr_server->find_by_type_and_id(XRServer::TRACKER_CONTROLLER, controller_id); if (tracker == nullptr) { - return ARVRPositionalTracker::TRACKER_HAND_UNKNOWN; + return XRPositionalTracker::TRACKER_HAND_UNKNOWN; }; return tracker->get_hand(); }; -String ARVRController::get_configuration_warning() const { +String XRController3D::get_configuration_warning() const { if (!is_visible() || !is_inside_tree()) return String(); - // must be child node of ARVROrigin! - ARVROrigin *origin = Object::cast_to<ARVROrigin>(get_parent()); + // must be child node of XROrigin! + XROrigin3D *origin = Object::cast_to<XROrigin3D>(get_parent()); if (origin == nullptr) { - return TTR("ARVRController must have an ARVROrigin node as its parent."); + return TTR("XRController3D must have an XROrigin3D node as its parent."); }; if (controller_id == 0) { @@ -380,19 +380,19 @@ String ARVRController::get_configuration_warning() const { return String(); }; -ARVRController::ARVRController() { +XRController3D::XRController3D() { controller_id = 1; is_active = true; button_states = 0; }; -ARVRController::~ARVRController(){ +XRController3D::~XRController3D(){ // nothing to do here yet for now.. }; //////////////////////////////////////////////////////////////////////////////////////////////////// -void ARVRAnchor::_notification(int p_what) { +void XRAnchor3D::_notification(int p_what) { switch (p_what) { case NOTIFICATION_ENTER_TREE: { set_process_internal(true); @@ -401,12 +401,12 @@ void ARVRAnchor::_notification(int p_what) { set_process_internal(false); }; break; case NOTIFICATION_INTERNAL_PROCESS: { - // get our ARVRServer - ARVRServer *arvr_server = ARVRServer::get_singleton(); - ERR_FAIL_NULL(arvr_server); + // get our XRServer + XRServer *xr_server = XRServer::get_singleton(); + ERR_FAIL_NULL(xr_server); // find the tracker for our anchor - ARVRPositionalTracker *tracker = arvr_server->find_by_type_and_id(ARVRServer::TRACKER_ANCHOR, anchor_id); + XRPositionalTracker *tracker = xr_server->find_by_type_and_id(XRServer::TRACKER_ANCHOR, anchor_id); if (tracker == nullptr) { // this anchor is currently not available is_active = false; @@ -415,7 +415,7 @@ void ARVRAnchor::_notification(int p_what) { Transform transform; // we'll need our world_scale - real_t world_scale = arvr_server->get_world_scale(); + real_t world_scale = xr_server->get_world_scale(); // get our info from our tracker transform.basis = tracker->get_orientation(); @@ -427,7 +427,7 @@ void ARVRAnchor::_notification(int p_what) { transform.basis.orthonormalize(); // apply our reference frame and set our transform - set_transform(arvr_server->get_reference_frame() * transform); + set_transform(xr_server->get_reference_frame() * transform); // check for an updated mesh Ref<Mesh> trackerMesh = tracker->get_mesh(); @@ -442,43 +442,43 @@ void ARVRAnchor::_notification(int p_what) { }; }; -void ARVRAnchor::_bind_methods() { +void XRAnchor3D::_bind_methods() { - ClassDB::bind_method(D_METHOD("set_anchor_id", "anchor_id"), &ARVRAnchor::set_anchor_id); - ClassDB::bind_method(D_METHOD("get_anchor_id"), &ARVRAnchor::get_anchor_id); + ClassDB::bind_method(D_METHOD("set_anchor_id", "anchor_id"), &XRAnchor3D::set_anchor_id); + ClassDB::bind_method(D_METHOD("get_anchor_id"), &XRAnchor3D::get_anchor_id); ADD_PROPERTY(PropertyInfo(Variant::INT, "anchor_id", PROPERTY_HINT_RANGE, "0,32,1"), "set_anchor_id", "get_anchor_id"); - ClassDB::bind_method(D_METHOD("get_anchor_name"), &ARVRAnchor::get_anchor_name); + ClassDB::bind_method(D_METHOD("get_anchor_name"), &XRAnchor3D::get_anchor_name); - ClassDB::bind_method(D_METHOD("get_is_active"), &ARVRAnchor::get_is_active); - ClassDB::bind_method(D_METHOD("get_size"), &ARVRAnchor::get_size); + ClassDB::bind_method(D_METHOD("get_is_active"), &XRAnchor3D::get_is_active); + ClassDB::bind_method(D_METHOD("get_size"), &XRAnchor3D::get_size); - ClassDB::bind_method(D_METHOD("get_plane"), &ARVRAnchor::get_plane); + ClassDB::bind_method(D_METHOD("get_plane"), &XRAnchor3D::get_plane); - ClassDB::bind_method(D_METHOD("get_mesh"), &ARVRAnchor::get_mesh); + ClassDB::bind_method(D_METHOD("get_mesh"), &XRAnchor3D::get_mesh); ADD_SIGNAL(MethodInfo("mesh_updated", PropertyInfo(Variant::OBJECT, "mesh", PROPERTY_HINT_RESOURCE_TYPE, "Mesh"))); }; -void ARVRAnchor::set_anchor_id(int p_anchor_id) { +void XRAnchor3D::set_anchor_id(int p_anchor_id) { // We don't check any bounds here, this anchor may not yet be active and just be a place holder until it is. // Note that setting this to 0 means this node is not bound to an anchor yet. anchor_id = p_anchor_id; update_configuration_warning(); }; -int ARVRAnchor::get_anchor_id(void) const { +int XRAnchor3D::get_anchor_id(void) const { return anchor_id; }; -Vector3 ARVRAnchor::get_size() const { +Vector3 XRAnchor3D::get_size() const { return size; }; -String ARVRAnchor::get_anchor_name(void) const { - // get our ARVRServer - ARVRServer *arvr_server = ARVRServer::get_singleton(); - ERR_FAIL_NULL_V(arvr_server, String()); +String XRAnchor3D::get_anchor_name(void) const { + // get our XRServer + XRServer *xr_server = XRServer::get_singleton(); + ERR_FAIL_NULL_V(xr_server, String()); - ARVRPositionalTracker *tracker = arvr_server->find_by_type_and_id(ARVRServer::TRACKER_ANCHOR, anchor_id); + XRPositionalTracker *tracker = xr_server->find_by_type_and_id(XRServer::TRACKER_ANCHOR, anchor_id); if (tracker == nullptr) { return String("Not connected"); }; @@ -486,18 +486,18 @@ String ARVRAnchor::get_anchor_name(void) const { return tracker->get_name(); }; -bool ARVRAnchor::get_is_active() const { +bool XRAnchor3D::get_is_active() const { return is_active; }; -String ARVRAnchor::get_configuration_warning() const { +String XRAnchor3D::get_configuration_warning() const { if (!is_visible() || !is_inside_tree()) return String(); - // must be child node of ARVROrigin! - ARVROrigin *origin = Object::cast_to<ARVROrigin>(get_parent()); + // must be child node of XROrigin3D! + XROrigin3D *origin = Object::cast_to<XROrigin3D>(get_parent()); if (origin == nullptr) { - return TTR("ARVRAnchor must have an ARVROrigin node as its parent."); + return TTR("XRAnchor3D must have an XROrigin3D node as its parent."); }; if (anchor_id == 0) { @@ -507,7 +507,7 @@ String ARVRAnchor::get_configuration_warning() const { return String(); }; -Plane ARVRAnchor::get_plane() const { +Plane XRAnchor3D::get_plane() const { Vector3 location = get_translation(); Basis orientation = get_transform().basis; @@ -516,67 +516,67 @@ Plane ARVRAnchor::get_plane() const { return plane; }; -Ref<Mesh> ARVRAnchor::get_mesh() const { +Ref<Mesh> XRAnchor3D::get_mesh() const { return mesh; } -ARVRAnchor::ARVRAnchor() { +XRAnchor3D::XRAnchor3D() { anchor_id = 1; is_active = true; }; -ARVRAnchor::~ARVRAnchor(){ +XRAnchor3D::~XRAnchor3D(){ // nothing to do here yet for now.. }; //////////////////////////////////////////////////////////////////////////////////////////////////// -String ARVROrigin::get_configuration_warning() const { +String XROrigin3D::get_configuration_warning() const { if (!is_visible() || !is_inside_tree()) return String(); if (tracked_camera == nullptr) - return TTR("ARVROrigin requires an ARVRCamera child node."); + return TTR("XROrigin3D requires an XRCamera3D child node."); return String(); }; -void ARVROrigin::_bind_methods() { - ClassDB::bind_method(D_METHOD("set_world_scale", "world_scale"), &ARVROrigin::set_world_scale); - ClassDB::bind_method(D_METHOD("get_world_scale"), &ARVROrigin::get_world_scale); +void XROrigin3D::_bind_methods() { + ClassDB::bind_method(D_METHOD("set_world_scale", "world_scale"), &XROrigin3D::set_world_scale); + ClassDB::bind_method(D_METHOD("get_world_scale"), &XROrigin3D::get_world_scale); ADD_PROPERTY(PropertyInfo(Variant::FLOAT, "world_scale"), "set_world_scale", "get_world_scale"); }; -void ARVROrigin::set_tracked_camera(ARVRCamera *p_tracked_camera) { +void XROrigin3D::set_tracked_camera(XRCamera3D *p_tracked_camera) { tracked_camera = p_tracked_camera; }; -void ARVROrigin::clear_tracked_camera_if(ARVRCamera *p_tracked_camera) { +void XROrigin3D::clear_tracked_camera_if(XRCamera3D *p_tracked_camera) { if (tracked_camera == p_tracked_camera) { tracked_camera = nullptr; }; }; -float ARVROrigin::get_world_scale() const { - // get our ARVRServer - ARVRServer *arvr_server = ARVRServer::get_singleton(); - ERR_FAIL_NULL_V(arvr_server, 1.0); +float XROrigin3D::get_world_scale() const { + // get our XRServer + XRServer *xr_server = XRServer::get_singleton(); + ERR_FAIL_NULL_V(xr_server, 1.0); - return arvr_server->get_world_scale(); + return xr_server->get_world_scale(); }; -void ARVROrigin::set_world_scale(float p_world_scale) { - // get our ARVRServer - ARVRServer *arvr_server = ARVRServer::get_singleton(); - ERR_FAIL_NULL(arvr_server); +void XROrigin3D::set_world_scale(float p_world_scale) { + // get our XRServer + XRServer *xr_server = XRServer::get_singleton(); + ERR_FAIL_NULL(xr_server); - arvr_server->set_world_scale(p_world_scale); + xr_server->set_world_scale(p_world_scale); }; -void ARVROrigin::_notification(int p_what) { - // get our ARVRServer - ARVRServer *arvr_server = ARVRServer::get_singleton(); - ERR_FAIL_NULL(arvr_server); +void XROrigin3D::_notification(int p_what) { + // get our XRServer + XRServer *xr_server = XRServer::get_singleton(); + ERR_FAIL_NULL(xr_server); switch (p_what) { case NOTIFICATION_ENTER_TREE: { @@ -587,13 +587,13 @@ void ARVROrigin::_notification(int p_what) { }; break; case NOTIFICATION_INTERNAL_PROCESS: { // set our world origin to our node transform - arvr_server->set_world_origin(get_global_transform()); + xr_server->set_world_origin(get_global_transform()); // check if we have a primary interface - Ref<ARVRInterface> arvr_interface = arvr_server->get_primary_interface(); - if (arvr_interface.is_valid() && tracked_camera != nullptr) { + Ref<XRInterface> xr_interface = xr_server->get_primary_interface(); + if (xr_interface.is_valid() && tracked_camera != nullptr) { // get our positioning transform for our headset - Transform t = arvr_interface->get_transform_for_eye(ARVRInterface::EYE_MONO, Transform()); + Transform t = xr_interface->get_transform_for_eye(XRInterface::EYE_MONO, Transform()); // now apply this to our camera tracked_camera->set_transform(t); @@ -603,19 +603,19 @@ void ARVROrigin::_notification(int p_what) { break; }; - // send our notification to all active ARVR interfaces, they may need to react to it also - for (int i = 0; i < arvr_server->get_interface_count(); i++) { - Ref<ARVRInterface> interface = arvr_server->get_interface(i); + // send our notification to all active XE interfaces, they may need to react to it also + for (int i = 0; i < xr_server->get_interface_count(); i++) { + Ref<XRInterface> interface = xr_server->get_interface(i); if (interface.is_valid() && interface->is_initialized()) { interface->notification(p_what); } } }; -ARVROrigin::ARVROrigin() { +XROrigin3D::XROrigin3D() { tracked_camera = nullptr; }; -ARVROrigin::~ARVROrigin(){ +XROrigin3D::~XROrigin3D(){ // nothing to do here yet for now.. }; diff --git a/scene/3d/arvr_nodes.h b/scene/3d/xr_nodes.h index bc5df2e174..a2f16545d1 100644 --- a/scene/3d/arvr_nodes.h +++ b/scene/3d/xr_nodes.h @@ -1,5 +1,5 @@ /*************************************************************************/ -/* arvr_nodes.h */ +/* xr_nodes.h */ /*************************************************************************/ /* This file is part of: */ /* GODOT ENGINE */ @@ -28,24 +28,24 @@ /* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ /*************************************************************************/ -#ifndef ARVR_NODES_H -#define ARVR_NODES_H +#ifndef XR_NODES_H +#define XR_NODES_H #include "scene/3d/camera_3d.h" #include "scene/3d/node_3d.h" #include "scene/resources/mesh.h" -#include "servers/arvr/arvr_positional_tracker.h" +#include "servers/xr/xr_positional_tracker.h" /** @author Bastiaan Olij <mux213@gmail.com> **/ /* - ARVRCamera is a subclass of camera which will register itself with its parent ARVROrigin and as a result is automatically positioned + XRCamera is a subclass of camera which will register itself with its parent XROrigin and as a result is automatically positioned */ -class ARVRCamera : public Camera3D { +class XRCamera3D : public Camera3D { - GDCLASS(ARVRCamera, Camera3D); + GDCLASS(XRCamera3D, Camera3D); protected: void _notification(int p_what); @@ -58,19 +58,19 @@ public: virtual Vector3 project_position(const Point2 &p_point, float p_z_depth) const; virtual Vector<Plane> get_frustum() const; - ARVRCamera(); - ~ARVRCamera(); + XRCamera3D(); + ~XRCamera3D(); }; /* - ARVRController is a helper node that automatically updates its position based on tracker data. + XRController3D is a helper node that automatically updates its position based on tracker data. - It must be a child node of our ARVROrigin node + It must be a child node of our XROrigin node */ -class ARVRController : public Node3D { +class XRController3D : public Node3D { - GDCLASS(ARVRController, Node3D); + GDCLASS(XRController3D, Node3D); private: int controller_id; @@ -95,23 +95,23 @@ public: void set_rumble(real_t p_rumble); bool get_is_active() const; - ARVRPositionalTracker::TrackerHand get_hand() const; + XRPositionalTracker::TrackerHand get_hand() const; Ref<Mesh> get_mesh(void) const; String get_configuration_warning() const; - ARVRController(); - ~ARVRController(); + XRController3D(); + ~XRController3D(); }; /* - ARVRAnchor is a helper node that automatically updates its position based on anchor data, it represents a real world location. - It must be a child node of our ARVROrigin node + XRAnchor3D is a helper node that automatically updates its position based on anchor data, it represents a real world location. + It must be a child node of our XROrigin3D node */ -class ARVRAnchor : public Node3D { - GDCLASS(ARVRAnchor, Node3D); +class XRAnchor3D : public Node3D { + GDCLASS(XRAnchor3D, Node3D); private: int anchor_id; @@ -137,24 +137,24 @@ public: String get_configuration_warning() const; - ARVRAnchor(); - ~ARVRAnchor(); + XRAnchor3D(); + ~XRAnchor3D(); }; /* - ARVROrigin is special spatial node that acts as our origin point mapping our real world center of our tracking volume into our virtual world. + XROrigin3D is special spatial node that acts as our origin point mapping our real world center of our tracking volume into our virtual world. It is this point that you will move around the world as the player 'moves while standing still', i.e. the player moves through teleporting or controller inputs as opposed to physically moving. Our camera and controllers will always be child nodes and thus place relative to this origin point. - This node will automatically locate any camera child nodes and update its position while our ARVRController node will handle tracked controllers. + This node will automatically locate any camera child nodes and update its position while our XRController3D node will handle tracked controllers. */ -class ARVROrigin : public Node3D { +class XROrigin3D : public Node3D { - GDCLASS(ARVROrigin, Node3D); + GDCLASS(XROrigin3D, Node3D); private: - ARVRCamera *tracked_camera; + XRCamera3D *tracked_camera; protected: void _notification(int p_what); @@ -163,14 +163,14 @@ protected: public: String get_configuration_warning() const; - void set_tracked_camera(ARVRCamera *p_tracked_camera); - void clear_tracked_camera_if(ARVRCamera *p_tracked_camera); + void set_tracked_camera(XRCamera3D *p_tracked_camera); + void clear_tracked_camera_if(XRCamera3D *p_tracked_camera); float get_world_scale() const; void set_world_scale(float p_world_scale); - ARVROrigin(); - ~ARVROrigin(); + XROrigin3D(); + ~XROrigin3D(); }; -#endif /* ARVR_NODES_H */ +#endif /* XR_NODES_H */ diff --git a/scene/animation/animation_player.cpp b/scene/animation/animation_player.cpp index b657833a3b..9ef6b9864a 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) + if (end_notify || playback.seeked) emit_signal(SceneStringNames::get_singleton()->animation_changed, old, new_name); } else { //stop(); playing = false; _set_process(false); - if (end_notify) + if (end_notify || playback.seeked) 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/gui/color_picker.cpp b/scene/gui/color_picker.cpp index 5e0f4c91e8..63878a0b26 100644 --- a/scene/gui/color_picker.cpp +++ b/scene/gui/color_picker.cpp @@ -30,7 +30,7 @@ #include "color_picker.h" -#include "core/input/input_filter.h" +#include "core/input/input.h" #include "core/os/keyboard.h" #include "core/os/os.h" diff --git a/scene/gui/control.cpp b/scene/gui/control.cpp index 775f863a4f..b4dc37c74f 100644 --- a/scene/gui/control.cpp +++ b/scene/gui/control.cpp @@ -1893,7 +1893,7 @@ static Control *_next_control(Control *p_from) { return nullptr; } - int next = p_from->get_position_in_parent(); + int next = p_from->get_index(); ERR_FAIL_INDEX_V(next, parent->get_child_count(), nullptr); for (int i = (next + 1); i < parent->get_child_count(); i++) { @@ -2032,7 +2032,7 @@ Control *Control::find_prev_valid_focus() const { } else { - for (int i = (from->get_position_in_parent() - 1); i >= 0; i--) { + for (int i = (from->get_index() - 1); i >= 0; i--) { Control *c = Object::cast_to<Control>(from->get_parent()->get_child(i)); diff --git a/scene/gui/dialogs.cpp b/scene/gui/dialogs.cpp index 2e87a92969..5654219a3e 100644 --- a/scene/gui/dialogs.cpp +++ b/scene/gui/dialogs.cpp @@ -322,7 +322,6 @@ AcceptDialog::AcceptDialog() { label->set_end(Point2(-margin, -button_margin - 10)); add_child(label); - hbc = memnew(HBoxContainer); add_child(hbc); hbc->add_spacer(); diff --git a/scene/gui/file_dialog.cpp b/scene/gui/file_dialog.cpp index 905af399b3..89d13ecd7f 100644 --- a/scene/gui/file_dialog.cpp +++ b/scene/gui/file_dialog.cpp @@ -909,6 +909,7 @@ FileDialog::FileDialog() { drives = memnew(OptionButton); drives->connect("item_selected", callable_mp(this, &FileDialog::_select_drive)); + hbc->add_child(drives); dir = memnew(LineEdit); hbc->add_child(dir); @@ -1005,37 +1006,3 @@ FileDialog::~FileDialog() { unregister_func(this); memdelete(dir_access); } - -void LineEditFileChooser::_bind_methods() { - - ClassDB::bind_method(D_METHOD("get_button"), &LineEditFileChooser::get_button); - ClassDB::bind_method(D_METHOD("get_line_edit"), &LineEditFileChooser::get_line_edit); - ClassDB::bind_method(D_METHOD("get_file_dialog"), &LineEditFileChooser::get_file_dialog); -} - -void LineEditFileChooser::_chosen(const String &p_text) { - - line_edit->set_text(p_text); - line_edit->emit_signal("text_entered", p_text); -} - -void LineEditFileChooser::_browse() { - - dialog->popup_centered_ratio(); -} - -LineEditFileChooser::LineEditFileChooser() { - - line_edit = memnew(LineEdit); - add_child(line_edit); - line_edit->set_h_size_flags(Control::SIZE_EXPAND_FILL); - button = memnew(Button); - button->set_text(" .. "); - add_child(button); - button->connect("pressed", callable_mp(this, &LineEditFileChooser::_browse)); - dialog = memnew(FileDialog); - add_child(dialog); - dialog->connect("file_selected", callable_mp(this, &LineEditFileChooser::_chosen)); - dialog->connect("dir_selected", callable_mp(this, &LineEditFileChooser::_chosen)); - dialog->connect("files_selected", callable_mp(this, &LineEditFileChooser::_chosen)); -} diff --git a/scene/gui/file_dialog.h b/scene/gui/file_dialog.h index 6faf02d55d..ac0e733abc 100644 --- a/scene/gui/file_dialog.h +++ b/scene/gui/file_dialog.h @@ -177,27 +177,6 @@ public: ~FileDialog(); }; -class LineEditFileChooser : public HBoxContainer { - - GDCLASS(LineEditFileChooser, HBoxContainer); - Button *button; - LineEdit *line_edit; - FileDialog *dialog; - - void _chosen(const String &p_text); - void _browse(); - -protected: - static void _bind_methods(); - -public: - Button *get_button() { return button; } - LineEdit *get_line_edit() { return line_edit; } - FileDialog *get_file_dialog() { return dialog; } - - LineEditFileChooser(); -}; - VARIANT_ENUM_CAST(FileDialog::FileMode); VARIANT_ENUM_CAST(FileDialog::Access); 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 e37e93e2a9..0bf67df9b4 100644 --- a/scene/gui/graph_edit.cpp +++ b/scene/gui/graph_edit.cpp @@ -30,7 +30,7 @@ #include "graph_edit.h" -#include "core/input/input_filter.h" +#include "core/input/input.h" #include "core/os/keyboard.h" #include "scene/gui/box_container.h" @@ -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); } @@ -804,7 +804,7 @@ void GraphEdit::set_selected(Node *p_child) { void GraphEdit::_gui_input(const Ref<InputEvent> &p_ev) { Ref<InputEventMouseMotion> mm = p_ev; - if (mm.is_valid() && (mm->get_button_mask() & BUTTON_MASK_MIDDLE || (mm->get_button_mask() & BUTTON_MASK_LEFT && InputFilter::get_singleton()->is_key_pressed(KEY_SPACE)))) { + if (mm.is_valid() && (mm->get_button_mask() & BUTTON_MASK_MIDDLE || (mm->get_button_mask() & BUTTON_MASK_LEFT && Input::get_singleton()->is_key_pressed(KEY_SPACE)))) { h_scroll->set_value(h_scroll->get_value() - mm->get_relative().x); v_scroll->set_value(v_scroll->get_value() - mm->get_relative().y); } @@ -823,7 +823,7 @@ void GraphEdit::_gui_input(const Ref<InputEvent> &p_ev) { // Snapping can be toggled temporarily by holding down Ctrl. // This is done here as to not toggle the grid when holding down Ctrl. - if (is_using_snap() ^ InputFilter::get_singleton()->is_key_pressed(KEY_CONTROL)) { + if (is_using_snap() ^ Input::get_singleton()->is_key_pressed(KEY_CONTROL)) { const int snap = get_snap(); pos = pos.snapped(Vector2(snap, snap)); } @@ -852,7 +852,7 @@ void GraphEdit::_gui_input(const Ref<InputEvent> &p_ev) { bool in_box = r.intersects(box_selecting_rect); if (in_box) - gn->set_selected(box_selection_mode_aditive); + gn->set_selected(box_selection_mode_additive); else gn->set_selected(previus_selected.find(gn) != nullptr); } @@ -886,7 +886,7 @@ void GraphEdit::_gui_input(const Ref<InputEvent> &p_ev) { } if (b->get_button_index() == BUTTON_LEFT && !b->is_pressed() && dragging) { - if (!just_selected && drag_accum == Vector2() && InputFilter::get_singleton()->is_key_pressed(KEY_CONTROL)) { + if (!just_selected && drag_accum == Vector2() && Input::get_singleton()->is_key_pressed(KEY_CONTROL)) { //deselect current node for (int i = get_child_count() - 1; i >= 0; i--) { GraphNode *gn = Object::cast_to<GraphNode>(get_child(i)); @@ -948,11 +948,19 @@ void GraphEdit::_gui_input(const Ref<InputEvent> &p_ev) { drag_accum = Vector2(); drag_origin = get_local_mouse_position(); just_selected = !gn->is_selected(); - if (!gn->is_selected() && !InputFilter::get_singleton()->is_key_pressed(KEY_CONTROL)) { + if (!gn->is_selected() && !Input::get_singleton()->is_key_pressed(KEY_CONTROL)) { for (int i = 0; i < get_child_count(); i++) { GraphNode *o_gn = Object::cast_to<GraphNode>(get_child(i)); - if (o_gn) - o_gn->set_selected(o_gn == gn); + if (o_gn) { + if (o_gn == gn) { + o_gn->set_selected(true); + } else { + if (o_gn->is_selected()) { + emit_signal("node_unselected", o_gn); + } + o_gn->set_selected(false); + } + } } } @@ -968,13 +976,13 @@ void GraphEdit::_gui_input(const Ref<InputEvent> &p_ev) { } else { if (_filter_input(b->get_position())) return; - if (InputFilter::get_singleton()->is_key_pressed(KEY_SPACE)) + if (Input::get_singleton()->is_key_pressed(KEY_SPACE)) return; box_selecting = true; box_selecting_from = get_local_mouse_position(); if (b->get_control()) { - box_selection_mode_aditive = true; + box_selection_mode_additive = true; previus_selected.clear(); for (int i = get_child_count() - 1; i >= 0; i--) { @@ -985,7 +993,7 @@ void GraphEdit::_gui_input(const Ref<InputEvent> &p_ev) { previus_selected.push_back(gn2); } } else if (b->get_shift()) { - box_selection_mode_aditive = false; + box_selection_mode_additive = false; previus_selected.clear(); for (int i = get_child_count() - 1; i >= 0; i--) { @@ -996,14 +1004,16 @@ void GraphEdit::_gui_input(const Ref<InputEvent> &p_ev) { previus_selected.push_back(gn2); } } else { - box_selection_mode_aditive = true; + box_selection_mode_additive = true; previus_selected.clear(); for (int i = get_child_count() - 1; i >= 0; i--) { GraphNode *gn2 = Object::cast_to<GraphNode>(get_child(i)); if (!gn2) continue; - + if (gn2->is_selected()) { + emit_signal("node_unselected", gn2); + } gn2->set_selected(false); } } @@ -1025,16 +1035,16 @@ void GraphEdit::_gui_input(const Ref<InputEvent> &p_ev) { //too difficult to get right //set_zoom(zoom/ZOOM_SCALE); } - if (b->get_button_index() == BUTTON_WHEEL_UP && !InputFilter::get_singleton()->is_key_pressed(KEY_SHIFT)) { + if (b->get_button_index() == BUTTON_WHEEL_UP && !Input::get_singleton()->is_key_pressed(KEY_SHIFT)) { v_scroll->set_value(v_scroll->get_value() - v_scroll->get_page() * b->get_factor() / 8); } - if (b->get_button_index() == BUTTON_WHEEL_DOWN && !InputFilter::get_singleton()->is_key_pressed(KEY_SHIFT)) { + if (b->get_button_index() == BUTTON_WHEEL_DOWN && !Input::get_singleton()->is_key_pressed(KEY_SHIFT)) { v_scroll->set_value(v_scroll->get_value() + v_scroll->get_page() * b->get_factor() / 8); } - if (b->get_button_index() == BUTTON_WHEEL_RIGHT || (b->get_button_index() == BUTTON_WHEEL_DOWN && InputFilter::get_singleton()->is_key_pressed(KEY_SHIFT))) { + if (b->get_button_index() == BUTTON_WHEEL_RIGHT || (b->get_button_index() == BUTTON_WHEEL_DOWN && Input::get_singleton()->is_key_pressed(KEY_SHIFT))) { h_scroll->set_value(h_scroll->get_value() + h_scroll->get_page() * b->get_factor() / 8); } - if (b->get_button_index() == BUTTON_WHEEL_LEFT || (b->get_button_index() == BUTTON_WHEEL_UP && InputFilter::get_singleton()->is_key_pressed(KEY_SHIFT))) { + if (b->get_button_index() == BUTTON_WHEEL_LEFT || (b->get_button_index() == BUTTON_WHEEL_UP && Input::get_singleton()->is_key_pressed(KEY_SHIFT))) { h_scroll->set_value(h_scroll->get_value() - h_scroll->get_page() * b->get_factor() / 8); } } @@ -1311,6 +1321,7 @@ void GraphEdit::_bind_methods() { ADD_SIGNAL(MethodInfo("copy_nodes_request")); ADD_SIGNAL(MethodInfo("paste_nodes_request")); ADD_SIGNAL(MethodInfo("node_selected", PropertyInfo(Variant::OBJECT, "node", PROPERTY_HINT_RESOURCE_TYPE, "Node"))); + ADD_SIGNAL(MethodInfo("node_unselected", PropertyInfo(Variant::OBJECT, "node", PROPERTY_HINT_RESOURCE_TYPE, "Node"))); ADD_SIGNAL(MethodInfo("connection_to_empty", PropertyInfo(Variant::STRING_NAME, "from"), PropertyInfo(Variant::INT, "from_slot"), PropertyInfo(Variant::VECTOR2, "release_position"))); ADD_SIGNAL(MethodInfo("connection_from_empty", PropertyInfo(Variant::STRING_NAME, "to"), PropertyInfo(Variant::INT, "to_slot"), PropertyInfo(Variant::VECTOR2, "release_position"))); ADD_SIGNAL(MethodInfo("delete_nodes_request")); diff --git a/scene/gui/graph_edit.h b/scene/gui/graph_edit.h index 7f1d2699ba..f675f8c7f3 100644 --- a/scene/gui/graph_edit.h +++ b/scene/gui/graph_edit.h @@ -104,7 +104,7 @@ private: float zoom; bool box_selecting; - bool box_selection_mode_aditive; + bool box_selection_mode_additive; Point2 box_selecting_from; Point2 box_selecting_to; Rect2 box_selecting_rect; diff --git a/scene/gui/option_button.cpp b/scene/gui/option_button.cpp index 30ecd651b1..a03d6d0cdc 100644 --- a/scene/gui/option_button.cpp +++ b/scene/gui/option_button.cpp @@ -340,8 +340,8 @@ void OptionButton::_bind_methods() { ADD_PROPERTY(PropertyInfo(Variant::ARRAY, "items", PROPERTY_HINT_NONE, "", PROPERTY_USAGE_NOEDITOR | PROPERTY_USAGE_INTERNAL), "_set_items", "_get_items"); // "selected" property must come after "items", otherwise GH-10213 occurs. ADD_PROPERTY(PropertyInfo(Variant::INT, "selected"), "_select_int", "get_selected"); - ADD_SIGNAL(MethodInfo("item_selected", PropertyInfo(Variant::INT, "id"))); - ADD_SIGNAL(MethodInfo("item_focused", PropertyInfo(Variant::INT, "id"))); + ADD_SIGNAL(MethodInfo("item_selected", PropertyInfo(Variant::INT, "index"))); + ADD_SIGNAL(MethodInfo("item_focused", PropertyInfo(Variant::INT, "index"))); } OptionButton::OptionButton() { diff --git a/scene/gui/popup_menu.cpp b/scene/gui/popup_menu.cpp index 1e933c9aa1..a247863298 100644 --- a/scene/gui/popup_menu.cpp +++ b/scene/gui/popup_menu.cpp @@ -30,7 +30,7 @@ #include "popup_menu.h" -#include "core/input/input_filter.h" +#include "core/input/input.h" #include "core/os/keyboard.h" #include "core/os/os.h" #include "core/print_string.h" @@ -594,7 +594,7 @@ void PopupMenu::_notification(int p_what) { } break; case NOTIFICATION_POST_POPUP: { - initial_button_mask = InputFilter::get_singleton()->get_mouse_button_mask(); + initial_button_mask = Input::get_singleton()->get_mouse_button_mask(); during_grabbed_click = (bool)initial_button_mask; } break; case NOTIFICATION_WM_SIZE_CHANGED: { diff --git a/scene/gui/rich_text_label.cpp b/scene/gui/rich_text_label.cpp index 5fb2243aff..5c293cdf3c 100644 --- a/scene/gui/rich_text_label.cpp +++ b/scene/gui/rich_text_label.cpp @@ -407,17 +407,16 @@ int RichTextLabel::_process_line(ItemFrame *p_frame, const Vector2 &p_ofs, int & cw = tab_size * font->get_char_size(' ').width; } - if (end > 0 && w + cw + begin > p_width) { + if (end > 0 && fw + cw + begin > p_width) { break; //don't allow lines longer than assigned width } - w += cw; fw += cw; end++; } CHECK_HEIGHT(fh); - ENSURE_WIDTH(w); + ENSURE_WIDTH(fw); line_ascent = MAX(line_ascent, ascent); line_descent = MAX(line_descent, descent); @@ -552,8 +551,10 @@ int RichTextLabel::_process_line(ItemFrame *p_frame, const Vector2 &p_ofs, int & } } - if (visible) + if (visible) { line_is_blank = false; + w += font->get_char_size(c[i], c[i + 1]).x; + } if (c[i] == '\t') visible = false; @@ -582,13 +583,14 @@ int RichTextLabel::_process_line(ItemFrame *p_frame, const Vector2 &p_ofs, int & } else { cw = drawer.draw_char(ci, p_ofs + Point2(align_ofs + pofs, y + lh - line_descent) + fx_offset, fx_char, c[i + 1], fx_color); } - } else if (previously_visible) { + } else if (previously_visible && c[i] != '\t') { backtrack += font->get_char_size(fx_char, c[i + 1]).x; } p_char_count++; if (c[i] == '\t') { cw = tab_size * font->get_char_size(' ').width; + backtrack = MAX(0, backtrack - cw); } ofs += cw; @@ -607,7 +609,7 @@ int RichTextLabel::_process_line(ItemFrame *p_frame, const Vector2 &p_ofs, int & } else if (strikethrough) { Color uc = color; uc.a *= 0.5; - int uy = y + lh / 2 - line_descent + 2; + int uy = y + lh - (line_ascent + line_descent) / 2; float strikethrough_width = 1.0; #ifdef TOOLS_ENABLED strikethrough_width *= EDSCALE; @@ -2091,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()); @@ -2323,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(); @@ -2345,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(); @@ -2368,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(); @@ -2391,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(); @@ -2414,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(); @@ -2442,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/slider.cpp b/scene/gui/slider.cpp index e47e2b869d..1f135163d4 100644 --- a/scene/gui/slider.cpp +++ b/scene/gui/slider.cpp @@ -166,8 +166,9 @@ void Slider::_notification(int p_what) { RID ci = get_canvas_item(); Size2i size = get_size(); Ref<StyleBox> style = get_theme_stylebox("slider"); - Ref<StyleBox> grabber_area = get_theme_stylebox("grabber_area"); - Ref<Texture2D> grabber = get_theme_icon(editable ? ((mouse_inside || has_focus()) ? "grabber_highlight" : "grabber") : "grabber_disabled"); + bool highlighted = mouse_inside || has_focus(); + Ref<StyleBox> grabber_area = get_theme_stylebox(highlighted ? "grabber_area_highlight" : "grabber_area"); + Ref<Texture2D> grabber = get_theme_icon(editable ? (highlighted ? "grabber_highlight" : "grabber") : "grabber_disabled"); Ref<Texture2D> tick = get_theme_icon("tick"); double ratio = Math::is_nan(get_as_ratio()) ? 0 : get_as_ratio(); diff --git a/scene/gui/spin_box.cpp b/scene/gui/spin_box.cpp index 8572d570fb..94628f7cea 100644 --- a/scene/gui/spin_box.cpp +++ b/scene/gui/spin_box.cpp @@ -30,7 +30,7 @@ #include "spin_box.h" -#include "core/input/input_filter.h" +#include "core/input/input.h" #include "core/math/expression.h" Size2 SpinBox::get_minimum_size() const { @@ -77,7 +77,7 @@ void SpinBox::_line_edit_input(const Ref<InputEvent> &p_event) { void SpinBox::_range_click_timeout() { - if (!drag.enabled && InputFilter::get_singleton()->is_mouse_button_pressed(BUTTON_LEFT)) { + if (!drag.enabled && Input::get_singleton()->is_mouse_button_pressed(BUTTON_LEFT)) { bool up = get_local_mouse_position().y < (get_size().height / 2); set_value(get_value() + (up ? get_step() : -get_step())); @@ -149,7 +149,7 @@ void SpinBox::_gui_input(const Ref<InputEvent> &p_event) { if (drag.enabled) { drag.enabled = false; - InputFilter::get_singleton()->set_mouse_mode(InputFilter::MOUSE_MODE_VISIBLE); + Input::get_singleton()->set_mouse_mode(Input::MOUSE_MODE_VISIBLE); warp_mouse(drag.capture_pos); } drag.allowed = false; @@ -166,7 +166,7 @@ void SpinBox::_gui_input(const Ref<InputEvent> &p_event) { set_value(CLAMP(drag.base_val + get_step() * diff_y, get_min(), get_max())); } else if (drag.allowed && drag.capture_pos.distance_to(mm->get_position()) > 2) { - InputFilter::get_singleton()->set_mouse_mode(InputFilter::MOUSE_MODE_CAPTURED); + Input::get_singleton()->set_mouse_mode(Input::MOUSE_MODE_CAPTURED); drag.enabled = true; drag.base_val = get_value(); drag.diff_y = 0; diff --git a/scene/gui/tab_container.cpp b/scene/gui/tab_container.cpp index de80049862..3a128cf8e6 100644 --- a/scene/gui/tab_container.cpp +++ b/scene/gui/tab_container.cpp @@ -990,7 +990,7 @@ void TabContainer::_bind_methods() { ClassDB::bind_method(D_METHOD("get_current_tab"), &TabContainer::get_current_tab); ClassDB::bind_method(D_METHOD("get_previous_tab"), &TabContainer::get_previous_tab); ClassDB::bind_method(D_METHOD("get_current_tab_control"), &TabContainer::get_current_tab_control); - ClassDB::bind_method(D_METHOD("get_tab_control", "idx"), &TabContainer::get_tab_control); + ClassDB::bind_method(D_METHOD("get_tab_control", "tab_idx"), &TabContainer::get_tab_control); ClassDB::bind_method(D_METHOD("set_tab_align", "align"), &TabContainer::set_tab_align); ClassDB::bind_method(D_METHOD("get_tab_align"), &TabContainer::get_tab_align); ClassDB::bind_method(D_METHOD("set_tabs_visible", "visible"), &TabContainer::set_tabs_visible); diff --git a/scene/gui/tabs.cpp b/scene/gui/tabs.cpp index ea6d44e3a7..1a3b53f489 100644 --- a/scene/gui/tabs.cpp +++ b/scene/gui/tabs.cpp @@ -184,10 +184,7 @@ void Tabs::_gui_input(const Ref<InputEvent> &p_event) { } int found = -1; - for (int i = 0; i < tabs.size(); i++) { - - if (i < offset) - continue; + for (int i = offset; i < tabs.size(); i++) { if (tabs[i].rb_rect.has_point(pos)) { rb_pressing = true; @@ -276,10 +273,7 @@ void Tabs::_notification(int p_what) { missing_right = false; - for (int i = 0; i < tabs.size(); i++) { - - if (i < offset) - continue; + for (int i = offset; i < tabs.size(); i++) { tabs.write[i].ofs_cache = w; @@ -499,10 +493,7 @@ void Tabs::_update_hover() { // test hovering to display right or close button int hover_now = -1; int hover_buttons = -1; - for (int i = 0; i < tabs.size(); i++) { - - if (i < offset) - continue; + for (int i = offset; i < tabs.size(); i++) { Rect2 rect = get_tab_rect(i); if (rect.has_point(pos)) { @@ -559,9 +550,8 @@ void Tabs::_update_cache() { if (count_resize > 0) { m_width = MAX((limit - size_fixed) / count_resize, min_width); } - for (int i = 0; i < tabs.size(); i++) { - if (i < offset) - continue; + for (int i = offset; i < tabs.size(); i++) { + Ref<StyleBox> sb; if (tabs[i].disabled) { sb = tab_disabled; @@ -753,10 +743,7 @@ void Tabs::drop_data(const Point2 &p_point, const Variant &p_data) { int Tabs::get_tab_idx_at_point(const Point2 &p_point) const { int hover_now = -1; - for (int i = 0; i < tabs.size(); i++) { - - if (i < offset) - continue; + for (int i = offset; i < tabs.size(); i++) { Rect2 rect = get_tab_rect(i); if (rect.has_point(p_point)) { @@ -850,10 +837,7 @@ void Tabs::_ensure_no_over_offset() { while (offset > 0) { int total_w = 0; - for (int i = 0; i < tabs.size(); i++) { - - if (i < offset - 1) - continue; + for (int i = offset - 1; i < tabs.size(); i++) { total_w += tabs[i].size_cache; } diff --git a/scene/gui/text_edit.cpp b/scene/gui/text_edit.cpp index 36e35897d1..9ee7456d26 100644 --- a/scene/gui/text_edit.cpp +++ b/scene/gui/text_edit.cpp @@ -30,7 +30,7 @@ #include "text_edit.h" -#include "core/input/input_filter.h" +#include "core/input/input.h" #include "core/message_queue.h" #include "core/os/keyboard.h" #include "core/os/os.h" @@ -446,7 +446,7 @@ void TextEdit::_click_selection_held() { // Warning: is_mouse_button_pressed(BUTTON_LEFT) returns false for double+ clicks, so this doesn't work for MODE_WORD // and MODE_LINE. However, moving the mouse triggers _gui_input, which calls these functions too, so that's not a huge problem. // I'm unsure if there's an actual fix that doesn't have a ton of side effects. - if (InputFilter::get_singleton()->is_mouse_button_pressed(BUTTON_LEFT) && selection.selecting_mode != Selection::MODE_NONE) { + if (Input::get_singleton()->is_mouse_button_pressed(BUTTON_LEFT) && selection.selecting_mode != Selection::MODE_NONE) { switch (selection.selecting_mode) { case Selection::MODE_POINTER: { _update_selection_mode_pointer(); @@ -1064,11 +1064,6 @@ void TextEdit::_notification(int p_what) { break; } - // re-adjust if we went backwards. - if (color != previous_color && !is_whitespace) { - characters++; - } - if (str[j] == '\t') { tabs += minimap_tab_size; } @@ -6220,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) { @@ -7244,6 +7243,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() { @@ -7323,6 +7324,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/texture_rect.cpp b/scene/gui/texture_rect.cpp index baa138847f..92f3c5b5d9 100644 --- a/scene/gui/texture_rect.cpp +++ b/scene/gui/texture_rect.cpp @@ -95,6 +95,15 @@ void TextureRect::_notification(int p_what) { } break; } + Ref<AtlasTexture> p_atlas = texture; + + if (p_atlas.is_valid() && region.has_no_area()) { + Size2 scale_size(size.width / texture->get_width(), size.height / texture->get_height()); + + offset.width += hflip ? p_atlas->get_margin().get_position().width * scale_size.width * 2 : 0; + offset.height += vflip ? p_atlas->get_margin().get_position().height * scale_size.height * 2 : 0; + } + size.width *= hflip ? -1.0f : 1.0f; size.height *= vflip ? -1.0f : 1.0f; diff --git a/scene/gui/tree.cpp b/scene/gui/tree.cpp index a7acaae8df..aad36ebf02 100644 --- a/scene/gui/tree.cpp +++ b/scene/gui/tree.cpp @@ -30,7 +30,7 @@ #include "tree.h" -#include "core/input/input_filter.h" +#include "core/input/input.h" #include "core/math/math_funcs.h" #include "core/os/keyboard.h" #include "core/os/os.h" @@ -1425,7 +1425,7 @@ int Tree::draw_item(const Point2i &p_pos, const Point2 &p_draw_ofs, const Size2 if (p_item->cells[i].custom_button) { if (cache.hover_item == p_item && cache.hover_cell == i) { - if (InputFilter::get_singleton()->is_mouse_button_pressed(BUTTON_LEFT)) { + if (Input::get_singleton()->is_mouse_button_pressed(BUTTON_LEFT)) { draw_style_box(cache.custom_button_pressed, ir); } else { draw_style_box(cache.custom_button_hover, ir); @@ -1661,7 +1661,7 @@ Rect2 Tree::search_item_rect(TreeItem *p_from, TreeItem *p_item) { void Tree::_range_click_timeout() { - if (range_item_last && !range_drag_enabled && InputFilter::get_singleton()->is_mouse_button_pressed(BUTTON_LEFT)) { + if (range_item_last && !range_drag_enabled && Input::get_singleton()->is_mouse_button_pressed(BUTTON_LEFT)) { Point2 pos = get_local_mouse_position() - cache.bg->get_offset(); if (show_column_titles) { @@ -2048,9 +2048,9 @@ int Tree::propagate_mouse_event(const Point2i &p_pos, int x_ofs, int y_ofs, bool void Tree::_text_editor_modal_close() { - if (InputFilter::get_singleton()->is_key_pressed(KEY_ESCAPE) || - InputFilter::get_singleton()->is_key_pressed(KEY_KP_ENTER) || - InputFilter::get_singleton()->is_key_pressed(KEY_ENTER)) { + if (Input::get_singleton()->is_key_pressed(KEY_ESCAPE) || + Input::get_singleton()->is_key_pressed(KEY_KP_ENTER) || + Input::get_singleton()->is_key_pressed(KEY_ENTER)) { return; } @@ -2532,7 +2532,7 @@ void Tree::_gui_input(Ref<InputEvent> p_event) { range_drag_enabled = true; range_drag_capture_pos = cpos; range_drag_base = popup_edited_item->get_range(popup_edited_item_col); - InputFilter::get_singleton()->set_mouse_mode(InputFilter::MOUSE_MODE_CAPTURED); + Input::get_singleton()->set_mouse_mode(Input::MOUSE_MODE_CAPTURED); } } else { @@ -2594,7 +2594,7 @@ void Tree::_gui_input(Ref<InputEvent> p_event) { if (range_drag_enabled) { range_drag_enabled = false; - InputFilter::get_singleton()->set_mouse_mode(InputFilter::MOUSE_MODE_VISIBLE); + Input::get_singleton()->set_mouse_mode(Input::MOUSE_MODE_VISIBLE); warp_mouse(range_drag_capture_pos); } else { Rect2 rect = get_selected()->get_meta("__focus_rect"); @@ -3045,13 +3045,6 @@ void Tree::_notification(int p_what) { draw_item(Point2(), draw_ofs, draw_size, root); } - int ofs = 0; - - for (int i = 0; i < (columns.size() - 1 - 1); i++) { - - ofs += get_column_width(i); - } - if (show_column_titles) { //title buttons @@ -3245,7 +3238,7 @@ void Tree::clear() { if (pressing_for_editor) { if (range_drag_enabled) { range_drag_enabled = false; - InputFilter::get_singleton()->set_mouse_mode(InputFilter::MOUSE_MODE_VISIBLE); + Input::get_singleton()->set_mouse_mode(Input::MOUSE_MODE_VISIBLE); warp_mouse(range_drag_capture_pos); } pressing_for_editor = false; diff --git a/scene/main/canvas_item.cpp b/scene/main/canvas_item.cpp index 2eacad68c3..b5d54b2199 100644 --- a/scene/main/canvas_item.cpp +++ b/scene/main/canvas_item.cpp @@ -30,7 +30,7 @@ #include "canvas_item.h" -#include "core/input/input_filter.h" +#include "core/input/input.h" #include "core/message_queue.h" #include "core/method_bind_ext.gen.inc" #include "scene/main/canvas_layer.h" diff --git a/scene/main/canvas_layer.cpp b/scene/main/canvas_layer.cpp index 15f64390de..c1caa943e3 100644 --- a/scene/main/canvas_layer.cpp +++ b/scene/main/canvas_layer.cpp @@ -35,7 +35,7 @@ void CanvasLayer::set_layer(int p_xform) { layer = p_xform; if (viewport.is_valid()) - RenderingServer::get_singleton()->viewport_set_canvas_stacking(viewport, canvas, layer, get_position_in_parent()); + RenderingServer::get_singleton()->viewport_set_canvas_stacking(viewport, canvas, layer, get_index()); } int CanvasLayer::get_layer() const { @@ -151,7 +151,7 @@ void CanvasLayer::_notification(int p_what) { viewport = vp->get_viewport_rid(); RenderingServer::get_singleton()->viewport_attach_canvas(viewport, canvas); - RenderingServer::get_singleton()->viewport_set_canvas_stacking(viewport, canvas, layer, get_position_in_parent()); + RenderingServer::get_singleton()->viewport_set_canvas_stacking(viewport, canvas, layer, get_index()); RenderingServer::get_singleton()->viewport_set_canvas_transform(viewport, canvas, transform); _update_follow_viewport(); @@ -167,7 +167,7 @@ void CanvasLayer::_notification(int p_what) { case NOTIFICATION_MOVED_IN_PARENT: { if (is_inside_tree()) - RenderingServer::get_singleton()->viewport_set_canvas_stacking(viewport, canvas, layer, get_position_in_parent()); + RenderingServer::get_singleton()->viewport_set_canvas_stacking(viewport, canvas, layer, get_index()); } break; } @@ -214,7 +214,7 @@ void CanvasLayer::set_custom_viewport(Node *p_viewport) { viewport = vp->get_viewport_rid(); RenderingServer::get_singleton()->viewport_attach_canvas(viewport, canvas); - RenderingServer::get_singleton()->viewport_set_canvas_stacking(viewport, canvas, layer, get_position_in_parent()); + RenderingServer::get_singleton()->viewport_set_canvas_stacking(viewport, canvas, layer, get_index()); RenderingServer::get_singleton()->viewport_set_canvas_transform(viewport, canvas, transform); } } diff --git a/scene/main/instance_placeholder.cpp b/scene/main/instance_placeholder.cpp index 78958a7a1c..062b221c84 100644 --- a/scene/main/instance_placeholder.cpp +++ b/scene/main/instance_placeholder.cpp @@ -95,7 +95,7 @@ Node *InstancePlaceholder::create_instance(bool p_replace, const Ref<PackedScene if (!scene) return nullptr; scene->set_name(get_name()); - int pos = get_position_in_parent(); + int pos = get_index(); for (List<PropSet>::Element *E = stored_values.front(); E; E = E->next()) { scene->set(E->get().name, E->get().value); diff --git a/scene/main/node.cpp b/scene/main/node.cpp index 6b46ffd8ad..4c02a15531 100644 --- a/scene/main/node.cpp +++ b/scene/main/node.cpp @@ -1268,7 +1268,7 @@ void Node::add_child_below_node(Node *p_node, Node *p_child, bool p_legible_uniq add_child(p_child, p_legible_unique_name); if (is_a_parent_of(p_node)) { - move_child(p_child, p_node->get_position_in_parent() + 1); + move_child(p_child, p_node->get_index() + 1); } else { WARN_PRINT("Cannot move under node " + p_node->get_name() + " as " + p_child->get_name() + " does not share a parent."); } @@ -1918,6 +1918,7 @@ int Node::get_index() const { return data.pos; } + void Node::remove_and_skip() { ERR_FAIL_COND(!data.parent); @@ -2042,11 +2043,6 @@ bool Node::get_scene_instance_load_placeholder() const { return data.use_placeholder; } -int Node::get_position_in_parent() const { - - return data.pos; -} - Node *Node::_duplicate(int p_flags, Map<const Node *, Node *> *r_duplimap) const { Node *node = nullptr; @@ -2215,7 +2211,7 @@ Node *Node::_duplicate(int p_flags, Map<const Node *, Node *> *r_duplimap) const } parent->add_child(dup); - int pos = E->get()->get_position_in_parent(); + int pos = E->get()->get_index(); if (pos < parent->get_child_count() - 1) { @@ -2697,9 +2693,9 @@ void Node::queue_delete() { } } -Array Node::_get_children() const { +TypedArray<Node> Node::_get_children() const { - Array arr; + TypedArray<Node> arr; int cc = get_child_count(); arr.resize(cc); for (int i = 0; i < cc; i++) @@ -2860,7 +2856,6 @@ void Node::_bind_methods() { ClassDB::bind_method(D_METHOD("get_pause_mode"), &Node::get_pause_mode); ClassDB::bind_method(D_METHOD("can_process"), &Node::can_process); ClassDB::bind_method(D_METHOD("print_stray_nodes"), &Node::_print_stray_nodes); - ClassDB::bind_method(D_METHOD("get_position_in_parent"), &Node::get_position_in_parent); ClassDB::bind_method(D_METHOD("set_display_folded", "fold"), &Node::set_display_folded); ClassDB::bind_method(D_METHOD("is_displayed_folded"), &Node::is_displayed_folded); diff --git a/scene/main/node.h b/scene/main/node.h index 292ec0e291..1c1b7bbd7a 100644 --- a/scene/main/node.h +++ b/scene/main/node.h @@ -37,6 +37,7 @@ #include "core/object.h" #include "core/project_settings.h" #include "core/script_language.h" +#include "core/typed_array.h" #include "scene/main/scene_tree.h" class Viewport; @@ -182,7 +183,7 @@ private: void _duplicate_and_reown(Node *p_new_parent, const Map<Node *, Node *> &p_reown_map) const; Node *_duplicate(int p_flags, Map<const Node *, Node *> *r_duplimap = nullptr) const; - Array _get_children() const; + TypedArray<Node> _get_children() const; Array _get_groups() const; Variant _rpc_bind(const Variant **p_args, int p_argcount, Callable::CallError &r_error); @@ -369,8 +370,6 @@ public: void set_process_unhandled_key_input(bool p_enable); bool is_processing_unhandled_key_input() const; - int get_position_in_parent() const; - Node *duplicate(int p_flags = DUPLICATE_GROUPS | DUPLICATE_SIGNALS | DUPLICATE_SCRIPTS) const; Node *duplicate_and_reown(const Map<Node *, Node *> &p_reown_map) const; #ifdef TOOLS_ENABLED diff --git a/scene/main/scene_tree.cpp b/scene/main/scene_tree.cpp index 41f31617d2..22cd1c98ab 100644 --- a/scene/main/scene_tree.cpp +++ b/scene/main/scene_tree.cpp @@ -31,7 +31,7 @@ #include "scene_tree.h" #include "core/debugger/engine_debugger.h" -#include "core/input/input_filter.h" +#include "core/input/input.h" #include "core/io/marshalls.h" #include "core/io/resource_loader.h" #include "core/message_queue.h" @@ -576,7 +576,7 @@ void SceneTree::_main_window_go_back() { } void SceneTree::_main_window_focus_in() { - InputFilter *id = InputFilter::get_singleton(); + Input *id = Input::get_singleton(); if (id) { id->ensure_touch_mouse_raised(); } @@ -1421,10 +1421,14 @@ SceneTree::SceneTree() { root->set_as_audio_listener_2d(true); current_scene = nullptr; - int msaa_mode = GLOBAL_DEF("rendering/quality/filters/msaa", 0); - ProjectSettings::get_singleton()->set_custom_property_info("rendering/quality/filters/msaa", PropertyInfo(Variant::INT, "rendering/quality/filters/msaa", PROPERTY_HINT_ENUM, "Disabled,2x,4x,8x,16x,AndroidVR 2x,AndroidVR 4x")); + int msaa_mode = GLOBAL_DEF("rendering/quality/screen_filters/msaa", 0); + ProjectSettings::get_singleton()->set_custom_property_info("rendering/quality/screen_filters/msaa", PropertyInfo(Variant::INT, "rendering/quality/screen_filters/msaa", PROPERTY_HINT_ENUM, "Disabled,2x,4x,8x,16x")); root->set_msaa(Viewport::MSAA(msaa_mode)); + int ssaa_mode = GLOBAL_DEF("rendering/quality/screen_filters/screen_space_aa", 0); + ProjectSettings::get_singleton()->set_custom_property_info("rendering/quality/screen_filters/screen_space_aa", PropertyInfo(Variant::INT, "rendering/quality/screen_filters/screen_space_aa", PROPERTY_HINT_ENUM, "Disabled,FXAA")); + root->set_screen_space_aa(Viewport::ScreenSpaceAA(ssaa_mode)); + { //load default fallback environment //get possible extensions List<String> exts; diff --git a/scene/main/shader_globals_override.cpp b/scene/main/shader_globals_override.cpp new file mode 100644 index 0000000000..13582cf655 --- /dev/null +++ b/scene/main/shader_globals_override.cpp @@ -0,0 +1,257 @@ +#include "shader_globals_override.h" + +#include "core/core_string_names.h" +#include "scene/main/window.h" +#include "scene/scene_string_names.h" + +StringName *ShaderGlobalsOverride::_remap(const StringName &p_name) const { + + StringName *r = param_remaps.getptr(p_name); + if (!r) { + //not cached, do caching + String p = p_name; + if (p.begins_with("params/")) { + String q = p.replace_first("params/", ""); + param_remaps[p] = q; + r = param_remaps.getptr(q); + } + } + + return r; +} +bool ShaderGlobalsOverride::_set(const StringName &p_name, const Variant &p_value) { + + StringName *r = _remap(p_name); + + if (r) { + Override *o = overrides.getptr(*r); + if (!o) { + Override ov; + ov.in_use = false; + overrides[*r] = ov; + o = overrides.getptr(*r); + } + if (o) { + o->override = p_value; + if (active) { + RS::get_singleton()->global_variable_set_override(*r, p_value); + } + o->in_use = p_value.get_type() != Variant::NIL; + return true; + } + } + + return false; +} + +bool ShaderGlobalsOverride::_get(const StringName &p_name, Variant &r_ret) const { + + StringName *r = _remap(p_name); + + if (r) { + const Override *o = overrides.getptr(*r); + if (o) { + r_ret = o->override; + return true; + } + } + + return false; +} + +void ShaderGlobalsOverride::_get_property_list(List<PropertyInfo> *p_list) const { + + Vector<StringName> variables; + variables = RS::get_singleton()->global_variable_get_list(); + for (int i = 0; i < variables.size(); i++) { + PropertyInfo pinfo; + pinfo.name = "params/" + variables[i]; + pinfo.usage = PROPERTY_USAGE_EDITOR | PROPERTY_USAGE_CHECKABLE; + + switch (RS::get_singleton()->global_variable_get_type(variables[i])) { + case RS::GLOBAL_VAR_TYPE_BOOL: { + pinfo.type = Variant::BOOL; + } break; + case RS::GLOBAL_VAR_TYPE_BVEC2: { + pinfo.type = Variant::INT; + pinfo.hint = PROPERTY_HINT_FLAGS; + pinfo.hint_string = "x,y"; + } break; + case RS::GLOBAL_VAR_TYPE_BVEC3: { + pinfo.type = Variant::INT; + pinfo.hint = PROPERTY_HINT_FLAGS; + pinfo.hint_string = "x,y,z"; + } break; + case RS::GLOBAL_VAR_TYPE_BVEC4: { + pinfo.type = Variant::INT; + pinfo.hint = PROPERTY_HINT_FLAGS; + pinfo.hint_string = "x,y,z,w"; + } break; + case RS::GLOBAL_VAR_TYPE_INT: { + pinfo.type = Variant::INT; + } break; + case RS::GLOBAL_VAR_TYPE_IVEC2: { + pinfo.type = Variant::VECTOR2I; + } break; + case RS::GLOBAL_VAR_TYPE_IVEC3: { + pinfo.type = Variant::VECTOR3I; + } break; + case RS::GLOBAL_VAR_TYPE_IVEC4: { + pinfo.type = Variant::PACKED_INT32_ARRAY; + } break; + case RS::GLOBAL_VAR_TYPE_RECT2I: { + pinfo.type = Variant::RECT2I; + } break; + case RS::GLOBAL_VAR_TYPE_UINT: { + pinfo.type = Variant::INT; + } break; + case RS::GLOBAL_VAR_TYPE_UVEC2: { + pinfo.type = Variant::VECTOR2I; + } break; + case RS::GLOBAL_VAR_TYPE_UVEC3: { + pinfo.type = Variant::VECTOR3I; + } break; + case RS::GLOBAL_VAR_TYPE_UVEC4: { + pinfo.type = Variant::PACKED_INT32_ARRAY; + } break; + case RS::GLOBAL_VAR_TYPE_FLOAT: { + pinfo.type = Variant::FLOAT; + } break; + case RS::GLOBAL_VAR_TYPE_VEC2: { + pinfo.type = Variant::VECTOR2; + } break; + case RS::GLOBAL_VAR_TYPE_VEC3: { + pinfo.type = Variant::VECTOR3; + } break; + case RS::GLOBAL_VAR_TYPE_VEC4: { + pinfo.type = Variant::PLANE; + } break; + case RS::GLOBAL_VAR_TYPE_RECT2: { + pinfo.type = Variant::RECT2; + } break; + case RS::GLOBAL_VAR_TYPE_COLOR: { + pinfo.type = Variant::COLOR; + } break; + case RS::GLOBAL_VAR_TYPE_MAT2: { + pinfo.type = Variant::PACKED_INT32_ARRAY; + } break; + case RS::GLOBAL_VAR_TYPE_MAT3: { + pinfo.type = Variant::BASIS; + } break; + case RS::GLOBAL_VAR_TYPE_TRANSFORM_2D: { + pinfo.type = Variant::TRANSFORM2D; + } break; + case RS::GLOBAL_VAR_TYPE_TRANSFORM: { + pinfo.type = Variant::TRANSFORM; + } break; + case RS::GLOBAL_VAR_TYPE_MAT4: { + pinfo.type = Variant::PACKED_INT32_ARRAY; + } break; + case RS::GLOBAL_VAR_TYPE_SAMPLER2D: { + pinfo.type = Variant::OBJECT; + pinfo.hint = PROPERTY_HINT_RESOURCE_TYPE; + pinfo.hint_string = "Texture2D"; + } break; + case RS::GLOBAL_VAR_TYPE_SAMPLER2DARRAY: { + pinfo.type = Variant::OBJECT; + pinfo.hint = PROPERTY_HINT_RESOURCE_TYPE; + pinfo.hint_string = "Texture2DArray"; + } break; + case RS::GLOBAL_VAR_TYPE_SAMPLER3D: { + pinfo.type = Variant::OBJECT; + pinfo.hint = PROPERTY_HINT_RESOURCE_TYPE; + pinfo.hint_string = "Texture3D"; + } break; + case RS::GLOBAL_VAR_TYPE_SAMPLERCUBE: { + pinfo.type = Variant::OBJECT; + pinfo.hint = PROPERTY_HINT_RESOURCE_TYPE; + pinfo.hint_string = "Cubemap"; + } break; + default: { + + } break; + } + + if (!overrides.has(variables[i])) { + Override o; + o.in_use = false; + Callable::CallError ce; + o.override = Variant::construct(pinfo.type, NULL, 0, ce); + overrides[variables[i]] = o; + } + + Override *o = overrides.getptr(variables[i]); + if (o->in_use && o->override.get_type() != Variant::NIL) { + pinfo.usage |= PROPERTY_USAGE_CHECKED; + pinfo.usage |= PROPERTY_USAGE_STORAGE; + } + + p_list->push_back(pinfo); + } +} + +void ShaderGlobalsOverride::_activate() { + + List<Node *> nodes; + get_tree()->get_nodes_in_group(SceneStringNames::get_singleton()->shader_overrides_group_active, &nodes); + if (nodes.size() == 0) { + //good we are the only override, enable all + active = true; + add_to_group(SceneStringNames::get_singleton()->shader_overrides_group_active); + + const StringName *K = nullptr; + while ((K = overrides.next(K))) { + Override *o = overrides.getptr(*K); + if (o->in_use && o->override.get_type() != Variant::NIL) { + RS::get_singleton()->global_variable_set_override(*K, o->override); + } + } + + update_configuration_warning(); //may have activated + } +} + +void ShaderGlobalsOverride::_notification(int p_what) { + + if (p_what == Node3D::NOTIFICATION_ENTER_TREE) { + + add_to_group(SceneStringNames::get_singleton()->shader_overrides_group); + _activate(); + + } else if (p_what == Node3D::NOTIFICATION_EXIT_TREE) { + + if (active) { + //remove overrides + const StringName *K = nullptr; + while ((K = overrides.next(K))) { + Override *o = overrides.getptr(*K); + if (o->in_use) { + RS::get_singleton()->global_variable_set_override(*K, Variant()); + } + } + } + + remove_from_group(SceneStringNames::get_singleton()->shader_overrides_group_active); + remove_from_group(SceneStringNames::get_singleton()->shader_overrides_group); + get_tree()->call_group(SceneStringNames::get_singleton()->shader_overrides_group, "_activate"); //another may want to activate when this is removed + active = false; + } +} + +String ShaderGlobalsOverride::get_configuration_warning() const { + + if (!active) { + return TTR("ShaderGlobalsOverride is not active because another node of the same type is in the scene."); + } + + return String(); +} + +void ShaderGlobalsOverride::_bind_methods() { + + ClassDB::bind_method(D_METHOD("_activate"), &ShaderGlobalsOverride::_activate); +} + +ShaderGlobalsOverride::ShaderGlobalsOverride() { + active = false; +} diff --git a/scene/main/shader_globals_override.h b/scene/main/shader_globals_override.h new file mode 100644 index 0000000000..33d0dc948f --- /dev/null +++ b/scene/main/shader_globals_override.h @@ -0,0 +1,37 @@ +#ifndef SHADER_GLOBALS_OVERRIDE_H +#define SHADER_GLOBALS_OVERRIDE_H + +#include "scene/3d/node_3d.h" + +class ShaderGlobalsOverride : public Node { + + GDCLASS(ShaderGlobalsOverride, Node); + + struct Override { + bool in_use = false; + Variant override; + }; + + StringName *_remap(const StringName &p_name) const; + + bool active; + mutable HashMap<StringName, Override> overrides; + mutable HashMap<StringName, StringName> param_remaps; + + void _activate(); + +protected: + bool _set(const StringName &p_name, const Variant &p_value); + bool _get(const StringName &p_name, Variant &r_ret) const; + void _get_property_list(List<PropertyInfo> *p_list) const; + + void _notification(int p_what); + static void _bind_methods(); + +public: + String get_configuration_warning() const; + + ShaderGlobalsOverride(); +}; + +#endif // SHADER_GLOBALS_OVERRIDE_H diff --git a/scene/main/viewport.cpp b/scene/main/viewport.cpp index 06d6e81786..b0718eed79 100644 --- a/scene/main/viewport.cpp +++ b/scene/main/viewport.cpp @@ -32,7 +32,7 @@ #include "core/core_string_names.h" #include "core/debugger/engine_debugger.h" -#include "core/input/input_filter.h" +#include "core/input/input.h" #include "core/os/os.h" #include "core/project_settings.h" #include "scene/2d/collision_object_2d.h" @@ -582,7 +582,7 @@ void Viewport::_notification(int p_what) { RS::get_singleton()->multimesh_set_visible_instances(contact_3d_debug_multimesh, point_count); } - if (physics_object_picking && (to_screen_rect == Rect2i() || InputFilter::get_singleton()->get_mouse_mode() != InputFilter::MOUSE_MODE_CAPTURED)) { + if (physics_object_picking && (to_screen_rect == Rect2i() || Input::get_singleton()->get_mouse_mode() != Input::MOUSE_MODE_CAPTURED)) { #ifndef _3D_DISABLED Vector2 last_pos(1e20, 1e20); @@ -1517,7 +1517,7 @@ Vector2 Viewport::get_mouse_position() const { void Viewport::warp_mouse(const Vector2 &p_pos) { Vector2 gpos = (get_final_transform().affine_inverse() * _get_input_pre_xform()).affine_inverse().xform(p_pos); - InputFilter::get_singleton()->warp_mouse_position(gpos); + Input::get_singleton()->warp_mouse_position(gpos); } void Viewport::_gui_sort_roots() { @@ -2091,7 +2091,7 @@ void Viewport::_gui_input_event(Ref<InputEvent> p_event) { gui.mouse_over = over; - DisplayServer::CursorShape ds_cursor_shape = (DisplayServer::CursorShape)InputFilter::get_singleton()->get_default_cursor_shape(); + DisplayServer::CursorShape ds_cursor_shape = (DisplayServer::CursorShape)Input::get_singleton()->get_default_cursor_shape(); if (over) { @@ -2411,7 +2411,7 @@ void Viewport::_gui_input_event(Ref<InputEvent> p_event) { if (from && p_event->is_pressed()) { Control *next = nullptr; - InputFilter *input = InputFilter::get_singleton(); + Input *input = Input::get_singleton(); if (p_event->is_action_pressed("ui_focus_next") && input->is_action_just_pressed("ui_focus_next")) { @@ -3064,7 +3064,7 @@ void Viewport::unhandled_input(const Ref<InputEvent> &p_event, bool p_local_coor if (physics_object_picking && !is_input_handled()) { - if (InputFilter::get_singleton()->get_mouse_mode() != InputFilter::MOUSE_MODE_CAPTURED && + if (Input::get_singleton()->get_mouse_mode() != Input::MOUSE_MODE_CAPTURED && (Object::cast_to<InputEventMouseButton>(*ev) || Object::cast_to<InputEventMouseMotion>(*ev) || Object::cast_to<InputEventScreenDrag>(*ev) || @@ -3173,7 +3173,7 @@ int Viewport::gui_get_canvas_sort_index() { void Viewport::set_msaa(MSAA p_msaa) { - ERR_FAIL_INDEX(p_msaa, 7); + ERR_FAIL_INDEX(p_msaa, MSAA_MAX); if (msaa == p_msaa) return; msaa = p_msaa; @@ -3185,6 +3185,19 @@ Viewport::MSAA Viewport::get_msaa() const { return msaa; } +void Viewport::set_screen_space_aa(ScreenSpaceAA p_screen_space_aa) { + + ERR_FAIL_INDEX(p_screen_space_aa, SCREEN_SPACE_AA_MAX); + if (screen_space_aa == p_screen_space_aa) + return; + screen_space_aa = p_screen_space_aa; + RS::get_singleton()->viewport_set_screen_space_aa(viewport, RS::ViewportScreenSpaceAA(p_screen_space_aa)); +} + +Viewport::ScreenSpaceAA Viewport::get_screen_space_aa() const { + + return screen_space_aa; +} void Viewport::set_debug_draw(DebugDraw p_debug_draw) { debug_draw = p_debug_draw; @@ -3371,6 +3384,9 @@ void Viewport::_bind_methods() { ClassDB::bind_method(D_METHOD("set_msaa", "msaa"), &Viewport::set_msaa); ClassDB::bind_method(D_METHOD("get_msaa"), &Viewport::get_msaa); + ClassDB::bind_method(D_METHOD("set_screen_space_aa", "screen_space_aa"), &Viewport::set_screen_space_aa); + ClassDB::bind_method(D_METHOD("get_screen_space_aa"), &Viewport::get_screen_space_aa); + ClassDB::bind_method(D_METHOD("set_debug_draw", "debug_draw"), &Viewport::set_debug_draw); ClassDB::bind_method(D_METHOD("get_debug_draw"), &Viewport::get_debug_draw); @@ -3444,6 +3460,7 @@ void Viewport::_bind_methods() { ADD_PROPERTY(PropertyInfo(Variant::BOOL, "handle_input_locally"), "set_handle_input_locally", "is_handling_input_locally"); ADD_GROUP("Rendering", ""); ADD_PROPERTY(PropertyInfo(Variant::INT, "msaa", PROPERTY_HINT_ENUM, "Disabled,2x,4x,8x,16x,AndroidVR 2x,AndroidVR 4x"), "set_msaa", "get_msaa"); + ADD_PROPERTY(PropertyInfo(Variant::INT, "screen_space_aa", PROPERTY_HINT_ENUM, "Disabled,FXAA"), "set_screen_space_aa", "get_screen_space_aa"); ADD_PROPERTY(PropertyInfo(Variant::INT, "debug_draw", PROPERTY_HINT_ENUM, "Disabled,Unshaded,Overdraw,Wireframe"), "set_debug_draw", "get_debug_draw"); ADD_GROUP("Canvas Items", "canvas_item_"); ADD_PROPERTY(PropertyInfo(Variant::INT, "canvas_item_default_texture_filter", PROPERTY_HINT_ENUM, "Nearest,Linear,MipmapLinear,MipmapNearest"), "set_default_canvas_item_texture_filter", "get_default_canvas_item_texture_filter"); @@ -3478,6 +3495,17 @@ void Viewport::_bind_methods() { BIND_ENUM_CONSTANT(SHADOW_ATLAS_QUADRANT_SUBDIV_1024); BIND_ENUM_CONSTANT(SHADOW_ATLAS_QUADRANT_SUBDIV_MAX); + BIND_ENUM_CONSTANT(MSAA_DISABLED); + BIND_ENUM_CONSTANT(MSAA_2X); + BIND_ENUM_CONSTANT(MSAA_4X); + BIND_ENUM_CONSTANT(MSAA_8X); + BIND_ENUM_CONSTANT(MSAA_16X); + BIND_ENUM_CONSTANT(MSAA_MAX); + + BIND_ENUM_CONSTANT(SCREEN_SPACE_AA_DISABLED); + BIND_ENUM_CONSTANT(SCREEN_SPACE_AA_FXAA); + BIND_ENUM_CONSTANT(SCREEN_SPACE_AA_MAX); + BIND_ENUM_CONSTANT(RENDER_INFO_OBJECTS_IN_FRAME); BIND_ENUM_CONSTANT(RENDER_INFO_VERTICES_IN_FRAME); BIND_ENUM_CONSTANT(RENDER_INFO_MATERIAL_CHANGES_IN_FRAME); @@ -3488,9 +3516,10 @@ void Viewport::_bind_methods() { BIND_ENUM_CONSTANT(DEBUG_DRAW_DISABLED); BIND_ENUM_CONSTANT(DEBUG_DRAW_UNSHADED); + BIND_ENUM_CONSTANT(DEBUG_DRAW_LIGHTING); BIND_ENUM_CONSTANT(DEBUG_DRAW_OVERDRAW); BIND_ENUM_CONSTANT(DEBUG_DRAW_WIREFRAME); - + BIND_ENUM_CONSTANT(DEBUG_DRAW_NORMAL_BUFFER); BIND_ENUM_CONSTANT(DEBUG_DRAW_GI_PROBE_ALBEDO); BIND_ENUM_CONSTANT(DEBUG_DRAW_GI_PROBE_LIGHTING); BIND_ENUM_CONSTANT(DEBUG_DRAW_GI_PROBE_EMISSION); @@ -3498,19 +3527,16 @@ void Viewport::_bind_methods() { BIND_ENUM_CONSTANT(DEBUG_DRAW_DIRECTIONAL_SHADOW_ATLAS); BIND_ENUM_CONSTANT(DEBUG_DRAW_SCENE_LUMINANCE); BIND_ENUM_CONSTANT(DEBUG_DRAW_SSAO); - - BIND_ENUM_CONSTANT(MSAA_DISABLED); - BIND_ENUM_CONSTANT(MSAA_2X); - BIND_ENUM_CONSTANT(MSAA_4X); - BIND_ENUM_CONSTANT(MSAA_8X); - BIND_ENUM_CONSTANT(MSAA_16X); + BIND_ENUM_CONSTANT(DEBUG_DRAW_ROUGHNESS_LIMITER); + BIND_ENUM_CONSTANT(DEBUG_DRAW_PSSM_SPLITS); + BIND_ENUM_CONSTANT(DEBUG_DRAW_DECAL_ATLAS); BIND_ENUM_CONSTANT(DEFAULT_CANVAS_ITEM_TEXTURE_FILTER_NEAREST); BIND_ENUM_CONSTANT(DEFAULT_CANVAS_ITEM_TEXTURE_FILTER_LINEAR); BIND_ENUM_CONSTANT(DEFAULT_CANVAS_ITEM_TEXTURE_FILTER_LINEAR_WITH_MIPMAPS); BIND_ENUM_CONSTANT(DEFAULT_CANVAS_ITEM_TEXTURE_FILTER_NEAREST_WITH_MIPMAPS); - BIND_ENUM_CONSTANT(DEFAULT_CANVAS_ITEM_TEXTURE_FILTER_MAX); + BIND_ENUM_CONSTANT(DEFAULT_CANVAS_ITEM_TEXTURE_REPEAT_DISABLED); BIND_ENUM_CONSTANT(DEFAULT_CANVAS_ITEM_TEXTURE_REPEAT_ENABLED); BIND_ENUM_CONSTANT(DEFAULT_CANVAS_ITEM_TEXTURE_REPEAT_MIRROR); @@ -3584,7 +3610,7 @@ Viewport::Viewport() { gui.subwindow_drag = SUB_WINDOW_DRAG_DISABLED; msaa = MSAA_DISABLED; - + screen_space_aa = SCREEN_SPACE_AA_DISABLED; debug_draw = DEBUG_DRAW_DISABLED; snap_controls_to_pixels = true; @@ -3613,13 +3639,14 @@ Viewport::~Viewport() { ///////////////////////////////// -void SubViewport::set_use_arvr(bool p_use_arvr) { - arvr = p_use_arvr; +void SubViewport::set_use_xr(bool p_use_xr) { + xr = p_use_xr; - RS::get_singleton()->viewport_set_use_arvr(get_viewport_rid(), arvr); + RS::get_singleton()->viewport_set_use_xr(get_viewport_rid(), xr); } -bool SubViewport::is_using_arvr() { - return arvr; + +bool SubViewport::is_using_xr() { + return xr; } void SubViewport::set_size(const Size2i &p_size) { @@ -3699,8 +3726,8 @@ void SubViewport::_notification(int p_what) { } void SubViewport::_bind_methods() { - ClassDB::bind_method(D_METHOD("set_use_arvr", "use"), &SubViewport::set_use_arvr); - ClassDB::bind_method(D_METHOD("is_using_arvr"), &SubViewport::is_using_arvr); + ClassDB::bind_method(D_METHOD("set_use_xr", "use"), &SubViewport::set_use_xr); + ClassDB::bind_method(D_METHOD("is_using_xr"), &SubViewport::is_using_xr); ClassDB::bind_method(D_METHOD("set_size", "size"), &SubViewport::set_size); ClassDB::bind_method(D_METHOD("get_size"), &SubViewport::get_size); @@ -3717,7 +3744,7 @@ void SubViewport::_bind_methods() { ClassDB::bind_method(D_METHOD("set_clear_mode", "mode"), &SubViewport::set_clear_mode); ClassDB::bind_method(D_METHOD("get_clear_mode"), &SubViewport::get_clear_mode); - ADD_PROPERTY(PropertyInfo(Variant::BOOL, "arvr"), "set_use_arvr", "is_using_arvr"); + ADD_PROPERTY(PropertyInfo(Variant::BOOL, "xr"), "set_use_xr", "is_using_xr"); ADD_PROPERTY(PropertyInfo(Variant::VECTOR2, "size"), "set_size", "get_size"); ADD_PROPERTY(PropertyInfo(Variant::VECTOR2, "size_2d_override"), "set_size_2d_override", "get_size_2d_override"); ADD_PROPERTY(PropertyInfo(Variant::BOOL, "size_2d_override_stretch"), "set_size_2d_override_stretch", "is_size_2d_override_stretch_enabled"); @@ -3725,19 +3752,19 @@ void SubViewport::_bind_methods() { ADD_PROPERTY(PropertyInfo(Variant::INT, "render_target_clear_mode", PROPERTY_HINT_ENUM, "Always,Never,Next Frame"), "set_clear_mode", "get_clear_mode"); ADD_PROPERTY(PropertyInfo(Variant::INT, "render_target_update_mode", PROPERTY_HINT_ENUM, "Disabled,Once,When Visible,Always"), "set_update_mode", "get_update_mode"); + BIND_ENUM_CONSTANT(CLEAR_MODE_ALWAYS); + BIND_ENUM_CONSTANT(CLEAR_MODE_NEVER); + BIND_ENUM_CONSTANT(CLEAR_MODE_ONLY_NEXT_FRAME); + BIND_ENUM_CONSTANT(UPDATE_DISABLED); BIND_ENUM_CONSTANT(UPDATE_ONCE); BIND_ENUM_CONSTANT(UPDATE_WHEN_VISIBLE); BIND_ENUM_CONSTANT(UPDATE_WHEN_PARENT_VISIBLE); BIND_ENUM_CONSTANT(UPDATE_ALWAYS); - - BIND_ENUM_CONSTANT(CLEAR_MODE_ALWAYS); - BIND_ENUM_CONSTANT(CLEAR_MODE_NEVER); - BIND_ENUM_CONSTANT(CLEAR_MODE_ONLY_NEXT_FRAME); } SubViewport::SubViewport() { - arvr = false; + xr = false; size_2d_override_stretch = false; update_mode = UPDATE_WHEN_VISIBLE; clear_mode = CLEAR_MODE_ALWAYS; diff --git a/scene/main/viewport.h b/scene/main/viewport.h index d603294ed5..7e2df9fe42 100644 --- a/scene/main/viewport.h +++ b/scene/main/viewport.h @@ -106,10 +106,16 @@ public: MSAA_4X, MSAA_8X, MSAA_16X, + MSAA_MAX }; - enum RenderInfo { + enum ScreenSpaceAA { + SCREEN_SPACE_AA_DISABLED, + SCREEN_SPACE_AA_FXAA, + SCREEN_SPACE_AA_MAX + }; + enum RenderInfo { RENDER_INFO_OBJECTS_IN_FRAME, RENDER_INFO_VERTICES_IN_FRAME, RENDER_INFO_MATERIAL_CHANGES_IN_FRAME, @@ -133,7 +139,9 @@ public: DEBUG_DRAW_DIRECTIONAL_SHADOW_ATLAS, DEBUG_DRAW_SCENE_LUMINANCE, DEBUG_DRAW_SSAO, - DEBUG_DRAW_ROUGHNESS_LIMITER + DEBUG_DRAW_ROUGHNESS_LIMITER, + DEBUG_DRAW_PSSM_SPLITS, + DEBUG_DRAW_DECAL_ATLAS }; enum DefaultCanvasItemTextureFilter { @@ -271,6 +279,7 @@ private: ShadowAtlasQuadrantSubdiv shadow_atlas_quadrant_subdiv[4]; MSAA msaa; + ScreenSpaceAA screen_space_aa; Ref<ViewportTexture> default_texture; Set<ViewportTexture *> viewport_textures; @@ -504,6 +513,9 @@ public: void set_msaa(MSAA p_msaa); MSAA get_msaa() const; + void set_screen_space_aa(ScreenSpaceAA p_screen_space_aa); + ScreenSpaceAA get_screen_space_aa() const; + Vector2 get_camera_coords(const Vector2 &p_viewport_coords) const; Vector2 get_camera_rect_size() const; @@ -589,7 +601,7 @@ public: private: UpdateMode update_mode; ClearMode clear_mode; - bool arvr; + bool xr; bool size_2d_override_stretch; protected: @@ -605,8 +617,8 @@ public: void set_size_2d_override(const Size2i &p_size); Size2i get_size_2d_override() const; - void set_use_arvr(bool p_use_arvr); - bool is_using_arvr(); + void set_use_xr(bool p_use_xr); + bool is_using_xr(); void set_size_2d_override_stretch(bool p_enable); bool is_size_2d_override_stretch_enabled() const; @@ -623,6 +635,7 @@ public: VARIANT_ENUM_CAST(SubViewport::UpdateMode); VARIANT_ENUM_CAST(Viewport::ShadowAtlasQuadrantSubdiv); VARIANT_ENUM_CAST(Viewport::MSAA); +VARIANT_ENUM_CAST(Viewport::ScreenSpaceAA); VARIANT_ENUM_CAST(Viewport::DebugDraw); VARIANT_ENUM_CAST(SubViewport::ClearMode); VARIANT_ENUM_CAST(Viewport::RenderInfo); diff --git a/scene/main/window.cpp b/scene/main/window.cpp index 45982e0e93..19954299de 100644 --- a/scene/main/window.cpp +++ b/scene/main/window.cpp @@ -909,7 +909,7 @@ void Window::_window_input_text(const String &p_text) { input_text(p_text); } void Window::_window_drop_files(const Vector<String> &p_files) { - emit_signal("files_dropped", p_files); + emit_signal("files_dropped", p_files, current_screen); } Viewport *Window::get_parent_viewport() const { diff --git a/scene/register_scene_types.cpp b/scene/register_scene_types.cpp index 94162cbe4e..dc3ef5b508 100644 --- a/scene/register_scene_types.cpp +++ b/scene/register_scene_types.cpp @@ -177,9 +177,10 @@ #include "scene/3d/node_3d.h" #include "scene/3d/skeleton_3d.h" +#include "scene/main/shader_globals_override.h" + #ifndef _3D_DISABLED #include "scene/3d/area_3d.h" -#include "scene/3d/arvr_nodes.h" #include "scene/3d/audio_stream_player_3d.h" #include "scene/3d/baked_lightmap.h" #include "scene/3d/bone_attachment_3d.h" @@ -187,6 +188,7 @@ #include "scene/3d/collision_polygon_3d.h" #include "scene/3d/collision_shape_3d.h" #include "scene/3d/cpu_particles_3d.h" +#include "scene/3d/decal.h" #include "scene/3d/gi_probe.h" #include "scene/3d/gpu_particles_3d.h" #include "scene/3d/immediate_geometry_3d.h" @@ -213,6 +215,7 @@ #include "scene/3d/vehicle_body_3d.h" #include "scene/3d/visibility_notifier_3d.h" #include "scene/3d/world_environment.h" +#include "scene/3d/xr_nodes.h" #include "scene/resources/environment.h" #include "scene/resources/mesh_library.h" #endif @@ -402,6 +405,8 @@ void register_scene_types() { ClassDB::register_class<AnimationNodeTimeSeek>(); ClassDB::register_class<AnimationNodeTransition>(); + ClassDB::register_class<ShaderGlobalsOverride>(); //can be used in any shader + OS::get_singleton()->yield(); //may take time to init #ifndef _3D_DISABLED @@ -410,10 +415,10 @@ void register_scene_types() { ClassDB::register_class<Camera3D>(); ClassDB::register_class<ClippedCamera3D>(); ClassDB::register_class<Listener3D>(); - ClassDB::register_class<ARVRCamera>(); - ClassDB::register_class<ARVRController>(); - ClassDB::register_class<ARVRAnchor>(); - ClassDB::register_class<ARVROrigin>(); + ClassDB::register_class<XRCamera3D>(); + ClassDB::register_class<XRController3D>(); + ClassDB::register_class<XRAnchor3D>(); + ClassDB::register_class<XROrigin3D>(); ClassDB::register_class<MeshInstance3D>(); ClassDB::register_class<ImmediateGeometry3D>(); ClassDB::register_virtual_class<SpriteBase3D>(); @@ -424,6 +429,7 @@ void register_scene_types() { ClassDB::register_class<OmniLight3D>(); ClassDB::register_class<SpotLight3D>(); ClassDB::register_class<ReflectionProbe>(); + ClassDB::register_class<Decal>(); ClassDB::register_class<GIProbe>(); ClassDB::register_class<GIProbeData>(); //ClassDB::register_class<BakedLightmap>(); @@ -751,8 +757,16 @@ void register_scene_types() { ClassDB::add_compatibility_class("AnimationTreePlayer", "AnimationTree"); // Renamed in 4.0. + // Keep alphabetical ordering to easily locate classes and avoid duplicates. ClassDB::add_compatibility_class("AnimatedSprite", "AnimatedSprite2D"); ClassDB::add_compatibility_class("Area", "Area3D"); + ClassDB::add_compatibility_class("ARVRCamera", "XRCamera3D"); + ClassDB::add_compatibility_class("ARVRController", "XRController3D"); + ClassDB::add_compatibility_class("ARVRAnchor", "XRAnchor3D"); + ClassDB::add_compatibility_class("ARVRInterface", "XRInterface"); + ClassDB::add_compatibility_class("ARVROrigin", "XROrigin3D"); + ClassDB::add_compatibility_class("ARVRPositionalTracker", "XRPositionalTracker"); + ClassDB::add_compatibility_class("ARVRServer", "XRServer"); ClassDB::add_compatibility_class("BoneAttachment", "BoneAttachment3D"); ClassDB::add_compatibility_class("BoxShape", "BoxShape3D"); ClassDB::add_compatibility_class("BulletPhysicsDirectBodyState", "BulletPhysicsDirectBodyState3D"); @@ -800,6 +814,7 @@ void register_scene_types() { ClassDB::add_compatibility_class("Navigation2DServer", "NavigationServer2D"); ClassDB::add_compatibility_class("NavigationServer", "NavigationServer3D"); ClassDB::add_compatibility_class("OmniLight", "OmniLight3D"); + ClassDB::add_compatibility_class("PanoramaSky", "Sky"); ClassDB::add_compatibility_class("Particles", "GPUParticles3D"); ClassDB::add_compatibility_class("Particles2D", "GPUParticles2D"); ClassDB::add_compatibility_class("Path", "Path3D"); @@ -821,6 +836,7 @@ void register_scene_types() { ClassDB::add_compatibility_class("PhysicsShapeQueryResult", "PhysicsShapeQueryResult3D"); ClassDB::add_compatibility_class("PinJoint", "PinJoint3D"); ClassDB::add_compatibility_class("PlaneShape", "WorldMarginShape3D"); + ClassDB::add_compatibility_class("ProceduralSky", "Sky"); ClassDB::add_compatibility_class("ProximityGroup", "ProximityGroup3D"); ClassDB::add_compatibility_class("RayCast", "RayCast3D"); ClassDB::add_compatibility_class("RayShape", "RayShape3D"); @@ -851,8 +867,6 @@ void register_scene_types() { ClassDB::add_compatibility_class("VisualShaderNodeScalarOp", "VisualShaderNodeFloatOp"); ClassDB::add_compatibility_class("VisualShaderNodeScalarUniform", "VisualShaderNodeFloatUniform"); ClassDB::add_compatibility_class("World", "World3D"); - ClassDB::add_compatibility_class("ProceduralSky", "Sky"); - ClassDB::add_compatibility_class("PanoramaSky", "Sky"); #endif 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/default_theme/default_theme.cpp b/scene/resources/default_theme/default_theme.cpp index e6f09eb034..a1e8bf51bd 100644 --- a/scene/resources/default_theme/default_theme.cpp +++ b/scene/resources/default_theme/default_theme.cpp @@ -497,6 +497,7 @@ void fill_default_theme(Ref<Theme> &theme, const Ref<Font> &default_font, const theme->set_stylebox("slider", "HSlider", make_stylebox(hslider_bg_png, 4, 4, 4, 4)); theme->set_stylebox("grabber_area", "HSlider", make_stylebox(hslider_bg_png, 4, 4, 4, 4)); + theme->set_stylebox("grabber_area_highlight", "HSlider", make_stylebox(hslider_bg_png, 4, 4, 4, 4)); theme->set_icon("grabber", "HSlider", make_icon(hslider_grabber_png)); theme->set_icon("grabber_highlight", "HSlider", make_icon(hslider_grabber_hl_png)); @@ -507,6 +508,7 @@ void fill_default_theme(Ref<Theme> &theme, const Ref<Font> &default_font, const theme->set_stylebox("slider", "VSlider", make_stylebox(vslider_bg_png, 4, 4, 4, 4)); theme->set_stylebox("grabber_area", "VSlider", make_stylebox(vslider_bg_png, 4, 4, 4, 4)); + theme->set_stylebox("grabber_area_highlight", "VSlider", make_stylebox(vslider_bg_png, 4, 4, 4, 4)); theme->set_icon("grabber", "VSlider", make_icon(vslider_grabber_png)); theme->set_icon("grabber_highlight", "VSlider", make_icon(vslider_grabber_hl_png)); diff --git a/scene/resources/dynamic_font.cpp b/scene/resources/dynamic_font.cpp index a613b01376..eea4d12d0e 100644 --- a/scene/resources/dynamic_font.cpp +++ b/scene/resources/dynamic_font.cpp @@ -1064,7 +1064,7 @@ void DynamicFont::update_oversampling() { ///////////////////////// -RES ResourceFormatLoaderDynamicFont::load(const String &p_path, const String &p_original_path, Error *r_error, bool p_use_sub_threads, float *r_progress) { +RES ResourceFormatLoaderDynamicFont::load(const String &p_path, const String &p_original_path, Error *r_error, bool p_use_sub_threads, float *r_progress, bool p_no_cache) { if (r_error) *r_error = ERR_FILE_CANT_OPEN; diff --git a/scene/resources/dynamic_font.h b/scene/resources/dynamic_font.h index 9e628fc35a..ef4b9dd9d0 100644 --- a/scene/resources/dynamic_font.h +++ b/scene/resources/dynamic_font.h @@ -302,7 +302,7 @@ VARIANT_ENUM_CAST(DynamicFont::SpacingType); class ResourceFormatLoaderDynamicFont : public ResourceFormatLoader { public: - virtual RES load(const String &p_path, const String &p_original_path = "", Error *r_error = nullptr, bool p_use_sub_threads = false, float *r_progress = nullptr); + virtual RES load(const String &p_path, const String &p_original_path = "", Error *r_error = nullptr, bool p_use_sub_threads = false, float *r_progress = nullptr, bool p_no_cache = false); virtual void get_recognized_extensions(List<String> *p_extensions) const; virtual bool handles_type(const String &p_type) const; virtual String get_resource_type(const String &p_path) const; diff --git a/scene/resources/environment.cpp b/scene/resources/environment.cpp index 835fef81e1..02ea5b24b8 100644 --- a/scene/resources/environment.cpp +++ b/scene/resources/environment.cpp @@ -1004,8 +1004,8 @@ void Environment::_bind_methods() { ADD_GROUP("SSAO", "ssao_"); ADD_PROPERTY(PropertyInfo(Variant::BOOL, "ssao_enabled"), "set_ssao_enabled", "is_ssao_enabled"); - ADD_PROPERTY(PropertyInfo(Variant::FLOAT, "ssao_radius", PROPERTY_HINT_RANGE, "0.1,128,0.1"), "set_ssao_radius", "get_ssao_radius"); - ADD_PROPERTY(PropertyInfo(Variant::FLOAT, "ssao_intensity", PROPERTY_HINT_RANGE, "0.0,128,0.1"), "set_ssao_intensity", "get_ssao_intensity"); + ADD_PROPERTY(PropertyInfo(Variant::FLOAT, "ssao_radius", PROPERTY_HINT_RANGE, "0.1,128,0.01"), "set_ssao_radius", "get_ssao_radius"); + ADD_PROPERTY(PropertyInfo(Variant::FLOAT, "ssao_intensity", PROPERTY_HINT_RANGE, "0.0,128,0.01"), "set_ssao_intensity", "get_ssao_intensity"); ADD_PROPERTY(PropertyInfo(Variant::FLOAT, "ssao_bias", PROPERTY_HINT_RANGE, "0.001,8,0.001"), "set_ssao_bias", "get_ssao_bias"); ADD_PROPERTY(PropertyInfo(Variant::FLOAT, "ssao_light_affect", PROPERTY_HINT_RANGE, "0.00,1,0.01"), "set_ssao_direct_light_affect", "get_ssao_direct_light_affect"); ADD_PROPERTY(PropertyInfo(Variant::FLOAT, "ssao_ao_channel_affect", PROPERTY_HINT_RANGE, "0.00,1,0.01"), "set_ssao_ao_channel_affect", "get_ssao_ao_channel_affect"); diff --git a/scene/resources/font.cpp b/scene/resources/font.cpp index 192eefbf6a..267816f267 100644 --- a/scene/resources/font.cpp +++ b/scene/resources/font.cpp @@ -646,7 +646,7 @@ BitmapFont::~BitmapFont() { //////////// -RES ResourceFormatLoaderBMFont::load(const String &p_path, const String &p_original_path, Error *r_error, bool p_use_sub_threads, float *r_progress) { +RES ResourceFormatLoaderBMFont::load(const String &p_path, const String &p_original_path, Error *r_error, bool p_use_sub_threads, float *r_progress, bool p_no_cache) { if (r_error) *r_error = ERR_FILE_CANT_OPEN; diff --git a/scene/resources/font.h b/scene/resources/font.h index ce75f27e2a..c233344529 100644 --- a/scene/resources/font.h +++ b/scene/resources/font.h @@ -200,7 +200,7 @@ public: class ResourceFormatLoaderBMFont : public ResourceFormatLoader { public: - virtual RES load(const String &p_path, const String &p_original_path = "", Error *r_error = nullptr, bool p_use_sub_threads = false, float *r_progress = nullptr); + virtual RES load(const String &p_path, const String &p_original_path = "", Error *r_error = nullptr, bool p_use_sub_threads = false, float *r_progress = nullptr, bool p_no_cache = false); virtual void get_recognized_extensions(List<String> *p_extensions) const; virtual bool handles_type(const String &p_type) const; virtual String get_resource_type(const String &p_path) const; 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/material.cpp b/scene/resources/material.cpp index 85adc8c5f1..fd8cff7cd0 100644 --- a/scene/resources/material.cpp +++ b/scene/resources/material.cpp @@ -314,7 +314,7 @@ void BaseMaterial3D::init_shaders() { shader_names->anisotropy = "anisotropy_ratio"; shader_names->heightmap_scale = "heightmap_scale"; shader_names->subsurface_scattering_strength = "subsurface_scattering_strength"; - shader_names->transmission = "transmission"; + shader_names->backlight = "backlight"; shader_names->refraction = "refraction"; shader_names->point_size = "point_size"; shader_names->uv1_scale = "uv1_scale"; @@ -347,6 +347,11 @@ void BaseMaterial3D::init_shaders() { shader_names->refraction_texture_channel = "refraction_texture_channel"; shader_names->alpha_scissor_threshold = "alpha_scissor_threshold"; + shader_names->transmittance_color = "transmittance_color"; + shader_names->transmittance_curve = "transmittance_curve"; + shader_names->transmittance_depth = "transmittance_depth"; + shader_names->transmittance_boost = "transmittance_boost"; + shader_names->texture_names[TEXTURE_ALBEDO] = "texture_albedo"; shader_names->texture_names[TEXTURE_METALLIC] = "texture_metallic"; shader_names->texture_names[TEXTURE_ROUGHNESS] = "texture_roughness"; @@ -358,7 +363,8 @@ void BaseMaterial3D::init_shaders() { shader_names->texture_names[TEXTURE_AMBIENT_OCCLUSION] = "texture_ambient_occlusion"; shader_names->texture_names[TEXTURE_HEIGHTMAP] = "texture_heightmap"; shader_names->texture_names[TEXTURE_SUBSURFACE_SCATTERING] = "texture_subsurface_scattering"; - shader_names->texture_names[TEXTURE_TRANSMISSION] = "texture_transmission"; + shader_names->texture_names[TEXTURE_SUBSURFACE_TRANSMITTANCE] = "texture_subsurface_transmittance"; + shader_names->texture_names[TEXTURE_BACKLIGHT] = "texture_backlight"; shader_names->texture_names[TEXTURE_REFRACTION] = "texture_refraction"; shader_names->texture_names[TEXTURE_DETAIL_MASK] = "texture_detail_mask"; shader_names->texture_names[TEXTURE_DETAIL_ALBEDO] = "texture_detail_albedo"; @@ -385,7 +391,7 @@ void BaseMaterial3D::_update_shader() { dirty_materials->remove(&element); MaterialKey mk = _compute_key(); - if (mk.key == current_key.key) + if (mk == current_key) return; //no update required in the end if (shader_map.has(current_key)) { @@ -444,9 +450,6 @@ void BaseMaterial3D::_update_shader() { case DEPTH_DRAW_DISABLED: code += ",depth_draw_never"; break; } - if (features[FEATURE_SUBSURACE_SCATTERING] && flags[FLAG_SUBSURFACE_MODE_SKIN]) { - code += ",sss_mode_skin"; - } if (transparency == TRANSPARENCY_ALPHA_DEPTH_PRE_PASS) { code += ",depth_prepass_alpha"; } @@ -470,6 +473,9 @@ void BaseMaterial3D::_update_shader() { case SPECULAR_TOON: code += ",specular_toon"; break; case SPECULAR_DISABLED: code += ",specular_disabled"; break; } + if (features[FEATURE_SUBSURFACE_SCATTERING] && flags[FLAG_SUBSURFACE_MODE_SKIN]) { + code += ",sss_mode_skin"; + } if (shading_mode == SHADING_MODE_UNSHADED) { code += ",unshaded"; @@ -589,16 +595,25 @@ void BaseMaterial3D::_update_shader() { code += "uniform sampler2D texture_detail_mask : hint_white," + texfilter_str + ";\n"; } - if (features[FEATURE_SUBSURACE_SCATTERING]) { + if (features[FEATURE_SUBSURFACE_SCATTERING]) { code += "uniform float subsurface_scattering_strength : hint_range(0,1);\n"; code += "uniform sampler2D texture_subsurface_scattering : hint_white," + texfilter_str + ";\n"; } - if (features[FEATURE_TRANSMISSION]) { + if (features[FEATURE_SUBSURFACE_TRANSMITTANCE]) { - code += "uniform vec4 transmission : hint_color;\n"; - code += "uniform sampler2D texture_transmission : hint_black," + texfilter_str + ";\n"; + code += "uniform vec4 transmittance_color : hint_color;\n"; + code += "uniform float transmittance_depth;\n"; + code += "uniform sampler2D texture_subsurface_transmittance : hint_white," + texfilter_str + ";\n"; + code += "uniform float transmittance_curve;\n"; + code += "uniform float transmittance_boost;\n"; + } + + if (features[FEATURE_BACKLIGHT]) { + + code += "uniform vec4 backlight : hint_color;\n"; + code += "uniform sampler2D texture_backlight : hint_black," + texfilter_str + ";\n"; } if (features[FEATURE_HEIGHT_MAPPING]) { @@ -1051,7 +1066,7 @@ void BaseMaterial3D::_update_shader() { code += "\tAO_LIGHT_AFFECT = ao_light_affect;\n"; } - if (features[FEATURE_SUBSURACE_SCATTERING]) { + if (features[FEATURE_SUBSURFACE_SCATTERING]) { if (flags[FLAG_UV1_USE_TRIPLANAR]) { code += "\tfloat sss_tex = triplanar_texture(texture_subsurface_scattering,uv1_power_normal,uv1_triplanar_pos).r;\n"; @@ -1061,13 +1076,27 @@ void BaseMaterial3D::_update_shader() { code += "\tSSS_STRENGTH=subsurface_scattering_strength*sss_tex;\n"; } - if (features[FEATURE_TRANSMISSION]) { + if (features[FEATURE_SUBSURFACE_TRANSMITTANCE]) { + + if (flags[FLAG_UV1_USE_TRIPLANAR]) { + code += "\tvec4 trans_color_tex = triplanar_texture(texture_subsurface_transmittance,uv1_power_normal,uv1_triplanar_pos);\n"; + } else { + code += "\tvec4 trans_color_tex = texture(texture_subsurface_transmittance,base_uv);\n"; + } + code += "\tSSS_TRANSMITTANCE_COLOR=transmittance_color*trans_color_tex;\n"; + + code += "\tSSS_TRANSMITTANCE_DEPTH=transmittance_depth;\n"; + code += "\tSSS_TRANSMITTANCE_CURVE=transmittance_curve;\n"; + code += "\tSSS_TRANSMITTANCE_BOOST=transmittance_boost;\n"; + } + + if (features[FEATURE_BACKLIGHT]) { if (flags[FLAG_UV1_USE_TRIPLANAR]) { - code += "\tvec3 transmission_tex = triplanar_texture(texture_transmission,uv1_power_normal,uv1_triplanar_pos).rgb;\n"; + code += "\tvec3 backlight_tex = triplanar_texture(texture_backlight,uv1_power_normal,uv1_triplanar_pos).rgb;\n"; } else { - code += "\tvec3 transmission_tex = texture(texture_transmission,base_uv).rgb;\n"; + code += "\tvec3 backlight_tex = texture(texture_backlight,base_uv).rgb;\n"; } - code += "\tTRANSMISSION = (transmission.rgb+transmission_tex);\n"; + code += "\tBACKLIGHT = (backlight.rgb+backlight_tex);\n"; } if (features[FEATURE_DETAIL]) { @@ -1309,15 +1338,48 @@ float BaseMaterial3D::get_subsurface_scattering_strength() const { return subsurface_scattering_strength; } -void BaseMaterial3D::set_transmission(const Color &p_transmission) { +void BaseMaterial3D::set_transmittance_color(const Color &p_color) { + transmittance_color = p_color; + RS::get_singleton()->material_set_param(_get_material(), shader_names->transmittance_color, p_color); +} - transmission = p_transmission; - RS::get_singleton()->material_set_param(_get_material(), shader_names->transmission, transmission); +Color BaseMaterial3D::get_transmittance_color() const { + return transmittance_color; } -Color BaseMaterial3D::get_transmission() const { +void BaseMaterial3D::set_transmittance_depth(float p_depth) { + transmittance_depth = p_depth; + RS::get_singleton()->material_set_param(_get_material(), shader_names->transmittance_depth, p_depth); +} +float BaseMaterial3D::get_transmittance_depth() const { + return transmittance_depth; +} - return transmission; +void BaseMaterial3D::set_transmittance_curve(float p_curve) { + transmittance_curve = p_curve; + RS::get_singleton()->material_set_param(_get_material(), shader_names->transmittance_curve, p_curve); +} +float BaseMaterial3D::get_transmittance_curve() const { + return transmittance_curve; +} + +void BaseMaterial3D::set_transmittance_boost(float p_boost) { + transmittance_boost = p_boost; + RS::get_singleton()->material_set_param(_get_material(), shader_names->transmittance_boost, p_boost); +} +float BaseMaterial3D::get_transmittance_boost() const { + return transmittance_boost; +} + +void BaseMaterial3D::set_backlight(const Color &p_backlight) { + + backlight = p_backlight; + RS::get_singleton()->material_set_param(_get_material(), shader_names->backlight, backlight); +} + +Color BaseMaterial3D::get_backlight() const { + + return backlight; } void BaseMaterial3D::set_refraction(float p_refraction) { @@ -1457,7 +1519,7 @@ void BaseMaterial3D::set_flag(Flags p_flag, bool p_enabled) { return; flags[p_flag] = p_enabled; - if ((p_flag == FLAG_USE_SHADOW_TO_OPACITY) || (p_flag == FLAG_USE_TEXTURE_REPEAT)) { + if (p_flag == FLAG_USE_SHADOW_TO_OPACITY || p_flag == FLAG_USE_TEXTURE_REPEAT || p_flag == FLAG_SUBSURFACE_MODE_SKIN) { _change_notify(); } _queue_shader_change(); @@ -1540,8 +1602,8 @@ void BaseMaterial3D::_validate_property(PropertyInfo &property) const { _validate_feature("anisotropy", FEATURE_ANISOTROPY, property); _validate_feature("ao", FEATURE_AMBIENT_OCCLUSION, property); _validate_feature("heightmap", FEATURE_HEIGHT_MAPPING, property); - _validate_feature("subsurf_scatter", FEATURE_SUBSURACE_SCATTERING, property); - _validate_feature("transmission", FEATURE_TRANSMISSION, property); + _validate_feature("subsurf_scatter", FEATURE_SUBSURFACE_SCATTERING, property); + _validate_feature("backlight", FEATURE_BACKLIGHT, property); _validate_feature("refraction", FEATURE_REFRACTION, property); _validate_feature("detail", FEATURE_DETAIL, property); @@ -1575,6 +1637,10 @@ void BaseMaterial3D::_validate_property(PropertyInfo &property) const { property.usage = 0; } + if (flags[FLAG_SUBSURFACE_MODE_SKIN] && (property.name == "subsurf_scatter_transmittance_color" || property.name == "subsurf_scatter_transmittance_texture" || property.name == "subsurf_scatter_transmittance_curve")) { + property.usage = 0; + } + if (orm) { if (property.name == "shading_mode") { @@ -1631,7 +1697,11 @@ void BaseMaterial3D::_validate_property(PropertyInfo &property) const { property.usage = 0; } - if (property.name.begins_with("transmission")) { + if (property.name.begins_with("backlight")) { + property.usage = 0; + } + + if (property.name.begins_with("transmittance")) { property.usage = 0; } } @@ -2070,8 +2140,20 @@ void BaseMaterial3D::_bind_methods() { ClassDB::bind_method(D_METHOD("set_subsurface_scattering_strength", "strength"), &BaseMaterial3D::set_subsurface_scattering_strength); ClassDB::bind_method(D_METHOD("get_subsurface_scattering_strength"), &BaseMaterial3D::get_subsurface_scattering_strength); - ClassDB::bind_method(D_METHOD("set_transmission", "transmission"), &BaseMaterial3D::set_transmission); - ClassDB::bind_method(D_METHOD("get_transmission"), &BaseMaterial3D::get_transmission); + ClassDB::bind_method(D_METHOD("set_transmittance_color", "color"), &BaseMaterial3D::set_transmittance_color); + ClassDB::bind_method(D_METHOD("get_transmittance_color"), &BaseMaterial3D::get_transmittance_color); + + ClassDB::bind_method(D_METHOD("set_transmittance_depth", "depth"), &BaseMaterial3D::set_transmittance_depth); + ClassDB::bind_method(D_METHOD("get_transmittance_depth"), &BaseMaterial3D::get_transmittance_depth); + + ClassDB::bind_method(D_METHOD("set_transmittance_curve", "curve"), &BaseMaterial3D::set_transmittance_curve); + ClassDB::bind_method(D_METHOD("get_transmittance_curve"), &BaseMaterial3D::get_transmittance_curve); + + ClassDB::bind_method(D_METHOD("set_transmittance_boost", "boost"), &BaseMaterial3D::set_transmittance_boost); + ClassDB::bind_method(D_METHOD("get_transmittance_boost"), &BaseMaterial3D::get_transmittance_boost); + + ClassDB::bind_method(D_METHOD("set_backlight", "backlight"), &BaseMaterial3D::set_backlight); + ClassDB::bind_method(D_METHOD("get_backlight"), &BaseMaterial3D::get_backlight); ClassDB::bind_method(D_METHOD("set_refraction", "refraction"), &BaseMaterial3D::set_refraction); ClassDB::bind_method(D_METHOD("get_refraction"), &BaseMaterial3D::get_refraction); @@ -2285,15 +2367,23 @@ void BaseMaterial3D::_bind_methods() { ADD_PROPERTYI(PropertyInfo(Variant::BOOL, "heightmap_flip_texture"), "set_flag", "get_flag", FLAG_INVERT_HEIGHTMAP); ADD_GROUP("Subsurf Scatter", "subsurf_scatter_"); - ADD_PROPERTYI(PropertyInfo(Variant::BOOL, "subsurf_scatter_enabled"), "set_feature", "get_feature", FEATURE_SUBSURACE_SCATTERING); + ADD_PROPERTYI(PropertyInfo(Variant::BOOL, "subsurf_scatter_enabled"), "set_feature", "get_feature", FEATURE_SUBSURFACE_SCATTERING); ADD_PROPERTY(PropertyInfo(Variant::FLOAT, "subsurf_scatter_strength", PROPERTY_HINT_RANGE, "0,1,0.01"), "set_subsurface_scattering_strength", "get_subsurface_scattering_strength"); ADD_PROPERTYI(PropertyInfo(Variant::BOOL, "subsurf_scatter_skin_mode"), "set_flag", "get_flag", FLAG_SUBSURFACE_MODE_SKIN); ADD_PROPERTYI(PropertyInfo(Variant::OBJECT, "subsurf_scatter_texture", PROPERTY_HINT_RESOURCE_TYPE, "Texture2D"), "set_texture", "get_texture", TEXTURE_SUBSURFACE_SCATTERING); - ADD_GROUP("Transmission", "transmission_"); - ADD_PROPERTYI(PropertyInfo(Variant::BOOL, "transmission_enabled"), "set_feature", "get_feature", FEATURE_TRANSMISSION); - ADD_PROPERTY(PropertyInfo(Variant::COLOR, "transmission", PROPERTY_HINT_COLOR_NO_ALPHA), "set_transmission", "get_transmission"); - ADD_PROPERTYI(PropertyInfo(Variant::OBJECT, "transmission_texture", PROPERTY_HINT_RESOURCE_TYPE, "Texture2D"), "set_texture", "get_texture", TEXTURE_TRANSMISSION); + ADD_SUBGROUP("Transmittance", "subsurf_scatter_transmittance_"); + ADD_PROPERTYI(PropertyInfo(Variant::BOOL, "subsurf_scatter_transmittance_enabled"), "set_feature", "get_feature", FEATURE_SUBSURFACE_TRANSMITTANCE); + ADD_PROPERTY(PropertyInfo(Variant::COLOR, "subsurf_scatter_transmittance_color"), "set_transmittance_color", "get_transmittance_color"); + ADD_PROPERTYI(PropertyInfo(Variant::OBJECT, "subsurf_scatter_transmittance_texture", PROPERTY_HINT_RESOURCE_TYPE, "Texture2D"), "set_texture", "get_texture", TEXTURE_SUBSURFACE_TRANSMITTANCE); + ADD_PROPERTY(PropertyInfo(Variant::FLOAT, "subsurf_scatter_transmittance_depth", PROPERTY_HINT_RANGE, "0.001,8,0.001,or_greater"), "set_transmittance_depth", "get_transmittance_depth"); + ADD_PROPERTY(PropertyInfo(Variant::FLOAT, "subsurf_scatter_transmittance_curve", PROPERTY_HINT_EXP_EASING, "0.01,16,0.01"), "set_transmittance_curve", "get_transmittance_curve"); + ADD_PROPERTY(PropertyInfo(Variant::FLOAT, "subsurf_scatter_transmittance_boost", PROPERTY_HINT_RANGE, "0.00,1.0,0.01"), "set_transmittance_boost", "get_transmittance_boost"); + + ADD_GROUP("Back Lighting", "backlight_"); + ADD_PROPERTYI(PropertyInfo(Variant::BOOL, "backlight_enabled"), "set_feature", "get_feature", FEATURE_BACKLIGHT); + ADD_PROPERTY(PropertyInfo(Variant::COLOR, "backlight", PROPERTY_HINT_COLOR_NO_ALPHA), "set_backlight", "get_backlight"); + ADD_PROPERTYI(PropertyInfo(Variant::OBJECT, "backlight_texture", PROPERTY_HINT_RESOURCE_TYPE, "Texture2D"), "set_texture", "get_texture", TEXTURE_BACKLIGHT); ADD_GROUP("Refraction", "refraction_"); ADD_PROPERTYI(PropertyInfo(Variant::BOOL, "refraction_enabled"), "set_feature", "get_feature", FEATURE_REFRACTION); @@ -2366,7 +2456,8 @@ void BaseMaterial3D::_bind_methods() { BIND_ENUM_CONSTANT(TEXTURE_AMBIENT_OCCLUSION); BIND_ENUM_CONSTANT(TEXTURE_HEIGHTMAP); BIND_ENUM_CONSTANT(TEXTURE_SUBSURFACE_SCATTERING); - BIND_ENUM_CONSTANT(TEXTURE_TRANSMISSION); + BIND_ENUM_CONSTANT(TEXTURE_SUBSURFACE_TRANSMITTANCE); + BIND_ENUM_CONSTANT(TEXTURE_BACKLIGHT); BIND_ENUM_CONSTANT(TEXTURE_REFRACTION); BIND_ENUM_CONSTANT(TEXTURE_DETAIL_MASK); BIND_ENUM_CONSTANT(TEXTURE_DETAIL_ALBEDO); @@ -2403,8 +2494,9 @@ void BaseMaterial3D::_bind_methods() { BIND_ENUM_CONSTANT(FEATURE_ANISOTROPY); BIND_ENUM_CONSTANT(FEATURE_AMBIENT_OCCLUSION); BIND_ENUM_CONSTANT(FEATURE_HEIGHT_MAPPING); - BIND_ENUM_CONSTANT(FEATURE_SUBSURACE_SCATTERING); - BIND_ENUM_CONSTANT(FEATURE_TRANSMISSION); + BIND_ENUM_CONSTANT(FEATURE_SUBSURFACE_SCATTERING); + BIND_ENUM_CONSTANT(FEATURE_SUBSURFACE_TRANSMITTANCE); + BIND_ENUM_CONSTANT(FEATURE_BACKLIGHT); BIND_ENUM_CONSTANT(FEATURE_REFRACTION); BIND_ENUM_CONSTANT(FEATURE_DETAIL); BIND_ENUM_CONSTANT(FEATURE_MAX); @@ -2496,7 +2588,11 @@ BaseMaterial3D::BaseMaterial3D(bool p_orm) : set_anisotropy(0); set_heightmap_scale(0.05); set_subsurface_scattering_strength(0); - set_transmission(Color(0, 0, 0)); + set_backlight(Color(0, 0, 0)); + set_transmittance_color(Color(1, 1, 1, 1)); + set_transmittance_depth(0.1); + set_transmittance_curve(1.0); + set_transmittance_boost(0.0); set_refraction(0.05); set_point_size(1); set_uv1_offset(Vector3(0, 0, 0)); @@ -2552,7 +2648,8 @@ BaseMaterial3D::BaseMaterial3D(bool p_orm) : features[i] = false; } - current_key.key = 0; + current_key.key0 = 0; + current_key.key1 = 0; current_key.invalid_key = 1; texture_filter = TEXTURE_FILTER_LINEAR_WITH_MIPMAPS; _queue_shader_change(); diff --git a/scene/resources/material.h b/scene/resources/material.h index 57f9038bf5..241357ba9b 100644 --- a/scene/resources/material.h +++ b/scene/resources/material.h @@ -125,7 +125,8 @@ public: TEXTURE_AMBIENT_OCCLUSION, TEXTURE_HEIGHTMAP, TEXTURE_SUBSURFACE_SCATTERING, - TEXTURE_TRANSMISSION, + TEXTURE_SUBSURFACE_TRANSMITTANCE, + TEXTURE_BACKLIGHT, TEXTURE_REFRACTION, TEXTURE_DETAIL_MASK, TEXTURE_DETAIL_ALBEDO, @@ -173,8 +174,9 @@ public: FEATURE_ANISOTROPY, FEATURE_AMBIENT_OCCLUSION, FEATURE_HEIGHT_MAPPING, - FEATURE_SUBSURACE_SCATTERING, - FEATURE_TRANSMISSION, + FEATURE_SUBSURFACE_SCATTERING, + FEATURE_SUBSURFACE_TRANSMITTANCE, + FEATURE_BACKLIGHT, FEATURE_REFRACTION, FEATURE_DETAIL, FEATURE_MAX @@ -291,10 +293,16 @@ private: uint64_t roughness_channel : 3; }; - uint64_t key; + struct { + uint64_t key0; + uint64_t key1; + }; + bool operator==(const MaterialKey &p_key) const { + return (key0 == p_key.key0) && (key1 == p_key.key1); + } bool operator<(const MaterialKey &p_key) const { - return key < p_key.key; + return (key0 == p_key.key0) ? (key1 < p_key.key1) : (key0 < p_key.key0); } }; @@ -310,7 +318,8 @@ private: _FORCE_INLINE_ MaterialKey _compute_key() const { MaterialKey mk; - mk.key = 0; + mk.key0 = 0; + mk.key1 = 0; for (int i = 0; i < FEATURE_MAX; i++) { if (features[i]) { mk.feature_mask |= ((uint64_t)1 << i); @@ -357,7 +366,11 @@ private: StringName anisotropy; StringName heightmap_scale; StringName subsurface_scattering_strength; - StringName transmission; + StringName transmittance_color; + StringName transmittance_curve; + StringName transmittance_depth; + StringName transmittance_boost; + StringName backlight; StringName refraction; StringName point_size; StringName uv1_scale; @@ -415,7 +428,13 @@ private: float anisotropy; float heightmap_scale; float subsurface_scattering_strength; - Color transmission; + float transmittance_amount; + Color transmittance_color; + float transmittance_depth; + float transmittance_curve; + float transmittance_boost; + + Color backlight; float refraction; float point_size; float alpha_scissor_threshold; @@ -546,8 +565,20 @@ public: void set_subsurface_scattering_strength(float p_subsurface_scattering_strength); float get_subsurface_scattering_strength() const; - void set_transmission(const Color &p_transmission); - Color get_transmission() const; + void set_transmittance_color(const Color &p_color); + Color get_transmittance_color() const; + + void set_transmittance_depth(float p_depth); + float get_transmittance_depth() const; + + void set_transmittance_curve(float p_curve); + float get_transmittance_curve() const; + + void set_transmittance_boost(float p_boost); + float get_transmittance_boost() const; + + void set_backlight(const Color &p_backlight); + Color get_backlight() const; void set_refraction(float p_refraction); float get_refraction() const; diff --git a/scene/resources/mesh.cpp b/scene/resources/mesh.cpp index 6bb5be15f3..401b689145 100644 --- a/scene/resources/mesh.cpp +++ b/scene/resources/mesh.cpp @@ -1359,7 +1359,7 @@ void ArrayMesh::regen_normalmaps() { } //dirty hack -bool (*array_mesh_lightmap_unwrap_callback)(float p_texel_size, const float *p_vertices, const float *p_normals, int p_vertex_count, const int *p_indices, const int *p_face_materials, int p_index_count, float **r_uv, int **r_vertex, int *r_vertex_count, int **r_index, int *r_index_count, int *r_size_hint_x, int *r_size_hint_y) = nullptr; +bool (*array_mesh_lightmap_unwrap_callback)(float p_texel_size, const float *p_vertices, const float *p_normals, int p_vertex_count, const int *p_indices, int p_index_count, float **r_uv, int **r_vertex, int *r_vertex_count, int **r_index, int *r_index_count, int *r_size_hint_x, int *r_size_hint_y, int *&r_cache_data, unsigned int &r_cache_size, bool &r_used_cache); struct ArrayMeshLightmapSurface { @@ -1370,6 +1370,13 @@ struct ArrayMeshLightmapSurface { }; Error ArrayMesh::lightmap_unwrap(const Transform &p_base_transform, float p_texel_size) { + int *cache_data = nullptr; + unsigned int cache_size = 0; + bool use_cache = false; // Don't use cache + return lightmap_unwrap_cached(cache_data, cache_size, use_cache, p_base_transform, p_texel_size); +} + +Error ArrayMesh::lightmap_unwrap_cached(int *&r_cache_data, unsigned int &r_cache_size, bool &r_used_cache, const Transform &p_base_transform, float p_texel_size) { ERR_FAIL_COND_V(!array_mesh_lightmap_unwrap_callback, ERR_UNCONFIGURED); ERR_FAIL_COND_V_MSG(blend_shapes.size() != 0, ERR_UNAVAILABLE, "Can't unwrap mesh with blend shapes."); @@ -1377,11 +1384,18 @@ Error ArrayMesh::lightmap_unwrap(const Transform &p_base_transform, float p_texe Vector<float> vertices; Vector<float> normals; Vector<int> indices; - Vector<int> face_materials; Vector<float> uv; - Vector<Pair<int, int>> uv_index; + Vector<Pair<int, int>> uv_indices; + + Vector<ArrayMeshLightmapSurface> lightmap_surfaces; + + // Keep only the scale + Transform transform = p_base_transform; + transform.origin = Vector3(); + transform.looking_at(Vector3(1, 0, 0), Vector3(0, 1, 0)); + + Basis normal_basis = transform.basis.inverse().transposed(); - Vector<ArrayMeshLightmapSurface> surfaces; for (int i = 0; i < get_surface_count(); i++) { ArrayMeshLightmapSurface s; s.primitive = surface_get_primitive_type(i); @@ -1405,12 +1419,12 @@ Error ArrayMesh::lightmap_unwrap(const Transform &p_base_transform, float p_texe vertices.resize((vertex_ofs + vc) * 3); normals.resize((vertex_ofs + vc) * 3); - uv_index.resize(vertex_ofs + vc); + uv_indices.resize(vertex_ofs + vc); for (int j = 0; j < vc; j++) { - Vector3 v = p_base_transform.xform(r[j]); - Vector3 n = p_base_transform.basis.xform(rn[j]).normalized(); + Vector3 v = transform.xform(r[j]); + Vector3 n = normal_basis.xform(rn[j]).normalized(); vertices.write[(j + vertex_ofs) * 3 + 0] = v.x; vertices.write[(j + vertex_ofs) * 3 + 1] = v.y; @@ -1418,7 +1432,7 @@ Error ArrayMesh::lightmap_unwrap(const Transform &p_base_transform, float p_texe normals.write[(j + vertex_ofs) * 3 + 0] = n.x; normals.write[(j + vertex_ofs) * 3 + 1] = n.y; normals.write[(j + vertex_ofs) * 3 + 2] = n.z; - uv_index.write[j + vertex_ofs] = Pair<int, int>(i, j); + uv_indices.write[j + vertex_ofs] = Pair<int, int>(i, j); } Vector<int> rindices = arrays[Mesh::ARRAY_INDEX]; @@ -1433,7 +1447,6 @@ Error ArrayMesh::lightmap_unwrap(const Transform &p_base_transform, float p_texe indices.push_back(vertex_ofs + j * 3 + 0); indices.push_back(vertex_ofs + j * 3 + 1); indices.push_back(vertex_ofs + j * 3 + 2); - face_materials.push_back(i); } } else { @@ -1445,11 +1458,10 @@ Error ArrayMesh::lightmap_unwrap(const Transform &p_base_transform, float p_texe indices.push_back(vertex_ofs + ri[j * 3 + 0]); indices.push_back(vertex_ofs + ri[j * 3 + 1]); indices.push_back(vertex_ofs + ri[j * 3 + 2]); - face_materials.push_back(i); } } - surfaces.push_back(s); + lightmap_surfaces.push_back(s); } //unwrap @@ -1462,7 +1474,7 @@ Error ArrayMesh::lightmap_unwrap(const Transform &p_base_transform, float p_texe int size_x; int size_y; - bool ok = array_mesh_lightmap_unwrap_callback(p_texel_size, vertices.ptr(), normals.ptr(), vertices.size() / 3, indices.ptr(), face_materials.ptr(), indices.size(), &gen_uvs, &gen_vertices, &gen_vertex_count, &gen_indices, &gen_index_count, &size_x, &size_y); + bool ok = array_mesh_lightmap_unwrap_callback(p_texel_size, vertices.ptr(), normals.ptr(), vertices.size() / 3, indices.ptr(), indices.size(), &gen_uvs, &gen_vertices, &gen_vertex_count, &gen_indices, &gen_index_count, &size_x, &size_y, r_cache_data, r_cache_size, r_used_cache); if (!ok) { return ERR_CANT_CREATE; @@ -1474,11 +1486,11 @@ Error ArrayMesh::lightmap_unwrap(const Transform &p_base_transform, float p_texe //create surfacetools for each surface.. Vector<Ref<SurfaceTool>> surfaces_tools; - for (int i = 0; i < surfaces.size(); i++) { + for (int i = 0; i < lightmap_surfaces.size(); i++) { Ref<SurfaceTool> st; st.instance(); st->begin(Mesh::PRIMITIVE_TRIANGLES); - st->set_material(surfaces[i].material); + st->set_material(lightmap_surfaces[i].material); surfaces_tools.push_back(st); //stay there } @@ -1486,37 +1498,37 @@ Error ArrayMesh::lightmap_unwrap(const Transform &p_base_transform, float p_texe //go through all indices for (int i = 0; i < gen_index_count; i += 3) { - ERR_FAIL_INDEX_V(gen_vertices[gen_indices[i + 0]], uv_index.size(), ERR_BUG); - ERR_FAIL_INDEX_V(gen_vertices[gen_indices[i + 1]], uv_index.size(), ERR_BUG); - ERR_FAIL_INDEX_V(gen_vertices[gen_indices[i + 2]], uv_index.size(), ERR_BUG); + ERR_FAIL_INDEX_V(gen_vertices[gen_indices[i + 0]], uv_indices.size(), ERR_BUG); + ERR_FAIL_INDEX_V(gen_vertices[gen_indices[i + 1]], uv_indices.size(), ERR_BUG); + ERR_FAIL_INDEX_V(gen_vertices[gen_indices[i + 2]], uv_indices.size(), ERR_BUG); - ERR_FAIL_COND_V(uv_index[gen_vertices[gen_indices[i + 0]]].first != uv_index[gen_vertices[gen_indices[i + 1]]].first || uv_index[gen_vertices[gen_indices[i + 0]]].first != uv_index[gen_vertices[gen_indices[i + 2]]].first, ERR_BUG); + ERR_FAIL_COND_V(uv_indices[gen_vertices[gen_indices[i + 0]]].first != uv_indices[gen_vertices[gen_indices[i + 1]]].first || uv_indices[gen_vertices[gen_indices[i + 0]]].first != uv_indices[gen_vertices[gen_indices[i + 2]]].first, ERR_BUG); - int surface = uv_index[gen_vertices[gen_indices[i + 0]]].first; + int surface = uv_indices[gen_vertices[gen_indices[i + 0]]].first; for (int j = 0; j < 3; j++) { - SurfaceTool::Vertex v = surfaces[surface].vertices[uv_index[gen_vertices[gen_indices[i + j]]].second]; + SurfaceTool::Vertex v = lightmap_surfaces[surface].vertices[uv_indices[gen_vertices[gen_indices[i + j]]].second]; - if (surfaces[surface].format & ARRAY_FORMAT_COLOR) { + if (lightmap_surfaces[surface].format & ARRAY_FORMAT_COLOR) { surfaces_tools.write[surface]->add_color(v.color); } - if (surfaces[surface].format & ARRAY_FORMAT_TEX_UV) { + if (lightmap_surfaces[surface].format & ARRAY_FORMAT_TEX_UV) { surfaces_tools.write[surface]->add_uv(v.uv); } - if (surfaces[surface].format & ARRAY_FORMAT_NORMAL) { + if (lightmap_surfaces[surface].format & ARRAY_FORMAT_NORMAL) { surfaces_tools.write[surface]->add_normal(v.normal); } - if (surfaces[surface].format & ARRAY_FORMAT_TANGENT) { + if (lightmap_surfaces[surface].format & ARRAY_FORMAT_TANGENT) { Plane t; t.normal = v.tangent; t.d = v.binormal.dot(v.normal.cross(v.tangent)) < 0 ? -1 : 1; surfaces_tools.write[surface]->add_tangent(t); } - if (surfaces[surface].format & ARRAY_FORMAT_BONES) { + if (lightmap_surfaces[surface].format & ARRAY_FORMAT_BONES) { surfaces_tools.write[surface]->add_bones(v.bones); } - if (surfaces[surface].format & ARRAY_FORMAT_WEIGHTS) { + if (lightmap_surfaces[surface].format & ARRAY_FORMAT_WEIGHTS) { surfaces_tools.write[surface]->add_weights(v.weights); } @@ -1527,20 +1539,22 @@ Error ArrayMesh::lightmap_unwrap(const Transform &p_base_transform, float p_texe } } - //free stuff - ::free(gen_vertices); - ::free(gen_indices); - ::free(gen_uvs); - //generate surfaces for (int i = 0; i < surfaces_tools.size(); i++) { surfaces_tools.write[i]->index(); - surfaces_tools.write[i]->commit(Ref<ArrayMesh>((ArrayMesh *)this), surfaces[i].format); + surfaces_tools.write[i]->commit(Ref<ArrayMesh>((ArrayMesh *)this), lightmap_surfaces[i].format); } set_lightmap_size_hint(Size2(size_x, size_y)); + if (!r_used_cache) { + //free stuff + ::free(gen_vertices); + ::free(gen_indices); + ::free(gen_uvs); + } + return OK; } diff --git a/scene/resources/mesh.h b/scene/resources/mesh.h index 25a9722046..a65cf0a928 100644 --- a/scene/resources/mesh.h +++ b/scene/resources/mesh.h @@ -238,6 +238,7 @@ public: void regen_normalmaps(); Error lightmap_unwrap(const Transform &p_base_transform = Transform(), float p_texel_size = 0.05); + Error lightmap_unwrap_cached(int *&r_cache_data, unsigned int &r_cache_size, bool &r_used_cache, const Transform &p_base_transform = Transform(), float p_texel_size = 0.05); virtual void reload_from_file(); diff --git a/scene/resources/resource_format_text.cpp b/scene/resources/resource_format_text.cpp index 5068bb548f..41146036f6 100644 --- a/scene/resources/resource_format_text.cpp +++ b/scene/resources/resource_format_text.cpp @@ -120,18 +120,23 @@ Error ResourceLoaderText::_parse_sub_resource(VariantParser::Stream *p_stream, R int index = token.value; - String path = local_path + "::" + itos(index); + if (use_nocache) { + r_res = int_resources[index]; + } else { - if (!ignore_resource_parsing) { + String path = local_path + "::" + itos(index); - if (!ResourceCache::has(path)) { - r_err_str = "Can't load cached sub-resource: " + path; - return ERR_PARSE_ERROR; - } + if (!ignore_resource_parsing) { - r_res = RES(ResourceCache::get(path)); - } else { - r_res = RES(); + if (!ResourceCache::has(path)) { + r_err_str = "Can't load cached sub-resource: " + path; + return ERR_PARSE_ERROR; + } + + r_res = RES(ResourceCache::get(path)); + } else { + r_res = RES(); + } } VariantParser::get_token(p_stream, token, line, r_err_str); @@ -535,7 +540,7 @@ Error ResourceLoaderText::load() { Ref<Resource> res; - if (!ResourceCache::has(path)) { //only if it doesn't exist + if (use_nocache || !ResourceCache::has(path)) { //only if it doesn't exist Object *obj = ClassDB::instance(type); if (!obj) { @@ -556,8 +561,10 @@ Error ResourceLoaderText::load() { } res = Ref<Resource>(r); - resource_cache.push_back(res); - res->set_path(path); + int_resources[id] = res; + if (!use_nocache) { + res->set_path(path); + } } resource_current++; @@ -643,10 +650,12 @@ Error ResourceLoaderText::load() { _printerr(); } else { error = OK; - if (!ResourceCache::has(res_path)) { - resource->set_path(res_path); + if (!use_nocache) { + if (!ResourceCache::has(res_path)) { + resource->set_path(res_path); + } + resource->set_as_translation_remapped(translation_remapped); } - resource->set_as_translation_remapped(translation_remapped); } return error; } @@ -691,7 +700,7 @@ Error ResourceLoaderText::load() { error = OK; //get it here resource = packed_scene; - if (!ResourceCache::has(res_path)) { + if (!use_nocache && !ResourceCache::has(res_path)) { packed_scene->set_path(res_path); } @@ -725,6 +734,9 @@ void ResourceLoaderText::set_translation_remapped(bool p_remapped) { } ResourceLoaderText::ResourceLoaderText() { + + use_nocache = false; + resources_total = 0; resource_current = 0; use_sub_threads = false; @@ -1285,7 +1297,7 @@ String ResourceLoaderText::recognize(FileAccess *p_f) { ///////////////////// -RES ResourceFormatLoaderText::load(const String &p_path, const String &p_original_path, Error *r_error, bool p_use_sub_threads, float *r_progress) { +RES ResourceFormatLoaderText::load(const String &p_path, const String &p_original_path, Error *r_error, bool p_use_sub_threads, float *r_progress, bool p_no_cache) { if (r_error) *r_error = ERR_CANT_OPEN; @@ -1298,6 +1310,7 @@ RES ResourceFormatLoaderText::load(const String &p_path, const String &p_origina ResourceLoaderText loader; String path = p_original_path != "" ? p_original_path : p_path; + loader.use_nocache = p_no_cache; loader.use_sub_threads = p_use_sub_threads; loader.local_path = ProjectSettings::get_singleton()->localize_path(path); loader.progress = r_progress; diff --git a/scene/resources/resource_format_text.h b/scene/resources/resource_format_text.h index fbbd2e3346..b9a6db5f36 100644 --- a/scene/resources/resource_format_text.h +++ b/scene/resources/resource_format_text.h @@ -62,6 +62,7 @@ class ResourceLoaderText { //Map<String,String> remaps; Map<int, ExtResource> ext_resources; + Map<int, RES> int_resources; int resources_total; int resource_current; @@ -69,6 +70,8 @@ class ResourceLoaderText { VariantParser::Tag next_tag; + bool use_nocache; + bool use_sub_threads; float *progress; @@ -106,7 +109,6 @@ class ResourceLoaderText { friend class ResourceFormatLoaderText; - List<RES> resource_cache; Error error; RES resource; @@ -134,7 +136,7 @@ public: class ResourceFormatLoaderText : public ResourceFormatLoader { public: static ResourceFormatLoaderText *singleton; - virtual RES load(const String &p_path, const String &p_original_path = "", Error *r_error = nullptr, bool p_use_sub_threads = false, float *r_progress = nullptr); + virtual RES load(const String &p_path, const String &p_original_path = "", Error *r_error = nullptr, bool p_use_sub_threads = false, float *r_progress = nullptr, bool p_no_cache = false); virtual void get_recognized_extensions_for_type(const String &p_type, List<String> *p_extensions) const; virtual void get_recognized_extensions(List<String> *p_extensions) const; virtual bool handles_type(const String &p_type) const; diff --git a/scene/resources/shader.cpp b/scene/resources/shader.cpp index a62e7ded16..1ac2f7c3c9 100644 --- a/scene/resources/shader.cpp +++ b/scene/resources/shader.cpp @@ -176,7 +176,7 @@ Shader::~Shader() { } //////////// -RES ResourceFormatLoaderShader::load(const String &p_path, const String &p_original_path, Error *r_error, bool p_use_sub_threads, float *r_progress) { +RES ResourceFormatLoaderShader::load(const String &p_path, const String &p_original_path, Error *r_error, bool p_use_sub_threads, float *r_progress, bool p_no_cache) { if (r_error) *r_error = ERR_FILE_CANT_OPEN; diff --git a/scene/resources/shader.h b/scene/resources/shader.h index cf0cec362c..75c38bd561 100644 --- a/scene/resources/shader.h +++ b/scene/resources/shader.h @@ -102,7 +102,7 @@ VARIANT_ENUM_CAST(Shader::Mode); class ResourceFormatLoaderShader : public ResourceFormatLoader { public: - virtual RES load(const String &p_path, const String &p_original_path = "", Error *r_error = nullptr, bool p_use_sub_threads = false, float *r_progress = nullptr); + virtual RES load(const String &p_path, const String &p_original_path = "", Error *r_error = nullptr, bool p_use_sub_threads = false, float *r_progress = nullptr, bool p_no_cache = false); virtual void get_recognized_extensions(List<String> *p_extensions) const; virtual bool handles_type(const String &p_type) const; virtual String get_resource_type(const String &p_path) const; diff --git a/scene/resources/sky_material.cpp b/scene/resources/sky_material.cpp index 37b88cccea..a0b6ab1e30 100644 --- a/scene/resources/sky_material.cpp +++ b/scene/resources/sky_material.cpp @@ -111,16 +111,6 @@ float ProceduralSkyMaterial::get_ground_energy() const { return ground_energy; } -void ProceduralSkyMaterial::set_sun_angle_min(float p_angle) { - - sun_angle_min = p_angle; - RS::get_singleton()->material_set_param(_get_material(), "sun_angle_min", Math::deg2rad(sun_angle_min)); -} -float ProceduralSkyMaterial::get_sun_angle_min() const { - - return sun_angle_min; -} - void ProceduralSkyMaterial::set_sun_angle_max(float p_angle) { sun_angle_max = p_angle; @@ -181,9 +171,6 @@ void ProceduralSkyMaterial::_bind_methods() { ClassDB::bind_method(D_METHOD("set_ground_energy", "energy"), &ProceduralSkyMaterial::set_ground_energy); ClassDB::bind_method(D_METHOD("get_ground_energy"), &ProceduralSkyMaterial::get_ground_energy); - ClassDB::bind_method(D_METHOD("set_sun_angle_min", "degrees"), &ProceduralSkyMaterial::set_sun_angle_min); - ClassDB::bind_method(D_METHOD("get_sun_angle_min"), &ProceduralSkyMaterial::get_sun_angle_min); - ClassDB::bind_method(D_METHOD("set_sun_angle_max", "degrees"), &ProceduralSkyMaterial::set_sun_angle_max); ClassDB::bind_method(D_METHOD("get_sun_angle_max"), &ProceduralSkyMaterial::get_sun_angle_max); @@ -203,7 +190,6 @@ void ProceduralSkyMaterial::_bind_methods() { ADD_PROPERTY(PropertyInfo(Variant::FLOAT, "ground_energy", PROPERTY_HINT_RANGE, "0,64,0.01"), "set_ground_energy", "get_ground_energy"); ADD_GROUP("Sun", "sun_"); - ADD_PROPERTY(PropertyInfo(Variant::FLOAT, "sun_angle_min", PROPERTY_HINT_RANGE, "0,360,0.01"), "set_sun_angle_min", "get_sun_angle_min"); ADD_PROPERTY(PropertyInfo(Variant::FLOAT, "sun_angle_max", PROPERTY_HINT_RANGE, "0,360,0.01"), "set_sun_angle_max", "get_sun_angle_max"); ADD_PROPERTY(PropertyInfo(Variant::FLOAT, "sun_curve", PROPERTY_HINT_EXP_EASING), "set_sun_curve", "get_sun_curve"); } @@ -220,8 +206,7 @@ ProceduralSkyMaterial::ProceduralSkyMaterial() { code += "uniform vec4 ground_horizon_color : hint_color = vec4(0.37, 0.33, 0.31, 1.0);\n"; code += "uniform float ground_curve : hint_range(0, 1) = 0.02;\n"; code += "uniform float ground_energy = 1.0;\n\n"; - code += "uniform float sun_angle_min = 0.01;\n"; - code += "uniform float sun_angle_max = 1.0;\n"; + code += "uniform float sun_angle_max = 1.74;\n"; code += "uniform float sun_curve : hint_range(0, 1) = 0.05;\n\n"; code += "const float PI = 3.1415926535897932384626433833;\n\n"; code += "void fragment() {\n"; @@ -231,37 +216,37 @@ ProceduralSkyMaterial::ProceduralSkyMaterial() { code += "\tsky *= sky_energy;\n"; code += "\tif (LIGHT0_ENABLED) {\n"; code += "\t\tfloat sun_angle = acos(dot(LIGHT0_DIRECTION, EYEDIR));\n"; - code += "\t\tif (sun_angle < sun_angle_min) {\n"; + code += "\t\tif (sun_angle < LIGHT0_SIZE) {\n"; code += "\t\t\tsky = LIGHT0_COLOR * LIGHT0_ENERGY;\n"; code += "\t\t} else if (sun_angle < sun_angle_max) {\n"; - code += "\t\t\tfloat c2 = (sun_angle - sun_angle_min) / (sun_angle_max - sun_angle_min);\n"; + code += "\t\t\tfloat c2 = (sun_angle - LIGHT0_SIZE) / (sun_angle_max - LIGHT0_SIZE);\n"; code += "\t\t\tsky = mix(LIGHT0_COLOR * LIGHT0_ENERGY, sky, clamp(1.0 - pow(1.0 - c2, 1.0 / sun_curve), 0.0, 1.0));\n"; code += "\t\t}\n"; code += "\t}\n"; code += "\tif (LIGHT1_ENABLED) {\n"; code += "\t\tfloat sun_angle = acos(dot(LIGHT1_DIRECTION, EYEDIR));\n"; - code += "\t\tif (sun_angle < sun_angle_min) {\n"; + code += "\t\tif (sun_angle < LIGHT1_SIZE) {\n"; code += "\t\t\tsky = LIGHT1_COLOR * LIGHT1_ENERGY;\n"; code += "\t\t} else if (sun_angle < sun_angle_max) {\n"; - code += "\t\t\tfloat c2 = (sun_angle - sun_angle_min) / (sun_angle_max - sun_angle_min);\n"; + code += "\t\t\tfloat c2 = (sun_angle - LIGHT1_SIZE) / (sun_angle_max - LIGHT1_SIZE);\n"; code += "\t\t\tsky = mix(LIGHT1_COLOR * LIGHT1_ENERGY, sky, clamp(1.0 - pow(1.0 - c2, 1.0 / sun_curve), 0.0, 1.0));\n"; code += "\t\t}\n"; code += "\t}\n"; code += "\tif (LIGHT2_ENABLED) {\n"; code += "\t\tfloat sun_angle = acos(dot(LIGHT2_DIRECTION, EYEDIR));\n"; - code += "\t\tif (sun_angle < sun_angle_min) {\n"; + code += "\t\tif (sun_angle < LIGHT2_SIZE) {\n"; code += "\t\t\tsky = LIGHT2_COLOR * LIGHT2_ENERGY;\n"; code += "\t\t} else if (sun_angle < sun_angle_max) {\n"; - code += "\t\t\tfloat c2 = (sun_angle - sun_angle_min) / (sun_angle_max - sun_angle_min);\n"; + code += "\t\t\tfloat c2 = (sun_angle - LIGHT2_SIZE) / (sun_angle_max - LIGHT2_SIZE);\n"; code += "\t\t\tsky = mix(LIGHT2_COLOR * LIGHT2_ENERGY, sky, clamp(1.0 - pow(1.0 - c2, 1.0 / sun_curve), 0.0, 1.0));\n"; code += "\t\t}\n"; code += "\t}\n"; code += "\tif (LIGHT3_ENABLED) {\n"; code += "\t\tfloat sun_angle = acos(dot(LIGHT3_DIRECTION, EYEDIR));\n"; - code += "\t\tif (sun_angle < sun_angle_min) {\n"; + code += "\t\tif (sun_angle < LIGHT3_SIZE) {\n"; code += "\t\t\tsky = LIGHT3_COLOR * LIGHT3_ENERGY;\n"; code += "\t\t} else if (sun_angle < sun_angle_max) {\n"; - code += "\t\t\tfloat c2 = (sun_angle - sun_angle_min) / (sun_angle_max - sun_angle_min);\n"; + code += "\t\t\tfloat c2 = (sun_angle - LIGHT3_SIZE) / (sun_angle_max - LIGHT3_SIZE);\n"; code += "\t\t\tsky = mix(LIGHT3_COLOR * LIGHT3_ENERGY, sky, clamp(1.0 - pow(1.0 - c2, 1.0 / sun_curve), 0.0, 1.0));\n"; code += "\t\t}\n"; code += "\t}\n"; @@ -287,7 +272,6 @@ ProceduralSkyMaterial::ProceduralSkyMaterial() { set_ground_curve(0.02); set_ground_energy(1.0); - set_sun_angle_min(1.0); set_sun_angle_max(100.0); set_sun_curve(0.05); } @@ -535,7 +519,6 @@ PhysicalSkyMaterial::PhysicalSkyMaterial() { code += "const vec3 UP = vec3( 0.0, 1.0, 0.0 );\n\n"; code += "// Sun constants\n"; - code += "const float SOL_SIZE = 0.00872663806;\n"; code += "const float SUN_ENERGY = 1000.0;\n\n"; code += "// optical length at zenith for molecules\n"; @@ -591,8 +574,8 @@ PhysicalSkyMaterial::PhysicalSkyMaterial() { code += "\tLin *= mix(ground_color.rgb, vec3(1.0), smoothstep(-0.1, 0.1, dot(UP, EYEDIR)));\n\n"; code += "\t// Solar disk and out-scattering\n"; - code += "\tfloat sunAngularDiameterCos = cos(SOL_SIZE * sun_disk_scale);\n"; - code += "\tfloat sunAngularDiameterCos2 = cos(SOL_SIZE * sun_disk_scale*0.5);\n"; + code += "\tfloat sunAngularDiameterCos = cos(LIGHT0_SIZE * sun_disk_scale);\n"; + code += "\tfloat sunAngularDiameterCos2 = cos(LIGHT0_SIZE * sun_disk_scale*0.5);\n"; code += "\tfloat sundisk = smoothstep(sunAngularDiameterCos, sunAngularDiameterCos2, cos_theta);\n"; code += "\tvec3 L0 = (sun_energy * 1900.0 * extinction) * sundisk * LIGHT0_COLOR;\n"; code += "\t// Note: Add nightime here: L0 += night_sky * extinction\n\n"; diff --git a/scene/resources/sky_material.h b/scene/resources/sky_material.h index 515706b0c5..9bd9d7ec8b 100644 --- a/scene/resources/sky_material.h +++ b/scene/resources/sky_material.h @@ -49,7 +49,6 @@ private: float ground_curve; float ground_energy; - float sun_angle_min; float sun_angle_max; float sun_curve; @@ -84,9 +83,6 @@ public: void set_ground_energy(float p_energy); float get_ground_energy() const; - void set_sun_angle_min(float p_angle); - float get_sun_angle_min() const; - void set_sun_angle_max(float p_angle); float get_sun_angle_max() const; diff --git a/scene/resources/texture.cpp b/scene/resources/texture.cpp index 749dff24f2..d57af29599 100644 --- a/scene/resources/texture.cpp +++ b/scene/resources/texture.cpp @@ -796,7 +796,7 @@ StreamTexture::~StreamTexture() { } } -RES ResourceFormatLoaderStreamTexture::load(const String &p_path, const String &p_original_path, Error *r_error, bool p_use_sub_threads, float *r_progress) { +RES ResourceFormatLoaderStreamTexture::load(const String &p_path, const String &p_original_path, Error *r_error, bool p_use_sub_threads, float *r_progress, bool p_no_cache) { Ref<StreamTexture> st; st.instance(); @@ -1692,15 +1692,20 @@ void AnimatedTexture::_update_proxy() { } int iter_max = frame_count; - while (iter_max) { + while (iter_max && !pause) { float frame_limit = limit + frames[current_frame].delay_sec; if (time > frame_limit) { current_frame++; if (current_frame >= frame_count) { - current_frame = 0; + if (oneshot) { + current_frame = frame_count - 1; + } else { + current_frame = 0; + } } time -= frame_limit; + _change_notify("current_frame"); } else { break; } @@ -1723,6 +1728,33 @@ int AnimatedTexture::get_frames() const { return frame_count; } +void AnimatedTexture::set_current_frame(int p_frame) { + ERR_FAIL_COND(p_frame < 0 || p_frame >= frame_count); + + RWLockWrite r(rw_lock); + + current_frame = p_frame; +} +int AnimatedTexture::get_current_frame() const { + return current_frame; +} + +void AnimatedTexture::set_pause(bool p_pause) { + RWLockWrite r(rw_lock); + pause = p_pause; +} +bool AnimatedTexture::get_pause() const { + return pause; +} + +void AnimatedTexture::set_oneshot(bool p_oneshot) { + RWLockWrite r(rw_lock); + oneshot = p_oneshot; +} +bool AnimatedTexture::get_oneshot() const { + return oneshot; +} + void AnimatedTexture::set_frame_texture(int p_frame, const Ref<Texture2D> &p_texture) { ERR_FAIL_COND(p_texture == this); @@ -1833,6 +1865,15 @@ void AnimatedTexture::_bind_methods() { ClassDB::bind_method(D_METHOD("set_frames", "frames"), &AnimatedTexture::set_frames); ClassDB::bind_method(D_METHOD("get_frames"), &AnimatedTexture::get_frames); + ClassDB::bind_method(D_METHOD("set_current_frame", "frame"), &AnimatedTexture::set_current_frame); + ClassDB::bind_method(D_METHOD("get_current_frame"), &AnimatedTexture::get_current_frame); + + ClassDB::bind_method(D_METHOD("set_pause", "pause"), &AnimatedTexture::set_pause); + ClassDB::bind_method(D_METHOD("get_pause"), &AnimatedTexture::get_pause); + + ClassDB::bind_method(D_METHOD("set_oneshot", "oneshot"), &AnimatedTexture::set_oneshot); + ClassDB::bind_method(D_METHOD("get_oneshot"), &AnimatedTexture::get_oneshot); + ClassDB::bind_method(D_METHOD("set_fps", "fps"), &AnimatedTexture::set_fps); ClassDB::bind_method(D_METHOD("get_fps"), &AnimatedTexture::get_fps); @@ -1843,6 +1884,9 @@ void AnimatedTexture::_bind_methods() { ClassDB::bind_method(D_METHOD("get_frame_delay", "frame"), &AnimatedTexture::get_frame_delay); ADD_PROPERTY(PropertyInfo(Variant::INT, "frames", PROPERTY_HINT_RANGE, "1," + itos(MAX_FRAMES), PROPERTY_USAGE_DEFAULT | PROPERTY_USAGE_UPDATE_ALL_IF_MODIFIED), "set_frames", "get_frames"); + ADD_PROPERTY(PropertyInfo(Variant::INT, "current_frame", PROPERTY_HINT_NONE, "", 0), "set_current_frame", "get_current_frame"); + ADD_PROPERTY(PropertyInfo(Variant::BOOL, "pause"), "set_pause", "get_pause"); + ADD_PROPERTY(PropertyInfo(Variant::BOOL, "oneshot"), "set_oneshot", "get_oneshot"); ADD_PROPERTY(PropertyInfo(Variant::FLOAT, "fps", PROPERTY_HINT_RANGE, "0,1024,0.1"), "set_fps", "get_fps"); for (int i = 0; i < MAX_FRAMES; i++) { @@ -1864,6 +1908,8 @@ AnimatedTexture::AnimatedTexture() { fps = 4; prev_ticks = 0; current_frame = 0; + pause = false; + oneshot = false; RenderingServer::get_singleton()->connect("frame_pre_draw", callable_mp(this, &AnimatedTexture::_update_proxy)); #ifndef NO_THREADS @@ -2024,7 +2070,7 @@ TextureLayered::~TextureLayered() { } } -RES ResourceFormatLoaderTextureLayered::load(const String &p_path, const String &p_original_path, Error *r_error, bool p_use_sub_threads, float *r_progress) { +RES ResourceFormatLoaderTextureLayered::load(const String &p_path, const String &p_original_path, Error *r_error, bool p_use_sub_threads, float *r_progress, bool p_no_cache) { if (r_error) { *r_error = ERR_CANT_OPEN; diff --git a/scene/resources/texture.h b/scene/resources/texture.h index 18f70baa07..5d5f438eba 100644 --- a/scene/resources/texture.h +++ b/scene/resources/texture.h @@ -213,7 +213,7 @@ public: class ResourceFormatLoaderStreamTexture : public ResourceFormatLoader { public: - virtual RES load(const String &p_path, const String &p_original_path = "", Error *r_error = nullptr, bool p_use_sub_threads = false, float *r_progress = nullptr); + virtual RES load(const String &p_path, const String &p_original_path = "", Error *r_error = nullptr, bool p_use_sub_threads = false, float *r_progress = nullptr, bool p_no_cache = false); virtual void get_recognized_extensions(List<String> *p_extensions) const; virtual bool handles_type(const String &p_type) const; virtual String get_resource_type(const String &p_path) const; @@ -421,7 +421,7 @@ public: COMPRESSION_UNCOMPRESSED }; - virtual RES load(const String &p_path, const String &p_original_path = "", Error *r_error = nullptr, bool p_use_sub_threads = false, float *r_progress = nullptr); + virtual RES load(const String &p_path, const String &p_original_path = "", Error *r_error = nullptr, bool p_use_sub_threads = false, float *r_progress = nullptr, bool p_no_cache = false); virtual void get_recognized_extensions(List<String> *p_extensions) const; virtual bool handles_type(const String &p_type) const; virtual String get_resource_type(const String &p_path) const; @@ -567,7 +567,8 @@ private: Frame frames[MAX_FRAMES]; int frame_count; int current_frame; - + bool pause; + bool oneshot; float fps; float time; @@ -584,6 +585,15 @@ public: void set_frames(int p_frames); int get_frames() const; + void set_current_frame(int p_frame); + int get_current_frame() const; + + void set_pause(bool p_pause); + bool get_pause() const; + + void set_oneshot(bool p_oneshot); + bool get_oneshot() const; + void set_frame_texture(int p_frame, const Ref<Texture2D> &p_texture); Ref<Texture2D> get_frame_texture(int p_frame) const; diff --git a/scene/resources/visual_shader.cpp b/scene/resources/visual_shader.cpp index f70f54412b..310a7ef4e4 100644 --- a/scene/resources/visual_shader.cpp +++ b/scene/resources/visual_shader.cpp @@ -2164,6 +2164,17 @@ void VisualShaderNodeUniform::_bind_methods() { ADD_PROPERTY(PropertyInfo(Variant::STRING_NAME, "uniform_name"), "set_uniform_name", "get_uniform_name"); } +String VisualShaderNodeUniform::get_warning(Shader::Mode p_mode, VisualShader::Type p_type) const { + + List<String> keyword_list; + ShaderLanguage::get_keyword_list(&keyword_list); + if (keyword_list.find(uniform_name)) { + return TTR("Uniform name cannot be equal to a shader keyword. Choose another name."); + } + + return String(); +} + VisualShaderNodeUniform::VisualShaderNodeUniform() { } diff --git a/scene/resources/visual_shader.h b/scene/resources/visual_shader.h index 450dcfa081..ecf3f93fbb 100644 --- a/scene/resources/visual_shader.h +++ b/scene/resources/visual_shader.h @@ -379,6 +379,8 @@ public: void set_uniform_name(const String &p_name); String get_uniform_name() const; + virtual String get_warning(Shader::Mode p_mode, VisualShader::Type p_type) const; + VisualShaderNodeUniform(); }; diff --git a/scene/resources/world_2d.cpp b/scene/resources/world_2d.cpp index 742ef106d9..f2f67d3814 100644 --- a/scene/resources/world_2d.cpp +++ b/scene/resources/world_2d.cpp @@ -314,7 +314,7 @@ struct SpatialIndexer2D { pass = 0; changed = false; - cell_size = 100; //should be configurable with GLOBAL_DEF("") i guess + cell_size = GLOBAL_DEF("world/2d/cell_size", 100); } }; diff --git a/scene/scene_string_names.cpp b/scene/scene_string_names.cpp index ad996e7d50..5e3f8b803b 100644 --- a/scene/scene_string_names.cpp +++ b/scene/scene_string_names.cpp @@ -202,4 +202,7 @@ SceneStringNames::SceneStringNames() { parameters_base_path = "parameters/"; tracks_changed = "tracks_changed"; + + shader_overrides_group = StaticCString::create("_shader_overrides_group_"); + shader_overrides_group_active = StaticCString::create("_shader_overrides_group_active_"); } diff --git a/scene/scene_string_names.h b/scene/scene_string_names.h index 58e8c28454..c5de10a6f6 100644 --- a/scene/scene_string_names.h +++ b/scene/scene_string_names.h @@ -207,6 +207,8 @@ public: StringName window_input; StringName theme_changed; + StringName shader_overrides_group; + StringName shader_overrides_group_active; enum { MAX_MATERIALS = 32 diff --git a/servers/SCsub b/servers/SCsub index 7080a110da..121990f2e1 100644 --- a/servers/SCsub +++ b/servers/SCsub @@ -5,7 +5,7 @@ Import("env") env.servers_sources = [] env.add_source_files(env.servers_sources, "*.cpp") -SConscript("arvr/SCsub") +SConscript("xr/SCsub") SConscript("camera/SCsub") SConscript("physics_3d/SCsub") SConscript("physics_2d/SCsub") diff --git a/servers/arvr/arvr_positional_tracker.cpp b/servers/arvr/arvr_positional_tracker.cpp deleted file mode 100644 index dabeb7b86f..0000000000 --- a/servers/arvr/arvr_positional_tracker.cpp +++ /dev/null @@ -1,237 +0,0 @@ -/*************************************************************************/ -/* arvr_positional_tracker.cpp */ -/*************************************************************************/ -/* This file is part of: */ -/* GODOT ENGINE */ -/* https://godotengine.org */ -/*************************************************************************/ -/* Copyright (c) 2007-2020 Juan Linietsky, Ariel Manzur. */ -/* Copyright (c) 2014-2020 Godot Engine contributors (cf. AUTHORS.md). */ -/* */ -/* Permission is hereby granted, free of charge, to any person obtaining */ -/* a copy of this software and associated documentation files (the */ -/* "Software"), to deal in the Software without restriction, including */ -/* without limitation the rights to use, copy, modify, merge, publish, */ -/* distribute, sublicense, and/or sell copies of the Software, and to */ -/* permit persons to whom the Software is furnished to do so, subject to */ -/* the following conditions: */ -/* */ -/* The above copyright notice and this permission notice shall be */ -/* included in all copies or substantial portions of the Software. */ -/* */ -/* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, */ -/* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF */ -/* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.*/ -/* IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY */ -/* CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, */ -/* TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE */ -/* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ -/*************************************************************************/ - -#include "arvr_positional_tracker.h" -#include "core/input/input_filter.h" - -void ARVRPositionalTracker::_bind_methods() { - BIND_ENUM_CONSTANT(TRACKER_HAND_UNKNOWN); - BIND_ENUM_CONSTANT(TRACKER_LEFT_HAND); - BIND_ENUM_CONSTANT(TRACKER_RIGHT_HAND); - - // this class is read only from GDScript, so we only have access to getters.. - ClassDB::bind_method(D_METHOD("get_type"), &ARVRPositionalTracker::get_type); - ClassDB::bind_method(D_METHOD("get_tracker_id"), &ARVRPositionalTracker::get_tracker_id); - ClassDB::bind_method(D_METHOD("get_name"), &ARVRPositionalTracker::get_name); - ClassDB::bind_method(D_METHOD("get_joy_id"), &ARVRPositionalTracker::get_joy_id); - ClassDB::bind_method(D_METHOD("get_tracks_orientation"), &ARVRPositionalTracker::get_tracks_orientation); - ClassDB::bind_method(D_METHOD("get_orientation"), &ARVRPositionalTracker::get_orientation); - ClassDB::bind_method(D_METHOD("get_tracks_position"), &ARVRPositionalTracker::get_tracks_position); - ClassDB::bind_method(D_METHOD("get_position"), &ARVRPositionalTracker::get_position); - ClassDB::bind_method(D_METHOD("get_hand"), &ARVRPositionalTracker::get_hand); - ClassDB::bind_method(D_METHOD("get_transform", "adjust_by_reference_frame"), &ARVRPositionalTracker::get_transform); - ClassDB::bind_method(D_METHOD("get_mesh"), &ARVRPositionalTracker::get_mesh); - - // these functions we don't want to expose to normal users but do need to be callable from GDNative - ClassDB::bind_method(D_METHOD("_set_type", "type"), &ARVRPositionalTracker::set_type); - ClassDB::bind_method(D_METHOD("_set_name", "name"), &ARVRPositionalTracker::set_name); - ClassDB::bind_method(D_METHOD("_set_joy_id", "joy_id"), &ARVRPositionalTracker::set_joy_id); - ClassDB::bind_method(D_METHOD("_set_orientation", "orientation"), &ARVRPositionalTracker::set_orientation); - ClassDB::bind_method(D_METHOD("_set_rw_position", "rw_position"), &ARVRPositionalTracker::set_rw_position); - ClassDB::bind_method(D_METHOD("_set_mesh", "mesh"), &ARVRPositionalTracker::set_mesh); - ClassDB::bind_method(D_METHOD("get_rumble"), &ARVRPositionalTracker::get_rumble); - ClassDB::bind_method(D_METHOD("set_rumble", "rumble"), &ARVRPositionalTracker::set_rumble); - - ADD_PROPERTY(PropertyInfo(Variant::FLOAT, "rumble"), "set_rumble", "get_rumble"); -}; - -void ARVRPositionalTracker::set_type(ARVRServer::TrackerType p_type) { - if (type != p_type) { - type = p_type; - hand = ARVRPositionalTracker::TRACKER_HAND_UNKNOWN; - - ARVRServer *arvr_server = ARVRServer::get_singleton(); - ERR_FAIL_NULL(arvr_server); - - // get a tracker id for our type - // note if this is a controller this will be 3 or higher but we may change it later. - tracker_id = arvr_server->get_free_tracker_id_for_type(p_type); - }; -}; - -ARVRServer::TrackerType ARVRPositionalTracker::get_type() const { - return type; -}; - -void ARVRPositionalTracker::set_name(const String &p_name) { - name = p_name; -}; - -StringName ARVRPositionalTracker::get_name() const { - return name; -}; - -int ARVRPositionalTracker::get_tracker_id() const { - return tracker_id; -}; - -void ARVRPositionalTracker::set_joy_id(int p_joy_id) { - joy_id = p_joy_id; -}; - -int ARVRPositionalTracker::get_joy_id() const { - return joy_id; -}; - -bool ARVRPositionalTracker::get_tracks_orientation() const { - return tracks_orientation; -}; - -void ARVRPositionalTracker::set_orientation(const Basis &p_orientation) { - _THREAD_SAFE_METHOD_ - - tracks_orientation = true; // obviously we have this - orientation = p_orientation; -}; - -Basis ARVRPositionalTracker::get_orientation() const { - _THREAD_SAFE_METHOD_ - - return orientation; -}; - -bool ARVRPositionalTracker::get_tracks_position() const { - return tracks_position; -}; - -void ARVRPositionalTracker::set_position(const Vector3 &p_position) { - _THREAD_SAFE_METHOD_ - - ARVRServer *arvr_server = ARVRServer::get_singleton(); - ERR_FAIL_NULL(arvr_server); - real_t world_scale = arvr_server->get_world_scale(); - ERR_FAIL_COND(world_scale == 0); - - tracks_position = true; // obviously we have this - rw_position = p_position / world_scale; -}; - -Vector3 ARVRPositionalTracker::get_position() const { - _THREAD_SAFE_METHOD_ - - ARVRServer *arvr_server = ARVRServer::get_singleton(); - ERR_FAIL_NULL_V(arvr_server, rw_position); - real_t world_scale = arvr_server->get_world_scale(); - - return rw_position * world_scale; -}; - -void ARVRPositionalTracker::set_rw_position(const Vector3 &p_rw_position) { - _THREAD_SAFE_METHOD_ - - tracks_position = true; // obviously we have this - rw_position = p_rw_position; -}; - -Vector3 ARVRPositionalTracker::get_rw_position() const { - _THREAD_SAFE_METHOD_ - - return rw_position; -}; - -void ARVRPositionalTracker::set_mesh(const Ref<Mesh> &p_mesh) { - _THREAD_SAFE_METHOD_ - - mesh = p_mesh; -}; - -Ref<Mesh> ARVRPositionalTracker::get_mesh() const { - _THREAD_SAFE_METHOD_ - - return mesh; -}; - -ARVRPositionalTracker::TrackerHand ARVRPositionalTracker::get_hand() const { - return hand; -}; - -void ARVRPositionalTracker::set_hand(const ARVRPositionalTracker::TrackerHand p_hand) { - ARVRServer *arvr_server = ARVRServer::get_singleton(); - ERR_FAIL_NULL(arvr_server); - - if (hand != p_hand) { - // we can only set this if we've previously set this to be a controller!! - ERR_FAIL_COND((type != ARVRServer::TRACKER_CONTROLLER) && (p_hand != ARVRPositionalTracker::TRACKER_HAND_UNKNOWN)); - - hand = p_hand; - if (hand == ARVRPositionalTracker::TRACKER_LEFT_HAND) { - if (!arvr_server->is_tracker_id_in_use_for_type(type, 1)) { - tracker_id = 1; - }; - } else if (hand == ARVRPositionalTracker::TRACKER_RIGHT_HAND) { - if (!arvr_server->is_tracker_id_in_use_for_type(type, 2)) { - tracker_id = 2; - }; - }; - }; -}; - -Transform ARVRPositionalTracker::get_transform(bool p_adjust_by_reference_frame) const { - Transform new_transform; - - new_transform.basis = get_orientation(); - new_transform.origin = get_position(); - - if (p_adjust_by_reference_frame) { - ARVRServer *arvr_server = ARVRServer::get_singleton(); - ERR_FAIL_NULL_V(arvr_server, new_transform); - - new_transform = arvr_server->get_reference_frame() * new_transform; - }; - - return new_transform; -}; - -real_t ARVRPositionalTracker::get_rumble() const { - return rumble; -}; - -void ARVRPositionalTracker::set_rumble(real_t p_rumble) { - if (p_rumble > 0.0) { - rumble = p_rumble; - } else { - rumble = 0.0; - }; -}; - -ARVRPositionalTracker::ARVRPositionalTracker() { - type = ARVRServer::TRACKER_UNKNOWN; - name = "Unknown"; - joy_id = -1; - tracker_id = 0; - tracks_orientation = false; - tracks_position = false; - hand = TRACKER_HAND_UNKNOWN; - rumble = 0.0; -}; - -ARVRPositionalTracker::~ARVRPositionalTracker(){ - -}; diff --git a/servers/display_server.cpp b/servers/display_server.cpp index da1a68a179..ff8b10cbb6 100644 --- a/servers/display_server.cpp +++ b/servers/display_server.cpp @@ -30,7 +30,7 @@ #include "display_server.h" -#include "core/input/input_filter.h" +#include "core/input/input.h" #include "scene/resources/texture.h" DisplayServer *DisplayServer::singleton = nullptr; @@ -164,7 +164,7 @@ float DisplayServer::screen_get_scale(int p_screen) const { bool DisplayServer::screen_is_touchscreen(int p_screen) const { //return false; - return InputFilter::get_singleton() && InputFilter::get_singleton()->is_emulating_touch_from_mouse(); + return Input::get_singleton() && Input::get_singleton()->is_emulating_touch_from_mouse(); } void DisplayServer::screen_set_keep_on(bool p_enable) { @@ -563,31 +563,31 @@ DisplayServer *DisplayServer::create(int p_index, const String &p_rendering_driv return server_create_functions[p_index].create_function(p_rendering_driver, p_mode, p_flags, p_resolution, r_error); } -void DisplayServer::_input_set_mouse_mode(InputFilter::MouseMode p_mode) { +void DisplayServer::_input_set_mouse_mode(Input::MouseMode p_mode) { singleton->mouse_set_mode(MouseMode(p_mode)); } -InputFilter::MouseMode DisplayServer::_input_get_mouse_mode() { - return InputFilter::MouseMode(singleton->mouse_get_mode()); +Input::MouseMode DisplayServer::_input_get_mouse_mode() { + return Input::MouseMode(singleton->mouse_get_mode()); } void DisplayServer::_input_warp(const Vector2 &p_to_pos) { singleton->mouse_warp_to_position(p_to_pos); } -InputFilter::CursorShape DisplayServer::_input_get_current_cursor_shape() { - return (InputFilter::CursorShape)singleton->cursor_get_shape(); +Input::CursorShape DisplayServer::_input_get_current_cursor_shape() { + return (Input::CursorShape)singleton->cursor_get_shape(); } -void DisplayServer::_input_set_custom_mouse_cursor_func(const RES &p_image, InputFilter::CursorShape p_shape, const Vector2 &p_hostspot) { +void DisplayServer::_input_set_custom_mouse_cursor_func(const RES &p_image, Input::CursorShape p_shape, const Vector2 &p_hostspot) { singleton->cursor_set_custom_image(p_image, (CursorShape)p_shape, p_hostspot); } DisplayServer::DisplayServer() { singleton = this; - InputFilter::set_mouse_mode_func = _input_set_mouse_mode; - InputFilter::get_mouse_mode_func = _input_get_mouse_mode; - InputFilter::warp_mouse_func = _input_warp; - InputFilter::get_current_cursor_shape_func = _input_get_current_cursor_shape; - InputFilter::set_custom_mouse_cursor_func = _input_set_custom_mouse_cursor_func; + Input::set_mouse_mode_func = _input_set_mouse_mode; + Input::get_mouse_mode_func = _input_get_mouse_mode; + Input::warp_mouse_func = _input_warp; + Input::get_current_cursor_shape_func = _input_get_current_cursor_shape; + Input::set_custom_mouse_cursor_func = _input_set_custom_mouse_cursor_func; } DisplayServer::~DisplayServer() { } diff --git a/servers/display_server.h b/servers/display_server.h index 1956bcafca..f6ba26fc6f 100644 --- a/servers/display_server.h +++ b/servers/display_server.h @@ -32,7 +32,7 @@ #define DISPLAY_SERVER_H #include "core/callable.h" -#include "core/input/input_filter.h" +#include "core/input/input.h" #include "core/os/os.h" #include "core/resource.h" @@ -61,11 +61,11 @@ public: typedef Vector<String> (*GetRenderingDriversFunction)(); private: - static void _input_set_mouse_mode(InputFilter::MouseMode p_mode); - static InputFilter::MouseMode _input_get_mouse_mode(); + static void _input_set_mouse_mode(Input::MouseMode p_mode); + static Input::MouseMode _input_get_mouse_mode(); static void _input_warp(const Vector2 &p_to_pos); - static InputFilter::CursorShape _input_get_current_cursor_shape(); - static void _input_set_custom_mouse_cursor_func(const RES &, InputFilter::CursorShape, const Vector2 &p_hostspot); + static Input::CursorShape _input_get_current_cursor_shape(); + static void _input_set_custom_mouse_cursor_func(const RES &, Input::CursorShape, const Vector2 &p_hostspot); protected: static void _bind_methods(); @@ -180,7 +180,7 @@ public: }; virtual void screen_set_orientation(ScreenOrientation p_orientation, int p_screen = SCREEN_OF_MAIN_WINDOW); - ScreenOrientation screen_get_orientation(int p_screen = SCREEN_OF_MAIN_WINDOW) const; + virtual ScreenOrientation screen_get_orientation(int p_screen = SCREEN_OF_MAIN_WINDOW) const; virtual void screen_set_keep_on(bool p_enable); //disable screensaver virtual bool screen_is_kept_on() const; diff --git a/servers/physics_2d/shape_2d_sw.h b/servers/physics_2d/shape_2d_sw.h index 48f3bea1e1..ca001e6dd9 100644 --- a/servers/physics_2d/shape_2d_sw.h +++ b/servers/physics_2d/shape_2d_sw.h @@ -465,7 +465,11 @@ public: virtual Variant get_data() const; _FORCE_INLINE_ void project_range(const Vector2 &p_normal, const Transform2D &p_transform, real_t &r_min, real_t &r_max) const { - // no matter the angle, the box is mirrored anyway + + if (!points || point_count <= 0) { + r_min = r_max = 0; + return; + } r_min = r_max = p_normal.dot(p_transform.xform(points[0].pos)); for (int i = 1; i < point_count; i++) { diff --git a/servers/physics_3d/body_3d_sw.h b/servers/physics_3d/body_3d_sw.h index b553cf0670..2bd335e6c0 100644 --- a/servers/physics_3d/body_3d_sw.h +++ b/servers/physics_3d/body_3d_sw.h @@ -257,7 +257,7 @@ public: _FORCE_INLINE_ void add_force(const Vector3 &p_force, const Vector3 &p_pos) { applied_force += p_force; - applied_torque += p_pos.cross(p_force); + applied_torque += (p_pos - center_of_mass).cross(p_force); } _FORCE_INLINE_ void add_torque(const Vector3 &p_torque) { @@ -421,7 +421,7 @@ public: virtual void apply_impulse(const Vector3 &p_pos, const Vector3 &p_j) { body->apply_impulse(p_pos, p_j); } virtual void apply_torque_impulse(const Vector3 &p_j) { body->apply_torque_impulse(p_j); } - virtual void set_sleep_state(bool p_enable) { body->set_active(!p_enable); } + virtual void set_sleep_state(bool p_sleep) { body->set_active(!p_sleep); } virtual bool is_sleeping() const { return !body->is_active(); } virtual int get_contact_count() const { return body->contact_count; } diff --git a/servers/physics_3d/joints/generic_6dof_joint_3d_sw.cpp b/servers/physics_3d/joints/generic_6dof_joint_3d_sw.cpp index 1f433ec6a5..e15aeca842 100644 --- a/servers/physics_3d/joints/generic_6dof_joint_3d_sw.cpp +++ b/servers/physics_3d/joints/generic_6dof_joint_3d_sw.cpp @@ -497,28 +497,28 @@ void Generic6DOFJoint3DSW::set_param(Vector3::Axis p_axis, PhysicsServer3D::G6DO } break; case PhysicsServer3D::G6DOF_JOINT_LINEAR_MOTOR_TARGET_VELOCITY: { - // Not implemented in GodotPhysics backend + // Not implemented in GodotPhysics3D backend } break; case PhysicsServer3D::G6DOF_JOINT_LINEAR_MOTOR_FORCE_LIMIT: { - // Not implemented in GodotPhysics backend + // Not implemented in GodotPhysics3D backend } break; case PhysicsServer3D::G6DOF_JOINT_LINEAR_SPRING_STIFFNESS: { - // Not implemented in GodotPhysics backend + // Not implemented in GodotPhysics3D backend } break; case PhysicsServer3D::G6DOF_JOINT_LINEAR_SPRING_DAMPING: { - // Not implemented in GodotPhysics backend + // Not implemented in GodotPhysics3D backend } break; case PhysicsServer3D::G6DOF_JOINT_LINEAR_SPRING_EQUILIBRIUM_POINT: { - // Not implemented in GodotPhysics backend + // Not implemented in GodotPhysics3D backend } break; case PhysicsServer3D::G6DOF_JOINT_ANGULAR_SPRING_STIFFNESS: { - // Not implemented in GodotPhysics backend + // Not implemented in GodotPhysics3D backend } break; case PhysicsServer3D::G6DOF_JOINT_ANGULAR_SPRING_DAMPING: { - // Not implemented in GodotPhysics backend + // Not implemented in GodotPhysics3D backend } break; case PhysicsServer3D::G6DOF_JOINT_ANGULAR_SPRING_EQUILIBRIUM_POINT: { - // Not implemented in GodotPhysics backend + // Not implemented in GodotPhysics3D backend } break; case PhysicsServer3D::G6DOF_JOINT_MAX: break; // Can't happen, but silences warning } @@ -597,28 +597,28 @@ real_t Generic6DOFJoint3DSW::get_param(Vector3::Axis p_axis, PhysicsServer3D::G6 } break; case PhysicsServer3D::G6DOF_JOINT_LINEAR_MOTOR_TARGET_VELOCITY: { - // Not implemented in GodotPhysics backend + // Not implemented in GodotPhysics3D backend } break; case PhysicsServer3D::G6DOF_JOINT_LINEAR_MOTOR_FORCE_LIMIT: { - // Not implemented in GodotPhysics backend + // Not implemented in GodotPhysics3D backend } break; case PhysicsServer3D::G6DOF_JOINT_LINEAR_SPRING_STIFFNESS: { - // Not implemented in GodotPhysics backend + // Not implemented in GodotPhysics3D backend } break; case PhysicsServer3D::G6DOF_JOINT_LINEAR_SPRING_DAMPING: { - // Not implemented in GodotPhysics backend + // Not implemented in GodotPhysics3D backend } break; case PhysicsServer3D::G6DOF_JOINT_LINEAR_SPRING_EQUILIBRIUM_POINT: { - // Not implemented in GodotPhysics backend + // Not implemented in GodotPhysics3D backend } break; case PhysicsServer3D::G6DOF_JOINT_ANGULAR_SPRING_STIFFNESS: { - // Not implemented in GodotPhysics backend + // Not implemented in GodotPhysics3D backend } break; case PhysicsServer3D::G6DOF_JOINT_ANGULAR_SPRING_DAMPING: { - // Not implemented in GodotPhysics backend + // Not implemented in GodotPhysics3D backend } break; case PhysicsServer3D::G6DOF_JOINT_ANGULAR_SPRING_EQUILIBRIUM_POINT: { - // Not implemented in GodotPhysics backend + // Not implemented in GodotPhysics3D backend } break; case PhysicsServer3D::G6DOF_JOINT_MAX: break; // Can't happen, but silences warning } @@ -643,13 +643,13 @@ void Generic6DOFJoint3DSW::set_flag(Vector3::Axis p_axis, PhysicsServer3D::G6DOF m_angularLimits[p_axis].m_enableMotor = p_value; } break; case PhysicsServer3D::G6DOF_JOINT_FLAG_ENABLE_LINEAR_MOTOR: { - // Not implemented in GodotPhysics backend + // Not implemented in GodotPhysics3D backend } break; case PhysicsServer3D::G6DOF_JOINT_FLAG_ENABLE_LINEAR_SPRING: { - // Not implemented in GodotPhysics backend + // Not implemented in GodotPhysics3D backend } break; case PhysicsServer3D::G6DOF_JOINT_FLAG_ENABLE_ANGULAR_SPRING: { - // Not implemented in GodotPhysics backend + // Not implemented in GodotPhysics3D backend } break; case PhysicsServer3D::G6DOF_JOINT_FLAG_MAX: break; // Can't happen, but silences warning } @@ -671,13 +671,13 @@ bool Generic6DOFJoint3DSW::get_flag(Vector3::Axis p_axis, PhysicsServer3D::G6DOF return m_angularLimits[p_axis].m_enableMotor; } break; case PhysicsServer3D::G6DOF_JOINT_FLAG_ENABLE_LINEAR_MOTOR: { - // Not implemented in GodotPhysics backend + // Not implemented in GodotPhysics3D backend } break; case PhysicsServer3D::G6DOF_JOINT_FLAG_ENABLE_LINEAR_SPRING: { - // Not implemented in GodotPhysics backend + // Not implemented in GodotPhysics3D backend } break; case PhysicsServer3D::G6DOF_JOINT_FLAG_ENABLE_ANGULAR_SPRING: { - // Not implemented in GodotPhysics backend + // Not implemented in GodotPhysics3D backend } break; case PhysicsServer3D::G6DOF_JOINT_FLAG_MAX: break; // Can't happen, but silences warning } diff --git a/servers/physics_3d/physics_server_3d_sw.cpp b/servers/physics_3d/physics_server_3d_sw.cpp index bc42c2fd9e..b454dc54af 100644 --- a/servers/physics_3d/physics_server_3d_sw.cpp +++ b/servers/physics_3d/physics_server_3d_sw.cpp @@ -70,7 +70,7 @@ RID PhysicsServer3DSW::shape_create(ShapeType p_shape) { } break; case SHAPE_CYLINDER: { - ERR_FAIL_V_MSG(RID(), "CylinderShape3D is not supported in GodotPhysics. Please switch to Bullet in the Project Settings."); + ERR_FAIL_V_MSG(RID(), "CylinderShape3D is not supported in GodotPhysics3D. Please switch to Bullet in the Project Settings."); } break; case SHAPE_CONVEX_POLYGON: { @@ -1499,7 +1499,7 @@ void PhysicsServer3DSW::flush_queries() { values.push_back(USEC_TO_SEC(OS::get_singleton()->get_ticks_usec() - time_beg)); values.push_front("physics"); - EngineDebugger::profiler_add_frame_data("server", values); + EngineDebugger::profiler_add_frame_data("servers", values); } #endif }; diff --git a/servers/physics_server_3d.h b/servers/physics_server_3d.h index a2f08b3ed8..8ea8b22455 100644 --- a/servers/physics_server_3d.h +++ b/servers/physics_server_3d.h @@ -70,7 +70,7 @@ public: virtual void apply_impulse(const Vector3 &p_pos, const Vector3 &p_j) = 0; virtual void apply_torque_impulse(const Vector3 &p_j) = 0; - virtual void set_sleep_state(bool p_enable) = 0; + virtual void set_sleep_state(bool p_sleep) = 0; virtual bool is_sleeping() const = 0; virtual int get_contact_count() const = 0; diff --git a/servers/register_server_types.cpp b/servers/register_server_types.cpp index 64b48bea50..60217002fb 100644 --- a/servers/register_server_types.cpp +++ b/servers/register_server_types.cpp @@ -33,9 +33,6 @@ #include "core/engine.h" #include "core/project_settings.h" -#include "arvr/arvr_interface.h" -#include "arvr/arvr_positional_tracker.h" -#include "arvr_server.h" #include "audio/audio_effect.h" #include "audio/audio_stream.h" #include "audio/effects/audio_effect_amplify.h" @@ -65,8 +62,15 @@ #include "physics_3d/physics_server_3d_sw.h" #include "physics_server_2d.h" #include "physics_server_3d.h" +#include "rendering/rasterizer.h" +#include "rendering/rendering_device.h" +#include "rendering/rendering_device_binds.h" + #include "rendering_server.h" #include "servers/rendering/shader_types.h" +#include "xr/xr_interface.h" +#include "xr/xr_positional_tracker.h" +#include "xr_server.h" ShaderTypes *shader_types = nullptr; @@ -100,13 +104,17 @@ void register_server_types() { ClassDB::register_virtual_class<DisplayServer>(); ClassDB::register_virtual_class<RenderingServer>(); ClassDB::register_class<AudioServer>(); - ClassDB::register_virtual_class<PhysicsServer3D>(); ClassDB::register_virtual_class<PhysicsServer2D>(); - ClassDB::register_class<ARVRServer>(); + ClassDB::register_virtual_class<PhysicsServer3D>(); + ClassDB::register_virtual_class<NavigationServer2D>(); + ClassDB::register_virtual_class<NavigationServer3D>(); + ClassDB::register_class<XRServer>(); ClassDB::register_class<CameraServer>(); - ClassDB::register_virtual_class<ARVRInterface>(); - ClassDB::register_class<ARVRPositionalTracker>(); + ClassDB::register_virtual_class<RenderingDevice>(); + + ClassDB::register_virtual_class<XRInterface>(); + ClassDB::register_class<XRPositionalTracker>(); ClassDB::register_virtual_class<AudioStream>(); ClassDB::register_virtual_class<AudioStreamPlayback>(); @@ -157,6 +165,22 @@ void register_server_types() { ClassDB::register_virtual_class<AudioEffectSpectrumAnalyzerInstance>(); } + ClassDB::register_virtual_class<RenderingDevice>(); + ClassDB::register_class<RDTextureFormat>(); + ClassDB::register_class<RDTextureView>(); + ClassDB::register_class<RDAttachmentFormat>(); + ClassDB::register_class<RDSamplerState>(); + ClassDB::register_class<RDVertexAttribute>(); + ClassDB::register_class<RDUniform>(); + ClassDB::register_class<RDPipelineRasterizationState>(); + ClassDB::register_class<RDPipelineMultisampleState>(); + ClassDB::register_class<RDPipelineDepthStencilState>(); + ClassDB::register_class<RDPipelineColorBlendStateAttachment>(); + ClassDB::register_class<RDPipelineColorBlendState>(); + ClassDB::register_class<RDShaderSource>(); + ClassDB::register_class<RDShaderBytecode>(); + ClassDB::register_class<RDShaderFile>(); + ClassDB::register_class<CameraFeed>(); ClassDB::register_virtual_class<PhysicsDirectBodyState2D>(); @@ -174,15 +198,15 @@ void register_server_types() { GLOBAL_DEF(PhysicsServer2DManager::setting_property_name, "DEFAULT"); ProjectSettings::get_singleton()->set_custom_property_info(PhysicsServer2DManager::setting_property_name, PropertyInfo(Variant::STRING, PhysicsServer2DManager::setting_property_name, PROPERTY_HINT_ENUM, "DEFAULT")); - PhysicsServer2DManager::register_server("GodotPhysics", &_createGodotPhysics2DCallback); - PhysicsServer2DManager::set_default_server("GodotPhysics"); + PhysicsServer2DManager::register_server("GodotPhysics2D", &_createGodotPhysics2DCallback); + PhysicsServer2DManager::set_default_server("GodotPhysics2D"); // Physics 3D GLOBAL_DEF(PhysicsServer3DManager::setting_property_name, "DEFAULT"); ProjectSettings::get_singleton()->set_custom_property_info(PhysicsServer3DManager::setting_property_name, PropertyInfo(Variant::STRING, PhysicsServer3DManager::setting_property_name, PROPERTY_HINT_ENUM, "DEFAULT")); - PhysicsServer3DManager::register_server("GodotPhysics", &_createGodotPhysics3DCallback); - PhysicsServer3DManager::set_default_server("GodotPhysics"); + PhysicsServer3DManager::register_server("GodotPhysics3D", &_createGodotPhysics3DCallback); + PhysicsServer3DManager::set_default_server("GodotPhysics3D"); } void unregister_server_types() { @@ -192,12 +216,13 @@ void unregister_server_types() { 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("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())); Engine::get_singleton()->add_singleton(Engine::Singleton("NavigationServer2D", NavigationServer2D::get_singleton_mut())); Engine::get_singleton()->add_singleton(Engine::Singleton("NavigationServer3D", NavigationServer3D::get_singleton_mut())); - Engine::get_singleton()->add_singleton(Engine::Singleton("ARVRServer", ARVRServer::get_singleton())); + Engine::get_singleton()->add_singleton(Engine::Singleton("XRServer", XRServer::get_singleton())); Engine::get_singleton()->add_singleton(Engine::Singleton("CameraServer", CameraServer::get_singleton())); } diff --git a/servers/rendering/rasterizer.h b/servers/rendering/rasterizer.h index d77963b3dd..955241e79c 100644 --- a/servers/rendering/rasterizer.h +++ b/servers/rendering/rasterizer.h @@ -106,6 +106,9 @@ public: virtual void camera_effects_set_dof_blur(RID p_camera_effects, bool p_far_enable, float p_far_distance, float p_far_transition, bool p_near_enable, float p_near_distance, float p_near_transition, float p_amount) = 0; virtual void camera_effects_set_custom_exposure(RID p_camera_effects, bool p_enable, float p_exposure) = 0; + virtual void shadows_quality_set(RS::ShadowQuality p_quality) = 0; + virtual void directional_shadow_quality_set(RS::ShadowQuality p_quality) = 0; + struct InstanceBase; struct InstanceDependency { @@ -164,6 +167,17 @@ public: AABB aabb; AABB transformed_aabb; + struct InstanceShaderParameter { + int32_t index = -1; + Variant value; + Variant default_value; + PropertyInfo info; + }; + + Map<StringName, InstanceShaderParameter> instance_shader_parameters; + bool instance_allocated_shader_parameters = false; + int32_t instance_allocated_shader_parameters_offset = -1; + virtual void dependency_deleted(RID p_dependency) = 0; virtual void dependency_changed(bool p_aabb, bool p_dependencies) = 0; @@ -229,7 +243,7 @@ public: virtual RID light_instance_create(RID p_light) = 0; virtual void light_instance_set_transform(RID p_light_instance, const Transform &p_transform) = 0; - virtual void light_instance_set_shadow_transform(RID p_light_instance, const CameraMatrix &p_projection, const Transform &p_transform, float p_far, float p_split, int p_pass, float p_bias_scale = 1.0) = 0; + virtual void light_instance_set_shadow_transform(RID p_light_instance, const CameraMatrix &p_projection, const Transform &p_transform, float p_far, float p_split, int p_pass, float p_shadow_texel_size, float p_bias_scale = 1.0, float p_range_begin = 0, const Vector2 &p_uv_scale = Vector2()) = 0; virtual void light_instance_mark_visible(RID p_light_instance) = 0; virtual bool light_instances_can_render_shadow_cube() const { return true; @@ -246,12 +260,15 @@ public: virtual bool reflection_probe_instance_begin_render(RID p_instance, RID p_reflection_atlas) = 0; virtual bool reflection_probe_instance_postprocess_step(RID p_instance) = 0; + virtual RID decal_instance_create(RID p_decal) = 0; + virtual void decal_instance_set_transform(RID p_decal, const Transform &p_transform) = 0; + virtual RID gi_probe_instance_create(RID p_gi_probe) = 0; virtual void gi_probe_instance_set_transform_to_data(RID p_probe, const Transform &p_xform) = 0; virtual bool gi_probe_needs_update(RID p_probe) const = 0; virtual void gi_probe_update(RID p_probe, bool p_update_light_instances, const Vector<RID> &p_light_instances, int p_dynamic_object_count, InstanceBase **p_dynamic_objects) = 0; - virtual void render_scene(RID p_render_buffers, const Transform &p_cam_transform, const CameraMatrix &p_cam_projection, bool p_cam_ortogonal, InstanceBase **p_cull_result, int p_cull_count, RID *p_light_cull_result, int p_light_cull_count, RID *p_reflection_probe_cull_result, int p_reflection_probe_cull_count, RID *p_gi_probe_cull_result, int p_gi_probe_cull_count, RID p_environment, RID p_camera_effects, RID p_shadow_atlas, RID p_reflection_atlas, RID p_reflection_probe, int p_reflection_probe_pass) = 0; + virtual void render_scene(RID p_render_buffers, const Transform &p_cam_transform, const CameraMatrix &p_cam_projection, bool p_cam_ortogonal, InstanceBase **p_cull_result, int p_cull_count, RID *p_light_cull_result, int p_light_cull_count, RID *p_reflection_probe_cull_result, int p_reflection_probe_cull_count, RID *p_gi_probe_cull_result, int p_gi_probe_cull_count, RID *p_decal_cull_result, int p_decal_cull_count, RID p_environment, RID p_camera_effects, RID p_shadow_atlas, RID p_reflection_atlas, RID p_reflection_probe, int p_reflection_probe_pass) = 0; virtual void render_shadow(RID p_light, RID p_shadow_atlas, int p_pass, InstanceBase **p_cull_result, int p_cull_count) = 0; virtual void render_material(const Transform &p_cam_transform, const CameraMatrix &p_cam_projection, bool p_cam_ortogonal, InstanceBase **p_cull_result, int p_cull_count, RID p_framebuffer, const Rect2i &p_region) = 0; @@ -261,7 +278,7 @@ public: virtual void set_debug_draw_mode(RS::ViewportDebugDraw p_debug_draw) = 0; virtual RID render_buffers_create() = 0; - virtual void render_buffers_configure(RID p_render_buffers, RID p_render_target, int p_width, int p_height, RS::ViewportMSAA p_msaa) = 0; + virtual void render_buffers_configure(RID p_render_buffers, RID p_render_target, int p_width, int p_height, RS::ViewportMSAA p_msaa, RS::ViewportScreenSpaceAA p_screen_space_aa) = 0; virtual void screen_space_roughness_limiter_set_active(bool p_enable, float p_curve) = 0; virtual bool screen_space_roughness_limiter_is_active() const = 0; @@ -321,6 +338,9 @@ public: virtual Size2 texture_size_with_proxy(RID p_proxy) = 0; + virtual void texture_add_to_decal_atlas(RID p_texture, bool p_panorama_to_dp = false) = 0; + virtual void texture_remove_from_decal_atlas(RID p_texture, bool p_panorama_to_dp = false) = 0; + /* SHADER API */ virtual RID shader_create() = 0; @@ -348,6 +368,14 @@ public: virtual bool material_is_animated(RID p_material) = 0; virtual bool material_casts_shadows(RID p_material) = 0; + struct InstanceShaderParam { + PropertyInfo info; + int index; + Variant default_value; + }; + + virtual void material_get_instance_shader_parameters(RID p_material, List<InstanceShaderParam> *r_parameters) = 0; + virtual void material_update_dependency(RID p_material, RasterizerScene::InstanceBase *p_instance) = 0; /* MESH API */ @@ -501,6 +529,21 @@ public: virtual void base_update_dependency(RID p_base, RasterizerScene::InstanceBase *p_instance) = 0; virtual void skeleton_update_dependency(RID p_base, RasterizerScene::InstanceBase *p_instance) = 0; + /* DECAL API */ + + virtual RID decal_create() = 0; + virtual void decal_set_extents(RID p_decal, const Vector3 &p_extents) = 0; + virtual void decal_set_texture(RID p_decal, RS::DecalTexture p_type, RID p_texture) = 0; + virtual void decal_set_emission_energy(RID p_decal, float p_energy) = 0; + virtual void decal_set_albedo_mix(RID p_decal, float p_mix) = 0; + virtual void decal_set_modulate(RID p_decal, const Color &p_modulate) = 0; + virtual void decal_set_cull_mask(RID p_decal, uint32_t p_layers) = 0; + virtual void decal_set_distance_fade(RID p_decal, bool p_enabled, float p_begin, float p_length) = 0; + virtual void decal_set_fade(RID p_decal, float p_above, float p_below) = 0; + virtual void decal_set_normal_fade(RID p_decal, float p_fade) = 0; + + virtual AABB decal_get_aabb(RID p_decal) const = 0; + /* GI PROBE API */ virtual RID gi_probe_create() = 0; @@ -611,6 +654,24 @@ public: virtual int particles_get_draw_passes(RID p_particles) const = 0; virtual RID particles_get_draw_pass_mesh(RID p_particles, int p_pass) const = 0; + /* GLOBAL VARIABLES */ + + virtual void global_variable_add(const StringName &p_name, RS::GlobalVariableType p_type, const Variant &p_value) = 0; + virtual void global_variable_remove(const StringName &p_name) = 0; + virtual Vector<StringName> global_variable_get_list() const = 0; + + virtual void global_variable_set(const StringName &p_name, const Variant &p_value) = 0; + virtual void global_variable_set_override(const StringName &p_name, const Variant &p_value) = 0; + virtual Variant global_variable_get(const StringName &p_name) const = 0; + virtual RS::GlobalVariableType global_variable_get_type(const StringName &p_name) const = 0; + + virtual void global_variables_load_settings(bool p_load_textures = true) = 0; + virtual void global_variables_clear() = 0; + + virtual int32_t global_variables_instance_allocate(RID p_instance) = 0; + virtual void global_variables_instance_free(RID p_instance) = 0; + virtual void global_variables_instance_update(RID p_instance, int p_index, const Variant &p_value) = 0; + /* RENDER TARGET */ enum RenderTargetFlags { diff --git a/servers/rendering/rasterizer_rd/light_cluster_builder.cpp b/servers/rendering/rasterizer_rd/light_cluster_builder.cpp index 943ef1c7fa..f75308a975 100644 --- a/servers/rendering/rasterizer_rd/light_cluster_builder.cpp +++ b/servers/rendering/rasterizer_rd/light_cluster_builder.cpp @@ -39,6 +39,7 @@ void LightClusterBuilder::begin(const Transform &p_view_transform, const CameraM //reset counts light_count = 0; refprobe_count = 0; + decal_count = 0; item_count = 0; sort_id_count = 0; } diff --git a/servers/rendering/rasterizer_rd/light_cluster_builder.h b/servers/rendering/rasterizer_rd/light_cluster_builder.h index 3411ed07a0..78288dc620 100644 --- a/servers/rendering/rasterizer_rd/light_cluster_builder.h +++ b/servers/rendering/rasterizer_rd/light_cluster_builder.h @@ -170,17 +170,15 @@ public: _add_item(aabb, ITEM_TYPE_OMNI_LIGHT, light_count); } break; case LIGHT_TYPE_SPOT: { - Vector3 v(0, 0, -1); - v.rotated(Vector3(0, 1, 0), Math::deg2rad(ld.spot_aperture)); //rotate in x-z - v.normalize(); - v *= ld.radius; - v.y = v.x; + + float r = ld.radius; + real_t len = Math::tan(Math::deg2rad(ld.spot_aperture)) * r; aabb.position = xform.origin; - aabb.expand_to(xform.xform(v)); - aabb.expand_to(xform.xform(Vector3(-v.x, v.y, v.z))); - aabb.expand_to(xform.xform(Vector3(-v.x, -v.y, v.z))); - aabb.expand_to(xform.xform(Vector3(v.x, -v.y, v.z))); + aabb.expand_to(xform.xform(Vector3(len, len, -r))); + aabb.expand_to(xform.xform(Vector3(-len, len, -r))); + aabb.expand_to(xform.xform(Vector3(-len, -len, -r))); + aabb.expand_to(xform.xform(Vector3(len, -len, -r))); _add_item(aabb, ITEM_TYPE_SPOT_LIGHT, light_count); } break; } @@ -195,23 +193,25 @@ public: refprobes = (OrientedBoxData *)memrealloc(refprobes, sizeof(OrientedBoxData) * refprobe_max); } + Transform xform = view_xform * p_transform; + OrientedBoxData &rp = refprobes[refprobe_count]; - Vector3 origin = p_transform.origin; + Vector3 origin = xform.origin; rp.position[0] = origin.x; rp.position[1] = origin.y; rp.position[2] = origin.z; - Vector3 x_axis = p_transform.basis.get_axis(0) * p_half_extents.x; + Vector3 x_axis = xform.basis.get_axis(0) * p_half_extents.x; rp.x_axis[0] = x_axis.x; rp.x_axis[1] = x_axis.y; rp.x_axis[2] = x_axis.z; - Vector3 y_axis = p_transform.basis.get_axis(1) * p_half_extents.y; + Vector3 y_axis = xform.basis.get_axis(1) * p_half_extents.y; rp.y_axis[0] = y_axis.x; rp.y_axis[1] = y_axis.y; rp.y_axis[2] = y_axis.z; - Vector3 z_axis = p_transform.basis.get_axis(2) * p_half_extents.z; + Vector3 z_axis = xform.basis.get_axis(2) * p_half_extents.z; rp.z_axis[0] = z_axis.x; rp.z_axis[1] = z_axis.y; rp.z_axis[2] = z_axis.z; @@ -232,35 +232,37 @@ public: refprobe_count++; } - _FORCE_INLINE_ void add_decal(const Transform &p_transform, const Vector2 &p_half_extents, float p_depth) { + _FORCE_INLINE_ void add_decal(const Transform &p_transform, const Vector3 &p_half_extents) { if (unlikely(decal_count == decal_max)) { decal_max = nearest_power_of_2_templated(decal_max + 1); decals = (OrientedBoxData *)memrealloc(decals, sizeof(OrientedBoxData) * decal_max); } - OrientedBoxData &dc = decals[decal_count]; + Transform xform = view_xform * p_transform; - Vector3 z_axis = -p_transform.basis.get_axis(2) * p_depth * 0.5; - dc.z_axis[0] = z_axis.x; - dc.z_axis[1] = z_axis.y; - dc.z_axis[2] = z_axis.z; + OrientedBoxData &dc = decals[decal_count]; - Vector3 origin = p_transform.origin - z_axis; + Vector3 origin = xform.origin; dc.position[0] = origin.x; dc.position[1] = origin.y; dc.position[2] = origin.z; - Vector3 x_axis = p_transform.basis.get_axis(0) * p_half_extents.x; + Vector3 x_axis = xform.basis.get_axis(0) * p_half_extents.x; dc.x_axis[0] = x_axis.x; dc.x_axis[1] = x_axis.y; dc.x_axis[2] = x_axis.z; - Vector3 y_axis = p_transform.basis.get_axis(1) * p_half_extents.y; + Vector3 y_axis = xform.basis.get_axis(1) * p_half_extents.y; dc.y_axis[0] = y_axis.x; dc.y_axis[1] = y_axis.y; dc.y_axis[2] = y_axis.z; + Vector3 z_axis = xform.basis.get_axis(2) * p_half_extents.z; + dc.z_axis[0] = z_axis.x; + dc.z_axis[1] = z_axis.y; + dc.z_axis[2] = z_axis.z; + AABB aabb; aabb.position = origin + x_axis + y_axis + z_axis; diff --git a/servers/rendering/rasterizer_rd/rasterizer_canvas_rd.cpp b/servers/rendering/rasterizer_rd/rasterizer_canvas_rd.cpp index ba4f4c4acb..956bf54d01 100644 --- a/servers/rendering/rasterizer_rd/rasterizer_canvas_rd.cpp +++ b/servers/rendering/rasterizer_rd/rasterizer_canvas_rd.cpp @@ -273,7 +273,7 @@ RasterizerCanvas::PolygonID RasterizerCanvasRD::request_polygon(const Vector<int Vector<uint8_t> polygon_buffer; polygon_buffer.resize(buffer_size * sizeof(float)); - Vector<RD::VertexDescription> descriptions; + Vector<RD::VertexAttribute> descriptions; descriptions.resize(4); Vector<RID> buffers; buffers.resize(4); @@ -284,7 +284,7 @@ RasterizerCanvas::PolygonID RasterizerCanvasRD::request_polygon(const Vector<int uint32_t *uptr = (uint32_t *)r; uint32_t base_offset = 0; { //vertices - RD::VertexDescription vd; + RD::VertexAttribute vd; vd.format = RD::DATA_FORMAT_R32G32_SFLOAT; vd.offset = base_offset * sizeof(float); vd.location = RS::ARRAY_VERTEX; @@ -304,7 +304,7 @@ RasterizerCanvas::PolygonID RasterizerCanvasRD::request_polygon(const Vector<int //colors if ((uint32_t)p_colors.size() == vertex_count || p_colors.size() == 1) { - RD::VertexDescription vd; + RD::VertexAttribute vd; vd.format = RD::DATA_FORMAT_R32G32B32A32_SFLOAT; vd.offset = base_offset * sizeof(float); vd.location = RS::ARRAY_COLOR; @@ -332,7 +332,7 @@ RasterizerCanvas::PolygonID RasterizerCanvasRD::request_polygon(const Vector<int } base_offset += 4; } else { - RD::VertexDescription vd; + RD::VertexAttribute vd; vd.format = RD::DATA_FORMAT_R32G32B32A32_SFLOAT; vd.offset = 0; vd.location = RS::ARRAY_COLOR; @@ -344,7 +344,7 @@ RasterizerCanvas::PolygonID RasterizerCanvasRD::request_polygon(const Vector<int //uvs if ((uint32_t)p_uvs.size() == vertex_count) { - RD::VertexDescription vd; + RD::VertexAttribute vd; vd.format = RD::DATA_FORMAT_R32G32_SFLOAT; vd.offset = base_offset * sizeof(float); vd.location = RS::ARRAY_TEX_UV; @@ -360,7 +360,7 @@ RasterizerCanvas::PolygonID RasterizerCanvasRD::request_polygon(const Vector<int } base_offset += 2; } else { - RD::VertexDescription vd; + RD::VertexAttribute vd; vd.format = RD::DATA_FORMAT_R32G32_SFLOAT; vd.offset = 0; vd.location = RS::ARRAY_TEX_UV; @@ -372,7 +372,7 @@ RasterizerCanvas::PolygonID RasterizerCanvasRD::request_polygon(const Vector<int //bones if ((uint32_t)p_indices.size() == vertex_count * 4 && (uint32_t)p_weights.size() == vertex_count * 4) { - RD::VertexDescription vd; + RD::VertexAttribute vd; vd.format = RD::DATA_FORMAT_R32G32B32A32_UINT; vd.offset = base_offset * sizeof(float); vd.location = RS::ARRAY_BONES; @@ -401,7 +401,7 @@ RasterizerCanvas::PolygonID RasterizerCanvasRD::request_polygon(const Vector<int base_offset += 4; } else { - RD::VertexDescription vd; + RD::VertexAttribute vd; vd.format = RD::DATA_FORMAT_R32G32B32A32_UINT; vd.offset = 0; vd.location = RS::ARRAY_BONES; @@ -618,6 +618,14 @@ void RasterizerCanvasRD::_render_item(RD::DrawListID p_draw_list, const Item *p_ } } + { + RD::Uniform u; + u.type = RD::UNIFORM_TYPE_STORAGE_BUFFER; + u.binding = 7; + u.ids.push_back(storage->global_variables_get_storage_buffer()); + uniforms.push_back(u); + } + //validate and update lighs if they are being used if (light_count > 0) { @@ -2012,6 +2020,9 @@ void RasterizerCanvasRD::ShaderData::get_param_list(List<PropertyInfo> *p_param_ for (Map<StringName, ShaderLanguage::ShaderNode::Uniform>::Element *E = uniforms.front(); E; E = E->next()) { + if (E->get().scope != ShaderLanguage::ShaderNode::Uniform::SCOPE_LOCAL) { + continue; + } if (E->get().texture_order >= 0) { order[E->get().texture_order + 100000] = E->key(); } else { @@ -2027,6 +2038,23 @@ void RasterizerCanvasRD::ShaderData::get_param_list(List<PropertyInfo> *p_param_ } } +void RasterizerCanvasRD::ShaderData::get_instance_param_list(List<RasterizerStorage::InstanceShaderParam> *p_param_list) const { + + for (Map<StringName, ShaderLanguage::ShaderNode::Uniform>::Element *E = uniforms.front(); E; E = E->next()) { + + if (E->get().scope != ShaderLanguage::ShaderNode::Uniform::SCOPE_INSTANCE) { + continue; + } + + RasterizerStorage::InstanceShaderParam p; + p.info = ShaderLanguage::uniform_to_property_info(E->get()); + p.info.name = E->key(); //supply name + p.index = E->get().instance_index; + p.default_value = ShaderLanguage::constant_value_to_variant(E->get().default_value, E->get().type, E->get().hint); + p_param_list->push_back(p); + } +} + bool RasterizerCanvasRD::ShaderData::is_param_texture(const StringName &p_param) const { if (!uniforms.has(p_param)) { return false; @@ -2366,6 +2394,8 @@ RasterizerCanvasRD::RasterizerCanvasRD(RasterizerStorageRD *p_storage) { actions.default_repeat = ShaderLanguage::REPEAT_DISABLE; actions.base_varying_index = 4; + actions.global_buffer_array_variable = "global_variables.data"; + shader.compiler.initialize(actions); } @@ -2393,8 +2423,8 @@ RasterizerCanvasRD::RasterizerCanvasRD(RasterizerStorageRD *p_storage) { } //pipelines - Vector<RD::VertexDescription> vf; - RD::VertexDescription vd; + Vector<RD::VertexAttribute> vf; + RD::VertexAttribute vd; vd.format = RD::DATA_FORMAT_R32G32B32_SFLOAT; vd.location = 0; vd.offset = 0; diff --git a/servers/rendering/rasterizer_rd/rasterizer_canvas_rd.h b/servers/rendering/rasterizer_rd/rasterizer_canvas_rd.h index 83b431eaf6..4d47b3e13b 100644 --- a/servers/rendering/rasterizer_rd/rasterizer_canvas_rd.h +++ b/servers/rendering/rasterizer_rd/rasterizer_canvas_rd.h @@ -185,6 +185,8 @@ class RasterizerCanvasRD : public RasterizerCanvas { virtual void set_code(const String &p_Code); virtual void set_default_texture_param(const StringName &p_name, RID p_texture); virtual void get_param_list(List<PropertyInfo> *p_param_list) const; + virtual void get_instance_param_list(List<RasterizerStorage::InstanceShaderParam> *p_param_list) const; + virtual bool is_param_texture(const StringName &p_param) const; virtual bool is_animated() const; virtual bool casts_shadows() const; diff --git a/servers/rendering/rasterizer_rd/rasterizer_effects_rd.cpp b/servers/rendering/rasterizer_rd/rasterizer_effects_rd.cpp index 2d881dbd37..d469dd97ca 100644 --- a/servers/rendering/rasterizer_rd/rasterizer_effects_rd.cpp +++ b/servers/rendering/rasterizer_rd/rasterizer_effects_rd.cpp @@ -99,7 +99,7 @@ RID RasterizerEffectsRD::_get_uniform_set_from_texture(RID p_texture, bool p_use u.ids.push_back(p_texture); uniforms.push_back(u); //any thing with the same configuration (one texture in binding 0 for set 0), is good - RID uniform_set = RD::get_singleton()->uniform_set_create(uniforms, blur.shader.version_get_shader(blur.shader_version, 0), 0); + RID uniform_set = RD::get_singleton()->uniform_set_create(uniforms, tonemap.shader.version_get_shader(tonemap.shader_version, 0), 0); texture_to_uniform_set_cache[p_texture] = uniform_set; @@ -204,135 +204,224 @@ RID RasterizerEffectsRD::_get_compute_uniform_set_from_image_pair(RID p_texture1 return uniform_set; } -void RasterizerEffectsRD::copy_to_rect(RID p_source_rd_texture, RID p_dest_framebuffer, const Rect2 &p_rect, bool p_flip_y, bool p_force_luminance) { +void RasterizerEffectsRD::copy_to_atlas_fb(RID p_source_rd_texture, RID p_dest_framebuffer, const Rect2 &p_uv_rect, RD::DrawListID p_draw_list, bool p_flip_y, bool p_panorama) { + + zeromem(©_to_fb.push_constant, sizeof(CopyToFbPushConstant)); + + copy_to_fb.push_constant.use_section = true; + copy_to_fb.push_constant.section[0] = p_uv_rect.position.x; + copy_to_fb.push_constant.section[1] = p_uv_rect.position.y; + copy_to_fb.push_constant.section[2] = p_uv_rect.size.x; + copy_to_fb.push_constant.section[3] = p_uv_rect.size.y; - zeromem(&blur.push_constant, sizeof(BlurPushConstant)); if (p_flip_y) { - blur.push_constant.flags |= BLUR_FLAG_FLIP_Y; + copy_to_fb.push_constant.flip_y = true; + } + + RD::DrawListID draw_list = p_draw_list; + RD::get_singleton()->draw_list_bind_render_pipeline(draw_list, copy_to_fb.pipelines[p_panorama ? COPY_TO_FB_COPY_PANORAMA_TO_DP : COPY_TO_FB_COPY].get_render_pipeline(RD::INVALID_ID, RD::get_singleton()->framebuffer_get_format(p_dest_framebuffer))); + RD::get_singleton()->draw_list_bind_uniform_set(draw_list, _get_uniform_set_from_texture(p_source_rd_texture), 0); + RD::get_singleton()->draw_list_bind_index_array(draw_list, index_array); + RD::get_singleton()->draw_list_set_push_constant(draw_list, ©_to_fb.push_constant, sizeof(CopyToFbPushConstant)); + RD::get_singleton()->draw_list_draw(draw_list, true); +} + +void RasterizerEffectsRD::copy_to_fb_rect(RID p_source_rd_texture, RID p_dest_framebuffer, const Rect2i &p_rect, bool p_flip_y, bool p_force_luminance, bool p_alpha_to_zero) { + zeromem(©_to_fb.push_constant, sizeof(CopyToFbPushConstant)); + + if (p_flip_y) { + copy_to_fb.push_constant.flip_y = true; } if (p_force_luminance) { - blur.push_constant.flags |= BLUR_COPY_FORCE_LUMINANCE; + copy_to_fb.push_constant.force_luminance = true; + } + if (p_alpha_to_zero) { + copy_to_fb.push_constant.alpha_to_zero = true; } RD::DrawListID draw_list = RD::get_singleton()->draw_list_begin(p_dest_framebuffer, RD::INITIAL_ACTION_KEEP, RD::FINAL_ACTION_READ, RD::INITIAL_ACTION_KEEP, RD::FINAL_ACTION_DISCARD, Vector<Color>(), 1.0, 0, p_rect); - RD::get_singleton()->draw_list_bind_render_pipeline(draw_list, blur.pipelines[BLUR_MODE_SIMPLY_COPY].get_render_pipeline(RD::INVALID_ID, RD::get_singleton()->framebuffer_get_format(p_dest_framebuffer))); + RD::get_singleton()->draw_list_bind_render_pipeline(draw_list, copy_to_fb.pipelines[COPY_TO_FB_COPY].get_render_pipeline(RD::INVALID_ID, RD::get_singleton()->framebuffer_get_format(p_dest_framebuffer))); RD::get_singleton()->draw_list_bind_uniform_set(draw_list, _get_uniform_set_from_texture(p_source_rd_texture), 0); RD::get_singleton()->draw_list_bind_index_array(draw_list, index_array); - RD::get_singleton()->draw_list_set_push_constant(draw_list, &blur.push_constant, sizeof(BlurPushConstant)); + RD::get_singleton()->draw_list_set_push_constant(draw_list, ©_to_fb.push_constant, sizeof(CopyToFbPushConstant)); RD::get_singleton()->draw_list_draw(draw_list, true); RD::get_singleton()->draw_list_end(); } -void RasterizerEffectsRD::region_copy(RID p_source_rd_texture, RID p_dest_framebuffer, const Rect2 &p_region) { +void RasterizerEffectsRD::copy_to_rect(RID p_source_rd_texture, RID p_dest_texture, const Rect2i &p_rect, bool p_flip_y, bool p_force_luminance, bool p_all_source, bool p_8_bit_dst) { + + zeromem(©.push_constant, sizeof(CopyPushConstant)); + if (p_flip_y) { + copy.push_constant.flags |= COPY_FLAG_FLIP_Y; + } - zeromem(&blur.push_constant, sizeof(BlurPushConstant)); + if (p_force_luminance) { + copy.push_constant.flags |= COPY_FLAG_FORCE_LUMINANCE; + } - if (p_region != Rect2()) { - blur.push_constant.flags = BLUR_FLAG_USE_BLUR_SECTION; - blur.push_constant.section[0] = p_region.position.x; - blur.push_constant.section[1] = p_region.position.y; - blur.push_constant.section[2] = p_region.size.width; - blur.push_constant.section[3] = p_region.size.height; + if (p_all_source) { + copy.push_constant.flags |= COPY_FLAG_ALL_SOURCE; } - RD::DrawListID draw_list = RD::get_singleton()->draw_list_begin(p_dest_framebuffer, RD::INITIAL_ACTION_KEEP, RD::FINAL_ACTION_READ, RD::INITIAL_ACTION_KEEP, RD::FINAL_ACTION_DISCARD); - RD::get_singleton()->draw_list_bind_render_pipeline(draw_list, blur.pipelines[BLUR_MODE_SIMPLY_COPY].get_render_pipeline(RD::INVALID_ID, RD::get_singleton()->framebuffer_get_format(p_dest_framebuffer))); - RD::get_singleton()->draw_list_bind_uniform_set(draw_list, _get_uniform_set_from_texture(p_source_rd_texture), 0); - RD::get_singleton()->draw_list_bind_index_array(draw_list, index_array); - RD::get_singleton()->draw_list_set_push_constant(draw_list, &blur.push_constant, sizeof(BlurPushConstant)); - RD::get_singleton()->draw_list_draw(draw_list, true); - RD::get_singleton()->draw_list_end(); + copy.push_constant.section[0] = 0; + copy.push_constant.section[1] = 0; + copy.push_constant.section[2] = p_rect.size.width; + copy.push_constant.section[3] = p_rect.size.height; + copy.push_constant.target[0] = p_rect.position.x; + copy.push_constant.target[1] = p_rect.position.y; + + int32_t x_groups = (p_rect.size.width - 1) / 8 + 1; + int32_t y_groups = (p_rect.size.height - 1) / 8 + 1; + + RD::ComputeListID compute_list = RD::get_singleton()->compute_list_begin(); + RD::get_singleton()->compute_list_bind_compute_pipeline(compute_list, copy.pipelines[p_8_bit_dst ? COPY_MODE_SIMPLY_COPY_8BIT : COPY_MODE_SIMPLY_COPY]); + RD::get_singleton()->compute_list_bind_uniform_set(compute_list, _get_compute_uniform_set_from_texture(p_source_rd_texture), 0); + RD::get_singleton()->compute_list_bind_uniform_set(compute_list, _get_uniform_set_from_image(p_dest_texture), 3); + RD::get_singleton()->compute_list_set_push_constant(compute_list, ©.push_constant, sizeof(CopyPushConstant)); + RD::get_singleton()->compute_list_dispatch(compute_list, x_groups, y_groups, 1); + RD::get_singleton()->compute_list_end(); } -void RasterizerEffectsRD::gaussian_blur(RID p_source_rd_texture, RID p_framebuffer_half, RID p_rd_texture_half, RID p_dest_framebuffer, const Vector2 &p_pixel_size, const Rect2 &p_region) { +void RasterizerEffectsRD::copy_depth_to_rect_and_linearize(RID p_source_rd_texture, RID p_dest_texture, const Rect2i &p_rect, bool p_flip_y, float p_z_near, float p_z_far) { - zeromem(&blur.push_constant, sizeof(BlurPushConstant)); + zeromem(©.push_constant, sizeof(CopyPushConstant)); + if (p_flip_y) { + copy.push_constant.flags |= COPY_FLAG_FLIP_Y; + } - uint32_t base_flags = 0; - if (p_region != Rect2()) { - base_flags = BLUR_FLAG_USE_BLUR_SECTION; - blur.push_constant.section[0] = p_region.position.x; - blur.push_constant.section[1] = p_region.position.y; - blur.push_constant.section[2] = p_region.size.width; - blur.push_constant.section[3] = p_region.size.height; + copy.push_constant.section[0] = 0; + copy.push_constant.section[1] = 0; + copy.push_constant.section[2] = p_rect.size.width; + copy.push_constant.section[3] = p_rect.size.height; + copy.push_constant.target[0] = p_rect.position.x; + copy.push_constant.target[1] = p_rect.position.y; + copy.push_constant.camera_z_far = p_z_far; + copy.push_constant.camera_z_near = p_z_near; + + int32_t x_groups = (p_rect.size.width - 1) / 8 + 1; + int32_t y_groups = (p_rect.size.height - 1) / 8 + 1; + + RD::ComputeListID compute_list = RD::get_singleton()->compute_list_begin(); + RD::get_singleton()->compute_list_bind_compute_pipeline(compute_list, copy.pipelines[COPY_MODE_LINEARIZE_DEPTH]); + RD::get_singleton()->compute_list_bind_uniform_set(compute_list, _get_compute_uniform_set_from_texture(p_source_rd_texture), 0); + RD::get_singleton()->compute_list_bind_uniform_set(compute_list, _get_uniform_set_from_image(p_dest_texture), 3); + RD::get_singleton()->compute_list_set_push_constant(compute_list, ©.push_constant, sizeof(CopyPushConstant)); + RD::get_singleton()->compute_list_dispatch(compute_list, x_groups, y_groups, 1); + RD::get_singleton()->compute_list_end(); +} + +void RasterizerEffectsRD::copy_depth_to_rect(RID p_source_rd_texture, RID p_dest_texture, const Rect2i &p_rect, bool p_flip_y) { + + zeromem(©.push_constant, sizeof(CopyPushConstant)); + if (p_flip_y) { + copy.push_constant.flags |= COPY_FLAG_FLIP_Y; } - blur.push_constant.pixel_size[0] = p_pixel_size.x; - blur.push_constant.pixel_size[1] = p_pixel_size.y; + copy.push_constant.section[0] = 0; + copy.push_constant.section[1] = 0; + copy.push_constant.section[2] = p_rect.size.width; + copy.push_constant.section[3] = p_rect.size.height; + copy.push_constant.target[0] = p_rect.position.x; + copy.push_constant.target[1] = p_rect.position.y; + int32_t x_groups = (p_rect.size.width - 1) / 8 + 1; + int32_t y_groups = (p_rect.size.height - 1) / 8 + 1; + + RD::ComputeListID compute_list = RD::get_singleton()->compute_list_begin(); + RD::get_singleton()->compute_list_bind_compute_pipeline(compute_list, copy.pipelines[COPY_MODE_SIMPLY_COPY_DEPTH]); + RD::get_singleton()->compute_list_bind_uniform_set(compute_list, _get_compute_uniform_set_from_texture(p_source_rd_texture), 0); + RD::get_singleton()->compute_list_bind_uniform_set(compute_list, _get_uniform_set_from_image(p_dest_texture), 3); + RD::get_singleton()->compute_list_set_push_constant(compute_list, ©.push_constant, sizeof(CopyPushConstant)); + RD::get_singleton()->compute_list_dispatch(compute_list, x_groups, y_groups, 1); + RD::get_singleton()->compute_list_end(); +} + +void RasterizerEffectsRD::gaussian_blur(RID p_source_rd_texture, RID p_texture, RID p_back_texture, const Rect2i &p_region, bool p_8bit_dst) { + + zeromem(©.push_constant, sizeof(CopyPushConstant)); + + uint32_t base_flags = 0; + copy.push_constant.section[0] = p_region.position.x; + copy.push_constant.section[1] = p_region.position.y; + copy.push_constant.section[2] = p_region.size.width; + copy.push_constant.section[3] = p_region.size.height; + + int32_t x_groups = (p_region.size.width - 1) / 8 + 1; + int32_t y_groups = (p_region.size.height - 1) / 8 + 1; //HORIZONTAL - RD::DrawListID draw_list = RD::get_singleton()->draw_list_begin(p_framebuffer_half, RD::INITIAL_ACTION_KEEP, RD::FINAL_ACTION_READ, RD::INITIAL_ACTION_KEEP, RD::FINAL_ACTION_DISCARD); - RD::get_singleton()->draw_list_bind_render_pipeline(draw_list, blur.pipelines[BLUR_MODE_GAUSSIAN_BLUR].get_render_pipeline(RD::INVALID_ID, RD::get_singleton()->framebuffer_get_format(p_framebuffer_half))); - RD::get_singleton()->draw_list_bind_uniform_set(draw_list, _get_uniform_set_from_texture(p_source_rd_texture), 0); - RD::get_singleton()->draw_list_bind_index_array(draw_list, index_array); + RD::DrawListID compute_list = RD::get_singleton()->compute_list_begin(); + RD::get_singleton()->compute_list_bind_compute_pipeline(compute_list, copy.pipelines[p_8bit_dst ? COPY_MODE_GAUSSIAN_COPY_8BIT : COPY_MODE_GAUSSIAN_COPY]); + RD::get_singleton()->compute_list_bind_uniform_set(compute_list, _get_compute_uniform_set_from_texture(p_source_rd_texture), 0); + RD::get_singleton()->compute_list_bind_uniform_set(compute_list, _get_uniform_set_from_image(p_back_texture), 0); - blur.push_constant.flags = base_flags | BLUR_FLAG_HORIZONTAL; - RD::get_singleton()->draw_list_set_push_constant(draw_list, &blur.push_constant, sizeof(BlurPushConstant)); + copy.push_constant.flags = base_flags | COPY_FLAG_HORIZONTAL; + RD::get_singleton()->compute_list_set_push_constant(compute_list, ©.push_constant, sizeof(CopyPushConstant)); - RD::get_singleton()->draw_list_draw(draw_list, true); - RD::get_singleton()->draw_list_end(); + RD::get_singleton()->compute_list_dispatch(compute_list, x_groups, y_groups, 1); + + RD::get_singleton()->compute_list_add_barrier(compute_list); //VERTICAL - draw_list = RD::get_singleton()->draw_list_begin(p_dest_framebuffer, RD::INITIAL_ACTION_KEEP, RD::FINAL_ACTION_READ, RD::INITIAL_ACTION_KEEP, RD::FINAL_ACTION_DISCARD); - RD::get_singleton()->draw_list_bind_render_pipeline(draw_list, blur.pipelines[BLUR_MODE_GAUSSIAN_BLUR].get_render_pipeline(RD::INVALID_ID, RD::get_singleton()->framebuffer_get_format(p_dest_framebuffer))); - RD::get_singleton()->draw_list_bind_uniform_set(draw_list, _get_uniform_set_from_texture(p_rd_texture_half), 0); - RD::get_singleton()->draw_list_bind_index_array(draw_list, index_array); + RD::get_singleton()->compute_list_bind_uniform_set(compute_list, _get_compute_uniform_set_from_texture(p_back_texture), 0); + RD::get_singleton()->compute_list_bind_uniform_set(compute_list, _get_uniform_set_from_image(p_texture), 0); - blur.push_constant.flags = base_flags; - RD::get_singleton()->draw_list_set_push_constant(draw_list, &blur.push_constant, sizeof(BlurPushConstant)); + copy.push_constant.flags = base_flags; + RD::get_singleton()->compute_list_set_push_constant(compute_list, ©.push_constant, sizeof(CopyPushConstant)); - RD::get_singleton()->draw_list_draw(draw_list, true); - RD::get_singleton()->draw_list_end(); + RD::get_singleton()->compute_list_dispatch(compute_list, x_groups, y_groups, 1); + RD::get_singleton()->compute_list_end(); } -void RasterizerEffectsRD::gaussian_glow(RID p_source_rd_texture, RID p_framebuffer_half, RID p_rd_texture_half, RID p_dest_framebuffer, const Vector2 &p_pixel_size, float p_strength, bool p_first_pass, float p_luminance_cap, float p_exposure, float p_bloom, float p_hdr_bleed_treshold, float p_hdr_bleed_scale, RID p_auto_exposure, float p_auto_exposure_grey) { +void RasterizerEffectsRD::gaussian_glow(RID p_source_rd_texture, RID p_texture, RID p_back_texture, const Size2i &p_size, float p_strength, bool p_first_pass, float p_luminance_cap, float p_exposure, float p_bloom, float p_hdr_bleed_treshold, float p_hdr_bleed_scale, RID p_auto_exposure, float p_auto_exposure_grey) { - zeromem(&blur.push_constant, sizeof(BlurPushConstant)); + zeromem(©.push_constant, sizeof(CopyPushConstant)); - BlurMode blur_mode = p_first_pass && p_auto_exposure.is_valid() ? BLUR_MODE_GAUSSIAN_GLOW_AUTO_EXPOSURE : BLUR_MODE_GAUSSIAN_GLOW; + CopyMode copy_mode = p_first_pass && p_auto_exposure.is_valid() ? COPY_MODE_GAUSSIAN_GLOW_AUTO_EXPOSURE : COPY_MODE_GAUSSIAN_GLOW; uint32_t base_flags = 0; - blur.push_constant.pixel_size[0] = p_pixel_size.x; - blur.push_constant.pixel_size[1] = p_pixel_size.y; + int32_t x_groups = (p_size.width - 1) / 8 + 1; + int32_t y_groups = (p_size.height - 1) / 8 + 1; + + copy.push_constant.section[2] = p_size.x; + copy.push_constant.section[3] = p_size.y; - blur.push_constant.glow_strength = p_strength; - blur.push_constant.glow_bloom = p_bloom; - blur.push_constant.glow_hdr_threshold = p_hdr_bleed_treshold; - blur.push_constant.glow_hdr_scale = p_hdr_bleed_scale; - blur.push_constant.glow_exposure = p_exposure; - blur.push_constant.glow_white = 0; //actually unused - blur.push_constant.glow_luminance_cap = p_luminance_cap; + copy.push_constant.glow_strength = p_strength; + copy.push_constant.glow_bloom = p_bloom; + copy.push_constant.glow_hdr_threshold = p_hdr_bleed_treshold; + copy.push_constant.glow_hdr_scale = p_hdr_bleed_scale; + copy.push_constant.glow_exposure = p_exposure; + copy.push_constant.glow_white = 0; //actually unused + copy.push_constant.glow_luminance_cap = p_luminance_cap; - blur.push_constant.glow_auto_exposure_grey = p_auto_exposure_grey; //unused also + copy.push_constant.glow_auto_exposure_grey = p_auto_exposure_grey; //unused also //HORIZONTAL - RD::DrawListID draw_list = RD::get_singleton()->draw_list_begin(p_framebuffer_half, RD::INITIAL_ACTION_KEEP, RD::FINAL_ACTION_READ, RD::INITIAL_ACTION_KEEP, RD::FINAL_ACTION_DISCARD); - RD::get_singleton()->draw_list_bind_render_pipeline(draw_list, blur.pipelines[blur_mode].get_render_pipeline(RD::INVALID_ID, RD::get_singleton()->framebuffer_get_format(p_framebuffer_half))); - RD::get_singleton()->draw_list_bind_uniform_set(draw_list, _get_uniform_set_from_texture(p_source_rd_texture), 0); + RD::ComputeListID compute_list = RD::get_singleton()->compute_list_begin(); + RD::get_singleton()->compute_list_bind_compute_pipeline(compute_list, copy.pipelines[copy_mode]); + RD::get_singleton()->compute_list_bind_uniform_set(compute_list, _get_compute_uniform_set_from_texture(p_source_rd_texture), 0); + RD::get_singleton()->compute_list_bind_uniform_set(compute_list, _get_uniform_set_from_image(p_back_texture), 3); if (p_auto_exposure.is_valid() && p_first_pass) { - RD::get_singleton()->draw_list_bind_uniform_set(draw_list, _get_uniform_set_from_texture(p_auto_exposure), 1); + RD::get_singleton()->compute_list_bind_uniform_set(compute_list, _get_compute_uniform_set_from_texture(p_auto_exposure), 1); } - RD::get_singleton()->draw_list_bind_index_array(draw_list, index_array); - blur.push_constant.flags = base_flags | BLUR_FLAG_HORIZONTAL | (p_first_pass ? BLUR_FLAG_GLOW_FIRST_PASS : 0); - RD::get_singleton()->draw_list_set_push_constant(draw_list, &blur.push_constant, sizeof(BlurPushConstant)); + copy.push_constant.flags = base_flags | COPY_FLAG_HORIZONTAL | (p_first_pass ? COPY_FLAG_GLOW_FIRST_PASS : 0); + RD::get_singleton()->compute_list_set_push_constant(compute_list, ©.push_constant, sizeof(CopyPushConstant)); - RD::get_singleton()->draw_list_draw(draw_list, true); - RD::get_singleton()->draw_list_end(); + RD::get_singleton()->compute_list_dispatch(compute_list, x_groups, y_groups, 1); + RD::get_singleton()->compute_list_add_barrier(compute_list); - blur_mode = BLUR_MODE_GAUSSIAN_GLOW; + copy_mode = COPY_MODE_GAUSSIAN_GLOW; //VERTICAL - draw_list = RD::get_singleton()->draw_list_begin(p_dest_framebuffer, RD::INITIAL_ACTION_KEEP, RD::FINAL_ACTION_READ, RD::INITIAL_ACTION_KEEP, RD::FINAL_ACTION_DISCARD); - RD::get_singleton()->draw_list_bind_render_pipeline(draw_list, blur.pipelines[blur_mode].get_render_pipeline(RD::INVALID_ID, RD::get_singleton()->framebuffer_get_format(p_dest_framebuffer))); - RD::get_singleton()->draw_list_bind_uniform_set(draw_list, _get_uniform_set_from_texture(p_rd_texture_half), 0); - RD::get_singleton()->draw_list_bind_index_array(draw_list, index_array); + RD::get_singleton()->compute_list_bind_compute_pipeline(compute_list, copy.pipelines[copy_mode]); + RD::get_singleton()->compute_list_bind_uniform_set(compute_list, _get_compute_uniform_set_from_texture(p_back_texture), 0); + RD::get_singleton()->compute_list_bind_uniform_set(compute_list, _get_uniform_set_from_image(p_texture), 3); - blur.push_constant.flags = base_flags; - RD::get_singleton()->draw_list_set_push_constant(draw_list, &blur.push_constant, sizeof(BlurPushConstant)); + copy.push_constant.flags = base_flags; + RD::get_singleton()->compute_list_set_push_constant(compute_list, ©.push_constant, sizeof(CopyPushConstant)); - RD::get_singleton()->draw_list_draw(draw_list, true); - RD::get_singleton()->draw_list_end(); + RD::get_singleton()->compute_list_dispatch(compute_list, x_groups, y_groups, 1); + RD::get_singleton()->compute_list_end(); } void RasterizerEffectsRD::screen_space_reflection(RID p_diffuse, RID p_normal, RenderingServer::EnvironmentSSRRoughnessQuality p_roughness_quality, RID p_roughness, RID p_blur_radius, RID p_blur_radius2, RID p_metallic, const Color &p_metallic_mask, RID p_depth, RID p_scale_depth, RID p_scale_normal, RID p_output, RID p_output_blur, const Size2i &p_screen_size, int p_max_steps, float p_fade_in, float p_fade_out, float p_tolerance, const CameraMatrix &p_camera) { @@ -541,37 +630,49 @@ void RasterizerEffectsRD::merge_specular(RID p_dest_framebuffer, RID p_specular, RD::get_singleton()->draw_list_end(); } -void RasterizerEffectsRD::make_mipmap(RID p_source_rd_texture, RID p_dest_framebuffer, const Vector2 &p_pixel_size) { +void RasterizerEffectsRD::make_mipmap(RID p_source_rd_texture, RID p_dest_texture, const Size2i &p_size) { - zeromem(&blur.push_constant, sizeof(BlurPushConstant)); + zeromem(©.push_constant, sizeof(CopyPushConstant)); - blur.push_constant.pixel_size[0] = p_pixel_size.x; - blur.push_constant.pixel_size[1] = p_pixel_size.y; + copy.push_constant.section[0] = 0; + copy.push_constant.section[1] = 0; + copy.push_constant.section[2] = p_size.width; + copy.push_constant.section[3] = p_size.height; - RD::DrawListID draw_list = RD::get_singleton()->draw_list_begin(p_dest_framebuffer, RD::INITIAL_ACTION_KEEP, RD::FINAL_ACTION_READ, RD::INITIAL_ACTION_KEEP, RD::FINAL_ACTION_DISCARD); - RD::get_singleton()->draw_list_bind_render_pipeline(draw_list, blur.pipelines[BLUR_MODE_MIPMAP].get_render_pipeline(RD::INVALID_ID, RD::get_singleton()->framebuffer_get_format(p_dest_framebuffer))); - RD::get_singleton()->draw_list_bind_uniform_set(draw_list, _get_uniform_set_from_texture(p_source_rd_texture), 0); - RD::get_singleton()->draw_list_bind_index_array(draw_list, index_array); - RD::get_singleton()->draw_list_set_push_constant(draw_list, &blur.push_constant, sizeof(BlurPushConstant)); - RD::get_singleton()->draw_list_draw(draw_list, true); - RD::get_singleton()->draw_list_end(); + int32_t x_groups = (p_size.width - 1) / 8 + 1; + int32_t y_groups = (p_size.height - 1) / 8 + 1; + + RD::ComputeListID compute_list = RD::get_singleton()->compute_list_begin(); + RD::get_singleton()->compute_list_bind_compute_pipeline(compute_list, copy.pipelines[COPY_MODE_MIPMAP]); + RD::get_singleton()->compute_list_bind_uniform_set(compute_list, _get_compute_uniform_set_from_texture(p_source_rd_texture), 0); + RD::get_singleton()->compute_list_bind_uniform_set(compute_list, _get_uniform_set_from_image(p_dest_texture), 3); + RD::get_singleton()->compute_list_set_push_constant(compute_list, ©.push_constant, sizeof(CopyPushConstant)); + RD::get_singleton()->compute_list_dispatch(compute_list, x_groups, y_groups, 1); + RD::get_singleton()->compute_list_end(); } -void RasterizerEffectsRD::copy_cubemap_to_dp(RID p_source_rd_texture, RID p_dest_framebuffer, const Rect2 &p_rect, float p_z_near, float p_z_far, float p_bias, bool p_dp_flip) { +void RasterizerEffectsRD::copy_cubemap_to_dp(RID p_source_rd_texture, RID p_dest_texture, const Rect2i &p_rect, float p_z_near, float p_z_far, float p_bias, bool p_dp_flip) { CopyToDPPushConstant push_constant; + push_constant.screen_size[0] = p_rect.size.x; + push_constant.screen_size[1] = p_rect.size.y; + push_constant.dest_offset[0] = p_rect.position.x; + push_constant.dest_offset[1] = p_rect.position.y; push_constant.bias = p_bias; push_constant.z_far = p_z_far; push_constant.z_near = p_z_near; push_constant.z_flip = p_dp_flip; - RD::DrawListID draw_list = RD::get_singleton()->draw_list_begin(p_dest_framebuffer, RD::INITIAL_ACTION_KEEP, RD::FINAL_ACTION_READ, RD::INITIAL_ACTION_KEEP, RD::FINAL_ACTION_DISCARD, Vector<Color>(), 1.0, 0, p_rect); - RD::get_singleton()->draw_list_bind_render_pipeline(draw_list, copy.pipelines[COPY_MODE_CUBE_TO_DP].get_render_pipeline(RD::INVALID_ID, RD::get_singleton()->framebuffer_get_format(p_dest_framebuffer))); - RD::get_singleton()->draw_list_bind_uniform_set(draw_list, _get_uniform_set_from_texture(p_source_rd_texture), 0); - RD::get_singleton()->draw_list_bind_index_array(draw_list, index_array); - RD::get_singleton()->draw_list_set_push_constant(draw_list, &push_constant, sizeof(CopyToDPPushConstant)); - RD::get_singleton()->draw_list_draw(draw_list, true); - RD::get_singleton()->draw_list_end(); + int32_t x_groups = (p_rect.size.width - 1) / 8 + 1; + int32_t y_groups = (p_rect.size.height - 1) / 8 + 1; + + RD::ComputeListID compute_list = RD::get_singleton()->compute_list_begin(); + RD::get_singleton()->compute_list_bind_compute_pipeline(compute_list, cube_to_dp.pipeline); + RD::get_singleton()->compute_list_bind_uniform_set(compute_list, _get_compute_uniform_set_from_texture(p_source_rd_texture), 0); + RD::get_singleton()->compute_list_bind_uniform_set(compute_list, _get_uniform_set_from_image(p_dest_texture), 1); + RD::get_singleton()->compute_list_set_push_constant(compute_list, &push_constant, sizeof(CopyToDPPushConstant)); + RD::get_singleton()->compute_list_dispatch(compute_list, x_groups, y_groups, 1); + RD::get_singleton()->compute_list_end(); } void RasterizerEffectsRD::tonemapper(RID p_source_color, RID p_dst_framebuffer, const TonemapSettings &p_settings) { @@ -600,7 +701,11 @@ void RasterizerEffectsRD::tonemapper(RID p_source_color, RID p_dst_framebuffer, tonemap.push_constant.use_color_correction = p_settings.use_color_correction; - RD::DrawListID draw_list = RD::get_singleton()->draw_list_begin(p_dst_framebuffer, RD::INITIAL_ACTION_KEEP, RD::FINAL_ACTION_READ, RD::INITIAL_ACTION_KEEP, RD::FINAL_ACTION_DISCARD); + tonemap.push_constant.use_fxaa = p_settings.use_fxaa; + tonemap.push_constant.pixel_size[0] = 1.0 / p_settings.texture_size.x; + tonemap.push_constant.pixel_size[1] = 1.0 / p_settings.texture_size.y; + + RD::DrawListID draw_list = RD::get_singleton()->draw_list_begin(p_dst_framebuffer, RD::INITIAL_ACTION_DROP, RD::FINAL_ACTION_READ, RD::INITIAL_ACTION_DROP, RD::FINAL_ACTION_DISCARD); RD::get_singleton()->draw_list_bind_render_pipeline(draw_list, tonemap.pipelines[mode].get_render_pipeline(RD::INVALID_ID, RD::get_singleton()->framebuffer_get_format(p_dst_framebuffer))); RD::get_singleton()->draw_list_bind_uniform_set(draw_list, _get_uniform_set_from_texture(p_source_color), 0); RD::get_singleton()->draw_list_bind_uniform_set(draw_list, _get_uniform_set_from_texture(p_settings.exposure_texture), 1); @@ -1110,30 +1215,39 @@ void RasterizerEffectsRD::render_sky(RD::DrawListID p_list, float p_time, RID p_ RasterizerEffectsRD::RasterizerEffectsRD() { - { // Initialize blur - Vector<String> blur_modes; - blur_modes.push_back("\n#define MODE_GAUSSIAN_BLUR\n"); - blur_modes.push_back("\n#define MODE_GAUSSIAN_GLOW\n"); - blur_modes.push_back("\n#define MODE_GAUSSIAN_GLOW\n#define GLOW_USE_AUTO_EXPOSURE\n"); - blur_modes.push_back("\n#define MODE_DOF_NEAR_BLUR\n#define DOF_QUALITY_LOW\n"); - blur_modes.push_back("\n#define MODE_DOF_NEAR_BLUR\n#define DOF_QUALITY_MEDIUM\n"); - blur_modes.push_back("\n#define MODE_DOF_NEAR_BLUR\n#define DOF_QUALITY_HIGH\n"); - blur_modes.push_back("\n#define MODE_DOF_NEAR_BLUR\n#define DOF_QUALITY_LOW\n#define DOF_NEAR_BLUR_MERGE\n"); - blur_modes.push_back("\n#define MODE_DOF_NEAR_BLUR\n#define DOF_QUALITY_MEDIUM\n#define DOF_NEAR_BLUR_MERGE\n"); - blur_modes.push_back("\n#define MODE_DOF_NEAR_BLUR\n#define DOF_QUALITY_HIGH\n#define DOF_NEAR_BLUR_MERGE\n"); - blur_modes.push_back("\n#define MODE_DOF_FAR_BLUR\n#define DOF_QUALITY_LOW\n"); - blur_modes.push_back("\n#define MODE_DOF_FAR_BLUR\n#define DOF_QUALITY_MEDIUM\n"); - blur_modes.push_back("\n#define MODE_DOF_FAR_BLUR\n#define DOF_QUALITY_HIGH\n"); - blur_modes.push_back("\n#define MODE_SSAO_MERGE\n"); - blur_modes.push_back("\n#define MODE_SIMPLE_COPY\n"); - blur_modes.push_back("\n#define MODE_MIPMAP\n"); - - blur.shader.initialize(blur_modes); - zeromem(&blur.push_constant, sizeof(BlurPushConstant)); - blur.shader_version = blur.shader.version_create(); - - for (int i = 0; i < BLUR_MODE_MAX; i++) { - blur.pipelines[i].setup(blur.shader.version_get_shader(blur.shader_version, i), RD::RENDER_PRIMITIVE_TRIANGLES, RD::PipelineRasterizationState(), RD::PipelineMultisampleState(), RD::PipelineDepthStencilState(), RD::PipelineColorBlendState::create_disabled(), 0); + { // Initialize copy + Vector<String> copy_modes; + copy_modes.push_back("\n#define MODE_GAUSSIAN_BLUR\n"); + copy_modes.push_back("\n#define MODE_GAUSSIAN_BLUR\n#define DST_IMAGE_8BIT\n"); + copy_modes.push_back("\n#define MODE_GAUSSIAN_GLOW\n"); + copy_modes.push_back("\n#define MODE_GAUSSIAN_GLOW\n#define GLOW_USE_AUTO_EXPOSURE\n"); + copy_modes.push_back("\n#define MODE_SIMPLE_COPY\n"); + copy_modes.push_back("\n#define MODE_SIMPLE_COPY\n#define DST_IMAGE_8BIT\n"); + copy_modes.push_back("\n#define MODE_SIMPLE_COPY_DEPTH\n"); + copy_modes.push_back("\n#define MODE_MIPMAP\n"); + copy_modes.push_back("\n#define MODE_LINEARIZE_DEPTH_COPY\n"); + + copy.shader.initialize(copy_modes); + zeromem(©.push_constant, sizeof(CopyPushConstant)); + copy.shader_version = copy.shader.version_create(); + + for (int i = 0; i < COPY_MODE_MAX; i++) { + copy.pipelines[i] = RD::get_singleton()->compute_pipeline_create(copy.shader.version_get_shader(copy.shader_version, i)); + } + } + { + Vector<String> copy_modes; + copy_modes.push_back("\n"); + copy_modes.push_back("\n#define MODE_PANORAMA_TO_DP\n"); + + copy_to_fb.shader.initialize(copy_modes); + + copy_to_fb.shader_version = copy_to_fb.shader.version_create(); + + //use additive + + for (int i = 0; i < COPY_TO_FB_MAX; i++) { + copy_to_fb.pipelines[i].setup(copy_to_fb.shader.version_get_shader(copy_to_fb.shader_version, i), RD::RENDER_PRIMITIVE_TRIANGLES, RD::PipelineRasterizationState(), RD::PipelineMultisampleState(), RD::PipelineDepthStencilState(), RD::PipelineColorBlendState::create_disabled(), 0); } } @@ -1182,15 +1296,13 @@ RasterizerEffectsRD::RasterizerEffectsRD() { { // Initialize copier Vector<String> copy_modes; - copy_modes.push_back("\n#define MODE_CUBE_TO_DP\n"); + copy_modes.push_back("\n"); - copy.shader.initialize(copy_modes); + cube_to_dp.shader.initialize(copy_modes); - copy.shader_version = copy.shader.version_create(); + cube_to_dp.shader_version = cube_to_dp.shader.version_create(); - for (int i = 0; i < COPY_MODE_MAX; i++) { - copy.pipelines[i].setup(copy.shader.version_get_shader(copy.shader_version, i), RD::RENDER_PRIMITIVE_TRIANGLES, RD::PipelineRasterizationState(), RD::PipelineMultisampleState(), RD::PipelineDepthStencilState(), RD::PipelineColorBlendState::create_disabled(), 0); - } + cube_to_dp.pipeline = RD::get_singleton()->compute_pipeline_create(cube_to_dp.shader.version_get_shader(cube_to_dp.shader_version, 0)); } { @@ -1462,9 +1574,10 @@ RasterizerEffectsRD::~RasterizerEffectsRD() { RD::get_singleton()->free(index_buffer); //array gets freed as dependency RD::get_singleton()->free(filter.coefficient_buffer); - blur.shader.version_free(blur.shader_version); bokeh.shader.version_free(bokeh.shader_version); copy.shader.version_free(copy.shader_version); + copy_to_fb.shader.version_free(copy_to_fb.shader_version); + cube_to_dp.shader.version_free(cube_to_dp.shader_version); cubemap_downsampler.shader.version_free(cubemap_downsampler.shader_version); filter.shader.version_free(filter.shader_version); luminance_reduce.shader.version_free(luminance_reduce.shader_version); diff --git a/servers/rendering/rasterizer_rd/rasterizer_effects_rd.h b/servers/rendering/rasterizer_rd/rasterizer_effects_rd.h index 27f051d194..531591442b 100644 --- a/servers/rendering/rasterizer_rd/rasterizer_effects_rd.h +++ b/servers/rendering/rasterizer_rd/rasterizer_effects_rd.h @@ -33,9 +33,10 @@ #include "core/math/camera_matrix.h" #include "servers/rendering/rasterizer_rd/render_pipeline_vertex_format_cache_rd.h" -#include "servers/rendering/rasterizer_rd/shaders/blur.glsl.gen.h" #include "servers/rendering/rasterizer_rd/shaders/bokeh_dof.glsl.gen.h" #include "servers/rendering/rasterizer_rd/shaders/copy.glsl.gen.h" +#include "servers/rendering/rasterizer_rd/shaders/copy_to_fb.glsl.gen.h" +#include "servers/rendering/rasterizer_rd/shaders/cube_to_dp.glsl.gen.h" #include "servers/rendering/rasterizer_rd/shaders/cubemap_downsampler.glsl.gen.h" #include "servers/rendering/rasterizer_rd/shaders/cubemap_filter.glsl.gen.h" #include "servers/rendering/rasterizer_rd/shaders/cubemap_roughness.glsl.gen.h" @@ -55,70 +56,87 @@ class RasterizerEffectsRD { - enum BlurMode { - BLUR_MODE_GAUSSIAN_BLUR, - BLUR_MODE_GAUSSIAN_GLOW, - BLUR_MODE_GAUSSIAN_GLOW_AUTO_EXPOSURE, - BLUR_MODE_DOF_NEAR_LOW, - BLUR_MODE_DOF_NEAR_MEDIUM, - BLUR_MODE_DOF_NEAR_HIGH, - BLUR_MODE_DOF_NEAR_MERGE_LOW, - BLUR_MODE_DOF_NEAR_MERGE_MEDIUM, - BLUR_MODE_DOF_NEAR_MERGE_HIGH, - BLUR_MODE_DOF_FAR_LOW, - BLUR_MODE_DOF_FAR_MEDIUM, - BLUR_MODE_DOF_FAR_HIGH, - BLUR_MODE_SSAO_MERGE, - BLUR_MODE_SIMPLY_COPY, - BLUR_MODE_MIPMAP, - BLUR_MODE_MAX, + enum CopyMode { + COPY_MODE_GAUSSIAN_COPY, + COPY_MODE_GAUSSIAN_COPY_8BIT, + COPY_MODE_GAUSSIAN_GLOW, + COPY_MODE_GAUSSIAN_GLOW_AUTO_EXPOSURE, + COPY_MODE_SIMPLY_COPY, + COPY_MODE_SIMPLY_COPY_8BIT, + COPY_MODE_SIMPLY_COPY_DEPTH, + COPY_MODE_MIPMAP, + COPY_MODE_LINEARIZE_DEPTH, + COPY_MODE_MAX, }; enum { - BLUR_FLAG_HORIZONTAL = (1 << 0), - BLUR_FLAG_USE_BLUR_SECTION = (1 << 1), - BLUR_FLAG_USE_ORTHOGONAL_PROJECTION = (1 << 2), - BLUR_FLAG_DOF_NEAR_FIRST_TAP = (1 << 3), - BLUR_FLAG_GLOW_FIRST_PASS = (1 << 4), - BLUR_FLAG_FLIP_Y = (1 << 5), - BLUR_COPY_FORCE_LUMINANCE = (1 << 6) + COPY_FLAG_HORIZONTAL = (1 << 0), + COPY_FLAG_USE_COPY_SECTION = (1 << 1), + COPY_FLAG_USE_ORTHOGONAL_PROJECTION = (1 << 2), + COPY_FLAG_DOF_NEAR_FIRST_TAP = (1 << 3), + COPY_FLAG_GLOW_FIRST_PASS = (1 << 4), + COPY_FLAG_FLIP_Y = (1 << 5), + COPY_FLAG_FORCE_LUMINANCE = (1 << 6), + COPY_FLAG_ALL_SOURCE = (1 << 7) }; - struct BlurPushConstant { - float section[4]; - float pixel_size[2]; + struct CopyPushConstant { + + int32_t section[4]; + int32_t target[2]; uint32_t flags; uint32_t pad; - //glow + // Glow. float glow_strength; float glow_bloom; float glow_hdr_threshold; float glow_hdr_scale; + float glow_exposure; float glow_white; float glow_luminance_cap; float glow_auto_exposure_grey; - //dof - float dof_begin; - float dof_end; - float dof_radius; - float dof_pad; - - float dof_dir[2]; + // DOF. float camera_z_far; float camera_z_near; + uint32_t pad2[2]; + }; + + struct Copy { + CopyPushConstant push_constant; + CopyShaderRD shader; + RID shader_version; + RID pipelines[COPY_MODE_MAX]; + + } copy; + + enum CopyToFBMode { + COPY_TO_FB_COPY, + COPY_TO_FB_COPY_PANORAMA_TO_DP, + COPY_TO_FB_MAX, + + }; + + struct CopyToFbPushConstant { + + float section[4]; + float pixel_size[2]; + uint32_t flip_y; + uint32_t use_section; - float ssao_color[4]; + uint32_t force_luminance; + uint32_t alpha_to_zero; + uint32_t pad[2]; }; - struct Blur { - BlurPushConstant push_constant; - BlurShaderRD shader; + struct CopyToFb { + CopyToFbPushConstant push_constant; + CopyToFbShaderRD shader; RID shader_version; - RenderPipelineVertexFormatCacheRD pipelines[BLUR_MODE_MAX]; + RenderPipelineVertexFormatCacheRD pipelines[COPY_TO_FB_MAX]; - } blur; + } copy_to_fb; struct CubemapRoughnessPushConstant { uint32_t face_id; @@ -161,10 +179,17 @@ class RasterizerEffectsRD { float exposure; float white; float auto_exposure_grey; + + float pixel_size[2]; + uint32_t use_fxaa; + uint32_t pad; }; + /* tonemap actually writes to a framebuffer, which is + * better to do using the raster pipeline rather than + * comptute, as that framebuffer might be in different formats + */ struct Tonemap { - TonemapPushConstant push_constant; TonemapShaderRD shader; RID shader_version; @@ -195,23 +220,20 @@ class RasterizerEffectsRD { } luminance_reduce; struct CopyToDPPushConstant { + int32_t screen_size[2]; + int32_t dest_offset[2]; float bias; float z_far; float z_near; uint32_t z_flip; }; - enum CopyMode { - COPY_MODE_CUBE_TO_DP, - COPY_MODE_MAX - }; - - struct Copy { + struct CoptToDP { - CopyShaderRD shader; + CubeToDpShaderRD shader; RID shader_version; - RenderPipelineVertexFormatCacheRD pipelines[COPY_MODE_MAX]; - } copy; + RID pipeline; + } cube_to_dp; struct BokehPushConstant { uint32_t size[2]; @@ -391,6 +413,10 @@ class RasterizerEffectsRD { SPECULAR_MERGE_MAX }; + /* Specular merge must be done using raster, rather than compute + * because it must continue the existing color buffer + */ + struct SpecularMerge { SpecularMergeShaderRD shader; @@ -536,16 +562,17 @@ class RasterizerEffectsRD { RID _get_compute_uniform_set_from_image_pair(RID p_texture, RID p_texture2); public: - //TODO must re-do most of the shaders in compute - - void region_copy(RID p_source_rd_texture, RID p_dest_framebuffer, const Rect2 &p_region); - void copy_to_rect(RID p_source_rd_texture, RID p_dest_framebuffer, const Rect2 &p_rect, bool p_flip_y = false, bool p_force_luminance = false); - void gaussian_blur(RID p_source_rd_texture, RID p_framebuffer_half, RID p_rd_texture_half, RID p_dest_framebuffer, const Vector2 &p_pixel_size, const Rect2 &p_region); - void gaussian_glow(RID p_source_rd_texture, RID p_framebuffer_half, RID p_rd_texture_half, RID p_dest_framebuffer, const Vector2 &p_pixel_size, float p_strength = 1.0, bool p_first_pass = false, float p_luminance_cap = 16.0, float p_exposure = 1.0, float p_bloom = 0.0, float p_hdr_bleed_treshold = 1.0, float p_hdr_bleed_scale = 1.0, RID p_auto_exposure = RID(), float p_auto_exposure_grey = 1.0); + void copy_to_fb_rect(RID p_source_rd_texture, RID p_dest_framebuffer, const Rect2i &p_rect, bool p_flip_y = false, bool p_force_luminance = false, bool p_alpha_to_zero = false); + void copy_to_rect(RID p_source_rd_texture, RID p_dest_texture, const Rect2i &p_rect, bool p_flip_y = false, bool p_force_luminance = false, bool p_all_source = false, bool p_8_bit_dst = false); + void copy_depth_to_rect(RID p_source_rd_texture, RID p_dest_framebuffer, const Rect2i &p_rect, bool p_flip_y = false); + void copy_depth_to_rect_and_linearize(RID p_source_rd_texture, RID p_dest_texture, const Rect2i &p_rect, bool p_flip_y, float p_z_near, float p_z_far); + void copy_to_atlas_fb(RID p_source_rd_texture, RID p_dest_framebuffer, const Rect2 &p_uv_rect, RD::DrawListID p_draw_list, bool p_flip_y = false, bool p_panorama = false); + void gaussian_blur(RID p_source_rd_texture, RID p_texture, RID p_back_texture, const Rect2i &p_region, bool p_8bit_dst = false); + void gaussian_glow(RID p_source_rd_texture, RID p_texture, RID p_back_texture, const Size2i &p_size, float p_strength = 1.0, bool p_first_pass = false, float p_luminance_cap = 16.0, float p_exposure = 1.0, float p_bloom = 0.0, float p_hdr_bleed_treshold = 1.0, float p_hdr_bleed_scale = 1.0, RID p_auto_exposure = RID(), float p_auto_exposure_grey = 1.0); void cubemap_roughness(RID p_source_rd_texture, RID p_dest_framebuffer, uint32_t p_face_id, uint32_t p_sample_count, float p_roughness, float p_size); - void make_mipmap(RID p_source_rd_texture, RID p_framebuffer_half, const Vector2 &p_pixel_size); - void copy_cubemap_to_dp(RID p_source_rd_texture, RID p_dest_framebuffer, const Rect2 &p_rect, float p_z_near, float p_z_far, float p_bias, bool p_dp_flip); + void make_mipmap(RID p_source_rd_texture, RID p_dest_texture, const Size2i &p_size); + void copy_cubemap_to_dp(RID p_source_rd_texture, RID p_dest_texture, const Rect2i &p_rect, float p_z_near, float p_z_far, float p_bias, bool p_dp_flip); void luminance_reduction(RID p_source_texture, const Size2i p_source_size, const Vector<RID> p_reduce, RID p_prev_luminance, float p_min_luminance, float p_max_luminance, float p_adjust, bool p_set = false); void bokeh_dof(RID p_base_texture, RID p_depth_texture, const Size2i &p_base_texture_size, RID p_secondary_texture, RID p_bokeh_texture1, RID p_bokeh_texture2, bool p_dof_far, float p_dof_far_begin, float p_dof_far_size, bool p_dof_near, float p_dof_near_begin, float p_dof_near_size, float p_bokeh_size, RS::DOFBokehShape p_bokeh_shape, RS::DOFBlurQuality p_quality, bool p_use_jitter, float p_cam_znear, float p_cam_zfar, bool p_cam_orthogonal); @@ -582,6 +609,9 @@ public: bool use_color_correction = false; RID color_correction_texture; + + bool use_fxaa = false; + Vector2i texture_size; }; void tonemapper(RID p_source_color, RID p_dst_framebuffer, const TonemapSettings &p_settings); 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 685c30b5b8..b3cf40f166 100644 --- a/servers/rendering/rasterizer_rd/rasterizer_scene_high_end_rd.cpp +++ b/servers/rendering/rasterizer_rd/rasterizer_scene_high_end_rd.cpp @@ -52,6 +52,21 @@ static _FORCE_INLINE_ void store_transform(const Transform &p_mtx, float *p_arra p_array[15] = 1; } +static _FORCE_INLINE_ void store_basis_3x4(const Basis &p_mtx, float *p_array) { + p_array[0] = p_mtx.elements[0][0]; + p_array[1] = p_mtx.elements[1][0]; + p_array[2] = p_mtx.elements[2][0]; + p_array[3] = 0; + p_array[4] = p_mtx.elements[0][1]; + p_array[5] = p_mtx.elements[1][1]; + p_array[6] = p_mtx.elements[2][1]; + p_array[7] = 0; + p_array[8] = p_mtx.elements[0][2]; + p_array[9] = p_mtx.elements[1][2]; + p_array[10] = p_mtx.elements[2][2]; + p_array[11] = 0; +} + static _FORCE_INLINE_ void store_transform_3x3(const Transform &p_mtx, float *p_array) { p_array[0] = p_mtx.basis.elements[0][0]; p_array[1] = p_mtx.basis.elements[1][0]; @@ -77,6 +92,13 @@ static _FORCE_INLINE_ void store_camera(const CameraMatrix &p_mtx, float *p_arra } } +static _FORCE_INLINE_ void store_soft_shadow_kernel(const float *p_kernel, float *p_array) { + + for (int i = 0; i < 128; i++) { + p_array[i] = p_kernel[i]; + } +} + /* SCENE SHADER */ void RasterizerSceneHighEndRD::ShaderData::set_code(const String &p_code) { //compile @@ -109,6 +131,7 @@ void RasterizerSceneHighEndRD::ShaderData::set_code(const String &p_code) { unshaded = false; uses_vertex = false; uses_sss = false; + uses_transmittance = false; uses_screen_texture = false; uses_depth_texture = false; uses_normal_texture = false; @@ -142,6 +165,7 @@ void RasterizerSceneHighEndRD::ShaderData::set_code(const String &p_code) { actions.render_mode_flags["depth_prepass_alpha"] = &uses_depth_pre_pass; actions.usage_flag_pointers["SSS_STRENGTH"] = &uses_sss; + actions.usage_flag_pointers["SSS_TRANSMITTANCE_DEPTH"] = &uses_transmittance; actions.usage_flag_pointers["SCREEN_TEXTURE"] = &uses_screen_texture; actions.usage_flag_pointers["DEPTH_TEXTURE"] = &uses_depth_texture; @@ -354,6 +378,10 @@ void RasterizerSceneHighEndRD::ShaderData::get_param_list(List<PropertyInfo> *p_ for (Map<StringName, ShaderLanguage::ShaderNode::Uniform>::Element *E = uniforms.front(); E; E = E->next()) { + if (E->get().scope != ShaderLanguage::ShaderNode::Uniform::SCOPE_LOCAL) { + continue; + } + if (E->get().texture_order >= 0) { order[E->get().texture_order + 100000] = E->key(); } else { @@ -369,6 +397,23 @@ void RasterizerSceneHighEndRD::ShaderData::get_param_list(List<PropertyInfo> *p_ } } +void RasterizerSceneHighEndRD::ShaderData::get_instance_param_list(List<RasterizerStorage::InstanceShaderParam> *p_param_list) const { + + for (Map<StringName, ShaderLanguage::ShaderNode::Uniform>::Element *E = uniforms.front(); E; E = E->next()) { + + if (E->get().scope != ShaderLanguage::ShaderNode::Uniform::SCOPE_INSTANCE) { + continue; + } + + RasterizerStorage::InstanceShaderParam p; + p.info = ShaderLanguage::uniform_to_property_info(E->get()); + p.info.name = E->key(); //supply name + p.index = E->get().instance_index; + p.default_value = ShaderLanguage::constant_value_to_variant(E->get().default_value, E->get().type, E->get().hint); + p_param_list->push_back(p); + } +} + bool RasterizerSceneHighEndRD::ShaderData::is_param_texture(const StringName &p_param) const { if (!uniforms.has(p_param)) { return false; @@ -533,46 +578,100 @@ void RasterizerSceneHighEndRD::RenderBufferDataHighEnd::ensure_specular() { tf.format = RD::DATA_FORMAT_R16G16B16A16_SFLOAT; tf.width = width; tf.height = height; - tf.usage_bits = RD::TEXTURE_USAGE_SAMPLING_BIT | RD::TEXTURE_USAGE_STORAGE_BIT | RD::TEXTURE_USAGE_COLOR_ATTACHMENT_BIT; + tf.usage_bits = RD::TEXTURE_USAGE_SAMPLING_BIT | RD::TEXTURE_USAGE_STORAGE_BIT; + if (msaa != RS::VIEWPORT_MSAA_DISABLED) { + tf.usage_bits |= RD::TEXTURE_USAGE_CAN_COPY_TO_BIT; + } else { + tf.usage_bits |= RD::TEXTURE_USAGE_COLOR_ATTACHMENT_BIT; + } specular = RD::get_singleton()->texture_create(tf, RD::TextureView()); - { - Vector<RID> fb; - fb.push_back(color); - fb.push_back(specular); - fb.push_back(depth); + if (msaa == RS::VIEWPORT_MSAA_DISABLED) { - color_specular_fb = RD::get_singleton()->framebuffer_create(fb); - } - { - Vector<RID> fb; - fb.push_back(specular); + { + Vector<RID> fb; + fb.push_back(color); + fb.push_back(specular); + fb.push_back(depth); + + color_specular_fb = RD::get_singleton()->framebuffer_create(fb); + } + { + Vector<RID> fb; + fb.push_back(specular); + + specular_only_fb = RD::get_singleton()->framebuffer_create(fb); + } - specular_only_fb = RD::get_singleton()->framebuffer_create(fb); + } else { + + tf.samples = texture_samples; + tf.usage_bits = RD::TEXTURE_USAGE_COLOR_ATTACHMENT_BIT | RD::TEXTURE_USAGE_CAN_COPY_FROM_BIT; + specular_msaa = RD::get_singleton()->texture_create(tf, RD::TextureView()); + + { + Vector<RID> fb; + fb.push_back(color_msaa); + fb.push_back(specular_msaa); + fb.push_back(depth_msaa); + + color_specular_fb = RD::get_singleton()->framebuffer_create(fb); + } + { + Vector<RID> fb; + fb.push_back(specular_msaa); + + specular_only_fb = RD::get_singleton()->framebuffer_create(fb); + } } } } void RasterizerSceneHighEndRD::RenderBufferDataHighEnd::clear() { + if (color_msaa.is_valid()) { + RD::get_singleton()->free(color_msaa); + color_msaa = RID(); + } + + if (depth_msaa.is_valid()) { + RD::get_singleton()->free(depth_msaa); + depth_msaa = RID(); + } + if (specular.is_valid()) { + if (specular_msaa.is_valid()) { + RD::get_singleton()->free(specular_msaa); + specular_msaa = RID(); + } RD::get_singleton()->free(specular); specular = RID(); } + color = RID(); + depth = RID(); color_specular_fb = RID(); specular_only_fb = RID(); color_fb = RID(); + depth_fb = RID(); if (normal_buffer.is_valid()) { RD::get_singleton()->free(normal_buffer); + if (normal_buffer_msaa.is_valid()) { + RD::get_singleton()->free(normal_buffer_msaa); + normal_buffer_msaa = RID(); + } normal_buffer = RID(); depth_normal_fb = RID(); } if (roughness_buffer.is_valid()) { RD::get_singleton()->free(roughness_buffer); + if (roughness_buffer_msaa.is_valid()) { + RD::get_singleton()->free(roughness_buffer_msaa); + roughness_buffer_msaa = RID(); + } roughness_buffer = RID(); depth_normal_roughness_fb = RID(); } @@ -581,24 +680,69 @@ void RasterizerSceneHighEndRD::RenderBufferDataHighEnd::clear() { void RasterizerSceneHighEndRD::RenderBufferDataHighEnd::configure(RID p_color_buffer, RID p_depth_buffer, int p_width, int p_height, RS::ViewportMSAA p_msaa) { clear(); + msaa = p_msaa; + width = p_width; height = p_height; color = p_color_buffer; depth = p_depth_buffer; - { - Vector<RID> fb; - fb.push_back(p_color_buffer); - fb.push_back(depth); + if (p_msaa == RS::VIEWPORT_MSAA_DISABLED) { - color_fb = RD::get_singleton()->framebuffer_create(fb); - } - { - Vector<RID> fb; - fb.push_back(depth); + { + Vector<RID> fb; + fb.push_back(p_color_buffer); + fb.push_back(depth); + + color_fb = RD::get_singleton()->framebuffer_create(fb); + } + { + Vector<RID> fb; + fb.push_back(depth); + + depth_fb = RD::get_singleton()->framebuffer_create(fb); + } + } else { - depth_fb = RD::get_singleton()->framebuffer_create(fb); + RD::TextureFormat tf; + tf.format = RD::DATA_FORMAT_R16G16B16A16_SFLOAT; + tf.width = p_width; + tf.height = p_height; + tf.type = RD::TEXTURE_TYPE_2D; + tf.usage_bits = RD::TEXTURE_USAGE_COLOR_ATTACHMENT_BIT | RD::TEXTURE_USAGE_CAN_COPY_FROM_BIT; + + RD::TextureSamples ts[RS::VIEWPORT_MSAA_MAX] = { + RD::TEXTURE_SAMPLES_1, + RD::TEXTURE_SAMPLES_2, + RD::TEXTURE_SAMPLES_4, + RD::TEXTURE_SAMPLES_8, + RD::TEXTURE_SAMPLES_16 + }; + + texture_samples = ts[p_msaa]; + tf.samples = texture_samples; + + color_msaa = RD::get_singleton()->texture_create(tf, RD::TextureView()); + + tf.format = RD::get_singleton()->texture_is_format_supported_for_usage(RD::DATA_FORMAT_D24_UNORM_S8_UINT, RD::TEXTURE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT) ? RD::DATA_FORMAT_D24_UNORM_S8_UINT : RD::DATA_FORMAT_D32_SFLOAT_S8_UINT; + tf.usage_bits = RD::TEXTURE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT | RD::TEXTURE_USAGE_CAN_COPY_FROM_BIT; + + depth_msaa = RD::get_singleton()->texture_create(tf, RD::TextureView()); + + { + Vector<RID> fb; + fb.push_back(color_msaa); + fb.push_back(depth_msaa); + + color_fb = RD::get_singleton()->framebuffer_create(fb); + } + { + Vector<RID> fb; + fb.push_back(depth_msaa); + + depth_fb = RD::get_singleton()->framebuffer_create(fb); + } } } @@ -611,13 +755,31 @@ void RasterizerSceneHighEndRD::_allocate_normal_texture(RenderBufferDataHighEnd tf.format = RD::DATA_FORMAT_A2B10G10R10_UNORM_PACK32; tf.width = rb->width; tf.height = rb->height; - tf.usage_bits = RD::TEXTURE_USAGE_SAMPLING_BIT | RD::TEXTURE_USAGE_COLOR_ATTACHMENT_BIT; + tf.usage_bits = RD::TEXTURE_USAGE_SAMPLING_BIT; + + if (rb->msaa != RS::VIEWPORT_MSAA_DISABLED) { + tf.usage_bits |= RD::TEXTURE_USAGE_CAN_COPY_TO_BIT; + } else { + tf.usage_bits |= RD::TEXTURE_USAGE_COLOR_ATTACHMENT_BIT; + } rb->normal_buffer = RD::get_singleton()->texture_create(tf, RD::TextureView()); - Vector<RID> fb; - fb.push_back(rb->depth); - fb.push_back(rb->normal_buffer); - rb->depth_normal_fb = RD::get_singleton()->framebuffer_create(fb); + + if (rb->msaa == RS::VIEWPORT_MSAA_DISABLED) { + Vector<RID> fb; + fb.push_back(rb->depth); + fb.push_back(rb->normal_buffer); + rb->depth_normal_fb = RD::get_singleton()->framebuffer_create(fb); + } else { + tf.usage_bits = RD::TEXTURE_USAGE_COLOR_ATTACHMENT_BIT | RD::TEXTURE_USAGE_CAN_COPY_FROM_BIT; + tf.samples = rb->texture_samples; + rb->normal_buffer_msaa = RD::get_singleton()->texture_create(tf, RD::TextureView()); + + Vector<RID> fb; + fb.push_back(rb->depth_msaa); + fb.push_back(rb->normal_buffer_msaa); + rb->depth_normal_fb = RD::get_singleton()->framebuffer_create(fb); + } _render_buffers_clear_uniform_set(rb); } @@ -636,12 +798,32 @@ void RasterizerSceneHighEndRD::_allocate_roughness_texture(RenderBufferDataHighE tf.height = rb->height; tf.usage_bits = RD::TEXTURE_USAGE_SAMPLING_BIT | RD::TEXTURE_USAGE_STORAGE_BIT | RD::TEXTURE_USAGE_COLOR_ATTACHMENT_BIT; + if (rb->msaa != RS::VIEWPORT_MSAA_DISABLED) { + tf.usage_bits |= RD::TEXTURE_USAGE_CAN_COPY_TO_BIT; + } else { + tf.usage_bits |= RD::TEXTURE_USAGE_COLOR_ATTACHMENT_BIT; + } + rb->roughness_buffer = RD::get_singleton()->texture_create(tf, RD::TextureView()); - Vector<RID> fb; - fb.push_back(rb->depth); - fb.push_back(rb->normal_buffer); - fb.push_back(rb->roughness_buffer); - rb->depth_normal_roughness_fb = RD::get_singleton()->framebuffer_create(fb); + + if (rb->msaa == RS::VIEWPORT_MSAA_DISABLED) { + + Vector<RID> fb; + fb.push_back(rb->depth); + fb.push_back(rb->normal_buffer); + fb.push_back(rb->roughness_buffer); + rb->depth_normal_roughness_fb = RD::get_singleton()->framebuffer_create(fb); + } else { + tf.usage_bits = RD::TEXTURE_USAGE_COLOR_ATTACHMENT_BIT | RD::TEXTURE_USAGE_CAN_COPY_FROM_BIT; + tf.samples = rb->texture_samples; + rb->roughness_buffer_msaa = RD::get_singleton()->texture_create(tf, RD::TextureView()); + + Vector<RID> fb; + fb.push_back(rb->depth_msaa); + fb.push_back(rb->normal_buffer_msaa); + fb.push_back(rb->roughness_buffer_msaa); + rb->depth_normal_roughness_fb = RD::get_singleton()->framebuffer_create(fb); + } _render_buffers_clear_uniform_set(rb); } @@ -667,6 +849,7 @@ void RasterizerSceneHighEndRD::_fill_instances(RenderList::Element **p_elements, store_transform(Transform(e->instance->transform.basis.inverse().transposed()), id.normal_transform); id.flags = 0; id.mask = e->instance->layer_mask; + id.instance_uniforms_ofs = e->instance->instance_allocated_shader_parameters_offset >= 0 ? e->instance->instance_allocated_shader_parameters_offset : 0; if (e->instance->base_type == RS::INSTANCE_MULTIMESH) { id.flags |= INSTANCE_DATA_FLAG_MULTIMESH; @@ -944,7 +1127,7 @@ void RasterizerSceneHighEndRD::_render_list(RenderingDevice::DrawListID p_draw_l } } -void RasterizerSceneHighEndRD::_setup_environment(RID p_environment, const CameraMatrix &p_cam_projection, const Transform &p_cam_transform, RID p_reflection_probe, bool p_no_fog, const Size2 &p_screen_pixel_size, RID p_shadow_atlas, bool p_flip_y, const Color &p_default_bg_color, float p_znear, float p_zfar, bool p_opaque_render_buffers) { +void RasterizerSceneHighEndRD::_setup_environment(RID p_environment, const CameraMatrix &p_cam_projection, const Transform &p_cam_transform, RID p_reflection_probe, bool p_no_fog, const Size2 &p_screen_pixel_size, RID p_shadow_atlas, bool p_flip_y, const Color &p_default_bg_color, float p_znear, float p_zfar, bool p_opaque_render_buffers, bool p_pancake_shadows) { //CameraMatrix projection = p_cam_projection; //projection.flip_y(); // Vulkan and modern APIs use Y-Down @@ -961,6 +1144,18 @@ void RasterizerSceneHighEndRD::_setup_environment(RID p_environment, const Camer scene_state.ubo.z_far = p_zfar; scene_state.ubo.z_near = p_znear; + scene_state.ubo.pancake_shadows = p_pancake_shadows; + + store_soft_shadow_kernel(directional_penumbra_shadow_kernel_get(), scene_state.ubo.directional_penumbra_shadow_kernel); + store_soft_shadow_kernel(directional_soft_shadow_kernel_get(), scene_state.ubo.directional_soft_shadow_kernel); + store_soft_shadow_kernel(penumbra_shadow_kernel_get(), scene_state.ubo.penumbra_shadow_kernel); + store_soft_shadow_kernel(soft_shadow_kernel_get(), scene_state.ubo.soft_shadow_kernel); + + scene_state.ubo.directional_penumbra_shadow_samples = directional_penumbra_shadow_samples_get(); + scene_state.ubo.directional_soft_shadow_samples = directional_soft_shadow_samples_get(); + scene_state.ubo.penumbra_shadow_samples = penumbra_shadow_samples_get(); + scene_state.ubo.soft_shadow_samples = soft_shadow_samples_get(); + scene_state.ubo.screen_pixel_size[0] = p_screen_pixel_size.x; scene_state.ubo.screen_pixel_size[1] = p_screen_pixel_size.y; @@ -991,7 +1186,7 @@ void RasterizerSceneHighEndRD::_setup_environment(RID p_environment, const Camer } else if (is_environment(p_environment)) { RS::EnvironmentBG env_bg = environment_get_background(p_environment); - RS::EnvironmentAmbientSource ambient_src = environment_get_ambient_light_ambient_source(p_environment); + RS::EnvironmentAmbientSource ambient_src = environment_get_ambient_source(p_environment); float bg_energy = environment_get_bg_energy(p_environment); scene_state.ubo.ambient_light_color_energy[3] = bg_energy; @@ -1011,7 +1206,7 @@ void RasterizerSceneHighEndRD::_setup_environment(RID p_environment, const Camer scene_state.ubo.use_ambient_cubemap = false; } else { - float energy = environment_get_ambient_light_ambient_energy(p_environment); + float energy = environment_get_ambient_light_energy(p_environment); Color color = environment_get_ambient_light_color(p_environment); color = color.to_linear(); scene_state.ubo.ambient_light_color_energy[0] = color.r * energy; @@ -1353,7 +1548,7 @@ void RasterizerSceneHighEndRD::_setup_reflections(RID *p_reflection_probe_cull_r Color ambient_linear = storage->reflection_probe_get_interior_ambient(base_probe).to_linear(); if (is_environment(p_environment)) { Color env_ambient_color = environment_get_ambient_light_color(p_environment).to_linear(); - float env_ambient_energy = environment_get_ambient_light_ambient_energy(p_environment); + float env_ambient_energy = environment_get_ambient_light_energy(p_environment); ambient_linear = env_ambient_color; ambient_linear.r *= env_ambient_energy; ambient_linear.g *= env_ambient_energy; @@ -1479,11 +1674,49 @@ void RasterizerSceneHighEndRD::_setup_lights(RID *p_light_cull_result, int p_lig light_data.specular = storage->light_get_param(base, RS::LIGHT_PARAM_SPECULAR); light_data.mask = storage->light_get_cull_mask(base); + float size = storage->light_get_param(base, RS::LIGHT_PARAM_SIZE); + + light_data.size = 1.0 - Math::cos(Math::deg2rad(size)); //angle to cosine offset + Color shadow_col = storage->light_get_shadow_color(base).to_linear(); - light_data.shadow_color[0] = shadow_col.r; - light_data.shadow_color[1] = shadow_col.g; - light_data.shadow_color[2] = shadow_col.b; + if (get_debug_draw_mode() == RS::VIEWPORT_DEBUG_DRAW_PSSM_SPLITS) { + light_data.shadow_color1[0] = 1.0; + light_data.shadow_color1[1] = 0.0; + light_data.shadow_color1[2] = 0.0; + light_data.shadow_color1[3] = 1.0; + light_data.shadow_color2[0] = 0.0; + light_data.shadow_color2[1] = 1.0; + light_data.shadow_color2[2] = 0.0; + light_data.shadow_color2[3] = 1.0; + light_data.shadow_color3[0] = 0.0; + light_data.shadow_color3[1] = 0.0; + light_data.shadow_color3[2] = 1.0; + light_data.shadow_color3[3] = 1.0; + light_data.shadow_color4[0] = 1.0; + light_data.shadow_color4[1] = 1.0; + light_data.shadow_color4[2] = 0.0; + light_data.shadow_color4[3] = 1.0; + + } else { + + light_data.shadow_color1[0] = shadow_col.r; + light_data.shadow_color1[1] = shadow_col.g; + light_data.shadow_color1[2] = shadow_col.b; + light_data.shadow_color1[3] = 1.0; + light_data.shadow_color2[0] = shadow_col.r; + light_data.shadow_color2[1] = shadow_col.g; + light_data.shadow_color2[2] = shadow_col.b; + light_data.shadow_color2[3] = 1.0; + light_data.shadow_color3[0] = shadow_col.r; + light_data.shadow_color3[1] = shadow_col.g; + light_data.shadow_color3[2] = shadow_col.b; + light_data.shadow_color3[3] = 1.0; + light_data.shadow_color4[0] = shadow_col.r; + light_data.shadow_color4[1] = shadow_col.g; + light_data.shadow_color4[2] = shadow_col.b; + light_data.shadow_color4[3] = 1.0; + } light_data.shadow_enabled = p_using_shadows && storage->light_has_shadow(base); @@ -1507,12 +1740,52 @@ void RasterizerSceneHighEndRD::_setup_lights(RID *p_light_cull_result, int p_lig CameraMatrix shadow_mtx = rectm * bias * matrix * modelview; light_data.shadow_split_offsets[j] = split; + float bias_scale = light_instance_get_shadow_bias_scale(li, j); + light_data.shadow_bias[j] = storage->light_get_param(base, RS::LIGHT_PARAM_SHADOW_BIAS) * bias_scale; + light_data.shadow_normal_bias[j] = storage->light_get_param(base, RS::LIGHT_PARAM_SHADOW_NORMAL_BIAS) * light_instance_get_directional_shadow_texel_size(li, j); + light_data.shadow_transmittance_bias[j] = storage->light_get_transmittance_bias(base) * bias_scale; + light_data.shadow_transmittance_z_scale[j] = light_instance_get_shadow_range(li, j); + light_data.shadow_range_begin[j] = light_instance_get_shadow_range_begin(li, j); store_camera(shadow_mtx, light_data.shadow_matrices[j]); + + Vector2 uv_scale = light_instance_get_shadow_uv_scale(li, j); + uv_scale *= atlas_rect.size; //adapt to atlas size + switch (j) { + case 0: { + light_data.uv_scale1[0] = uv_scale.x; + light_data.uv_scale1[1] = uv_scale.y; + } break; + case 1: { + light_data.uv_scale2[0] = uv_scale.x; + light_data.uv_scale2[1] = uv_scale.y; + } break; + case 2: { + light_data.uv_scale3[0] = uv_scale.x; + light_data.uv_scale3[1] = uv_scale.y; + } break; + case 3: { + light_data.uv_scale4[0] = uv_scale.x; + light_data.uv_scale4[1] = uv_scale.y; + } break; + } } float fade_start = storage->light_get_param(base, RS::LIGHT_PARAM_SHADOW_FADE_START); light_data.fade_from = -light_data.shadow_split_offsets[3] * MIN(fade_start, 0.999); //using 1.0 would break smoothstep 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); + + 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; + light_data.soft_shadow_scale *= directional_shadow_quality_radius_get(); // Only use quality radius for PCF + } } // Copy to SkyDirectionalLightData @@ -1533,6 +1806,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_scene_state.directional_light_count++; } @@ -1575,51 +1849,114 @@ void RasterizerSceneHighEndRD::_setup_lights(RID *p_light_cull_result, int p_lig light_data.direction[1] = direction.y; light_data.direction[2] = direction.z; + float size = storage->light_get_param(base, RS::LIGHT_PARAM_SIZE); + + light_data.size = size; + light_data.cone_attenuation_angle[0] = Math::make_half_float(storage->light_get_param(base, RS::LIGHT_PARAM_SPOT_ATTENUATION)); float spot_angle = storage->light_get_param(base, RS::LIGHT_PARAM_SPOT_ANGLE); light_data.cone_attenuation_angle[1] = Math::make_half_float(Math::cos(Math::deg2rad(spot_angle))); light_data.mask = storage->light_get_cull_mask(base); - Color shadow_color = storage->light_get_shadow_color(base); - - bool has_shadow = p_using_shadows && storage->light_has_shadow(base); - light_data.shadow_color_enabled[0] = MIN(uint32_t(shadow_color.r * 255), 255); - light_data.shadow_color_enabled[1] = MIN(uint32_t(shadow_color.g * 255), 255); - light_data.shadow_color_enabled[2] = MIN(uint32_t(shadow_color.b * 255), 255); - light_data.shadow_color_enabled[3] = has_shadow ? 255 : 0; - light_data.atlas_rect[0] = 0; light_data.atlas_rect[1] = 0; light_data.atlas_rect[2] = 0; light_data.atlas_rect[3] = 0; + RID projector = storage->light_get_projector(base); + + if (projector.is_valid()) { + Rect2 rect = storage->decal_atlas_get_texture_rect(projector); + + if (type == RS::LIGHT_SPOT) { + + light_data.projector_rect[0] = rect.position.x; + light_data.projector_rect[1] = rect.position.y + rect.size.height; //flip because shadow is flipped + light_data.projector_rect[2] = rect.size.width; + light_data.projector_rect[3] = -rect.size.height; + } else { + light_data.projector_rect[0] = rect.position.x; + light_data.projector_rect[1] = rect.position.y; + light_data.projector_rect[2] = rect.size.width; + light_data.projector_rect[3] = rect.size.height * 0.5; //used by dp, so needs to be half + } + } else { + light_data.projector_rect[0] = 0; + light_data.projector_rect[1] = 0; + light_data.projector_rect[2] = 0; + light_data.projector_rect[3] = 0; + } + if (p_using_shadows && p_shadow_atlas.is_valid() && shadow_atlas_owns_light_instance(p_shadow_atlas, li)) { // fill in the shadow information + Color shadow_color = storage->light_get_shadow_color(base); + + light_data.shadow_color_enabled[0] = MIN(uint32_t(shadow_color.r * 255), 255); + light_data.shadow_color_enabled[1] = MIN(uint32_t(shadow_color.g * 255), 255); + light_data.shadow_color_enabled[2] = MIN(uint32_t(shadow_color.b * 255), 255); + light_data.shadow_color_enabled[3] = 255; + + if (type == RS::LIGHT_SPOT) { + light_data.shadow_bias = (storage->light_get_param(base, RS::LIGHT_PARAM_SHADOW_BIAS) * radius / 10.0); + float shadow_texel_size = Math::tan(Math::deg2rad(spot_angle)) * radius * 2.0; + shadow_texel_size *= light_instance_get_shadow_texel_size(li, p_shadow_atlas); + + light_data.shadow_normal_bias = storage->light_get_param(base, RS::LIGHT_PARAM_SHADOW_NORMAL_BIAS) * shadow_texel_size; + + } else { //omni + light_data.shadow_bias = storage->light_get_param(base, RS::LIGHT_PARAM_SHADOW_BIAS) * radius / 10.0; + float shadow_texel_size = light_instance_get_shadow_texel_size(li, p_shadow_atlas); + light_data.shadow_normal_bias = storage->light_get_param(base, RS::LIGHT_PARAM_SHADOW_NORMAL_BIAS) * shadow_texel_size * 2.0; // applied in -1 .. 1 space + } + + light_data.transmittance_bias = storage->light_get_transmittance_bias(base); + Rect2 rect = light_instance_get_shadow_atlas_rect(li, p_shadow_atlas); - if (type == RS::LIGHT_OMNI) { + light_data.atlas_rect[0] = rect.position.x; + light_data.atlas_rect[1] = rect.position.y; + light_data.atlas_rect[2] = rect.size.width; + light_data.atlas_rect[3] = rect.size.height; + + light_data.soft_shadow_scale = storage->light_get_param(base, RS::LIGHT_PARAM_SHADOW_BLUR); - light_data.atlas_rect[0] = rect.position.x; - light_data.atlas_rect[1] = rect.position.y; - light_data.atlas_rect[2] = rect.size.width; - light_data.atlas_rect[3] = rect.size.height * 0.5; + if (type == RS::LIGHT_OMNI) { + light_data.atlas_rect[3] *= 0.5; //one paraboloid on top of another Transform proj = (p_camera_inverse_transform * light_transform).inverse(); store_transform(proj, light_data.shadow_matrix); + + if (size > 0.0) { + + light_data.soft_shadow_size = size; + } else { + light_data.soft_shadow_size = 0.0; + light_data.soft_shadow_scale *= shadows_quality_radius_get(); // Only use quality radius for PCF + } + } else if (type == RS::LIGHT_SPOT) { Transform modelview = (p_camera_inverse_transform * light_transform).inverse(); CameraMatrix bias; bias.set_light_bias(); - CameraMatrix rectm; - rectm.set_light_atlas_rect(rect); - CameraMatrix shadow_mtx = rectm * bias * light_instance_get_shadow_camera(li, 0) * modelview; + CameraMatrix shadow_mtx = bias * light_instance_get_shadow_camera(li, 0) * modelview; store_camera(shadow_mtx, light_data.shadow_matrix); + + if (size > 0.0) { + CameraMatrix cm = light_instance_get_shadow_camera(li, 0); + float half_np = cm.get_z_near() * Math::tan(Math::deg2rad(spot_angle)); + light_data.soft_shadow_size = (size * 0.5 / radius) / (half_np / cm.get_z_near()) * rect.size.width; + } else { + light_data.soft_shadow_size = 0.0; + light_data.soft_shadow_scale *= shadows_quality_radius_get(); // Only use quality radius for PCF + } } + } else { + light_data.shadow_color_enabled[3] = 0; } light_instance_set_index(li, light_count); @@ -1644,7 +1981,140 @@ void RasterizerSceneHighEndRD::_setup_lights(RID *p_light_cull_result, int p_lig } } -void RasterizerSceneHighEndRD::_render_scene(RID p_render_buffer, const Transform &p_cam_transform, const CameraMatrix &p_cam_projection, bool p_cam_ortogonal, InstanceBase **p_cull_result, int p_cull_count, RID *p_light_cull_result, int p_light_cull_count, RID *p_reflection_probe_cull_result, int p_reflection_probe_cull_count, RID *p_gi_probe_cull_result, int p_gi_probe_cull_count, RID p_environment, RID p_camera_effects, RID p_shadow_atlas, RID p_reflection_atlas, RID p_reflection_probe, int p_reflection_probe_pass, const Color &p_default_bg_color) { +void RasterizerSceneHighEndRD::_setup_decals(const RID *p_decal_instances, int p_decal_count, const Transform &p_camera_inverse_xform) { + + Transform uv_xform; + uv_xform.basis.scale(Vector3(2.0, 1.0, 2.0)); + uv_xform.origin = Vector3(-1.0, 0.0, -1.0); + + p_decal_count = MIN((uint32_t)p_decal_count, scene_state.max_decals); + int idx = 0; + for (int i = 0; i < p_decal_count; i++) { + + RID di = p_decal_instances[i]; + RID decal = decal_instance_get_base(di); + + Transform xform = decal_instance_get_transform(di); + + float fade = 1.0; + + if (storage->decal_is_distance_fade_enabled(decal)) { + real_t distance = -p_camera_inverse_xform.xform(xform.origin).z; + float fade_begin = storage->decal_get_distance_fade_begin(decal); + float fade_length = storage->decal_get_distance_fade_length(decal); + + if (distance > fade_begin) { + if (distance > fade_begin + fade_length) { + continue; // do not use this decal, its invisible + } + + fade = 1.0 - (distance - fade_begin) / fade_length; + } + } + + DecalData &dd = scene_state.decals[idx]; + + Vector3 decal_extents = storage->decal_get_extents(decal); + + Transform scale_xform; + scale_xform.basis.scale(Vector3(decal_extents.x, decal_extents.y, decal_extents.z)); + Transform to_decal_xform = (p_camera_inverse_xform * decal_instance_get_transform(di) * scale_xform * uv_xform).affine_inverse(); + store_transform(to_decal_xform, dd.xform); + + Vector3 normal = xform.basis.get_axis(Vector3::AXIS_Y).normalized(); + normal = p_camera_inverse_xform.basis.xform(normal); //camera is normalized, so fine + + dd.normal[0] = normal.x; + dd.normal[1] = normal.y; + dd.normal[2] = normal.z; + dd.normal_fade = storage->decal_get_normal_fade(decal); + + RID albedo_tex = storage->decal_get_texture(decal, RS::DECAL_TEXTURE_ALBEDO); + RID emission_tex = storage->decal_get_texture(decal, RS::DECAL_TEXTURE_EMISSION); + if (albedo_tex.is_valid()) { + Rect2 rect = storage->decal_atlas_get_texture_rect(albedo_tex); + dd.albedo_rect[0] = rect.position.x; + dd.albedo_rect[1] = rect.position.y; + dd.albedo_rect[2] = rect.size.x; + dd.albedo_rect[3] = rect.size.y; + } else { + + if (!emission_tex.is_valid()) { + continue; //no albedo, no emission, no decal. + } + dd.albedo_rect[0] = 0; + dd.albedo_rect[1] = 0; + dd.albedo_rect[2] = 0; + dd.albedo_rect[3] = 0; + } + + RID normal_tex = storage->decal_get_texture(decal, RS::DECAL_TEXTURE_NORMAL); + + if (normal_tex.is_valid()) { + Rect2 rect = storage->decal_atlas_get_texture_rect(normal_tex); + dd.normal_rect[0] = rect.position.x; + dd.normal_rect[1] = rect.position.y; + dd.normal_rect[2] = rect.size.x; + dd.normal_rect[3] = rect.size.y; + + Basis normal_xform = p_camera_inverse_xform.basis * xform.basis.orthonormalized(); + store_basis_3x4(normal_xform, dd.normal_xform); + } else { + dd.normal_rect[0] = 0; + dd.normal_rect[1] = 0; + dd.normal_rect[2] = 0; + dd.normal_rect[3] = 0; + } + + RID orm_tex = storage->decal_get_texture(decal, RS::DECAL_TEXTURE_ORM); + if (orm_tex.is_valid()) { + Rect2 rect = storage->decal_atlas_get_texture_rect(orm_tex); + dd.orm_rect[0] = rect.position.x; + dd.orm_rect[1] = rect.position.y; + dd.orm_rect[2] = rect.size.x; + dd.orm_rect[3] = rect.size.y; + } else { + dd.orm_rect[0] = 0; + dd.orm_rect[1] = 0; + dd.orm_rect[2] = 0; + dd.orm_rect[3] = 0; + } + + if (emission_tex.is_valid()) { + Rect2 rect = storage->decal_atlas_get_texture_rect(emission_tex); + dd.emission_rect[0] = rect.position.x; + dd.emission_rect[1] = rect.position.y; + dd.emission_rect[2] = rect.size.x; + dd.emission_rect[3] = rect.size.y; + } else { + dd.emission_rect[0] = 0; + dd.emission_rect[1] = 0; + dd.emission_rect[2] = 0; + dd.emission_rect[3] = 0; + } + + Color modulate = storage->decal_get_modulate(decal); + dd.modulate[0] = modulate.r; + dd.modulate[1] = modulate.g; + dd.modulate[2] = modulate.b; + dd.modulate[3] = modulate.a * fade; + dd.emission_energy = storage->decal_get_emission_energy(decal) * fade; + dd.albedo_mix = storage->decal_get_albedo_mix(decal); + dd.mask = storage->decal_get_cull_mask(decal); + dd.upper_fade = storage->decal_get_upper_fade(decal); + dd.lower_fade = storage->decal_get_lower_fade(decal); + + cluster_builder.add_decal(xform, decal_extents); + + idx++; + } + + if (idx > 0) { + RD::get_singleton()->buffer_update(scene_state.decal_buffer, 0, sizeof(DecalData) * idx, scene_state.decals, true); + } +} + +void RasterizerSceneHighEndRD::_render_scene(RID p_render_buffer, const Transform &p_cam_transform, const CameraMatrix &p_cam_projection, bool p_cam_ortogonal, InstanceBase **p_cull_result, int p_cull_count, RID *p_light_cull_result, int p_light_cull_count, RID *p_reflection_probe_cull_result, int p_reflection_probe_cull_count, RID *p_gi_probe_cull_result, int p_gi_probe_cull_count, RID *p_decal_cull_result, int p_decal_cull_count, RID p_environment, RID p_camera_effects, RID p_shadow_atlas, RID p_reflection_atlas, RID p_reflection_probe, int p_reflection_probe_pass, const Color &p_default_bg_color) { RenderBufferDataHighEnd *render_buffer = nullptr; if (p_render_buffer.is_valid()) { @@ -1655,27 +2125,6 @@ void RasterizerSceneHighEndRD::_render_scene(RID p_render_buffer, const Transfor render_pass++; //fill up ubo -#if 0 - storage->info.render.object_count += p_cull_count; - - Environment *env = environment_owner.getornull(p_environment); - ShadowAtlas *shadow_atlas = shadow_atlas_owner.getornull(p_shadow_atlas); - ReflectionAtlas *reflection_atlas = reflection_atlas_owner.getornull(p_reflection_atlas); - - if (shadow_atlas && shadow_atlas->size) { - glActiveTexture(GL_TEXTURE0 + storage->config.max_texture_image_units - 5); - glBindTexture(GL_TEXTURE_2D, shadow_atlas->depth); - glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_COMPARE_MODE, GL_COMPARE_REF_TO_TEXTURE); - glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_COMPARE_FUNC, GL_LESS); - scene_state.ubo.shadow_atlas_pixel_size[0] = 1.0 / shadow_atlas->size; - scene_state.ubo.shadow_atlas_pixel_size[1] = 1.0 / shadow_atlas->size; - } - - if (reflection_atlas && reflection_atlas->size) { - glActiveTexture(GL_TEXTURE0 + storage->config.max_texture_image_units - 3); - glBindTexture(GL_TEXTURE_2D, reflection_atlas->color); - } -#endif RENDER_TIMESTAMP("Setup 3D Scene"); @@ -1698,9 +2147,6 @@ void RasterizerSceneHighEndRD::_render_scene(RID p_render_buffer, const Transfor //scene_state.ubo.subsurface_scatter_width = subsurface_scatter_size; - scene_state.ubo.shadow_z_offset = 0; - scene_state.ubo.shadow_z_slope_scale = 0; - Vector2 vp_he = p_cam_projection.get_viewport_half_extents(); scene_state.ubo.viewport_size[0] = vp_he.x; scene_state.ubo.viewport_size[1] = vp_he.y; @@ -1718,6 +2164,7 @@ void RasterizerSceneHighEndRD::_render_scene(RID p_render_buffer, const Transfor bool using_ssr = false; if (render_buffer) { + screen_pixel_size.width = 1.0 / render_buffer->width; screen_pixel_size.height = 1.0 / render_buffer->height; screen_size.x = render_buffer->width; @@ -1784,6 +2231,7 @@ void RasterizerSceneHighEndRD::_render_scene(RID p_render_buffer, const Transfor cluster_builder.begin(p_cam_transform.affine_inverse(), p_cam_projection); //prepare cluster _setup_lights(p_light_cull_result, p_light_cull_count, p_cam_transform.affine_inverse(), p_shadow_atlas, using_shadows); + _setup_decals(p_decal_cull_result, p_decal_cull_count, p_cam_transform.affine_inverse()); _setup_reflections(p_reflection_probe_cull_result, p_reflection_probe_cull_count, p_cam_transform.affine_inverse(), p_environment); _setup_gi_probes(p_gi_probe_cull_result, p_gi_probe_cull_count, p_cam_transform); _setup_environment(p_environment, p_cam_projection, p_cam_transform, p_reflection_probe, p_reflection_probe.is_valid(), screen_pixel_size, p_shadow_atlas, !p_reflection_probe.is_valid(), p_default_bg_color, p_cam_projection.get_z_near(), p_cam_projection.get_z_far(), false); @@ -1828,23 +2276,7 @@ void RasterizerSceneHighEndRD::_render_scene(RID p_render_buffer, const Transfor clear_color.b *= bg_energy; } break; case RS::ENV_BG_SKY: { - RID sky = environment_get_sky(p_environment); - if (sky.is_valid()) { - - RENDER_TIMESTAMP("Setup Sky"); - CameraMatrix projection = p_cam_projection; - if (p_reflection_probe.is_valid()) { - CameraMatrix correction; - correction.set_depth_correction(true); - projection = correction * p_cam_projection; - } - - _setup_sky(p_environment, p_cam_transform.origin, screen_size); - _update_sky(p_environment, projection, p_cam_transform); - radiance_uniform_set = sky_get_radiance_uniform_set_rd(sky, default_shader_rd, RADIANCE_UNIFORM_SET); - - draw_sky = true; - } + draw_sky = true; } break; case RS::ENV_BG_CANVAS: { keep_color = true; @@ -1858,6 +2290,27 @@ void RasterizerSceneHighEndRD::_render_scene(RID p_render_buffer, const Transfor default: { } } + // setup sky if used for ambient, reflections, or background + if (draw_sky || environment_get_reflection_source(p_environment) == RS::ENV_REFLECTION_SOURCE_SKY || environment_get_ambient_source(p_environment) == RS::ENV_AMBIENT_SOURCE_SKY) { + RID sky = environment_get_sky(p_environment); + if (sky.is_valid()) { + + RENDER_TIMESTAMP("Setup Sky"); + CameraMatrix projection = p_cam_projection; + if (p_reflection_probe.is_valid()) { + CameraMatrix correction; + correction.set_depth_correction(true); + projection = correction * p_cam_projection; + } + + _setup_sky(p_environment, p_cam_transform.origin, screen_size); + _update_sky(p_environment, projection, p_cam_transform); + radiance_uniform_set = sky_get_radiance_uniform_set_rd(sky, default_shader_rd, RADIANCE_UNIFORM_SET); + } else { + // do not try to draw sky if invalid + draw_sky = false; + } + } } else { clear_color = p_default_bg_color; @@ -1879,9 +2332,23 @@ void RasterizerSceneHighEndRD::_render_scene(RID p_render_buffer, const Transfor if (depth_pre_pass) { //depth pre pass RENDER_TIMESTAMP("Render Depth Pre-Pass"); - RD::DrawListID draw_list = RD::get_singleton()->draw_list_begin(depth_framebuffer, RD::INITIAL_ACTION_CLEAR, RD::FINAL_ACTION_READ, RD::INITIAL_ACTION_CLEAR, using_ssao ? RD::FINAL_ACTION_READ : RD::FINAL_ACTION_CONTINUE, depth_pass_clear); + bool finish_depth = using_ssao; + RD::DrawListID draw_list = RD::get_singleton()->draw_list_begin(depth_framebuffer, RD::INITIAL_ACTION_CLEAR, RD::FINAL_ACTION_READ, RD::INITIAL_ACTION_CLEAR, finish_depth ? RD::FINAL_ACTION_READ : RD::FINAL_ACTION_CONTINUE, depth_pass_clear); _render_list(draw_list, RD::get_singleton()->framebuffer_get_format(depth_framebuffer), render_list.elements, render_list.element_count, false, depth_pass_mode, render_buffer == nullptr, radiance_uniform_set, RID()); RD::get_singleton()->draw_list_end(); + + if (render_buffer && render_buffer->msaa != RS::VIEWPORT_MSAA_DISABLED) { + if (finish_depth) { + RD::get_singleton()->texture_resolve_multisample(render_buffer->depth_msaa, render_buffer->depth, true); + } + + if (depth_pass_mode == PASS_MODE_DEPTH_NORMAL || depth_pass_mode == PASS_MODE_DEPTH_NORMAL_ROUGHNESS) { + RD::get_singleton()->texture_resolve_multisample(render_buffer->normal_buffer_msaa, render_buffer->normal_buffer, true); + if (depth_pass_mode == PASS_MODE_DEPTH_NORMAL_ROUGHNESS) { + RD::get_singleton()->texture_resolve_multisample(render_buffer->roughness_buffer_msaa, render_buffer->roughness_buffer, true); + } + } + } } if (using_ssao) { @@ -1961,6 +2428,19 @@ void RasterizerSceneHighEndRD::_render_scene(RID p_render_buffer, const Transfor _draw_sky(can_continue_color, can_continue_depth, opaque_framebuffer, p_environment, projection, p_cam_transform); } + if (render_buffer && !can_continue_color && render_buffer->msaa != RS::VIEWPORT_MSAA_DISABLED) { + + RD::get_singleton()->texture_resolve_multisample(render_buffer->color_msaa, render_buffer->color, true); + if (using_separate_specular) { + RD::get_singleton()->texture_resolve_multisample(render_buffer->specular_msaa, render_buffer->specular, true); + } + } + + if (render_buffer && !can_continue_depth && render_buffer->msaa != RS::VIEWPORT_MSAA_DISABLED) { + + RD::get_singleton()->texture_resolve_multisample(render_buffer->depth_msaa, render_buffer->depth, true); + } + if (using_separate_specular) { if (using_sss) { @@ -1970,11 +2450,11 @@ void RasterizerSceneHighEndRD::_render_scene(RID p_render_buffer, const Transfor if (using_ssr) { RENDER_TIMESTAMP("Screen Space Reflection"); - _process_ssr(p_render_buffer, render_buffer->color_fb, render_buffer->normal_buffer, render_buffer->roughness_buffer, render_buffer->specular, render_buffer->specular, Color(0, 0, 0, 1), p_environment, p_cam_projection, true); + _process_ssr(p_render_buffer, render_buffer->color_fb, render_buffer->normal_buffer, render_buffer->roughness_buffer, render_buffer->specular, render_buffer->specular, Color(0, 0, 0, 1), p_environment, p_cam_projection, render_buffer->msaa == RS::VIEWPORT_MSAA_DISABLED); } else { //just mix specular back RENDER_TIMESTAMP("Merge Specular"); - storage->get_effects()->merge_specular(render_buffer->color_fb, render_buffer->specular, RID(), RID()); + storage->get_effects()->merge_specular(render_buffer->color_fb, render_buffer->specular, render_buffer->msaa == RS::VIEWPORT_MSAA_DISABLED ? RID() : render_buffer->color, RID()); } } @@ -1992,78 +2472,13 @@ void RasterizerSceneHighEndRD::_render_scene(RID p_render_buffer, const Transfor RD::get_singleton()->draw_list_end(); } - //_render_list -#if 0 - if (state.directional_light_count == 0) { - directional_light = nullptr; - _render_list(&render_list.elements[render_list.max_elements - render_list.alpha_element_count], render_list.alpha_element_count, p_cam_transform, p_cam_projection, env_radiance_tex, false, true, false, false, shadow_atlas != nullptr); - } else { - for (int i = 0; i < state.directional_light_count; i++) { - directional_light = directional_lights[i]; - _setup_directional_light(i, p_cam_transform.affine_inverse(), shadow_atlas != nullptr && shadow_atlas->size > 0); - _render_list(&render_list.elements[render_list.max_elements - render_list.alpha_element_count], render_list.alpha_element_count, p_cam_transform, p_cam_projection, env_radiance_tex, false, true, false, i > 0, shadow_atlas != nullptr); - } - } -#endif - -#if 0 - _post_process(env, p_cam_projection); - // Needed only for debugging - /* if (shadow_atlas && storage->frame.current_rt) { - - //_copy_texture_to_front_buffer(shadow_atlas->depth); - storage->canvas->canvas_begin(); - glActiveTexture(GL_TEXTURE0); - glBindTexture(GL_TEXTURE_2D, shadow_atlas->depth); - glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_COMPARE_MODE, GL_NONE); - storage->canvas->draw_generic_textured_rect(Rect2(0, 0, storage->frame.current_rt->width / 2, storage->frame.current_rt->height / 2), Rect2(0, 0, 1, 1)); - } - - if (storage->frame.current_rt) { + if (render_buffer && render_buffer->msaa != RS::VIEWPORT_MSAA_DISABLED) { - //_copy_texture_to_front_buffer(shadow_atlas->depth); - storage->canvas->canvas_begin(); - glActiveTexture(GL_TEXTURE0); - glBindTexture(GL_TEXTURE_2D, exposure_shrink[4].color); - //glBindTexture(GL_TEXTURE_2D,storage->frame.current_rt->exposure.color); - storage->canvas->draw_generic_textured_rect(Rect2(0, 0, storage->frame.current_rt->width / 16, storage->frame.current_rt->height / 16), Rect2(0, 0, 1, 1)); + RD::get_singleton()->texture_resolve_multisample(render_buffer->color_msaa, render_buffer->color, true); } - - if (reflection_atlas && storage->frame.current_rt) { - - //_copy_texture_to_front_buffer(shadow_atlas->depth); - storage->canvas->canvas_begin(); - glActiveTexture(GL_TEXTURE0); - glBindTexture(GL_TEXTURE_2D, reflection_atlas->color); - storage->canvas->draw_generic_textured_rect(Rect2(0, 0, storage->frame.current_rt->width / 2, storage->frame.current_rt->height / 2), Rect2(0, 0, 1, 1)); - } - - if (directional_shadow.fbo) { - - //_copy_texture_to_front_buffer(shadow_atlas->depth); - storage->canvas->canvas_begin(); - glActiveTexture(GL_TEXTURE0); - glBindTexture(GL_TEXTURE_2D, directional_shadow.depth); - glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_COMPARE_MODE, GL_NONE); - storage->canvas->draw_generic_textured_rect(Rect2(0, 0, storage->frame.current_rt->width / 2, storage->frame.current_rt->height / 2), Rect2(0, 0, 1, 1)); - } - - if ( env_radiance_tex) { - - //_copy_texture_to_front_buffer(shadow_atlas->depth); - storage->canvas->canvas_begin(); - glActiveTexture(GL_TEXTURE0); - glBindTexture(GL_TEXTURE_2D, env_radiance_tex); - glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST); - glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); - storage->canvas->draw_generic_textured_rect(Rect2(0, 0, storage->frame.current_rt->width / 2, storage->frame.current_rt->height / 2), Rect2(0, 0, 1, 1)); - glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR_MIPMAP_LINEAR); - glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); - }*/ - //disable all stuff -#endif } -void RasterizerSceneHighEndRD::_render_shadow(RID p_framebuffer, InstanceBase **p_cull_result, int p_cull_count, const CameraMatrix &p_projection, const Transform &p_transform, float p_zfar, float p_bias, float p_normal_bias, bool p_use_dp, bool p_use_dp_flip) { + +void RasterizerSceneHighEndRD::_render_shadow(RID p_framebuffer, InstanceBase **p_cull_result, int p_cull_count, const CameraMatrix &p_projection, const Transform &p_transform, float p_zfar, float p_bias, float p_normal_bias, bool p_use_dp, bool p_use_dp_flip, bool p_use_pancake) { RENDER_TIMESTAMP("Setup Rendering Shadow"); @@ -2071,11 +2486,9 @@ void RasterizerSceneHighEndRD::_render_shadow(RID p_framebuffer, InstanceBase ** render_pass++; - scene_state.ubo.shadow_z_offset = p_bias; - scene_state.ubo.shadow_z_slope_scale = p_normal_bias; scene_state.ubo.dual_paraboloid_side = p_use_dp_flip ? -1 : 1; - _setup_environment(RID(), p_projection, p_transform, RID(), true, Vector2(1, 1), RID(), true, Color(), 0, p_zfar); + _setup_environment(RID(), p_projection, p_transform, RID(), true, Vector2(1, 1), RID(), true, Color(), 0, p_zfar, false, p_use_pancake); render_list.clear(); @@ -2106,8 +2519,6 @@ void RasterizerSceneHighEndRD::_render_material(const Transform &p_cam_transform render_pass++; - scene_state.ubo.shadow_z_offset = 0; - scene_state.ubo.shadow_z_slope_scale = 0; scene_state.ubo.dual_paraboloid_side = 0; _setup_environment(RID(), p_cam_projection, p_cam_transform, RID(), true, Vector2(1, 1), RID(), false, Color(), 0, 0); @@ -2204,7 +2615,7 @@ void RasterizerSceneHighEndRD::_update_render_base_uniform_set() { { RD::Uniform u; u.binding = 5; - u.type = RD::UNIFORM_TYPE_UNIFORM_BUFFER; + u.type = RD::UNIFORM_TYPE_STORAGE_BUFFER; u.ids.push_back(scene_state.light_buffer); uniforms.push_back(u); } @@ -2267,17 +2678,40 @@ void RasterizerSceneHighEndRD::_update_render_base_uniform_set() { uniforms.push_back(u); } - { RD::Uniform u; u.binding = 10; u.type = RD::UNIFORM_TYPE_TEXTURE; - u.ids.push_back(cluster_builder.get_cluster_texture()); + RID decal_atlas = storage->decal_atlas_get_texture(); + u.ids.push_back(decal_atlas); uniforms.push_back(u); } { RD::Uniform u; u.binding = 11; + u.type = RD::UNIFORM_TYPE_TEXTURE; + RID decal_atlas = storage->decal_atlas_get_texture_srgb(); + u.ids.push_back(decal_atlas); + uniforms.push_back(u); + } + { + RD::Uniform u; + u.binding = 12; + u.type = RD::UNIFORM_TYPE_STORAGE_BUFFER; + u.ids.push_back(scene_state.decal_buffer); + uniforms.push_back(u); + } + + { + RD::Uniform u; + u.binding = 13; + u.type = RD::UNIFORM_TYPE_TEXTURE; + u.ids.push_back(cluster_builder.get_cluster_texture()); + uniforms.push_back(u); + } + { + RD::Uniform u; + u.binding = 14; u.type = RD::UNIFORM_TYPE_STORAGE_BUFFER; u.ids.push_back(cluster_builder.get_cluster_indices_buffer()); uniforms.push_back(u); @@ -2285,7 +2719,7 @@ void RasterizerSceneHighEndRD::_update_render_base_uniform_set() { { RD::Uniform u; - u.binding = 12; + u.binding = 15; u.type = RD::UNIFORM_TYPE_TEXTURE; if (directional_shadow_get_texture().is_valid()) { u.ids.push_back(directional_shadow_get_texture()); @@ -2295,6 +2729,14 @@ void RasterizerSceneHighEndRD::_update_render_base_uniform_set() { uniforms.push_back(u); } + { + RD::Uniform u; + u.type = RD::UNIFORM_TYPE_STORAGE_BUFFER; + u.binding = 16; + u.ids.push_back(storage->global_variables_get_storage_buffer()); + uniforms.push_back(u); + } + render_base_uniform_set = RD::get_singleton()->uniform_set_create(uniforms, default_shader_rd, SCENE_UNIFORM_SET); } } @@ -2463,11 +2905,11 @@ RasterizerSceneHighEndRD::RasterizerSceneHighEndRD(RasterizerStorageRD *p_storag } { //lights - scene_state.max_lights = MIN(65536, uniform_max_size) / sizeof(LightData); + scene_state.max_lights = MIN(1024 * 1024, uniform_max_size) / sizeof(LightData); //1mb of lights uint32_t light_buffer_size = scene_state.max_lights * sizeof(LightData); scene_state.lights = memnew_arr(LightData, scene_state.max_lights); - scene_state.light_buffer = RD::get_singleton()->uniform_buffer_create(light_buffer_size); - defines += "\n#define MAX_LIGHT_DATA_STRUCTS " + itos(scene_state.max_lights) + "\n"; + scene_state.light_buffer = RD::get_singleton()->storage_buffer_create(light_buffer_size); + //defines += "\n#define MAX_LIGHT_DATA_STRUCTS " + itos(scene_state.max_lights) + "\n"; scene_state.max_directional_lights = 8; uint32_t directional_light_buffer_size = scene_state.max_directional_lights * sizeof(DirectionalLightData); @@ -2506,6 +2948,13 @@ RasterizerSceneHighEndRD::RasterizerSceneHighEndRD(RasterizerStorageRD *p_storag defines += "\n#define MAX_GI_PROBES " + itos(scene_state.max_gi_probes) + "\n"; } + { //decals + scene_state.max_decals = MIN(1024 * 1024, uniform_max_size) / sizeof(DecalData); //1mb of decals + uint32_t decal_buffer_size = scene_state.max_decals * sizeof(DecalData); + scene_state.decals = memnew_arr(DecalData, scene_state.max_decals); + scene_state.decal_buffer = RD::get_singleton()->storage_buffer_create(decal_buffer_size); + } + Vector<String> shader_versions; shader_versions.push_back("\n#define MODE_RENDER_DEPTH\n"); shader_versions.push_back("\n#define MODE_RENDER_DEPTH\n#define MODE_DUAL_PARABOLOID\n"); @@ -2569,7 +3018,11 @@ RasterizerSceneHighEndRD::RasterizerSceneHighEndRD(RasterizerStorageRD *p_storag actions.renames["ANISOTROPY"] = "anisotropy"; actions.renames["ANISOTROPY_FLOW"] = "anisotropy_flow"; actions.renames["SSS_STRENGTH"] = "sss_strength"; - actions.renames["TRANSMISSION"] = "transmission"; + actions.renames["SSS_TRANSMITTANCE_COLOR"] = "transmittance_color"; + actions.renames["SSS_TRANSMITTANCE_DEPTH"] = "transmittance_depth"; + actions.renames["SSS_TRANSMITTANCE_CURVE"] = "transmittance_curve"; + actions.renames["SSS_TRANSMITTANCE_BOOST"] = "transmittance_boost"; + actions.renames["BACKLIGHT"] = "backlight"; actions.renames["AO"] = "ao"; actions.renames["AO_LIGHT_AFFECT"] = "ao_light_affect"; actions.renames["EMISSION"] = "emission"; @@ -2609,7 +3062,8 @@ RasterizerSceneHighEndRD::RasterizerSceneHighEndRD(RasterizerStorageRD *p_storag actions.usage_defines["POSITION"] = "#define OVERRIDE_POSITION\n"; actions.usage_defines["SSS_STRENGTH"] = "#define ENABLE_SSS\n"; - actions.usage_defines["TRANSMISSION"] = "#define LIGHT_TRANSMISSION_USED\n"; + actions.usage_defines["SSS_TRANSMITTANCE_DEPTH"] = "#define ENABLE_TRANSMITTANCE\n"; + actions.usage_defines["BACKLIGHT"] = "#define LIGHT_BACKLIGHT_USED\n"; actions.usage_defines["SCREEN_TEXTURE"] = "#define SCREEN_TEXTURE_USED\n"; actions.usage_defines["SCREEN_UV"] = "#define SCREEN_UV_USED\n"; @@ -2659,6 +3113,8 @@ RasterizerSceneHighEndRD::RasterizerSceneHighEndRD(RasterizerStorageRD *p_storag actions.default_filter = ShaderLanguage::FILTER_LINEAR_MIPMAP; actions.default_repeat = ShaderLanguage::REPEAT_ENABLE; + actions.global_buffer_array_variable = "global_variables.data"; + actions.instance_uniform_index_variable = "instances.data[instance_index].instance_uniforms_ofs"; shader.compiler.initialize(actions); } @@ -2780,10 +3236,12 @@ RasterizerSceneHighEndRD::~RasterizerSceneHighEndRD() { RD::get_singleton()->free(scene_state.directional_light_buffer); RD::get_singleton()->free(scene_state.light_buffer); RD::get_singleton()->free(scene_state.reflection_buffer); + RD::get_singleton()->free(scene_state.decal_buffer); memdelete_arr(scene_state.instances); memdelete_arr(scene_state.gi_probes); memdelete_arr(scene_state.directional_lights); memdelete_arr(scene_state.lights); memdelete_arr(scene_state.reflections); + memdelete_arr(scene_state.decals); } } diff --git a/servers/rendering/rasterizer_rd/rasterizer_scene_high_end_rd.h b/servers/rendering/rasterizer_rd/rasterizer_scene_high_end_rd.h index e79bf2b378..a48e2e2259 100644 --- a/servers/rendering/rasterizer_rd/rasterizer_scene_high_end_rd.h +++ b/servers/rendering/rasterizer_rd/rasterizer_scene_high_end_rd.h @@ -138,6 +138,7 @@ class RasterizerSceneHighEndRD : public RasterizerSceneRD { bool unshaded; bool uses_vertex; bool uses_sss; + bool uses_transmittance; bool uses_screen_texture; bool uses_depth_texture; bool uses_normal_texture; @@ -151,6 +152,8 @@ class RasterizerSceneHighEndRD : public RasterizerSceneRD { virtual void set_code(const String &p_Code); virtual void set_default_texture_param(const StringName &p_name, RID p_texture); virtual void get_param_list(List<PropertyInfo> *p_param_list) const; + void get_instance_param_list(List<RasterizerStorage::InstanceShaderParam> *p_param_list) const; + virtual bool is_param_texture(const StringName &p_param) const; virtual bool is_animated() const; virtual bool casts_shadows() const; @@ -197,11 +200,22 @@ class RasterizerSceneHighEndRD : public RasterizerSceneRD { struct RenderBufferDataHighEnd : public RenderBufferData { //for rendering, may be MSAAd + RID color; RID depth; RID specular; RID normal_buffer; RID roughness_buffer; + + RS::ViewportMSAA msaa; + RD::TextureSamples texture_samples; + + RID color_msaa; + RID depth_msaa; + RID specular_msaa; + RID normal_buffer_msaa; + RID roughness_buffer_msaa; + RID depth_fb; RID depth_normal_fb; RID depth_normal_roughness_fb; @@ -253,13 +267,21 @@ class RasterizerSceneHighEndRD : public RasterizerSceneRD { float position[3]; float inv_radius; float direction[3]; + float size; uint16_t attenuation_energy[2]; //16 bits attenuation, then energy uint8_t color_specular[4]; //rgb color, a specular (8 bit unorm) uint16_t cone_attenuation_angle[2]; // attenuation and angle, (16bit float) - uint32_t mask; uint8_t shadow_color_enabled[4]; //shadow rgb color, a>0.5 enabled (8bit unorm) float atlas_rect[4]; // in omni, used for atlas uv, in spot, used for projector uv float shadow_matrix[16]; + float shadow_bias; + float shadow_normal_bias; + float transmittance_bias; + float soft_shadow_size; + float soft_shadow_scale; + uint32_t mask; + uint32_t pad[2]; + float projector_rect[4]; }; struct DirectionalLightData { @@ -267,15 +289,30 @@ class RasterizerSceneHighEndRD : public RasterizerSceneRD { float direction[3]; float energy; float color[3]; + float size; float specular; - float shadow_color[3]; uint32_t mask; + float softshadow_angle; + float soft_shadow_scale; uint32_t blend_splits; uint32_t shadow_enabled; float fade_from; float fade_to; + float shadow_bias[4]; + float shadow_normal_bias[4]; + float shadow_transmittance_bias[4]; + float shadow_transmittance_z_scale[4]; + float shadow_range_begin[4]; float shadow_split_offsets[4]; float shadow_matrices[4][16]; + float shadow_color1[4]; + float shadow_color2[4]; + float shadow_color3[4]; + float shadow_color4[4]; + float uv_scale1[2]; + float uv_scale2[2]; + float uv_scale3[2]; + float uv_scale4[2]; }; struct GIProbeData { @@ -294,6 +331,24 @@ class RasterizerSceneHighEndRD : public RasterizerSceneRD { uint32_t pad[1]; }; + struct DecalData { + float xform[16]; + float inv_extents[3]; + float albedo_mix; + float albedo_rect[4]; + float normal_rect[4]; + float orm_rect[4]; + float emission_rect[4]; + float modulate[4]; + float emission_energy; + uint32_t mask; + float upper_fade; + float lower_fade; + float normal_xform[12]; + float normal[3]; + float normal_fade; + }; + enum { INSTANCE_DATA_FLAG_MULTIMESH = 1 << 12, INSTANCE_DATA_FLAG_MULTIMESH_FORMAT_2D = 1 << 13, @@ -308,7 +363,7 @@ class RasterizerSceneHighEndRD : public RasterizerSceneRD { float transform[16]; float normal_transform[16]; uint32_t flags; - uint32_t instance_ofs; //instance_offset in instancing/skeleton buffer + uint32_t instance_uniforms_ofs; //instance_offset in instancing/skeleton buffer uint32_t gi_offset; //GI information when using lightmapping (VCT or lightmap) uint32_t mask; }; @@ -324,12 +379,22 @@ class RasterizerSceneHighEndRD : public RasterizerSceneRD { float viewport_size[2]; float screen_pixel_size[2]; - float shadow_z_offset; - float shadow_z_slope_scale; - float time; float reflection_multiplier; + uint32_t pancake_shadows; + uint32_t pad; + + float directional_penumbra_shadow_kernel[128]; //32 vec4s + float directional_soft_shadow_kernel[128]; + float penumbra_shadow_kernel[128]; + float soft_shadow_kernel[128]; + + uint32_t directional_penumbra_shadow_samples; + uint32_t directional_soft_shadow_samples; + uint32_t penumbra_shadow_samples; + uint32_t soft_shadow_samples; + float ambient_light_color_energy[4]; float ambient_color_sky_mix; @@ -369,6 +434,10 @@ class RasterizerSceneHighEndRD : public RasterizerSceneRD { RID gi_probe_buffer; uint32_t max_gi_probe_probes_per_instance; + DecalData *decals; + uint32_t max_decals; + RID decal_buffer; + LightData *lights; uint32_t max_lights; RID light_buffer; @@ -558,8 +627,9 @@ class RasterizerSceneHighEndRD : public RasterizerSceneRD { PASS_MODE_DEPTH_MATERIAL, }; - void _setup_environment(RID p_environment, const CameraMatrix &p_cam_projection, const Transform &p_cam_transform, RID p_reflection_probe, bool p_no_fog, const Size2 &p_screen_pixel_size, RID p_shadow_atlas, bool p_flip_y, const Color &p_default_bg_color, float p_znear, float p_zfar, bool p_opaque_render_buffers = false); + void _setup_environment(RID p_environment, const CameraMatrix &p_cam_projection, const Transform &p_cam_transform, RID p_reflection_probe, bool p_no_fog, const Size2 &p_screen_pixel_size, RID p_shadow_atlas, bool p_flip_y, const Color &p_default_bg_color, float p_znear, float p_zfar, bool p_opaque_render_buffers = false, bool p_pancake_shadows = false); void _setup_lights(RID *p_light_cull_result, int p_light_cull_count, const Transform &p_camera_inverse_transform, RID p_shadow_atlas, bool p_using_shadows); + void _setup_decals(const RID *p_decal_instances, int p_decal_count, const Transform &p_camera_inverse_xform); void _setup_reflections(RID *p_reflection_probe_cull_result, int p_reflection_probe_cull_count, const Transform &p_camera_inverse_transform, RID p_environment); void _setup_gi_probes(RID *p_gi_probe_probe_cull_result, int p_gi_probe_probe_cull_count, const Transform &p_camera_transform); @@ -571,8 +641,8 @@ class RasterizerSceneHighEndRD : public RasterizerSceneRD { void _fill_render_list(InstanceBase **p_cull_result, int p_cull_count, PassMode p_pass_mode, bool p_no_gi); protected: - virtual void _render_scene(RID p_render_buffer, const Transform &p_cam_transform, const CameraMatrix &p_cam_projection, bool p_cam_ortogonal, InstanceBase **p_cull_result, int p_cull_count, RID *p_light_cull_result, int p_light_cull_count, RID *p_reflection_probe_cull_result, int p_reflection_probe_cull_count, RID *p_gi_probe_cull_result, int p_gi_probe_cull_count, RID p_environment, RID p_camera_effects, RID p_shadow_atlas, RID p_reflection_atlas, RID p_reflection_probe, int p_reflection_probe_pass, const Color &p_default_bg_color); - virtual void _render_shadow(RID p_framebuffer, InstanceBase **p_cull_result, int p_cull_count, const CameraMatrix &p_projection, const Transform &p_transform, float p_zfar, float p_bias, float p_normal_bias, bool p_use_dp, bool p_use_dp_flip); + virtual void _render_scene(RID p_render_buffer, const Transform &p_cam_transform, const CameraMatrix &p_cam_projection, bool p_cam_ortogonal, InstanceBase **p_cull_result, int p_cull_count, RID *p_light_cull_result, int p_light_cull_count, RID *p_reflection_probe_cull_result, int p_reflection_probe_cull_count, RID *p_gi_probe_cull_result, int p_gi_probe_cull_count, RID *p_decal_cull_result, int p_decal_cull_count, RID p_environment, RID p_camera_effects, RID p_shadow_atlas, RID p_reflection_atlas, RID p_reflection_probe, int p_reflection_probe_pass, const Color &p_default_bg_color); + virtual void _render_shadow(RID p_framebuffer, InstanceBase **p_cull_result, int p_cull_count, const CameraMatrix &p_projection, const Transform &p_transform, float p_zfar, float p_bias, float p_normal_bias, bool p_use_dp, bool p_use_dp_flip, bool p_use_pancake); virtual void _render_material(const Transform &p_cam_transform, const CameraMatrix &p_cam_projection, bool p_cam_ortogonal, InstanceBase **p_cull_result, int p_cull_count, RID p_framebuffer, const Rect2i &p_region); public: diff --git a/servers/rendering/rasterizer_rd/rasterizer_scene_rd.cpp b/servers/rendering/rasterizer_rd/rasterizer_scene_rd.cpp index e4c5f1c984..8877de87ac 100644 --- a/servers/rendering/rasterizer_rd/rasterizer_scene_rd.cpp +++ b/servers/rendering/rasterizer_rd/rasterizer_scene_rd.cpp @@ -36,6 +36,18 @@ uint64_t RasterizerSceneRD::auto_exposure_counter = 2; +void get_vogel_disk(float *r_kernel, int p_sample_count) { + const float golden_angle = 2.4; + + for (int i = 0; i < p_sample_count; i++) { + float r = Math::sqrt(float(i) + 0.5) / Math::sqrt(float(p_sample_count)); + float theta = float(i) * golden_angle; + + r_kernel[i * 4] = Math::cos(theta) * r; + r_kernel[i * 4 + 1] = Math::sin(theta) * r; + } +} + void RasterizerSceneRD::_clear_reflection_data(ReflectionData &rd) { rd.layers.clear(); @@ -181,10 +193,9 @@ void RasterizerSceneRD::_update_reflection_mipmaps(ReflectionData &rd) { for (int j = 0; j < rd.layers[i].mipmaps.size() - 1; j++) { for (int k = 0; k < 6; k++) { RID view = rd.layers[i].mipmaps[j].views[k]; - RID fb = rd.layers[i].mipmaps[j + 1].framebuffers[k]; - Vector2 size = rd.layers[i].mipmaps[j].size; - size = Vector2(1.0 / size.x, 1.0 / size.y); - storage->get_effects()->make_mipmap(view, fb, size); + RID texture = rd.layers[i].mipmaps[j + 1].views[k]; + Size2i size = rd.layers[i].mipmaps[j + 1].size; + storage->get_effects()->make_mipmap(view, texture, size); } } } @@ -644,7 +655,8 @@ void RasterizerSceneRD::_setup_sky(RID p_environment, const Vector3 &p_position, sky_scene_state.directional_lights[i].color[0] != sky_scene_state.last_frame_directional_lights[i].color[0] || sky_scene_state.directional_lights[i].color[1] != sky_scene_state.last_frame_directional_lights[i].color[1] || sky_scene_state.directional_lights[i].color[2] != sky_scene_state.last_frame_directional_lights[i].color[2] || - sky_scene_state.directional_lights[i].enabled != sky_scene_state.last_frame_directional_lights[i].enabled) { + sky_scene_state.directional_lights[i].enabled != sky_scene_state.last_frame_directional_lights[i].enabled || + sky_scene_state.directional_lights[i].size != sky_scene_state.last_frame_directional_lights[i].size) { light_data_dirty = true; break; } @@ -840,18 +852,22 @@ void RasterizerSceneRD::SkyShaderData::set_code(const String &p_code) { actions.usage_flag_pointers["LIGHT0_ENERGY"] = &uses_light; actions.usage_flag_pointers["LIGHT0_DIRECTION"] = &uses_light; actions.usage_flag_pointers["LIGHT0_COLOR"] = &uses_light; + actions.usage_flag_pointers["LIGHT0_SIZE"] = &uses_light; actions.usage_flag_pointers["LIGHT1_ENABLED"] = &uses_light; actions.usage_flag_pointers["LIGHT1_ENERGY"] = &uses_light; actions.usage_flag_pointers["LIGHT1_DIRECTION"] = &uses_light; actions.usage_flag_pointers["LIGHT1_COLOR"] = &uses_light; + actions.usage_flag_pointers["LIGHT1_SIZE"] = &uses_light; actions.usage_flag_pointers["LIGHT2_ENABLED"] = &uses_light; actions.usage_flag_pointers["LIGHT2_ENERGY"] = &uses_light; actions.usage_flag_pointers["LIGHT2_DIRECTION"] = &uses_light; actions.usage_flag_pointers["LIGHT2_COLOR"] = &uses_light; + actions.usage_flag_pointers["LIGHT2_SIZE"] = &uses_light; actions.usage_flag_pointers["LIGHT3_ENABLED"] = &uses_light; actions.usage_flag_pointers["LIGHT3_ENERGY"] = &uses_light; actions.usage_flag_pointers["LIGHT3_DIRECTION"] = &uses_light; actions.usage_flag_pointers["LIGHT3_COLOR"] = &uses_light; + actions.usage_flag_pointers["LIGHT3_SIZE"] = &uses_light; actions.uniforms = &uniforms; @@ -915,6 +931,10 @@ void RasterizerSceneRD::SkyShaderData::get_param_list(List<PropertyInfo> *p_para for (Map<StringName, ShaderLanguage::ShaderNode::Uniform>::Element *E = uniforms.front(); E; E = E->next()) { + if (E->get().scope == ShaderLanguage::ShaderNode::Uniform::SCOPE_GLOBAL || E->get().scope == ShaderLanguage::ShaderNode::Uniform::SCOPE_INSTANCE) { + continue; + } + if (E->get().texture_order >= 0) { order[E->get().texture_order + 100000] = E->key(); } else { @@ -930,6 +950,23 @@ void RasterizerSceneRD::SkyShaderData::get_param_list(List<PropertyInfo> *p_para } } +void RasterizerSceneRD::SkyShaderData::get_instance_param_list(List<RasterizerStorage::InstanceShaderParam> *p_param_list) const { + + for (Map<StringName, ShaderLanguage::ShaderNode::Uniform>::Element *E = uniforms.front(); E; E = E->next()) { + + if (E->get().scope != ShaderLanguage::ShaderNode::Uniform::SCOPE_INSTANCE) { + continue; + } + + RasterizerStorage::InstanceShaderParam p; + p.info = ShaderLanguage::uniform_to_property_info(E->get()); + p.info.name = E->key(); //supply name + p.index = E->get().instance_index; + p.default_value = ShaderLanguage::constant_value_to_variant(E->get().default_value, E->get().type, E->get().hint); + p_param_list->push_back(p); + } +} + bool RasterizerSceneRD::SkyShaderData::is_param_texture(const StringName &p_param) const { if (!uniforms.has(p_param)) { return false; @@ -1168,12 +1205,12 @@ Color RasterizerSceneRD::environment_get_ambient_light_color(RID p_env) const { ERR_FAIL_COND_V(!env, Color()); return env->ambient_light; } -RS::EnvironmentAmbientSource RasterizerSceneRD::environment_get_ambient_light_ambient_source(RID p_env) const { +RS::EnvironmentAmbientSource RasterizerSceneRD::environment_get_ambient_source(RID p_env) const { Environent *env = environment_owner.getornull(p_env); ERR_FAIL_COND_V(!env, RS::ENV_AMBIENT_SOURCE_BG); return env->ambient_source; } -float RasterizerSceneRD::environment_get_ambient_light_ambient_energy(RID p_env) const { +float RasterizerSceneRD::environment_get_ambient_light_energy(RID p_env) const { Environent *env = environment_owner.getornull(p_env); ERR_FAIL_COND_V(!env, 0); return env->ambient_light_energy; @@ -1599,7 +1636,6 @@ void RasterizerSceneRD::shadow_atlas_set_size(RID p_atlas, int p_size) { if (shadow_atlas->depth.is_valid()) { RD::get_singleton()->free(shadow_atlas->depth); shadow_atlas->depth = RID(); - shadow_atlas->fb = RID(); } for (int i = 0; i < 4; i++) { //clear subdivisions @@ -1625,13 +1661,9 @@ void RasterizerSceneRD::shadow_atlas_set_size(RID p_atlas, int p_size) { tf.format = RD::DATA_FORMAT_R32_SFLOAT; tf.width = shadow_atlas->size; tf.height = shadow_atlas->size; - tf.usage_bits = RD::TEXTURE_USAGE_SAMPLING_BIT | RD::TEXTURE_USAGE_COLOR_ATTACHMENT_BIT; + tf.usage_bits = RD::TEXTURE_USAGE_SAMPLING_BIT | RD::TEXTURE_USAGE_STORAGE_BIT; shadow_atlas->depth = RD::get_singleton()->texture_create(tf, RD::TextureView()); - - Vector<RID> fb; - fb.push_back(shadow_atlas->depth); - shadow_atlas->fb = RD::get_singleton()->framebuffer_create(fb); } } @@ -1901,7 +1933,6 @@ void RasterizerSceneRD::directional_shadow_atlas_set_size(int p_size) { if (directional_shadow.depth.is_valid()) { RD::get_singleton()->free(directional_shadow.depth); directional_shadow.depth = RID(); - directional_shadow.fb = RID(); } if (p_size > 0) { @@ -1910,12 +1941,9 @@ void RasterizerSceneRD::directional_shadow_atlas_set_size(int p_size) { tf.format = RD::DATA_FORMAT_R32_SFLOAT; tf.width = p_size; tf.height = p_size; - tf.usage_bits = RD::TEXTURE_USAGE_SAMPLING_BIT | RD::TEXTURE_USAGE_COLOR_ATTACHMENT_BIT; + tf.usage_bits = RD::TEXTURE_USAGE_SAMPLING_BIT | RD::TEXTURE_USAGE_STORAGE_BIT; directional_shadow.depth = RD::get_singleton()->texture_create(tf, RD::TextureView()); - Vector<RID> fb; - fb.push_back(directional_shadow.depth); - directional_shadow.fb = RD::get_singleton()->framebuffer_create(fb); } _base_uniforms_changed(); @@ -2032,7 +2060,7 @@ void RasterizerSceneRD::light_instance_set_transform(RID p_light_instance, const light_instance->transform = p_transform; } -void RasterizerSceneRD::light_instance_set_shadow_transform(RID p_light_instance, const CameraMatrix &p_projection, const Transform &p_transform, float p_far, float p_split, int p_pass, float p_bias_scale) { +void RasterizerSceneRD::light_instance_set_shadow_transform(RID p_light_instance, const CameraMatrix &p_projection, const Transform &p_transform, float p_far, float p_split, int p_pass, float p_shadow_texel_size, float p_bias_scale, float p_range_begin, const Vector2 &p_uv_scale) { LightInstance *light_instance = light_instance_owner.getornull(p_light_instance); ERR_FAIL_COND(!light_instance); @@ -2048,6 +2076,9 @@ void RasterizerSceneRD::light_instance_set_shadow_transform(RID p_light_instance light_instance->shadow_transform[p_pass].farplane = p_far; light_instance->shadow_transform[p_pass].split = p_split; light_instance->shadow_transform[p_pass].bias_scale = p_bias_scale; + light_instance->shadow_transform[p_pass].range_begin = p_range_begin; + light_instance->shadow_transform[p_pass].shadow_texel_size = p_shadow_texel_size; + light_instance->shadow_transform[p_pass].uv_scale = p_uv_scale; } void RasterizerSceneRD::light_instance_mark_visible(RID p_light_instance) { @@ -2111,6 +2142,21 @@ RasterizerSceneRD::ShadowMap *RasterizerSceneRD::_get_shadow_map(const Size2i &p return &shadow_maps[p_size]; } + +////////////////////////// + +RID RasterizerSceneRD::decal_instance_create(RID p_decal) { + DecalInstance di; + di.decal = p_decal; + return decal_instance_owner.make_rid(di); +} + +void RasterizerSceneRD::decal_instance_set_transform(RID p_decal, const Transform &p_transform) { + DecalInstance *di = decal_instance_owner.getornull(p_decal); + ERR_FAIL_COND(!di); + di->transform = p_transform; +} + ///////////////////////////////// RID RasterizerSceneRD::gi_probe_instance_create(RID p_base) { @@ -3059,7 +3105,7 @@ void RasterizerSceneRD::_allocate_blur_textures(RenderBuffers *rb) { tf.width = rb->width; tf.height = rb->height; tf.type = RD::TEXTURE_TYPE_2D; - tf.usage_bits = RD::TEXTURE_USAGE_COLOR_ATTACHMENT_BIT | RD::TEXTURE_USAGE_STORAGE_BIT | RD::TEXTURE_USAGE_SAMPLING_BIT | RD::TEXTURE_USAGE_CAN_COPY_TO_BIT; + tf.usage_bits = RD::TEXTURE_USAGE_STORAGE_BIT | RD::TEXTURE_USAGE_SAMPLING_BIT | RD::TEXTURE_USAGE_CAN_COPY_TO_BIT; tf.mipmaps = mipmaps_required; rb->blur[0].texture = RD::get_singleton()->texture_create(tf, RD::TextureView()); @@ -3076,11 +3122,6 @@ void RasterizerSceneRD::_allocate_blur_textures(RenderBuffers *rb) { RenderBuffers::Blur::Mipmap mm; mm.texture = RD::get_singleton()->texture_create_shared_from_slice(RD::TextureView(), rb->blur[0].texture, 0, i); - { - Vector<RID> fbs; - fbs.push_back(mm.texture); - mm.framebuffer = RD::get_singleton()->framebuffer_create(fbs); - } mm.width = base_width; mm.height = base_height; @@ -3090,11 +3131,6 @@ void RasterizerSceneRD::_allocate_blur_textures(RenderBuffers *rb) { if (i > 0) { mm.texture = RD::get_singleton()->texture_create_shared_from_slice(RD::TextureView(), rb->blur[1].texture, 0, i - 1); - { - Vector<RID> fbs; - fbs.push_back(mm.texture); - mm.framebuffer = RD::get_singleton()->framebuffer_create(fbs); - } rb->blur[1].mipmaps.push_back(mm); } @@ -3421,9 +3457,9 @@ void RasterizerSceneRD::_render_buffers_post_process_and_tonemap(RID p_render_bu if (env->auto_exposure && rb->luminance.current.is_valid()) { luminance_texture = rb->luminance.current; } - storage->get_effects()->gaussian_glow(rb->texture, rb->blur[0].mipmaps[i + 1].framebuffer, rb->blur[0].mipmaps[i + 1].texture, rb->blur[1].mipmaps[i].framebuffer, Vector2(1.0 / vp_w, 1.0 / vp_h), env->glow_strength, true, env->glow_hdr_luminance_cap, env->exposure, env->glow_bloom, env->glow_hdr_bleed_threshold, env->glow_hdr_bleed_scale, luminance_texture, env->auto_exp_scale); + storage->get_effects()->gaussian_glow(rb->texture, rb->blur[0].mipmaps[i + 1].texture, rb->blur[1].mipmaps[i].texture, Size2i(vp_w, vp_h), env->glow_strength, true, env->glow_hdr_luminance_cap, env->exposure, env->glow_bloom, env->glow_hdr_bleed_threshold, env->glow_hdr_bleed_scale, luminance_texture, env->auto_exp_scale); } else { - storage->get_effects()->gaussian_glow(rb->blur[1].mipmaps[i - 1].texture, rb->blur[0].mipmaps[i + 1].framebuffer, rb->blur[0].mipmaps[i + 1].texture, rb->blur[1].mipmaps[i].framebuffer, Vector2(1.0 / vp_w, 1.0 / vp_h), env->glow_strength); + storage->get_effects()->gaussian_glow(rb->blur[1].mipmaps[i - 1].texture, rb->blur[0].mipmaps[i + 1].texture, rb->blur[1].mipmaps[i].texture, Size2i(vp_w, vp_h), env->glow_strength); } } } @@ -3456,6 +3492,12 @@ void RasterizerSceneRD::_render_buffers_post_process_and_tonemap(RID p_render_bu tonemap.glow_texture = storage->texture_rd_get_default(RasterizerStorageRD::DEFAULT_RD_TEXTURE_BLACK); } + if (rb->screen_space_aa == RS::VIEWPORT_SCREEN_SPACE_AA_FXAA) { + tonemap.use_fxaa = true; + } + + tonemap.texture_size = Vector2i(rb->width, rb->height); + if (env) { tonemap.tonemap_mode = env->tone_mapper; tonemap.white = env->white; @@ -3479,7 +3521,7 @@ void RasterizerSceneRD::_render_buffers_debug_draw(RID p_render_buffers, RID p_s RID shadow_atlas_texture = shadow_atlas_get_texture(p_shadow_atlas); Size2 rtsize = storage->render_target_get_size(rb->render_target); - effects->copy_to_rect(shadow_atlas_texture, storage->render_target_get_rd_framebuffer(rb->render_target), Rect2(Vector2(), rtsize / 2), false, true); + effects->copy_to_fb_rect(shadow_atlas_texture, storage->render_target_get_rd_framebuffer(rb->render_target), Rect2i(Vector2(), rtsize / 2), false, true); } } @@ -3488,7 +3530,17 @@ void RasterizerSceneRD::_render_buffers_debug_draw(RID p_render_buffers, RID p_s RID shadow_atlas_texture = directional_shadow_get_texture(); Size2 rtsize = storage->render_target_get_size(rb->render_target); - effects->copy_to_rect(shadow_atlas_texture, storage->render_target_get_rd_framebuffer(rb->render_target), Rect2(Vector2(), rtsize / 2), false, true); + effects->copy_to_fb_rect(shadow_atlas_texture, storage->render_target_get_rd_framebuffer(rb->render_target), Rect2i(Vector2(), rtsize / 2), false, true); + } + } + + if (debug_draw == RS::VIEWPORT_DEBUG_DRAW_DECAL_ATLAS) { + RID decal_atlas = storage->decal_atlas_get_texture(); + + if (decal_atlas.is_valid()) { + Size2 rtsize = storage->render_target_get_size(rb->render_target); + + effects->copy_to_fb_rect(decal_atlas, storage->render_target_get_rd_framebuffer(rb->render_target), Rect2i(Vector2(), rtsize / 2), false, false, true); } } @@ -3496,24 +3548,24 @@ void RasterizerSceneRD::_render_buffers_debug_draw(RID p_render_buffers, RID p_s if (rb->luminance.current.is_valid()) { Size2 rtsize = storage->render_target_get_size(rb->render_target); - effects->copy_to_rect(rb->luminance.current, storage->render_target_get_rd_framebuffer(rb->render_target), Rect2(Vector2(), rtsize / 8), false, true); + effects->copy_to_fb_rect(rb->luminance.current, storage->render_target_get_rd_framebuffer(rb->render_target), Rect2(Vector2(), rtsize / 8), false, true); } } if (debug_draw == RS::VIEWPORT_DEBUG_DRAW_SSAO && rb->ssao.ao[0].is_valid()) { Size2 rtsize = storage->render_target_get_size(rb->render_target); RID ao_buf = rb->ssao.ao_full.is_valid() ? rb->ssao.ao_full : rb->ssao.ao[0]; - effects->copy_to_rect(ao_buf, storage->render_target_get_rd_framebuffer(rb->render_target), Rect2(Vector2(), rtsize), false, true); + effects->copy_to_fb_rect(ao_buf, storage->render_target_get_rd_framebuffer(rb->render_target), Rect2(Vector2(), rtsize), false, true); } if (debug_draw == RS::VIEWPORT_DEBUG_DRAW_ROUGHNESS_LIMITER && _render_buffers_get_roughness_texture(p_render_buffers).is_valid()) { Size2 rtsize = storage->render_target_get_size(rb->render_target); - effects->copy_to_rect(_render_buffers_get_roughness_texture(p_render_buffers), storage->render_target_get_rd_framebuffer(rb->render_target), Rect2(Vector2(), rtsize), false, true); + effects->copy_to_fb_rect(_render_buffers_get_roughness_texture(p_render_buffers), storage->render_target_get_rd_framebuffer(rb->render_target), Rect2(Vector2(), rtsize), false, true); } if (debug_draw == RS::VIEWPORT_DEBUG_DRAW_NORMAL_BUFFER && _render_buffers_get_normal_texture(p_render_buffers).is_valid()) { Size2 rtsize = storage->render_target_get_size(rb->render_target); - effects->copy_to_rect(_render_buffers_get_normal_texture(p_render_buffers), storage->render_target_get_rd_framebuffer(rb->render_target), Rect2(Vector2(), rtsize)); + effects->copy_to_fb_rect(_render_buffers_get_normal_texture(p_render_buffers), storage->render_target_get_rd_framebuffer(rb->render_target), Rect2(Vector2(), rtsize), false, false); } } @@ -3534,13 +3586,14 @@ RID RasterizerSceneRD::render_buffers_get_ao_texture(RID p_render_buffers) { return rb->ssao.ao_full.is_valid() ? rb->ssao.ao_full : rb->ssao.ao[0]; } -void RasterizerSceneRD::render_buffers_configure(RID p_render_buffers, RID p_render_target, int p_width, int p_height, RS::ViewportMSAA p_msaa) { +void RasterizerSceneRD::render_buffers_configure(RID p_render_buffers, RID p_render_target, int p_width, int p_height, RS::ViewportMSAA p_msaa, RenderingServer::ViewportScreenSpaceAA p_screen_space_aa) { RenderBuffers *rb = render_buffers_owner.getornull(p_render_buffers); rb->width = p_width; rb->height = p_height; rb->render_target = p_render_target; rb->msaa = p_msaa; + rb->screen_space_aa = p_screen_space_aa; _free_render_buffer_data(rb); { @@ -3548,7 +3601,12 @@ void RasterizerSceneRD::render_buffers_configure(RID p_render_buffers, RID p_ren tf.format = RD::DATA_FORMAT_R16G16B16A16_SFLOAT; tf.width = rb->width; tf.height = rb->height; - tf.usage_bits = RD::TEXTURE_USAGE_SAMPLING_BIT | RD::TEXTURE_USAGE_STORAGE_BIT | RD::TEXTURE_USAGE_COLOR_ATTACHMENT_BIT; + tf.usage_bits = RD::TEXTURE_USAGE_SAMPLING_BIT | RD::TEXTURE_USAGE_STORAGE_BIT; + if (rb->msaa != RS::VIEWPORT_MSAA_DISABLED) { + tf.usage_bits |= RD::TEXTURE_USAGE_CAN_COPY_TO_BIT; + } else { + tf.usage_bits |= RD::TEXTURE_USAGE_COLOR_ATTACHMENT_BIT; + } rb->texture = RD::get_singleton()->texture_create(tf, RD::TextureView()); } @@ -3559,6 +3617,9 @@ void RasterizerSceneRD::render_buffers_configure(RID p_render_buffers, RID p_ren tf.width = p_width; tf.height = p_height; tf.usage_bits = RD::TEXTURE_USAGE_SAMPLING_BIT | RD::TEXTURE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT; + if (rb->msaa != RS::VIEWPORT_MSAA_DISABLED) { + tf.usage_bits |= RD::TEXTURE_USAGE_CAN_COPY_TO_BIT; + } rb->depth_texture = RD::get_singleton()->texture_create(tf, RD::TextureView()); } @@ -3580,6 +3641,88 @@ void RasterizerSceneRD::sub_surface_scattering_set_scale(float p_scale, float p_ sss_depth_scale = p_depth_scale; } +void RasterizerSceneRD::shadows_quality_set(RS::ShadowQuality p_quality) { + + ERR_FAIL_INDEX_MSG(p_quality, RS::SHADOW_QUALITY_MAX, "Shadow quality too high, please see RenderingServer's ShadowQuality enum"); + + if (shadows_quality != p_quality) { + shadows_quality = p_quality; + + switch (shadows_quality) { + case RS::SHADOW_QUALITY_HARD: { + penumbra_shadow_samples = 4; + soft_shadow_samples = 1; + shadows_quality_radius = 1.0; + } break; + case RS::SHADOW_QUALITY_SOFT_LOW: { + penumbra_shadow_samples = 8; + soft_shadow_samples = 4; + shadows_quality_radius = 2.0; + } break; + case RS::SHADOW_QUALITY_SOFT_MEDIUM: { + penumbra_shadow_samples = 12; + soft_shadow_samples = 8; + shadows_quality_radius = 2.0; + } break; + case RS::SHADOW_QUALITY_SOFT_HIGH: { + penumbra_shadow_samples = 24; + soft_shadow_samples = 16; + shadows_quality_radius = 3.0; + } break; + case RS::SHADOW_QUALITY_SOFT_ULTRA: { + penumbra_shadow_samples = 32; + soft_shadow_samples = 32; + shadows_quality_radius = 4.0; + } break; + case RS::SHADOW_QUALITY_MAX: + break; + } + get_vogel_disk(penumbra_shadow_kernel, penumbra_shadow_samples); + get_vogel_disk(soft_shadow_kernel, soft_shadow_samples); + } +} + +void RasterizerSceneRD::directional_shadow_quality_set(RS::ShadowQuality p_quality) { + + ERR_FAIL_INDEX_MSG(p_quality, RS::SHADOW_QUALITY_MAX, "Shadow quality too high, please see RenderingServer's ShadowQuality enum"); + + if (directional_shadow_quality != p_quality) { + directional_shadow_quality = p_quality; + + switch (directional_shadow_quality) { + case RS::SHADOW_QUALITY_HARD: { + directional_penumbra_shadow_samples = 4; + directional_soft_shadow_samples = 1; + directional_shadow_quality_radius = 1.0; + } break; + case RS::SHADOW_QUALITY_SOFT_LOW: { + directional_penumbra_shadow_samples = 8; + directional_soft_shadow_samples = 4; + directional_shadow_quality_radius = 2.0; + } break; + case RS::SHADOW_QUALITY_SOFT_MEDIUM: { + directional_penumbra_shadow_samples = 12; + directional_soft_shadow_samples = 8; + directional_shadow_quality_radius = 2.0; + } break; + case RS::SHADOW_QUALITY_SOFT_HIGH: { + directional_penumbra_shadow_samples = 24; + directional_soft_shadow_samples = 16; + directional_shadow_quality_radius = 3.0; + } break; + case RS::SHADOW_QUALITY_SOFT_ULTRA: { + directional_penumbra_shadow_samples = 32; + directional_soft_shadow_samples = 32; + directional_shadow_quality_radius = 4.0; + } break; + case RS::SHADOW_QUALITY_MAX: + break; + } + get_vogel_disk(directional_penumbra_shadow_kernel, directional_penumbra_shadow_samples); + get_vogel_disk(directional_soft_shadow_kernel, directional_soft_shadow_samples); + } +} + int RasterizerSceneRD::get_roughness_layers() const { return roughness_layers; } @@ -3594,7 +3737,7 @@ RasterizerSceneRD::RenderBufferData *RasterizerSceneRD::render_buffers_get_data( return rb->data; } -void RasterizerSceneRD::render_scene(RID p_render_buffers, const Transform &p_cam_transform, const CameraMatrix &p_cam_projection, bool p_cam_ortogonal, InstanceBase **p_cull_result, int p_cull_count, RID *p_light_cull_result, int p_light_cull_count, RID *p_reflection_probe_cull_result, int p_reflection_probe_cull_count, RID *p_gi_probe_cull_result, int p_gi_probe_cull_count, RID p_environment, RID p_camera_effects, RID p_shadow_atlas, RID p_reflection_atlas, RID p_reflection_probe, int p_reflection_probe_pass) { +void RasterizerSceneRD::render_scene(RID p_render_buffers, const Transform &p_cam_transform, const CameraMatrix &p_cam_projection, bool p_cam_ortogonal, InstanceBase **p_cull_result, int p_cull_count, RID *p_light_cull_result, int p_light_cull_count, RID *p_reflection_probe_cull_result, int p_reflection_probe_cull_count, RID *p_gi_probe_cull_result, int p_gi_probe_cull_count, RID *p_decal_cull_result, int p_decal_cull_count, RID p_environment, RID p_camera_effects, RID p_shadow_atlas, RID p_reflection_atlas, RID p_reflection_probe, int p_reflection_probe_pass) { Color clear_color; if (p_render_buffers.is_valid()) { @@ -3605,7 +3748,7 @@ void RasterizerSceneRD::render_scene(RID p_render_buffers, const Transform &p_ca clear_color = storage->get_default_clear_color(); } - _render_scene(p_render_buffers, p_cam_transform, p_cam_projection, p_cam_ortogonal, p_cull_result, p_cull_count, p_light_cull_result, p_light_cull_count, p_reflection_probe_cull_result, p_reflection_probe_cull_count, p_gi_probe_cull_result, p_gi_probe_cull_count, p_environment, p_camera_effects, p_shadow_atlas, p_reflection_atlas, p_reflection_probe, p_reflection_probe_pass, clear_color); + _render_scene(p_render_buffers, p_cam_transform, p_cam_projection, p_cam_ortogonal, p_cull_result, p_cull_count, p_light_cull_result, p_light_cull_count, p_reflection_probe_cull_result, p_reflection_probe_cull_count, p_gi_probe_cull_result, p_gi_probe_cull_count, p_decal_cull_result, p_decal_cull_count, p_environment, p_camera_effects, p_shadow_atlas, p_reflection_atlas, p_reflection_probe, p_reflection_probe_pass, clear_color); if (p_render_buffers.is_valid()) { RENDER_TIMESTAMP("Tonemap"); @@ -3621,16 +3764,19 @@ void RasterizerSceneRD::render_shadow(RID p_light, RID p_shadow_atlas, int p_pas ERR_FAIL_COND(!light_instance); Rect2i atlas_rect; - RID atlas_fb; + RID atlas_texture; bool using_dual_paraboloid = false; bool using_dual_paraboloid_flip = false; + float znear = 0; float zfar = 0; RID render_fb; RID render_texture; float bias = 0; float normal_bias = 0; + bool use_pancake = false; + bool use_linear_depth = false; bool render_cubemap = false; bool finalize_cubemap = false; @@ -3645,6 +3791,7 @@ void RasterizerSceneRD::render_shadow(RID p_light, RID p_shadow_atlas, int p_pas light_instance->last_scene_shadow_pass = scene_pass; } + use_pancake = storage->light_get_param(light_instance->light, RS::LIGHT_PARAM_SHADOW_PANCAKE_SIZE) > 0; light_projection = light_instance->shadow_transform[p_pass].camera; light_transform = light_instance->shadow_transform[p_pass].transform; @@ -3683,7 +3830,7 @@ void RasterizerSceneRD::render_shadow(RID p_light, RID p_shadow_atlas, int p_pas light_instance->shadow_transform[p_pass].atlas_rect.position /= directional_shadow.size; light_instance->shadow_transform[p_pass].atlas_rect.size /= directional_shadow.size; - float bias_mult = Math::lerp(1.0f, light_instance->shadow_transform[p_pass].bias_scale, storage->light_get_param(light_instance->light, RS::LIGHT_PARAM_SHADOW_BIAS_SPLIT_SCALE)); + float bias_mult = light_instance->shadow_transform[p_pass].bias_scale; zfar = storage->light_get_param(light_instance->light, RS::LIGHT_PARAM_RANGE); bias = storage->light_get_param(light_instance->light, RS::LIGHT_PARAM_SHADOW_BIAS) * bias_mult; normal_bias = storage->light_get_param(light_instance->light, RS::LIGHT_PARAM_SHADOW_NORMAL_BIAS) * bias_mult; @@ -3691,7 +3838,7 @@ void RasterizerSceneRD::render_shadow(RID p_light, RID p_shadow_atlas, int p_pas ShadowMap *shadow_map = _get_shadow_map(atlas_rect.size); render_fb = shadow_map->fb; render_texture = shadow_map->depth; - atlas_fb = directional_shadow.fb; + atlas_texture = directional_shadow.depth; } else { //set from shadow atlas @@ -3718,7 +3865,7 @@ void RasterizerSceneRD::render_shadow(RID p_light, RID p_shadow_atlas, int p_pas atlas_rect.size.width = shadow_size; atlas_rect.size.height = shadow_size; - atlas_fb = shadow_atlas->fb; + atlas_texture = shadow_atlas->depth; zfar = storage->light_get_param(light_instance->light, RS::LIGHT_PARAM_RANGE); bias = storage->light_get_param(light_instance->light, RS::LIGHT_PARAM_SHADOW_BIAS); @@ -3762,26 +3909,33 @@ void RasterizerSceneRD::render_shadow(RID p_light, RID p_shadow_atlas, int p_pas ShadowMap *shadow_map = _get_shadow_map(atlas_rect.size); render_fb = shadow_map->fb; render_texture = shadow_map->depth; + + znear = light_instance->shadow_transform[0].camera.get_z_near(); + use_linear_depth = true; } } if (render_cubemap) { //rendering to cubemap - _render_shadow(render_fb, p_cull_result, p_cull_count, light_projection, light_transform, zfar, 0, 0, false, false); + _render_shadow(render_fb, p_cull_result, p_cull_count, light_projection, light_transform, zfar, 0, 0, false, false, use_pancake); if (finalize_cubemap) { //reblit atlas_rect.size.height /= 2; - storage->get_effects()->copy_cubemap_to_dp(render_texture, atlas_fb, atlas_rect, light_projection.get_z_near(), light_projection.get_z_far(), bias, false); + storage->get_effects()->copy_cubemap_to_dp(render_texture, atlas_texture, atlas_rect, light_projection.get_z_near(), light_projection.get_z_far(), 0.0, false); atlas_rect.position.y += atlas_rect.size.height; - storage->get_effects()->copy_cubemap_to_dp(render_texture, atlas_fb, atlas_rect, light_projection.get_z_near(), light_projection.get_z_far(), bias, true); + storage->get_effects()->copy_cubemap_to_dp(render_texture, atlas_texture, atlas_rect, light_projection.get_z_near(), light_projection.get_z_far(), 0.0, true); } } else { //render shadow - _render_shadow(render_fb, p_cull_result, p_cull_count, light_projection, light_transform, zfar, bias, normal_bias, using_dual_paraboloid, using_dual_paraboloid_flip); + _render_shadow(render_fb, p_cull_result, p_cull_count, light_projection, light_transform, zfar, bias, normal_bias, using_dual_paraboloid, using_dual_paraboloid_flip, use_pancake); //copy to atlas - storage->get_effects()->copy_to_rect(render_texture, atlas_fb, atlas_rect, true); + if (use_linear_depth) { + storage->get_effects()->copy_depth_to_rect_and_linearize(render_texture, atlas_texture, atlas_rect, true, znear, zfar); + } else { + storage->get_effects()->copy_depth_to_rect(render_texture, atlas_texture, atlas_rect, true); + } //does not work from depth to color //RD::get_singleton()->texture_copy(render_texture, atlas_texture, Vector3(0, 0, 0), Vector3(atlas_rect.position.x, atlas_rect.position.y, 0), Vector3(atlas_rect.size.x, atlas_rect.size.y, 1), 0, 0, 0, 0, true); @@ -3814,6 +3968,8 @@ bool RasterizerSceneRD::free(RID p_rid) { //ReflectionProbeInstance *rpi = reflection_probe_instance_owner.getornull(p_rid); reflection_probe_release_atlas_index(p_rid); reflection_probe_instance_owner.free(p_rid); + } else if (decal_instance_owner.owns(p_rid)) { + decal_instance_owner.free(p_rid); } else if (gi_probe_instance_owner.owns(p_rid)) { GIProbeInstance *gi_probe = gi_probe_instance_owner.getornull(p_rid); if (gi_probe->texture.is_valid()) { @@ -4057,21 +4213,25 @@ RasterizerSceneRD::RasterizerSceneRD(RasterizerStorageRD *p_storage) { actions.renames["QUARTER_RES_COLOR"] = "quarter_res_color"; actions.renames["RADIANCE"] = "radiance"; actions.renames["LIGHT0_ENABLED"] = "directional_lights.data[0].enabled"; - actions.renames["LIGHT0_DIRECTION"] = "directional_lights.data[0].direction"; - actions.renames["LIGHT0_ENERGY"] = "directional_lights.data[0].energy"; - actions.renames["LIGHT0_COLOR"] = "directional_lights.data[0].color"; + actions.renames["LIGHT0_DIRECTION"] = "directional_lights.data[0].direction_energy.xyz"; + actions.renames["LIGHT0_ENERGY"] = "directional_lights.data[0].direction_energy.w"; + actions.renames["LIGHT0_COLOR"] = "directional_lights.data[0].color_size.xyz"; + actions.renames["LIGHT0_SIZE"] = "directional_lights.data[0].color_size.w"; actions.renames["LIGHT1_ENABLED"] = "directional_lights.data[1].enabled"; - actions.renames["LIGHT1_DIRECTION"] = "directional_lights.data[1].direction"; - actions.renames["LIGHT1_ENERGY"] = "directional_lights.data[1].energy"; - actions.renames["LIGHT1_COLOR"] = "directional_lights.data[1].color"; + actions.renames["LIGHT1_DIRECTION"] = "directional_lights.data[1].direction_energy.xyz"; + actions.renames["LIGHT1_ENERGY"] = "directional_lights.data[1].direction_energy.w"; + actions.renames["LIGHT1_COLOR"] = "directional_lights.data[1].color_size.xyz"; + actions.renames["LIGHT1_SIZE"] = "directional_lights.data[1].color_size.w"; actions.renames["LIGHT2_ENABLED"] = "directional_lights.data[2].enabled"; - actions.renames["LIGHT2_DIRECTION"] = "directional_lights.data[2].direction"; - actions.renames["LIGHT2_ENERGY"] = "directional_lights.data[2].energy"; - actions.renames["LIGHT2_COLOR"] = "directional_lights.data[2].color"; + actions.renames["LIGHT2_DIRECTION"] = "directional_lights.data[2].direction_energy.xyz"; + actions.renames["LIGHT2_ENERGY"] = "directional_lights.data[2].direction_energy.w"; + actions.renames["LIGHT2_COLOR"] = "directional_lights.data[2].color_size.xyz"; + actions.renames["LIGHT2_SIZE"] = "directional_lights.data[2].color_size.w"; actions.renames["LIGHT3_ENABLED"] = "directional_lights.data[3].enabled"; - actions.renames["LIGHT3_DIRECTION"] = "directional_lights.data[3].direction"; - actions.renames["LIGHT3_ENERGY"] = "directional_lights.data[3].energy"; - actions.renames["LIGHT3_COLOR"] = "directional_lights.data[3].color"; + actions.renames["LIGHT3_DIRECTION"] = "directional_lights.data[3].direction_energy.xyz"; + actions.renames["LIGHT3_ENERGY"] = "directional_lights.data[3].direction_energy.w"; + actions.renames["LIGHT3_COLOR"] = "directional_lights.data[3].color_size.xyz"; + actions.renames["LIGHT3_SIZE"] = "directional_lights.data[3].color_size.w"; actions.renames["AT_CUBEMAP_PASS"] = "AT_CUBEMAP_PASS"; actions.renames["AT_HALF_RES_PASS"] = "AT_HALF_RES_PASS"; actions.renames["AT_QUARTER_RES_PASS"] = "AT_QUARTER_RES_PASS"; @@ -4087,6 +4247,7 @@ RasterizerSceneRD::RasterizerSceneRD(RasterizerStorageRD *p_storage) { actions.default_filter = ShaderLanguage::FILTER_LINEAR_MIPMAP; actions.default_repeat = ShaderLanguage::REPEAT_ENABLE; + actions.global_buffer_array_variable = "global_variables.data"; sky_shader.compiler.initialize(actions); } @@ -4094,7 +4255,7 @@ RasterizerSceneRD::RasterizerSceneRD(RasterizerStorageRD *p_storage) { { // default material and shader for sky shader sky_shader.default_shader = storage->shader_create(); - storage->shader_set_code(sky_shader.default_shader, "shader_type sky; void fragment() { COLOR = mix(vec3(0.3), vec3(0.2, 0.4, 0.9), smoothstep(0.0, 0.05, EYEDIR.y)); } \n"); + storage->shader_set_code(sky_shader.default_shader, "shader_type sky; void fragment() { COLOR = vec3(0.0); } \n"); sky_shader.default_material = storage->material_create(); storage->material_set_shader(sky_shader.default_material, sky_shader.default_shader); @@ -4124,19 +4285,33 @@ RasterizerSceneRD::RasterizerSceneRD(RasterizerStorageRD *p_storage) { uniforms.push_back(u); } + { + RD::Uniform u; + u.type = RD::UNIFORM_TYPE_STORAGE_BUFFER; + u.binding = 1; + u.ids.push_back(storage->global_variables_get_storage_buffer()); + uniforms.push_back(u); + } + sky_scene_state.sampler_uniform_set = RD::get_singleton()->uniform_set_create(uniforms, sky_shader.default_shader_rd, SKY_SET_SAMPLERS); } - camera_effects_set_dof_blur_bokeh_shape(RS::DOFBokehShape(int(GLOBAL_GET("rendering/quality/filters/depth_of_field_bokeh_shape")))); - camera_effects_set_dof_blur_quality(RS::DOFBlurQuality(int(GLOBAL_GET("rendering/quality/filters/depth_of_field_bokeh_quality"))), GLOBAL_GET("rendering/quality/filters/depth_of_field_use_jitter")); + camera_effects_set_dof_blur_bokeh_shape(RS::DOFBokehShape(int(GLOBAL_GET("rendering/quality/depth_of_field/depth_of_field_bokeh_shape")))); + camera_effects_set_dof_blur_quality(RS::DOFBlurQuality(int(GLOBAL_GET("rendering/quality/depth_of_field/depth_of_field_bokeh_quality"))), GLOBAL_GET("rendering/quality/depth_of_field/depth_of_field_use_jitter")); environment_set_ssao_quality(RS::EnvironmentSSAOQuality(int(GLOBAL_GET("rendering/quality/ssao/quality"))), GLOBAL_GET("rendering/quality/ssao/half_size")); - screen_space_roughness_limiter = GLOBAL_GET("rendering/quality/filters/screen_space_roughness_limiter"); - screen_space_roughness_limiter_curve = GLOBAL_GET("rendering/quality/filters/screen_space_roughness_limiter_curve"); + screen_space_roughness_limiter = GLOBAL_GET("rendering/quality/screen_filters/screen_space_roughness_limiter"); + screen_space_roughness_limiter_curve = GLOBAL_GET("rendering/quality/screen_filters/screen_space_roughness_limiter_curve"); glow_bicubic_upscale = int(GLOBAL_GET("rendering/quality/glow/upscale_mode")) > 0; ssr_roughness_quality = RS::EnvironmentSSRRoughnessQuality(int(GLOBAL_GET("rendering/quality/screen_space_reflection/roughness_quality"))); sss_quality = RS::SubSurfaceScatteringQuality(int(GLOBAL_GET("rendering/quality/subsurface_scattering/subsurface_scattering_quality"))); sss_scale = GLOBAL_GET("rendering/quality/subsurface_scattering/subsurface_scattering_scale"); sss_depth_scale = GLOBAL_GET("rendering/quality/subsurface_scattering/subsurface_scattering_depth_scale"); + directional_penumbra_shadow_kernel = memnew_arr(float, 128); + directional_soft_shadow_kernel = memnew_arr(float, 128); + penumbra_shadow_kernel = memnew_arr(float, 128); + soft_shadow_kernel = memnew_arr(float, 128); + shadows_quality_set(RS::ShadowQuality(int(GLOBAL_GET("rendering/quality/shadows/soft_shadow_quality")))); + directional_shadow_quality_set(RS::ShadowQuality(int(GLOBAL_GET("rendering/quality/directional_shadow/soft_shadow_quality")))); } RasterizerSceneRD::~RasterizerSceneRD() { @@ -4165,4 +4340,8 @@ RasterizerSceneRD::~RasterizerSceneRD() { memdelete_arr(sky_scene_state.last_frame_directional_lights); storage->free(sky_shader.default_shader); storage->free(sky_shader.default_material); + memdelete_arr(directional_penumbra_shadow_kernel); + memdelete_arr(directional_soft_shadow_kernel); + memdelete_arr(penumbra_shadow_kernel); + memdelete_arr(soft_shadow_kernel); } diff --git a/servers/rendering/rasterizer_rd/rasterizer_scene_rd.h b/servers/rendering/rasterizer_rd/rasterizer_scene_rd.h index 3f71f7dbc1..a511838e16 100644 --- a/servers/rendering/rasterizer_rd/rasterizer_scene_rd.h +++ b/servers/rendering/rasterizer_rd/rasterizer_scene_rd.h @@ -56,7 +56,9 @@ protected: float direction[3]; float energy; float color[3]; + float size; uint32_t enabled; + uint32_t pad[3]; }; struct SkySceneState { @@ -78,8 +80,8 @@ protected: }; virtual RenderBufferData *_create_render_buffer_data() = 0; - virtual void _render_scene(RID p_render_buffer, const Transform &p_cam_transform, const CameraMatrix &p_cam_projection, bool p_cam_ortogonal, InstanceBase **p_cull_result, int p_cull_count, RID *p_light_cull_result, int p_light_cull_count, RID *p_reflection_probe_cull_result, int p_reflection_probe_cull_count, RID *p_gi_probe_cull_result, int p_gi_probe_cull_count, RID p_environment, RID p_camera_effects, RID p_shadow_atlas, RID p_reflection_atlas, RID p_reflection_probe, int p_reflection_probe_pass, const Color &p_default_color) = 0; - virtual void _render_shadow(RID p_framebuffer, InstanceBase **p_cull_result, int p_cull_count, const CameraMatrix &p_projection, const Transform &p_transform, float p_zfar, float p_bias, float p_normal_bias, bool p_use_dp, bool use_dp_flip) = 0; + virtual void _render_scene(RID p_render_buffer, const Transform &p_cam_transform, const CameraMatrix &p_cam_projection, bool p_cam_ortogonal, InstanceBase **p_cull_result, int p_cull_count, RID *p_light_cull_result, int p_light_cull_count, RID *p_reflection_probe_cull_result, int p_reflection_probe_cull_count, RID *p_gi_probe_cull_result, int p_gi_probe_cull_count, RID *p_decal_cull_result, int p_decal_cull_count, RID p_environment, RID p_camera_effects, RID p_shadow_atlas, RID p_reflection_atlas, RID p_reflection_probe, int p_reflection_probe_pass, const Color &p_default_color) = 0; + virtual void _render_shadow(RID p_framebuffer, InstanceBase **p_cull_result, int p_cull_count, const CameraMatrix &p_projection, const Transform &p_transform, float p_zfar, float p_bias, float p_normal_bias, bool p_use_dp, bool use_dp_flip, bool p_use_pancake) = 0; virtual void _render_material(const Transform &p_cam_transform, const CameraMatrix &p_cam_projection, bool p_cam_ortogonal, InstanceBase **p_cull_result, int p_cull_count, RID p_framebuffer, const Rect2i &p_region) = 0; virtual void _debug_giprobe(RID p_gi_probe, RenderingDevice::DrawListID p_draw_list, RID p_framebuffer, const CameraMatrix &p_camera_with_transform, bool p_lighting, bool p_emission, float p_alpha); @@ -189,6 +191,7 @@ private: virtual void set_code(const String &p_Code); virtual void set_default_texture_param(const StringName &p_name, RID p_texture); virtual void get_param_list(List<PropertyInfo> *p_param_list) const; + virtual void get_instance_param_list(List<RasterizerStorage::InstanceShaderParam> *p_param_list) const; virtual bool is_param_texture(const StringName &p_param) const; virtual bool is_animated() const; virtual bool casts_shadows() const; @@ -324,6 +327,16 @@ private: mutable RID_Owner<ReflectionProbeInstance> reflection_probe_instance_owner; + /* REFLECTION PROBE INSTANCE */ + + struct DecalInstance { + + RID decal; + Transform transform; + }; + + mutable RID_Owner<DecalInstance> decal_instance_owner; + /* GIPROBE INSTANCE */ struct GIProbeLight { @@ -527,11 +540,24 @@ private: bool _shadow_atlas_find_shadow(ShadowAtlas *shadow_atlas, int *p_in_quadrants, int p_quadrant_count, int p_current_subdiv, uint64_t p_tick, int &r_quadrant, int &r_shadow); + RS::ShadowQuality shadows_quality = RS::SHADOW_QUALITY_MAX; //So it always updates when first set + RS::ShadowQuality directional_shadow_quality = RS::SHADOW_QUALITY_MAX; + float shadows_quality_radius = 1.0; + float directional_shadow_quality_radius = 1.0; + + float *directional_penumbra_shadow_kernel; + float *directional_soft_shadow_kernel; + float *penumbra_shadow_kernel; + float *soft_shadow_kernel; + int directional_penumbra_shadow_samples = 0; + int directional_soft_shadow_samples = 0; + int penumbra_shadow_samples = 0; + int soft_shadow_samples = 0; + /* DIRECTIONAL SHADOW */ struct DirectionalShadow { RID depth; - RID fb; //for copying int light_count = 0; int size = 0; @@ -570,7 +596,10 @@ private: float farplane; float split; float bias_scale; + float shadow_texel_size; + float range_begin; Rect2 atlas_rect; + Vector2 uv_scale; }; RS::LightType light_type = RS::LIGHT_DIRECTIONAL; @@ -712,6 +741,8 @@ private: RenderBufferData *data = nullptr; int width = 0, height = 0; RS::ViewportMSAA msaa = RS::VIEWPORT_MSAA_DISABLED; + RS::ViewportScreenSpaceAA screen_space_aa = RS::VIEWPORT_SCREEN_SPACE_AA_DISABLED; + RID render_target; uint64_t auto_exposure_version = 1; @@ -725,7 +756,6 @@ private: struct Mipmap { RID texture; - RID framebuffer; int width; int height; }; @@ -839,8 +869,8 @@ public: float environment_get_bg_energy(RID p_env) const; int environment_get_canvas_max_layer(RID p_env) const; Color environment_get_ambient_light_color(RID p_env) const; - RS::EnvironmentAmbientSource environment_get_ambient_light_ambient_source(RID p_env) const; - float environment_get_ambient_light_ambient_energy(RID p_env) const; + RS::EnvironmentAmbientSource environment_get_ambient_source(RID p_env) const; + float environment_get_ambient_light_energy(RID p_env) const; float environment_get_ambient_sky_contribution(RID p_env) const; RS::EnvironmentReflectionSource environment_get_reflection_source(RID p_env) const; Color environment_get_ao_color(RID p_env) const; @@ -880,7 +910,7 @@ public: RID light_instance_create(RID p_light); void light_instance_set_transform(RID p_light_instance, const Transform &p_transform); - void light_instance_set_shadow_transform(RID p_light_instance, const CameraMatrix &p_projection, const Transform &p_transform, float p_far, float p_split, int p_pass, float p_bias_scale = 1.0); + void light_instance_set_shadow_transform(RID p_light_instance, const CameraMatrix &p_projection, const Transform &p_transform, float p_far, float p_split, int p_pass, float p_shadow_texel_size, float p_bias_scale = 1.0, float p_range_begin = 0, const Vector2 &p_uv_scale = Vector2()); void light_instance_mark_visible(RID p_light_instance); _FORCE_INLINE_ RID light_instance_get_base_light(RID p_light_instance) { @@ -926,11 +956,55 @@ public: return li->shadow_transform[p_index].camera; } - _FORCE_INLINE_ Transform light_instance_get_shadow_transform(RID p_light_instance, int p_index) { + _FORCE_INLINE_ float light_instance_get_shadow_texel_size(RID p_light_instance, RID p_shadow_atlas) { + +#ifdef DEBUG_ENABLED + LightInstance *li = light_instance_owner.getornull(p_light_instance); + ERR_FAIL_COND_V(!li->shadow_atlases.has(p_shadow_atlas), 0); +#endif + ShadowAtlas *shadow_atlas = shadow_atlas_owner.getornull(p_shadow_atlas); + ERR_FAIL_COND_V(!shadow_atlas, 0); +#ifdef DEBUG_ENABLED + ERR_FAIL_COND_V(!shadow_atlas->shadow_owners.has(p_light_instance), 0); +#endif + uint32_t key = shadow_atlas->shadow_owners[p_light_instance]; + + uint32_t quadrant = (key >> ShadowAtlas::QUADRANT_SHIFT) & 0x3; + + uint32_t quadrant_size = shadow_atlas->size >> 1; + + uint32_t shadow_size = (quadrant_size / shadow_atlas->quadrants[quadrant].subdivision); + + return float(1.0) / shadow_size; + } + + _FORCE_INLINE_ Transform + light_instance_get_shadow_transform(RID p_light_instance, int p_index) { LightInstance *li = light_instance_owner.getornull(p_light_instance); return li->shadow_transform[p_index].transform; } + _FORCE_INLINE_ float light_instance_get_shadow_bias_scale(RID p_light_instance, int p_index) { + + LightInstance *li = light_instance_owner.getornull(p_light_instance); + return li->shadow_transform[p_index].bias_scale; + } + _FORCE_INLINE_ float light_instance_get_shadow_range(RID p_light_instance, int p_index) { + + LightInstance *li = light_instance_owner.getornull(p_light_instance); + return li->shadow_transform[p_index].farplane; + } + _FORCE_INLINE_ float light_instance_get_shadow_range_begin(RID p_light_instance, int p_index) { + + LightInstance *li = light_instance_owner.getornull(p_light_instance); + return li->shadow_transform[p_index].range_begin; + } + + _FORCE_INLINE_ Vector2 light_instance_get_shadow_uv_scale(RID p_light_instance, int p_index) { + + LightInstance *li = light_instance_owner.getornull(p_light_instance); + return li->shadow_transform[p_index].uv_scale; + } _FORCE_INLINE_ Rect2 light_instance_get_directional_shadow_atlas_rect(RID p_light_instance, int p_index) { @@ -944,6 +1018,12 @@ public: return li->shadow_transform[p_index].split; } + _FORCE_INLINE_ float light_instance_get_directional_shadow_texel_size(RID p_light_instance, int p_index) { + + LightInstance *li = light_instance_owner.getornull(p_light_instance); + return li->shadow_transform[p_index].shadow_texel_size; + } + _FORCE_INLINE_ void light_instance_set_render_pass(RID p_light_instance, uint64_t p_pass) { LightInstance *li = light_instance_owner.getornull(p_light_instance); li->last_pass = p_pass; @@ -1036,6 +1116,19 @@ public: return rpi->atlas_index; } + virtual RID decal_instance_create(RID p_decal); + virtual void decal_instance_set_transform(RID p_decal, const Transform &p_transform); + + _FORCE_INLINE_ RID decal_instance_get_base(RID p_decal) const { + DecalInstance *decal = decal_instance_owner.getornull(p_decal); + return decal->decal; + } + + _FORCE_INLINE_ Transform decal_instance_get_transform(RID p_decal) const { + DecalInstance *decal = decal_instance_owner.getornull(p_decal); + return decal->transform; + } + RID gi_probe_instance_create(RID p_base); void gi_probe_instance_set_transform_to_data(RID p_probe, const Transform &p_xform); bool gi_probe_needs_update(RID p_probe) const; @@ -1096,19 +1189,23 @@ public: GIProbeQuality gi_probe_get_quality() const; RID render_buffers_create(); - void render_buffers_configure(RID p_render_buffers, RID p_render_target, int p_width, int p_height, RS::ViewportMSAA p_msaa); + void render_buffers_configure(RID p_render_buffers, RID p_render_target, int p_width, int p_height, RS::ViewportMSAA p_msaa, RS::ViewportScreenSpaceAA p_screen_space_aa); RID render_buffers_get_ao_texture(RID p_render_buffers); RID render_buffers_get_back_buffer_texture(RID p_render_buffers); - void render_scene(RID p_render_buffers, const Transform &p_cam_transform, const CameraMatrix &p_cam_projection, bool p_cam_ortogonal, InstanceBase **p_cull_result, int p_cull_count, RID *p_light_cull_result, int p_light_cull_count, RID *p_reflection_probe_cull_result, int p_reflection_probe_cull_count, RID *p_gi_probe_cull_result, int p_gi_probe_cull_count, RID p_environment, RID p_shadow_atlas, RID p_camera_effects, RID p_reflection_atlas, RID p_reflection_probe, int p_reflection_probe_pass); + void render_scene(RID p_render_buffers, const Transform &p_cam_transform, const CameraMatrix &p_cam_projection, bool p_cam_ortogonal, InstanceBase **p_cull_result, int p_cull_count, RID *p_light_cull_result, int p_light_cull_count, RID *p_reflection_probe_cull_result, int p_reflection_probe_cull_count, RID *p_gi_probe_cull_result, int p_gi_probe_cull_count, RID *p_decal_cull_result, int p_decal_cull_count, RID p_environment, RID p_shadow_atlas, RID p_camera_effects, RID p_reflection_atlas, RID p_reflection_probe, int p_reflection_probe_pass); void render_shadow(RID p_light, RID p_shadow_atlas, int p_pass, InstanceBase **p_cull_result, int p_cull_count); void render_material(const Transform &p_cam_transform, const CameraMatrix &p_cam_projection, bool p_cam_ortogonal, InstanceBase **p_cull_result, int p_cull_count, RID p_framebuffer, const Rect2i &p_region); - virtual void set_scene_pass(uint64_t p_pass) { scene_pass = p_pass; } - _FORCE_INLINE_ uint64_t get_scene_pass() { return scene_pass; } + virtual void set_scene_pass(uint64_t p_pass) { + scene_pass = p_pass; + } + _FORCE_INLINE_ uint64_t get_scene_pass() { + return scene_pass; + } virtual void screen_space_roughness_limiter_set_active(bool p_enable, float p_curve); virtual bool screen_space_roughness_limiter_is_active() const; @@ -1118,6 +1215,23 @@ public: RS::SubSurfaceScatteringQuality sub_surface_scattering_get_quality() const; virtual void sub_surface_scattering_set_scale(float p_scale, float p_depth_scale); + virtual void shadows_quality_set(RS::ShadowQuality p_quality); + virtual void directional_shadow_quality_set(RS::ShadowQuality p_quality); + _FORCE_INLINE_ RS::ShadowQuality shadows_quality_get() const { return shadows_quality; } + _FORCE_INLINE_ RS::ShadowQuality directional_shadow_quality_get() const { return directional_shadow_quality; } + _FORCE_INLINE_ float shadows_quality_radius_get() const { return shadows_quality_radius; } + _FORCE_INLINE_ float directional_shadow_quality_radius_get() const { return directional_shadow_quality_radius; } + + _FORCE_INLINE_ float *directional_penumbra_shadow_kernel_get() { return directional_penumbra_shadow_kernel; } + _FORCE_INLINE_ float *directional_soft_shadow_kernel_get() { return directional_soft_shadow_kernel; } + _FORCE_INLINE_ float *penumbra_shadow_kernel_get() { return penumbra_shadow_kernel; } + _FORCE_INLINE_ float *soft_shadow_kernel_get() { return soft_shadow_kernel; } + + _FORCE_INLINE_ int directional_penumbra_shadow_samples_get() const { return directional_penumbra_shadow_samples; } + _FORCE_INLINE_ int directional_soft_shadow_samples_get() const { return directional_soft_shadow_samples; } + _FORCE_INLINE_ int penumbra_shadow_samples_get() const { return penumbra_shadow_samples; } + _FORCE_INLINE_ int soft_shadow_samples_get() const { return soft_shadow_samples; } + int get_roughness_layers() const; bool is_using_radiance_cubemap_array() const; @@ -1126,7 +1240,9 @@ public: virtual void update(); virtual void set_debug_draw_mode(RS::ViewportDebugDraw p_debug_draw); - _FORCE_INLINE_ RS::ViewportDebugDraw get_debug_draw_mode() const { return debug_draw; } + _FORCE_INLINE_ RS::ViewportDebugDraw get_debug_draw_mode() const { + return debug_draw; + } virtual void set_time(double p_time, double p_step); diff --git a/servers/rendering/rasterizer_rd/rasterizer_storage_rd.cpp b/servers/rendering/rasterizer_rd/rasterizer_storage_rd.cpp index 322e89ef9a..c2bd41a746 100644 --- a/servers/rendering/rasterizer_rd/rasterizer_storage_rd.cpp +++ b/servers/rendering/rasterizer_rd/rasterizer_storage_rd.cpp @@ -31,6 +31,7 @@ #include "rasterizer_storage_rd.h" #include "core/engine.h" +#include "core/io/resource_loader.h" #include "core/project_settings.h" #include "servers/rendering/shader_language.h" @@ -130,7 +131,6 @@ Ref<Image> RasterizerStorageRD::_validate_texture_format(const Ref<Image> &p_ima image->convert(Image::FORMAT_RGBAF); } - r_format.format = RD::DATA_FORMAT_R32G32B32A32_SFLOAT; r_format.swizzle_r = RD::TEXTURE_SWIZZLE_R; r_format.swizzle_g = RD::TEXTURE_SWIZZLE_G; r_format.swizzle_b = RD::TEXTURE_SWIZZLE_B; @@ -170,7 +170,6 @@ Ref<Image> RasterizerStorageRD::_validate_texture_format(const Ref<Image> &p_ima image->convert(Image::FORMAT_RGBAH); } - r_format.format = RD::DATA_FORMAT_R16G16B16A16_SFLOAT; r_format.swizzle_r = RD::TEXTURE_SWIZZLE_R; r_format.swizzle_g = RD::TEXTURE_SWIZZLE_G; r_format.swizzle_b = RD::TEXTURE_SWIZZLE_B; @@ -809,6 +808,12 @@ void RasterizerStorageRD::texture_replace(RID p_texture, RID p_by_texture) { } //delete last, so proxies can be updated texture_owner.free(p_by_texture); + + if (decal_atlas.textures.has(p_texture)) { + //belongs to decal atlas.. + + decal_atlas.dirty = true; //mark it dirty since it was most likely modified + } } void RasterizerStorageRD::texture_set_size_override(RID p_texture, int p_width, int p_height) { Texture *tex = texture_owner.getornull(p_texture); @@ -915,6 +920,7 @@ void RasterizerStorageRD::shader_set_code(RID p_shader, const String &p_code) { Material *material = E->get(); if (shader->data) { material->data = material_data_request_func[new_type](shader->data); + material->data->self = material->self; material->data->set_next_pass(material->next_pass); material->data->set_render_priority(material->priority); } @@ -1015,8 +1021,8 @@ void RasterizerStorageRD::_material_queue_update(Material *material, bool p_unif material->update_next = material_update_list; material_update_list = material; material->update_requested = true; - material->uniform_dirty = p_uniform; - material->texture_dirty = p_texture; + material->uniform_dirty = material->uniform_dirty || p_uniform; + material->texture_dirty = material->texture_dirty || p_texture; } void RasterizerStorageRD::material_set_shader(RID p_material, RID p_shader) { @@ -1053,6 +1059,7 @@ void RasterizerStorageRD::material_set_shader(RID p_material, RID p_shader) { ERR_FAIL_COND(shader->data == nullptr); material->data = material_data_request_func[shader->type](shader->data); + material->data->self = p_material; material->data->set_next_pass(material->next_pass); material->data->set_render_priority(material->priority); //updating happens later @@ -1138,6 +1145,19 @@ bool RasterizerStorageRD::material_casts_shadows(RID p_material) { return true; //by default everything casts shadows } +void RasterizerStorageRD::material_get_instance_shader_parameters(RID p_material, List<InstanceShaderParam> *r_parameters) { + + Material *material = material_owner.getornull(p_material); + ERR_FAIL_COND(!material); + if (material->shader && material->shader->data) { + material->shader->data->get_instance_param_list(r_parameters); + + if (material->next_pass.is_valid()) { + material_get_instance_shader_parameters(material->next_pass, r_parameters); + } + } +} + void RasterizerStorageRD::material_update_dependency(RID p_material, RasterizerScene::InstanceBase *p_instance) { Material *material = material_owner.getornull(p_material); ERR_FAIL_COND(!material); @@ -1625,11 +1645,36 @@ _FORCE_INLINE_ static void _fill_std140_ubo_empty(ShaderLanguage::DataType type, void RasterizerStorageRD::MaterialData::update_uniform_buffer(const Map<StringName, ShaderLanguage::ShaderNode::Uniform> &p_uniforms, const uint32_t *p_uniform_offsets, const Map<StringName, Variant> &p_parameters, uint8_t *p_buffer, uint32_t p_buffer_size, bool p_use_linear_color) { + bool uses_global_buffer = false; + for (Map<StringName, ShaderLanguage::ShaderNode::Uniform>::Element *E = p_uniforms.front(); E; E = E->next()) { if (E->get().order < 0) continue; // texture, does not go here + if (E->get().scope == ShaderLanguage::ShaderNode::Uniform::SCOPE_INSTANCE) { + continue; //instance uniforms don't appear in the bufferr + } + + if (E->get().scope == ShaderLanguage::ShaderNode::Uniform::SCOPE_GLOBAL) { + //this is a global variable, get the index to it + RasterizerStorageRD *rs = base_singleton; + + GlobalVariables::Variable *gv = rs->global_variables.variables.getptr(E->key()); + uint32_t index = 0; + if (gv) { + index = gv->buffer_index; + } else { + WARN_PRINT("Shader uses global uniform '" + E->key() + "', but it was removed at some point. Material will not display correctly."); + } + + uint32_t offset = p_uniform_offsets[E->get().order]; + uint32_t *intptr = (uint32_t *)&p_buffer[offset]; + *intptr = index; + uses_global_buffer = true; + continue; + } + //regular uniform uint32_t offset = p_uniform_offsets[E->get().order]; #ifdef DEBUG_ENABLED @@ -1658,6 +1703,38 @@ void RasterizerStorageRD::MaterialData::update_uniform_buffer(const Map<StringNa } } } + + if (uses_global_buffer != (global_buffer_E != nullptr)) { + RasterizerStorageRD *rs = base_singleton; + if (uses_global_buffer) { + global_buffer_E = rs->global_variables.materials_using_buffer.push_back(self); + } else { + rs->global_variables.materials_using_buffer.erase(global_buffer_E); + global_buffer_E = nullptr; + } + } +} + +RasterizerStorageRD::MaterialData::~MaterialData() { + if (global_buffer_E) { + //unregister global buffers + RasterizerStorageRD *rs = base_singleton; + rs->global_variables.materials_using_buffer.erase(global_buffer_E); + } + + if (global_texture_E) { + //unregister global textures + RasterizerStorageRD *rs = base_singleton; + + for (Map<StringName, uint64_t>::Element *E = used_global_textures.front(); E; E = E->next()) { + GlobalVariables::Variable *v = rs->global_variables.variables.getptr(E->key()); + if (v) { + v->texture_materials.erase(self); + } + } + //unregister material from those using global textures + rs->global_variables.materials_using_texture.erase(global_texture_E); + } } void RasterizerStorageRD::MaterialData::update_textures(const Map<StringName, Variant> &p_parameters, const Map<StringName, RID> &p_default_textures, const Vector<ShaderCompilerRD::GeneratedCode::Texture> &p_texture_uniforms, RID *p_textures, bool p_use_linear_color) { @@ -1669,22 +1746,57 @@ void RasterizerStorageRD::MaterialData::update_textures(const Map<StringName, Va Texture *normal_detect_texture = nullptr; #endif + bool uses_global_textures = false; + global_textures_pass++; + for (int i = 0; i < p_texture_uniforms.size(); i++) { const StringName &uniform_name = p_texture_uniforms[i].name; RID texture; - const Map<StringName, Variant>::Element *V = p_parameters.find(uniform_name); - if (V) { - texture = V->get(); - } + if (p_texture_uniforms[i].global) { + + RasterizerStorageRD *rs = base_singleton; + + uses_global_textures = true; + + GlobalVariables::Variable *v = rs->global_variables.variables.getptr(uniform_name); + if (v) { + if (v->buffer_index >= 0) { + WARN_PRINT("Shader uses global uniform texture '" + String(uniform_name) + "', but it changed type and is no longer a texture!."); + + } else { + + Map<StringName, uint64_t>::Element *E = used_global_textures.find(uniform_name); + if (!E) { + E = used_global_textures.insert(uniform_name, global_textures_pass); + v->texture_materials.insert(self); + } else { + E->get() = global_textures_pass; + } + + texture = v->override.get_type() != Variant::NIL ? v->override : v->value; + } + + } else { + WARN_PRINT("Shader uses global uniform texture '" + String(uniform_name) + "', but it was removed at some point. Material will not display correctly."); + } + } else { + if (!texture.is_valid()) { - if (!texture.is_valid()) { - const Map<StringName, RID>::Element *W = p_default_textures.find(uniform_name); - if (W) { + const Map<StringName, Variant>::Element *V = p_parameters.find(uniform_name); + if (V) { + texture = V->get(); + } + } - texture = W->get(); + if (!texture.is_valid()) { + const Map<StringName, RID>::Element *W = p_default_textures.find(uniform_name); + if (W) { + + texture = W->get(); + } } } @@ -1747,6 +1859,36 @@ void RasterizerStorageRD::MaterialData::update_textures(const Map<StringName, Va roughness_detect_texture->detect_roughness_callback(roughness_detect_texture->detect_roughness_callback_ud, normal_detect_texture->path, roughness_channel); } #endif + { + //for textures no longer used, unregister them + List<Map<StringName, uint64_t>::Element *> to_delete; + RasterizerStorageRD *rs = base_singleton; + + for (Map<StringName, uint64_t>::Element *E = used_global_textures.front(); E; E = E->next()) { + if (E->get() != global_textures_pass) { + to_delete.push_back(E); + + GlobalVariables::Variable *v = rs->global_variables.variables.getptr(E->key()); + if (v) { + v->texture_materials.erase(self); + } + } + } + + while (to_delete.front()) { + used_global_textures.erase(to_delete.front()->get()); + to_delete.pop_front(); + } + //handle registering/unregistering global textures + if (uses_global_textures != (global_texture_E != nullptr)) { + if (uses_global_textures) { + global_texture_E = rs->global_variables.materials_using_texture.push_back(self); + } else { + rs->global_variables.materials_using_texture.erase(global_texture_E); + global_texture_E = nullptr; + } + } + } } void RasterizerStorageRD::material_force_update_textures(RID p_material, ShaderType p_shader_type) { @@ -2197,14 +2339,14 @@ void RasterizerStorageRD::_mesh_surface_generate_version_for_input_mask(Mesh::Su Mesh::Surface::Version &v = s->versions[version]; - Vector<RD::VertexDescription> attributes; + Vector<RD::VertexAttribute> attributes; Vector<RID> buffers; uint32_t stride = 0; for (int i = 0; i < RS::ARRAY_WEIGHTS; i++) { - RD::VertexDescription vd; + RD::VertexAttribute vd; RID buffer; vd.location = i; @@ -3104,15 +3246,17 @@ RID RasterizerStorageRD::light_create(RS::LightType p_type) { light.param[RS::LIGHT_PARAM_INDIRECT_ENERGY] = 1.0; light.param[RS::LIGHT_PARAM_SPECULAR] = 0.5; light.param[RS::LIGHT_PARAM_RANGE] = 1.0; + light.param[RS::LIGHT_PARAM_SIZE] = 0.0; light.param[RS::LIGHT_PARAM_SPOT_ANGLE] = 45; - light.param[RS::LIGHT_PARAM_CONTACT_SHADOW_SIZE] = 45; light.param[RS::LIGHT_PARAM_SHADOW_MAX_DISTANCE] = 0; light.param[RS::LIGHT_PARAM_SHADOW_SPLIT_1_OFFSET] = 0.1; light.param[RS::LIGHT_PARAM_SHADOW_SPLIT_2_OFFSET] = 0.3; light.param[RS::LIGHT_PARAM_SHADOW_SPLIT_3_OFFSET] = 0.6; light.param[RS::LIGHT_PARAM_SHADOW_FADE_START] = 0.8; - light.param[RS::LIGHT_PARAM_SHADOW_NORMAL_BIAS] = 0.1; - light.param[RS::LIGHT_PARAM_SHADOW_BIAS_SPLIT_SCALE] = 0.1; + light.param[RS::LIGHT_PARAM_SHADOW_BIAS] = 0.02; + light.param[RS::LIGHT_PARAM_SHADOW_NORMAL_BIAS] = 1.0; + light.param[RS::LIGHT_PARAM_SHADOW_PANCAKE_SIZE] = 20.0; + light.param[RS::LIGHT_PARAM_TRANSMITTANCE_BIAS] = 0.05; return light_owner.make_rid(light); } @@ -3138,6 +3282,7 @@ void RasterizerStorageRD::light_set_param(RID p_light, RS::LightParam p_param, f case RS::LIGHT_PARAM_SHADOW_SPLIT_2_OFFSET: case RS::LIGHT_PARAM_SHADOW_SPLIT_3_OFFSET: case RS::LIGHT_PARAM_SHADOW_NORMAL_BIAS: + case RS::LIGHT_PARAM_SHADOW_PANCAKE_SIZE: case RS::LIGHT_PARAM_SHADOW_BIAS: { light->version++; @@ -3171,7 +3316,19 @@ void RasterizerStorageRD::light_set_projector(RID p_light, RID p_texture) { Light *light = light_owner.getornull(p_light); ERR_FAIL_COND(!light); + if (light->projector == p_texture) { + return; + } + + if (light->type != RS::LIGHT_DIRECTIONAL && light->projector.is_valid()) { + texture_remove_from_decal_atlas(light->projector, light->type == RS::LIGHT_OMNI); + } + light->projector = p_texture; + + if (light->type != RS::LIGHT_DIRECTIONAL && light->projector.is_valid()) { + texture_add_to_decal_atlas(light->projector, light->type == RS::LIGHT_OMNI); + } } void RasterizerStorageRD::light_set_negative(RID p_light, bool p_enable) { @@ -3550,6 +3707,94 @@ float RasterizerStorageRD::reflection_probe_get_interior_ambient_probe_contribut return reflection_probe->interior_ambient_probe_contrib; } +RID RasterizerStorageRD::decal_create() { + return decal_owner.make_rid(Decal()); +} + +void RasterizerStorageRD::decal_set_extents(RID p_decal, const Vector3 &p_extents) { + Decal *decal = decal_owner.getornull(p_decal); + ERR_FAIL_COND(!decal); + decal->extents = p_extents; + decal->instance_dependency.instance_notify_changed(true, false); +} +void RasterizerStorageRD::decal_set_texture(RID p_decal, RS::DecalTexture p_type, RID p_texture) { + Decal *decal = decal_owner.getornull(p_decal); + ERR_FAIL_COND(!decal); + ERR_FAIL_INDEX(p_type, RS::DECAL_TEXTURE_MAX); + + if (decal->textures[p_type] == p_texture) { + return; + } + + ERR_FAIL_COND(p_texture.is_valid() && !texture_owner.owns(p_texture)); + + if (decal->textures[p_type].is_valid() && texture_owner.owns(decal->textures[p_type])) { + texture_remove_from_decal_atlas(decal->textures[p_type]); + } + + decal->textures[p_type] = p_texture; + + if (decal->textures[p_type].is_valid()) { + texture_add_to_decal_atlas(decal->textures[p_type]); + } + + decal->instance_dependency.instance_notify_changed(false, true); +} +void RasterizerStorageRD::decal_set_emission_energy(RID p_decal, float p_energy) { + Decal *decal = decal_owner.getornull(p_decal); + ERR_FAIL_COND(!decal); + decal->emission_energy = p_energy; +} + +void RasterizerStorageRD::decal_set_albedo_mix(RID p_decal, float p_mix) { + Decal *decal = decal_owner.getornull(p_decal); + ERR_FAIL_COND(!decal); + decal->albedo_mix = p_mix; +} + +void RasterizerStorageRD::decal_set_modulate(RID p_decal, const Color &p_modulate) { + Decal *decal = decal_owner.getornull(p_decal); + ERR_FAIL_COND(!decal); + decal->modulate = p_modulate; +} +void RasterizerStorageRD::decal_set_cull_mask(RID p_decal, uint32_t p_layers) { + Decal *decal = decal_owner.getornull(p_decal); + ERR_FAIL_COND(!decal); + decal->cull_mask = p_layers; + decal->instance_dependency.instance_notify_changed(true, false); +} + +void RasterizerStorageRD::decal_set_distance_fade(RID p_decal, bool p_enabled, float p_begin, float p_length) { + + Decal *decal = decal_owner.getornull(p_decal); + ERR_FAIL_COND(!decal); + decal->distance_fade = p_enabled; + decal->distance_fade_begin = p_begin; + decal->distance_fade_length = p_length; +} + +void RasterizerStorageRD::decal_set_fade(RID p_decal, float p_above, float p_below) { + + Decal *decal = decal_owner.getornull(p_decal); + ERR_FAIL_COND(!decal); + decal->upper_fade = p_above; + decal->lower_fade = p_below; +} + +void RasterizerStorageRD::decal_set_normal_fade(RID p_decal, float p_fade) { + + Decal *decal = decal_owner.getornull(p_decal); + ERR_FAIL_COND(!decal); + decal->normal_fade = p_fade; +} + +AABB RasterizerStorageRD::decal_get_aabb(RID p_decal) const { + Decal *decal = decal_owner.getornull(p_decal); + ERR_FAIL_COND_V(!decal, AABB()); + + return AABB(-decal->extents, decal->extents * 2.0); +} + RID RasterizerStorageRD::gi_probe_create() { return gi_probe_owner.make_rid(GIProbe()); @@ -3911,7 +4156,6 @@ void RasterizerStorageRD::_clear_render_target(RenderTarget *rt) { if (rt->backbuffer.is_valid()) { RD::get_singleton()->free(rt->backbuffer); rt->backbuffer = RID(); - rt->backbuffer_fb = RID(); for (int i = 0; i < rt->backbuffer_mipmaps.size(); i++) { //just erase copies, since the rest are erased by dependency RD::get_singleton()->free(rt->backbuffer_mipmaps[i].mipmap_copy); @@ -4025,17 +4269,11 @@ void RasterizerStorageRD::_create_render_target_backbuffer(RenderTarget *rt) { tf.width = rt->size.width; tf.height = rt->size.height; tf.type = RD::TEXTURE_TYPE_2D; - tf.usage_bits = RD::TEXTURE_USAGE_COLOR_ATTACHMENT_BIT | RD::TEXTURE_USAGE_SAMPLING_BIT | RD::TEXTURE_USAGE_CAN_COPY_TO_BIT; + tf.usage_bits = RD::TEXTURE_USAGE_STORAGE_BIT | RD::TEXTURE_USAGE_SAMPLING_BIT | RD::TEXTURE_USAGE_CAN_COPY_TO_BIT; tf.mipmaps = mipmaps_required; rt->backbuffer = RD::get_singleton()->texture_create(tf, RD::TextureView()); - - { - Vector<RID> backbuffer_att; - RID backbuffer_fb_tex = RD::get_singleton()->texture_create_shared_from_slice(RD::TextureView(), rt->backbuffer, 0, 0); - backbuffer_att.push_back(backbuffer_fb_tex); - rt->backbuffer_fb = RD::get_singleton()->framebuffer_create(backbuffer_att); - } + rt->backbuffer_mipmap0 = RD::get_singleton()->texture_create_shared_from_slice(RD::TextureView(), rt->backbuffer, 0, 0); //create mipmaps for (uint32_t i = 1; i < mipmaps_required; i++) { @@ -4043,9 +4281,6 @@ void RasterizerStorageRD::_create_render_target_backbuffer(RenderTarget *rt) { RenderTarget::BackbufferMipmap mm; { mm.mipmap = RD::get_singleton()->texture_create_shared_from_slice(RD::TextureView(), rt->backbuffer, 0, i); - Vector<RID> mm_fb_at; - mm_fb_at.push_back(mm.mipmap); - mm.mipmap_fb = RD::get_singleton()->framebuffer_create(mm_fb_at); } { @@ -4057,9 +4292,6 @@ void RasterizerStorageRD::_create_render_target_backbuffer(RenderTarget *rt) { mmtf.mipmaps = 1; mm.mipmap_copy = RD::get_singleton()->texture_create(mmtf, RD::TextureView()); - Vector<RID> mm_fb_at; - mm_fb_at.push_back(mm.mipmap_copy); - mm.mipmap_copy_fb = RD::get_singleton()->framebuffer_create(mm_fb_at); } rt->backbuffer_mipmaps.push_back(mm); @@ -4135,7 +4367,12 @@ RID RasterizerStorageRD::render_target_get_rd_framebuffer(RID p_render_target) { return rt->framebuffer; } +RID RasterizerStorageRD::render_target_get_rd_texture(RID p_render_target) { + RenderTarget *rt = render_target_owner.getornull(p_render_target); + ERR_FAIL_COND_V(!rt, RID()); + return rt->color; +} void RasterizerStorageRD::render_target_request_clear(RID p_render_target, const Color &p_clear_color) { RenderTarget *rt = render_target_owner.getornull(p_render_target); ERR_FAIL_COND(!rt); @@ -4185,27 +4422,25 @@ void RasterizerStorageRD::render_target_copy_to_back_buffer(RID p_render_target, } Rect2i region = p_region; - Rect2 blur_region; if (region == Rect2i()) { region.size = rt->size; - } else { - blur_region = region; - blur_region.position /= rt->size; - blur_region.size /= rt->size; } //single texture copy for backbuffer - RD::get_singleton()->texture_copy(rt->color, rt->backbuffer, Vector3(region.position.x, region.position.y, 0), Vector3(region.position.x, region.position.y, 0), Vector3(region.size.x, region.size.y, 1), 0, 0, 0, 0, true); + RD::get_singleton()->texture_copy(rt->color, rt->backbuffer_mipmap0, Vector3(region.position.x, region.position.y, 0), Vector3(region.position.x, region.position.y, 0), Vector3(region.size.x, region.size.y, 1), 0, 0, 0, 0, true); //effects.copy(rt->color, rt->backbuffer_fb, blur_region); //then mipmap blur RID prev_texture = rt->color; //use color, not backbuffer, as bb has mipmaps. - Vector2 pixel_size = Vector2(1.0 / rt->size.width, 1.0 / rt->size.height); for (int i = 0; i < rt->backbuffer_mipmaps.size(); i++) { - pixel_size *= 2.0; //go halfway + region.position.x >>= 1; + region.position.y >>= 1; + region.size.x = MAX(1, region.size.x >> 1); + region.size.y = MAX(1, region.size.y >> 1); + const RenderTarget::BackbufferMipmap &mm = rt->backbuffer_mipmaps[i]; - effects.gaussian_blur(prev_texture, mm.mipmap_copy_fb, mm.mipmap_copy, mm.mipmap_fb, pixel_size, blur_region); + effects.gaussian_blur(prev_texture, mm.mipmap, mm.mipmap_copy, region, true); prev_texture = mm.mipmap; } } @@ -4250,6 +4485,9 @@ void RasterizerStorageRD::base_update_dependency(RID p_base, RasterizerScene::In } else if (reflection_probe_owner.owns(p_base)) { ReflectionProbe *rp = reflection_probe_owner.getornull(p_base); p_instance->update_dependency(&rp->instance_dependency); + } else if (decal_owner.owns(p_base)) { + Decal *decal = decal_owner.getornull(p_base); + p_instance->update_dependency(&decal->instance_dependency); } else if (gi_probe_owner.owns(p_base)) { GIProbe *gip = gi_probe_owner.getornull(p_base); p_instance->update_dependency(&gip->instance_dependency); @@ -4278,6 +4516,9 @@ RS::InstanceType RasterizerStorageRD::get_base_type(RID p_rid) const { if (reflection_probe_owner.owns(p_rid)) { return RS::INSTANCE_REFLECTION_PROBE; } + if (decal_owner.owns(p_rid)) { + return RS::INSTANCE_DECAL; + } if (gi_probe_owner.owns(p_rid)) { return RS::INSTANCE_GI_PROBE; } @@ -4287,10 +4528,924 @@ RS::InstanceType RasterizerStorageRD::get_base_type(RID p_rid) const { return RS::INSTANCE_NONE; } + +void RasterizerStorageRD::texture_add_to_decal_atlas(RID p_texture, bool p_panorama_to_dp) { + if (!decal_atlas.textures.has(p_texture)) { + DecalAtlas::Texture t; + t.users = 1; + t.panorama_to_dp_users = p_panorama_to_dp ? 1 : 0; + decal_atlas.textures[p_texture] = t; + decal_atlas.dirty = true; + } else { + DecalAtlas::Texture *t = decal_atlas.textures.getptr(p_texture); + t->users++; + if (p_panorama_to_dp) { + t->panorama_to_dp_users++; + } + } +} + +void RasterizerStorageRD::texture_remove_from_decal_atlas(RID p_texture, bool p_panorama_to_dp) { + DecalAtlas::Texture *t = decal_atlas.textures.getptr(p_texture); + ERR_FAIL_COND(!t); + t->users--; + if (p_panorama_to_dp) { + ERR_FAIL_COND(t->panorama_to_dp_users == 0); + t->panorama_to_dp_users--; + } + if (t->users == 0) { + decal_atlas.textures.erase(p_texture); + //do not mark it dirty, there is no need to since it remains working + } +} + +RID RasterizerStorageRD::decal_atlas_get_texture() const { + return decal_atlas.texture; +} + +RID RasterizerStorageRD::decal_atlas_get_texture_srgb() const { + return decal_atlas.texture; +} + +void RasterizerStorageRD::_update_decal_atlas() { + if (!decal_atlas.dirty) { + return; //nothing to do + } + + decal_atlas.dirty = false; + + if (decal_atlas.texture.is_valid()) { + RD::get_singleton()->free(decal_atlas.texture); + decal_atlas.texture = RID(); + decal_atlas.texture_srgb = RID(); + decal_atlas.texture_mipmaps.clear(); + } + + int border = 1 << decal_atlas.mipmaps; + + if (decal_atlas.textures.size()) { + //generate atlas + Vector<DecalAtlas::SortItem> itemsv; + itemsv.resize(decal_atlas.textures.size()); + int base_size = 8; + const RID *K = NULL; + + int idx = 0; + while ((K = decal_atlas.textures.next(K))) { + DecalAtlas::SortItem &si = itemsv.write[idx]; + + Texture *src_tex = texture_owner.getornull(*K); + + si.size.width = (src_tex->width / border) + 1; + si.size.height = (src_tex->height / border) + 1; + si.pixel_size = Size2i(src_tex->width, src_tex->height); + + if (base_size < si.size.width) { + base_size = nearest_power_of_2_templated(si.size.width); + } + + si.texture = *K; + idx++; + } + + //sort items by size + itemsv.sort(); + + //attempt to create atlas + int item_count = itemsv.size(); + DecalAtlas::SortItem *items = itemsv.ptrw(); + + int atlas_height = 0; + + while (true) { + + Vector<int> v_offsetsv; + v_offsetsv.resize(base_size); + + int *v_offsets = v_offsetsv.ptrw(); + zeromem(v_offsets, sizeof(int) * base_size); + + int max_height = 0; + + for (int i = 0; i < item_count; i++) { + //best fit + DecalAtlas::SortItem &si = items[i]; + int best_idx = -1; + int best_height = 0x7FFFFFFF; + for (int j = 0; j <= base_size - si.size.width; j++) { + int height = 0; + for (int k = 0; k < si.size.width; k++) { + int h = v_offsets[k + j]; + if (h > height) { + height = h; + if (height > best_height) { + break; //already bad + } + } + } + + if (height < best_height) { + best_height = height; + best_idx = j; + } + } + + //update + for (int k = 0; k < si.size.width; k++) { + v_offsets[k + best_idx] = best_height + si.size.height; + } + + si.pos.x = best_idx; + si.pos.y = best_height; + + if (si.pos.y + si.size.height > max_height) { + max_height = si.pos.y + si.size.height; + } + } + + if (max_height <= base_size * 2) { + atlas_height = max_height; + break; //good ratio, break; + } + + base_size *= 2; + } + + decal_atlas.size.width = base_size * border; + decal_atlas.size.height = nearest_power_of_2_templated(atlas_height * border); + + for (int i = 0; i < item_count; i++) { + DecalAtlas::Texture *t = decal_atlas.textures.getptr(items[i].texture); + t->uv_rect.position = items[i].pos * border + Vector2i(border / 2, border / 2); + t->uv_rect.size = items[i].pixel_size; + //print_line("blitrect: " + t->uv_rect); + t->uv_rect.position /= Size2(decal_atlas.size); + t->uv_rect.size /= Size2(decal_atlas.size); + } + } else { + + //use border as size, so it at least has enough mipmaps + decal_atlas.size.width = border; + decal_atlas.size.height = border; + } + + //blit textures + + RD::TextureFormat tformat; + tformat.format = RD::DATA_FORMAT_R8G8B8A8_UNORM; + tformat.width = decal_atlas.size.width; + tformat.height = decal_atlas.size.height; + tformat.usage_bits = RD::TEXTURE_USAGE_SAMPLING_BIT | RD::TEXTURE_USAGE_COLOR_ATTACHMENT_BIT | RD::TEXTURE_USAGE_CAN_COPY_TO_BIT; + tformat.type = RD::TEXTURE_TYPE_2D; + tformat.mipmaps = decal_atlas.mipmaps; + tformat.shareable_formats.push_back(RD::DATA_FORMAT_R8G8B8A8_UNORM); + tformat.shareable_formats.push_back(RD::DATA_FORMAT_R8G8B8A8_SRGB); + + decal_atlas.texture = RD::get_singleton()->texture_create(tformat, RD::TextureView()); + + { + //create the framebuffer + + Size2i s = decal_atlas.size; + + for (int i = 0; i < decal_atlas.mipmaps; i++) { + DecalAtlas::MipMap mm; + mm.texture = RD::get_singleton()->texture_create_shared_from_slice(RD::TextureView(), decal_atlas.texture, 0, i); + Vector<RID> fb; + fb.push_back(mm.texture); + mm.fb = RD::get_singleton()->framebuffer_create(fb); + mm.size = s; + decal_atlas.texture_mipmaps.push_back(mm); + + s.width = MAX(1, s.width >> 1); + s.height = MAX(1, s.height >> 1); + } + { + //create the SRGB variant + RD::TextureView rd_view; + rd_view.format_override = RD::DATA_FORMAT_R8G8B8A8_SRGB; + decal_atlas.texture_srgb = RD::get_singleton()->texture_create_shared(rd_view, decal_atlas.texture); + } + } + + RID prev_texture; + for (int i = 0; i < decal_atlas.texture_mipmaps.size(); i++) { + const DecalAtlas::MipMap &mm = decal_atlas.texture_mipmaps[i]; + + Color clear_color(0, 0, 0, 0); + + if (decal_atlas.textures.size()) { + + if (i == 0) { + Vector<Color> cc; + cc.push_back(clear_color); + + RD::DrawListID draw_list = RD::get_singleton()->draw_list_begin(mm.fb, RD::INITIAL_ACTION_CLEAR, RD::FINAL_ACTION_READ, RD::INITIAL_ACTION_DROP, RD::FINAL_ACTION_DISCARD, cc); + + const RID *K = NULL; + while ((K = decal_atlas.textures.next(K))) { + DecalAtlas::Texture *t = decal_atlas.textures.getptr(*K); + Texture *src_tex = texture_owner.getornull(*K); + effects.copy_to_atlas_fb(src_tex->rd_texture, mm.fb, t->uv_rect, draw_list, false, t->panorama_to_dp_users > 0); + } + + RD::get_singleton()->draw_list_end(); + + prev_texture = mm.texture; + } else { + + effects.copy_to_fb_rect(prev_texture, mm.fb, Rect2i(Point2i(), mm.size)); + prev_texture = mm.texture; + } + } else { + RD::get_singleton()->texture_clear(mm.texture, clear_color, 0, 1, 0, 1, false); + } + } +} + +int32_t RasterizerStorageRD::_global_variable_allocate(uint32_t p_elements) { + + int32_t idx = 0; + while (idx + p_elements <= global_variables.buffer_size) { + if (global_variables.buffer_usage[idx].elements == 0) { + bool valid = true; + for (uint32_t i = 1; i < p_elements; i++) { + if (global_variables.buffer_usage[idx + i].elements > 0) { + valid = false; + idx += i + global_variables.buffer_usage[idx + i].elements; + break; + } + } + + if (!valid) { + continue; //if not valid, idx is in new position + } + + return idx; + } else { + idx += global_variables.buffer_usage[idx].elements; + } + } + + return -1; +} + +void RasterizerStorageRD::_global_variable_store_in_buffer(int32_t p_index, RS::GlobalVariableType p_type, const Variant &p_value) { + + switch (p_type) { + case RS::GLOBAL_VAR_TYPE_BOOL: { + + GlobalVariables::Value &bv = global_variables.buffer_values[p_index]; + bool b = p_value; + bv.x = b ? 1.0 : 0.0; + bv.y = 0.0; + bv.z = 0.0; + bv.w = 0.0; + + } break; + case RS::GLOBAL_VAR_TYPE_BVEC2: { + GlobalVariables::Value &bv = global_variables.buffer_values[p_index]; + uint32_t bvec = p_value; + bv.x = (bvec & 1) ? 1.0 : 0.0; + bv.y = (bvec & 2) ? 1.0 : 0.0; + bv.z = 0.0; + bv.w = 0.0; + } break; + case RS::GLOBAL_VAR_TYPE_BVEC3: { + GlobalVariables::Value &bv = global_variables.buffer_values[p_index]; + uint32_t bvec = p_value; + bv.x = (bvec & 1) ? 1.0 : 0.0; + bv.y = (bvec & 2) ? 1.0 : 0.0; + bv.z = (bvec & 4) ? 1.0 : 0.0; + bv.w = 0.0; + } break; + case RS::GLOBAL_VAR_TYPE_BVEC4: { + GlobalVariables::Value &bv = global_variables.buffer_values[p_index]; + uint32_t bvec = p_value; + bv.x = (bvec & 1) ? 1.0 : 0.0; + bv.y = (bvec & 2) ? 1.0 : 0.0; + bv.z = (bvec & 4) ? 1.0 : 0.0; + bv.w = (bvec & 8) ? 1.0 : 0.0; + } break; + case RS::GLOBAL_VAR_TYPE_INT: { + GlobalVariables::ValueInt &bv = *(GlobalVariables::ValueInt *)&global_variables.buffer_values[p_index]; + int32_t v = p_value; + bv.x = v; + bv.y = 0; + bv.z = 0; + bv.w = 0; + } break; + case RS::GLOBAL_VAR_TYPE_IVEC2: { + GlobalVariables::ValueInt &bv = *(GlobalVariables::ValueInt *)&global_variables.buffer_values[p_index]; + Vector2i v = p_value; + bv.x = v.x; + bv.y = v.y; + bv.z = 0; + bv.w = 0; + } break; + case RS::GLOBAL_VAR_TYPE_IVEC3: { + GlobalVariables::ValueInt &bv = *(GlobalVariables::ValueInt *)&global_variables.buffer_values[p_index]; + Vector3i v = p_value; + bv.x = v.x; + bv.y = v.y; + bv.z = v.z; + bv.w = 0; + } break; + case RS::GLOBAL_VAR_TYPE_IVEC4: { + GlobalVariables::ValueInt &bv = *(GlobalVariables::ValueInt *)&global_variables.buffer_values[p_index]; + Vector<int32_t> v = p_value; + bv.x = v.size() >= 1 ? v[0] : 0; + bv.y = v.size() >= 2 ? v[1] : 0; + bv.z = v.size() >= 3 ? v[2] : 0; + bv.w = v.size() >= 4 ? v[3] : 0; + } break; + case RS::GLOBAL_VAR_TYPE_RECT2I: { + GlobalVariables::ValueInt &bv = *(GlobalVariables::ValueInt *)&global_variables.buffer_values[p_index]; + Rect2i v = p_value; + bv.x = v.position.x; + bv.y = v.position.y; + bv.z = v.size.x; + bv.w = v.size.y; + } break; + case RS::GLOBAL_VAR_TYPE_UINT: { + GlobalVariables::ValueUInt &bv = *(GlobalVariables::ValueUInt *)&global_variables.buffer_values[p_index]; + uint32_t v = p_value; + bv.x = v; + bv.y = 0; + bv.z = 0; + bv.w = 0; + } break; + case RS::GLOBAL_VAR_TYPE_UVEC2: { + GlobalVariables::ValueUInt &bv = *(GlobalVariables::ValueUInt *)&global_variables.buffer_values[p_index]; + Vector2i v = p_value; + bv.x = v.x; + bv.y = v.y; + bv.z = 0; + bv.w = 0; + } break; + case RS::GLOBAL_VAR_TYPE_UVEC3: { + GlobalVariables::ValueUInt &bv = *(GlobalVariables::ValueUInt *)&global_variables.buffer_values[p_index]; + Vector3i v = p_value; + bv.x = v.x; + bv.y = v.y; + bv.z = v.z; + bv.w = 0; + } break; + case RS::GLOBAL_VAR_TYPE_UVEC4: { + GlobalVariables::ValueUInt &bv = *(GlobalVariables::ValueUInt *)&global_variables.buffer_values[p_index]; + Vector<int32_t> v = p_value; + bv.x = v.size() >= 1 ? v[0] : 0; + bv.y = v.size() >= 2 ? v[1] : 0; + bv.z = v.size() >= 3 ? v[2] : 0; + bv.w = v.size() >= 4 ? v[3] : 0; + } break; + case RS::GLOBAL_VAR_TYPE_FLOAT: { + GlobalVariables::Value &bv = global_variables.buffer_values[p_index]; + float v = p_value; + bv.x = v; + bv.y = 0; + bv.z = 0; + bv.w = 0; + } break; + case RS::GLOBAL_VAR_TYPE_VEC2: { + GlobalVariables::Value &bv = global_variables.buffer_values[p_index]; + Vector2 v = p_value; + bv.x = v.x; + bv.y = v.y; + bv.z = 0; + bv.w = 0; + } break; + case RS::GLOBAL_VAR_TYPE_VEC3: { + GlobalVariables::Value &bv = global_variables.buffer_values[p_index]; + Vector3 v = p_value; + bv.x = v.x; + bv.y = v.y; + bv.z = v.z; + bv.w = 0; + } break; + case RS::GLOBAL_VAR_TYPE_VEC4: { + GlobalVariables::Value &bv = global_variables.buffer_values[p_index]; + Plane v = p_value; + bv.x = v.normal.x; + bv.y = v.normal.y; + bv.z = v.normal.z; + bv.w = v.d; + } break; + case RS::GLOBAL_VAR_TYPE_COLOR: { + GlobalVariables::Value &bv = global_variables.buffer_values[p_index]; + Color v = p_value; + bv.x = v.r; + bv.y = v.g; + bv.z = v.b; + bv.w = v.a; + + GlobalVariables::Value &bv_linear = global_variables.buffer_values[p_index + 1]; + v = v.to_linear(); + bv_linear.x = v.r; + bv_linear.y = v.g; + bv_linear.z = v.b; + bv_linear.w = v.a; + + } break; + case RS::GLOBAL_VAR_TYPE_RECT2: { + GlobalVariables::Value &bv = global_variables.buffer_values[p_index]; + Rect2 v = p_value; + bv.x = v.position.x; + bv.y = v.position.y; + bv.z = v.size.x; + bv.w = v.size.y; + } break; + case RS::GLOBAL_VAR_TYPE_MAT2: { + GlobalVariables::Value *bv = &global_variables.buffer_values[p_index]; + Vector<float> m2 = p_value; + if (m2.size() < 4) { + m2.resize(4); + } + bv[0].x = m2[0]; + bv[0].y = m2[1]; + bv[0].z = 0; + bv[0].w = 0; + + bv[1].x = m2[2]; + bv[1].y = m2[3]; + bv[1].z = 0; + bv[1].w = 0; + + } break; + case RS::GLOBAL_VAR_TYPE_MAT3: { + + GlobalVariables::Value *bv = &global_variables.buffer_values[p_index]; + Basis v = p_value; + bv[0].x = v.elements[0][0]; + bv[0].y = v.elements[1][0]; + bv[0].z = v.elements[2][0]; + bv[0].w = 0; + + bv[1].x = v.elements[0][1]; + bv[1].y = v.elements[1][1]; + bv[1].z = v.elements[2][1]; + bv[1].w = 0; + + bv[2].x = v.elements[0][2]; + bv[2].y = v.elements[1][2]; + bv[2].z = v.elements[2][2]; + bv[2].w = 0; + + } break; + case RS::GLOBAL_VAR_TYPE_MAT4: { + + GlobalVariables::Value *bv = &global_variables.buffer_values[p_index]; + + Vector<float> m2 = p_value; + if (m2.size() < 16) { + m2.resize(16); + } + + bv[0].x = m2[0]; + bv[0].y = m2[1]; + bv[0].z = m2[2]; + bv[0].w = m2[3]; + + bv[1].x = m2[4]; + bv[1].y = m2[5]; + bv[1].z = m2[6]; + bv[1].w = m2[7]; + + bv[2].x = m2[8]; + bv[2].y = m2[9]; + bv[2].z = m2[10]; + bv[2].w = m2[11]; + + bv[3].x = m2[12]; + bv[3].y = m2[13]; + bv[3].z = m2[14]; + bv[3].w = m2[15]; + + } break; + case RS::GLOBAL_VAR_TYPE_TRANSFORM_2D: { + + GlobalVariables::Value *bv = &global_variables.buffer_values[p_index]; + Transform2D v = p_value; + bv[0].x = v.elements[0][0]; + bv[0].y = v.elements[0][1]; + bv[0].z = 0; + bv[0].w = 0; + + bv[1].x = v.elements[1][0]; + bv[1].y = v.elements[1][1]; + bv[1].z = 0; + bv[1].w = 0; + + bv[2].x = v.elements[2][0]; + bv[2].y = v.elements[2][1]; + bv[2].z = 1; + bv[2].w = 0; + + } break; + case RS::GLOBAL_VAR_TYPE_TRANSFORM: { + + GlobalVariables::Value *bv = &global_variables.buffer_values[p_index]; + Transform v = p_value; + bv[0].x = v.basis.elements[0][0]; + bv[0].y = v.basis.elements[1][0]; + bv[0].z = v.basis.elements[2][0]; + bv[0].w = 0; + + bv[1].x = v.basis.elements[0][1]; + bv[1].y = v.basis.elements[1][1]; + bv[1].z = v.basis.elements[2][1]; + bv[1].w = 0; + + bv[2].x = v.basis.elements[0][2]; + bv[2].y = v.basis.elements[1][2]; + bv[2].z = v.basis.elements[2][2]; + bv[2].w = 0; + + bv[3].x = v.origin.x; + bv[3].y = v.origin.y; + bv[3].z = v.origin.z; + bv[3].w = 1; + + } break; + default: { + ERR_FAIL(); + } + } +} + +void RasterizerStorageRD::_global_variable_mark_buffer_dirty(int32_t p_index, int32_t p_elements) { + + int32_t prev_chunk = -1; + + for (int32_t i = 0; i < p_elements; i++) { + int32_t chunk = (p_index + i) / GlobalVariables::BUFFER_DIRTY_REGION_SIZE; + if (chunk != prev_chunk) { + if (!global_variables.buffer_dirty_regions[chunk]) { + global_variables.buffer_dirty_regions[chunk] = true; + global_variables.buffer_dirty_region_count++; + } + } + + prev_chunk = chunk; + } +} + +void RasterizerStorageRD::global_variable_add(const StringName &p_name, RS::GlobalVariableType p_type, const Variant &p_value) { + + ERR_FAIL_COND(global_variables.variables.has(p_name)); + GlobalVariables::Variable gv; + gv.type = p_type; + gv.value = p_value; + gv.buffer_index = -1; + + if (p_type >= RS::GLOBAL_VAR_TYPE_SAMPLER2D) { + //is texture + global_variables.must_update_texture_materials = true; //normally ther are no + } else { + + gv.buffer_elements = 1; + if (p_type == RS::GLOBAL_VAR_TYPE_COLOR || p_type == RS::GLOBAL_VAR_TYPE_MAT2) { + //color needs to elements to store srgb and linear + gv.buffer_elements = 2; + } + if (p_type == RS::GLOBAL_VAR_TYPE_MAT3 || p_type == RS::GLOBAL_VAR_TYPE_TRANSFORM_2D) { + //color needs to elements to store srgb and linear + gv.buffer_elements = 3; + } + if (p_type == RS::GLOBAL_VAR_TYPE_MAT4 || p_type == RS::GLOBAL_VAR_TYPE_TRANSFORM) { + //color needs to elements to store srgb and linear + gv.buffer_elements = 4; + } + + //is vector, allocate in buffer and update index + gv.buffer_index = _global_variable_allocate(gv.buffer_elements); + ERR_FAIL_COND_MSG(gv.buffer_index < 0, vformat("Failed allocating global variable '%s' out of buffer memory. Consider increasing it in the Project Settings.", String(p_name))); + global_variables.buffer_usage[gv.buffer_index].elements = gv.buffer_elements; + _global_variable_store_in_buffer(gv.buffer_index, gv.type, gv.value); + _global_variable_mark_buffer_dirty(gv.buffer_index, gv.buffer_elements); + + global_variables.must_update_buffer_materials = true; //normally ther are no + } + + global_variables.variables[p_name] = gv; +} + +void RasterizerStorageRD::global_variable_remove(const StringName &p_name) { + if (!global_variables.variables.has(p_name)) { + return; + } + GlobalVariables::Variable &gv = global_variables.variables[p_name]; + + if (gv.buffer_index >= 0) { + global_variables.buffer_usage[gv.buffer_index].elements = 0; + global_variables.must_update_buffer_materials = true; + } else { + global_variables.must_update_texture_materials = true; + } + + global_variables.variables.erase(p_name); +} +Vector<StringName> RasterizerStorageRD::global_variable_get_list() const { + + if (!Engine::get_singleton()->is_editor_hint()) { + ERR_FAIL_V_MSG(Vector<StringName>(), "This function should never be used outside the editor, it can severely damage performance."); + } + + const StringName *K = NULL; + Vector<StringName> names; + while ((K = global_variables.variables.next(K))) { + names.push_back(*K); + } + names.sort_custom<StringName::AlphCompare>(); + return names; +} + +void RasterizerStorageRD::global_variable_set(const StringName &p_name, const Variant &p_value) { + ERR_FAIL_COND(!global_variables.variables.has(p_name)); + GlobalVariables::Variable &gv = global_variables.variables[p_name]; + gv.value = p_value; + if (gv.override.get_type() == Variant::NIL) { + if (gv.buffer_index >= 0) { + //buffer + _global_variable_store_in_buffer(gv.buffer_index, gv.type, gv.value); + _global_variable_mark_buffer_dirty(gv.buffer_index, gv.buffer_elements); + } else { + //texture + for (Set<RID>::Element *E = gv.texture_materials.front(); E; E = E->next()) { + Material *material = material_owner.getornull(E->get()); + ERR_CONTINUE(!material); + _material_queue_update(material, false, true); + } + } + } +} +void RasterizerStorageRD::global_variable_set_override(const StringName &p_name, const Variant &p_value) { + if (!global_variables.variables.has(p_name)) { + return; //variable may not exist + } + GlobalVariables::Variable &gv = global_variables.variables[p_name]; + + gv.override = p_value; + + if (gv.buffer_index >= 0) { + //buffer + if (gv.override.get_type() == Variant::NIL) { + _global_variable_store_in_buffer(gv.buffer_index, gv.type, gv.value); + } else { + _global_variable_store_in_buffer(gv.buffer_index, gv.type, gv.override); + } + + _global_variable_mark_buffer_dirty(gv.buffer_index, gv.buffer_elements); + } else { + //texture + //texture + for (Set<RID>::Element *E = gv.texture_materials.front(); E; E = E->next()) { + Material *material = material_owner.getornull(E->get()); + ERR_CONTINUE(!material); + _material_queue_update(material, false, true); + } + } +} + +Variant RasterizerStorageRD::global_variable_get(const StringName &p_name) const { + + if (!Engine::get_singleton()->is_editor_hint()) { + ERR_FAIL_V_MSG(Variant(), "This function should never be used outside the editor, it can severely damage performance."); + } + + if (!global_variables.variables.has(p_name)) { + return Variant(); + } + + return global_variables.variables[p_name].value; +} + +RS::GlobalVariableType RasterizerStorageRD::global_variable_get_type_internal(const StringName &p_name) const { + + if (!global_variables.variables.has(p_name)) { + return RS::GLOBAL_VAR_TYPE_MAX; + } + + return global_variables.variables[p_name].type; +} + +RS::GlobalVariableType RasterizerStorageRD::global_variable_get_type(const StringName &p_name) const { + if (!Engine::get_singleton()->is_editor_hint()) { + ERR_FAIL_V_MSG(RS::GLOBAL_VAR_TYPE_MAX, "This function should never be used outside the editor, it can severely damage performance."); + } + + return global_variable_get_type_internal(p_name); +} + +void RasterizerStorageRD::global_variables_load_settings(bool p_load_textures) { + + List<PropertyInfo> settings; + ProjectSettings::get_singleton()->get_property_list(&settings); + + for (List<PropertyInfo>::Element *E = settings.front(); E; E = E->next()) { + if (E->get().name.begins_with("shader_globals/")) { + StringName name = E->get().name.get_slice("/", 1); + Dictionary d = ProjectSettings::get_singleton()->get(E->get().name); + + ERR_CONTINUE(!d.has("type")); + ERR_CONTINUE(!d.has("value")); + + String type = d["type"]; + + static const char *global_var_type_names[RS::GLOBAL_VAR_TYPE_MAX] = { + "bool", + "bvec2", + "bvec3", + "bvec4", + "int", + "ivec2", + "ivec3", + "ivec4", + "rect2i", + "uint", + "uvec2", + "uvec3", + "uvec4", + "float", + "vec2", + "vec3", + "vec4", + "color", + "rect2", + "mat2", + "mat3", + "mat4", + "transform_2d", + "transform", + "sampler2D", + "sampler2DArray", + "sampler3D", + "samplerCube", + }; + + RS::GlobalVariableType gvtype = RS::GLOBAL_VAR_TYPE_MAX; + + for (int i = 0; i < RS::GLOBAL_VAR_TYPE_MAX; i++) { + if (global_var_type_names[i] == type) { + gvtype = RS::GlobalVariableType(i); + break; + } + } + + ERR_CONTINUE(gvtype == RS::GLOBAL_VAR_TYPE_MAX); //type invalid + + Variant value = d["value"]; + + if (gvtype >= RS::GLOBAL_VAR_TYPE_SAMPLER2D) { + //textire + if (!p_load_textures) { + value = RID(); + continue; + } + + String path = value; + RES resource = ResourceLoader::load(path); + ERR_CONTINUE(resource.is_null()); + value = resource; + } + + if (global_variables.variables.has(name)) { + //has it, update it + global_variable_set(name, value); + } else { + global_variable_add(name, gvtype, value); + } + } + } +} + +void RasterizerStorageRD::global_variables_clear() { + global_variables.variables.clear(); //not right but for now enough +} + +RID RasterizerStorageRD::global_variables_get_storage_buffer() const { + return global_variables.buffer; +} + +int32_t RasterizerStorageRD::global_variables_instance_allocate(RID p_instance) { + ERR_FAIL_COND_V(global_variables.instance_buffer_pos.has(p_instance), -1); + int32_t pos = _global_variable_allocate(ShaderLanguage::MAX_INSTANCE_UNIFORM_INDICES); + global_variables.instance_buffer_pos[p_instance] = pos; //save anyway + ERR_FAIL_COND_V_MSG(pos < 0, -1, "Too many instances using shader instance variables. Increase buffer size in Project Settings."); + global_variables.buffer_usage[pos].elements = ShaderLanguage::MAX_INSTANCE_UNIFORM_INDICES; + return pos; +} + +void RasterizerStorageRD::global_variables_instance_free(RID p_instance) { + ERR_FAIL_COND(!global_variables.instance_buffer_pos.has(p_instance)); + int32_t pos = global_variables.instance_buffer_pos[p_instance]; + if (pos >= 0) { + global_variables.buffer_usage[pos].elements = 0; + } + global_variables.instance_buffer_pos.erase(p_instance); +} +void RasterizerStorageRD::global_variables_instance_update(RID p_instance, int p_index, const Variant &p_value) { + + if (!global_variables.instance_buffer_pos.has(p_instance)) { + return; //just not allocated, ignore + } + int32_t pos = global_variables.instance_buffer_pos[p_instance]; + + if (pos < 0) { + return; //again, not allocated, ignore + } + ERR_FAIL_INDEX(p_index, ShaderLanguage::MAX_INSTANCE_UNIFORM_INDICES); + ERR_FAIL_COND_MSG(p_value.get_type() > Variant::COLOR, "Unsupported variant type for instance parameter: " + Variant::get_type_name(p_value.get_type())); //anything greater not supported + + ShaderLanguage::DataType datatype_from_value[Variant::COLOR + 1] = { + ShaderLanguage::TYPE_MAX, //nil + ShaderLanguage::TYPE_BOOL, //bool + ShaderLanguage::TYPE_INT, //int + ShaderLanguage::TYPE_FLOAT, //float + ShaderLanguage::TYPE_MAX, //string + ShaderLanguage::TYPE_VEC2, //vec2 + ShaderLanguage::TYPE_IVEC2, //vec2i + ShaderLanguage::TYPE_VEC4, //rect2 + ShaderLanguage::TYPE_IVEC4, //rect2i + ShaderLanguage::TYPE_VEC3, // vec3 + ShaderLanguage::TYPE_IVEC3, //vec3i + ShaderLanguage::TYPE_MAX, //xform2d not supported here + ShaderLanguage::TYPE_VEC4, //plane + ShaderLanguage::TYPE_VEC4, //quat + ShaderLanguage::TYPE_MAX, //aabb not supported here + ShaderLanguage::TYPE_MAX, //basis not supported here + ShaderLanguage::TYPE_MAX, //xform not supported here + ShaderLanguage::TYPE_VEC4 //color + }; + + ShaderLanguage::DataType datatype = datatype_from_value[p_value.get_type()]; + + ERR_FAIL_COND_MSG(datatype == ShaderLanguage::TYPE_MAX, "Unsupported variant type for instance parameter: " + Variant::get_type_name(p_value.get_type())); //anything greater not supported + + pos += p_index; + + _fill_std140_variant_ubo_value(datatype, p_value, (uint8_t *)&global_variables.buffer_values[pos], true); //instances always use linear color in this renderer + _global_variable_mark_buffer_dirty(pos, 1); +} + +void RasterizerStorageRD::_update_global_variables() { + + if (global_variables.buffer_dirty_region_count > 0) { + uint32_t total_regions = global_variables.buffer_size / GlobalVariables::BUFFER_DIRTY_REGION_SIZE; + if (total_regions / global_variables.buffer_dirty_region_count <= 4) { + // 25% of regions dirty, just update all buffer + RD::get_singleton()->buffer_update(global_variables.buffer, 0, sizeof(GlobalVariables::Value) * global_variables.buffer_size, global_variables.buffer_values); + zeromem(global_variables.buffer_dirty_regions, sizeof(bool) * total_regions); + } else { + uint32_t region_byte_size = sizeof(GlobalVariables::Value) * GlobalVariables::BUFFER_DIRTY_REGION_SIZE; + + for (uint32_t i = 0; i < total_regions; i++) { + if (global_variables.buffer_dirty_regions[i]) { + + RD::get_singleton()->buffer_update(global_variables.buffer, i * region_byte_size, region_byte_size, global_variables.buffer_values); + + global_variables.buffer_dirty_regions[i] = false; + } + } + } + + global_variables.buffer_dirty_region_count = 0; + } + + if (global_variables.must_update_buffer_materials) { + // only happens in the case of a buffer variable added or removed, + // so not often. + for (List<RID>::Element *E = global_variables.materials_using_buffer.front(); E; E = E->next()) { + Material *material = material_owner.getornull(E->get()); + ERR_CONTINUE(!material); //wtf + + _material_queue_update(material, true, false); + } + + global_variables.must_update_buffer_materials = false; + } + + if (global_variables.must_update_texture_materials) { + // only happens in the case of a buffer variable added or removed, + // so not often. + for (List<RID>::Element *E = global_variables.materials_using_texture.front(); E; E = E->next()) { + Material *material = material_owner.getornull(E->get()); + ERR_CONTINUE(!material); //wtf + + _material_queue_update(material, false, true); + print_line("update material texture?"); + } + + global_variables.must_update_texture_materials = false; + } +} + void RasterizerStorageRD::update_dirty_resources() { + _update_global_variables(); //must do before materials, so it can queue them for update _update_queued_materials(); _update_dirty_multimeshes(); _update_dirty_skeletons(); + _update_decal_atlas(); } bool RasterizerStorageRD::has_os_feature(const String &p_feature) const { @@ -4339,6 +5494,11 @@ bool RasterizerStorageRD::free(RID p_rid) { } } + if (decal_atlas.textures.has(p_rid)) { + decal_atlas.textures.erase(p_rid); + //there is not much a point of making it dirty, just let it be. + } + for (int i = 0; i < t->proxies.size(); i++) { Texture *p = texture_owner.getornull(t->proxies[i]); ERR_CONTINUE(!p); @@ -4389,6 +5549,15 @@ bool RasterizerStorageRD::free(RID p_rid) { ReflectionProbe *reflection_probe = reflection_probe_owner.getornull(p_rid); reflection_probe->instance_dependency.instance_notify_deleted(p_rid); reflection_probe_owner.free(p_rid); + } else if (decal_owner.owns(p_rid)) { + Decal *decal = decal_owner.getornull(p_rid); + for (int i = 0; i < RS::DECAL_TEXTURE_MAX; i++) { + if (decal->textures[i].is_valid() && texture_owner.owns(decal->textures[i])) { + texture_remove_from_decal_atlas(decal->textures[i]); + } + } + decal->instance_dependency.instance_notify_deleted(p_rid); + decal_owner.free(p_rid); } else if (gi_probe_owner.owns(p_rid)) { gi_probe_allocate(p_rid, Transform(), AABB(), Vector3i(), Vector<uint8_t>(), Vector<uint8_t>(), Vector<uint8_t>(), Vector<int>()); //deallocate GIProbe *gi_probe = gi_probe_owner.getornull(p_rid); @@ -4397,6 +5566,7 @@ bool RasterizerStorageRD::free(RID p_rid) { } else if (light_owner.owns(p_rid)) { + light_set_projector(p_rid, RID()); //clear projector // delete the texture Light *light = light_owner.getornull(p_rid); light->instance_dependency.instance_notify_deleted(p_rid); @@ -4450,12 +5620,27 @@ String RasterizerStorageRD::get_captured_timestamp_name(uint32_t p_index) const return RD::get_singleton()->get_captured_timestamp_name(p_index); } +RasterizerStorageRD *RasterizerStorageRD::base_singleton = nullptr; + RasterizerStorageRD::RasterizerStorageRD() { + base_singleton = this; + for (int i = 0; i < SHADER_TYPE_MAX; i++) { shader_data_request_func[i] = nullptr; } + static_assert(sizeof(GlobalVariables::Value) == 16); + + global_variables.buffer_size = GLOBAL_GET("rendering/high_end/global_shader_variables_buffer_size"); + global_variables.buffer_size = MAX(4096, global_variables.buffer_size); + global_variables.buffer_values = memnew_arr(GlobalVariables::Value, global_variables.buffer_size); + zeromem(global_variables.buffer_values, sizeof(GlobalVariables::Value) * global_variables.buffer_size); + global_variables.buffer_usage = memnew_arr(GlobalVariables::ValueUsage, global_variables.buffer_size); + global_variables.buffer_dirty_regions = memnew_arr(bool, global_variables.buffer_size / GlobalVariables::BUFFER_DIRTY_REGION_SIZE); + zeromem(global_variables.buffer_dirty_regions, sizeof(bool) * global_variables.buffer_size / GlobalVariables::BUFFER_DIRTY_REGION_SIZE); + global_variables.buffer = RD::get_singleton()->storage_buffer_create(sizeof(GlobalVariables::Value) * global_variables.buffer_size); + material_update_list = nullptr; { //create default textures @@ -4492,6 +5677,10 @@ RasterizerStorageRD::RasterizerStorageRD() { Vector<Vector<uint8_t>> vpv; vpv.push_back(pv); default_rd_textures[DEFAULT_RD_TEXTURE_BLACK] = RD::get_singleton()->texture_create(tformat, RD::TextureView(), vpv); + + //take the chance and initialize decal atlas to something + decal_atlas.texture = RD::get_singleton()->texture_create(tformat, RD::TextureView(), vpv); + decal_atlas.texture_srgb = decal_atlas.texture; } for (int i = 0; i < 16; i++) { @@ -4644,14 +5833,14 @@ RasterizerStorageRD::RasterizerStorageRD() { sampler_state.min_filter = RD::SAMPLER_FILTER_LINEAR; sampler_state.mip_filter = RD::SAMPLER_FILTER_LINEAR; sampler_state.use_anisotropy = true; - sampler_state.anisotropy_max = GLOBAL_GET("rendering/quality/filters/max_anisotropy"); + sampler_state.anisotropy_max = GLOBAL_GET("rendering/quality/texture_filters/max_anisotropy"); } break; case RS::CANVAS_ITEM_TEXTURE_FILTER_LINEAR_WITH_MIPMAPS_ANISOTROPIC: { sampler_state.mag_filter = RD::SAMPLER_FILTER_LINEAR; sampler_state.min_filter = RD::SAMPLER_FILTER_LINEAR; sampler_state.mip_filter = RD::SAMPLER_FILTER_LINEAR; sampler_state.use_anisotropy = true; - sampler_state.anisotropy_max = GLOBAL_GET("rendering/quality/filters/max_anisotropy"); + sampler_state.anisotropy_max = GLOBAL_GET("rendering/quality/texture_filters/max_anisotropy"); } break; default: { @@ -4683,9 +5872,11 @@ RasterizerStorageRD::RasterizerStorageRD() { //default rd buffers { - { //vertex + //vertex + { Vector<uint8_t> buffer; + buffer.resize(sizeof(float) * 3); { uint8_t *w = buffer.ptrw(); @@ -4803,6 +5994,11 @@ RasterizerStorageRD::RasterizerStorageRD() { RasterizerStorageRD::~RasterizerStorageRD() { + memdelete_arr(global_variables.buffer_values); + memdelete_arr(global_variables.buffer_usage); + memdelete_arr(global_variables.buffer_dirty_regions); + RD::get_singleton()->free(global_variables.buffer); + //def textures for (int i = 0; i < DEFAULT_RD_TEXTURE_MAX; i++) { RD::get_singleton()->free(default_rd_textures[i]); @@ -4820,4 +6016,12 @@ RasterizerStorageRD::~RasterizerStorageRD() { RD::get_singleton()->free(mesh_default_rd_buffers[i]); } giprobe_sdf_shader.version_free(giprobe_sdf_shader_version); + + if (decal_atlas.textures.size()) { + ERR_PRINT("Decal Atlas: " + itos(decal_atlas.textures.size()) + " textures were not removed from the atlas."); + } + + if (decal_atlas.texture.is_valid()) { + RD::get_singleton()->free(decal_atlas.texture); + } } diff --git a/servers/rendering/rasterizer_rd/rasterizer_storage_rd.h b/servers/rendering/rasterizer_rd/rasterizer_storage_rd.h index 49f77e49e1..f874c3baf8 100644 --- a/servers/rendering/rasterizer_rd/rasterizer_storage_rd.h +++ b/servers/rendering/rasterizer_rd/rasterizer_storage_rd.h @@ -52,6 +52,8 @@ public: virtual void set_code(const String &p_Code) = 0; virtual void set_default_texture_param(const StringName &p_name, RID p_texture) = 0; virtual void get_param_list(List<PropertyInfo> *p_param_list) const = 0; + + virtual void get_instance_param_list(List<InstanceShaderParam> *p_param_list) const = 0; virtual bool is_param_texture(const StringName &p_param) const = 0; virtual bool is_animated() const = 0; virtual bool casts_shadows() const = 0; @@ -69,7 +71,15 @@ public: virtual void set_render_priority(int p_priority) = 0; virtual void set_next_pass(RID p_pass) = 0; virtual void update_parameters(const Map<StringName, Variant> &p_parameters, bool p_uniform_dirty, bool p_textures_dirty) = 0; - virtual ~MaterialData() {} + virtual ~MaterialData(); + + private: + friend class RasterizerStorageRD; + RID self; + List<RID>::Element *global_buffer_E = nullptr; + List<RID>::Element *global_texture_E = nullptr; + uint64_t global_textures_pass = 0; + Map<StringName, uint64_t> used_global_textures; }; typedef MaterialData *(*MaterialDataRequestFunction)(ShaderData *); @@ -173,6 +183,51 @@ private: RID default_rd_textures[DEFAULT_RD_TEXTURE_MAX]; RID default_rd_samplers[RS::CANVAS_ITEM_TEXTURE_FILTER_MAX][RS::CANVAS_ITEM_TEXTURE_REPEAT_MAX]; + /* DECAL ATLAS */ + + struct DecalAtlas { + struct Texture { + + int panorama_to_dp_users; + int users; + Rect2 uv_rect; + }; + + struct SortItem { + RID texture; + Size2i pixel_size; + Size2i size; + Point2i pos; + + bool operator<(const SortItem &p_item) const { + //sort larger to smaller + if (size.height == p_item.size.height) { + return size.width > p_item.size.width; + } else { + return size.height > p_item.size.height; + } + } + }; + + HashMap<RID, Texture> textures; + bool dirty = true; + int mipmaps = 5; + + RID texture; + RID texture_srgb; + struct MipMap { + RID fb; + RID texture; + Size2i size; + }; + Vector<MipMap> texture_mipmaps; + + Size2i size; + + } decal_atlas; + + void _update_decal_atlas(); + /* SHADER */ struct Material; @@ -403,6 +458,28 @@ private: mutable RID_Owner<ReflectionProbe> reflection_probe_owner; + /* DECAL */ + + struct Decal { + + Vector3 extents = Vector3(1, 1, 1); + RID textures[RS::DECAL_TEXTURE_MAX]; + float emission_energy = 1.0; + float albedo_mix = 1.0; + Color modulate = Color(1, 1, 1, 1); + uint32_t cull_mask = (1 << 20) - 1; + float upper_fade = 0.3; + float lower_fade = 0.3; + bool distance_fade = false; + float distance_fade_begin = 10; + float distance_fade_length = 1; + float normal_fade = 0.0; + + RasterizerScene::InstanceDependency instance_dependency; + }; + + mutable RID_Owner<Decal> decal_owner; + /* GI PROBE */ struct GIProbe { @@ -463,13 +540,11 @@ private: bool flags[RENDER_TARGET_FLAG_MAX]; RID backbuffer; //used for effects - RID backbuffer_fb; + RID backbuffer_mipmap0; struct BackbufferMipmap { RID mipmap; - RID mipmap_fb; RID mipmap_copy; - RID mipmap_copy_fb; }; Vector<BackbufferMipmap> backbuffer_mipmaps; @@ -490,6 +565,73 @@ private: void _update_render_target(RenderTarget *rt); void _create_render_target_backbuffer(RenderTarget *rt); + /* GLOBAL SHADER VARIABLES */ + + struct GlobalVariables { + + enum { + BUFFER_DIRTY_REGION_SIZE = 1024 + }; + struct Variable { + Set<RID> texture_materials; // materials using this + + RS::GlobalVariableType type; + Variant value; + Variant override; + int32_t buffer_index; //for vectors + int32_t buffer_elements; //for vectors + }; + + HashMap<StringName, Variable> variables; + + struct Value { + float x; + float y; + float z; + float w; + }; + + struct ValueInt { + int32_t x; + int32_t y; + int32_t z; + int32_t w; + }; + + struct ValueUInt { + uint32_t x; + uint32_t y; + uint32_t z; + uint32_t w; + }; + + struct ValueUsage { + uint32_t elements = 0; + }; + + List<RID> materials_using_buffer; + List<RID> materials_using_texture; + + RID buffer; + Value *buffer_values; + ValueUsage *buffer_usage; + bool *buffer_dirty_regions; + uint32_t buffer_dirty_region_count = 0; + + uint32_t buffer_size; + + bool must_update_texture_materials = false; + bool must_update_buffer_materials = false; + + HashMap<RID, int32_t> instance_buffer_pos; + + } global_variables; + + int32_t _global_variable_allocate(uint32_t p_elements); + void _global_variable_store_in_buffer(int32_t p_index, RS::GlobalVariableType p_type, const Variant &p_value); + void _global_variable_mark_buffer_dirty(int32_t p_index, int32_t p_elements); + + void _update_global_variables(); /* EFFECTS */ RasterizerEffectsRD effects; @@ -535,6 +677,20 @@ public: virtual Size2 texture_size_with_proxy(RID p_proxy); + virtual void texture_add_to_decal_atlas(RID p_texture, bool p_panorama_to_dp = false); + virtual void texture_remove_from_decal_atlas(RID p_texture, bool p_panorama_to_dp = false); + + RID decal_atlas_get_texture() const; + RID decal_atlas_get_texture_srgb() const; + _FORCE_INLINE_ Rect2 decal_atlas_get_texture_rect(RID p_texture) { + DecalAtlas::Texture *t = decal_atlas.textures.getptr(p_texture); + if (!t) { + return Rect2(); + } + + return t->uv_rect; + } + //internal usage _FORCE_INLINE_ RID texture_get_rd_texture(RID p_texture, bool p_srgb = false) { @@ -596,6 +752,8 @@ public: bool material_is_animated(RID p_material); bool material_casts_shadows(RID p_material); + void material_get_instance_shader_parameters(RID p_material, List<InstanceShaderParam> *r_parameters); + void material_update_dependency(RID p_material, RasterizerScene::InstanceBase *p_instance); void material_force_update_textures(RID p_material, ShaderType p_shader_type); @@ -886,6 +1044,14 @@ public: return light->param[p_param]; } + _FORCE_INLINE_ RID light_get_projector(RID p_light) { + + const Light *light = light_owner.getornull(p_light); + ERR_FAIL_COND_V(!light, RID()); + + return light->projector; + } + _FORCE_INLINE_ Color light_get_color(RID p_light) { const Light *light = light_owner.getornull(p_light); @@ -926,6 +1092,14 @@ public: return light->negative; } + _FORCE_INLINE_ float light_get_transmittance_bias(RID p_light) const { + + const Light *light = light_owner.getornull(p_light); + ERR_FAIL_COND_V(!light, 0.0); + + return light->param[RS::LIGHT_PARAM_TRANSMITTANCE_BIAS]; + } + bool light_get_use_gi(RID p_light); uint64_t light_get_version(RID p_light) const; @@ -966,6 +1140,81 @@ public: void base_update_dependency(RID p_base, RasterizerScene::InstanceBase *p_instance); void skeleton_update_dependency(RID p_skeleton, RasterizerScene::InstanceBase *p_instance); + /* DECAL API */ + + virtual RID decal_create(); + virtual void decal_set_extents(RID p_decal, const Vector3 &p_extents); + virtual void decal_set_texture(RID p_decal, RS::DecalTexture p_type, RID p_texture); + virtual void decal_set_emission_energy(RID p_decal, float p_energy); + virtual void decal_set_albedo_mix(RID p_decal, float p_mix); + virtual void decal_set_modulate(RID p_decal, const Color &p_modulate); + virtual void decal_set_cull_mask(RID p_decal, uint32_t p_layers); + virtual void decal_set_distance_fade(RID p_decal, bool p_enabled, float p_begin, float p_length); + virtual void decal_set_fade(RID p_decal, float p_above, float p_below); + virtual void decal_set_normal_fade(RID p_decal, float p_fade); + + _FORCE_INLINE_ Vector3 decal_get_extents(RID p_decal) { + const Decal *decal = decal_owner.getornull(p_decal); + return decal->extents; + } + + _FORCE_INLINE_ RID decal_get_texture(RID p_decal, RS::DecalTexture p_texture) { + const Decal *decal = decal_owner.getornull(p_decal); + return decal->textures[p_texture]; + } + + _FORCE_INLINE_ Color decal_get_modulate(RID p_decal) { + const Decal *decal = decal_owner.getornull(p_decal); + return decal->modulate; + } + + _FORCE_INLINE_ float decal_get_emission_energy(RID p_decal) { + const Decal *decal = decal_owner.getornull(p_decal); + return decal->emission_energy; + } + + _FORCE_INLINE_ float decal_get_albedo_mix(RID p_decal) { + const Decal *decal = decal_owner.getornull(p_decal); + return decal->albedo_mix; + } + + _FORCE_INLINE_ uint32_t decal_get_cull_mask(RID p_decal) { + const Decal *decal = decal_owner.getornull(p_decal); + return decal->cull_mask; + } + + _FORCE_INLINE_ float decal_get_upper_fade(RID p_decal) { + const Decal *decal = decal_owner.getornull(p_decal); + return decal->upper_fade; + } + + _FORCE_INLINE_ float decal_get_lower_fade(RID p_decal) { + const Decal *decal = decal_owner.getornull(p_decal); + return decal->lower_fade; + } + + _FORCE_INLINE_ float decal_get_normal_fade(RID p_decal) { + const Decal *decal = decal_owner.getornull(p_decal); + return decal->normal_fade; + } + + _FORCE_INLINE_ bool decal_is_distance_fade_enabled(RID p_decal) { + const Decal *decal = decal_owner.getornull(p_decal); + return decal->distance_fade; + } + + _FORCE_INLINE_ float decal_get_distance_fade_begin(RID p_decal) { + const Decal *decal = decal_owner.getornull(p_decal); + return decal->distance_fade_begin; + } + + _FORCE_INLINE_ float decal_get_distance_fade_length(RID p_decal) { + const Decal *decal = decal_owner.getornull(p_decal); + return decal->distance_fade_length; + } + + virtual AABB decal_get_aabb(RID p_decal) const; + /* GI PROBE API */ RID gi_probe_create(); @@ -1076,6 +1325,27 @@ public: virtual bool particles_is_inactive(RID p_particles) const { return false; } + /* GLOBAL VARIABLES API */ + + virtual void global_variable_add(const StringName &p_name, RS::GlobalVariableType p_type, const Variant &p_value); + virtual void global_variable_remove(const StringName &p_name); + virtual Vector<StringName> global_variable_get_list() const; + + virtual void global_variable_set(const StringName &p_name, const Variant &p_value); + virtual void global_variable_set_override(const StringName &p_name, const Variant &p_value); + virtual Variant global_variable_get(const StringName &p_name) const; + virtual RS::GlobalVariableType global_variable_get_type(const StringName &p_name) const; + RS::GlobalVariableType global_variable_get_type_internal(const StringName &p_name) const; + + virtual void global_variables_load_settings(bool p_load_textures = true); + virtual void global_variables_clear(); + + virtual int32_t global_variables_instance_allocate(RID p_instance); + virtual void global_variables_instance_free(RID p_instance); + virtual void global_variables_instance_update(RID p_instance, int p_index, const Variant &p_value); + + RID global_variables_get_storage_buffer() const; + /* RENDER TARGET API */ RID render_target_create(); @@ -1097,6 +1367,7 @@ public: Size2 render_target_get_size(RID p_render_target); RID render_target_get_rd_framebuffer(RID p_render_target); + RID render_target_get_rd_texture(RID p_render_target); RS::InstanceType get_base_type(RID p_rid) const; @@ -1124,7 +1395,7 @@ public: virtual uint64_t get_captured_timestamp_cpu_time(uint32_t p_index) const; virtual String get_captured_timestamp_name(uint32_t p_index) const; - static RasterizerStorage *base_singleton; + static RasterizerStorageRD *base_singleton; RasterizerEffectsRD *get_effects(); diff --git a/servers/rendering/rasterizer_rd/shader_compiler_rd.cpp b/servers/rendering/rasterizer_rd/shader_compiler_rd.cpp index 4a0b4f02b1..d4e6576125 100644 --- a/servers/rendering/rasterizer_rd/shader_compiler_rd.cpp +++ b/servers/rendering/rasterizer_rd/shader_compiler_rd.cpp @@ -32,6 +32,8 @@ #include "core/os/os.h" #include "core/project_settings.h" +#include "rasterizer_storage_rd.h" +#include "servers/rendering_server.h" #define SL ShaderLanguage @@ -91,6 +93,9 @@ static int _get_datatype_size(SL::DataType p_type) { case SL::TYPE_USAMPLER3D: return 16; case SL::TYPE_SAMPLERCUBE: return 16; case SL::TYPE_STRUCT: return 0; + case SL::TYPE_MAX: { + ERR_FAIL_V(0); + }; } ERR_FAIL_V(0); @@ -131,6 +136,9 @@ static int _get_datatype_alignment(SL::DataType p_type) { case SL::TYPE_USAMPLER3D: return 16; case SL::TYPE_SAMPLERCUBE: return 16; case SL::TYPE_STRUCT: return 0; + case SL::TYPE_MAX: { + ERR_FAIL_V(0); + } } ERR_FAIL_V(0); @@ -341,6 +349,71 @@ void ShaderCompilerRD::_dump_function_deps(const SL::ShaderNode *p_node, const S } } +static String _get_global_variable_from_type_and_index(const String &p_buffer, const String &p_index, ShaderLanguage::DataType p_type) { + switch (p_type) { + case ShaderLanguage::TYPE_BOOL: { + return "(" + p_buffer + "[" + p_index + "].x != 0.0)"; + } + case ShaderLanguage::TYPE_BVEC2: { + return "(" + p_buffer + "[" + p_index + "].xy != vec2(0.0))"; + } + case ShaderLanguage::TYPE_BVEC3: { + return "(" + p_buffer + "[" + p_index + "].xyz != vec3(0.0))"; + } + case ShaderLanguage::TYPE_BVEC4: { + return "(" + p_buffer + "[" + p_index + "].xyzw != vec4(0.0))"; + } + case ShaderLanguage::TYPE_INT: { + return "floatBitsToInt(" + p_buffer + "[" + p_index + "].x)"; + } + case ShaderLanguage::TYPE_IVEC2: { + return "floatBitsToInt(" + p_buffer + "[" + p_index + "].xy)"; + } + case ShaderLanguage::TYPE_IVEC3: { + return "floatBitsToInt(" + p_buffer + "[" + p_index + "].xyz)"; + } + case ShaderLanguage::TYPE_IVEC4: { + return "floatBitsToInt(" + p_buffer + "[" + p_index + "].xyzw)"; + } + case ShaderLanguage::TYPE_UINT: { + return "floatBitsToUInt(" + p_buffer + "[" + p_index + "].x)"; + } + case ShaderLanguage::TYPE_UVEC2: { + return "floatBitsToUInt(" + p_buffer + "[" + p_index + "].xy)"; + } + case ShaderLanguage::TYPE_UVEC3: { + return "floatBitsToUInt(" + p_buffer + "[" + p_index + "].xyz)"; + } + case ShaderLanguage::TYPE_UVEC4: { + return "floatBitsToUInt(" + p_buffer + "[" + p_index + "].xyzw)"; + } + case ShaderLanguage::TYPE_FLOAT: { + return "(" + p_buffer + "[" + p_index + "].x)"; + } + case ShaderLanguage::TYPE_VEC2: { + return "(" + p_buffer + "[" + p_index + "].xy)"; + } + case ShaderLanguage::TYPE_VEC3: { + return "(" + p_buffer + "[" + p_index + "].xyz)"; + } + case ShaderLanguage::TYPE_VEC4: { + return "(" + p_buffer + "[" + p_index + "].xyzw)"; + } + case ShaderLanguage::TYPE_MAT2: { + return "mat2(" + p_buffer + "[" + p_index + "].xy," + p_buffer + "[" + p_index + "+1].xy)"; + } + case ShaderLanguage::TYPE_MAT3: { + return "mat3(" + p_buffer + "[" + p_index + "].xyz," + p_buffer + "[" + p_index + "+1].xyz," + p_buffer + "[" + p_index + "+2].xyz)"; + } + case ShaderLanguage::TYPE_MAT4: { + return "mat4(" + p_buffer + "[" + p_index + "].xyzw," + p_buffer + "[" + p_index + "+1].xyzw," + p_buffer + "[" + p_index + "+2].xyzw," + p_buffer + "[" + p_index + "+3].xyzw)"; + } + default: { + ERR_FAIL_V("void"); + } + } +} + String ShaderCompilerRD::_dump_node_code(const SL::Node *p_node, int p_level, GeneratedCode &r_gen_code, IdentifierActions &p_actions, const DefaultIdentifierActions &p_default_actions, bool p_assigning) { String code; @@ -408,10 +481,17 @@ String ShaderCompilerRD::_dump_node_code(const SL::Node *p_node, int p_level, Ge int max_uniforms = 0; for (Map<StringName, SL::ShaderNode::Uniform>::Element *E = pnode->uniforms.front(); E; E = E->next()) { - if (SL::is_sampler_type(E->get().type)) + + if (SL::is_sampler_type(E->get().type)) { max_texture_uniforms++; - else + } else { + + if (E->get().scope == SL::ShaderNode::Uniform::SCOPE_INSTANCE) { + continue; //instances are indexed directly, dont need index uniforms + } + max_uniforms++; + } } r_gen_code.texture_uniforms.resize(max_texture_uniforms); @@ -428,12 +508,25 @@ String ShaderCompilerRD::_dump_node_code(const SL::Node *p_node, int p_level, Ge String ucode; + if (E->get().scope == SL::ShaderNode::Uniform::SCOPE_INSTANCE) { + //insert, but don't generate any code. + p_actions.uniforms->insert(E->key(), E->get()); + continue; //instances are indexed directly, dont need index uniforms + } if (SL::is_sampler_type(E->get().type)) { ucode = "layout(set = " + itos(actions.texture_layout_set) + ", binding = " + itos(actions.base_texture_binding_index + E->get().texture_order) + ") uniform "; } - ucode += _prestr(E->get().precision); - ucode += _typestr(E->get().type); + bool is_buffer_global = !SL::is_sampler_type(E->get().type) && E->get().scope == SL::ShaderNode::Uniform::SCOPE_GLOBAL; + + if (is_buffer_global) { + //this is an integer to index the global table + ucode += _typestr(ShaderLanguage::TYPE_UINT); + } else { + ucode += _prestr(E->get().precision); + ucode += _typestr(E->get().type); + } + ucode += " " + _mkid(E->key()); ucode += ";\n"; if (SL::is_sampler_type(E->get().type)) { @@ -446,6 +539,10 @@ String ShaderCompilerRD::_dump_node_code(const SL::Node *p_node, int p_level, Ge texture.type = E->get().type; texture.filter = E->get().filter; texture.repeat = E->get().repeat; + texture.global = E->get().scope == ShaderLanguage::ShaderNode::Uniform::SCOPE_GLOBAL; + if (texture.global) { + r_gen_code.uses_global_textures = true; + } r_gen_code.texture_uniforms.write[E->get().texture_order] = texture; } else { @@ -455,8 +552,14 @@ String ShaderCompilerRD::_dump_node_code(const SL::Node *p_node, int p_level, Ge uses_uniforms = true; } uniform_defines.write[E->get().order] = ucode; - uniform_sizes.write[E->get().order] = _get_datatype_size(E->get().type); - uniform_alignments.write[E->get().order] = _get_datatype_alignment(E->get().type); + if (is_buffer_global) { + //globals are indices into the global table + uniform_sizes.write[E->get().order] = _get_datatype_size(ShaderLanguage::TYPE_UINT); + uniform_alignments.write[E->get().order] = _get_datatype_alignment(ShaderLanguage::TYPE_UINT); + } else { + uniform_sizes.write[E->get().order] = _get_datatype_size(E->get().type); + uniform_alignments.write[E->get().order] = _get_datatype_alignment(E->get().type); + } } p_actions.uniforms->insert(E->key(), E->get()); @@ -547,18 +650,19 @@ String ShaderCompilerRD::_dump_node_code(const SL::Node *p_node, int p_level, Ge index++; } - for (Map<StringName, SL::ShaderNode::Constant>::Element *E = pnode->constants.front(); E; E = E->next()) { + for (int i = 0; i < pnode->vconstants.size(); i++) { + const SL::ShaderNode::Constant &cnode = pnode->vconstants[i]; String gcode; gcode += "const "; - gcode += _prestr(E->get().precision); - if (E->get().type == SL::TYPE_STRUCT) { - gcode += _mkid(E->get().type_str); + gcode += _prestr(cnode.precision); + if (cnode.type == SL::TYPE_STRUCT) { + gcode += _mkid(cnode.type_str); } else { - gcode += _typestr(E->get().type); + gcode += _typestr(cnode.type); } - gcode += " " + _mkid(E->key()); + gcode += " " + _mkid(String(cnode.name)); gcode += "="; - gcode += _dump_node_code(E->get().initializer, p_level, r_gen_code, p_actions, p_default_actions, p_assigning); + gcode += _dump_node_code(cnode.initializer, p_level, r_gen_code, p_actions, p_default_actions, p_assigning); gcode += ";\n"; r_gen_code.vertex_global += gcode; r_gen_code.fragment_global += gcode; @@ -690,9 +794,29 @@ String ShaderCompilerRD::_dump_node_code(const SL::Node *p_node, int p_level, Ge if (p_default_actions.renames.has(vnode->name)) code = p_default_actions.renames[vnode->name]; else { - code = _mkid(vnode->name); - if (actions.base_uniform_string != String() && shader->uniforms.has(vnode->name) && shader->uniforms[vnode->name].texture_order < 0) { - code = actions.base_uniform_string + code; + if (shader->uniforms.has(vnode->name)) { + //its a uniform! + const ShaderLanguage::ShaderNode::Uniform &u = shader->uniforms[vnode->name]; + if (u.texture_order >= 0) { + code = _mkid(vnode->name); //texture, use as is + } else { + //a scalar or vector + if (u.scope == ShaderLanguage::ShaderNode::Uniform::SCOPE_GLOBAL) { + code = actions.base_uniform_string + _mkid(vnode->name); //texture, use as is + //global variable, this means the code points to an index to the global table + code = _get_global_variable_from_type_and_index(p_default_actions.global_buffer_array_variable, code, u.type); + } else if (u.scope == ShaderLanguage::ShaderNode::Uniform::SCOPE_INSTANCE) { + //instance variable, index it as such + code = "(" + p_default_actions.instance_uniform_index_variable + "+" + itos(u.instance_index) + ")"; + code = _get_global_variable_from_type_and_index(p_default_actions.global_buffer_array_variable, code, u.type); + } else { + //regular uniform, index from UBO + code = actions.base_uniform_string + _mkid(vnode->name); + } + } + + } else { + code = _mkid(vnode->name); //its something else (local var most likely) use as is } } @@ -1037,9 +1161,14 @@ String ShaderCompilerRD::_dump_node_code(const SL::Node *p_node, int p_level, Ge return code; } +ShaderLanguage::DataType ShaderCompilerRD::_get_variable_type(const StringName &p_type) { + RS::GlobalVariableType gvt = ((RasterizerStorageRD *)(RasterizerStorage::base_singleton))->global_variable_get_type_internal(p_type); + return RS::global_variable_type_get_shader_datatype(gvt); +} + Error ShaderCompilerRD::compile(RS::ShaderMode p_mode, const String &p_code, IdentifierActions *p_actions, const String &p_path, GeneratedCode &r_gen_code) { - Error err = parser.compile(p_code, ShaderTypes::get_singleton()->get_functions(p_mode), ShaderTypes::get_singleton()->get_modes(p_mode), ShaderTypes::get_singleton()->get_types()); + Error err = parser.compile(p_code, ShaderTypes::get_singleton()->get_functions(p_mode), ShaderTypes::get_singleton()->get_modes(p_mode), ShaderTypes::get_singleton()->get_types(), _get_variable_type); if (err != OK) { @@ -1060,6 +1189,7 @@ Error ShaderCompilerRD::compile(RS::ShaderMode p_mode, const String &p_code, Ide r_gen_code.light = String(); r_gen_code.uses_fragment_time = false; r_gen_code.uses_vertex_time = false; + r_gen_code.uses_global_textures = false; used_name_defines.clear(); used_rmode_defines.clear(); diff --git a/servers/rendering/rasterizer_rd/shader_compiler_rd.h b/servers/rendering/rasterizer_rd/shader_compiler_rd.h index 7d78469e9c..16d53197a7 100644 --- a/servers/rendering/rasterizer_rd/shader_compiler_rd.h +++ b/servers/rendering/rasterizer_rd/shader_compiler_rd.h @@ -57,6 +57,7 @@ public: ShaderLanguage::ShaderNode::Uniform::Hint hint; ShaderLanguage::TextureFilter filter; ShaderLanguage::TextureRepeat repeat; + bool global; }; Vector<Texture> texture_uniforms; @@ -70,6 +71,7 @@ public: String fragment; String light; + bool uses_global_textures; bool uses_fragment_time; bool uses_vertex_time; }; @@ -86,6 +88,8 @@ public: int base_texture_binding_index = 0; int texture_layout_set = 0; String base_uniform_string; + String global_buffer_array_variable; + String instance_uniform_index_variable; uint32_t base_varying_index = 0; }; @@ -113,6 +117,8 @@ private: DefaultIdentifierActions actions; + static ShaderLanguage::DataType _get_variable_type(const StringName &p_type); + public: Error compile(RS::ShaderMode p_mode, const String &p_code, IdentifierActions *p_actions, const String &p_path, GeneratedCode &r_gen_code); diff --git a/servers/rendering/rasterizer_rd/shaders/SCsub b/servers/rendering/rasterizer_rd/shaders/SCsub index 04a43e3251..a454d144aa 100644 --- a/servers/rendering/rasterizer_rd/shaders/SCsub +++ b/servers/rendering/rasterizer_rd/shaders/SCsub @@ -5,14 +5,15 @@ Import("env") if "RD_GLSL" in env["BUILDERS"]: env.RD_GLSL("canvas.glsl") env.RD_GLSL("canvas_occlusion.glsl") - env.RD_GLSL("blur.glsl") + env.RD_GLSL("copy.glsl") + env.RD_GLSL("copy_to_fb.glsl") env.RD_GLSL("cubemap_roughness.glsl") env.RD_GLSL("cubemap_downsampler.glsl") env.RD_GLSL("cubemap_filter.glsl") env.RD_GLSL("scene_high_end.glsl") env.RD_GLSL("sky.glsl") env.RD_GLSL("tonemap.glsl") - env.RD_GLSL("copy.glsl") + env.RD_GLSL("cube_to_dp.glsl") env.RD_GLSL("giprobe.glsl") env.RD_GLSL("giprobe_debug.glsl") env.RD_GLSL("giprobe_sdf.glsl") diff --git a/servers/rendering/rasterizer_rd/shaders/blur.glsl b/servers/rendering/rasterizer_rd/shaders/blur.glsl deleted file mode 100644 index 87c20ebaef..0000000000 --- a/servers/rendering/rasterizer_rd/shaders/blur.glsl +++ /dev/null @@ -1,294 +0,0 @@ -/* clang-format off */ -[vertex] - -#version 450 - -VERSION_DEFINES - -#include "blur_inc.glsl" - -layout(location = 0) out vec2 uv_interp; -/* clang-format on */ - -void main() { - - vec2 base_arr[4] = vec2[](vec2(0.0, 0.0), vec2(0.0, 1.0), vec2(1.0, 1.0), vec2(1.0, 0.0)); - uv_interp = base_arr[gl_VertexIndex]; - - if (bool(blur.flags & FLAG_USE_BLUR_SECTION)) { - uv_interp = blur.section.xy + uv_interp * blur.section.zw; - } - - gl_Position = vec4(uv_interp * 2.0 - 1.0, 0.0, 1.0); - - if (bool(blur.flags & FLAG_FLIP_Y)) { - uv_interp.y = 1.0 - uv_interp.y; - } -} - -/* clang-format off */ -[fragment] - -#version 450 - -VERSION_DEFINES - -#include "blur_inc.glsl" - -layout(location = 0) in vec2 uv_interp; -/* clang-format on */ - -layout(set = 0, binding = 0) uniform sampler2D source_color; - -#ifdef MODE_SSAO_MERGE -layout(set = 1, binding = 0) uniform sampler2D source_ssao; -#endif - -#ifdef GLOW_USE_AUTO_EXPOSURE -layout(set = 1, binding = 0) uniform sampler2D source_auto_exposure; -#endif - -layout(location = 0) out vec4 frag_color; - -//DOF -#if defined(MODE_DOF_FAR_BLUR) || defined(MODE_DOF_NEAR_BLUR) - -layout(set = 1, binding = 0) uniform sampler2D dof_source_depth; - -#ifdef DOF_NEAR_BLUR_MERGE -layout(set = 2, binding = 0) uniform sampler2D source_dof_original; -#endif - -#ifdef DOF_QUALITY_LOW -const int dof_kernel_size = 5; -const int dof_kernel_from = 2; -const float dof_kernel[5] = float[](0.153388, 0.221461, 0.250301, 0.221461, 0.153388); -#endif - -#ifdef DOF_QUALITY_MEDIUM -const int dof_kernel_size = 11; -const int dof_kernel_from = 5; -const float dof_kernel[11] = float[](0.055037, 0.072806, 0.090506, 0.105726, 0.116061, 0.119726, 0.116061, 0.105726, 0.090506, 0.072806, 0.055037); - -#endif - -#ifdef DOF_QUALITY_HIGH -const int dof_kernel_size = 21; -const int dof_kernel_from = 10; -const float dof_kernel[21] = float[](0.028174, 0.032676, 0.037311, 0.041944, 0.046421, 0.050582, 0.054261, 0.057307, 0.059587, 0.060998, 0.061476, 0.060998, 0.059587, 0.057307, 0.054261, 0.050582, 0.046421, 0.041944, 0.037311, 0.032676, 0.028174); -#endif - -#endif - -void main() { - -#ifdef MODE_MIPMAP - - vec2 pix_size = blur.pixel_size; - vec4 color = texture(source_color, uv_interp + vec2(-0.5, -0.5) * pix_size); - color += texture(source_color, uv_interp + vec2(0.5, -0.5) * pix_size); - color += texture(source_color, uv_interp + vec2(0.5, 0.5) * pix_size); - color += texture(source_color, uv_interp + vec2(-0.5, 0.5) * pix_size); - frag_color = color / 4.0; - -#endif - -#ifdef MODE_GAUSSIAN_BLUR - - //Simpler blur uses SIGMA2 for the gaussian kernel for a stronger effect - - if (bool(blur.flags & FLAG_HORIZONTAL)) { - - vec2 pix_size = blur.pixel_size; - pix_size *= 0.5; //reading from larger buffer, so use more samples - vec4 color = texture(source_color, uv_interp + vec2(0.0, 0.0) * pix_size) * 0.214607; - color += texture(source_color, uv_interp + vec2(1.0, 0.0) * pix_size) * 0.189879; - color += texture(source_color, uv_interp + vec2(2.0, 0.0) * pix_size) * 0.131514; - color += texture(source_color, uv_interp + vec2(3.0, 0.0) * pix_size) * 0.071303; - color += texture(source_color, uv_interp + vec2(-1.0, 0.0) * pix_size) * 0.189879; - color += texture(source_color, uv_interp + vec2(-2.0, 0.0) * pix_size) * 0.131514; - color += texture(source_color, uv_interp + vec2(-3.0, 0.0) * pix_size) * 0.071303; - frag_color = color; - } else { - - vec2 pix_size = blur.pixel_size; - vec4 color = texture(source_color, uv_interp + vec2(0.0, 0.0) * pix_size) * 0.38774; - color += texture(source_color, uv_interp + vec2(0.0, 1.0) * pix_size) * 0.24477; - color += texture(source_color, uv_interp + vec2(0.0, 2.0) * pix_size) * 0.06136; - color += texture(source_color, uv_interp + vec2(0.0, -1.0) * pix_size) * 0.24477; - color += texture(source_color, uv_interp + vec2(0.0, -2.0) * pix_size) * 0.06136; - frag_color = color; - } -#endif - -#ifdef MODE_GAUSSIAN_GLOW - - //Glow uses larger sigma 1 for a more rounded blur effect - -#define GLOW_ADD(m_ofs, m_mult) \ - { \ - vec2 ofs = uv_interp + m_ofs * pix_size; \ - vec4 c = texture(source_color, ofs) * m_mult; \ - if (any(lessThan(ofs, vec2(0.0))) || any(greaterThan(ofs, vec2(1.0)))) { \ - c *= 0.0; \ - } \ - color += c; \ - } - - if (bool(blur.flags & FLAG_HORIZONTAL)) { - - vec2 pix_size = blur.pixel_size; - pix_size *= 0.5; //reading from larger buffer, so use more samples - vec4 color = texture(source_color, uv_interp + vec2(0.0, 0.0) * pix_size) * 0.174938; - GLOW_ADD(vec2(1.0, 0.0), 0.165569); - GLOW_ADD(vec2(2.0, 0.0), 0.140367); - GLOW_ADD(vec2(3.0, 0.0), 0.106595); - GLOW_ADD(vec2(-1.0, 0.0), 0.165569); - GLOW_ADD(vec2(-2.0, 0.0), 0.140367); - GLOW_ADD(vec2(-3.0, 0.0), 0.106595); - color *= blur.glow_strength; - frag_color = color; - } else { - - vec2 pix_size = blur.pixel_size; - vec4 color = texture(source_color, uv_interp + vec2(0.0, 0.0) * pix_size) * 0.288713; - GLOW_ADD(vec2(0.0, 1.0), 0.233062); - GLOW_ADD(vec2(0.0, 2.0), 0.122581); - GLOW_ADD(vec2(0.0, -1.0), 0.233062); - GLOW_ADD(vec2(0.0, -2.0), 0.122581); - color *= blur.glow_strength; - frag_color = color; - } - -#undef GLOW_ADD - - if (bool(blur.flags & FLAG_GLOW_FIRST_PASS)) { -#ifdef GLOW_USE_AUTO_EXPOSURE - - frag_color /= texelFetch(source_auto_exposure, ivec2(0, 0), 0).r / blur.glow_auto_exposure_grey; -#endif - frag_color *= blur.glow_exposure; - - float luminance = max(frag_color.r, max(frag_color.g, frag_color.b)); - float feedback = max(smoothstep(blur.glow_hdr_threshold, blur.glow_hdr_threshold + blur.glow_hdr_scale, luminance), blur.glow_bloom); - - frag_color = min(frag_color * feedback, vec4(blur.glow_luminance_cap)); - } - -#endif - -#ifdef MODE_DOF_FAR_BLUR - - vec4 color_accum = vec4(0.0); - - float depth = texture(dof_source_depth, uv_interp, 0.0).r; - depth = depth * 2.0 - 1.0; - - if (bool(blur.flags & FLAG_USE_ORTHOGONAL_PROJECTION)) { - depth = ((depth + (blur.camera_z_far + blur.camera_z_near) / (blur.camera_z_far - blur.camera_z_near)) * (blur.camera_z_far - blur.camera_z_near)) / 2.0; - } else { - depth = 2.0 * blur.camera_z_near * blur.camera_z_far / (blur.camera_z_far + blur.camera_z_near - depth * (blur.camera_z_far - blur.camera_z_near)); - } - - float amount = smoothstep(blur.dof_begin, blur.dof_end, depth); - float k_accum = 0.0; - - for (int i = 0; i < dof_kernel_size; i++) { - - int int_ofs = i - dof_kernel_from; - vec2 tap_uv = uv_interp + blur.dof_dir * float(int_ofs) * amount * blur.dof_radius; - - float tap_k = dof_kernel[i]; - - float tap_depth = texture(dof_source_depth, tap_uv, 0.0).r; - tap_depth = tap_depth * 2.0 - 1.0; - - if (bool(blur.flags & FLAG_USE_ORTHOGONAL_PROJECTION)) { - - tap_depth = ((tap_depth + (blur.camera_z_far + blur.camera_z_near) / (blur.camera_z_far - blur.camera_z_near)) * (blur.camera_z_far - blur.camera_z_near)) / 2.0; - } else { - tap_depth = 2.0 * blur.camera_z_near * blur.camera_z_far / (blur.camera_z_far + blur.camera_z_near - tap_depth * (blur.camera_z_far - blur.camera_z_near)); - } - - float tap_amount = mix(smoothstep(blur.dof_begin, blur.dof_end, tap_depth), 1.0, int_ofs == 0); - tap_amount *= tap_amount * tap_amount; //prevent undesired glow effect - - vec4 tap_color = texture(source_color, tap_uv, 0.0) * tap_k; - - k_accum += tap_k * tap_amount; - color_accum += tap_color * tap_amount; - } - - if (k_accum > 0.0) { - color_accum /= k_accum; - } - - frag_color = color_accum; ///k_accum; - -#endif - -#ifdef MODE_DOF_NEAR_BLUR - - vec4 color_accum = vec4(0.0); - - float max_accum = 0.0; - - for (int i = 0; i < dof_kernel_size; i++) { - - int int_ofs = i - dof_kernel_from; - vec2 tap_uv = uv_interp + blur.dof_dir * float(int_ofs) * blur.dof_radius; - float ofs_influence = max(0.0, 1.0 - float(abs(int_ofs)) / float(dof_kernel_from)); - - float tap_k = dof_kernel[i]; - - vec4 tap_color = texture(source_color, tap_uv, 0.0); - - float tap_depth = texture(dof_source_depth, tap_uv, 0.0).r; - tap_depth = tap_depth * 2.0 - 1.0; - if (bool(blur.flags & FLAG_USE_ORTHOGONAL_PROJECTION)) { - - tap_depth = ((tap_depth + (blur.camera_z_far + blur.camera_z_near) / (blur.camera_z_far - blur.camera_z_near)) * (blur.camera_z_far - blur.camera_z_near)) / 2.0; - } else { - tap_depth = 2.0 * blur.camera_z_near * blur.camera_z_far / (blur.camera_z_far + blur.camera_z_near - tap_depth * (blur.camera_z_far - blur.camera_z_near)); - } - float tap_amount = 1.0 - smoothstep(blur.dof_end, blur.dof_begin, tap_depth); - tap_amount *= tap_amount * tap_amount; //prevent undesired glow effect - - if (bool(blur.flags & FLAG_DOF_NEAR_FIRST_TAP)) { - tap_color.a = 1.0 - smoothstep(blur.dof_end, blur.dof_begin, tap_depth); - } - - max_accum = max(max_accum, tap_amount * ofs_influence); - - color_accum += tap_color * tap_k; - } - - color_accum.a = max(color_accum.a, sqrt(max_accum)); - -#ifdef DOF_NEAR_BLUR_MERGE - { - vec4 original = texture(source_dof_original, uv_interp, 0.0); - color_accum = mix(original, color_accum, color_accum.a); - } -#endif - - if (bool(blur.flags & FLAG_DOF_NEAR_FIRST_TAP)) { - frag_color = color_accum; - } -#endif - -#ifdef MODE_SIMPLE_COPY - vec4 color = texture(source_color, uv_interp, 0.0); - if (bool(blur.flags & FLAG_COPY_FORCE_LUMINANCE)) { - color.rgb = vec3(max(max(color.r, color.g), color.b)); - } - frag_color = color; -#endif - -#ifdef MODE_SSAO_MERGE - vec4 color = texture(source_color, uv_interp, 0.0); - float ssao = texture(source_ssao, uv_interp, 0.0).r; - frag_color = vec4(mix(color.rgb, color.rgb * mix(blur.ssao_color.rgb, vec3(1.0), ssao), color.a), 1.0); - -#endif -} diff --git a/servers/rendering/rasterizer_rd/shaders/blur_inc.glsl b/servers/rendering/rasterizer_rd/shaders/blur_inc.glsl deleted file mode 100644 index 33ba9de7bb..0000000000 --- a/servers/rendering/rasterizer_rd/shaders/blur_inc.glsl +++ /dev/null @@ -1,35 +0,0 @@ -#define FLAG_HORIZONTAL (1 << 0) -#define FLAG_USE_BLUR_SECTION (1 << 1) -#define FLAG_USE_ORTHOGONAL_PROJECTION (1 << 2) -#define FLAG_DOF_NEAR_FIRST_TAP (1 << 3) -#define FLAG_GLOW_FIRST_PASS (1 << 4) -#define FLAG_FLIP_Y (1 << 5) -#define FLAG_COPY_FORCE_LUMINANCE (1 << 6) - -layout(push_constant, binding = 1, std430) uniform Blur { - vec4 section; - vec2 pixel_size; - uint flags; - uint pad; - // Glow. - float glow_strength; - float glow_bloom; - float glow_hdr_threshold; - float glow_hdr_scale; - float glow_exposure; - float glow_white; - float glow_luminance_cap; - float glow_auto_exposure_grey; - // DOF. - float dof_begin; - float dof_end; - float dof_radius; - float dof_pad; - - vec2 dof_dir; - float camera_z_far; - float camera_z_near; - - vec4 ssao_color; -} -blur; diff --git a/servers/rendering/rasterizer_rd/shaders/canvas_uniforms_inc.glsl b/servers/rendering/rasterizer_rd/shaders/canvas_uniforms_inc.glsl index 1ac43480cd..a39866004b 100644 --- a/servers/rendering/rasterizer_rd/shaders/canvas_uniforms_inc.glsl +++ b/servers/rendering/rasterizer_rd/shaders/canvas_uniforms_inc.glsl @@ -132,6 +132,11 @@ layout(set = 2, binding = 6) uniform sampler shadow_sampler; #endif +layout(set = 2, binding = 7, std430) restrict readonly buffer GlobalVariableData { + vec4 data[]; +} +global_variables; + /* SET3: Render Target Data */ #ifdef SCREEN_TEXTURE_USED diff --git a/servers/rendering/rasterizer_rd/shaders/copy.glsl b/servers/rendering/rasterizer_rd/shaders/copy.glsl index cbb9b546a3..2d7661f65f 100644 --- a/servers/rendering/rasterizer_rd/shaders/copy.glsl +++ b/servers/rendering/rasterizer_rd/shaders/copy.glsl @@ -1,86 +1,220 @@ /* clang-format off */ -[vertex] +[compute] #version 450 VERSION_DEFINES -layout(location = 0) out vec2 uv_interp; +layout(local_size_x = 8, local_size_y = 8, local_size_z = 1) in; /* clang-format on */ -void main() { +#define FLAG_HORIZONTAL (1 << 0) +#define FLAG_USE_BLUR_SECTION (1 << 1) +#define FLAG_USE_ORTHOGONAL_PROJECTION (1 << 2) +#define FLAG_DOF_NEAR_FIRST_TAP (1 << 3) +#define FLAG_GLOW_FIRST_PASS (1 << 4) +#define FLAG_FLIP_Y (1 << 5) +#define FLAG_FORCE_LUMINANCE (1 << 6) +#define FLAG_COPY_ALL_SOURCE (1 << 7) + +layout(push_constant, binding = 1, std430) uniform Params { + ivec4 section; + ivec2 target; + uint flags; + uint pad; + // Glow. + float glow_strength; + float glow_bloom; + float glow_hdr_threshold; + float glow_hdr_scale; + + float glow_exposure; + float glow_white; + float glow_luminance_cap; + float glow_auto_exposure_grey; + // DOF. + float camera_z_far; + float camera_z_near; + uint pad2[2]; +} +params; - vec2 base_arr[4] = vec2[](vec2(0.0, 0.0), vec2(0.0, 1.0), vec2(1.0, 1.0), vec2(1.0, 0.0)); - uv_interp = base_arr[gl_VertexIndex]; +layout(set = 0, binding = 0) uniform sampler2D source_color; - gl_Position = vec4(uv_interp * 2.0 - 1.0, 0.0, 1.0); -} +#ifdef GLOW_USE_AUTO_EXPOSURE +layout(set = 1, binding = 0) uniform sampler2D source_auto_exposure; +#endif -/* clang-format off */ -[fragment] +#if defined(MODE_LINEARIZE_DEPTH_COPY) || defined(MODE_SIMPLE_COPY_DEPTH) +layout(r32f, set = 3, binding = 0) uniform restrict writeonly image2D dest_buffer; +#elif defined(DST_IMAGE_8BIT) +layout(rgba8, set = 3, binding = 0) uniform restrict writeonly image2D dest_buffer; +#else +layout(rgba32f, set = 3, binding = 0) uniform restrict writeonly image2D dest_buffer; +#endif -#version 450 +void main() { -VERSION_DEFINES + // Pixel being shaded + ivec2 pos = ivec2(gl_GlobalInvocationID.xy); + if (any(greaterThan(pos, params.section.zw))) { //too large, do nothing + return; + } -layout(location = 0) in vec2 uv_interp; -/* clang-format on */ +#ifdef MODE_MIPMAP + + ivec2 base_pos = (pos + params.section.xy) << 1; + vec4 color = texelFetch(source_color, base_pos, 0); + color += texelFetch(source_color, base_pos + ivec2(0, 1), 0); + color += texelFetch(source_color, base_pos + ivec2(1, 0), 0); + color += texelFetch(source_color, base_pos + ivec2(1, 1), 0); + color /= 4.0; -#ifdef MODE_CUBE_TO_DP + imageStore(dest_buffer, pos + params.target, color); +#endif -layout(set = 0, binding = 0) uniform samplerCube source_cube; +#ifdef MODE_GAUSSIAN_BLUR -layout(push_constant, binding = 0, std430) uniform Params { - float bias; - float z_far; - float z_near; - bool z_flip; -} -params; + //Simpler blur uses SIGMA2 for the gaussian kernel for a stronger effect -layout(location = 0) out float depth_buffer; + if (bool(params.flags & FLAG_HORIZONTAL)) { + ivec2 base_pos = (pos + params.section.xy) << 1; + vec4 color = texelFetch(source_color, base_pos + ivec2(0, 0), 0) * 0.214607; + color += texelFetch(source_color, base_pos + ivec2(1, 0), 0) * 0.189879; + color += texelFetch(source_color, base_pos + ivec2(2, 0), 0) * 0.131514; + color += texelFetch(source_color, base_pos + ivec2(3, 0), 0) * 0.071303; + color += texelFetch(source_color, base_pos + ivec2(-1, 0), 0) * 0.189879; + color += texelFetch(source_color, base_pos + ivec2(-2, 0), 0) * 0.131514; + color += texelFetch(source_color, base_pos + ivec2(-3, 0), 0) * 0.071303; + imageStore(dest_buffer, pos + params.target, color); + } else { + + ivec2 base_pos = (pos + params.section.xy); + vec4 color = texelFetch(source_color, base_pos + ivec2(0, 0), 0) * 0.38774; + color += texelFetch(source_color, base_pos + ivec2(0, 1), 0) * 0.24477; + color += texelFetch(source_color, base_pos + ivec2(0, 2), 0) * 0.06136; + color += texelFetch(source_color, base_pos + ivec2(0, -1), 0) * 0.24477; + color += texelFetch(source_color, base_pos + ivec2(0, -2), 0) * 0.06136; + imageStore(dest_buffer, pos + params.target, color); + } #endif -void main() { +#ifdef MODE_GAUSSIAN_GLOW -#ifdef MODE_CUBE_TO_DP + //Glow uses larger sigma 1 for a more rounded blur effect - vec3 normal = vec3(uv_interp * 2.0 - 1.0, 0.0); +#define GLOW_ADD(m_ofs, m_mult) \ + { \ + ivec2 ofs = base_pos + m_ofs; \ + if (all(greaterThanEqual(ofs, section_begin)) && all(lessThan(ofs, section_end))) { \ + color += texelFetch(source_color, ofs, 0) * m_mult; \ + } \ + } + + vec4 color = vec4(0.0); + + if (bool(params.flags & FLAG_HORIZONTAL)) { + + ivec2 base_pos = (pos + params.section.xy) << 1; + ivec2 section_begin = params.section.xy << 1; + ivec2 section_end = section_begin + (params.section.zw << 1); + + GLOW_ADD(ivec2(0, 0), 0.174938); + GLOW_ADD(ivec2(1, 0), 0.165569); + GLOW_ADD(ivec2(2, 0), 0.140367); + GLOW_ADD(ivec2(3, 0), 0.106595); + GLOW_ADD(ivec2(-1, 0), 0.165569); + GLOW_ADD(ivec2(-2, 0), 0.140367); + GLOW_ADD(ivec2(-3, 0), 0.106595); + color *= params.glow_strength; + } else { - normal.z = 0.5 - 0.5 * ((normal.x * normal.x) + (normal.y * normal.y)); - normal = normalize(normal); + ivec2 base_pos = pos + params.section.xy; + ivec2 section_begin = params.section.xy; + ivec2 section_end = section_begin + params.section.zw; - normal.y = -normal.y; //needs to be flipped to match projection matrix - if (!params.z_flip) { - normal.z = -normal.z; + GLOW_ADD(ivec2(0, 0), 0.288713); + GLOW_ADD(ivec2(0, 1), 0.233062); + GLOW_ADD(ivec2(0, 2), 0.122581); + GLOW_ADD(ivec2(0, -1), 0.233062); + GLOW_ADD(ivec2(0, -2), 0.122581); + color *= params.glow_strength; } - float depth = texture(source_cube, normal).r; +#undef GLOW_ADD - // absolute values for direction cosines, bigger value equals closer to basis axis - vec3 unorm = abs(normal); + if (bool(params.flags & FLAG_GLOW_FIRST_PASS)) { +#ifdef GLOW_USE_AUTO_EXPOSURE + + color /= texelFetch(source_auto_exposure, ivec2(0, 0), 0).r / params.glow_auto_exposure_grey; +#endif + color *= params.glow_exposure; + + float luminance = max(color.r, max(color.g, color.b)); + float feedback = max(smoothstep(params.glow_hdr_threshold, params.glow_hdr_threshold + params.glow_hdr_scale, luminance), params.glow_bloom); + + color = min(color * feedback, vec4(params.glow_luminance_cap)); + } + + imageStore(dest_buffer, pos + params.target, color); + +#endif + +#ifdef MODE_SIMPLE_COPY + + vec4 color; + if (bool(params.flags & FLAG_COPY_ALL_SOURCE)) { + vec2 uv = vec2(pos) / vec2(params.section.zw); + if (bool(params.flags & FLAG_FLIP_Y)) { + uv.y = 1.0 - uv.y; + } + color = textureLod(source_color, uv, 0.0); + + if (bool(params.flags & FLAG_FORCE_LUMINANCE)) { + color.rgb = vec3(max(max(color.r, color.g), color.b)); + } + imageStore(dest_buffer, pos + params.target, color); - if ((unorm.x >= unorm.y) && (unorm.x >= unorm.z)) { - // x code - unorm = normal.x > 0.0 ? vec3(1.0, 0.0, 0.0) : vec3(-1.0, 0.0, 0.0); - } else if ((unorm.y > unorm.x) && (unorm.y >= unorm.z)) { - // y code - unorm = normal.y > 0.0 ? vec3(0.0, 1.0, 0.0) : vec3(0.0, -1.0, 0.0); - } else if ((unorm.z > unorm.x) && (unorm.z > unorm.y)) { - // z code - unorm = normal.z > 0.0 ? vec3(0.0, 0.0, 1.0) : vec3(0.0, 0.0, -1.0); } else { - // oh-no we messed up code - // has to be - unorm = vec3(1.0, 0.0, 0.0); + color = texelFetch(source_color, pos + params.section.xy, 0); + + if (bool(params.flags & FLAG_FORCE_LUMINANCE)) { + color.rgb = vec3(max(max(color.r, color.g), color.b)); + } + + if (bool(params.flags & FLAG_FLIP_Y)) { + pos.y = params.section.w - pos.y - 1; + } + + imageStore(dest_buffer, pos + params.target, color); + } + +#endif + +#ifdef MODE_SIMPLE_COPY_DEPTH + + vec4 color = texelFetch(source_color, pos + params.section.xy, 0); + + if (bool(params.flags & FLAG_FLIP_Y)) { + pos.y = params.section.w - pos.y - 1; } - float depth_fix = 1.0 / dot(normal, unorm); + imageStore(dest_buffer, pos + params.target, vec4(color.r)); + +#endif + +#ifdef MODE_LINEARIZE_DEPTH_COPY + + float depth = texelFetch(source_color, pos + params.section.xy, 0).r; + depth = depth * 2.0 - 1.0; + depth = 2.0 * params.camera_z_near * params.camera_z_far / (params.camera_z_far + params.camera_z_near - depth * (params.camera_z_far - params.camera_z_near)); + vec4 color = vec4(depth / params.camera_z_far); - depth = 2.0 * depth - 1.0; - float linear_depth = 2.0 * params.z_near * params.z_far / (params.z_far + params.z_near - depth * (params.z_far - params.z_near)); - depth_buffer = (linear_depth * depth_fix + params.bias) / params.z_far; + if (bool(params.flags & FLAG_FLIP_Y)) { + pos.y = params.section.w - pos.y - 1; + } + imageStore(dest_buffer, pos + params.target, color); #endif } diff --git a/servers/rendering/rasterizer_rd/shaders/copy_to_fb.glsl b/servers/rendering/rasterizer_rd/shaders/copy_to_fb.glsl new file mode 100644 index 0000000000..07f8d09743 --- /dev/null +++ b/servers/rendering/rasterizer_rd/shaders/copy_to_fb.glsl @@ -0,0 +1,104 @@ +/* clang-format off */ +[vertex] + +#version 450 + +VERSION_DEFINES + +layout(location = 0) out vec2 uv_interp; +/* clang-format on */ + +layout(push_constant, binding = 1, std430) uniform Params { + vec4 section; + vec2 pixel_size; + bool flip_y; + bool use_section; + + bool force_luminance; + uint pad[3]; +} +params; + +void main() { + + vec2 base_arr[4] = vec2[](vec2(0.0, 0.0), vec2(0.0, 1.0), vec2(1.0, 1.0), vec2(1.0, 0.0)); + uv_interp = base_arr[gl_VertexIndex]; + + vec2 vpos = uv_interp; + if (params.use_section) { + vpos = params.section.xy + vpos * params.section.zw; + } + + gl_Position = vec4(vpos * 2.0 - 1.0, 0.0, 1.0); + + if (params.flip_y) { + uv_interp.y = 1.0 - uv_interp.y; + } +} + +/* clang-format off */ +[fragment] + +#version 450 + +VERSION_DEFINES + +layout(push_constant, binding = 1, std430) uniform Params { + vec4 section; + vec2 pixel_size; + bool flip_y; + bool use_section; + + bool force_luminance; + bool alpha_to_zero; + uint pad[2]; +} params; + + +layout(location = 0) in vec2 uv_interp; +/* clang-format on */ + +layout(set = 0, binding = 0) uniform sampler2D source_color; + +layout(location = 0) out vec4 frag_color; + +void main() { + + vec2 uv = uv_interp; + +#ifdef MODE_PANORAMA_TO_DP + + //obtain normal from dual paraboloid uv +#define M_PI 3.14159265359 + + float side; + uv.y = modf(uv.y * 2.0, side); + side = side * 2.0 - 1.0; + vec3 normal = vec3(uv * 2.0 - 1.0, 0.0); + normal.z = 0.5 - 0.5 * ((normal.x * normal.x) + (normal.y * normal.y)); + normal *= -side; + normal = normalize(normal); + + //now convert normal to panorama uv + + vec2 st = vec2(atan(normal.x, normal.z), acos(normal.y)); + + if (st.x < 0.0) + st.x += M_PI * 2.0; + + uv = st / vec2(M_PI * 2.0, M_PI); + + if (side < 0.0) { + //uv.y = 1.0 - uv.y; + uv = 1.0 - uv; + } +#endif + vec4 color = textureLod(source_color, uv, 0.0); + if (params.force_luminance) { + color.rgb = vec3(max(max(color.r, color.g), color.b)); + } + if (params.alpha_to_zero) { + color.rgb *= color.a; + } + frag_color = color; +} diff --git a/servers/rendering/rasterizer_rd/shaders/cube_to_dp.glsl b/servers/rendering/rasterizer_rd/shaders/cube_to_dp.glsl new file mode 100644 index 0000000000..02ebe1a53b --- /dev/null +++ b/servers/rendering/rasterizer_rd/shaders/cube_to_dp.glsl @@ -0,0 +1,72 @@ +/* clang-format off */ +[compute] + +#version 450 + +VERSION_DEFINES + +layout(local_size_x = 8, local_size_y = 8, local_size_z = 1) in; +/* clang-format on */ + +layout(set = 0, binding = 0) uniform samplerCube source_cube; + +layout(push_constant, binding = 1, std430) uniform Params { + ivec2 screen_size; + ivec2 offset; + float bias; + float z_far; + float z_near; + bool z_flip; +} +params; + +layout(r32f, set = 1, binding = 0) uniform restrict writeonly image2D depth_buffer; + +void main() { + + ivec2 pos = ivec2(gl_GlobalInvocationID.xy); + if (any(greaterThan(pos, params.screen_size))) { //too large, do nothing + return; + } + + vec2 pixel_size = 1.0 / vec2(params.screen_size); + vec2 uv = (vec2(pos) + 0.5) * pixel_size; + + vec3 normal = vec3(uv * 2.0 - 1.0, 0.0); + + normal.z = 0.5 - 0.5 * ((normal.x * normal.x) + (normal.y * normal.y)); + normal = normalize(normal); + + normal.y = -normal.y; //needs to be flipped to match projection matrix + if (!params.z_flip) { + normal.z = -normal.z; + } + + float depth = texture(source_cube, normal).r; + + // absolute values for direction cosines, bigger value equals closer to basis axis + vec3 unorm = abs(normal); + + if ((unorm.x >= unorm.y) && (unorm.x >= unorm.z)) { + // x code + unorm = normal.x > 0.0 ? vec3(1.0, 0.0, 0.0) : vec3(-1.0, 0.0, 0.0); + } else if ((unorm.y > unorm.x) && (unorm.y >= unorm.z)) { + // y code + unorm = normal.y > 0.0 ? vec3(0.0, 1.0, 0.0) : vec3(0.0, -1.0, 0.0); + } else if ((unorm.z > unorm.x) && (unorm.z > unorm.y)) { + // z code + unorm = normal.z > 0.0 ? vec3(0.0, 0.0, 1.0) : vec3(0.0, 0.0, -1.0); + } else { + // oh-no we messed up code + // has to be + unorm = vec3(1.0, 0.0, 0.0); + } + + float depth_fix = 1.0 / dot(normal, unorm); + + depth = 2.0 * depth - 1.0; + float linear_depth = 2.0 * params.z_near * params.z_far / (params.z_far + params.z_near - depth * (params.z_far - params.z_near)); + depth = (linear_depth * depth_fix) / params.z_far; + + imageStore(depth_buffer, pos + params.offset, vec4(depth)); +} diff --git a/servers/rendering/rasterizer_rd/shaders/scene_high_end.glsl b/servers/rendering/rasterizer_rd/shaders/scene_high_end.glsl index 955ae2e588..ec47887036 100644 --- a/servers/rendering/rasterizer_rd/shaders/scene_high_end.glsl +++ b/servers/rendering/rasterizer_rd/shaders/scene_high_end.glsl @@ -20,9 +20,7 @@ layout(location = 2) in vec4 tangent_attrib; layout(location = 3) in vec4 color_attrib; #endif -#if defined(UV_USED) layout(location = 4) in vec2 uv_attrib; -#endif #if defined(UV2_USED) || defined(USE_LIGHTMAP) layout(location = 5) in vec2 uv2_attrib; @@ -39,9 +37,7 @@ layout(location = 1) out vec3 normal_interp; layout(location = 2) out vec4 color_interp; #endif -#if defined(UV_USED) layout(location = 3) out vec2 uv_interp; -#endif #if defined(UV2_USED) || defined(USE_LIGHTMAP) layout(location = 4) out vec2 uv2_interp; @@ -157,9 +153,7 @@ void main() { #endif } -#if defined(UV_USED) uv_interp = uv_attrib; -#endif #if defined(UV2_USED) || defined(USE_LIGHTMAP) uv2_interp = uv2_attrib; @@ -244,19 +238,13 @@ VERTEX_SHADER_CODE //for dual paraboloid shadow mapping, this is the fastest but least correct way, as it curves straight edges - vec3 vtx = vertex_interp + normalize(vertex_interp) * scene_data.z_offset; + vec3 vtx = vertex_interp; float distance = length(vtx); vtx = normalize(vtx); vtx.xy /= 1.0 - vtx.z; vtx.z = (distance / scene_data.z_far); vtx.z = vtx.z * 2.0 - 1.0; - vertex_interp = vtx; -#else - - float z_ofs = scene_data.z_offset; - z_ofs += max(0.0, 1.0 - abs(normalize(normal_interp).z)) * scene_data.z_slope_scale; - vertex_interp.z -= z_ofs; #endif @@ -267,6 +255,14 @@ VERTEX_SHADER_CODE #else gl_Position = projection_matrix * vec4(vertex_interp, 1.0); #endif + +#ifdef MODE_RENDER_DEPTH + if (scene_data.pancake_shadows) { + if (gl_Position.z <= 0.00001) { + gl_Position.z = 0.00001; + } + } +#endif } /* clang-format off */ @@ -288,9 +284,7 @@ layout(location = 1) in vec3 normal_interp; layout(location = 2) in vec4 color_interp; #endif -#if defined(UV_USED) layout(location = 3) in vec2 uv_interp; -#endif #if defined(UV2_USED) || defined(USE_LIGHTMAP) layout(location = 4) in vec2 uv2_interp; @@ -315,6 +309,11 @@ layout(location = 8) in float dp_clip; #define world_normal_matrix instances.data[instance_index].normal_transform #define projection_matrix scene_data.projection_matrix +#if defined(ENABLE_SSS) && defined(ENABLE_TRANSMITTANCE) +//both required for transmittance to be enabled +#define LIGHT_TRANSMITTANCE_USED +#endif + #ifdef USE_MATERIAL_UNIFORMS layout(set = 5, binding = 0, std140) uniform MaterialUniforms{ /* clang-format off */ @@ -434,9 +433,16 @@ vec3 F0(float metallic, float specular, vec3 albedo) { return mix(vec3(dielectric), albedo, vec3(metallic)); } -void light_compute(vec3 N, vec3 L, vec3 V, vec3 light_color, vec3 attenuation, vec3 diffuse_color, float roughness, float metallic, float specular, float specular_blob_intensity, -#ifdef LIGHT_TRANSMISSION_USED - vec3 transmission, +void light_compute(vec3 N, vec3 L, vec3 V, float A, vec3 light_color, float attenuation, vec3 shadow_attenuation, vec3 diffuse_color, float roughness, float metallic, float specular, float specular_blob_intensity, +#ifdef LIGHT_BACKLIGHT_USED + vec3 backlight, +#endif +#ifdef LIGHT_TRANSMITTANCE_USED + vec4 transmittance_color, + float transmittance_depth, + float transmittance_curve, + float transmittance_boost, + float transmittance_z, #endif #ifdef LIGHT_RIM_USED float rim, float rim_tint, @@ -467,7 +473,7 @@ LIGHT_SHADER_CODE /* clang-format on */ #else - float NdotL = dot(N, L); + float NdotL = min(A + dot(N, L), 1.0); float cNdotL = max(NdotL, 0.0); // clamped NdotL float NdotV = dot(N, V); float cNdotV = max(NdotV, 0.0); @@ -477,11 +483,11 @@ LIGHT_SHADER_CODE #endif #if defined(SPECULAR_BLINN) || defined(SPECULAR_SCHLICK_GGX) || defined(LIGHT_CLEARCOAT_USED) - float cNdotH = max(dot(N, H), 0.0); + float cNdotH = clamp(A + dot(N, H), 0.0, 1.0); #endif #if defined(DIFFUSE_BURLEY) || defined(SPECULAR_SCHLICK_GGX) || defined(LIGHT_CLEARCOAT_USED) - float cLdotH = max(dot(L, H), 0.0); + float cLdotH = clamp(A + dot(L, H), 0.0, 1.0); #endif if (metallic < 1.0) { @@ -538,16 +544,48 @@ LIGHT_SHADER_CODE diffuse_brdf_NL = cNdotL * (1.0 / M_PI); #endif - diffuse_light += light_color * diffuse_color * diffuse_brdf_NL * attenuation; + diffuse_light += light_color * diffuse_color * shadow_attenuation * diffuse_brdf_NL * attenuation; -#if defined(LIGHT_TRANSMISSION_USED) - diffuse_light += light_color * diffuse_color * (vec3(1.0 / M_PI) - diffuse_brdf_NL) * transmission * attenuation; +#if defined(LIGHT_BACKLIGHT_USED) + diffuse_light += light_color * diffuse_color * (vec3(1.0 / M_PI) - diffuse_brdf_NL) * backlight * attenuation; #endif #if defined(LIGHT_RIM_USED) float rim_light = pow(max(0.0, 1.0 - cNdotV), max(0.0, (1.0 - roughness) * 16.0)); diffuse_light += rim_light * rim * mix(vec3(1.0), diffuse_color, rim_tint) * light_color; #endif + +#ifdef LIGHT_TRANSMITTANCE_USED + +#ifdef SSS_MODE_SKIN + + { + float scale = 8.25 / transmittance_depth; + float d = scale * abs(transmittance_z); + float dd = -d * d; + vec3 profile = vec3(0.233, 0.455, 0.649) * exp(dd / 0.0064) + + vec3(0.1, 0.336, 0.344) * exp(dd / 0.0484) + + vec3(0.118, 0.198, 0.0) * exp(dd / 0.187) + + vec3(0.113, 0.007, 0.007) * exp(dd / 0.567) + + vec3(0.358, 0.004, 0.0) * exp(dd / 1.99) + + vec3(0.078, 0.0, 0.0) * exp(dd / 7.41); + + diffuse_light += profile * transmittance_color.a * diffuse_color * light_color * clamp(transmittance_boost - NdotL, 0.0, 1.0) * (1.0 / M_PI) * attenuation; + } +#else + + if (transmittance_depth > 0.0) { + float fade = clamp(abs(transmittance_z / transmittance_depth), 0.0, 1.0); + + fade = pow(max(0.0, 1.0 - fade), transmittance_curve); + fade *= clamp(transmittance_boost - NdotL, 0.0, 1.0); + + diffuse_light += diffuse_color * transmittance_color.rgb * light_color * (1.0 / M_PI) * transmittance_color.a * fade * attenuation; + } + +#endif //SSS_MODE_SKIN + +#endif //LIGHT_TRANSMITTANCE_USED } if (roughness > 0.0) { // FIXME: roughness == 0 should not disable specular light entirely @@ -562,18 +600,18 @@ LIGHT_SHADER_CODE blinn *= (shininess + 8.0) * (1.0 / (8.0 * M_PI)); float intensity = blinn; - specular_light += light_color * intensity * specular_blob_intensity * attenuation; + specular_light += light_color * shadow_attenuation * intensity * specular_blob_intensity * attenuation; #elif defined(SPECULAR_PHONG) vec3 R = normalize(-reflect(L, N)); - float cRdotV = max(0.0, dot(R, V)); + float cRdotV = clamp(A + dot(R, V), 0.0, 1.0); float shininess = exp2(15.0 * (1.0 - roughness) + 1.0) * 0.25; float phong = pow(cRdotV, shininess); phong *= (shininess + 8.0) * (1.0 / (8.0 * M_PI)); float intensity = (phong) / max(4.0 * cNdotV * cNdotL, 0.75); - specular_light += light_color * intensity * specular_blob_intensity * attenuation; + specular_light += light_color * shadow_attenuation * intensity * specular_blob_intensity * attenuation; #elif defined(SPECULAR_TOON) @@ -582,7 +620,7 @@ LIGHT_SHADER_CODE float mid = 1.0 - roughness; mid *= mid; float intensity = smoothstep(mid - roughness * 0.5, mid + roughness * 0.5, RdotV) * mid; - diffuse_light += light_color * intensity * specular_blob_intensity * attenuation; // write to diffuse_light, as in toon shading you generally want no reflection + diffuse_light += light_color * shadow_attenuation * intensity * specular_blob_intensity * attenuation; // write to diffuse_light, as in toon shading you generally want no reflection #elif defined(SPECULAR_DISABLED) // none.. @@ -613,7 +651,7 @@ LIGHT_SHADER_CODE vec3 specular_brdf_NL = cNdotL * D * F * G; - specular_light += specular_brdf_NL * light_color * specular_blob_intensity * attenuation; + specular_light += specular_brdf_NL * light_color * shadow_attenuation * specular_blob_intensity * attenuation; #endif #if defined(LIGHT_CLEARCOAT_USED) @@ -627,12 +665,12 @@ LIGHT_SHADER_CODE float clearcoat_specular_brdf_NL = 0.25 * clearcoat * Gr * Fr * Dr * cNdotL; - specular_light += clearcoat_specular_brdf_NL * light_color * specular_blob_intensity * attenuation; + specular_light += clearcoat_specular_brdf_NL * light_color * shadow_attenuation * specular_blob_intensity * attenuation; #endif } #ifdef USE_SHADOW_TO_OPACITY - alpha = min(alpha, clamp(1.0 - length(attenuation), 0.0, 1.0)); + alpha = min(alpha, clamp(1.0 - length(shadow_attenuation * attenuation), 0.0, 1.0)); #endif #endif //defined(USE_LIGHT_SHADER_CODE) @@ -640,53 +678,121 @@ LIGHT_SHADER_CODE #ifndef USE_NO_SHADOWS -float sample_shadow(texture2D shadow, vec2 shadow_pixel_size, vec4 coord) { +// Produces cheap but low-quality white noise, nothing special +float quick_hash(vec2 pos) { + return fract(sin(dot(pos * 19.19, vec2(49.5791, 97.413))) * 49831.189237); +} + +float sample_directional_pcf_shadow(texture2D shadow, vec2 shadow_pixel_size, vec4 coord) { - //todo optimize vec2 pos = coord.xy; float depth = coord.z; -#ifdef SHADOW_MODE_PCF_13 + //if only one sample is taken, take it from the center + if (scene_data.directional_soft_shadow_samples == 1) { + return textureProj(sampler2DShadow(shadow, shadow_sampler), vec4(pos, depth, 1.0)); + } - float avg = textureProj(shadow, vec4(pos, depth, 1.0)); - avg += textureProj(sampler2DShadow(shadow, shadow_sampler), vec4(pos + vec2(shadow_pixel_size.x, 0.0), depth, 1.0)); - avg += textureProj(sampler2DShadow(shadow, shadow_sampler), vec4(pos + vec2(-shadow_pixel_size.x, 0.0), depth, 1.0)); - avg += textureProj(sampler2DShadow(shadow, shadow_sampler), vec4(pos + vec2(0.0, shadow_pixel_size.y), depth, 1.0)); - avg += textureProj(sampler2DShadow(shadow, shadow_sampler), vec4(pos + vec2(0.0, -shadow_pixel_size.y), depth, 1.0)); - avg += textureProj(sampler2DShadow(shadow, shadow_sampler), vec4(pos + vec2(shadow_pixel_size.x, shadow_pixel_size.y), depth, 1.0)); - avg += textureProj(sampler2DShadow(shadow, shadow_sampler), vec4(pos + vec2(-shadow_pixel_size.x, shadow_pixel_size.y), depth, 1.0)); - avg += textureProj(sampler2DShadow(shadow, shadow_sampler), vec4(pos + vec2(shadow_pixel_size.x, -shadow_pixel_size.y), depth, 1.0)); - avg += textureProj(sampler2DShadow(shadow, shadow_sampler), vec4(pos + vec2(-shadow_pixel_size.x, -shadow_pixel_size.y), depth, 1.0)); - avg += textureProj(sampler2DShadow(shadow, shadow_sampler), vec4(pos + vec2(shadow_pixel_size.x * 2.0, 0.0), depth, 1.0)); - avg += textureProj(sampler2DShadow(shadow, shadow_sampler), vec4(pos + vec2(-shadow_pixel_size.x * 2.0, 0.0), depth, 1.0)); - avg += textureProj(sampler2DShadow(shadow, shadow_sampler), vec4(pos + vec2(0.0, shadow_pixel_size.y * 2.0), depth, 1.0)); - avg += textureProj(sampler2DShadow(shadow, shadow_sampler), vec4(pos + vec2(0.0, -shadow_pixel_size.y * 2.0), depth, 1.0)); - return avg * (1.0 / 13.0); -#endif + mat2 disk_rotation; + { + float r = quick_hash(gl_FragCoord.xy) * 2.0 * M_PI; + float sr = sin(r); + float cr = cos(r); + disk_rotation = mat2(vec2(cr, -sr), vec2(sr, cr)); + } -#ifdef SHADOW_MODE_PCF_5 + float avg = 0.0; - float avg = textureProj(sampler2DShadow(shadow, shadow_sampler), vec4(pos, depth, 1.0)); - avg += textureProj(sampler2DShadow(shadow, shadow_sampler), vec4(pos + vec2(shadow_pixel_size.x, 0.0), depth, 1.0)); - avg += textureProj(sampler2DShadow(shadow, shadow_sampler), vec4(pos + vec2(-shadow_pixel_size.x, 0.0), depth, 1.0)); - avg += textureProj(sampler2DShadow(shadow, shadow_sampler), vec4(pos + vec2(0.0, shadow_pixel_size.y), depth, 1.0)); - avg += textureProj(sampler2DShadow(shadow, shadow_sampler), vec4(pos + vec2(0.0, -shadow_pixel_size.y), depth, 1.0)); - return avg * (1.0 / 5.0); + for (uint i = 0; i < scene_data.directional_soft_shadow_samples; i++) { + avg += textureProj(sampler2DShadow(shadow, shadow_sampler), vec4(pos + shadow_pixel_size * (disk_rotation * scene_data.directional_soft_shadow_kernel[i].xy), depth, 1.0)); + } -#endif + return avg * (1.0 / float(scene_data.directional_soft_shadow_samples)); +} -#if !defined(SHADOW_MODE_PCF_5) || !defined(SHADOW_MODE_PCF_13) +float sample_pcf_shadow(texture2D shadow, vec2 shadow_pixel_size, vec4 coord) { - return textureProj(sampler2DShadow(shadow, shadow_sampler), vec4(pos, depth, 1.0)); + vec2 pos = coord.xy; + float depth = coord.z; -#endif + //if only one sample is taken, take it from the center + if (scene_data.soft_shadow_samples == 1) { + return textureProj(sampler2DShadow(shadow, shadow_sampler), vec4(pos, depth, 1.0)); + } + + mat2 disk_rotation; + { + float r = quick_hash(gl_FragCoord.xy) * 2.0 * M_PI; + float sr = sin(r); + float cr = cos(r); + disk_rotation = mat2(vec2(cr, -sr), vec2(sr, cr)); + } + + float avg = 0.0; + + for (uint i = 0; i < scene_data.soft_shadow_samples; i++) { + avg += textureProj(sampler2DShadow(shadow, shadow_sampler), vec4(pos + shadow_pixel_size * (disk_rotation * scene_data.soft_shadow_kernel[i].xy), depth, 1.0)); + } + + return avg * (1.0 / float(scene_data.soft_shadow_samples)); +} + +float sample_directional_soft_shadow(texture2D shadow, vec3 pssm_coord, vec2 tex_scale) { + + //find blocker + float blocker_count = 0.0; + float blocker_average = 0.0; + + mat2 disk_rotation; + { + float r = quick_hash(gl_FragCoord.xy) * 2.0 * M_PI; + float sr = sin(r); + float cr = cos(r); + disk_rotation = mat2(vec2(cr, -sr), vec2(sr, cr)); + } + + for (uint i = 0; i < scene_data.directional_penumbra_shadow_samples; i++) { + + vec2 suv = pssm_coord.xy + (disk_rotation * scene_data.directional_penumbra_shadow_kernel[i].xy) * tex_scale; + float d = textureLod(sampler2D(shadow, material_samplers[SAMPLER_LINEAR_CLAMP]), suv, 0.0).r; + if (d < pssm_coord.z) { + blocker_average += d; + blocker_count += 1.0; + } + } + + if (blocker_count > 0.0) { + + //blockers found, do soft shadow + blocker_average /= blocker_count; + float penumbra = (pssm_coord.z - blocker_average) / blocker_average; + tex_scale *= penumbra; + + float s = 0.0; + for (uint i = 0; i < scene_data.directional_penumbra_shadow_samples; i++) { + vec2 suv = pssm_coord.xy + (disk_rotation * scene_data.directional_penumbra_shadow_kernel[i].xy) * tex_scale; + s += textureProj(sampler2DShadow(shadow, shadow_sampler), vec4(suv, pssm_coord.z, 1.0)); + } + + return s / float(scene_data.directional_penumbra_shadow_samples); + + } else { + //no blockers found, so no shadow + return 1.0; + } } #endif //USE_NO_SHADOWS -void light_process_omni(uint idx, vec3 vertex, vec3 eye_vec, vec3 normal, vec3 albedo, float roughness, float metallic, float specular, float p_blob_intensity, -#ifdef LIGHT_TRANSMISSION_USED - vec3 transmission, +void light_process_omni(uint idx, vec3 vertex, vec3 eye_vec, vec3 normal, vec3 vertex_ddx, vec3 vertex_ddy, vec3 albedo, float roughness, float metallic, float specular, float p_blob_intensity, +#ifdef LIGHT_BACKLIGHT_USED + vec3 backlight, +#endif +#ifdef LIGHT_TRANSMITTANCE_USED + vec4 transmittance_color, + float transmittance_depth, + float transmittance_curve, + float transmittance_boost, #endif #ifdef LIGHT_RIM_USED float rim, float rim_tint, @@ -707,45 +813,269 @@ void light_process_omni(uint idx, vec3 vertex, vec3 eye_vec, vec3 normal, vec3 a float normalized_distance = light_length * lights.data[idx].inv_radius; vec2 attenuation_energy = unpackHalf2x16(lights.data[idx].attenuation_energy); float omni_attenuation = pow(max(1.0 - normalized_distance, 0.0), attenuation_energy.x); - vec3 light_attenuation = vec3(omni_attenuation); + float light_attenuation = omni_attenuation; + vec3 shadow_attenuation = vec3(1.0); vec4 color_specular = unpackUnorm4x8(lights.data[idx].color_specular); color_specular.rgb *= attenuation_energy.y; + float size_A = 0.0; + + if (lights.data[idx].size > 0.0) { + + float t = lights.data[idx].size / max(0.001, light_length); + size_A = max(0.0, 1.0 - 1 / sqrt(1 + t * t)); + } + +#ifdef LIGHT_TRANSMITTANCE_USED + float transmittance_z = transmittance_depth; //no transmittance by default +#endif #ifndef USE_NO_SHADOWS vec4 shadow_color_enabled = unpackUnorm4x8(lights.data[idx].shadow_color_enabled); if (shadow_color_enabled.w > 0.5) { // there is a shadowmap - vec4 splane = (lights.data[idx].shadow_matrix * vec4(vertex, 1.0)); - float shadow_len = length(splane); - splane = normalize(splane); - vec4 clamp_rect = lights.data[idx].atlas_rect; + vec4 v = vec4(vertex, 1.0); + + vec4 splane = (lights.data[idx].shadow_matrix * v); + float shadow_len = length(splane.xyz); //need to remember shadow len from here - if (splane.z >= 0.0) { + { + vec3 nofs = normal_interp * lights.data[idx].shadow_normal_bias / lights.data[idx].inv_radius; + nofs *= (1.0 - max(0.0, dot(normalize(light_rel_vec), normalize(normal_interp)))); + v.xyz += nofs; + splane = (lights.data[idx].shadow_matrix * v); + } - splane.z += 1.0; + float shadow; - clamp_rect.y += clamp_rect.w; + if (lights.data[idx].soft_shadow_size > 0.0) { + //soft shadow + + //find blocker + + float blocker_count = 0.0; + float blocker_average = 0.0; + + mat2 disk_rotation; + { + float r = quick_hash(gl_FragCoord.xy) * 2.0 * M_PI; + float sr = sin(r); + float cr = cos(r); + disk_rotation = mat2(vec2(cr, -sr), vec2(sr, cr)); + } + vec3 normal = normalize(splane.xyz); + vec3 v0 = abs(normal.z) < 0.999 ? vec3(0.0, 0.0, 1.0) : vec3(0.0, 1.0, 0.0); + vec3 tangent = normalize(cross(v0, normal)); + vec3 bitangent = normalize(cross(tangent, normal)); + float z_norm = shadow_len * lights.data[idx].inv_radius; + + tangent *= lights.data[idx].soft_shadow_size * lights.data[idx].soft_shadow_scale; + bitangent *= lights.data[idx].soft_shadow_size * lights.data[idx].soft_shadow_scale; + + for (uint i = 0; i < scene_data.penumbra_shadow_samples; i++) { + + vec2 disk = disk_rotation * scene_data.penumbra_shadow_kernel[i].xy; + + vec3 pos = splane.xyz + tangent * disk.x + bitangent * disk.y; + + pos = normalize(pos); + vec4 uv_rect = lights.data[idx].atlas_rect; + + if (pos.z >= 0.0) { + + pos.z += 1.0; + uv_rect.y += uv_rect.w; + } else { + + pos.z = 1.0 - pos.z; + } + + pos.xy /= pos.z; + + pos.xy = pos.xy * 0.5 + 0.5; + pos.xy = uv_rect.xy + pos.xy * uv_rect.zw; + + float d = textureLod(sampler2D(shadow_atlas, material_samplers[SAMPLER_LINEAR_CLAMP]), pos.xy, 0.0).r; + if (d < z_norm) { + blocker_average += d; + blocker_count += 1.0; + } + } + + if (blocker_count > 0.0) { + + //blockers found, do soft shadow + blocker_average /= blocker_count; + float penumbra = (z_norm - blocker_average) / blocker_average; + tangent *= penumbra; + bitangent *= penumbra; + + z_norm -= lights.data[idx].inv_radius * lights.data[idx].shadow_bias; + + shadow = 0.0; + for (uint i = 0; i < scene_data.penumbra_shadow_samples; i++) { + + vec2 disk = disk_rotation * scene_data.penumbra_shadow_kernel[i].xy; + vec3 pos = splane.xyz + tangent * disk.x + bitangent * disk.y; + + pos = normalize(pos); + vec4 uv_rect = lights.data[idx].atlas_rect; + + if (pos.z >= 0.0) { + + pos.z += 1.0; + uv_rect.y += uv_rect.w; + } else { + + pos.z = 1.0 - pos.z; + } + + pos.xy /= pos.z; + + pos.xy = pos.xy * 0.5 + 0.5; + pos.xy = uv_rect.xy + pos.xy * uv_rect.zw; + shadow += textureProj(sampler2DShadow(shadow_atlas, shadow_sampler), vec4(pos.xy, z_norm, 1.0)); + } + + shadow /= float(scene_data.penumbra_shadow_samples); + + } else { + //no blockers found, so no shadow + shadow = 1.0; + } } else { - splane.z = 1.0 - splane.z; + splane.xyz = normalize(splane.xyz); + vec4 clamp_rect = lights.data[idx].atlas_rect; + + if (splane.z >= 0.0) { + + splane.z += 1.0; + + clamp_rect.y += clamp_rect.w; + + } else { + splane.z = 1.0 - splane.z; + } + + splane.xy /= splane.z; + + splane.xy = splane.xy * 0.5 + 0.5; + splane.z = (shadow_len - lights.data[idx].shadow_bias) * lights.data[idx].inv_radius; + splane.xy = clamp_rect.xy + splane.xy * clamp_rect.zw; + splane.w = 1.0; //needed? i think it should be 1 already + shadow = sample_pcf_shadow(shadow_atlas, lights.data[idx].soft_shadow_scale * scene_data.shadow_atlas_pixel_size, splane); + } + +#ifdef LIGHT_TRANSMITTANCE_USED + { + + vec4 clamp_rect = lights.data[idx].atlas_rect; + + //redo shadowmapping, but shrink the model a bit to avoid arctifacts + splane = (lights.data[idx].shadow_matrix * vec4(vertex - normalize(normal_interp) * lights.data[idx].transmittance_bias, 1.0)); + + shadow_len = length(splane.xyz); + splane = normalize(splane.xyz); + + if (splane.z >= 0.0) { + + splane.z += 1.0; + + } else { + + splane.z = 1.0 - splane.z; + } + + splane.xy /= splane.z; + splane.xy = splane.xy * 0.5 + 0.5; + splane.z = shadow_len * lights.data[idx].inv_radius; + splane.xy = clamp_rect.xy + splane.xy * clamp_rect.zw; + splane.w = 1.0; //needed? i think it should be 1 already + + float shadow_z = textureLod(sampler2D(shadow_atlas, material_samplers[SAMPLER_LINEAR_CLAMP]), splane.xy, 0.0).r; + transmittance_z = (splane.z - shadow_z) / lights.data[idx].inv_radius; } +#endif + + vec3 no_shadow = vec3(1.0); + + if (lights.data[idx].projector_rect != vec4(0.0)) { + + vec3 local_v = (lights.data[idx].shadow_matrix * vec4(vertex, 1.0)).xyz; + local_v = normalize(local_v); - splane.xy /= splane.z; - splane.xy = splane.xy * 0.5 + 0.5; - splane.z = shadow_len * lights.data[idx].inv_radius; - splane.xy = clamp_rect.xy + splane.xy * clamp_rect.zw; - splane.w = 1.0; //needed? i think it should be 1 already - float shadow = sample_shadow(shadow_atlas, scene_data.shadow_atlas_pixel_size, splane); + vec4 atlas_rect = lights.data[idx].projector_rect; - light_attenuation *= mix(shadow_color_enabled.rgb, vec3(1.0), shadow); + if (local_v.z >= 0.0) { + + local_v.z += 1.0; + atlas_rect.y += atlas_rect.w; + + } else { + + local_v.z = 1.0 - local_v.z; + } + + local_v.xy /= local_v.z; + local_v.xy = local_v.xy * 0.5 + 0.5; + vec2 proj_uv = local_v.xy * atlas_rect.zw; + + vec2 proj_uv_ddx; + vec2 proj_uv_ddy; + { + vec3 local_v_ddx = (lights.data[idx].shadow_matrix * vec4(vertex + vertex_ddx, 1.0)).xyz; + local_v_ddx = normalize(local_v_ddx); + + if (local_v_ddx.z >= 0.0) { + + local_v_ddx.z += 1.0; + } else { + + local_v_ddx.z = 1.0 - local_v_ddx.z; + } + + local_v_ddx.xy /= local_v_ddx.z; + local_v_ddx.xy = local_v_ddx.xy * 0.5 + 0.5; + + proj_uv_ddx = local_v_ddx.xy * atlas_rect.zw - proj_uv; + + vec3 local_v_ddy = (lights.data[idx].shadow_matrix * vec4(vertex + vertex_ddy, 1.0)).xyz; + local_v_ddy = normalize(local_v_ddy); + + if (local_v_ddy.z >= 0.0) { + + local_v_ddy.z += 1.0; + } else { + + local_v_ddy.z = 1.0 - local_v_ddy.z; + } + + local_v_ddy.xy /= local_v_ddy.z; + local_v_ddy.xy = local_v_ddy.xy * 0.5 + 0.5; + + proj_uv_ddy = local_v_ddy.xy * atlas_rect.zw - proj_uv; + } + + vec4 proj = textureGrad(sampler2D(decal_atlas_srgb, material_samplers[SAMPLER_LINEAR_WITH_MIPMAPS_CLAMP]), proj_uv + atlas_rect.xy, proj_uv_ddx, proj_uv_ddy); + no_shadow = mix(no_shadow, proj.rgb, proj.a); + } + + shadow_attenuation = mix(shadow_color_enabled.rgb, no_shadow, shadow); } #endif //USE_NO_SHADOWS - light_compute(normal, normalize(light_rel_vec), eye_vec, color_specular.rgb, light_attenuation, albedo, roughness, metallic, specular, color_specular.a * p_blob_intensity, -#ifdef LIGHT_TRANSMISSION_USED - transmission, + light_compute(normal, normalize(light_rel_vec), eye_vec, size_A, color_specular.rgb, light_attenuation, shadow_attenuation, albedo, roughness, metallic, specular, color_specular.a * p_blob_intensity, +#ifdef LIGHT_BACKLIGHT_USED + backlight, +#endif +#ifdef LIGHT_TRANSMITTANCE_USED + transmittance_color, + transmittance_depth, + transmittance_curve, + transmittance_boost, + transmittance_z, #endif #ifdef LIGHT_RIM_USED rim * omni_attenuation, rim_tint, @@ -763,9 +1093,15 @@ void light_process_omni(uint idx, vec3 vertex, vec3 eye_vec, vec3 normal, vec3 a specular_light); } -void light_process_spot(uint idx, vec3 vertex, vec3 eye_vec, vec3 normal, vec3 albedo, float roughness, float metallic, float specular, float p_blob_intensity, -#ifdef LIGHT_TRANSMISSION_USED - vec3 transmission, +void light_process_spot(uint idx, vec3 vertex, vec3 eye_vec, vec3 normal, vec3 vertex_ddx, vec3 vertex_ddy, vec3 albedo, float roughness, float metallic, float specular, float p_blob_intensity, +#ifdef LIGHT_BACKLIGHT_USED + vec3 backlight, +#endif +#ifdef LIGHT_TRANSMITTANCE_USED + vec4 transmittance_color, + float transmittance_depth, + float transmittance_curve, + float transmittance_boost, #endif #ifdef LIGHT_RIM_USED float rim, float rim_tint, @@ -792,31 +1128,162 @@ void light_process_spot(uint idx, vec3 vertex, vec3 eye_vec, vec3 normal, vec3 a float scos = max(dot(-normalize(light_rel_vec), spot_dir), spot_att_angle.y); float spot_rim = max(0.0001, (1.0 - scos) / (1.0 - spot_att_angle.y)); spot_attenuation *= 1.0 - pow(spot_rim, spot_att_angle.x); - vec3 light_attenuation = vec3(spot_attenuation); + float light_attenuation = spot_attenuation; + vec3 shadow_attenuation = vec3(1.0); vec4 color_specular = unpackUnorm4x8(lights.data[idx].color_specular); color_specular.rgb *= attenuation_energy.y; + float size_A = 0.0; + + if (lights.data[idx].size > 0.0) { + + float t = lights.data[idx].size / max(0.001, light_length); + size_A = max(0.0, 1.0 - 1 / sqrt(1 + t * t)); + } /* if (lights.data[idx].atlas_rect!=vec4(0.0)) { //use projector texture } */ +#ifdef LIGHT_TRANSMITTANCE_USED + float transmittance_z = transmittance_depth; +#endif + #ifndef USE_NO_SHADOWS vec4 shadow_color_enabled = unpackUnorm4x8(lights.data[idx].shadow_color_enabled); if (shadow_color_enabled.w > 0.5) { //there is a shadowmap - vec4 splane = (lights.data[idx].shadow_matrix * vec4(vertex, 1.0)); + vec4 v = vec4(vertex, 1.0); + + v.xyz -= spot_dir * lights.data[idx].shadow_bias; + + float z_norm = dot(spot_dir, -light_rel_vec) * lights.data[idx].inv_radius; + + float depth_bias_scale = 1.0 / (max(0.0001, z_norm)); //the closer to the light origin, the more you have to offset to reach 1px in the map + vec3 normal_bias = normalize(normal_interp) * (1.0 - max(0.0, dot(spot_dir, -normalize(normal_interp)))) * lights.data[idx].shadow_normal_bias * depth_bias_scale; + normal_bias -= spot_dir * dot(spot_dir, normal_bias); //only XY, no Z + v.xyz += normal_bias; + + //adjust with bias + z_norm = dot(spot_dir, v.xyz - lights.data[idx].position) * lights.data[idx].inv_radius; + + float shadow; + + vec4 splane = (lights.data[idx].shadow_matrix * v); splane /= splane.w; - float shadow = sample_shadow(shadow_atlas, scene_data.shadow_atlas_pixel_size, splane); - light_attenuation *= mix(shadow_color_enabled.rgb, vec3(1.0), shadow); + if (lights.data[idx].soft_shadow_size > 0.0) { + //soft shadow + + //find blocker + + vec2 shadow_uv = splane.xy * lights.data[idx].atlas_rect.zw + lights.data[idx].atlas_rect.xy; + + float blocker_count = 0.0; + float blocker_average = 0.0; + + mat2 disk_rotation; + { + float r = quick_hash(gl_FragCoord.xy) * 2.0 * M_PI; + float sr = sin(r); + float cr = cos(r); + disk_rotation = mat2(vec2(cr, -sr), vec2(sr, cr)); + } + + float uv_size = lights.data[idx].soft_shadow_size * z_norm * lights.data[idx].soft_shadow_scale; + vec2 clamp_max = lights.data[idx].atlas_rect.xy + lights.data[idx].atlas_rect.zw; + for (uint i = 0; i < scene_data.penumbra_shadow_samples; i++) { + + vec2 suv = shadow_uv + (disk_rotation * scene_data.penumbra_shadow_kernel[i].xy) * uv_size; + suv = clamp(suv, lights.data[idx].atlas_rect.xy, clamp_max); + float d = textureLod(sampler2D(shadow_atlas, material_samplers[SAMPLER_LINEAR_CLAMP]), suv, 0.0).r; + if (d < z_norm) { + blocker_average += d; + blocker_count += 1.0; + } + } + + if (blocker_count > 0.0) { + + //blockers found, do soft shadow + blocker_average /= blocker_count; + float penumbra = (z_norm - blocker_average) / blocker_average; + uv_size *= penumbra; + + shadow = 0.0; + for (uint i = 0; i < scene_data.penumbra_shadow_samples; i++) { + vec2 suv = shadow_uv + (disk_rotation * scene_data.penumbra_shadow_kernel[i].xy) * uv_size; + suv = clamp(suv, lights.data[idx].atlas_rect.xy, clamp_max); + shadow += textureProj(sampler2DShadow(shadow_atlas, shadow_sampler), vec4(suv, z_norm, 1.0)); + } + + shadow /= float(scene_data.penumbra_shadow_samples); + + } else { + //no blockers found, so no shadow + shadow = 1.0; + } + + } else { + //hard shadow + vec4 shadow_uv = vec4(splane.xy * lights.data[idx].atlas_rect.zw + lights.data[idx].atlas_rect.xy, z_norm, 1.0); + + shadow = sample_pcf_shadow(shadow_atlas, lights.data[idx].soft_shadow_scale * scene_data.shadow_atlas_pixel_size, shadow_uv); + } + + vec3 no_shadow = vec3(1.0); + + if (lights.data[idx].projector_rect != vec4(0.0)) { + + splane = (lights.data[idx].shadow_matrix * vec4(vertex, 1.0)); + splane /= splane.w; + + vec2 proj_uv = splane.xy * lights.data[idx].projector_rect.zw; + + //ensure we have proper mipmaps + vec4 splane_ddx = (lights.data[idx].shadow_matrix * vec4(vertex + vertex_ddx, 1.0)); + splane_ddx /= splane_ddx.w; + vec2 proj_uv_ddx = splane_ddx.xy * lights.data[idx].projector_rect.zw - proj_uv; + + vec4 splane_ddy = (lights.data[idx].shadow_matrix * vec4(vertex + vertex_ddy, 1.0)); + splane_ddy /= splane_ddy.w; + vec2 proj_uv_ddy = splane_ddy.xy * lights.data[idx].projector_rect.zw - proj_uv; + + vec4 proj = textureGrad(sampler2D(decal_atlas_srgb, material_samplers[SAMPLER_LINEAR_WITH_MIPMAPS_CLAMP]), proj_uv + lights.data[idx].projector_rect.xy, proj_uv_ddx, proj_uv_ddy); + no_shadow = mix(no_shadow, proj.rgb, proj.a); + } + + shadow_attenuation = mix(shadow_color_enabled.rgb, no_shadow, shadow); + +#ifdef LIGHT_TRANSMITTANCE_USED + { + + splane = (lights.data[idx].shadow_matrix * vec4(vertex - normalize(normal_interp) * lights.data[idx].transmittance_bias, 1.0)); + splane /= splane.w; + splane.xy = splane.xy * lights.data[idx].atlas_rect.zw + lights.data[idx].atlas_rect.xy; + + float shadow_z = textureLod(sampler2D(shadow_atlas, material_samplers[SAMPLER_LINEAR_CLAMP]), splane.xy, 0.0).r; + //reconstruct depth + shadow_z / lights.data[idx].inv_radius; + //distance to light plane + float z = dot(spot_dir, -light_rel_vec); + transmittance_z = z - shadow_z; + } +#endif //LIGHT_TRANSMITTANCE_USED } #endif //USE_NO_SHADOWS - light_compute(normal, normalize(light_rel_vec), eye_vec, color_specular.rgb, light_attenuation, albedo, roughness, metallic, specular, color_specular.a * p_blob_intensity, -#ifdef LIGHT_TRANSMISSION_USED - transmission, + light_compute(normal, normalize(light_rel_vec), eye_vec, size_A, color_specular.rgb, light_attenuation, shadow_attenuation, albedo, roughness, metallic, specular, color_specular.a * p_blob_intensity, +#ifdef LIGHT_BACKLIGHT_USED + backlight, +#endif +#ifdef LIGHT_TRANSMITTANCE_USED + transmittance_color, + transmittance_depth, + transmittance_curve, + transmittance_boost, + transmittance_z, #endif #ifdef LIGHT_RIM_USED rim * spot_attenuation, rim_tint, @@ -1185,7 +1652,11 @@ void main() { vec3 vertex = vertex_interp; vec3 view = -normalize(vertex_interp); vec3 albedo = vec3(1.0); - vec3 transmission = vec3(0.0); + vec3 backlight = vec3(0.0); + vec4 transmittance_color = vec4(0.0); + float transmittance_depth = 0.0; + float transmittance_curve = 1.0; + float transmittance_boost = 0.0; float metallic = 0.0; float specular = 0.5; vec3 emission = vec3(0.0); @@ -1223,9 +1694,7 @@ void main() { } #endif -#if defined(UV_USED) vec2 uv = uv_interp; -#endif #if defined(UV2_USED) || defined(USE_LIGHTMAP) vec2 uv2 = uv2_interp; @@ -1254,6 +1723,14 @@ FRAGMENT_SHADER_CODE /* clang-format on */ } +#if defined(LIGHT_TRANSMITTANCE_USED) +#ifdef SSS_MODE_SKIN + transmittance_color.a = sss_strength; +#else + transmittance_color.a *= sss_strength; +#endif +#endif + #if !defined(USE_SHADOW_TO_OPACITY) #if defined(ALPHA_SCISSOR_USED) @@ -1299,7 +1776,81 @@ FRAGMENT_SHADER_CODE discard; } #endif + /////////////////////// DECALS //////////////////////////////// + +#ifndef MODE_RENDER_DEPTH + + uvec4 cluster_cell = texture(usampler3D(cluster_texture, material_samplers[SAMPLER_NEAREST_CLAMP]), vec3(screen_uv, (abs(vertex.z) - scene_data.z_near) / (scene_data.z_far - scene_data.z_near))); + //used for interpolating anything cluster related + vec3 vertex_ddx = dFdx(vertex); + vec3 vertex_ddy = dFdy(vertex); + + { // process decals + + uint decal_count = cluster_cell.w >> CLUSTER_COUNTER_SHIFT; + uint decal_pointer = cluster_cell.w & CLUSTER_POINTER_MASK; + + //do outside for performance and avoiding arctifacts + + for (uint i = 0; i < decal_count; i++) { + + uint decal_index = cluster_data.indices[decal_pointer + i]; + if (!bool(decals.data[decal_index].mask & instances.data[instance_index].layer_mask)) { + continue; //not masked + } + + vec3 uv_local = (decals.data[decal_index].xform * vec4(vertex, 1.0)).xyz; + if (any(lessThan(uv_local, vec3(0.0, -1.0, 0.0))) || any(greaterThan(uv_local, vec3(1.0)))) { + continue; //out of decal + } + + //we need ddx/ddy for mipmaps, so simulate them + vec2 ddx = (decals.data[decal_index].xform * vec4(vertex_ddx, 0.0)).xz; + vec2 ddy = (decals.data[decal_index].xform * vec4(vertex_ddy, 0.0)).xz; + + float fade = pow(1.0 - (uv_local.y > 0.0 ? uv_local.y : -uv_local.y), uv_local.y > 0.0 ? decals.data[decal_index].upper_fade : decals.data[decal_index].lower_fade); + + if (decals.data[decal_index].normal_fade > 0.0) { + fade *= smoothstep(decals.data[decal_index].normal_fade, 1.0, dot(normal_interp, decals.data[decal_index].normal) * 0.5 + 0.5); + } + + if (decals.data[decal_index].albedo_rect != vec4(0.0)) { + //has albedo + vec4 decal_albedo = textureGrad(sampler2D(decal_atlas_srgb, material_samplers[SAMPLER_LINEAR_WITH_MIPMAPS_CLAMP]), uv_local.xz * decals.data[decal_index].albedo_rect.zw + decals.data[decal_index].albedo_rect.xy, ddx * decals.data[decal_index].albedo_rect.zw, ddy * decals.data[decal_index].albedo_rect.zw); + decal_albedo *= decals.data[decal_index].modulate; + decal_albedo.a *= fade; + albedo = mix(albedo, decal_albedo.rgb, decal_albedo.a * decals.data[decal_index].albedo_mix); + + if (decals.data[decal_index].normal_rect != vec4(0.0)) { + + vec3 decal_normal = textureGrad(sampler2D(decal_atlas, material_samplers[SAMPLER_LINEAR_WITH_MIPMAPS_CLAMP]), uv_local.xz * decals.data[decal_index].normal_rect.zw + decals.data[decal_index].normal_rect.xy, ddx * decals.data[decal_index].normal_rect.zw, ddy * decals.data[decal_index].normal_rect.zw).xyz; + decal_normal.xy = decal_normal.xy * vec2(2.0, -2.0) - vec2(1.0, -1.0); //users prefer flipped y normal maps in most authoring software + decal_normal.z = sqrt(max(0.0, 1.0 - dot(decal_normal.xy, decal_normal.xy))); + //convert to view space, use xzy because y is up + decal_normal = (decals.data[decal_index].normal_xform * decal_normal.xzy).xyz; + + normal = normalize(mix(normal, decal_normal, decal_albedo.a)); + } + + if (decals.data[decal_index].orm_rect != vec4(0.0)) { + + vec3 decal_orm = textureGrad(sampler2D(decal_atlas, material_samplers[SAMPLER_LINEAR_WITH_MIPMAPS_CLAMP]), uv_local.xz * decals.data[decal_index].orm_rect.zw + decals.data[decal_index].orm_rect.xy, ddx * decals.data[decal_index].orm_rect.zw, ddy * decals.data[decal_index].orm_rect.zw).xyz; +#if defined(AO_USED) + ao = mix(ao, decal_orm.r, decal_albedo.a); +#endif + roughness = mix(roughness, decal_orm.g, decal_albedo.a); + metallic = mix(metallic, decal_orm.b, decal_albedo.a); + } + } + + if (decals.data[decal_index].emission_rect != vec4(0.0)) { + //emission is additive, so its independent from albedo + emission += textureGrad(sampler2D(decal_atlas_srgb, material_samplers[SAMPLER_LINEAR_WITH_MIPMAPS_CLAMP]), uv_local.xz * decals.data[decal_index].emission_rect.zw + decals.data[decal_index].emission_rect.xy, ddx * decals.data[decal_index].emission_rect.zw, ddy * decals.data[decal_index].emission_rect.zw).xyz * decals.data[decal_index].emission_energy * fade; + } + } + } +#endif //not render depth /////////////////////// LIGHTING ////////////////////////////// //apply energy conservation @@ -1404,8 +1955,6 @@ FRAGMENT_SHADER_CODE } #endif - uvec4 cluster_cell = texture(usampler3D(cluster_texture, material_samplers[SAMPLER_NEAREST_CLAMP]), vec3(screen_uv, (abs(vertex.z) - scene_data.z_near) / (scene_data.z_far - scene_data.z_near))); - { // process reflections vec4 reflection_accum = vec4(0.0, 0.0, 0.0, 0.0); @@ -1462,58 +2011,250 @@ FRAGMENT_SHADER_CODE continue; //not masked } - vec3 light_attenuation = vec3(1.0); + vec3 shadow_attenuation = vec3(1.0); + +#ifdef LIGHT_TRANSMITTANCE_USED + float transmittance_z = transmittance_depth; +#endif if (directional_lights.data[i].shadow_enabled) { float depth_z = -vertex.z; vec4 pssm_coord; + vec3 shadow_color = vec3(0.0); + vec3 light_dir = directional_lights.data[i].direction; + +#define BIAS_FUNC(m_var, m_idx) \ + m_var.xyz += light_dir * directional_lights.data[i].shadow_bias[m_idx]; \ + vec3 normal_bias = normalize(normal_interp) * (1.0 - max(0.0, dot(light_dir, -normalize(normal_interp)))) * directional_lights.data[i].shadow_normal_bias[m_idx]; \ + normal_bias -= light_dir * dot(light_dir, normal_bias); \ + m_var.xyz += normal_bias; + + float shadow = 0.0; if (depth_z < directional_lights.data[i].shadow_split_offsets.x) { - pssm_coord = (directional_lights.data[i].shadow_matrix1 * vec4(vertex, 1.0)); + vec4 v = vec4(vertex, 1.0); + + BIAS_FUNC(v, 0) + + pssm_coord = (directional_lights.data[i].shadow_matrix1 * v); + pssm_coord /= pssm_coord.w; + + if (directional_lights.data[i].softshadow_angle > 0) { + float range_pos = dot(directional_lights.data[i].direction, v.xyz); + float range_begin = directional_lights.data[i].shadow_range_begin.x; + float test_radius = (range_pos - range_begin) * directional_lights.data[i].softshadow_angle; + vec2 tex_scale = directional_lights.data[i].uv_scale1 * test_radius; + shadow = sample_directional_soft_shadow(directional_shadow_atlas, pssm_coord.xyz, tex_scale * directional_lights.data[i].soft_shadow_scale); + } else { + shadow = sample_directional_pcf_shadow(directional_shadow_atlas, scene_data.directional_shadow_pixel_size * directional_lights.data[i].soft_shadow_scale, pssm_coord); + } + + shadow_color = directional_lights.data[i].shadow_color1.rgb; + +#ifdef LIGHT_TRANSMITTANCE_USED + { + vec4 trans_vertex = vec4(vertex - normalize(normal_interp) * directional_lights.data[i].shadow_transmittance_bias.x, 1.0); + vec4 trans_coord = directional_lights.data[i].shadow_matrix1 * trans_vertex; + trans_coord /= trans_coord.w; + + float shadow_z = textureLod(sampler2D(directional_shadow_atlas, material_samplers[SAMPLER_LINEAR_CLAMP]), trans_coord.xy, 0.0).r; + shadow_z *= directional_lights.data[i].shadow_transmittance_z_scale.x; + float z = trans_coord.z * directional_lights.data[i].shadow_transmittance_z_scale.x; + + transmittance_z = z - shadow_z; + } +#endif } else if (depth_z < directional_lights.data[i].shadow_split_offsets.y) { - pssm_coord = (directional_lights.data[i].shadow_matrix2 * vec4(vertex, 1.0)); + + vec4 v = vec4(vertex, 1.0); + + BIAS_FUNC(v, 1) + + pssm_coord = (directional_lights.data[i].shadow_matrix2 * v); + pssm_coord /= pssm_coord.w; + + if (directional_lights.data[i].softshadow_angle > 0) { + float range_pos = dot(directional_lights.data[i].direction, v.xyz); + float range_begin = directional_lights.data[i].shadow_range_begin.y; + float test_radius = (range_pos - range_begin) * directional_lights.data[i].softshadow_angle; + vec2 tex_scale = directional_lights.data[i].uv_scale2 * test_radius; + shadow = sample_directional_soft_shadow(directional_shadow_atlas, pssm_coord.xyz, tex_scale * directional_lights.data[i].soft_shadow_scale); + } else { + shadow = sample_directional_pcf_shadow(directional_shadow_atlas, scene_data.directional_shadow_pixel_size * directional_lights.data[i].soft_shadow_scale, pssm_coord); + } + + shadow_color = directional_lights.data[i].shadow_color2.rgb; +#ifdef LIGHT_TRANSMITTANCE_USED + { + vec4 trans_vertex = vec4(vertex - normalize(normal_interp) * directional_lights.data[i].shadow_transmittance_bias.y, 1.0); + vec4 trans_coord = directional_lights.data[i].shadow_matrix2 * trans_vertex; + trans_coord /= trans_coord.w; + + float shadow_z = textureLod(sampler2D(directional_shadow_atlas, material_samplers[SAMPLER_LINEAR_CLAMP]), trans_coord.xy, 0.0).r; + shadow_z *= directional_lights.data[i].shadow_transmittance_z_scale.y; + float z = trans_coord.z * directional_lights.data[i].shadow_transmittance_z_scale.y; + + transmittance_z = z - shadow_z; + } +#endif } else if (depth_z < directional_lights.data[i].shadow_split_offsets.z) { - pssm_coord = (directional_lights.data[i].shadow_matrix3 * vec4(vertex, 1.0)); + + vec4 v = vec4(vertex, 1.0); + + BIAS_FUNC(v, 2) + + pssm_coord = (directional_lights.data[i].shadow_matrix3 * v); + pssm_coord /= pssm_coord.w; + + if (directional_lights.data[i].softshadow_angle > 0) { + float range_pos = dot(directional_lights.data[i].direction, v.xyz); + float range_begin = directional_lights.data[i].shadow_range_begin.z; + float test_radius = (range_pos - range_begin) * directional_lights.data[i].softshadow_angle; + vec2 tex_scale = directional_lights.data[i].uv_scale3 * test_radius; + shadow = sample_directional_soft_shadow(directional_shadow_atlas, pssm_coord.xyz, tex_scale * directional_lights.data[i].soft_shadow_scale); + } else { + shadow = sample_directional_pcf_shadow(directional_shadow_atlas, scene_data.directional_shadow_pixel_size * directional_lights.data[i].soft_shadow_scale, pssm_coord); + } + + shadow_color = directional_lights.data[i].shadow_color3.rgb; +#ifdef LIGHT_TRANSMITTANCE_USED + { + vec4 trans_vertex = vec4(vertex - normalize(normal_interp) * directional_lights.data[i].shadow_transmittance_bias.z, 1.0); + vec4 trans_coord = directional_lights.data[i].shadow_matrix3 * trans_vertex; + trans_coord /= trans_coord.w; + + float shadow_z = textureLod(sampler2D(directional_shadow_atlas, material_samplers[SAMPLER_LINEAR_CLAMP]), trans_coord.xy, 0.0).r; + shadow_z *= directional_lights.data[i].shadow_transmittance_z_scale.z; + float z = trans_coord.z * directional_lights.data[i].shadow_transmittance_z_scale.z; + + transmittance_z = z - shadow_z; + } +#endif + } else { - pssm_coord = (directional_lights.data[i].shadow_matrix4 * vec4(vertex, 1.0)); - } - pssm_coord /= pssm_coord.w; + vec4 v = vec4(vertex, 1.0); - float shadow = sample_shadow(directional_shadow_atlas, scene_data.directional_shadow_pixel_size, pssm_coord); + BIAS_FUNC(v, 3) + + pssm_coord = (directional_lights.data[i].shadow_matrix4 * v); + pssm_coord /= pssm_coord.w; + + if (directional_lights.data[i].softshadow_angle > 0) { + float range_pos = dot(directional_lights.data[i].direction, v.xyz); + float range_begin = directional_lights.data[i].shadow_range_begin.w; + float test_radius = (range_pos - range_begin) * directional_lights.data[i].softshadow_angle; + vec2 tex_scale = directional_lights.data[i].uv_scale4 * test_radius; + shadow = sample_directional_soft_shadow(directional_shadow_atlas, pssm_coord.xyz, tex_scale * directional_lights.data[i].soft_shadow_scale); + } else { + shadow = sample_directional_pcf_shadow(directional_shadow_atlas, scene_data.directional_shadow_pixel_size * directional_lights.data[i].soft_shadow_scale, pssm_coord); + } + + shadow_color = directional_lights.data[i].shadow_color4.rgb; + +#ifdef LIGHT_TRANSMITTANCE_USED + { + vec4 trans_vertex = vec4(vertex - normalize(normal_interp) * directional_lights.data[i].shadow_transmittance_bias.w, 1.0); + vec4 trans_coord = directional_lights.data[i].shadow_matrix4 * trans_vertex; + trans_coord /= trans_coord.w; + + float shadow_z = textureLod(sampler2D(directional_shadow_atlas, material_samplers[SAMPLER_LINEAR_CLAMP]), trans_coord.xy, 0.0).r; + shadow_z *= directional_lights.data[i].shadow_transmittance_z_scale.w; + float z = trans_coord.z * directional_lights.data[i].shadow_transmittance_z_scale.w; + + transmittance_z = z - shadow_z; + } +#endif + } if (directional_lights.data[i].blend_splits) { + vec3 shadow_color_blend = vec3(0.0); float pssm_blend; + float shadow2; if (depth_z < directional_lights.data[i].shadow_split_offsets.x) { - pssm_coord = (directional_lights.data[i].shadow_matrix2 * vec4(vertex, 1.0)); + vec4 v = vec4(vertex, 1.0); + BIAS_FUNC(v, 1) + pssm_coord = (directional_lights.data[i].shadow_matrix2 * v); + pssm_coord /= pssm_coord.w; + + if (directional_lights.data[i].softshadow_angle > 0) { + float range_pos = dot(directional_lights.data[i].direction, v.xyz); + float range_begin = directional_lights.data[i].shadow_range_begin.y; + float test_radius = (range_pos - range_begin) * directional_lights.data[i].softshadow_angle; + vec2 tex_scale = directional_lights.data[i].uv_scale2 * test_radius; + shadow2 = sample_directional_soft_shadow(directional_shadow_atlas, pssm_coord.xyz, tex_scale * directional_lights.data[i].soft_shadow_scale); + } else { + shadow2 = sample_directional_pcf_shadow(directional_shadow_atlas, scene_data.directional_shadow_pixel_size * directional_lights.data[i].soft_shadow_scale, pssm_coord); + } + pssm_blend = smoothstep(0.0, directional_lights.data[i].shadow_split_offsets.x, depth_z); + shadow_color_blend = directional_lights.data[i].shadow_color2.rgb; } else if (depth_z < directional_lights.data[i].shadow_split_offsets.y) { - pssm_coord = (directional_lights.data[i].shadow_matrix3 * vec4(vertex, 1.0)); + vec4 v = vec4(vertex, 1.0); + BIAS_FUNC(v, 2) + pssm_coord = (directional_lights.data[i].shadow_matrix3 * v); + pssm_coord /= pssm_coord.w; + + if (directional_lights.data[i].softshadow_angle > 0) { + float range_pos = dot(directional_lights.data[i].direction, v.xyz); + float range_begin = directional_lights.data[i].shadow_range_begin.z; + float test_radius = (range_pos - range_begin) * directional_lights.data[i].softshadow_angle; + vec2 tex_scale = directional_lights.data[i].uv_scale3 * test_radius; + shadow2 = sample_directional_soft_shadow(directional_shadow_atlas, pssm_coord.xyz, tex_scale * directional_lights.data[i].soft_shadow_scale); + } else { + shadow2 = sample_directional_pcf_shadow(directional_shadow_atlas, scene_data.directional_shadow_pixel_size * directional_lights.data[i].soft_shadow_scale, pssm_coord); + } + pssm_blend = smoothstep(directional_lights.data[i].shadow_split_offsets.x, directional_lights.data[i].shadow_split_offsets.y, depth_z); + + shadow_color_blend = directional_lights.data[i].shadow_color3.rgb; } else if (depth_z < directional_lights.data[i].shadow_split_offsets.z) { - pssm_coord = (directional_lights.data[i].shadow_matrix4 * vec4(vertex, 1.0)); + vec4 v = vec4(vertex, 1.0); + BIAS_FUNC(v, 3) + pssm_coord = (directional_lights.data[i].shadow_matrix4 * v); + pssm_coord /= pssm_coord.w; + if (directional_lights.data[i].softshadow_angle > 0) { + float range_pos = dot(directional_lights.data[i].direction, v.xyz); + float range_begin = directional_lights.data[i].shadow_range_begin.w; + float test_radius = (range_pos - range_begin) * directional_lights.data[i].softshadow_angle; + vec2 tex_scale = directional_lights.data[i].uv_scale4 * test_radius; + shadow2 = sample_directional_soft_shadow(directional_shadow_atlas, pssm_coord.xyz, tex_scale * directional_lights.data[i].soft_shadow_scale); + } else { + shadow2 = sample_directional_pcf_shadow(directional_shadow_atlas, scene_data.directional_shadow_pixel_size * directional_lights.data[i].soft_shadow_scale, pssm_coord); + } + pssm_blend = smoothstep(directional_lights.data[i].shadow_split_offsets.y, directional_lights.data[i].shadow_split_offsets.z, depth_z); + shadow_color_blend = directional_lights.data[i].shadow_color4.rgb; } else { pssm_blend = 0.0; //if no blend, same coord will be used (divide by z will result in same value, and already cached) } - pssm_coord /= pssm_coord.w; + pssm_blend = sqrt(pssm_blend); - float shadow2 = sample_shadow(directional_shadow_atlas, scene_data.directional_shadow_pixel_size, pssm_coord); shadow = mix(shadow, shadow2, pssm_blend); + shadow_color = mix(shadow_color, shadow_color_blend, pssm_blend); } shadow = mix(shadow, 1.0, smoothstep(directional_lights.data[i].fade_from, directional_lights.data[i].fade_to, vertex.z)); //done with negative values for performance - light_attenuation = mix(directional_lights.data[i].shadow_color, vec3(1.0), shadow); + shadow_attenuation = mix(shadow_color, vec3(1.0), shadow); + +#undef BIAS_FUNC } - light_compute(normal, directional_lights.data[i].direction, normalize(view), directional_lights.data[i].color * directional_lights.data[i].energy, light_attenuation, albedo, roughness, metallic, specular, directional_lights.data[i].specular * specular_blob_intensity, -#ifdef LIGHT_TRANSMISSION_USED - transmission, + light_compute(normal, directional_lights.data[i].direction, normalize(view), directional_lights.data[i].size, directional_lights.data[i].color * directional_lights.data[i].energy, 1.0, shadow_attenuation, albedo, roughness, metallic, specular, directional_lights.data[i].specular * specular_blob_intensity, +#ifdef LIGHT_BACKLIGHT_USED + backlight, +#endif +#ifdef LIGHT_TRANSMITTANCE_USED + transmittance_color, + transmittance_depth, + transmittance_curve, + transmittance_boost, + transmittance_z, #endif #ifdef LIGHT_RIM_USED rim, rim_tint, @@ -1545,9 +2286,15 @@ FRAGMENT_SHADER_CODE continue; //not masked } - light_process_omni(light_index, vertex, view, normal, albedo, roughness, metallic, specular, specular_blob_intensity, -#ifdef LIGHT_TRANSMISSION_USED - transmission, + light_process_omni(light_index, vertex, view, normal, vertex_ddx, vertex_ddy, albedo, roughness, metallic, specular, specular_blob_intensity, +#ifdef LIGHT_BACKLIGHT_USED + backlight, +#endif +#ifdef LIGHT_TRANSMITTANCE_USED + transmittance_color, + transmittance_depth, + transmittance_curve, + transmittance_boost, #endif #ifdef LIGHT_RIM_USED rim, @@ -1578,9 +2325,15 @@ FRAGMENT_SHADER_CODE continue; //not masked } - light_process_spot(light_index, vertex, view, normal, albedo, roughness, metallic, specular, specular_blob_intensity, -#ifdef LIGHT_TRANSMISSION_USED - transmission, + light_process_spot(light_index, vertex, view, normal, vertex_ddx, vertex_ddy, albedo, roughness, metallic, specular, specular_blob_intensity, +#ifdef LIGHT_BACKLIGHT_USED + backlight, +#endif +#ifdef LIGHT_TRANSMITTANCE_USED + transmittance_color, + transmittance_depth, + transmittance_curve, + transmittance_boost, #endif #ifdef LIGHT_RIM_USED rim, diff --git a/servers/rendering/rasterizer_rd/shaders/scene_high_end_inc.glsl b/servers/rendering/rasterizer_rd/shaders/scene_high_end_inc.glsl index baef1e060f..ce4fabf9f2 100644 --- a/servers/rendering/rasterizer_rd/shaders/scene_high_end_inc.glsl +++ b/servers/rendering/rasterizer_rd/shaders/scene_high_end_inc.glsl @@ -37,13 +37,23 @@ layout(set = 0, binding = 3, std140) uniform SceneData { vec2 viewport_size; vec2 screen_pixel_size; - //used for shadow mapping only - float z_offset; - float z_slope_scale; - float time; float reflection_multiplier; // one normally, zero when rendering reflections + bool pancake_shadows; + uint pad; + + //use vec4s because std140 doesnt play nice with vec2s, z and w are wasted + vec4 directional_penumbra_shadow_kernel[32]; + vec4 directional_soft_shadow_kernel[32]; + vec4 penumbra_shadow_kernel[32]; + vec4 soft_shadow_kernel[32]; + + uint directional_penumbra_shadow_samples; + uint directional_soft_shadow_samples; + uint penumbra_shadow_samples; + uint soft_shadow_samples; + vec4 ambient_light_color_energy; float ambient_color_sky_mix; @@ -124,31 +134,39 @@ struct InstanceData { mat4 transform; mat4 normal_transform; uint flags; - uint instance_ofs; //instance_offset in instancing/skeleton buffer + uint instance_uniforms_ofs; //base offset in global buffer for instance variables uint gi_offset; //GI information when using lightmapping (VCT or lightmap) uint layer_mask; }; -layout(set = 0, binding = 4, std430) buffer Instances { +layout(set = 0, binding = 4, std430) restrict readonly buffer Instances { InstanceData data[]; } instances; -struct LightData { //this structure needs to be 128 bits +struct LightData { //this structure needs to be as packed as possible vec3 position; float inv_radius; vec3 direction; + float size; uint attenuation_energy; //attenuation uint color_specular; //rgb color, a specular (8 bit unorm) uint cone_attenuation_angle; // attenuation and angle, (16bit float) - uint mask; uint shadow_color_enabled; //shadow rgb color, a>0.5 enabled (8bit unorm) - vec4 atlas_rect; //used for shadow atlas uv on omni, and for projection atlas on spot + vec4 atlas_rect; // rect in the shadow atlas mat4 shadow_matrix; + float shadow_bias; + float shadow_normal_bias; + float transmittance_bias; + float soft_shadow_size; // for spot, it's the size in uv coordinates of the light, for omni it's the span angle + float soft_shadow_scale; // scales the shadow kernel for blurrier shadows + uint mask; + uint pad[2]; + vec4 projector_rect; //projector rect in srgb decal atlas }; -layout(set = 0, binding = 5, std140) uniform Lights { - LightData data[MAX_LIGHT_DATA_STRUCTS]; +layout(set = 0, binding = 5, std430) restrict readonly buffer Lights { + LightData data[]; } lights; @@ -173,18 +191,33 @@ struct DirectionalLightData { vec3 direction; float energy; vec3 color; + float size; float specular; - vec3 shadow_color; uint mask; + float softshadow_angle; + float soft_shadow_scale; bool blend_splits; bool shadow_enabled; float fade_from; float fade_to; + vec4 shadow_bias; + vec4 shadow_normal_bias; + vec4 shadow_transmittance_bias; + vec4 shadow_transmittance_z_scale; + vec4 shadow_range_begin; vec4 shadow_split_offsets; mat4 shadow_matrix1; mat4 shadow_matrix2; mat4 shadow_matrix3; mat4 shadow_matrix4; + vec4 shadow_color1; + vec4 shadow_color2; + vec4 shadow_color3; + vec4 shadow_color4; + vec2 uv_scale1; + vec2 uv_scale2; + vec2 uv_scale3; + vec2 uv_scale4; }; layout(set = 0, binding = 7, std140) uniform DirectionalLights { @@ -219,14 +252,45 @@ layout(set = 0, binding = 9) uniform texture3D gi_probe_textures[MAX_GI_PROBE_TE #define CLUSTER_POINTER_MASK ((1 << CLUSTER_COUNTER_SHIFT) - 1) #define CLUSTER_COUNTER_MASK 0xfff -layout(set = 0, binding = 10) uniform utexture3D cluster_texture; +layout(set = 0, binding = 10) uniform texture2D decal_atlas; +layout(set = 0, binding = 11) uniform texture2D decal_atlas_srgb; + +struct DecalData { + mat4 xform; //to decal transform + vec3 inv_extents; + float albedo_mix; + vec4 albedo_rect; + vec4 normal_rect; + vec4 orm_rect; + vec4 emission_rect; + vec4 modulate; + float emission_energy; + uint mask; + float upper_fade; + float lower_fade; + mat3x4 normal_xform; + vec3 normal; + float normal_fade; +}; + +layout(set = 0, binding = 12, std430) restrict readonly buffer Decals { + DecalData data[]; +} +decals; + +layout(set = 0, binding = 13) uniform utexture3D cluster_texture; -layout(set = 0, binding = 11, std430) buffer ClusterData { +layout(set = 0, binding = 14, std430) restrict readonly buffer ClusterData { uint indices[]; } cluster_data; -layout(set = 0, binding = 12) uniform texture2D directional_shadow_atlas; +layout(set = 0, binding = 15) uniform texture2D directional_shadow_atlas; + +layout(set = 0, binding = 16, std430) restrict readonly buffer GlobalVariableData { + vec4 data[]; +} +global_variables; // decal atlas @@ -258,7 +322,7 @@ layout(set = 3, binding = 4) uniform texture2D ao_buffer; /* Set 4 Skeleton & Instancing (Multimesh) */ -layout(set = 4, binding = 0, std430) buffer Transforms { +layout(set = 4, binding = 0, std430) restrict readonly buffer Transforms { vec4 data[]; } transforms; diff --git a/servers/rendering/rasterizer_rd/shaders/sky.glsl b/servers/rendering/rasterizer_rd/shaders/sky.glsl index 469925839a..536077980d 100644 --- a/servers/rendering/rasterizer_rd/shaders/sky.glsl +++ b/servers/rendering/rasterizer_rd/shaders/sky.glsl @@ -58,6 +58,11 @@ params; layout(set = 0, binding = 0) uniform sampler material_samplers[12]; +layout(set = 0, binding = 1, std430) restrict readonly buffer GlobalVariableData { + vec4 data[]; +} +global_variables; + #ifdef USE_MATERIAL_UNIFORMS layout(set = 1, binding = 0, std140) uniform MaterialUniforms{ /* clang-format off */ @@ -96,9 +101,8 @@ layout(set = 2, binding = 2) uniform texture2D quarter_res; #endif struct DirectionalLightData { - vec3 direction; - float energy; - vec3 color; + vec4 direction_energy; + vec4 color_size; bool enabled; }; @@ -178,4 +182,10 @@ FRAGMENT_SHADER_CODE frag_color.rgb = color * params.position_multiplier.w; frag_color.a = alpha; + + // Blending is disabled for Sky, so alpha doesn't blend + // alpha is used for subsurface scattering so make sure it doesn't get applied to Sky + if (!AT_CUBEMAP_PASS && !AT_HALF_RES_PASS && !AT_QUARTER_RES_PASS) { + frag_color.a = 0.0; + } } diff --git a/servers/rendering/rasterizer_rd/shaders/specular_merge.glsl b/servers/rendering/rasterizer_rd/shaders/specular_merge.glsl index b28250318e..b24f7dccc7 100644 --- a/servers/rendering/rasterizer_rd/shaders/specular_merge.glsl +++ b/servers/rendering/rasterizer_rd/shaders/specular_merge.glsl @@ -48,8 +48,8 @@ void main() { frag_color.a = 0.0; #ifdef MODE_SSR - vec4 ssr = texture(ssr, uv_interp); - frag_color.rgb = mix(frag_color.rgb, ssr.rgb, ssr.a); + vec4 ssr_color = texture(ssr, uv_interp); + frag_color.rgb = mix(frag_color.rgb, ssr_color.rgb, ssr_color.a); #endif #ifdef MODE_MERGE diff --git a/servers/rendering/rasterizer_rd/shaders/tonemap.glsl b/servers/rendering/rasterizer_rd/shaders/tonemap.glsl index 524ca5e2ea..a142d263e2 100644 --- a/servers/rendering/rasterizer_rd/shaders/tonemap.glsl +++ b/servers/rendering/rasterizer_rd/shaders/tonemap.glsl @@ -48,6 +48,10 @@ layout(push_constant, binding = 1, std430) uniform Params { float exposure; float white; float auto_exposure_grey; + + vec2 pixel_size; + bool use_fxaa; + uint pad; } params; @@ -255,16 +259,63 @@ vec3 apply_color_correction(vec3 color, sampler3D correction_tex) { return texture(correction_tex, color).rgb; } +vec3 do_fxaa(vec3 color, float exposure, vec2 uv_interp) { + + const float FXAA_REDUCE_MIN = (1.0 / 128.0); + const float FXAA_REDUCE_MUL = (1.0 / 8.0); + const float FXAA_SPAN_MAX = 8.0; + + vec3 rgbNW = textureLod(source_color, uv_interp + vec2(-1.0, -1.0) * params.pixel_size, 0.0).xyz * exposure; + vec3 rgbNE = textureLod(source_color, uv_interp + vec2(1.0, -1.0) * params.pixel_size, 0.0).xyz * exposure; + vec3 rgbSW = textureLod(source_color, uv_interp + vec2(-1.0, 1.0) * params.pixel_size, 0.0).xyz * exposure; + vec3 rgbSE = textureLod(source_color, uv_interp + vec2(1.0, 1.0) * params.pixel_size, 0.0).xyz * exposure; + vec3 rgbM = color; + vec3 luma = vec3(0.299, 0.587, 0.114); + float lumaNW = dot(rgbNW, luma); + float lumaNE = dot(rgbNE, luma); + float lumaSW = dot(rgbSW, luma); + float lumaSE = dot(rgbSE, luma); + float lumaM = dot(rgbM, luma); + float lumaMin = min(lumaM, min(min(lumaNW, lumaNE), min(lumaSW, lumaSE))); + float lumaMax = max(lumaM, max(max(lumaNW, lumaNE), max(lumaSW, lumaSE))); + + vec2 dir; + dir.x = -((lumaNW + lumaNE) - (lumaSW + lumaSE)); + dir.y = ((lumaNW + lumaSW) - (lumaNE + lumaSE)); + + float dirReduce = max((lumaNW + lumaNE + lumaSW + lumaSE) * + (0.25 * FXAA_REDUCE_MUL), + FXAA_REDUCE_MIN); + + float rcpDirMin = 1.0 / (min(abs(dir.x), abs(dir.y)) + dirReduce); + dir = min(vec2(FXAA_SPAN_MAX, FXAA_SPAN_MAX), + max(vec2(-FXAA_SPAN_MAX, -FXAA_SPAN_MAX), + dir * rcpDirMin)) * + params.pixel_size; + + vec3 rgbA = 0.5 * (textureLod(source_color, uv_interp + dir * (1.0 / 3.0 - 0.5), 0.0).xyz * exposure + textureLod(source_color, uv_interp + dir * (2.0 / 3.0 - 0.5), 0.0).xyz) * exposure; + vec3 rgbB = rgbA * 0.5 + 0.25 * (textureLod(source_color, uv_interp + dir * -0.5, 0.0).xyz * exposure + + textureLod(source_color, uv_interp + dir * 0.5, 0.0).xyz * exposure); + + float lumaB = dot(rgbB, luma); + if ((lumaB < lumaMin) || (lumaB > lumaMax)) + return rgbA; + else + return rgbB; +} + void main() { vec3 color = textureLod(source_color, uv_interp, 0.0f).rgb; // Exposure + float exposure = params.exposure; + if (params.use_auto_exposure) { - color /= texelFetch(source_auto_exposure, ivec2(0, 0), 0).r / params.auto_exposure_grey; + exposure *= 1.0 / (texelFetch(source_auto_exposure, ivec2(0, 0), 0).r / params.auto_exposure_grey); } - color *= params.exposure; + color *= exposure; // Early Tonemap & SRGB Conversion @@ -274,6 +325,9 @@ void main() { color.rgb = mix(color.rgb, glow, params.glow_intensity); } + if (params.use_fxaa) { + color = do_fxaa(color, exposure, uv_interp); + } color = apply_tonemapping(color, params.white); color = linear_to_srgb(color); // regular linear -> SRGB conversion diff --git a/servers/rendering/rendering_device.cpp b/servers/rendering/rendering_device.cpp index a3799b0e4d..a3bb39cd90 100644 --- a/servers/rendering/rendering_device.cpp +++ b/servers/rendering/rendering_device.cpp @@ -29,6 +29,8 @@ /*************************************************************************/ #include "rendering_device.h" +#include "core/method_bind_ext.gen.inc" +#include "rendering_device_binds.h" RenderingDevice *RenderingDevice::singleton = nullptr; @@ -59,6 +61,753 @@ Vector<uint8_t> RenderingDevice::shader_compile_from_source(ShaderStage p_stage, return compile_function(p_stage, p_source_code, p_language, r_error); } +RID RenderingDevice::_texture_create(const Ref<RDTextureFormat> &p_format, const Ref<RDTextureView> &p_view, const TypedArray<PackedByteArray> &p_data) { + + ERR_FAIL_COND_V(p_format.is_null(), RID()); + ERR_FAIL_COND_V(p_view.is_null(), RID()); + Vector<Vector<uint8_t>> data; + for (int i = 0; i < p_data.size(); i++) { + Vector<uint8_t> byte_slice = p_data[i]; + ERR_FAIL_COND_V(byte_slice.empty(), RID()); + data.push_back(byte_slice); + } + return texture_create(p_format->base, p_view->base, data); +} + +RID RenderingDevice::_texture_create_shared(const Ref<RDTextureView> &p_view, RID p_with_texture) { + ERR_FAIL_COND_V(p_view.is_null(), RID()); + + return texture_create_shared(p_view->base, p_with_texture); +} + +RID RenderingDevice::_texture_create_shared_from_slice(const Ref<RDTextureView> &p_view, RID p_with_texture, uint32_t p_layer, uint32_t p_mipmap, TextureSliceType p_slice_type) { + ERR_FAIL_COND_V(p_view.is_null(), RID()); + + return texture_create_shared_from_slice(p_view->base, p_with_texture, p_layer, p_mipmap, p_slice_type); +} + +RenderingDevice::FramebufferFormatID RenderingDevice::_framebuffer_format_create(const TypedArray<RDAttachmentFormat> &p_attachments) { + + Vector<AttachmentFormat> attachments; + attachments.resize(p_attachments.size()); + + for (int i = 0; i < p_attachments.size(); i++) { + Ref<RDAttachmentFormat> af = p_attachments[i]; + ERR_FAIL_COND_V(af.is_null(), INVALID_FORMAT_ID); + attachments.write[i] = af->base; + } + return framebuffer_format_create(attachments); +} + +RID RenderingDevice::_framebuffer_create(const Array &p_textures, FramebufferFormatID p_format_check) { + + Vector<RID> textures = Variant(p_textures); + return framebuffer_create(textures, p_format_check); +} + +RID RenderingDevice::_sampler_create(const Ref<RDSamplerState> &p_state) { + ERR_FAIL_COND_V(p_state.is_null(), RID()); + + return sampler_create(p_state->base); +} + +RenderingDevice::VertexFormatID RenderingDevice::_vertex_format_create(const TypedArray<RDVertexAttribute> &p_vertex_formats) { + + Vector<VertexAttribute> descriptions; + descriptions.resize(p_vertex_formats.size()); + + for (int i = 0; i < p_vertex_formats.size(); i++) { + Ref<RDVertexAttribute> af = p_vertex_formats[i]; + ERR_FAIL_COND_V(af.is_null(), INVALID_FORMAT_ID); + descriptions.write[i] = af->base; + } + return vertex_format_create(descriptions); +} + +RID RenderingDevice::_vertex_array_create(uint32_t p_vertex_count, VertexFormatID p_vertex_format, const TypedArray<RID> &p_src_buffers) { + + Vector<RID> buffers = Variant(p_src_buffers); + + return vertex_array_create(p_vertex_count, p_vertex_format, buffers); +} + +Ref<RDShaderBytecode> RenderingDevice::_shader_compile_from_source(const Ref<RDShaderSource> &p_source, bool p_allow_cache) { + ERR_FAIL_COND_V(p_source.is_null(), Ref<RDShaderBytecode>()); + + Ref<RDShaderBytecode> bytecode; + bytecode.instance(); + for (int i = 0; i < RD::SHADER_STAGE_MAX; i++) { + String error; + + ShaderStage stage = ShaderStage(i); + Vector<uint8_t> spirv = shader_compile_from_source(stage, p_source->get_stage_source(stage), p_source->get_language(), &error, p_allow_cache); + bytecode->set_stage_bytecode(stage, spirv); + bytecode->set_stage_compile_error(stage, error); + } + return bytecode; +} + +RID RenderingDevice::_shader_create(const Ref<RDShaderBytecode> &p_bytecode) { + ERR_FAIL_COND_V(p_bytecode.is_null(), RID()); + + Vector<ShaderStageData> stage_data; + for (int i = 0; i < RD::SHADER_STAGE_MAX; i++) { + ShaderStage stage = ShaderStage(i); + ShaderStageData sd; + sd.shader_stage = stage; + String error = p_bytecode->get_stage_compile_error(stage); + ERR_FAIL_COND_V_MSG(error != String(), RID(), "Can't create a shader from an errored bytecode. Check errors in source bytecode."); + sd.spir_v = p_bytecode->get_stage_bytecode(stage); + if (sd.spir_v.empty()) { + continue; + } + stage_data.push_back(sd); + } + + return shader_create(stage_data); +} + +RID RenderingDevice::_uniform_set_create(const Array &p_uniforms, RID p_shader, uint32_t p_shader_set) { + + Vector<Uniform> uniforms; + uniforms.resize(p_uniforms.size()); + for (int i = 0; i < p_uniforms.size(); i++) { + Ref<RDUniform> uniform = p_uniforms[i]; + ERR_FAIL_COND_V(!uniform.is_valid(), RID()); + uniforms.write[i] = uniform->base; + } + return uniform_set_create(uniforms, p_shader, p_shader_set); +} + +Error RenderingDevice::_buffer_update(RID p_buffer, uint32_t p_offset, uint32_t p_size, const Vector<uint8_t> &p_data, bool p_sync_with_draw) { + + return buffer_update(p_buffer, p_offset, p_size, p_data.ptr(), p_sync_with_draw); +} + +RID RenderingDevice::_render_pipeline_create(RID p_shader, FramebufferFormatID p_framebuffer_format, VertexFormatID p_vertex_format, RenderPrimitive p_render_primitive, const Ref<RDPipelineRasterizationState> &p_rasterization_state, const Ref<RDPipelineMultisampleState> &p_multisample_state, const Ref<RDPipelineDepthStencilState> &p_depth_stencil_state, const Ref<RDPipelineColorBlendState> &p_blend_state, int p_dynamic_state_flags) { + + PipelineRasterizationState rasterization_state; + if (p_rasterization_state.is_valid()) { + rasterization_state = p_rasterization_state->base; + } + + PipelineMultisampleState multisample_state; + if (p_multisample_state.is_valid()) { + multisample_state = p_multisample_state->base; + for (int i = 0; i < p_multisample_state->sample_masks.size(); i++) { + int64_t mask = p_multisample_state->sample_masks[i]; + multisample_state.sample_mask.push_back(mask); + } + } + + PipelineDepthStencilState depth_stencil_state; + if (p_depth_stencil_state.is_valid()) { + depth_stencil_state = p_depth_stencil_state->base; + } + + PipelineColorBlendState color_blend_state; + if (p_blend_state.is_valid()) { + color_blend_state = p_blend_state->base; + for (int i = 0; i < p_blend_state->attachments.size(); i++) { + Ref<RDPipelineColorBlendStateAttachment> attachment = p_blend_state->attachments[i]; + if (attachment.is_valid()) { + color_blend_state.attachments.push_back(attachment->base); + } + } + } + + return render_pipeline_create(p_shader, p_framebuffer_format, p_vertex_format, p_render_primitive, rasterization_state, multisample_state, depth_stencil_state, color_blend_state, p_dynamic_state_flags); +} + +Vector<int64_t> RenderingDevice::_draw_list_begin_split(RID p_framebuffer, uint32_t p_splits, InitialAction p_initial_color_action, FinalAction p_final_color_action, InitialAction p_initial_depth_action, FinalAction p_final_depth_action, const Vector<Color> &p_clear_color_values, float p_clear_depth, uint32_t p_clear_stencil, const Rect2 &p_region) { + + Vector<DrawListID> splits; + splits.resize(p_splits); + draw_list_begin_split(p_framebuffer, p_splits, splits.ptrw(), p_initial_color_action, p_final_color_action, p_initial_depth_action, p_final_depth_action, p_clear_color_values, p_clear_depth, p_clear_stencil, p_region); + + Vector<int64_t> split_ids; + split_ids.resize(splits.size()); + for (int i = 0; i < splits.size(); i++) { + split_ids.write[i] = splits[i]; + } + + return split_ids; +} + +void RenderingDevice::_draw_list_set_push_constant(DrawListID p_list, const Vector<uint8_t> &p_data, uint32_t p_data_size) { + ERR_FAIL_COND((uint32_t)p_data.size() > p_data_size); + draw_list_set_push_constant(p_list, p_data.ptr(), p_data_size); +} + +void RenderingDevice::_compute_list_set_push_constant(ComputeListID p_list, const Vector<uint8_t> &p_data, uint32_t p_data_size) { + ERR_FAIL_COND((uint32_t)p_data.size() > p_data_size); + compute_list_set_push_constant(p_list, p_data.ptr(), p_data_size); +} + +void RenderingDevice::_bind_methods() { + + ClassDB::bind_method(D_METHOD("texture_create", "format", "view", "data"), &RenderingDevice::_texture_create, DEFVAL(Array())); + ClassDB::bind_method(D_METHOD("texture_create_shared", "view", "with_texture"), &RenderingDevice::_texture_create_shared); + ClassDB::bind_method(D_METHOD("texture_create_shared_from_slice", "view", "with_texture", "layer", "mipmap", "slice_type"), &RenderingDevice::_texture_create_shared_from_slice, DEFVAL(TEXTURE_SLICE_2D)); + + ClassDB::bind_method(D_METHOD("texture_update", "texture", "layer", "data", "sync_with_draw"), &RenderingDevice::texture_update, DEFVAL(false)); + ClassDB::bind_method(D_METHOD("texture_get_data", "texture", "layer"), &RenderingDevice::texture_get_data); + + ClassDB::bind_method(D_METHOD("texture_is_format_supported_for_usage", "format", "usage_flags"), &RenderingDevice::texture_is_format_supported_for_usage); + + ClassDB::bind_method(D_METHOD("texture_is_shared", "texture"), &RenderingDevice::texture_is_shared); + ClassDB::bind_method(D_METHOD("texture_is_valid", "texture"), &RenderingDevice::texture_is_valid); + + ClassDB::bind_method(D_METHOD("texture_copy", "from_texture", "to_texture", "from_pos", "to_pos", "size", "src_mipmap", "dst_mipmap", "src_layer", "dst_layer", "sync_with_draw"), &RenderingDevice::texture_copy, DEFVAL(false)); + ClassDB::bind_method(D_METHOD("texture_clear", "texture", "color", "base_mipmap", "mipmap_count", "base_layer", "layer_count", "sync_with_draw"), &RenderingDevice::texture_clear, DEFVAL(false)); + ClassDB::bind_method(D_METHOD("texture_resolve_multisample", "from_texture", "to_texture", "sync_with_draw"), &RenderingDevice::texture_resolve_multisample, DEFVAL(false)); + + ClassDB::bind_method(D_METHOD("framebuffer_format_create", "attachments"), &RenderingDevice::_framebuffer_format_create); + ClassDB::bind_method(D_METHOD("framebuffer_format_get_texture_samples", "format"), &RenderingDevice::framebuffer_format_get_texture_samples); + ClassDB::bind_method(D_METHOD("framebuffer_create", "textures", "validate_with_format"), &RenderingDevice::_framebuffer_create, DEFVAL(INVALID_FORMAT_ID)); + ClassDB::bind_method(D_METHOD("framebuffer_get_format", "framebuffer"), &RenderingDevice::framebuffer_get_format); + + ClassDB::bind_method(D_METHOD("sampler_create", "state"), &RenderingDevice::_sampler_create); + + ClassDB::bind_method(D_METHOD("vertex_buffer_create", "size_bytes", "data"), &RenderingDevice::vertex_buffer_create, DEFVAL(Vector<uint8_t>())); + ClassDB::bind_method(D_METHOD("vertex_format_create", "vertex_descriptions"), &RenderingDevice::_vertex_format_create); + + ClassDB::bind_method(D_METHOD("index_buffer_create", "size_indices", "format", "data"), &RenderingDevice::index_buffer_create, DEFVAL(Vector<uint8_t>()), DEFVAL(false)); + ClassDB::bind_method(D_METHOD("index_array_create", "index_buffer", "index_offset", "index_count"), &RenderingDevice::index_array_create); + + ClassDB::bind_method(D_METHOD("shader_compile_from_source", "shader_source", "allow_cache"), &RenderingDevice::_shader_compile_from_source, DEFVAL(true)); + ClassDB::bind_method(D_METHOD("shader_create", "shader_data"), &RenderingDevice::_shader_create); + ClassDB::bind_method(D_METHOD("shader_get_vertex_input_attribute_mask", "shader"), &RenderingDevice::shader_get_vertex_input_attribute_mask); + + ClassDB::bind_method(D_METHOD("uniform_buffer_create", "size_bytes", "data"), &RenderingDevice::uniform_buffer_create, DEFVAL(Vector<uint8_t>())); + ClassDB::bind_method(D_METHOD("storage_buffer_create", "size_bytes", "data"), &RenderingDevice::storage_buffer_create, DEFVAL(Vector<uint8_t>())); + ClassDB::bind_method(D_METHOD("texture_buffer_create", "size_bytes", "format", "data"), &RenderingDevice::texture_buffer_create, DEFVAL(Vector<uint8_t>())); + + ClassDB::bind_method(D_METHOD("uniform_set_create", "uniforms", "shader", "shader_set"), &RenderingDevice::_uniform_set_create); + ClassDB::bind_method(D_METHOD("uniform_set_is_valid", "uniform_set"), &RenderingDevice::uniform_set_is_valid); + + ClassDB::bind_method(D_METHOD("buffer_update", "buffer", "offset", "size_bytes", "data", "sync_with_draw"), &RenderingDevice::_buffer_update, DEFVAL(true)); + ClassDB::bind_method(D_METHOD("buffer_get_data", "buffer"), &RenderingDevice::buffer_get_data); + + ClassDB::bind_method(D_METHOD("render_pipeline_create", "shader", "framebuffer_format", "vertex_format", "primitive", "rasterization_state", "multisample_state", "stencil_state", "color_blend_state", "dynamic_state_flags"), &RenderingDevice::_render_pipeline_create, DEFVAL(0)); + ClassDB::bind_method(D_METHOD("render_pipeline_is_valid", "render_pipeline"), &RenderingDevice::render_pipeline_is_valid); + + ClassDB::bind_method(D_METHOD("compute_pipeline_create", "shader"), &RenderingDevice::compute_pipeline_create); + ClassDB::bind_method(D_METHOD("compute_pipeline_is_valid", "compute_pieline"), &RenderingDevice::compute_pipeline_is_valid); + + ClassDB::bind_method(D_METHOD("screen_get_width", "screen"), &RenderingDevice::screen_get_width, DEFVAL(DisplayServer::MAIN_WINDOW_ID)); + ClassDB::bind_method(D_METHOD("screen_get_height", "screen"), &RenderingDevice::screen_get_height, DEFVAL(DisplayServer::MAIN_WINDOW_ID)); + ClassDB::bind_method(D_METHOD("screen_get_framebuffer_format"), &RenderingDevice::screen_get_framebuffer_format); + + ClassDB::bind_method(D_METHOD("draw_list_begin_for_screen", "screen", "clear_color"), &RenderingDevice::draw_list_begin_for_screen, DEFVAL(DisplayServer::MAIN_WINDOW_ID), DEFVAL(Color())); + + ClassDB::bind_method(D_METHOD("draw_list_begin", "framebuffer", "initial_color_action", "final_color_action", "initial_depth_action", "final_depth_action", "clear_color_values", "clear_depth", "clear_stencil", "region"), &RenderingDevice::draw_list_begin, DEFVAL(Vector<Color>()), DEFVAL(1.0), DEFVAL(0), DEFVAL(Rect2i())); + ClassDB::bind_method(D_METHOD("draw_list_begin_split", "framebuffer", "splits", "initial_color_action", "final_color_action", "initial_depth_action", "final_depth_action", "clear_color_values", "clear_depth", "clear_stencil", "region"), &RenderingDevice::_draw_list_begin_split, DEFVAL(Vector<Color>()), DEFVAL(1.0), DEFVAL(0), DEFVAL(Rect2i())); + + ClassDB::bind_method(D_METHOD("draw_list_bind_render_pipeline", "draw_list", "render_pipeline"), &RenderingDevice::draw_list_bind_render_pipeline); + ClassDB::bind_method(D_METHOD("draw_list_bind_uniform_set", "draw_list", "uniform_set", "set_index"), &RenderingDevice::draw_list_bind_uniform_set); + ClassDB::bind_method(D_METHOD("draw_list_bind_vertex_array", "draw_list", "vertex_array"), &RenderingDevice::draw_list_bind_vertex_array); + ClassDB::bind_method(D_METHOD("draw_list_bind_index_array", "draw_list", "index_array"), &RenderingDevice::draw_list_bind_index_array); + ClassDB::bind_method(D_METHOD("draw_list_set_push_constant", "draw_list", "buffer", "size_bytes"), &RenderingDevice::_draw_list_set_push_constant); + + ClassDB::bind_method(D_METHOD("draw_list_draw", "draw_list", "use_indices", "instances", "procedural_vertex_count"), &RenderingDevice::draw_list_draw, DEFVAL(0)); + + ClassDB::bind_method(D_METHOD("draw_list_enable_scissor", "draw_list", "rect"), &RenderingDevice::draw_list_enable_scissor, DEFVAL(Rect2i())); + ClassDB::bind_method(D_METHOD("draw_list_disable_scissor", "draw_list"), &RenderingDevice::draw_list_disable_scissor); + + ClassDB::bind_method(D_METHOD("draw_list_end"), &RenderingDevice::draw_list_end); + + ClassDB::bind_method(D_METHOD("compute_list_begin"), &RenderingDevice::compute_list_begin); + ClassDB::bind_method(D_METHOD("compute_list_bind_compute_pipeline", "compute_list", "compute_pipeline"), &RenderingDevice::compute_list_bind_compute_pipeline); + ClassDB::bind_method(D_METHOD("compute_list_set_push_constant", "compute_list", "buffer", "size_bytes"), &RenderingDevice::_compute_list_set_push_constant); + ClassDB::bind_method(D_METHOD("compute_list_bind_uniform_set", "compute_list", "uniform_set", "set_index"), &RenderingDevice::compute_list_bind_uniform_set); + ClassDB::bind_method(D_METHOD("compute_list_dispatch", "compute_list", "x_groups", "y_groups", "z_groups"), &RenderingDevice::compute_list_dispatch); + ClassDB::bind_method(D_METHOD("compute_list_add_barrier", "compute_list"), &RenderingDevice::compute_list_add_barrier); + ClassDB::bind_method(D_METHOD("compute_list_end"), &RenderingDevice::compute_list_end); + + ClassDB::bind_method(D_METHOD("free", "rid"), &RenderingDevice::free); + + ClassDB::bind_method(D_METHOD("capture_timestamp", "name", "sync_to_draw"), &RenderingDevice::capture_timestamp); + ClassDB::bind_method(D_METHOD("get_captured_timestamps_count"), &RenderingDevice::get_captured_timestamps_count); + ClassDB::bind_method(D_METHOD("get_captured_timestamps_frame"), &RenderingDevice::get_captured_timestamps_frame); + ClassDB::bind_method(D_METHOD("get_captured_timestamp_gpu_time", "index"), &RenderingDevice::get_captured_timestamp_gpu_time); + ClassDB::bind_method(D_METHOD("get_captured_timestamp_cpu_time", "index"), &RenderingDevice::get_captured_timestamp_cpu_time); + ClassDB::bind_method(D_METHOD("get_captured_timestamp_name", "index"), &RenderingDevice::get_captured_timestamp_name); + + ClassDB::bind_method(D_METHOD("limit_get", "limit"), &RenderingDevice::limit_get); + ClassDB::bind_method(D_METHOD("get_frame_delay"), &RenderingDevice::get_frame_delay); + ClassDB::bind_method(D_METHOD("submit"), &RenderingDevice::submit); + ClassDB::bind_method(D_METHOD("sync"), &RenderingDevice::sync); + + ClassDB::bind_method(D_METHOD("create_local_device"), &RenderingDevice::create_local_device); + + BIND_ENUM_CONSTANT(DATA_FORMAT_R4G4_UNORM_PACK8); + BIND_ENUM_CONSTANT(DATA_FORMAT_R4G4B4A4_UNORM_PACK16); + BIND_ENUM_CONSTANT(DATA_FORMAT_B4G4R4A4_UNORM_PACK16); + BIND_ENUM_CONSTANT(DATA_FORMAT_R5G6B5_UNORM_PACK16); + BIND_ENUM_CONSTANT(DATA_FORMAT_B5G6R5_UNORM_PACK16); + BIND_ENUM_CONSTANT(DATA_FORMAT_R5G5B5A1_UNORM_PACK16); + BIND_ENUM_CONSTANT(DATA_FORMAT_B5G5R5A1_UNORM_PACK16); + BIND_ENUM_CONSTANT(DATA_FORMAT_A1R5G5B5_UNORM_PACK16); + BIND_ENUM_CONSTANT(DATA_FORMAT_R8_UNORM); + BIND_ENUM_CONSTANT(DATA_FORMAT_R8_SNORM); + BIND_ENUM_CONSTANT(DATA_FORMAT_R8_USCALED); + BIND_ENUM_CONSTANT(DATA_FORMAT_R8_SSCALED); + BIND_ENUM_CONSTANT(DATA_FORMAT_R8_UINT); + BIND_ENUM_CONSTANT(DATA_FORMAT_R8_SINT); + BIND_ENUM_CONSTANT(DATA_FORMAT_R8_SRGB); + BIND_ENUM_CONSTANT(DATA_FORMAT_R8G8_UNORM); + BIND_ENUM_CONSTANT(DATA_FORMAT_R8G8_SNORM); + BIND_ENUM_CONSTANT(DATA_FORMAT_R8G8_USCALED); + BIND_ENUM_CONSTANT(DATA_FORMAT_R8G8_SSCALED); + BIND_ENUM_CONSTANT(DATA_FORMAT_R8G8_UINT); + BIND_ENUM_CONSTANT(DATA_FORMAT_R8G8_SINT); + BIND_ENUM_CONSTANT(DATA_FORMAT_R8G8_SRGB); + BIND_ENUM_CONSTANT(DATA_FORMAT_R8G8B8_UNORM); + BIND_ENUM_CONSTANT(DATA_FORMAT_R8G8B8_SNORM); + BIND_ENUM_CONSTANT(DATA_FORMAT_R8G8B8_USCALED); + BIND_ENUM_CONSTANT(DATA_FORMAT_R8G8B8_SSCALED); + BIND_ENUM_CONSTANT(DATA_FORMAT_R8G8B8_UINT); + BIND_ENUM_CONSTANT(DATA_FORMAT_R8G8B8_SINT); + BIND_ENUM_CONSTANT(DATA_FORMAT_R8G8B8_SRGB); + BIND_ENUM_CONSTANT(DATA_FORMAT_B8G8R8_UNORM); + BIND_ENUM_CONSTANT(DATA_FORMAT_B8G8R8_SNORM); + BIND_ENUM_CONSTANT(DATA_FORMAT_B8G8R8_USCALED); + BIND_ENUM_CONSTANT(DATA_FORMAT_B8G8R8_SSCALED); + BIND_ENUM_CONSTANT(DATA_FORMAT_B8G8R8_UINT); + BIND_ENUM_CONSTANT(DATA_FORMAT_B8G8R8_SINT); + BIND_ENUM_CONSTANT(DATA_FORMAT_B8G8R8_SRGB); + BIND_ENUM_CONSTANT(DATA_FORMAT_R8G8B8A8_UNORM); + BIND_ENUM_CONSTANT(DATA_FORMAT_R8G8B8A8_SNORM); + BIND_ENUM_CONSTANT(DATA_FORMAT_R8G8B8A8_USCALED); + BIND_ENUM_CONSTANT(DATA_FORMAT_R8G8B8A8_SSCALED); + BIND_ENUM_CONSTANT(DATA_FORMAT_R8G8B8A8_UINT); + BIND_ENUM_CONSTANT(DATA_FORMAT_R8G8B8A8_SINT); + BIND_ENUM_CONSTANT(DATA_FORMAT_R8G8B8A8_SRGB); + BIND_ENUM_CONSTANT(DATA_FORMAT_B8G8R8A8_UNORM); + BIND_ENUM_CONSTANT(DATA_FORMAT_B8G8R8A8_SNORM); + BIND_ENUM_CONSTANT(DATA_FORMAT_B8G8R8A8_USCALED); + BIND_ENUM_CONSTANT(DATA_FORMAT_B8G8R8A8_SSCALED); + BIND_ENUM_CONSTANT(DATA_FORMAT_B8G8R8A8_UINT); + BIND_ENUM_CONSTANT(DATA_FORMAT_B8G8R8A8_SINT); + BIND_ENUM_CONSTANT(DATA_FORMAT_B8G8R8A8_SRGB); + BIND_ENUM_CONSTANT(DATA_FORMAT_A8B8G8R8_UNORM_PACK32); + BIND_ENUM_CONSTANT(DATA_FORMAT_A8B8G8R8_SNORM_PACK32); + BIND_ENUM_CONSTANT(DATA_FORMAT_A8B8G8R8_USCALED_PACK32); + BIND_ENUM_CONSTANT(DATA_FORMAT_A8B8G8R8_SSCALED_PACK32); + BIND_ENUM_CONSTANT(DATA_FORMAT_A8B8G8R8_UINT_PACK32); + BIND_ENUM_CONSTANT(DATA_FORMAT_A8B8G8R8_SINT_PACK32); + BIND_ENUM_CONSTANT(DATA_FORMAT_A8B8G8R8_SRGB_PACK32); + BIND_ENUM_CONSTANT(DATA_FORMAT_A2R10G10B10_UNORM_PACK32); + BIND_ENUM_CONSTANT(DATA_FORMAT_A2R10G10B10_SNORM_PACK32); + BIND_ENUM_CONSTANT(DATA_FORMAT_A2R10G10B10_USCALED_PACK32); + BIND_ENUM_CONSTANT(DATA_FORMAT_A2R10G10B10_SSCALED_PACK32); + BIND_ENUM_CONSTANT(DATA_FORMAT_A2R10G10B10_UINT_PACK32); + BIND_ENUM_CONSTANT(DATA_FORMAT_A2R10G10B10_SINT_PACK32); + BIND_ENUM_CONSTANT(DATA_FORMAT_A2B10G10R10_UNORM_PACK32); + BIND_ENUM_CONSTANT(DATA_FORMAT_A2B10G10R10_SNORM_PACK32); + BIND_ENUM_CONSTANT(DATA_FORMAT_A2B10G10R10_USCALED_PACK32); + BIND_ENUM_CONSTANT(DATA_FORMAT_A2B10G10R10_SSCALED_PACK32); + BIND_ENUM_CONSTANT(DATA_FORMAT_A2B10G10R10_UINT_PACK32); + BIND_ENUM_CONSTANT(DATA_FORMAT_A2B10G10R10_SINT_PACK32); + BIND_ENUM_CONSTANT(DATA_FORMAT_R16_UNORM); + BIND_ENUM_CONSTANT(DATA_FORMAT_R16_SNORM); + BIND_ENUM_CONSTANT(DATA_FORMAT_R16_USCALED); + BIND_ENUM_CONSTANT(DATA_FORMAT_R16_SSCALED); + BIND_ENUM_CONSTANT(DATA_FORMAT_R16_UINT); + BIND_ENUM_CONSTANT(DATA_FORMAT_R16_SINT); + BIND_ENUM_CONSTANT(DATA_FORMAT_R16_SFLOAT); + BIND_ENUM_CONSTANT(DATA_FORMAT_R16G16_UNORM); + BIND_ENUM_CONSTANT(DATA_FORMAT_R16G16_SNORM); + BIND_ENUM_CONSTANT(DATA_FORMAT_R16G16_USCALED); + BIND_ENUM_CONSTANT(DATA_FORMAT_R16G16_SSCALED); + BIND_ENUM_CONSTANT(DATA_FORMAT_R16G16_UINT); + BIND_ENUM_CONSTANT(DATA_FORMAT_R16G16_SINT); + BIND_ENUM_CONSTANT(DATA_FORMAT_R16G16_SFLOAT); + BIND_ENUM_CONSTANT(DATA_FORMAT_R16G16B16_UNORM); + BIND_ENUM_CONSTANT(DATA_FORMAT_R16G16B16_SNORM); + BIND_ENUM_CONSTANT(DATA_FORMAT_R16G16B16_USCALED); + BIND_ENUM_CONSTANT(DATA_FORMAT_R16G16B16_SSCALED); + BIND_ENUM_CONSTANT(DATA_FORMAT_R16G16B16_UINT); + BIND_ENUM_CONSTANT(DATA_FORMAT_R16G16B16_SINT); + BIND_ENUM_CONSTANT(DATA_FORMAT_R16G16B16_SFLOAT); + BIND_ENUM_CONSTANT(DATA_FORMAT_R16G16B16A16_UNORM); + BIND_ENUM_CONSTANT(DATA_FORMAT_R16G16B16A16_SNORM); + BIND_ENUM_CONSTANT(DATA_FORMAT_R16G16B16A16_USCALED); + BIND_ENUM_CONSTANT(DATA_FORMAT_R16G16B16A16_SSCALED); + BIND_ENUM_CONSTANT(DATA_FORMAT_R16G16B16A16_UINT); + BIND_ENUM_CONSTANT(DATA_FORMAT_R16G16B16A16_SINT); + BIND_ENUM_CONSTANT(DATA_FORMAT_R16G16B16A16_SFLOAT); + BIND_ENUM_CONSTANT(DATA_FORMAT_R32_UINT); + BIND_ENUM_CONSTANT(DATA_FORMAT_R32_SINT); + BIND_ENUM_CONSTANT(DATA_FORMAT_R32_SFLOAT); + BIND_ENUM_CONSTANT(DATA_FORMAT_R32G32_UINT); + BIND_ENUM_CONSTANT(DATA_FORMAT_R32G32_SINT); + BIND_ENUM_CONSTANT(DATA_FORMAT_R32G32_SFLOAT); + BIND_ENUM_CONSTANT(DATA_FORMAT_R32G32B32_UINT); + BIND_ENUM_CONSTANT(DATA_FORMAT_R32G32B32_SINT); + BIND_ENUM_CONSTANT(DATA_FORMAT_R32G32B32_SFLOAT); + BIND_ENUM_CONSTANT(DATA_FORMAT_R32G32B32A32_UINT); + BIND_ENUM_CONSTANT(DATA_FORMAT_R32G32B32A32_SINT); + BIND_ENUM_CONSTANT(DATA_FORMAT_R32G32B32A32_SFLOAT); + BIND_ENUM_CONSTANT(DATA_FORMAT_R64_UINT); + BIND_ENUM_CONSTANT(DATA_FORMAT_R64_SINT); + BIND_ENUM_CONSTANT(DATA_FORMAT_R64_SFLOAT); + BIND_ENUM_CONSTANT(DATA_FORMAT_R64G64_UINT); + BIND_ENUM_CONSTANT(DATA_FORMAT_R64G64_SINT); + BIND_ENUM_CONSTANT(DATA_FORMAT_R64G64_SFLOAT); + BIND_ENUM_CONSTANT(DATA_FORMAT_R64G64B64_UINT); + BIND_ENUM_CONSTANT(DATA_FORMAT_R64G64B64_SINT); + BIND_ENUM_CONSTANT(DATA_FORMAT_R64G64B64_SFLOAT); + BIND_ENUM_CONSTANT(DATA_FORMAT_R64G64B64A64_UINT); + BIND_ENUM_CONSTANT(DATA_FORMAT_R64G64B64A64_SINT); + BIND_ENUM_CONSTANT(DATA_FORMAT_R64G64B64A64_SFLOAT); + BIND_ENUM_CONSTANT(DATA_FORMAT_B10G11R11_UFLOAT_PACK32); + BIND_ENUM_CONSTANT(DATA_FORMAT_E5B9G9R9_UFLOAT_PACK32); + BIND_ENUM_CONSTANT(DATA_FORMAT_D16_UNORM); + BIND_ENUM_CONSTANT(DATA_FORMAT_X8_D24_UNORM_PACK32); + BIND_ENUM_CONSTANT(DATA_FORMAT_D32_SFLOAT); + BIND_ENUM_CONSTANT(DATA_FORMAT_S8_UINT); + BIND_ENUM_CONSTANT(DATA_FORMAT_D16_UNORM_S8_UINT); + BIND_ENUM_CONSTANT(DATA_FORMAT_D24_UNORM_S8_UINT); + BIND_ENUM_CONSTANT(DATA_FORMAT_D32_SFLOAT_S8_UINT); + BIND_ENUM_CONSTANT(DATA_FORMAT_BC1_RGB_UNORM_BLOCK); + BIND_ENUM_CONSTANT(DATA_FORMAT_BC1_RGB_SRGB_BLOCK); + BIND_ENUM_CONSTANT(DATA_FORMAT_BC1_RGBA_UNORM_BLOCK); + BIND_ENUM_CONSTANT(DATA_FORMAT_BC1_RGBA_SRGB_BLOCK); + BIND_ENUM_CONSTANT(DATA_FORMAT_BC2_UNORM_BLOCK); + BIND_ENUM_CONSTANT(DATA_FORMAT_BC2_SRGB_BLOCK); + BIND_ENUM_CONSTANT(DATA_FORMAT_BC3_UNORM_BLOCK); + BIND_ENUM_CONSTANT(DATA_FORMAT_BC3_SRGB_BLOCK); + BIND_ENUM_CONSTANT(DATA_FORMAT_BC4_UNORM_BLOCK); + BIND_ENUM_CONSTANT(DATA_FORMAT_BC4_SNORM_BLOCK); + BIND_ENUM_CONSTANT(DATA_FORMAT_BC5_UNORM_BLOCK); + BIND_ENUM_CONSTANT(DATA_FORMAT_BC5_SNORM_BLOCK); + BIND_ENUM_CONSTANT(DATA_FORMAT_BC6H_UFLOAT_BLOCK); + BIND_ENUM_CONSTANT(DATA_FORMAT_BC6H_SFLOAT_BLOCK); + BIND_ENUM_CONSTANT(DATA_FORMAT_BC7_UNORM_BLOCK); + BIND_ENUM_CONSTANT(DATA_FORMAT_BC7_SRGB_BLOCK); + BIND_ENUM_CONSTANT(DATA_FORMAT_ETC2_R8G8B8_UNORM_BLOCK); + BIND_ENUM_CONSTANT(DATA_FORMAT_ETC2_R8G8B8_SRGB_BLOCK); + BIND_ENUM_CONSTANT(DATA_FORMAT_ETC2_R8G8B8A1_UNORM_BLOCK); + BIND_ENUM_CONSTANT(DATA_FORMAT_ETC2_R8G8B8A1_SRGB_BLOCK); + BIND_ENUM_CONSTANT(DATA_FORMAT_ETC2_R8G8B8A8_UNORM_BLOCK); + BIND_ENUM_CONSTANT(DATA_FORMAT_ETC2_R8G8B8A8_SRGB_BLOCK); + BIND_ENUM_CONSTANT(DATA_FORMAT_EAC_R11_UNORM_BLOCK); + BIND_ENUM_CONSTANT(DATA_FORMAT_EAC_R11_SNORM_BLOCK); + BIND_ENUM_CONSTANT(DATA_FORMAT_EAC_R11G11_UNORM_BLOCK); + BIND_ENUM_CONSTANT(DATA_FORMAT_EAC_R11G11_SNORM_BLOCK); + BIND_ENUM_CONSTANT(DATA_FORMAT_ASTC_4x4_UNORM_BLOCK); + BIND_ENUM_CONSTANT(DATA_FORMAT_ASTC_4x4_SRGB_BLOCK); + BIND_ENUM_CONSTANT(DATA_FORMAT_ASTC_5x4_UNORM_BLOCK); + BIND_ENUM_CONSTANT(DATA_FORMAT_ASTC_5x4_SRGB_BLOCK); + BIND_ENUM_CONSTANT(DATA_FORMAT_ASTC_5x5_UNORM_BLOCK); + BIND_ENUM_CONSTANT(DATA_FORMAT_ASTC_5x5_SRGB_BLOCK); + BIND_ENUM_CONSTANT(DATA_FORMAT_ASTC_6x5_UNORM_BLOCK); + BIND_ENUM_CONSTANT(DATA_FORMAT_ASTC_6x5_SRGB_BLOCK); + BIND_ENUM_CONSTANT(DATA_FORMAT_ASTC_6x6_UNORM_BLOCK); + BIND_ENUM_CONSTANT(DATA_FORMAT_ASTC_6x6_SRGB_BLOCK); + BIND_ENUM_CONSTANT(DATA_FORMAT_ASTC_8x5_UNORM_BLOCK); + BIND_ENUM_CONSTANT(DATA_FORMAT_ASTC_8x5_SRGB_BLOCK); + BIND_ENUM_CONSTANT(DATA_FORMAT_ASTC_8x6_UNORM_BLOCK); + BIND_ENUM_CONSTANT(DATA_FORMAT_ASTC_8x6_SRGB_BLOCK); + BIND_ENUM_CONSTANT(DATA_FORMAT_ASTC_8x8_UNORM_BLOCK); + BIND_ENUM_CONSTANT(DATA_FORMAT_ASTC_8x8_SRGB_BLOCK); + BIND_ENUM_CONSTANT(DATA_FORMAT_ASTC_10x5_UNORM_BLOCK); + BIND_ENUM_CONSTANT(DATA_FORMAT_ASTC_10x5_SRGB_BLOCK); + BIND_ENUM_CONSTANT(DATA_FORMAT_ASTC_10x6_UNORM_BLOCK); + BIND_ENUM_CONSTANT(DATA_FORMAT_ASTC_10x6_SRGB_BLOCK); + BIND_ENUM_CONSTANT(DATA_FORMAT_ASTC_10x8_UNORM_BLOCK); + BIND_ENUM_CONSTANT(DATA_FORMAT_ASTC_10x8_SRGB_BLOCK); + BIND_ENUM_CONSTANT(DATA_FORMAT_ASTC_10x10_UNORM_BLOCK); + BIND_ENUM_CONSTANT(DATA_FORMAT_ASTC_10x10_SRGB_BLOCK); + BIND_ENUM_CONSTANT(DATA_FORMAT_ASTC_12x10_UNORM_BLOCK); + BIND_ENUM_CONSTANT(DATA_FORMAT_ASTC_12x10_SRGB_BLOCK); + BIND_ENUM_CONSTANT(DATA_FORMAT_ASTC_12x12_UNORM_BLOCK); + BIND_ENUM_CONSTANT(DATA_FORMAT_ASTC_12x12_SRGB_BLOCK); + BIND_ENUM_CONSTANT(DATA_FORMAT_G8B8G8R8_422_UNORM); + BIND_ENUM_CONSTANT(DATA_FORMAT_B8G8R8G8_422_UNORM); + BIND_ENUM_CONSTANT(DATA_FORMAT_G8_B8_R8_3PLANE_420_UNORM); + BIND_ENUM_CONSTANT(DATA_FORMAT_G8_B8R8_2PLANE_420_UNORM); + BIND_ENUM_CONSTANT(DATA_FORMAT_G8_B8_R8_3PLANE_422_UNORM); + BIND_ENUM_CONSTANT(DATA_FORMAT_G8_B8R8_2PLANE_422_UNORM); + BIND_ENUM_CONSTANT(DATA_FORMAT_G8_B8_R8_3PLANE_444_UNORM); + BIND_ENUM_CONSTANT(DATA_FORMAT_R10X6_UNORM_PACK16); + BIND_ENUM_CONSTANT(DATA_FORMAT_R10X6G10X6_UNORM_2PACK16); + BIND_ENUM_CONSTANT(DATA_FORMAT_R10X6G10X6B10X6A10X6_UNORM_4PACK16); + BIND_ENUM_CONSTANT(DATA_FORMAT_G10X6B10X6G10X6R10X6_422_UNORM_4PACK16); + BIND_ENUM_CONSTANT(DATA_FORMAT_B10X6G10X6R10X6G10X6_422_UNORM_4PACK16); + BIND_ENUM_CONSTANT(DATA_FORMAT_G10X6_B10X6_R10X6_3PLANE_420_UNORM_3PACK16); + BIND_ENUM_CONSTANT(DATA_FORMAT_G10X6_B10X6R10X6_2PLANE_420_UNORM_3PACK16); + BIND_ENUM_CONSTANT(DATA_FORMAT_G10X6_B10X6_R10X6_3PLANE_422_UNORM_3PACK16); + BIND_ENUM_CONSTANT(DATA_FORMAT_G10X6_B10X6R10X6_2PLANE_422_UNORM_3PACK16); + BIND_ENUM_CONSTANT(DATA_FORMAT_G10X6_B10X6_R10X6_3PLANE_444_UNORM_3PACK16); + BIND_ENUM_CONSTANT(DATA_FORMAT_R12X4_UNORM_PACK16); + BIND_ENUM_CONSTANT(DATA_FORMAT_R12X4G12X4_UNORM_2PACK16); + BIND_ENUM_CONSTANT(DATA_FORMAT_R12X4G12X4B12X4A12X4_UNORM_4PACK16); + BIND_ENUM_CONSTANT(DATA_FORMAT_G12X4B12X4G12X4R12X4_422_UNORM_4PACK16); + BIND_ENUM_CONSTANT(DATA_FORMAT_B12X4G12X4R12X4G12X4_422_UNORM_4PACK16); + BIND_ENUM_CONSTANT(DATA_FORMAT_G12X4_B12X4_R12X4_3PLANE_420_UNORM_3PACK16); + BIND_ENUM_CONSTANT(DATA_FORMAT_G12X4_B12X4R12X4_2PLANE_420_UNORM_3PACK16); + BIND_ENUM_CONSTANT(DATA_FORMAT_G12X4_B12X4_R12X4_3PLANE_422_UNORM_3PACK16); + BIND_ENUM_CONSTANT(DATA_FORMAT_G12X4_B12X4R12X4_2PLANE_422_UNORM_3PACK16); + BIND_ENUM_CONSTANT(DATA_FORMAT_G12X4_B12X4_R12X4_3PLANE_444_UNORM_3PACK16); + BIND_ENUM_CONSTANT(DATA_FORMAT_G16B16G16R16_422_UNORM); + BIND_ENUM_CONSTANT(DATA_FORMAT_B16G16R16G16_422_UNORM); + BIND_ENUM_CONSTANT(DATA_FORMAT_G16_B16_R16_3PLANE_420_UNORM); + BIND_ENUM_CONSTANT(DATA_FORMAT_G16_B16R16_2PLANE_420_UNORM); + BIND_ENUM_CONSTANT(DATA_FORMAT_G16_B16_R16_3PLANE_422_UNORM); + BIND_ENUM_CONSTANT(DATA_FORMAT_G16_B16R16_2PLANE_422_UNORM); + BIND_ENUM_CONSTANT(DATA_FORMAT_G16_B16_R16_3PLANE_444_UNORM); + BIND_ENUM_CONSTANT(DATA_FORMAT_PVRTC1_2BPP_UNORM_BLOCK_IMG); + BIND_ENUM_CONSTANT(DATA_FORMAT_PVRTC1_4BPP_UNORM_BLOCK_IMG); + BIND_ENUM_CONSTANT(DATA_FORMAT_PVRTC2_2BPP_UNORM_BLOCK_IMG); + BIND_ENUM_CONSTANT(DATA_FORMAT_PVRTC2_4BPP_UNORM_BLOCK_IMG); + BIND_ENUM_CONSTANT(DATA_FORMAT_PVRTC1_2BPP_SRGB_BLOCK_IMG); + BIND_ENUM_CONSTANT(DATA_FORMAT_PVRTC1_4BPP_SRGB_BLOCK_IMG); + BIND_ENUM_CONSTANT(DATA_FORMAT_PVRTC2_2BPP_SRGB_BLOCK_IMG); + BIND_ENUM_CONSTANT(DATA_FORMAT_PVRTC2_4BPP_SRGB_BLOCK_IMG); + BIND_ENUM_CONSTANT(DATA_FORMAT_MAX); + + BIND_ENUM_CONSTANT(TEXTURE_TYPE_1D); + BIND_ENUM_CONSTANT(TEXTURE_TYPE_2D); + BIND_ENUM_CONSTANT(TEXTURE_TYPE_3D); + BIND_ENUM_CONSTANT(TEXTURE_TYPE_CUBE); + BIND_ENUM_CONSTANT(TEXTURE_TYPE_1D_ARRAY); + BIND_ENUM_CONSTANT(TEXTURE_TYPE_2D_ARRAY); + BIND_ENUM_CONSTANT(TEXTURE_TYPE_CUBE_ARRAY); + BIND_ENUM_CONSTANT(TEXTURE_TYPE_MAX); + + BIND_ENUM_CONSTANT(TEXTURE_SAMPLES_1); + BIND_ENUM_CONSTANT(TEXTURE_SAMPLES_2); + BIND_ENUM_CONSTANT(TEXTURE_SAMPLES_4); + BIND_ENUM_CONSTANT(TEXTURE_SAMPLES_8); + BIND_ENUM_CONSTANT(TEXTURE_SAMPLES_16); + BIND_ENUM_CONSTANT(TEXTURE_SAMPLES_32); + BIND_ENUM_CONSTANT(TEXTURE_SAMPLES_64); + BIND_ENUM_CONSTANT(TEXTURE_SAMPLES_MAX); + + BIND_ENUM_CONSTANT(TEXTURE_USAGE_SAMPLING_BIT); + BIND_ENUM_CONSTANT(TEXTURE_USAGE_COLOR_ATTACHMENT_BIT); + BIND_ENUM_CONSTANT(TEXTURE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT); + BIND_ENUM_CONSTANT(TEXTURE_USAGE_STORAGE_BIT); + BIND_ENUM_CONSTANT(TEXTURE_USAGE_STORAGE_ATOMIC_BIT); + BIND_ENUM_CONSTANT(TEXTURE_USAGE_CPU_READ_BIT); + BIND_ENUM_CONSTANT(TEXTURE_USAGE_CAN_UPDATE_BIT); + BIND_ENUM_CONSTANT(TEXTURE_USAGE_CAN_COPY_FROM_BIT); + BIND_ENUM_CONSTANT(TEXTURE_USAGE_CAN_COPY_TO_BIT); + BIND_ENUM_CONSTANT(TEXTURE_USAGE_RESOLVE_ATTACHMENT_BIT); + + BIND_ENUM_CONSTANT(TEXTURE_SWIZZLE_IDENTITY); + BIND_ENUM_CONSTANT(TEXTURE_SWIZZLE_ZERO); + BIND_ENUM_CONSTANT(TEXTURE_SWIZZLE_ONE); + BIND_ENUM_CONSTANT(TEXTURE_SWIZZLE_R); + BIND_ENUM_CONSTANT(TEXTURE_SWIZZLE_G); + BIND_ENUM_CONSTANT(TEXTURE_SWIZZLE_B); + BIND_ENUM_CONSTANT(TEXTURE_SWIZZLE_A); + BIND_ENUM_CONSTANT(TEXTURE_SWIZZLE_MAX); + + BIND_ENUM_CONSTANT(TEXTURE_SLICE_2D); + BIND_ENUM_CONSTANT(TEXTURE_SLICE_CUBEMAP); + BIND_ENUM_CONSTANT(TEXTURE_SLICE_3D); + + BIND_ENUM_CONSTANT(SAMPLER_FILTER_NEAREST); + BIND_ENUM_CONSTANT(SAMPLER_FILTER_LINEAR); + BIND_ENUM_CONSTANT(SAMPLER_REPEAT_MODE_REPEAT); + BIND_ENUM_CONSTANT(SAMPLER_REPEAT_MODE_MIRRORED_REPEAT); + BIND_ENUM_CONSTANT(SAMPLER_REPEAT_MODE_CLAMP_TO_EDGE); + BIND_ENUM_CONSTANT(SAMPLER_REPEAT_MODE_CLAMP_TO_BORDER); + BIND_ENUM_CONSTANT(SAMPLER_REPEAT_MODE_MIRROR_CLAMP_TO_EDGE); + BIND_ENUM_CONSTANT(SAMPLER_REPEAT_MODE_MAX); + + BIND_ENUM_CONSTANT(SAMPLER_BORDER_COLOR_FLOAT_TRANSPARENT_BLACK); + BIND_ENUM_CONSTANT(SAMPLER_BORDER_COLOR_INT_TRANSPARENT_BLACK); + BIND_ENUM_CONSTANT(SAMPLER_BORDER_COLOR_FLOAT_OPAQUE_BLACK); + BIND_ENUM_CONSTANT(SAMPLER_BORDER_COLOR_INT_OPAQUE_BLACK); + BIND_ENUM_CONSTANT(SAMPLER_BORDER_COLOR_FLOAT_OPAQUE_WHITE); + BIND_ENUM_CONSTANT(SAMPLER_BORDER_COLOR_INT_OPAQUE_WHITE); + BIND_ENUM_CONSTANT(SAMPLER_BORDER_COLOR_MAX); + + BIND_ENUM_CONSTANT(VERTEX_FREQUENCY_VERTEX); + BIND_ENUM_CONSTANT(VERTEX_FREQUENCY_INSTANCE); + + BIND_ENUM_CONSTANT(INDEX_BUFFER_FORMAT_UINT16); + BIND_ENUM_CONSTANT(INDEX_BUFFER_FORMAT_UINT32); + + BIND_ENUM_CONSTANT(UNIFORM_TYPE_SAMPLER); //for sampling only (sampler GLSL type) + BIND_ENUM_CONSTANT(UNIFORM_TYPE_SAMPLER_WITH_TEXTURE); // for sampling only); but includes a texture); (samplerXX GLSL type)); first a sampler then a texture + BIND_ENUM_CONSTANT(UNIFORM_TYPE_TEXTURE); //only texture); (textureXX GLSL type) + BIND_ENUM_CONSTANT(UNIFORM_TYPE_IMAGE); // storage image (imageXX GLSL type)); for compute mostly + BIND_ENUM_CONSTANT(UNIFORM_TYPE_TEXTURE_BUFFER); // buffer texture (or TBO); textureBuffer type) + BIND_ENUM_CONSTANT(UNIFORM_TYPE_SAMPLER_WITH_TEXTURE_BUFFER); // buffer texture with a sampler(or TBO); samplerBuffer type) + BIND_ENUM_CONSTANT(UNIFORM_TYPE_IMAGE_BUFFER); //texel buffer); (imageBuffer type)); for compute mostly + BIND_ENUM_CONSTANT(UNIFORM_TYPE_UNIFORM_BUFFER); //regular uniform buffer (or UBO). + BIND_ENUM_CONSTANT(UNIFORM_TYPE_STORAGE_BUFFER); //storage buffer ("buffer" qualifier) like UBO); but supports storage); for compute mostly + BIND_ENUM_CONSTANT(UNIFORM_TYPE_INPUT_ATTACHMENT); //used for sub-pass read/write); for mobile mostly + BIND_ENUM_CONSTANT(UNIFORM_TYPE_MAX); + + BIND_ENUM_CONSTANT(RENDER_PRIMITIVE_POINTS); + BIND_ENUM_CONSTANT(RENDER_PRIMITIVE_LINES); + BIND_ENUM_CONSTANT(RENDER_PRIMITIVE_LINES_WITH_ADJACENCY); + BIND_ENUM_CONSTANT(RENDER_PRIMITIVE_LINESTRIPS); + BIND_ENUM_CONSTANT(RENDER_PRIMITIVE_LINESTRIPS_WITH_ADJACENCY); + BIND_ENUM_CONSTANT(RENDER_PRIMITIVE_TRIANGLES); + BIND_ENUM_CONSTANT(RENDER_PRIMITIVE_TRIANGLES_WITH_ADJACENCY); + BIND_ENUM_CONSTANT(RENDER_PRIMITIVE_TRIANGLE_STRIPS); + BIND_ENUM_CONSTANT(RENDER_PRIMITIVE_TRIANGLE_STRIPS_WITH_AJACENCY); + BIND_ENUM_CONSTANT(RENDER_PRIMITIVE_TRIANGLE_STRIPS_WITH_RESTART_INDEX); + BIND_ENUM_CONSTANT(RENDER_PRIMITIVE_TESSELATION_PATCH); + BIND_ENUM_CONSTANT(RENDER_PRIMITIVE_MAX); + + BIND_ENUM_CONSTANT(POLYGON_CULL_DISABLED); + BIND_ENUM_CONSTANT(POLYGON_CULL_FRONT); + BIND_ENUM_CONSTANT(POLYGON_CULL_BACK); + + BIND_ENUM_CONSTANT(POLYGON_FRONT_FACE_CLOCKWISE); + BIND_ENUM_CONSTANT(POLYGON_FRONT_FACE_COUNTER_CLOCKWISE); + + BIND_ENUM_CONSTANT(STENCIL_OP_KEEP); + BIND_ENUM_CONSTANT(STENCIL_OP_ZERO); + BIND_ENUM_CONSTANT(STENCIL_OP_REPLACE); + BIND_ENUM_CONSTANT(STENCIL_OP_INCREMENT_AND_CLAMP); + BIND_ENUM_CONSTANT(STENCIL_OP_DECREMENT_AND_CLAMP); + BIND_ENUM_CONSTANT(STENCIL_OP_INVERT); + BIND_ENUM_CONSTANT(STENCIL_OP_INCREMENT_AND_WRAP); + BIND_ENUM_CONSTANT(STENCIL_OP_DECREMENT_AND_WRAP); + BIND_ENUM_CONSTANT(STENCIL_OP_MAX); //not an actual operator); just the amount of operators :D + + BIND_ENUM_CONSTANT(COMPARE_OP_NEVER); + BIND_ENUM_CONSTANT(COMPARE_OP_LESS); + BIND_ENUM_CONSTANT(COMPARE_OP_EQUAL); + BIND_ENUM_CONSTANT(COMPARE_OP_LESS_OR_EQUAL); + BIND_ENUM_CONSTANT(COMPARE_OP_GREATER); + BIND_ENUM_CONSTANT(COMPARE_OP_NOT_EQUAL); + BIND_ENUM_CONSTANT(COMPARE_OP_GREATER_OR_EQUAL); + BIND_ENUM_CONSTANT(COMPARE_OP_ALWAYS); + BIND_ENUM_CONSTANT(COMPARE_OP_MAX); + + BIND_ENUM_CONSTANT(LOGIC_OP_CLEAR); + BIND_ENUM_CONSTANT(LOGIC_OP_AND); + BIND_ENUM_CONSTANT(LOGIC_OP_AND_REVERSE); + BIND_ENUM_CONSTANT(LOGIC_OP_COPY); + BIND_ENUM_CONSTANT(LOGIC_OP_AND_INVERTED); + BIND_ENUM_CONSTANT(LOGIC_OP_NO_OP); + BIND_ENUM_CONSTANT(LOGIC_OP_XOR); + BIND_ENUM_CONSTANT(LOGIC_OP_OR); + BIND_ENUM_CONSTANT(LOGIC_OP_NOR); + BIND_ENUM_CONSTANT(LOGIC_OP_EQUIVALENT); + BIND_ENUM_CONSTANT(LOGIC_OP_INVERT); + BIND_ENUM_CONSTANT(LOGIC_OP_OR_REVERSE); + BIND_ENUM_CONSTANT(LOGIC_OP_COPY_INVERTED); + BIND_ENUM_CONSTANT(LOGIC_OP_OR_INVERTED); + BIND_ENUM_CONSTANT(LOGIC_OP_NAND); + BIND_ENUM_CONSTANT(LOGIC_OP_SET); + BIND_ENUM_CONSTANT(LOGIC_OP_MAX); //not an actual operator); just the amount of operators :D + + BIND_ENUM_CONSTANT(BLEND_FACTOR_ZERO); + BIND_ENUM_CONSTANT(BLEND_FACTOR_ONE); + BIND_ENUM_CONSTANT(BLEND_FACTOR_SRC_COLOR); + BIND_ENUM_CONSTANT(BLEND_FACTOR_ONE_MINUS_SRC_COLOR); + BIND_ENUM_CONSTANT(BLEND_FACTOR_DST_COLOR); + BIND_ENUM_CONSTANT(BLEND_FACTOR_ONE_MINUS_DST_COLOR); + BIND_ENUM_CONSTANT(BLEND_FACTOR_SRC_ALPHA); + BIND_ENUM_CONSTANT(BLEND_FACTOR_ONE_MINUS_SRC_ALPHA); + BIND_ENUM_CONSTANT(BLEND_FACTOR_DST_ALPHA); + BIND_ENUM_CONSTANT(BLEND_FACTOR_ONE_MINUS_DST_ALPHA); + BIND_ENUM_CONSTANT(BLEND_FACTOR_CONSTANT_COLOR); + BIND_ENUM_CONSTANT(BLEND_FACTOR_ONE_MINUS_CONSTANT_COLOR); + BIND_ENUM_CONSTANT(BLEND_FACTOR_CONSTANT_ALPHA); + BIND_ENUM_CONSTANT(BLEND_FACTOR_ONE_MINUS_CONSTANT_ALPHA); + BIND_ENUM_CONSTANT(BLEND_FACTOR_SRC_ALPHA_SATURATE); + BIND_ENUM_CONSTANT(BLEND_FACTOR_SRC1_COLOR); + BIND_ENUM_CONSTANT(BLEND_FACTOR_ONE_MINUS_SRC1_COLOR); + BIND_ENUM_CONSTANT(BLEND_FACTOR_SRC1_ALPHA); + BIND_ENUM_CONSTANT(BLEND_FACTOR_ONE_MINUS_SRC1_ALPHA); + BIND_ENUM_CONSTANT(BLEND_FACTOR_MAX); + + BIND_ENUM_CONSTANT(BLEND_OP_ADD); + BIND_ENUM_CONSTANT(BLEND_OP_SUBTRACT); + BIND_ENUM_CONSTANT(BLEND_OP_REVERSE_SUBTRACT); + BIND_ENUM_CONSTANT(BLEND_OP_MINIMUM); + BIND_ENUM_CONSTANT(BLEND_OP_MAXIMUM); + BIND_ENUM_CONSTANT(BLEND_OP_MAX); + + BIND_ENUM_CONSTANT(DYNAMIC_STATE_LINE_WIDTH); + BIND_ENUM_CONSTANT(DYNAMIC_STATE_DEPTH_BIAS); + BIND_ENUM_CONSTANT(DYNAMIC_STATE_BLEND_CONSTANTS); + BIND_ENUM_CONSTANT(DYNAMIC_STATE_DEPTH_BOUNDS); + BIND_ENUM_CONSTANT(DYNAMIC_STATE_STENCIL_COMPARE_MASK); + BIND_ENUM_CONSTANT(DYNAMIC_STATE_STENCIL_WRITE_MASK); + BIND_ENUM_CONSTANT(DYNAMIC_STATE_STENCIL_REFERENCE); + + BIND_ENUM_CONSTANT(INITIAL_ACTION_CLEAR); //start rendering and clear the framebuffer (supply params) + BIND_ENUM_CONSTANT(INITIAL_ACTION_KEEP); //start rendering); but keep attached color texture contents (depth will be cleared) + BIND_ENUM_CONSTANT(INITIAL_ACTION_DROP); //start rendering); ignore what is there); just write above it + BIND_ENUM_CONSTANT(INITIAL_ACTION_CONTINUE); //continue rendering (framebuffer must have been left in "continue" state as final action previously) + BIND_ENUM_CONSTANT(INITIAL_ACTION_MAX); + + BIND_ENUM_CONSTANT(FINAL_ACTION_READ); //will no longer render to it); allows attached textures to be read again); but depth buffer contents will be dropped (Can't be read from) + BIND_ENUM_CONSTANT(FINAL_ACTION_DISCARD); // discard contents after rendering + BIND_ENUM_CONSTANT(FINAL_ACTION_CONTINUE); //will continue rendering later); attached textures can't be read until re-bound with "finish" + BIND_ENUM_CONSTANT(FINAL_ACTION_MAX); + + BIND_ENUM_CONSTANT(SHADER_STAGE_VERTEX); + BIND_ENUM_CONSTANT(SHADER_STAGE_FRAGMENT); + BIND_ENUM_CONSTANT(SHADER_STAGE_TESSELATION_CONTROL); + BIND_ENUM_CONSTANT(SHADER_STAGE_TESSELATION_EVALUATION); + BIND_ENUM_CONSTANT(SHADER_STAGE_COMPUTE); + BIND_ENUM_CONSTANT(SHADER_STAGE_MAX); + BIND_ENUM_CONSTANT(SHADER_STAGE_VERTEX_BIT); + BIND_ENUM_CONSTANT(SHADER_STAGE_FRAGMENT_BIT); + BIND_ENUM_CONSTANT(SHADER_STAGE_TESSELATION_CONTROL_BIT); + BIND_ENUM_CONSTANT(SHADER_STAGE_TESSELATION_EVALUATION_BIT); + BIND_ENUM_CONSTANT(SHADER_STAGE_COMPUTE_BIT); + + BIND_ENUM_CONSTANT(SHADER_LANGUAGE_GLSL); + BIND_ENUM_CONSTANT(SHADER_LANGUAGE_HLSL); + + BIND_ENUM_CONSTANT(LIMIT_MAX_BOUND_UNIFORM_SETS); + BIND_ENUM_CONSTANT(LIMIT_MAX_FRAMEBUFFER_COLOR_ATTACHMENTS); + BIND_ENUM_CONSTANT(LIMIT_MAX_TEXTURES_PER_UNIFORM_SET); + BIND_ENUM_CONSTANT(LIMIT_MAX_SAMPLERS_PER_UNIFORM_SET); + BIND_ENUM_CONSTANT(LIMIT_MAX_STORAGE_BUFFERS_PER_UNIFORM_SET); + BIND_ENUM_CONSTANT(LIMIT_MAX_STORAGE_IMAGES_PER_UNIFORM_SET); + BIND_ENUM_CONSTANT(LIMIT_MAX_UNIFORM_BUFFERS_PER_UNIFORM_SET); + BIND_ENUM_CONSTANT(LIMIT_MAX_DRAW_INDEXED_INDEX); + BIND_ENUM_CONSTANT(LIMIT_MAX_FRAMEBUFFER_HEIGHT); + BIND_ENUM_CONSTANT(LIMIT_MAX_FRAMEBUFFER_WIDTH); + BIND_ENUM_CONSTANT(LIMIT_MAX_TEXTURE_ARRAY_LAYERS); + BIND_ENUM_CONSTANT(LIMIT_MAX_TEXTURE_SIZE_1D); + BIND_ENUM_CONSTANT(LIMIT_MAX_TEXTURE_SIZE_2D); + BIND_ENUM_CONSTANT(LIMIT_MAX_TEXTURE_SIZE_3D); + BIND_ENUM_CONSTANT(LIMIT_MAX_TEXTURE_SIZE_CUBE); + BIND_ENUM_CONSTANT(LIMIT_MAX_TEXTURES_PER_SHADER_STAGE); + BIND_ENUM_CONSTANT(LIMIT_MAX_SAMPLERS_PER_SHADER_STAGE); + BIND_ENUM_CONSTANT(LIMIT_MAX_STORAGE_BUFFERS_PER_SHADER_STAGE); + BIND_ENUM_CONSTANT(LIMIT_MAX_STORAGE_IMAGES_PER_SHADER_STAGE); + BIND_ENUM_CONSTANT(LIMIT_MAX_UNIFORM_BUFFERS_PER_SHADER_STAGE); + BIND_ENUM_CONSTANT(LIMIT_MAX_PUSH_CONSTANT_SIZE); + BIND_ENUM_CONSTANT(LIMIT_MAX_UNIFORM_BUFFER_SIZE); + BIND_ENUM_CONSTANT(LIMIT_MAX_VERTEX_INPUT_ATTRIBUTE_OFFSET); + BIND_ENUM_CONSTANT(LIMIT_MAX_VERTEX_INPUT_ATTRIBUTES); + BIND_ENUM_CONSTANT(LIMIT_MAX_VERTEX_INPUT_BINDINGS); + BIND_ENUM_CONSTANT(LIMIT_MAX_VERTEX_INPUT_BINDING_STRIDE); + BIND_ENUM_CONSTANT(LIMIT_MIN_UNIFORM_BUFFER_OFFSET_ALIGNMENT); + BIND_ENUM_CONSTANT(LIMIT_MAX_COMPUTE_SHARED_MEMORY_SIZE); + BIND_ENUM_CONSTANT(LIMIT_MAX_COMPUTE_WORKGROUP_COUNT_X); + BIND_ENUM_CONSTANT(LIMIT_MAX_COMPUTE_WORKGROUP_COUNT_Y); + BIND_ENUM_CONSTANT(LIMIT_MAX_COMPUTE_WORKGROUP_COUNT_Z); + BIND_ENUM_CONSTANT(LIMIT_MAX_COMPUTE_WORKGROUP_INVOCATIONS); + BIND_ENUM_CONSTANT(LIMIT_MAX_COMPUTE_WORKGROUP_SIZE_X); + BIND_ENUM_CONSTANT(LIMIT_MAX_COMPUTE_WORKGROUP_SIZE_Y); + BIND_ENUM_CONSTANT(LIMIT_MAX_COMPUTE_WORKGROUP_SIZE_Z); + + BIND_CONSTANT(INVALID_ID); + BIND_CONSTANT(INVALID_FORMAT_ID); +} + RenderingDevice::RenderingDevice() { - singleton = this; + if (singleton == nullptr) { // there may be more rendering devices later + singleton = this; + } } diff --git a/servers/rendering/rendering_device.h b/servers/rendering/rendering_device.h index a639ff3641..c76fce5b5c 100644 --- a/servers/rendering/rendering_device.h +++ b/servers/rendering/rendering_device.h @@ -32,8 +32,22 @@ #define RENDERING_DEVICE_H #include "core/object.h" +#include "core/typed_array.h" #include "servers/display_server.h" +class RDTextureFormat; +class RDTextureView; +class RDAttachmentFormat; +class RDSamplerState; +class RDVertexAttribute; +class RDShaderSource; +class RDShaderBytecode; +class RDUniforms; +class RDPipelineRasterizationState; +class RDPipelineMultisampleState; +class RDPipelineDepthStencilState; +class RDPipelineColorBlendState; + class RenderingDevice : public Object { GDCLASS(RenderingDevice, Object) public: @@ -65,10 +79,14 @@ private: static RenderingDevice *singleton; +protected: + static void _bind_methods(); + public: //base numeric ID for all types enum { - INVALID_ID = -1 + INVALID_ID = -1, + INVALID_FORMAT_ID = -1 }; /*****************/ @@ -428,6 +446,7 @@ public: virtual Error texture_copy(RID p_from_texture, RID p_to_texture, const Vector3 &p_from, const Vector3 &p_to, const Vector3 &p_size, uint32_t p_src_mipmap, uint32_t p_dst_mipmap, uint32_t p_src_layer, uint32_t p_dst_layer, bool p_sync_with_draw = false) = 0; virtual Error texture_clear(RID p_texture, const Color &p_color, uint32_t p_base_mipmap, uint32_t p_mipmaps, uint32_t p_base_layer, uint32_t p_layers, bool p_sync_with_draw = false) = 0; + virtual Error texture_resolve_multisample(RID p_from_texture, RID p_to_texture, bool p_sync_with_draw = false) = 0; /*********************/ /**** FRAMEBUFFER ****/ @@ -529,13 +548,13 @@ public: VERTEX_FREQUENCY_INSTANCE, }; - struct VertexDescription { + struct VertexAttribute { uint32_t location; //shader location uint32_t offset; DataFormat format; uint32_t stride; VertexFrequency frequency; - VertexDescription() { + VertexAttribute() { location = 0; offset = 0; stride = 0; @@ -548,7 +567,7 @@ public: typedef int64_t VertexFormatID; // This ID is warranted to be unique for the same formats, does not need to be freed - virtual VertexFormatID vertex_format_create(const Vector<VertexDescription> &p_vertex_formats) = 0; + virtual VertexFormatID vertex_format_create(const Vector<VertexAttribute> &p_vertex_formats) = 0; virtual RID vertex_array_create(uint32_t p_vertex_count, VertexFormatID p_vertex_format, const Vector<RID> &p_src_buffers) = 0; enum IndexBufferFormat { @@ -594,7 +613,7 @@ public: UNIFORM_TYPE_IMAGE_BUFFER, //texel buffer, (imageBuffer type), for compute mostly UNIFORM_TYPE_UNIFORM_BUFFER, //regular uniform buffer (or UBO). UNIFORM_TYPE_STORAGE_BUFFER, //storage buffer ("buffer" qualifier) like UBO, but supports storage, for compute mostly - UNIFORM_TYPE_INPUT_ATTACHMENT, //used for sub-pass read/write, for compute mostly + UNIFORM_TYPE_INPUT_ATTACHMENT, //used for sub-pass read/write, for mobile mostly UNIFORM_TYPE_MAX }; @@ -795,8 +814,8 @@ public: } }; - StencilOperationState stencil_operation_front; - StencilOperationState stencil_operation_back; + StencilOperationState front_op; + StencilOperationState back_op; PipelineDepthStencilState() { enable_depth_test = false; @@ -883,8 +902,8 @@ public: DYNAMIC_STATE_STENCIL_REFERENCE = (1 << 6), }; - virtual RID render_pipeline_create(RID p_shader, FramebufferFormatID p_framebuffer_format, VertexFormatID p_vertex_format, RenderPrimitive p_render_primitive, const PipelineRasterizationState &p_rasterization_state, const PipelineMultisampleState &p_multisample_state, const PipelineDepthStencilState &p_depth_stencil_state, const PipelineColorBlendState &p_blend_state, int p_dynamic_state_flags = 0) = 0; virtual bool render_pipeline_is_valid(RID p_pipeline) = 0; + virtual RID render_pipeline_create(RID p_shader, FramebufferFormatID p_framebuffer_format, VertexFormatID p_vertex_format, RenderPrimitive p_render_primitive, const PipelineRasterizationState &p_rasterization_state, const PipelineMultisampleState &p_multisample_state, const PipelineDepthStencilState &p_depth_stencil_state, const PipelineColorBlendState &p_blend_state, int p_dynamic_state_flags = 0) = 0; /**************************/ /**** COMPUTE PIPELINE ****/ @@ -908,6 +927,7 @@ public: enum InitialAction { INITIAL_ACTION_CLEAR, //start rendering and clear the framebuffer (supply params) INITIAL_ACTION_KEEP, //start rendering, but keep attached color texture contents (depth will be cleared) + INITIAL_ACTION_DROP, //start rendering, ignore what is there, just write above it INITIAL_ACTION_CONTINUE, //continue rendering (framebuffer must have been left in "continue" state as final action previously) INITIAL_ACTION_MAX }; @@ -930,7 +950,7 @@ public: virtual void draw_list_bind_vertex_array(DrawListID p_list, RID p_vertex_array) = 0; virtual void draw_list_bind_index_array(DrawListID p_list, RID p_index_array) = 0; virtual void draw_list_set_line_width(DrawListID p_list, float p_width) = 0; - virtual void draw_list_set_push_constant(DrawListID p_list, void *p_data, uint32_t p_data_size) = 0; + virtual void draw_list_set_push_constant(DrawListID p_list, const void *p_data, uint32_t p_data_size) = 0; virtual void draw_list_draw(DrawListID p_list, bool p_use_indices, uint32_t p_instances = 1, uint32_t p_procedural_vertices = 0) = 0; @@ -948,7 +968,7 @@ public: virtual ComputeListID compute_list_begin() = 0; virtual void compute_list_bind_compute_pipeline(ComputeListID p_list, RID p_compute_pipeline) = 0; virtual void compute_list_bind_uniform_set(ComputeListID p_list, RID p_uniform_set, uint32_t p_index) = 0; - virtual void compute_list_set_push_constant(ComputeListID p_list, void *p_data, uint32_t p_data_size) = 0; + virtual void compute_list_set_push_constant(ComputeListID p_list, const void *p_data, uint32_t p_data_size) = 0; virtual void compute_list_dispatch(ComputeListID p_list, uint32_t p_x_groups, uint32_t p_y_groups, uint32_t p_z_groups) = 0; virtual void compute_list_add_barrier(ComputeListID p_list) = 0; @@ -1022,11 +1042,67 @@ public: virtual uint32_t get_frame_delay() const = 0; - static RenderingDevice *get_singleton(); + virtual void submit() = 0; + virtual void sync() = 0; + + virtual RenderingDevice *create_local_device() = 0; + static RenderingDevice *get_singleton(); RenderingDevice(); + +protected: + //binders to script API + RID _texture_create(const Ref<RDTextureFormat> &p_format, const Ref<RDTextureView> &p_view, const TypedArray<PackedByteArray> &p_data = Array()); + RID _texture_create_shared(const Ref<RDTextureView> &p_view, RID p_with_texture); + RID _texture_create_shared_from_slice(const Ref<RDTextureView> &p_view, RID p_with_texture, uint32_t p_layer, uint32_t p_mipmap, TextureSliceType p_slice_type = TEXTURE_SLICE_2D); + + FramebufferFormatID _framebuffer_format_create(const TypedArray<RDAttachmentFormat> &p_attachments); + RID _framebuffer_create(const Array &p_textures, FramebufferFormatID p_format_check = INVALID_ID); + RID _sampler_create(const Ref<RDSamplerState> &p_state); + VertexFormatID _vertex_format_create(const TypedArray<RDVertexAttribute> &p_vertex_formats); + RID _vertex_array_create(uint32_t p_vertex_count, VertexFormatID p_vertex_format, const TypedArray<RID> &p_src_buffers); + + Ref<RDShaderBytecode> _shader_compile_from_source(const Ref<RDShaderSource> &p_source, bool p_allow_cache = true); + RID _shader_create(const Ref<RDShaderBytecode> &p_bytecode); + + RID _uniform_set_create(const Array &p_uniforms, RID p_shader, uint32_t p_shader_set); + + Error _buffer_update(RID p_buffer, uint32_t p_offset, uint32_t p_size, const Vector<uint8_t> &p_data, bool p_sync_with_draw = false); + + RID _render_pipeline_create(RID p_shader, FramebufferFormatID p_framebuffer_format, VertexFormatID p_vertex_format, RenderPrimitive p_render_primitive, const Ref<RDPipelineRasterizationState> &p_rasterization_state, const Ref<RDPipelineMultisampleState> &p_multisample_state, const Ref<RDPipelineDepthStencilState> &p_depth_stencil_state, const Ref<RDPipelineColorBlendState> &p_blend_state, int p_dynamic_state_flags = 0); + + Vector<int64_t> _draw_list_begin_split(RID p_framebuffer, uint32_t p_splits, InitialAction p_initial_color_action, FinalAction p_final_color_action, InitialAction p_initial_depth_action, FinalAction p_final_depth_action, const Vector<Color> &p_clear_color_values = Vector<Color>(), float p_clear_depth = 1.0, uint32_t p_clear_stencil = 0, const Rect2 &p_region = Rect2()); + void _draw_list_set_push_constant(DrawListID p_list, const Vector<uint8_t> &p_data, uint32_t p_data_size); + void _compute_list_set_push_constant(ComputeListID p_list, const Vector<uint8_t> &p_data, uint32_t p_data_size); }; +VARIANT_ENUM_CAST(RenderingDevice::ShaderStage) +VARIANT_ENUM_CAST(RenderingDevice::ShaderLanguage) +VARIANT_ENUM_CAST(RenderingDevice::CompareOperator) +VARIANT_ENUM_CAST(RenderingDevice::DataFormat) +VARIANT_ENUM_CAST(RenderingDevice::TextureType) +VARIANT_ENUM_CAST(RenderingDevice::TextureSamples) +VARIANT_ENUM_CAST(RenderingDevice::TextureUsageBits) +VARIANT_ENUM_CAST(RenderingDevice::TextureSwizzle) +VARIANT_ENUM_CAST(RenderingDevice::TextureSliceType) +VARIANT_ENUM_CAST(RenderingDevice::SamplerFilter) +VARIANT_ENUM_CAST(RenderingDevice::SamplerRepeatMode) +VARIANT_ENUM_CAST(RenderingDevice::SamplerBorderColor) +VARIANT_ENUM_CAST(RenderingDevice::VertexFrequency) +VARIANT_ENUM_CAST(RenderingDevice::IndexBufferFormat) +VARIANT_ENUM_CAST(RenderingDevice::UniformType) +VARIANT_ENUM_CAST(RenderingDevice::RenderPrimitive) +VARIANT_ENUM_CAST(RenderingDevice::PolygonCullMode) +VARIANT_ENUM_CAST(RenderingDevice::PolygonFrontFace) +VARIANT_ENUM_CAST(RenderingDevice::StencilOperation) +VARIANT_ENUM_CAST(RenderingDevice::LogicOperation) +VARIANT_ENUM_CAST(RenderingDevice::BlendFactor) +VARIANT_ENUM_CAST(RenderingDevice::BlendOperation) +VARIANT_ENUM_CAST(RenderingDevice::PipelineDynamicStateFlags) +VARIANT_ENUM_CAST(RenderingDevice::InitialAction) +VARIANT_ENUM_CAST(RenderingDevice::FinalAction) +VARIANT_ENUM_CAST(RenderingDevice::Limit) + typedef RenderingDevice RD; #endif // RENDERING_DEVICE_H diff --git a/servers/rendering/rendering_device_binds.cpp b/servers/rendering/rendering_device_binds.cpp new file mode 100644 index 0000000000..111755eba3 --- /dev/null +++ b/servers/rendering/rendering_device_binds.cpp @@ -0,0 +1,167 @@ +#include "rendering_device_binds.h" + +Error RDShaderFile::parse_versions_from_text(const String &p_text, OpenIncludeFunction p_include_func, void *p_include_func_userdata) { + + Vector<String> lines = p_text.split("\n"); + + bool reading_versions = false; + bool stage_found[RD::SHADER_STAGE_MAX] = { false, false, false, false, false }; + RD::ShaderStage stage = RD::SHADER_STAGE_MAX; + static const char *stage_str[RD::SHADER_STAGE_MAX] = { + "vertex", + "fragment", + "tesselation_control", + "tesselation_evaluation", + "compute" + }; + String stage_code[RD::SHADER_STAGE_MAX]; + int stages_found = 0; + Map<StringName, String> version_texts; + + versions.clear(); + base_error = ""; + + for (int lidx = 0; lidx < lines.size(); lidx++) { + String line = lines[lidx]; + + { + String ls = line.strip_edges(); + if (ls.begins_with("[") && ls.ends_with("]")) { + String section = ls.substr(1, ls.length() - 2).strip_edges(); + if (section == "versions") { + if (stages_found) { + base_error = "Invalid shader file, [version] must be the first section found."; + break; + } + reading_versions = true; + } else { + for (int i = 0; i < RD::SHADER_STAGE_MAX; i++) { + if (section == stage_str[i]) { + if (stage_found[i]) { + base_error = "Invalid shader file, stage appears twice: " + section; + break; + } + + stage_found[i] = true; + stages_found++; + + stage = RD::ShaderStage(i); + reading_versions = false; + break; + } + } + + if (base_error != String()) { + break; + } + } + + continue; + } + } + + if (reading_versions) { + String l = line.strip_edges(); + if (l != "") { + int eqpos = l.find("="); + if (eqpos == -1) { + base_error = "Version syntax is version=\"<defines with C escaping>\"."; + break; + } + String version = l.get_slice("=", 0).strip_edges(); + if (!version.is_valid_identifier()) { + base_error = "Version names must be valid identifiers, found '" + version + "' instead."; + break; + } + String define = l.get_slice("=", 1).strip_edges(); + if (!define.begins_with("\"") || !define.ends_with("\"")) { + base_error = "Version text must be quoted using \"\", instead found '" + define + "'."; + break; + } + define = "\n" + define.substr(1, define.length() - 2).c_unescape() + "\n"; //add newline before and after jsut in case + + version_texts[version] = define; + } + } else { + if (stage == RD::SHADER_STAGE_MAX && line.strip_edges() != "") { + base_error = "Text was found that does not belong to a valid section: " + line; + break; + } + + if (stage != RD::SHADER_STAGE_MAX) { + if (line.strip_edges().begins_with("#include")) { + if (p_include_func) { + //process include + String include = line.replace("#include", "").strip_edges(); + if (!include.begins_with("\"") || !include.ends_with("\"")) { + base_error = "Malformed #include syntax, expected #include \"<path>\", found instad: " + include; + break; + } + include = include.substr(1, include.length() - 2).strip_edges(); + String include_text = p_include_func(include, p_include_func_userdata); + if (include_text != String()) { + stage_code[stage] += "\n" + include_text + "\n"; + } else { + base_error = "#include failed for file '" + include + "'"; + } + } else { + base_error = "#include used, but no include function provided."; + } + } else { + + stage_code[stage] += line + "\n"; + } + } + } + } + + Ref<RDShaderFile> shader_file; + shader_file.instance(); + + if (base_error == "") { + + if (stage_found[RD::SHADER_STAGE_COMPUTE] && stages_found > 1) { + ERR_FAIL_V_MSG(ERR_PARSE_ERROR, "When writing compute shaders, [compute] mustbe the only stage present."); + } + + if (version_texts.empty()) { + version_texts[""] = ""; //make sure a default version exists + } + + bool errors_found = false; + + /* STEP 2, Compile the versions, add to shader file */ + + for (Map<StringName, String>::Element *E = version_texts.front(); E; E = E->next()) { + + Ref<RDShaderBytecode> bytecode; + bytecode.instance(); + + for (int i = 0; i < RD::SHADER_STAGE_MAX; i++) { + String code = stage_code[i]; + if (code == String()) { + continue; + } + code = code.replace("VERSION_DEFINES", E->get()); + String error; + Vector<uint8_t> spirv = RenderingDevice::get_singleton()->shader_compile_from_source(RD::ShaderStage(i), code, RD::SHADER_LANGUAGE_GLSL, &error, false); + bytecode->set_stage_bytecode(RD::ShaderStage(i), spirv); + if (error != "") { + error += String() + "\n\nStage '" + stage_str[i] + "' source code: \n\n"; + Vector<String> sclines = code.split("\n"); + for (int j = 0; j < sclines.size(); j++) { + error += itos(j + 1) + "\t\t" + sclines[j] + "\n"; + } + errors_found = true; + } + bytecode->set_stage_compile_error(RD::ShaderStage(i), error); + } + + set_bytecode(bytecode, E->key()); + } + + return errors_found ? ERR_PARSE_ERROR : OK; + } else { + return ERR_PARSE_ERROR; + } +} diff --git a/servers/rendering/rendering_device_binds.h b/servers/rendering/rendering_device_binds.h new file mode 100644 index 0000000000..f57f59876d --- /dev/null +++ b/servers/rendering/rendering_device_binds.h @@ -0,0 +1,579 @@ +#ifndef RENDERING_DEVICE_BINDS_H +#define RENDERING_DEVICE_BINDS_H + +#include "servers/rendering/rendering_device.h" + +#define RD_SETGET(m_type, m_member) \ + void set_##m_member(m_type p_##m_member) { base.m_member = p_##m_member; } \ + m_type get_##m_member() const { return base.m_member; } + +#define RD_BIND(m_variant_type, m_class, m_member) \ + ClassDB::bind_method(D_METHOD("set_" _MKSTR(m_member), "p_" _MKSTR(member)), &m_class::set_##m_member); \ + ClassDB::bind_method(D_METHOD("get_" _MKSTR(m_member)), &m_class::get_##m_member); \ + ADD_PROPERTY(PropertyInfo(m_variant_type, #m_member), "set_" _MKSTR(m_member), "get_" _MKSTR(m_member)) + +#define RD_SETGET_SUB(m_type, m_sub, m_member) \ + void set_##m_sub##_##m_member(m_type p_##m_member) { base.m_sub.m_member = p_##m_member; } \ + m_type get_##m_sub##_##m_member() const { return base.m_sub.m_member; } + +#define RD_BIND_SUB(m_variant_type, m_class, m_sub, m_member) \ + ClassDB::bind_method(D_METHOD("set_" _MKSTR(m_sub) "_" _MKSTR(m_member), "p_" _MKSTR(member)), &m_class::set_##m_sub##_##m_member); \ + ClassDB::bind_method(D_METHOD("get_" _MKSTR(m_sub) "_" _MKSTR(m_member)), &m_class::get_##m_sub##_##m_member); \ + ADD_PROPERTY(PropertyInfo(m_variant_type, _MKSTR(m_sub) "_" _MKSTR(m_member)), "set_" _MKSTR(m_sub) "_" _MKSTR(m_member), "get_" _MKSTR(m_sub) "_" _MKSTR(m_member)) + +class RDTextureFormat : public Reference { + GDCLASS(RDTextureFormat, Reference) + friend class RenderingDevice; + + RD::TextureFormat base; + +public: + RD_SETGET(RD::DataFormat, format) + RD_SETGET(uint32_t, width) + RD_SETGET(uint32_t, height) + RD_SETGET(uint32_t, depth) + RD_SETGET(uint32_t, array_layers) + RD_SETGET(uint32_t, mipmaps) + RD_SETGET(RD::TextureType, type) + RD_SETGET(RD::TextureSamples, samples) + RD_SETGET(uint32_t, usage_bits) + + void add_shareable_format(RD::DataFormat p_format) { base.shareable_formats.push_back(p_format); } + void remove_shareable_format(RD::DataFormat p_format) { base.shareable_formats.erase(p_format); } + +protected: + static void _bind_methods() { + RD_BIND(Variant::INT, RDTextureFormat, format); + RD_BIND(Variant::INT, RDTextureFormat, width); + RD_BIND(Variant::INT, RDTextureFormat, height); + RD_BIND(Variant::INT, RDTextureFormat, depth); + RD_BIND(Variant::INT, RDTextureFormat, array_layers); + RD_BIND(Variant::INT, RDTextureFormat, mipmaps); + RD_BIND(Variant::INT, RDTextureFormat, type); + RD_BIND(Variant::INT, RDTextureFormat, samples); + RD_BIND(Variant::INT, RDTextureFormat, usage_bits); + ClassDB::bind_method(D_METHOD("add_shareable_format", "format"), &RDTextureFormat::add_shareable_format); + ClassDB::bind_method(D_METHOD("remove_shareable_format", "format"), &RDTextureFormat::remove_shareable_format); + } +}; + +class RDTextureView : public Reference { + GDCLASS(RDTextureView, Reference) + + friend class RenderingDevice; + + RD::TextureView base; + +public: + RD_SETGET(RD::DataFormat, format_override) + RD_SETGET(RD::TextureSwizzle, swizzle_r) + RD_SETGET(RD::TextureSwizzle, swizzle_g) + RD_SETGET(RD::TextureSwizzle, swizzle_b) + RD_SETGET(RD::TextureSwizzle, swizzle_a) +protected: + static void _bind_methods() { + RD_BIND(Variant::INT, RDTextureView, format_override); + RD_BIND(Variant::INT, RDTextureView, swizzle_r); + RD_BIND(Variant::INT, RDTextureView, swizzle_g); + RD_BIND(Variant::INT, RDTextureView, swizzle_b); + RD_BIND(Variant::INT, RDTextureView, swizzle_a); + } +}; + +class RDAttachmentFormat : public Reference { + GDCLASS(RDAttachmentFormat, Reference) + friend class RenderingDevice; + + RD::AttachmentFormat base; + +public: + RD_SETGET(RD::DataFormat, format) + RD_SETGET(RD::TextureSamples, samples) + RD_SETGET(uint32_t, usage_flags) +protected: + static void _bind_methods() { + RD_BIND(Variant::INT, RDAttachmentFormat, format); + RD_BIND(Variant::INT, RDAttachmentFormat, samples); + RD_BIND(Variant::INT, RDAttachmentFormat, usage_flags); + } +}; + +class RDSamplerState : public Reference { + GDCLASS(RDSamplerState, Reference) + friend class RenderingDevice; + + RD::SamplerState base; + +public: + RD_SETGET(RD::SamplerFilter, mag_filter) + RD_SETGET(RD::SamplerFilter, min_filter) + RD_SETGET(RD::SamplerFilter, mip_filter) + RD_SETGET(RD::SamplerRepeatMode, repeat_u) + RD_SETGET(RD::SamplerRepeatMode, repeat_v) + RD_SETGET(RD::SamplerRepeatMode, repeat_w) + RD_SETGET(float, lod_bias) + RD_SETGET(bool, use_anisotropy) + RD_SETGET(float, anisotropy_max) + RD_SETGET(bool, enable_compare) + RD_SETGET(RD::CompareOperator, compare_op) + RD_SETGET(float, min_lod) + RD_SETGET(float, max_lod) + RD_SETGET(RD::SamplerBorderColor, border_color) + RD_SETGET(bool, unnormalized_uvw) + +protected: + static void _bind_methods() { + + RD_BIND(Variant::INT, RDSamplerState, mag_filter); + RD_BIND(Variant::INT, RDSamplerState, min_filter); + RD_BIND(Variant::INT, RDSamplerState, mip_filter); + RD_BIND(Variant::INT, RDSamplerState, repeat_u); + RD_BIND(Variant::INT, RDSamplerState, repeat_v); + RD_BIND(Variant::INT, RDSamplerState, repeat_w); + RD_BIND(Variant::FLOAT, RDSamplerState, lod_bias); + RD_BIND(Variant::BOOL, RDSamplerState, use_anisotropy); + RD_BIND(Variant::FLOAT, RDSamplerState, anisotropy_max); + RD_BIND(Variant::BOOL, RDSamplerState, enable_compare); + RD_BIND(Variant::INT, RDSamplerState, compare_op); + RD_BIND(Variant::FLOAT, RDSamplerState, min_lod); + RD_BIND(Variant::FLOAT, RDSamplerState, max_lod); + RD_BIND(Variant::INT, RDSamplerState, border_color); + RD_BIND(Variant::BOOL, RDSamplerState, unnormalized_uvw); + } +}; + +class RDVertexAttribute : public Reference { + GDCLASS(RDVertexAttribute, Reference) + friend class RenderingDevice; + RD::VertexAttribute base; + +public: + RD_SETGET(uint32_t, location) + RD_SETGET(uint32_t, offset) + RD_SETGET(RD::DataFormat, format) + RD_SETGET(uint32_t, stride) + RD_SETGET(RD::VertexFrequency, frequency) + +protected: + static void _bind_methods() { + RD_BIND(Variant::INT, RDVertexAttribute, location); + RD_BIND(Variant::INT, RDVertexAttribute, offset); + RD_BIND(Variant::INT, RDVertexAttribute, format); + RD_BIND(Variant::INT, RDVertexAttribute, stride); + RD_BIND(Variant::INT, RDVertexAttribute, frequency); + } +}; +class RDShaderSource : public Reference { + GDCLASS(RDShaderSource, Reference) + String source[RD::SHADER_STAGE_MAX]; + RD::ShaderLanguage language = RD::SHADER_LANGUAGE_GLSL; + +public: + void set_stage_source(RD::ShaderStage p_stage, const String &p_source) { + ERR_FAIL_INDEX(p_stage, RD::SHADER_STAGE_MAX); + source[p_stage] = p_source; + } + + String get_stage_source(RD::ShaderStage p_stage) const { + ERR_FAIL_INDEX_V(p_stage, RD::SHADER_STAGE_MAX, String()); + return source[p_stage]; + } + + void set_language(RD::ShaderLanguage p_language) { + language = p_language; + } + + RD::ShaderLanguage get_language() const { + return language; + } + +protected: + static void _bind_methods() { + ClassDB::bind_method(D_METHOD("set_stage_source", "stage", "source"), &RDShaderSource::set_stage_source); + ClassDB::bind_method(D_METHOD("get_stage_source", "stage"), &RDShaderSource::get_stage_source); + + ClassDB::bind_method(D_METHOD("set_language", "language"), &RDShaderSource::set_language); + ClassDB::bind_method(D_METHOD("get_language"), &RDShaderSource::get_language); + + ADD_GROUP("Source", "source_"); + ADD_PROPERTYI(PropertyInfo(Variant::STRING, "source_vertex"), "set_stage_source", "get_stage_source", RD::SHADER_STAGE_VERTEX); + ADD_PROPERTYI(PropertyInfo(Variant::STRING, "source_fragment"), "set_stage_source", "get_stage_source", RD::SHADER_STAGE_FRAGMENT); + ADD_PROPERTYI(PropertyInfo(Variant::STRING, "source_tesselation_control"), "set_stage_source", "get_stage_source", RD::SHADER_STAGE_TESSELATION_CONTROL); + ADD_PROPERTYI(PropertyInfo(Variant::STRING, "source_tesselation_evaluation"), "set_stage_source", "get_stage_source", RD::SHADER_STAGE_TESSELATION_EVALUATION); + ADD_PROPERTYI(PropertyInfo(Variant::STRING, "source_compute"), "set_stage_source", "get_stage_source", RD::SHADER_STAGE_COMPUTE); + ADD_GROUP("Syntax", "source_"); + ADD_PROPERTY(PropertyInfo(Variant::INT, "language", PROPERTY_HINT_RANGE, "GLSL,HLSL"), "set_language", "get_language"); + } +}; + +class RDShaderBytecode : public Resource { + GDCLASS(RDShaderBytecode, Resource) + + Vector<uint8_t> bytecode[RD::SHADER_STAGE_MAX]; + String compile_error[RD::SHADER_STAGE_MAX]; + +public: + void set_stage_bytecode(RD::ShaderStage p_stage, const Vector<uint8_t> &p_bytecode) { + ERR_FAIL_INDEX(p_stage, RD::SHADER_STAGE_MAX); + bytecode[p_stage] = p_bytecode; + } + + Vector<uint8_t> get_stage_bytecode(RD::ShaderStage p_stage) const { + ERR_FAIL_INDEX_V(p_stage, RD::SHADER_STAGE_MAX, Vector<uint8_t>()); + return bytecode[p_stage]; + } + + void set_stage_compile_error(RD::ShaderStage p_stage, const String &p_compile_error) { + ERR_FAIL_INDEX(p_stage, RD::SHADER_STAGE_MAX); + compile_error[p_stage] = p_compile_error; + } + + String get_stage_compile_error(RD::ShaderStage p_stage) const { + ERR_FAIL_INDEX_V(p_stage, RD::SHADER_STAGE_MAX, String()); + return compile_error[p_stage]; + } + +protected: + static void _bind_methods() { + ClassDB::bind_method(D_METHOD("set_stage_bytecode", "stage", "bytecode"), &RDShaderBytecode::set_stage_bytecode); + ClassDB::bind_method(D_METHOD("get_stage_bytecode", "stage"), &RDShaderBytecode::get_stage_bytecode); + + ClassDB::bind_method(D_METHOD("set_stage_compile_error", "stage", "compile_error"), &RDShaderBytecode::set_stage_compile_error); + ClassDB::bind_method(D_METHOD("get_stage_compile_error", "stage"), &RDShaderBytecode::get_stage_compile_error); + + ADD_GROUP("Bytecode", "bytecode_"); + ADD_PROPERTYI(PropertyInfo(Variant::PACKED_BYTE_ARRAY, "bytecode_vertex"), "set_stage_bytecode", "get_stage_bytecode", RD::SHADER_STAGE_VERTEX); + ADD_PROPERTYI(PropertyInfo(Variant::PACKED_BYTE_ARRAY, "bytecode_fragment"), "set_stage_bytecode", "get_stage_bytecode", RD::SHADER_STAGE_FRAGMENT); + ADD_PROPERTYI(PropertyInfo(Variant::PACKED_BYTE_ARRAY, "bytecode_tesselation_control"), "set_stage_bytecode", "get_stage_bytecode", RD::SHADER_STAGE_TESSELATION_CONTROL); + ADD_PROPERTYI(PropertyInfo(Variant::PACKED_BYTE_ARRAY, "bytecode_tesselation_evaluation"), "set_stage_bytecode", "get_stage_bytecode", RD::SHADER_STAGE_TESSELATION_EVALUATION); + ADD_PROPERTYI(PropertyInfo(Variant::PACKED_BYTE_ARRAY, "bytecode_compute"), "set_stage_bytecode", "get_stage_bytecode", RD::SHADER_STAGE_COMPUTE); + ADD_GROUP("Compile Error", "compile_error_"); + ADD_PROPERTYI(PropertyInfo(Variant::STRING, "compile_error_vertex"), "set_stage_compile_error", "get_stage_compile_error", RD::SHADER_STAGE_VERTEX); + ADD_PROPERTYI(PropertyInfo(Variant::STRING, "compile_error_fragment"), "set_stage_compile_error", "get_stage_compile_error", RD::SHADER_STAGE_FRAGMENT); + ADD_PROPERTYI(PropertyInfo(Variant::STRING, "compile_error_tesselation_control"), "set_stage_compile_error", "get_stage_compile_error", RD::SHADER_STAGE_TESSELATION_CONTROL); + ADD_PROPERTYI(PropertyInfo(Variant::STRING, "compile_error_tesselation_evaluation"), "set_stage_compile_error", "get_stage_compile_error", RD::SHADER_STAGE_TESSELATION_EVALUATION); + ADD_PROPERTYI(PropertyInfo(Variant::STRING, "compile_error_compute"), "set_stage_compile_error", "get_stage_compile_error", RD::SHADER_STAGE_COMPUTE); + } +}; + +class RDShaderFile : public Resource { + GDCLASS(RDShaderFile, Resource) + + Map<StringName, Ref<RDShaderBytecode>> versions; + String base_error; + +public: + void set_bytecode(const Ref<RDShaderBytecode> &p_bytecode, const StringName &p_version = StringName()) { + ERR_FAIL_COND(p_bytecode.is_null()); + versions[p_version] = p_bytecode; + emit_changed(); + } + + Ref<RDShaderBytecode> get_bytecode(const StringName &p_version = StringName()) const { + ERR_FAIL_COND_V(!versions.has(p_version), Ref<RDShaderBytecode>()); + return versions[p_version]; + } + + Vector<StringName> get_version_list() const { + Vector<StringName> vnames; + for (Map<StringName, Ref<RDShaderBytecode>>::Element *E = versions.front(); E; E = E->next()) { + vnames.push_back(E->key()); + } + vnames.sort_custom<StringName::AlphCompare>(); + return vnames; + } + + void set_base_error(const String &p_error) { + base_error = p_error; + emit_changed(); + } + + String get_base_error() const { + return base_error; + } + + typedef String (*OpenIncludeFunction)(const String &, void *userdata); + Error parse_versions_from_text(const String &p_text, OpenIncludeFunction p_include_func = nullptr, void *p_include_func_userdata = nullptr); + +protected: + Dictionary _get_versions() const { + Vector<StringName> vnames = get_version_list(); + Dictionary ret; + for (int i = 0; i < vnames.size(); i++) { + ret[vnames[i]] = versions[vnames[i]]; + } + return ret; + } + void _set_versions(const Dictionary &p_versions) { + versions.clear(); + List<Variant> keys; + p_versions.get_key_list(&keys); + for (List<Variant>::Element *E = keys.front(); E; E = E->next()) { + StringName name = E->get(); + Ref<RDShaderBytecode> bc = p_versions[E->get()]; + ERR_CONTINUE(bc.is_null()); + versions[name] = bc; + } + + emit_changed(); + } + + static void _bind_methods() { + ClassDB::bind_method(D_METHOD("set_bytecode", "bytecode", "version"), &RDShaderFile::set_bytecode, DEFVAL(StringName())); + ClassDB::bind_method(D_METHOD("get_bytecode", "version"), &RDShaderFile::get_bytecode, DEFVAL(StringName())); + ClassDB::bind_method(D_METHOD("get_version_list"), &RDShaderFile::get_version_list); + + ClassDB::bind_method(D_METHOD("set_base_error", "error"), &RDShaderFile::set_base_error); + ClassDB::bind_method(D_METHOD("get_base_error"), &RDShaderFile::get_base_error); + + ClassDB::bind_method(D_METHOD("_set_versions", "versions"), &RDShaderFile::_set_versions); + ClassDB::bind_method(D_METHOD("_get_versions"), &RDShaderFile::_get_versions); + + ADD_PROPERTY(PropertyInfo(Variant::DICTIONARY, "_versions", PROPERTY_HINT_NONE, "", PROPERTY_USAGE_NOEDITOR | PROPERTY_USAGE_INTERNAL), "_set_versions", "_get_versions"); + ADD_PROPERTY(PropertyInfo(Variant::STRING, "base_error"), "set_base_error", "get_base_error"); + } +}; + +class RDUniform : public Reference { + GDCLASS(RDUniform, Reference) + friend class RenderingDevice; + RD::Uniform base; + +public: + RD_SETGET(RD::UniformType, type) + RD_SETGET(int32_t, binding) + + void add_id(const RID &p_id) { base.ids.push_back(p_id); } + void clear_ids() { base.ids.clear(); } + Array get_ids() const { + Array ids; + for (int i = 0; i < base.ids.size(); i++) { + ids.push_back(base.ids[i]); + } + return ids; + } + +protected: + void _set_ids(const Array &p_ids) { + base.ids.clear(); + for (int i = 0; i < p_ids.size(); i++) { + RID id = p_ids[i]; + ERR_FAIL_COND(id.is_null()); + base.ids.push_back(id); + } + } + static void _bind_methods() { + RD_BIND(Variant::INT, RDUniform, type); + RD_BIND(Variant::INT, RDUniform, binding); + ClassDB::bind_method(D_METHOD("add_id", "id"), &RDUniform::add_id); + ClassDB::bind_method(D_METHOD("clear_ids"), &RDUniform::clear_ids); + ClassDB::bind_method(D_METHOD("_set_ids", "ids"), &RDUniform::_set_ids); + ClassDB::bind_method(D_METHOD("get_ids"), &RDUniform::get_ids); + ADD_PROPERTY(PropertyInfo(Variant::ARRAY, "_ids", PROPERTY_HINT_NONE, "", PROPERTY_USAGE_DEFAULT | PROPERTY_USAGE_INTERNAL), "_set_ids", "get_ids"); + } +}; +class RDPipelineRasterizationState : public Reference { + GDCLASS(RDPipelineRasterizationState, Reference) + friend class RenderingDevice; + + RD::PipelineRasterizationState base; + +public: + RD_SETGET(bool, enable_depth_clamp) + RD_SETGET(bool, discard_primitives) + RD_SETGET(bool, wireframe) + RD_SETGET(RD::PolygonCullMode, cull_mode) + RD_SETGET(RD::PolygonFrontFace, front_face) + RD_SETGET(bool, depth_bias_enable) + RD_SETGET(float, depth_bias_constant_factor) + RD_SETGET(float, depth_bias_clamp) + RD_SETGET(float, depth_bias_slope_factor) + RD_SETGET(float, line_width) + RD_SETGET(uint32_t, patch_control_points) + +protected: + static void _bind_methods() { + RD_BIND(Variant::BOOL, RDPipelineRasterizationState, enable_depth_clamp); + RD_BIND(Variant::BOOL, RDPipelineRasterizationState, discard_primitives); + RD_BIND(Variant::BOOL, RDPipelineRasterizationState, wireframe); + RD_BIND(Variant::INT, RDPipelineRasterizationState, cull_mode); + RD_BIND(Variant::INT, RDPipelineRasterizationState, front_face); + RD_BIND(Variant::BOOL, RDPipelineRasterizationState, depth_bias_enable); + RD_BIND(Variant::FLOAT, RDPipelineRasterizationState, depth_bias_constant_factor); + RD_BIND(Variant::FLOAT, RDPipelineRasterizationState, depth_bias_clamp); + RD_BIND(Variant::FLOAT, RDPipelineRasterizationState, depth_bias_slope_factor); + RD_BIND(Variant::FLOAT, RDPipelineRasterizationState, line_width); + RD_BIND(Variant::INT, RDPipelineRasterizationState, patch_control_points); + } +}; + +class RDPipelineMultisampleState : public Reference { + GDCLASS(RDPipelineMultisampleState, Reference) + friend class RenderingDevice; + + RD::PipelineMultisampleState base; + TypedArray<int64_t> sample_masks; + +public: + RD_SETGET(RD::TextureSamples, sample_count) + RD_SETGET(bool, enable_sample_shading) + RD_SETGET(float, min_sample_shading) + RD_SETGET(bool, enable_alpha_to_coverage) + RD_SETGET(bool, enable_alpha_to_one) + + void set_sample_masks(const TypedArray<int64_t> &p_masks) { sample_masks = p_masks; } + TypedArray<int64_t> get_sample_masks() const { return sample_masks; } + +protected: + static void _bind_methods() { + RD_BIND(Variant::INT, RDPipelineMultisampleState, sample_count); + RD_BIND(Variant::BOOL, RDPipelineMultisampleState, enable_sample_shading); + RD_BIND(Variant::FLOAT, RDPipelineMultisampleState, min_sample_shading); + RD_BIND(Variant::BOOL, RDPipelineMultisampleState, enable_alpha_to_coverage); + RD_BIND(Variant::BOOL, RDPipelineMultisampleState, enable_alpha_to_one); + + ClassDB::bind_method(D_METHOD("set_sample_masks", "masks"), &RDPipelineMultisampleState::set_sample_masks); + ClassDB::bind_method(D_METHOD("get_sample_masks"), &RDPipelineMultisampleState::get_sample_masks); + ADD_PROPERTY(PropertyInfo(Variant::ARRAY, "sample_masks", PROPERTY_HINT_ARRAY_TYPE, "int"), "set_sample_masks", "get_sample_masks"); + } +}; + +class RDPipelineDepthStencilState : public Reference { + GDCLASS(RDPipelineDepthStencilState, Reference) + friend class RenderingDevice; + + RD::PipelineDepthStencilState base; + +public: + RD_SETGET(bool, enable_depth_test) + RD_SETGET(bool, enable_depth_write) + RD_SETGET(RD::CompareOperator, depth_compare_operator) + RD_SETGET(bool, enable_depth_range) + RD_SETGET(float, depth_range_min) + RD_SETGET(float, depth_range_max) + RD_SETGET(bool, enable_stencil) + + RD_SETGET_SUB(RD::StencilOperation, front_op, fail) + RD_SETGET_SUB(RD::StencilOperation, front_op, pass) + RD_SETGET_SUB(RD::StencilOperation, front_op, depth_fail) + RD_SETGET_SUB(RD::CompareOperator, front_op, compare) + RD_SETGET_SUB(uint32_t, front_op, compare_mask) + RD_SETGET_SUB(uint32_t, front_op, write_mask) + RD_SETGET_SUB(uint32_t, front_op, reference) + + RD_SETGET_SUB(RD::StencilOperation, back_op, fail) + RD_SETGET_SUB(RD::StencilOperation, back_op, pass) + RD_SETGET_SUB(RD::StencilOperation, back_op, depth_fail) + RD_SETGET_SUB(RD::CompareOperator, back_op, compare) + RD_SETGET_SUB(uint32_t, back_op, compare_mask) + RD_SETGET_SUB(uint32_t, back_op, write_mask) + RD_SETGET_SUB(uint32_t, back_op, reference) + +protected: + static void _bind_methods() { + RD_BIND(Variant::BOOL, RDPipelineDepthStencilState, enable_depth_test); + RD_BIND(Variant::BOOL, RDPipelineDepthStencilState, enable_depth_write); + RD_BIND(Variant::INT, RDPipelineDepthStencilState, depth_compare_operator); + RD_BIND(Variant::BOOL, RDPipelineDepthStencilState, enable_depth_range); + RD_BIND(Variant::FLOAT, RDPipelineDepthStencilState, depth_range_min); + RD_BIND(Variant::FLOAT, RDPipelineDepthStencilState, depth_range_max); + RD_BIND(Variant::BOOL, RDPipelineDepthStencilState, enable_stencil); + + RD_BIND_SUB(Variant::INT, RDPipelineDepthStencilState, front_op, fail); + RD_BIND_SUB(Variant::INT, RDPipelineDepthStencilState, front_op, pass); + RD_BIND_SUB(Variant::INT, RDPipelineDepthStencilState, front_op, depth_fail); + RD_BIND_SUB(Variant::INT, RDPipelineDepthStencilState, front_op, compare); + RD_BIND_SUB(Variant::INT, RDPipelineDepthStencilState, front_op, compare_mask); + RD_BIND_SUB(Variant::INT, RDPipelineDepthStencilState, front_op, write_mask); + RD_BIND_SUB(Variant::INT, RDPipelineDepthStencilState, front_op, reference); + + RD_BIND_SUB(Variant::INT, RDPipelineDepthStencilState, back_op, fail); + RD_BIND_SUB(Variant::INT, RDPipelineDepthStencilState, back_op, pass); + RD_BIND_SUB(Variant::INT, RDPipelineDepthStencilState, back_op, depth_fail); + RD_BIND_SUB(Variant::INT, RDPipelineDepthStencilState, back_op, compare); + RD_BIND_SUB(Variant::INT, RDPipelineDepthStencilState, back_op, compare_mask); + RD_BIND_SUB(Variant::INT, RDPipelineDepthStencilState, back_op, write_mask); + RD_BIND_SUB(Variant::INT, RDPipelineDepthStencilState, back_op, reference); + } +}; + +class RDPipelineColorBlendStateAttachment : public Reference { + GDCLASS(RDPipelineColorBlendStateAttachment, Reference) + friend class RenderingDevice; + RD::PipelineColorBlendState::Attachment base; + +public: + RD_SETGET(bool, enable_blend) + RD_SETGET(RD::BlendFactor, src_color_blend_factor) + RD_SETGET(RD::BlendFactor, dst_color_blend_factor) + RD_SETGET(RD::BlendOperation, color_blend_op) + RD_SETGET(RD::BlendFactor, src_alpha_blend_factor) + RD_SETGET(RD::BlendFactor, dst_alpha_blend_factor) + RD_SETGET(RD::BlendOperation, alpha_blend_op) + RD_SETGET(bool, write_r) + RD_SETGET(bool, write_g) + RD_SETGET(bool, write_b) + RD_SETGET(bool, write_a) + + void set_as_mix() { + + base = RD::PipelineColorBlendState::Attachment(); + base.enable_blend = true; + base.src_color_blend_factor = RD::BLEND_FACTOR_SRC_ALPHA; + base.dst_color_blend_factor = RD::BLEND_FACTOR_ONE_MINUS_SRC_ALPHA; + base.src_alpha_blend_factor = RD::BLEND_FACTOR_SRC_ALPHA; + base.dst_alpha_blend_factor = RD::BLEND_FACTOR_ONE_MINUS_SRC_ALPHA; + } + +protected: + static void _bind_methods() { + + ClassDB::bind_method(D_METHOD("set_as_mix"), &RDPipelineColorBlendStateAttachment::set_as_mix); + + RD_BIND(Variant::BOOL, RDPipelineColorBlendStateAttachment, enable_blend); + RD_BIND(Variant::INT, RDPipelineColorBlendStateAttachment, src_color_blend_factor); + RD_BIND(Variant::INT, RDPipelineColorBlendStateAttachment, dst_color_blend_factor); + RD_BIND(Variant::INT, RDPipelineColorBlendStateAttachment, color_blend_op); + RD_BIND(Variant::INT, RDPipelineColorBlendStateAttachment, src_alpha_blend_factor); + RD_BIND(Variant::INT, RDPipelineColorBlendStateAttachment, dst_alpha_blend_factor); + RD_BIND(Variant::INT, RDPipelineColorBlendStateAttachment, alpha_blend_op); + RD_BIND(Variant::BOOL, RDPipelineColorBlendStateAttachment, write_r); + RD_BIND(Variant::BOOL, RDPipelineColorBlendStateAttachment, write_g); + RD_BIND(Variant::BOOL, RDPipelineColorBlendStateAttachment, write_b); + RD_BIND(Variant::BOOL, RDPipelineColorBlendStateAttachment, write_a); + } +}; + +class RDPipelineColorBlendState : public Reference { + GDCLASS(RDPipelineColorBlendState, Reference) + friend class RenderingDevice; + RD::PipelineColorBlendState base; + + TypedArray<RDPipelineColorBlendStateAttachment> attachments; + +public: + RD_SETGET(bool, enable_logic_op) + RD_SETGET(RD::LogicOperation, logic_op) + RD_SETGET(Color, blend_constant) + + void set_attachments(const TypedArray<RDPipelineColorBlendStateAttachment> &p_attachments) { + attachments.push_back(p_attachments); + } + + TypedArray<RDPipelineColorBlendStateAttachment> get_attachments() const { + return attachments; + } + +protected: + static void _bind_methods() { + RD_BIND(Variant::BOOL, RDPipelineColorBlendState, enable_logic_op); + RD_BIND(Variant::INT, RDPipelineColorBlendState, logic_op); + RD_BIND(Variant::COLOR, RDPipelineColorBlendState, blend_constant); + + ClassDB::bind_method(D_METHOD("set_attachments", "atachments"), &RDPipelineColorBlendState::set_attachments); + ClassDB::bind_method(D_METHOD("get_attachments"), &RDPipelineColorBlendState::get_attachments); + ADD_PROPERTY(PropertyInfo(Variant::ARRAY, "attachments", PROPERTY_HINT_ARRAY_TYPE, "RDPipelineColorBlendStateAttachment"), "set_attachments", "get_attachments"); + } +}; + +#endif // RENDERING_DEVICE_BINDS_H diff --git a/servers/rendering/rendering_server_raster.cpp b/servers/rendering/rendering_server_raster.cpp index 7cc06527e4..c6f3273339 100644 --- a/servers/rendering/rendering_server_raster.cpp +++ b/servers/rendering/rendering_server_raster.cpp @@ -135,16 +135,27 @@ void RenderingServerRaster::draw(bool p_swap_buffers, double frame_step) { if (RSG::storage->get_captured_timestamps_count()) { Vector<FrameProfileArea> new_profile; - new_profile.resize(RSG::storage->get_captured_timestamps_count()); + if (RSG::storage->capturing_timestamps) { + new_profile.resize(RSG::storage->get_captured_timestamps_count()); + } uint64_t base_cpu = RSG::storage->get_captured_timestamp_cpu_time(0); uint64_t base_gpu = RSG::storage->get_captured_timestamp_gpu_time(0); for (uint32_t i = 0; i < RSG::storage->get_captured_timestamps_count(); i++) { - uint64_t time_cpu = RSG::storage->get_captured_timestamp_cpu_time(i) - base_cpu; - uint64_t time_gpu = RSG::storage->get_captured_timestamp_gpu_time(i) - base_gpu; - new_profile.write[i].gpu_msec = float(time_gpu / 1000) / 1000.0; - new_profile.write[i].cpu_msec = float(time_cpu) / 1000.0; - new_profile.write[i].name = RSG::storage->get_captured_timestamp_name(i); + uint64_t time_cpu = RSG::storage->get_captured_timestamp_cpu_time(i); + uint64_t time_gpu = RSG::storage->get_captured_timestamp_gpu_time(i); + + String name = RSG::storage->get_captured_timestamp_name(i); + + if (name.begins_with("vp_")) { + RSG::viewport->handle_timestamp(name, time_cpu, time_gpu); + } + + if (RSG::storage->capturing_timestamps) { + new_profile.write[i].gpu_msec = float((time_gpu - base_gpu) / 1000) / 1000.0; + new_profile.write[i].cpu_msec = float(time_cpu - base_cpu) / 1000.0; + new_profile.write[i].name = RSG::storage->get_captured_timestamp_name(i); + } } frame_profile = new_profile; diff --git a/servers/rendering/rendering_server_raster.h b/servers/rendering/rendering_server_raster.h index 267efdbacb..f7b963a015 100644 --- a/servers/rendering/rendering_server_raster.h +++ b/servers/rendering/rendering_server_raster.h @@ -98,6 +98,8 @@ public: #define BIND0R(m_r, m_name) \ m_r m_name() { return BINDBASE->m_name(); } +#define BIND0RC(m_r, m_name) \ + m_r m_name() const { return BINDBASE->m_name(); } #define BIND1R(m_r, m_name, m_type1) \ m_r m_name(m_type1 arg1) { return BINDBASE->m_name(arg1); } #define BIND1RC(m_r, m_name, m_type1) \ @@ -111,8 +113,12 @@ public: #define BIND4RC(m_r, m_name, m_type1, m_type2, m_type3, m_type4) \ m_r m_name(m_type1 arg1, m_type2 arg2, m_type3 arg3, m_type4 arg4) const { return BINDBASE->m_name(arg1, arg2, arg3, arg4); } +#define BIND0(m_name) \ + void m_name() { DISPLAY_CHANGED BINDBASE->m_name(); } #define BIND1(m_name, m_type1) \ void m_name(m_type1 arg1) { DISPLAY_CHANGED BINDBASE->m_name(arg1); } +#define BIND1C(m_name, m_type1) \ + void m_name(m_type1 arg1) const { DISPLAY_CHANGED BINDBASE->m_name(arg1); } #define BIND2(m_name, m_type1, m_type2) \ void m_name(m_type1 arg1, m_type2 arg2) { DISPLAY_CHANGED BINDBASE->m_name(arg1, arg2); } #define BIND2C(m_name, m_type1, m_type2) \ @@ -340,6 +346,20 @@ public: BIND2(reflection_probe_set_cull_mask, RID, uint32_t) BIND2(reflection_probe_set_resolution, RID, int) + /* DECAL API */ + + BIND0R(RID, decal_create) + + BIND2(decal_set_extents, RID, const Vector3 &) + BIND3(decal_set_texture, RID, DecalTexture, RID) + BIND2(decal_set_emission_energy, RID, float) + BIND2(decal_set_albedo_mix, RID, float) + BIND2(decal_set_modulate, RID, const Color &) + BIND2(decal_set_cull_mask, RID, uint32_t) + BIND4(decal_set_distance_fade, RID, bool, float, float) + BIND3(decal_set_fade, RID, float, float) + BIND2(decal_set_normal_fade, RID, float) + /* BAKED LIGHT API */ BIND0R(RID, gi_probe_create) @@ -456,7 +476,7 @@ public: BIND0R(RID, viewport_create) - BIND2(viewport_set_use_arvr, RID, bool) + BIND2(viewport_set_use_xr, RID, bool) BIND3(viewport_set_size, RID, int, int) BIND2(viewport_set_active, RID, bool) @@ -489,10 +509,15 @@ public: BIND2(viewport_set_shadow_atlas_size, RID, int) BIND3(viewport_set_shadow_atlas_quadrant_subdivision, RID, int, int) BIND2(viewport_set_msaa, RID, ViewportMSAA) + BIND2(viewport_set_screen_space_aa, RID, ViewportScreenSpaceAA) BIND2R(int, viewport_get_render_info, RID, ViewportRenderInfo) BIND2(viewport_set_debug_draw, RID, ViewportDebugDraw) + BIND2(viewport_set_measure_render_time, RID, bool) + BIND1RC(float, viewport_get_measured_render_time_cpu, RID) + BIND1RC(float, viewport_get_measured_render_time_gpu, RID) + /* ENVIRONMENT API */ #undef BINDBASE @@ -554,6 +579,9 @@ public: BIND8(camera_effects_set_dof_blur, RID, bool, float, float, bool, float, float, float) BIND3(camera_effects_set_custom_exposure, RID, bool, float) + BIND1(shadows_quality_set, ShadowQuality); + BIND1(directional_shadow_quality_set, ShadowQuality); + /* SCENARIO API */ #undef BINDBASE @@ -598,6 +626,11 @@ public: BIND5(instance_geometry_set_draw_range, RID, float, float, float, float) BIND2(instance_geometry_set_as_instance_lod, RID, RID) + BIND3(instance_geometry_set_shader_parameter, RID, const StringName &, const Variant &) + BIND2RC(Variant, instance_geometry_get_shader_parameter, RID, const StringName &) + BIND2RC(Variant, instance_geometry_get_shader_parameter_default_value, RID, const StringName &) + BIND2C(instance_geometry_get_shader_parameter_list, RID, List<PropertyInfo> *) + #undef BINDBASE //from now on, calls forwarded to this singleton #define BINDBASE RSG::canvas @@ -695,6 +728,23 @@ public: BIND2(canvas_occluder_polygon_set_cull_mode, RID, CanvasOccluderPolygonCullMode) + /* GLOBAL VARIABLES */ + +#undef BINDBASE +//from now on, calls forwarded to this singleton +#define BINDBASE RSG::storage + + BIND3(global_variable_add, const StringName &, GlobalVariableType, const Variant &) + BIND1(global_variable_remove, const StringName &) + BIND0RC(Vector<StringName>, global_variable_get_list) + BIND2(global_variable_set, const StringName &, const Variant &) + BIND2(global_variable_set_override, const StringName &, const Variant &) + BIND1RC(GlobalVariableType, global_variable_get_type, const StringName &) + BIND1RC(Variant, global_variable_get, const StringName &) + + BIND1(global_variables_load_settings, bool) + BIND0(global_variables_clear) + /* BLACK BARS */ virtual void black_bars_set_margins(int p_left, int p_top, int p_right, int p_bottom); diff --git a/servers/rendering/rendering_server_scene.cpp b/servers/rendering/rendering_server_scene.cpp index 65823e11aa..2c3c2730d5 100644 --- a/servers/rendering/rendering_server_scene.cpp +++ b/servers/rendering/rendering_server_scene.cpp @@ -155,6 +155,20 @@ void *RenderingServerScene::_instance_pair(void *p_self, OctreeElementID, Instan geom->reflection_dirty = true; return E; //this element should make freeing faster + } else if (B->base_type == RS::INSTANCE_DECAL && ((1 << A->base_type) & RS::INSTANCE_GEOMETRY_MASK)) { + + InstanceDecalData *decal = static_cast<InstanceDecalData *>(B->base_data); + InstanceGeometryData *geom = static_cast<InstanceGeometryData *>(A->base_data); + + InstanceDecalData::PairInfo pinfo; + pinfo.geometry = A; + pinfo.L = geom->decals.push_back(B); + + List<InstanceDecalData::PairInfo>::Element *E = decal->geometries.push_back(pinfo); + + geom->decal_dirty = true; + + return E; //this element should make freeing faster } else if (B->base_type == RS::INSTANCE_LIGHTMAP_CAPTURE && ((1 << A->base_type) & RS::INSTANCE_GEOMETRY_MASK)) { InstanceLightmapCaptureData *lightmap_capture = static_cast<InstanceLightmapCaptureData *>(B->base_data); @@ -233,6 +247,17 @@ void RenderingServerScene::_instance_unpair(void *p_self, OctreeElementID, Insta reflection_probe->geometries.erase(E); geom->reflection_dirty = true; + } else if (B->base_type == RS::INSTANCE_DECAL && ((1 << A->base_type) & RS::INSTANCE_GEOMETRY_MASK)) { + + InstanceDecalData *decal = static_cast<InstanceDecalData *>(B->base_data); + InstanceGeometryData *geom = static_cast<InstanceGeometryData *>(A->base_data); + + List<InstanceDecalData::PairInfo>::Element *E = reinterpret_cast<List<InstanceDecalData::PairInfo>::Element *>(udata); + + geom->decals.erase(E->get().L); + decal->geometries.erase(E); + + geom->decal_dirty = true; } else if (B->base_type == RS::INSTANCE_LIGHTMAP_CAPTURE && ((1 << A->base_type) & RS::INSTANCE_GEOMETRY_MASK)) { InstanceLightmapCaptureData *lightmap_capture = static_cast<InstanceLightmapCaptureData *>(B->base_data); @@ -387,6 +412,12 @@ void RenderingServerScene::instance_set_base(RID p_instance, RID p_base) { reflection_probe_render_list.remove(&reflection_probe->update_list); } } break; + case RS::INSTANCE_DECAL: { + + InstanceDecalData *decal = static_cast<InstanceDecalData *>(instance->base_data); + RSG::scene_render->free(decal->instance); + + } break; case RS::INSTANCE_LIGHTMAP_CAPTURE: { InstanceLightmapCaptureData *lightmap_capture = static_cast<InstanceLightmapCaptureData *>(instance->base_data); @@ -476,6 +507,14 @@ void RenderingServerScene::instance_set_base(RID p_instance, RID p_base) { reflection_probe->instance = RSG::scene_render->reflection_probe_instance_create(p_base); } break; + case RS::INSTANCE_DECAL: { + + InstanceDecalData *decal = memnew(InstanceDecalData); + decal->owner = instance; + instance->base_data = decal; + + decal->instance = RSG::scene_render->decal_instance_create(p_base); + } break; case RS::INSTANCE_LIGHTMAP_CAPTURE: { InstanceLightmapCaptureData *lightmap_capture = memnew(InstanceLightmapCaptureData); @@ -691,6 +730,12 @@ void RenderingServerScene::instance_set_visible(RID p_instance, bool p_visible) } } break; + case RS::INSTANCE_DECAL: { + if (instance->octree_id && instance->scenario) { + instance->scenario->octree.set_pairable(instance->octree_id, p_visible, 1 << RS::INSTANCE_DECAL, p_visible ? RS::INSTANCE_GEOMETRY_MASK : 0); + } + + } break; case RS::INSTANCE_LIGHTMAP_CAPTURE: { if (instance->octree_id && instance->scenario) { instance->scenario->octree.set_pairable(instance->octree_id, p_visible, 1 << RS::INSTANCE_LIGHTMAP_CAPTURE, p_visible ? RS::INSTANCE_GEOMETRY_MASK : 0); @@ -923,6 +968,67 @@ void RenderingServerScene::instance_geometry_set_draw_range(RID p_instance, floa void RenderingServerScene::instance_geometry_set_as_instance_lod(RID p_instance, RID p_as_lod_of_instance) { } +void RenderingServerScene::instance_geometry_set_shader_parameter(RID p_instance, const StringName &p_parameter, const Variant &p_value) { + + Instance *instance = instance_owner.getornull(p_instance); + ERR_FAIL_COND(!instance); + + Map<StringName, RasterizerScene::InstanceBase::InstanceShaderParameter>::Element *E = instance->instance_shader_parameters.find(p_parameter); + + if (!E) { + RasterizerScene::InstanceBase::InstanceShaderParameter isp; + isp.index = -1; + isp.info = PropertyInfo(); + isp.value = p_value; + instance->instance_shader_parameters[p_parameter] = isp; + } else { + E->get().value = p_value; + if (E->get().index >= 0 && instance->instance_allocated_shader_parameters) { + //update directly + RSG::storage->global_variables_instance_update(p_instance, E->get().index, p_value); + } + } +} + +Variant RenderingServerScene::instance_geometry_get_shader_parameter(RID p_instance, const StringName &p_parameter) const { + + const Instance *instance = const_cast<RenderingServerScene *>(this)->instance_owner.getornull(p_instance); + ERR_FAIL_COND_V(!instance, Variant()); + + if (instance->instance_shader_parameters.has(p_parameter)) { + return instance->instance_shader_parameters[p_parameter].value; + } + return Variant(); +} + +Variant RenderingServerScene::instance_geometry_get_shader_parameter_default_value(RID p_instance, const StringName &p_parameter) const { + + const Instance *instance = const_cast<RenderingServerScene *>(this)->instance_owner.getornull(p_instance); + ERR_FAIL_COND_V(!instance, Variant()); + + if (instance->instance_shader_parameters.has(p_parameter)) { + return instance->instance_shader_parameters[p_parameter].default_value; + } + return Variant(); +} + +void RenderingServerScene::instance_geometry_get_shader_parameter_list(RID p_instance, List<PropertyInfo> *p_parameters) const { + const Instance *instance = const_cast<RenderingServerScene *>(this)->instance_owner.getornull(p_instance); + ERR_FAIL_COND(!instance); + + const_cast<RenderingServerScene *>(this)->update_dirty_instances(); + + Vector<StringName> names; + for (Map<StringName, RasterizerScene::InstanceBase::InstanceShaderParameter>::Element *E = instance->instance_shader_parameters.front(); E; E = E->next()) { + names.push_back(E->key()); + } + names.sort_custom<StringName::AlphCompare>(); + for (int i = 0; i < names.size(); i++) { + PropertyInfo pinfo = instance->instance_shader_parameters[names[i]].info; + p_parameters->push_back(pinfo); + } +} + void RenderingServerScene::_update_instance(Instance *p_instance) { p_instance->version++; @@ -943,6 +1049,13 @@ void RenderingServerScene::_update_instance(Instance *p_instance) { reflection_probe->reflection_dirty = true; } + if (p_instance->base_type == RS::INSTANCE_DECAL) { + + InstanceDecalData *decal = static_cast<InstanceDecalData *>(p_instance->base_data); + + RSG::scene_render->decal_instance_set_transform(decal->instance, p_instance->transform); + } + if (p_instance->base_type == RS::INSTANCE_GI_PROBE) { InstanceGIProbeData *gi_probe = static_cast<InstanceGIProbeData *>(p_instance->base_data); @@ -1000,7 +1113,7 @@ void RenderingServerScene::_update_instance(Instance *p_instance) { uint32_t pairable_mask = 0; bool pairable = false; - if (p_instance->base_type == RS::INSTANCE_LIGHT || p_instance->base_type == RS::INSTANCE_REFLECTION_PROBE || p_instance->base_type == RS::INSTANCE_LIGHTMAP_CAPTURE) { + if (p_instance->base_type == RS::INSTANCE_LIGHT || p_instance->base_type == RS::INSTANCE_REFLECTION_PROBE || p_instance->base_type == RS::INSTANCE_DECAL || p_instance->base_type == RS::INSTANCE_LIGHTMAP_CAPTURE) { pairable_mask = p_instance->visible ? RS::INSTANCE_GEOMETRY_MASK : 0; pairable = true; @@ -1080,6 +1193,11 @@ void RenderingServerScene::_update_instance_aabb(Instance *p_instance) { new_aabb = RSG::storage->reflection_probe_get_aabb(p_instance->base); } break; + case RenderingServer::INSTANCE_DECAL: { + + new_aabb = RSG::storage->decal_get_aabb(p_instance->base); + + } break; case RenderingServer::INSTANCE_GI_PROBE: { new_aabb = RSG::storage->gi_probe_get_bounds(p_instance->base); @@ -1230,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); @@ -1251,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)); @@ -1334,7 +1452,7 @@ void RenderingServerScene::_update_instance_lightmap_captures(Instance *p_instan } } -bool RenderingServerScene::_light_instance_update_shadow(Instance *p_instance, const Transform p_cam_transform, const CameraMatrix &p_cam_projection, bool p_cam_orthogonal, RID p_shadow_atlas, Scenario *p_scenario) { +bool RenderingServerScene::_light_instance_update_shadow(Instance *p_instance, const Transform p_cam_transform, const CameraMatrix &p_cam_projection, bool p_cam_orthogonal, bool p_cam_vaspect, RID p_shadow_atlas, Scenario *p_scenario) { InstanceLightData *light = static_cast<InstanceLightData *>(p_instance->base_data); @@ -1347,16 +1465,18 @@ bool RenderingServerScene::_light_instance_update_shadow(Instance *p_instance, c case RS::LIGHT_DIRECTIONAL: { - float max_distance = p_cam_projection.get_z_far(); - float shadow_max = RSG::storage->light_get_param(p_instance->base, RS::LIGHT_PARAM_SHADOW_MAX_DISTANCE); + real_t max_distance = p_cam_projection.get_z_far(); + real_t shadow_max = RSG::storage->light_get_param(p_instance->base, RS::LIGHT_PARAM_SHADOW_MAX_DISTANCE); if (shadow_max > 0 && !p_cam_orthogonal) { //its impractical (and leads to unwanted behaviors) to set max distance in orthogonal camera max_distance = MIN(shadow_max, max_distance); } max_distance = MAX(max_distance, p_cam_projection.get_z_near() + 0.001); - float min_distance = MIN(p_cam_projection.get_z_near(), max_distance); + real_t min_distance = MIN(p_cam_projection.get_z_near(), max_distance); RS::LightDirectionalShadowDepthRangeMode depth_range_mode = RSG::storage->light_directional_get_shadow_depth_range_mode(p_instance->base); + real_t pancake_size = RSG::storage->light_get_param(p_instance->base, RS::LIGHT_PARAM_SHADOW_PANCAKE_SIZE); + if (depth_range_mode == RS::LIGHT_DIRECTIONAL_SHADOW_DEPTH_RANGE_OPTIMIZED) { //optimize min/max Vector<Plane> planes = p_cam_projection.get_projection_planes(p_cam_transform); @@ -1365,8 +1485,8 @@ bool RenderingServerScene::_light_instance_update_shadow(Instance *p_instance, c //check distance max and min bool found_items = false; - float z_max = -1e20; - float z_min = 1e20; + real_t z_max = -1e20; + real_t z_min = 1e20; for (int i = 0; i < cull_count; i++) { @@ -1379,7 +1499,7 @@ bool RenderingServerScene::_light_instance_update_shadow(Instance *p_instance, c animated_material_found = true; } - float max, min; + real_t max, min; instance->transformed_aabb.project_range_in_plane(base, min, max); if (max > z_max) { @@ -1399,7 +1519,7 @@ bool RenderingServerScene::_light_instance_update_shadow(Instance *p_instance, c } } - float range = max_distance - min_distance; + real_t range = max_distance - min_distance; int splits = 0; switch (RSG::storage->light_directional_get_shadow_mode(p_instance->base)) { @@ -1408,7 +1528,7 @@ bool RenderingServerScene::_light_instance_update_shadow(Instance *p_instance, c case RS::LIGHT_DIRECTIONAL_SHADOW_PARALLEL_4_SPLITS: splits = 4; break; } - float distances[5]; + real_t distances[5]; distances[0] = min_distance; for (int i = 0; i < splits; i++) { @@ -1417,11 +1537,13 @@ bool RenderingServerScene::_light_instance_update_shadow(Instance *p_instance, c distances[splits] = max_distance; - float texture_size = RSG::scene_render->get_directional_light_shadow_size(light->instance); + real_t texture_size = RSG::scene_render->get_directional_light_shadow_size(light->instance); bool overlap = RSG::storage->light_directional_get_blend_splits(p_instance->base); - float first_radius = 0.0; + real_t first_radius = 0.0; + + real_t min_distance_bias_scale = pancake_size > 0 ? distances[1] / 10.0 : 0; for (int i = 0; i < splits; i++) { @@ -1430,7 +1552,7 @@ bool RenderingServerScene::_light_instance_update_shadow(Instance *p_instance, c // setup a camera matrix for that range! CameraMatrix camera_matrix; - float aspect = p_cam_projection.get_aspect(); + real_t aspect = p_cam_projection.get_aspect(); if (p_cam_orthogonal) { @@ -1439,8 +1561,8 @@ bool RenderingServerScene::_light_instance_update_shadow(Instance *p_instance, c camera_matrix.set_orthogonal(vp_he.y * 2.0, aspect, distances[(i == 0 || !overlap) ? i : i - 1], distances[i + 1], false); } else { - float fov = p_cam_projection.get_fov(); - camera_matrix.set_perspective(fov, aspect, distances[(i == 0 || !overlap) ? i : i - 1], distances[i + 1], false); + real_t fov = p_cam_projection.get_fov(); //this is actually yfov, because set aspect tries to keep it + camera_matrix.set_perspective(fov, aspect, distances[(i == 0 || !overlap) ? i : i - 1], distances[i + 1], true); } //obtain the frustum endpoints @@ -1458,26 +1580,27 @@ bool RenderingServerScene::_light_instance_update_shadow(Instance *p_instance, c Vector3 z_vec = transform.basis.get_axis(Vector3::AXIS_Z).normalized(); //z_vec points agsint the camera, like in default opengl - float x_min = 0.f, x_max = 0.f; - float y_min = 0.f, y_max = 0.f; - float z_min = 0.f, z_max = 0.f; + real_t x_min = 0.f, x_max = 0.f; + real_t y_min = 0.f, y_max = 0.f; + real_t z_min = 0.f, z_max = 0.f; // FIXME: z_max_cam is defined, computed, but not used below when setting up // ortho_camera. Commented out for now to fix warnings but should be investigated. - float x_min_cam = 0.f, x_max_cam = 0.f; - float y_min_cam = 0.f, y_max_cam = 0.f; - float z_min_cam = 0.f; - //float z_max_cam = 0.f; + real_t x_min_cam = 0.f, x_max_cam = 0.f; + real_t y_min_cam = 0.f, y_max_cam = 0.f; + real_t z_min_cam = 0.f; + //real_t z_max_cam = 0.f; - float bias_scale = 1.0; + real_t bias_scale = 1.0; + real_t aspect_bias_scale = 1.0; //used for culling for (int j = 0; j < 8; j++) { - float d_x = x_vec.dot(endpoints[j]); - float d_y = y_vec.dot(endpoints[j]); - float d_z = z_vec.dot(endpoints[j]); + real_t d_x = x_vec.dot(endpoints[j]); + real_t d_y = y_vec.dot(endpoints[j]); + real_t d_z = z_vec.dot(endpoints[j]); if (j == 0 || d_x < x_min) x_min = d_x; @@ -1495,11 +1618,13 @@ bool RenderingServerScene::_light_instance_update_shadow(Instance *p_instance, c z_max = d_z; } + real_t radius = 0; + real_t soft_shadow_expand = 0; + Vector3 center; + { //camera viewport stuff - Vector3 center; - for (int j = 0; j < 8; j++) { center += endpoints[j]; @@ -1508,11 +1633,9 @@ bool RenderingServerScene::_light_instance_update_shadow(Instance *p_instance, c //center=x_vec*(x_max-x_min)*0.5 + y_vec*(y_max-y_min)*0.5 + z_vec*(z_max-z_min)*0.5; - float radius = 0; - for (int j = 0; j < 8; j++) { - float d = center.distance_to(endpoints[j]); + real_t d = center.distance_to(endpoints[j]); if (d > radius) radius = d; } @@ -1525,18 +1648,35 @@ bool RenderingServerScene::_light_instance_update_shadow(Instance *p_instance, c bias_scale = radius / first_radius; } - x_max_cam = x_vec.dot(center) + radius; - x_min_cam = x_vec.dot(center) - radius; - y_max_cam = y_vec.dot(center) + radius; - y_min_cam = y_vec.dot(center) - radius; - //z_max_cam = z_vec.dot(center) + radius; z_min_cam = z_vec.dot(center) - radius; + { + + float soft_shadow_angle = RSG::storage->light_get_param(p_instance->base, RS::LIGHT_PARAM_SIZE); + + if (soft_shadow_angle > 0.0 && pancake_size > 0.0) { + + float z_range = (z_vec.dot(center) + radius + pancake_size) - z_min_cam; + soft_shadow_expand = Math::tan(Math::deg2rad(soft_shadow_angle)) * z_range; + + x_max += soft_shadow_expand; + y_max += soft_shadow_expand; + + x_min -= soft_shadow_expand; + y_min -= soft_shadow_expand; + } + } + + x_max_cam = x_vec.dot(center) + radius + soft_shadow_expand; + x_min_cam = x_vec.dot(center) - radius - soft_shadow_expand; + y_max_cam = y_vec.dot(center) + radius + soft_shadow_expand; + y_min_cam = y_vec.dot(center) - radius - soft_shadow_expand; + if (depth_range_mode == RS::LIGHT_DIRECTIONAL_SHADOW_DEPTH_RANGE_STABLE) { //this trick here is what stabilizes the shadow (make potential jaggies to not move) //at the cost of some wasted resolution. Still the quality increase is very well worth it - float unit = radius * 2.0 / texture_size; + real_t unit = radius * 2.0 / texture_size; x_max_cam = Math::stepify(x_max_cam, unit); x_min_cam = Math::stepify(x_min_cam, unit); @@ -1566,9 +1706,10 @@ bool RenderingServerScene::_light_instance_update_shadow(Instance *p_instance, c Plane near_plane(light_transform.origin, -light_transform.basis.get_axis(2)); + real_t cull_max = 0; for (int j = 0; j < cull_count; j++) { - float min, max; + real_t min, max; Instance *instance = instance_shadow_cull_result[j]; if (!instance->visible || !((1 << instance->base_type) & RS::INSTANCE_GEOMETRY_MASK) || !static_cast<InstanceGeometryData *>(instance->base_data)->can_cast_shadows) { cull_count--; @@ -1580,8 +1721,91 @@ bool RenderingServerScene::_light_instance_update_shadow(Instance *p_instance, c instance->transformed_aabb.project_range_in_plane(Plane(z_vec, 0), min, max); instance->depth = near_plane.distance_to(instance->transform.origin); instance->depth_layer = 0; - if (max > z_max) - z_max = max; + if (j == 0 || max > cull_max) { + cull_max = max; + } + } + + if (cull_max > z_max) { + z_max = cull_max; + } + + if (pancake_size > 0) { + z_max = z_vec.dot(center) + radius + pancake_size; + } + + if (aspect != 1.0) { + + // if the aspect is different, then the radius will become larger. + // if this happens, then bias needs to be adjusted too, as depth will increase + // to do this, compare the depth of one that would have resulted from a square frustum + + CameraMatrix camera_matrix_square; + if (p_cam_orthogonal) { + + Vector2 vp_he = camera_matrix.get_viewport_half_extents(); + if (p_cam_vaspect) { + camera_matrix_square.set_orthogonal(vp_he.x * 2.0, 1.0, distances[(i == 0 || !overlap) ? i : i - 1], distances[i + 1], true); + } else { + camera_matrix_square.set_orthogonal(vp_he.y * 2.0, 1.0, distances[(i == 0 || !overlap) ? i : i - 1], distances[i + 1], false); + } + } else { + Vector2 vp_he = camera_matrix.get_viewport_half_extents(); + if (p_cam_vaspect) { + camera_matrix_square.set_frustum(vp_he.x * 2.0, 1.0, Vector2(), distances[(i == 0 || !overlap) ? i : i - 1], distances[i + 1], true); + } else { + camera_matrix_square.set_frustum(vp_he.y * 2.0, 1.0, Vector2(), distances[(i == 0 || !overlap) ? i : i - 1], distances[i + 1], false); + } + + if (i == 0) { + //print_line("prev he: " + vp_he + " new he: " + camera_matrix_square.get_viewport_half_extents()); + } + } + + Vector3 endpoints_square[8]; // frustum plane endpoints + res = camera_matrix_square.get_endpoints(p_cam_transform, endpoints_square); + ERR_CONTINUE(!res); + Vector3 center_square; + real_t z_max_square = 0; + + for (int j = 0; j < 8; j++) { + + center_square += endpoints_square[j]; + + real_t d_z = z_vec.dot(endpoints_square[j]); + + if (j == 0 || d_z > z_max_square) + z_max_square = d_z; + } + + if (cull_max > z_max_square) { + z_max_square = cull_max; + } + + center_square /= 8.0; + + real_t radius_square = 0; + + for (int j = 0; j < 8; j++) { + + real_t d = center_square.distance_to(endpoints_square[j]); + if (d > radius_square) + radius_square = d; + } + + radius_square *= texture_size / (texture_size - 2.0); //add a texel by each side + + if (pancake_size > 0) { + z_max_square = z_vec.dot(center_square) + radius_square + pancake_size; + } + + real_t z_min_cam_square = z_vec.dot(center_square) - radius_square; + + aspect_bias_scale = (z_max - z_min_cam) / (z_max_square - z_min_cam_square); + + // this is not entirely perfect, because the cull-adjusted z-max may be different + // but at least it's warranted that it results in a greater bias, so no acne should be present either way. + // pancaking also helps with this. } { @@ -1592,11 +1816,19 @@ bool RenderingServerScene::_light_instance_update_shadow(Instance *p_instance, c ortho_camera.set_orthogonal(-half_x, half_x, -half_y, half_y, 0, (z_max - z_min_cam)); + Vector2 uv_scale(1.0 / (x_max_cam - x_min_cam), 1.0 / (y_max_cam - y_min_cam)); + Transform ortho_transform; ortho_transform.basis = transform.basis; ortho_transform.origin = x_vec * (x_min_cam + half_x) + y_vec * (y_min_cam + half_y) + z_vec * z_max; - RSG::scene_render->light_instance_set_shadow_transform(light->instance, ortho_camera, ortho_transform, 0, distances[i + 1], i, bias_scale); + { + Vector3 max_in_view = p_cam_transform.affine_inverse().xform(z_vec * cull_max); + Vector3 dir_in_view = p_cam_transform.xform_inv(z_vec).normalized(); + cull_max = dir_in_view.dot(max_in_view); + } + + RSG::scene_render->light_instance_set_shadow_transform(light->instance, ortho_camera, ortho_transform, z_max - z_min_cam, distances[i + 1], i, radius * 2.0 / texture_size, bias_scale * aspect_bias_scale * min_distance_bias_scale, z_max, uv_scale); } RSG::scene_render->render_shadow(light->instance, p_shadow_atlas, i, (RasterizerScene::InstanceBase **)instance_shadow_cull_result, cull_count); @@ -1614,16 +1846,17 @@ bool RenderingServerScene::_light_instance_update_shadow(Instance *p_instance, c //using this one ensures that raster deferred will have it RENDER_TIMESTAMP("Culling Shadow Paraboloid" + itos(i)); - float radius = RSG::storage->light_get_param(p_instance->base, RS::LIGHT_PARAM_RANGE); + real_t radius = RSG::storage->light_get_param(p_instance->base, RS::LIGHT_PARAM_RANGE); - float z = i == 0 ? -1 : 1; + 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); @@ -1645,12 +1878,12 @@ bool RenderingServerScene::_light_instance_update_shadow(Instance *p_instance, c } } - RSG::scene_render->light_instance_set_shadow_transform(light->instance, CameraMatrix(), light_transform, radius, 0, i); + RSG::scene_render->light_instance_set_shadow_transform(light->instance, CameraMatrix(), light_transform, radius, 0, i, 0); RSG::scene_render->render_shadow(light->instance, p_shadow_atlas, i, (RasterizerScene::InstanceBase **)instance_shadow_cull_result, cull_count); } } else { //shadow cube - float radius = RSG::storage->light_get_param(p_instance->base, RS::LIGHT_PARAM_RANGE); + real_t radius = RSG::storage->light_get_param(p_instance->base, RS::LIGHT_PARAM_RANGE); CameraMatrix cm; cm.set_perspective(90, 1, 0.01, radius); @@ -1699,12 +1932,12 @@ bool RenderingServerScene::_light_instance_update_shadow(Instance *p_instance, c } } - RSG::scene_render->light_instance_set_shadow_transform(light->instance, cm, xform, radius, 0, i); + RSG::scene_render->light_instance_set_shadow_transform(light->instance, cm, xform, radius, 0, i, 0); RSG::scene_render->render_shadow(light->instance, p_shadow_atlas, i, (RasterizerScene::InstanceBase **)instance_shadow_cull_result, cull_count); } //restore the regular DP matrix - RSG::scene_render->light_instance_set_shadow_transform(light->instance, CameraMatrix(), light_transform, radius, 0, 0); + RSG::scene_render->light_instance_set_shadow_transform(light->instance, CameraMatrix(), light_transform, radius, 0, 0, 0); } } break; @@ -1712,8 +1945,8 @@ bool RenderingServerScene::_light_instance_update_shadow(Instance *p_instance, c RENDER_TIMESTAMP("Culling Spot Light"); - float radius = RSG::storage->light_get_param(p_instance->base, RS::LIGHT_PARAM_RANGE); - float angle = RSG::storage->light_get_param(p_instance->base, RS::LIGHT_PARAM_SPOT_ANGLE); + real_t radius = RSG::storage->light_get_param(p_instance->base, RS::LIGHT_PARAM_RANGE); + real_t angle = RSG::storage->light_get_param(p_instance->base, RS::LIGHT_PARAM_SPOT_ANGLE); CameraMatrix cm; cm.set_perspective(angle * 2.0, 1.0, 0.01, radius); @@ -1738,7 +1971,7 @@ bool RenderingServerScene::_light_instance_update_shadow(Instance *p_instance, c } } - RSG::scene_render->light_instance_set_shadow_transform(light->instance, cm, light_transform, radius, 0, 0); + RSG::scene_render->light_instance_set_shadow_transform(light->instance, cm, light_transform, radius, 0, 0, 0); RSG::scene_render->render_shadow(light->instance, p_shadow_atlas, 0, (RasterizerScene::InstanceBase **)instance_shadow_cull_result, cull_count); } break; @@ -1793,12 +2026,12 @@ void RenderingServerScene::render_camera(RID p_render_buffers, RID p_camera, RID } break; } - _prepare_scene(camera->transform, camera_matrix, ortho, camera->env, camera->effects, camera->visible_layers, p_scenario, p_shadow_atlas, RID()); + _prepare_scene(camera->transform, camera_matrix, ortho, camera->vaspect, camera->env, camera->effects, camera->visible_layers, p_scenario, p_shadow_atlas, RID()); _render_scene(p_render_buffers, camera->transform, camera_matrix, ortho, camera->env, camera->effects, p_scenario, p_shadow_atlas, RID(), -1); #endif } -void RenderingServerScene::render_camera(RID p_render_buffers, Ref<ARVRInterface> &p_interface, ARVRInterface::Eyes p_eye, RID p_camera, RID p_scenario, Size2 p_viewport_size, RID p_shadow_atlas) { +void RenderingServerScene::render_camera(RID p_render_buffers, Ref<XRInterface> &p_interface, XRInterface::Eyes p_eye, RID p_camera, RID p_scenario, Size2 p_viewport_size, RID p_shadow_atlas) { // render for AR/VR interface Camera *camera = camera_owner.getornull(p_camera); @@ -1810,16 +2043,14 @@ void RenderingServerScene::render_camera(RID p_render_buffers, Ref<ARVRInterface // We also ignore our camera position, it will have been positioned with a slightly old tracking position. // Instead we take our origin point and have our ar/vr interface add fresh tracking data! Whoohoo! - Transform world_origin = ARVRServer::get_singleton()->get_world_origin(); + Transform world_origin = XRServer::get_singleton()->get_world_origin(); Transform cam_transform = p_interface->get_transform_for_eye(p_eye, world_origin); // For stereo render we only prepare for our left eye and then reuse the outcome for our right eye - if (p_eye == ARVRInterface::EYE_LEFT) { - ///@TODO possibly move responsibility for this into our ARVRServer or ARVRInterface? - + if (p_eye == XRInterface::EYE_LEFT) { // Center our transform, we assume basis is equal. Transform mono_transform = cam_transform; - Transform right_transform = p_interface->get_transform_for_eye(ARVRInterface::EYE_RIGHT, world_origin); + Transform right_transform = p_interface->get_transform_for_eye(XRInterface::EYE_RIGHT, world_origin); mono_transform.origin += right_transform.origin; mono_transform.origin *= 0.5; @@ -1872,17 +2103,17 @@ void RenderingServerScene::render_camera(RID p_render_buffers, Ref<ARVRInterface mono_transform *= apply_z_shift; // now prepare our scene with our adjusted transform projection matrix - _prepare_scene(mono_transform, combined_matrix, false, camera->env, camera->effects, camera->visible_layers, p_scenario, p_shadow_atlas, RID()); - } else if (p_eye == ARVRInterface::EYE_MONO) { + _prepare_scene(mono_transform, combined_matrix, false, false, camera->env, camera->effects, camera->visible_layers, p_scenario, p_shadow_atlas, RID()); + } else if (p_eye == XRInterface::EYE_MONO) { // For mono render, prepare as per usual - _prepare_scene(cam_transform, camera_matrix, false, camera->env, camera->effects, camera->visible_layers, p_scenario, p_shadow_atlas, RID()); + _prepare_scene(cam_transform, camera_matrix, false, false, camera->env, camera->effects, camera->visible_layers, p_scenario, p_shadow_atlas, RID()); } // And render our scene... _render_scene(p_render_buffers, cam_transform, camera_matrix, false, camera->env, camera->effects, p_scenario, p_shadow_atlas, RID(), -1); }; -void RenderingServerScene::_prepare_scene(const Transform p_cam_transform, const CameraMatrix &p_cam_projection, bool p_cam_orthogonal, RID p_force_environment, RID p_force_camera_effects, uint32_t p_visible_layers, RID p_scenario, RID p_shadow_atlas, RID p_reflection_probe, bool p_using_shadows) { +void RenderingServerScene::_prepare_scene(const Transform p_cam_transform, const CameraMatrix &p_cam_projection, bool p_cam_orthogonal, bool p_cam_vaspect, RID p_force_environment, RID p_force_camera_effects, uint32_t p_visible_layers, RID p_scenario, RID p_shadow_atlas, RID p_reflection_probe, bool p_using_shadows) { // Note, in stereo rendering: // - p_cam_transform will be a transform in the middle of our two eyes // - p_cam_projection is a wider frustrum that encompasses both eyes @@ -1908,6 +2139,7 @@ void RenderingServerScene::_prepare_scene(const Transform p_cam_transform, const light_cull_count = 0; reflection_probe_cull_count = 0; + decal_cull_count = 0; gi_probe_cull_count = 0; //light_samplers_culled=0; @@ -1977,6 +2209,18 @@ void RenderingServerScene::_prepare_scene(const Transform p_cam_transform, const } } } + } else if (ins->base_type == RS::INSTANCE_DECAL && ins->visible) { + + if (decal_cull_count < MAX_DECALS_CULLED) { + + InstanceDecalData *decal = static_cast<InstanceDecalData *>(ins->base_data); + + if (!decal->geometries.empty()) { + //do not add this decal if no geometry is affected by it.. + decal_instance_cull_result[decal_cull_count] = decal->instance; + decal_cull_count++; + } + } } else if (ins->base_type == RS::INSTANCE_GI_PROBE && ins->visible) { @@ -2112,7 +2356,7 @@ void RenderingServerScene::_prepare_scene(const Transform p_cam_transform, const RENDER_TIMESTAMP(">Rendering Directional Light " + itos(i)); - _light_instance_update_shadow(lights_with_shadow[i], p_cam_transform, p_cam_projection, p_cam_orthogonal, p_shadow_atlas, scenario); + _light_instance_update_shadow(lights_with_shadow[i], p_cam_transform, p_cam_projection, p_cam_orthogonal, p_cam_vaspect, p_shadow_atlas, scenario); RENDER_TIMESTAMP("<Rendering Directional Light " + itos(i)); } @@ -2214,7 +2458,7 @@ void RenderingServerScene::_prepare_scene(const Transform p_cam_transform, const if (redraw) { //must redraw! RENDER_TIMESTAMP(">Rendering Light " + itos(i)); - light->shadow_dirty = _light_instance_update_shadow(ins, p_cam_transform, p_cam_projection, p_cam_orthogonal, p_shadow_atlas, scenario); + light->shadow_dirty = _light_instance_update_shadow(ins, p_cam_transform, p_cam_projection, p_cam_orthogonal, p_cam_vaspect, p_shadow_atlas, scenario); RENDER_TIMESTAMP("<Rendering Light " + itos(i)); } } @@ -2244,7 +2488,7 @@ void RenderingServerScene::_render_scene(RID p_render_buffers, const Transform p /* PROCESS GEOMETRY AND DRAW SCENE */ RENDER_TIMESTAMP("Render Scene "); - RSG::scene_render->render_scene(p_render_buffers, p_cam_transform, p_cam_projection, p_cam_orthogonal, (RasterizerScene::InstanceBase **)instance_cull_result, instance_cull_count, light_instance_cull_result, light_cull_count + directional_light_count, reflection_probe_instance_cull_result, reflection_probe_cull_count, gi_probe_instance_cull_result, gi_probe_cull_count, environment, camera_effects, p_shadow_atlas, p_reflection_probe.is_valid() ? RID() : scenario->reflection_atlas, p_reflection_probe, p_reflection_probe_pass); + RSG::scene_render->render_scene(p_render_buffers, p_cam_transform, p_cam_projection, p_cam_orthogonal, (RasterizerScene::InstanceBase **)instance_cull_result, instance_cull_count, light_instance_cull_result, light_cull_count + directional_light_count, reflection_probe_instance_cull_result, reflection_probe_cull_count, gi_probe_instance_cull_result, gi_probe_cull_count, decal_instance_cull_result, decal_cull_count, environment, camera_effects, p_shadow_atlas, p_reflection_probe.is_valid() ? RID() : scenario->reflection_atlas, p_reflection_probe, p_reflection_probe_pass); } void RenderingServerScene::render_empty_scene(RID p_render_buffers, RID p_scenario, RID p_shadow_atlas) { @@ -2259,7 +2503,7 @@ void RenderingServerScene::render_empty_scene(RID p_render_buffers, RID p_scenar else environment = scenario->fallback_environment; RENDER_TIMESTAMP("Render Empty Scene "); - RSG::scene_render->render_scene(p_render_buffers, Transform(), CameraMatrix(), true, nullptr, 0, nullptr, 0, nullptr, 0, nullptr, 0, environment, RID(), p_shadow_atlas, scenario->reflection_atlas, RID(), 0); + RSG::scene_render->render_scene(p_render_buffers, Transform(), CameraMatrix(), true, nullptr, 0, nullptr, 0, nullptr, 0, nullptr, 0, nullptr, 0, environment, RID(), p_shadow_atlas, scenario->reflection_atlas, RID(), 0); #endif } @@ -2324,7 +2568,7 @@ bool RenderingServerScene::_render_reflection_probe_step(Instance *p_instance, i } RENDER_TIMESTAMP("Render Reflection Probe, Step " + itos(p_step)); - _prepare_scene(xform, cm, false, RID(), RID(), RSG::storage->reflection_probe_get_cull_mask(p_instance->base), p_instance->scenario->self, shadow_atlas, reflection_probe->instance, use_shadows); + _prepare_scene(xform, cm, false, false, RID(), RID(), RSG::storage->reflection_probe_get_cull_mask(p_instance->base), p_instance->scenario->self, shadow_atlas, reflection_probe->instance, use_shadows); _render_scene(RID(), xform, cm, false, RID(), RID(), p_instance->scenario->self, shadow_atlas, reflection_probe->instance, p_step); } else { @@ -2579,6 +2823,35 @@ void RenderingServerScene::render_probes() { } } +void RenderingServerScene::_update_instance_shader_parameters_from_material(Map<StringName, RasterizerScene::InstanceBase::InstanceShaderParameter> &isparams, const Map<StringName, RasterizerScene::InstanceBase::InstanceShaderParameter> &existing_isparams, RID p_material) { + + List<RasterizerStorage::InstanceShaderParam> plist; + RSG::storage->material_get_instance_shader_parameters(p_material, &plist); + for (List<RasterizerStorage::InstanceShaderParam>::Element *E = plist.front(); E; E = E->next()) { + StringName name = E->get().info.name; + if (isparams.has(name)) { + if (isparams[name].info.type != E->get().info.type) { + WARN_PRINT("More than one material in instance export the same instance shader uniform '" + E->get().info.name + "', but they do it with different data types. Only the first one (in order) will display correctly."); + } + if (isparams[name].index != E->get().index) { + WARN_PRINT("More than one material in instance export the same instance shader uniform '" + E->get().info.name + "', but they do it with different indices. Only the first one (in order) will display correctly."); + } + continue; //first one found always has priority + } + + RasterizerScene::InstanceBase::InstanceShaderParameter isp; + isp.index = E->get().index; + isp.info = E->get().info; + isp.default_value = E->get().default_value; + if (existing_isparams.has(name)) { + isp.value = existing_isparams[name].value; + } else { + isp.value = E->get().default_value; + } + isparams[name] = isp; + } +} + void RenderingServerScene::_update_dirty_instance(Instance *p_instance) { if (p_instance->update_aabb) { @@ -2618,12 +2891,18 @@ void RenderingServerScene::_update_dirty_instance(Instance *p_instance) { bool can_cast_shadows = true; bool is_animated = false; + Map<StringName, RasterizerScene::InstanceBase::InstanceShaderParameter> isparams; if (p_instance->cast_shadows == RS::SHADOW_CASTING_SETTING_OFF) { can_cast_shadows = false; - } else if (p_instance->material_override.is_valid()) { - can_cast_shadows = RSG::storage->material_casts_shadows(p_instance->material_override); + } + + if (p_instance->material_override.is_valid()) { + if (!RSG::storage->material_casts_shadows(p_instance->material_override)) { + can_cast_shadows = false; + } is_animated = RSG::storage->material_is_animated(p_instance->material_override); + _update_instance_shader_parameters_from_material(isparams, p_instance->instance_shader_parameters, p_instance->material_override); } else { if (p_instance->base_type == RS::INSTANCE_MESH) { @@ -2648,6 +2927,8 @@ void RenderingServerScene::_update_dirty_instance(Instance *p_instance) { is_animated = true; } + _update_instance_shader_parameters_from_material(isparams, p_instance->instance_shader_parameters, mat); + RSG::storage->material_update_dependency(mat, p_instance); } } @@ -2680,6 +2961,8 @@ void RenderingServerScene::_update_dirty_instance(Instance *p_instance) { is_animated = true; } + _update_instance_shader_parameters_from_material(isparams, p_instance->instance_shader_parameters, mat); + RSG::storage->material_update_dependency(mat, p_instance); } } @@ -2694,13 +2977,19 @@ void RenderingServerScene::_update_dirty_instance(Instance *p_instance) { RID mat = RSG::storage->immediate_get_material(p_instance->base); - can_cast_shadows = !mat.is_valid() || RSG::storage->material_casts_shadows(mat); + if (!(!mat.is_valid() || RSG::storage->material_casts_shadows(mat))) { + can_cast_shadows = false; + } if (mat.is_valid() && RSG::storage->material_is_animated(mat)) { is_animated = true; } if (mat.is_valid()) { + _update_instance_shader_parameters_from_material(isparams, p_instance->instance_shader_parameters, mat); + } + + if (mat.is_valid()) { RSG::storage->material_update_dependency(mat, p_instance); } @@ -2733,6 +3022,8 @@ void RenderingServerScene::_update_dirty_instance(Instance *p_instance) { is_animated = true; } + _update_instance_shader_parameters_from_material(isparams, p_instance->instance_shader_parameters, mat); + RSG::storage->material_update_dependency(mat, p_instance); } } @@ -2755,6 +3046,22 @@ void RenderingServerScene::_update_dirty_instance(Instance *p_instance) { } geom->material_is_animated = is_animated; + p_instance->instance_shader_parameters = isparams; + + if (p_instance->instance_allocated_shader_parameters != (p_instance->instance_shader_parameters.size() > 0)) { + p_instance->instance_allocated_shader_parameters = (p_instance->instance_shader_parameters.size() > 0); + if (p_instance->instance_allocated_shader_parameters) { + p_instance->instance_allocated_shader_parameters_offset = RSG::storage->global_variables_instance_allocate(p_instance->self); + for (Map<StringName, RasterizerScene::InstanceBase::InstanceShaderParameter>::Element *E = p_instance->instance_shader_parameters.front(); E; E = E->next()) { + if (E->get().value.get_type() != Variant::NIL) { + RSG::storage->global_variables_instance_update(p_instance->self, E->get().index, E->get().value); + } + } + } else { + RSG::storage->global_variables_instance_free(p_instance->self); + p_instance->instance_allocated_shader_parameters_offset = -1; + } + } } if (p_instance->skeleton.is_valid()) { @@ -2816,6 +3123,10 @@ bool RenderingServerScene::free(RID p_rid) { instance_geometry_set_material_override(p_rid, RID()); instance_attach_skeleton(p_rid, RID()); + if (instance->instance_allocated_shader_parameters) { + //free the used shader parameters + RSG::storage->global_variables_instance_free(instance->self); + } update_dirty_instances(); //in case something changed this instance_owner.free(p_rid); diff --git a/servers/rendering/rendering_server_scene.h b/servers/rendering/rendering_server_scene.h index 41641b7c75..db2fbd6707 100644 --- a/servers/rendering/rendering_server_scene.h +++ b/servers/rendering/rendering_server_scene.h @@ -39,7 +39,7 @@ #include "core/os/thread.h" #include "core/rid_owner.h" #include "core/self_list.h" -#include "servers/arvr/arvr_interface.h" +#include "servers/xr/xr_interface.h" class RenderingServerScene { public: @@ -48,6 +48,7 @@ public: MAX_INSTANCE_CULL = 65536, MAX_LIGHTS_CULLED = 4096, MAX_REFLECTION_PROBES_CULLED = 4096, + MAX_DECALS_CULLED = 4096, MAX_GI_PROBES_CULLED = 4096, MAX_ROOM_CULL = 32, MAX_EXTERIOR_PORTALS = 128, @@ -237,6 +238,9 @@ public: bool can_cast_shadows; bool material_is_animated; + List<Instance *> decals; + bool decal_dirty; + List<Instance *> reflection_probes; bool reflection_dirty; @@ -252,6 +256,7 @@ public: can_cast_shadows = true; material_is_animated = true; gi_probes_dirty = true; + decal_dirty = true; } }; @@ -279,6 +284,21 @@ public: } }; + struct InstanceDecalData : public InstanceBaseData { + + Instance *owner; + RID instance; + + struct PairInfo { + List<Instance *>::Element *L; //reflection iterator in geometry + Instance *geometry; + }; + List<PairInfo> geometries; + + InstanceDecalData() { + } + }; + SelfList<InstanceReflectionProbeData>::List reflection_probe_render_list; struct InstanceLightData : public InstanceBaseData { @@ -376,7 +396,9 @@ public: int light_cull_count; int directional_light_count; RID reflection_probe_instance_cull_result[MAX_REFLECTION_PROBES_CULLED]; + RID decal_instance_cull_result[MAX_DECALS_CULLED]; int reflection_probe_cull_count; + int decal_cull_count; RID gi_probe_instance_cull_result[MAX_GI_PROBES_CULLED]; int gi_probe_cull_count; @@ -413,20 +435,27 @@ public: virtual void instance_geometry_set_draw_range(RID p_instance, float p_min, float p_max, float p_min_margin, float p_max_margin); virtual void instance_geometry_set_as_instance_lod(RID p_instance, RID p_as_lod_of_instance); + void _update_instance_shader_parameters_from_material(Map<StringName, RasterizerScene::InstanceBase::InstanceShaderParameter> &isparams, const Map<StringName, RasterizerScene::InstanceBase::InstanceShaderParameter> &existing_isparams, RID p_material); + + virtual void instance_geometry_set_shader_parameter(RID p_instance, const StringName &p_parameter, const Variant &p_value); + virtual void instance_geometry_get_shader_parameter_list(RID p_instance, List<PropertyInfo> *p_parameters) const; + virtual Variant instance_geometry_get_shader_parameter(RID p_instance, const StringName &p_parameter) const; + virtual Variant instance_geometry_get_shader_parameter_default_value(RID p_instance, const StringName &p_parameter) const; + _FORCE_INLINE_ void _update_instance(Instance *p_instance); _FORCE_INLINE_ void _update_instance_aabb(Instance *p_instance); _FORCE_INLINE_ void _update_dirty_instance(Instance *p_instance); _FORCE_INLINE_ void _update_instance_lightmap_captures(Instance *p_instance); - _FORCE_INLINE_ bool _light_instance_update_shadow(Instance *p_instance, const Transform p_cam_transform, const CameraMatrix &p_cam_projection, bool p_cam_orthogonal, RID p_shadow_atlas, Scenario *p_scenario); + _FORCE_INLINE_ bool _light_instance_update_shadow(Instance *p_instance, const Transform p_cam_transform, const CameraMatrix &p_cam_projection, bool p_cam_orthogonal, bool p_cam_vaspect, RID p_shadow_atlas, Scenario *p_scenario); bool _render_reflection_probe_step(Instance *p_instance, int p_step); - void _prepare_scene(const Transform p_cam_transform, const CameraMatrix &p_cam_projection, bool p_cam_orthogonal, RID p_force_environment, RID p_force_camera_effects, uint32_t p_visible_layers, RID p_scenario, RID p_shadow_atlas, RID p_reflection_probe, bool p_using_shadows = true); + void _prepare_scene(const Transform p_cam_transform, const CameraMatrix &p_cam_projection, bool p_cam_orthogonal, bool p_cam_vaspect, RID p_force_environment, RID p_force_camera_effects, uint32_t p_visible_layers, RID p_scenario, RID p_shadow_atlas, RID p_reflection_probe, bool p_using_shadows = true); void _render_scene(RID p_render_buffers, const Transform p_cam_transform, const CameraMatrix &p_cam_projection, bool p_cam_orthogonal, RID p_force_environment, RID p_force_camera_effects, RID p_scenario, RID p_shadow_atlas, RID p_reflection_probe, int p_reflection_probe_pass); void render_empty_scene(RID p_render_buffers, RID p_scenario, RID p_shadow_atlas); void render_camera(RID p_render_buffers, RID p_camera, RID p_scenario, Size2 p_viewport_size, RID p_shadow_atlas); - void render_camera(RID p_render_buffers, Ref<ARVRInterface> &p_interface, ARVRInterface::Eyes p_eye, RID p_camera, RID p_scenario, Size2 p_viewport_size, RID p_shadow_atlas); + void render_camera(RID p_render_buffers, Ref<XRInterface> &p_interface, XRInterface::Eyes p_eye, RID p_camera, RID p_scenario, Size2 p_viewport_size, RID p_shadow_atlas); void update_dirty_instances(); void render_probes(); diff --git a/servers/rendering/rendering_server_viewport.cpp b/servers/rendering/rendering_server_viewport.cpp index aa65101ddf..6fb8f6ca63 100644 --- a/servers/rendering/rendering_server_viewport.cpp +++ b/servers/rendering/rendering_server_viewport.cpp @@ -62,24 +62,30 @@ static Transform2D _canvas_get_transform(RenderingServerViewport::Viewport *p_vi return xf; } -void RenderingServerViewport::_draw_3d(Viewport *p_viewport, ARVRInterface::Eyes p_eye) { +void RenderingServerViewport::_draw_3d(Viewport *p_viewport, XRInterface::Eyes p_eye) { RENDER_TIMESTAMP(">Begin Rendering 3D Scene"); - Ref<ARVRInterface> arvr_interface; - if (ARVRServer::get_singleton() != nullptr) { - arvr_interface = ARVRServer::get_singleton()->get_primary_interface(); + Ref<XRInterface> xr_interface; + if (XRServer::get_singleton() != nullptr) { + xr_interface = XRServer::get_singleton()->get_primary_interface(); } - if (p_viewport->use_arvr && arvr_interface.is_valid()) { - RSG::scene->render_camera(p_viewport->render_buffers, arvr_interface, p_eye, p_viewport->camera, p_viewport->scenario, p_viewport->size, p_viewport->shadow_atlas); + if (p_viewport->use_xr && xr_interface.is_valid()) { + RSG::scene->render_camera(p_viewport->render_buffers, xr_interface, p_eye, p_viewport->camera, p_viewport->scenario, p_viewport->size, p_viewport->shadow_atlas); } else { RSG::scene->render_camera(p_viewport->render_buffers, p_viewport->camera, p_viewport->scenario, p_viewport->size, p_viewport->shadow_atlas); } RENDER_TIMESTAMP("<End Rendering 3D Scene"); } -void RenderingServerViewport::_draw_viewport(Viewport *p_viewport, ARVRInterface::Eyes p_eye) { +void RenderingServerViewport::_draw_viewport(Viewport *p_viewport, XRInterface::Eyes p_eye) { + + if (p_viewport->measure_render_time) { + String rt_id = "vp_begin_" + itos(p_viewport->self.get_id()); + RSG::storage->capture_timestamp(rt_id); + timestamp_vp_map[rt_id] = p_viewport->self; + } /* Camera should always be BEFORE any other 3D */ @@ -113,7 +119,7 @@ void RenderingServerViewport::_draw_viewport(Viewport *p_viewport, ARVRInterface if ((scenario_draw_canvas_bg || can_draw_3d) && !p_viewport->render_buffers.is_valid()) { //wants to draw 3D but there is no render buffer, create p_viewport->render_buffers = RSG::scene_render->render_buffers_create(); - RSG::scene_render->render_buffers_configure(p_viewport->render_buffers, p_viewport->render_target, p_viewport->size.width, p_viewport->size.height, p_viewport->msaa); + RSG::scene_render->render_buffers_configure(p_viewport->render_buffers, p_viewport->render_target, p_viewport->size.width, p_viewport->size.height, p_viewport->msaa, p_viewport->screen_space_aa); } RSG::storage->render_target_request_clear(p_viewport->render_target, bgcolor); @@ -289,21 +295,27 @@ void RenderingServerViewport::_draw_viewport(Viewport *p_viewport, ARVRInterface //was never cleared in the end, force clear it RSG::storage->render_target_do_clear_request(p_viewport->render_target); } + + if (p_viewport->measure_render_time) { + String rt_id = "vp_end_" + itos(p_viewport->self.get_id()); + RSG::storage->capture_timestamp(rt_id); + timestamp_vp_map[rt_id] = p_viewport->self; + } } void RenderingServerViewport::draw_viewports() { -#if 0 - // get our arvr interface in case we need it - Ref<ARVRInterface> arvr_interface; + timestamp_vp_map.clear(); + + // get our xr interface in case we need it + Ref<XRInterface> xr_interface; - if (ARVRServer::get_singleton() != nullptr) { - arvr_interface = ARVRServer::get_singleton()->get_primary_interface(); + if (XRServer::get_singleton() != nullptr) { + xr_interface = XRServer::get_singleton()->get_primary_interface(); // process all our active interfaces - ARVRServer::get_singleton()->_process(); + XRServer::get_singleton()->_process(); } -#endif if (Engine::get_singleton()->is_editor_hint()) { set_default_clear_color(GLOBAL_GET("rendering/environment/default_clear_color")); @@ -367,38 +379,41 @@ void RenderingServerViewport::draw_viewports() { RSG::storage->render_target_set_as_unused(vp->render_target); #if 0 - if (vp->use_arvr && arvr_interface.is_valid()) { + // TODO fix up this code after we change our commit_for_eye to accept our new render targets + + if (vp->use_xr && xr_interface.is_valid()) { // override our size, make sure it matches our required size - vp->size = arvr_interface->get_render_targetsize(); + vp->size = xr_interface->get_render_targetsize(); RSG::storage->render_target_set_size(vp->render_target, vp->size.x, vp->size.y); // render mono or left eye first - ARVRInterface::Eyes leftOrMono = arvr_interface->is_stereo() ? ARVRInterface::EYE_LEFT : ARVRInterface::EYE_MONO; + XRInterface::Eyes leftOrMono = xr_interface->is_stereo() ? XRInterface::EYE_LEFT : XRInterface::EYE_MONO; // check for an external texture destination for our left eye/mono - RSG::storage->render_target_set_external_texture(vp->render_target, arvr_interface->get_external_texture_for_eye(leftOrMono)); + // TODO investigate how we're going to make external textures work + RSG::storage->render_target_set_external_texture(vp->render_target, xr_interface->get_external_texture_for_eye(leftOrMono)); // set our render target as current RSG::rasterizer->set_current_render_target(vp->render_target); // and draw left eye/mono _draw_viewport(vp, leftOrMono); - arvr_interface->commit_for_eye(leftOrMono, vp->render_target, vp->viewport_to_screen_rect); + xr_interface->commit_for_eye(leftOrMono, vp->render_target, vp->viewport_to_screen_rect); // render right eye - if (leftOrMono == ARVRInterface::EYE_LEFT) { + if (leftOrMono == XRInterface::EYE_LEFT) { // check for an external texture destination for our right eye - RSG::storage->render_target_set_external_texture(vp->render_target, arvr_interface->get_external_texture_for_eye(ARVRInterface::EYE_RIGHT)); + RSG::storage->render_target_set_external_texture(vp->render_target, xr_interface->get_external_texture_for_eye(XRInterface::EYE_RIGHT)); // commit for eye may have changed the render target RSG::rasterizer->set_current_render_target(vp->render_target); - _draw_viewport(vp, ARVRInterface::EYE_RIGHT); - arvr_interface->commit_for_eye(ARVRInterface::EYE_RIGHT, vp->render_target, vp->viewport_to_screen_rect); + _draw_viewport(vp, XRInterface::EYE_RIGHT); + xr_interface->commit_for_eye(XRInterface::EYE_RIGHT, vp->render_target, vp->viewport_to_screen_rect); } // and for our frame timing, mark when we've finished committing our eyes - ARVRServer::get_singleton()->_mark_commit(); + XRServer::get_singleton()->_mark_commit(); } else { #endif { @@ -470,11 +485,11 @@ RID RenderingServerViewport::viewport_create() { return rid; } -void RenderingServerViewport::viewport_set_use_arvr(RID p_viewport, bool p_use_arvr) { +void RenderingServerViewport::viewport_set_use_xr(RID p_viewport, bool p_use_xr) { Viewport *viewport = viewport_owner.getornull(p_viewport); ERR_FAIL_COND(!viewport); - viewport->use_arvr = p_use_arvr; + viewport->use_xr = p_use_xr; } void RenderingServerViewport::viewport_set_size(RID p_viewport, int p_width, int p_height) { @@ -491,7 +506,7 @@ void RenderingServerViewport::viewport_set_size(RID p_viewport, int p_width, int RSG::scene_render->free(viewport->render_buffers); viewport->render_buffers = RID(); } else { - RSG::scene_render->render_buffers_configure(viewport->render_buffers, viewport->render_target, viewport->size.width, viewport->size.height, viewport->msaa); + RSG::scene_render->render_buffers_configure(viewport->render_buffers, viewport->render_target, viewport->size.width, viewport->size.height, viewport->msaa, viewport->screen_space_aa); } } } @@ -721,7 +736,20 @@ void RenderingServerViewport::viewport_set_msaa(RID p_viewport, RS::ViewportMSAA } viewport->msaa = p_msaa; if (viewport->render_buffers.is_valid()) { - RSG::scene_render->render_buffers_configure(viewport->render_buffers, viewport->render_target, viewport->size.width, viewport->size.height, p_msaa); + RSG::scene_render->render_buffers_configure(viewport->render_buffers, viewport->render_target, viewport->size.width, viewport->size.height, p_msaa, viewport->screen_space_aa); + } +} + +void RenderingServerViewport::viewport_set_screen_space_aa(RID p_viewport, RS::ViewportScreenSpaceAA p_mode) { + Viewport *viewport = viewport_owner.getornull(p_viewport); + ERR_FAIL_COND(!viewport); + + if (viewport->screen_space_aa == p_mode) { + return; + } + viewport->screen_space_aa = p_mode; + if (viewport->render_buffers.is_valid()) { + RSG::scene_render->render_buffers_configure(viewport->render_buffers, viewport->render_target, viewport->size.width, viewport->size.height, viewport->msaa, p_mode); } } @@ -744,6 +772,30 @@ void RenderingServerViewport::viewport_set_debug_draw(RID p_viewport, RS::Viewpo viewport->debug_draw = p_draw; } +void RenderingServerViewport::viewport_set_measure_render_time(RID p_viewport, bool p_enable) { + + Viewport *viewport = viewport_owner.getornull(p_viewport); + ERR_FAIL_COND(!viewport); + + viewport->measure_render_time = p_enable; +} + +float RenderingServerViewport::viewport_get_measured_render_time_cpu(RID p_viewport) const { + + Viewport *viewport = viewport_owner.getornull(p_viewport); + ERR_FAIL_COND_V(!viewport, 0); + + return double(viewport->time_cpu_end - viewport->time_cpu_begin) / 1000.0; +} + +float RenderingServerViewport::viewport_get_measured_render_time_gpu(RID p_viewport) const { + + Viewport *viewport = viewport_owner.getornull(p_viewport); + ERR_FAIL_COND_V(!viewport, 0); + + return double((viewport->time_gpu_end - viewport->time_gpu_begin) / 1000) / 1000.0; +} + bool RenderingServerViewport::free(RID p_rid) { if (viewport_owner.owns(p_rid)) { @@ -772,6 +824,29 @@ bool RenderingServerViewport::free(RID p_rid) { return false; } +void RenderingServerViewport::handle_timestamp(String p_timestamp, uint64_t p_cpu_time, uint64_t p_gpu_time) { + + RID *vp = timestamp_vp_map.getptr(p_timestamp); + if (!vp) { + return; + } + + Viewport *viewport = viewport_owner.getornull(*vp); + if (!viewport) { + return; + } + + if (p_timestamp.begins_with("vp_begin")) { + viewport->time_cpu_begin = p_cpu_time; + viewport->time_gpu_begin = p_gpu_time; + } + + if (p_timestamp.begins_with("vp_end")) { + viewport->time_cpu_end = p_cpu_time; + viewport->time_gpu_end = p_gpu_time; + } +} + void RenderingServerViewport::set_default_clear_color(const Color &p_color) { RSG::storage->set_default_clear_color(p_color); } diff --git a/servers/rendering/rendering_server_viewport.h b/servers/rendering/rendering_server_viewport.h index f574c58d96..fcba7886c5 100644 --- a/servers/rendering/rendering_server_viewport.h +++ b/servers/rendering/rendering_server_viewport.h @@ -34,8 +34,8 @@ #include "core/rid_owner.h" #include "core/self_list.h" #include "rasterizer.h" -#include "servers/arvr/arvr_interface.h" #include "servers/rendering_server.h" +#include "servers/xr/xr_interface.h" class RenderingServerViewport { public: @@ -47,7 +47,7 @@ public: RID self; RID parent; - bool use_arvr; /* use arvr interface to override camera positioning and projection matrices and control output */ + bool use_xr; /* use xr interface to override camera positioning and projection matrices and control output */ Size2i size; RID camera; @@ -59,6 +59,7 @@ public: RID render_buffers; RS::ViewportMSAA msaa; + RS::ViewportScreenSpaceAA screen_space_aa; DisplayServer::WindowID viewport_to_screen; Rect2 viewport_to_screen_rect; @@ -67,8 +68,13 @@ public: bool hide_scenario; bool hide_canvas; bool disable_environment; - bool disable_3d_by_usage; - bool keep_3d_linear; + bool measure_render_time; + + uint64_t time_cpu_begin; + uint64_t time_cpu_end; + + uint64_t time_gpu_begin; + uint64_t time_gpu_end; RID shadow_atlas; int shadow_atlas_size; @@ -121,16 +127,27 @@ public: disable_environment = false; viewport_to_screen = DisplayServer::INVALID_WINDOW_ID; shadow_atlas_size = 0; - keep_3d_linear = false; + measure_render_time = false; + debug_draw = RS::VIEWPORT_DEBUG_DRAW_DISABLED; msaa = RS::VIEWPORT_MSAA_DISABLED; + screen_space_aa = RS::VIEWPORT_SCREEN_SPACE_AA_DISABLED; + for (int i = 0; i < RS::VIEWPORT_RENDER_INFO_MAX; i++) { render_info[i] = 0; } - use_arvr = false; + use_xr = false; + + time_cpu_begin = 0; + time_cpu_end = 0; + + time_gpu_begin = 0; + time_gpu_end = 0; } }; + HashMap<String, RID> timestamp_vp_map; + uint64_t draw_viewports_pass = 0; mutable RID_PtrOwner<Viewport> viewport_owner; @@ -152,13 +169,13 @@ public: Vector<Viewport *> active_viewports; private: - void _draw_3d(Viewport *p_viewport, ARVRInterface::Eyes p_eye); - void _draw_viewport(Viewport *p_viewport, ARVRInterface::Eyes p_eye = ARVRInterface::EYE_MONO); + void _draw_3d(Viewport *p_viewport, XRInterface::Eyes p_eye); + void _draw_viewport(Viewport *p_viewport, XRInterface::Eyes p_eye = XRInterface::EYE_MONO); public: RID viewport_create(); - void viewport_set_use_arvr(RID p_viewport, bool p_use_arvr); + void viewport_set_use_xr(RID p_viewport, bool p_use_xr); void viewport_set_size(RID p_viewport, int p_width, int p_height); @@ -192,10 +209,17 @@ public: void viewport_set_shadow_atlas_quadrant_subdivision(RID p_viewport, int p_quadrant, int p_subdiv); void viewport_set_msaa(RID p_viewport, RS::ViewportMSAA p_msaa); + void viewport_set_screen_space_aa(RID p_viewport, RS::ViewportScreenSpaceAA p_mode); virtual int viewport_get_render_info(RID p_viewport, RS::ViewportRenderInfo p_info); virtual void viewport_set_debug_draw(RID p_viewport, RS::ViewportDebugDraw p_draw); + void viewport_set_measure_render_time(RID p_viewport, bool p_enable); + float viewport_get_measured_render_time_cpu(RID p_viewport) const; + float viewport_get_measured_render_time_gpu(RID p_viewport) const; + + void handle_timestamp(String p_timestamp, uint64_t p_cpu_time, uint64_t p_gpu_time); + void set_default_clear_color(const Color &p_color); void draw_viewports(); diff --git a/servers/rendering/rendering_server_wrap_mt.cpp b/servers/rendering/rendering_server_wrap_mt.cpp index aa3bf583c7..4ca13dbef9 100644 --- a/servers/rendering/rendering_server_wrap_mt.cpp +++ b/servers/rendering/rendering_server_wrap_mt.cpp @@ -126,17 +126,6 @@ void RenderingServerWrapMT::init() { void RenderingServerWrapMT::finish() { - if (thread) { - - command_queue.push(this, &RenderingServerWrapMT::thread_exit); - Thread::wait_to_finish(thread); - memdelete(thread); - - thread = nullptr; - } else { - rendering_server->finish(); - } - sky_free_cached_ids(); shader_free_cached_ids(); material_free_cached_ids(); @@ -161,6 +150,17 @@ void RenderingServerWrapMT::finish() { canvas_item_free_cached_ids(); canvas_light_occluder_free_cached_ids(); canvas_occluder_polygon_free_cached_ids(); + + if (thread) { + + command_queue.push(this, &RenderingServerWrapMT::thread_exit); + Thread::wait_to_finish(thread); + memdelete(thread); + + thread = nullptr; + } else { + rendering_server->finish(); + } } void RenderingServerWrapMT::set_use_vsync_callback(bool p_enable) { diff --git a/servers/rendering/rendering_server_wrap_mt.h b/servers/rendering/rendering_server_wrap_mt.h index d0f711838c..d4e58485b8 100644 --- a/servers/rendering/rendering_server_wrap_mt.h +++ b/servers/rendering/rendering_server_wrap_mt.h @@ -264,6 +264,20 @@ public: FUNC2(reflection_probe_set_cull_mask, RID, uint32_t) FUNC2(reflection_probe_set_resolution, RID, int) + /* DECAL API */ + + FUNCRID(decal) + + FUNC2(decal_set_extents, RID, const Vector3 &) + FUNC3(decal_set_texture, RID, DecalTexture, RID) + FUNC2(decal_set_emission_energy, RID, float) + FUNC2(decal_set_albedo_mix, RID, float) + FUNC2(decal_set_modulate, RID, const Color &) + FUNC2(decal_set_cull_mask, RID, uint32_t) + FUNC4(decal_set_distance_fade, RID, bool, float, float) + FUNC3(decal_set_fade, RID, float, float) + FUNC2(decal_set_normal_fade, RID, float) + /* BAKED LIGHT API */ FUNCRID(gi_probe) @@ -370,7 +384,7 @@ public: FUNCRID(viewport) - FUNC2(viewport_set_use_arvr, RID, bool) + FUNC2(viewport_set_use_xr, RID, bool) FUNC3(viewport_set_size, RID, int, int) @@ -403,6 +417,7 @@ public: FUNC2(viewport_set_shadow_atlas_size, RID, int) FUNC3(viewport_set_shadow_atlas_quadrant_subdivision, RID, int, int) FUNC2(viewport_set_msaa, RID, ViewportMSAA) + FUNC2(viewport_set_screen_space_aa, RID, ViewportScreenSpaceAA) //this passes directly to avoid stalling, but it's pretty dangerous, so don't call after freeing a viewport virtual int viewport_get_render_info(RID p_viewport, ViewportRenderInfo p_info) { @@ -411,6 +426,14 @@ public: FUNC2(viewport_set_debug_draw, RID, ViewportDebugDraw) + FUNC2(viewport_set_measure_render_time, RID, bool) + virtual float viewport_get_measured_render_time_cpu(RID p_viewport) const { + return rendering_server->viewport_get_measured_render_time_cpu(p_viewport); + } + virtual float viewport_get_measured_render_time_gpu(RID p_viewport) const { + return rendering_server->viewport_get_measured_render_time_gpu(p_viewport); + } + FUNC1(directional_shadow_atlas_set_size, int) /* SKY API */ @@ -467,6 +490,9 @@ public: FUNC8(camera_effects_set_dof_blur, RID, bool, float, float, bool, float, float, float) FUNC3(camera_effects_set_custom_exposure, RID, bool, float) + FUNC1(shadows_quality_set, ShadowQuality); + FUNC1(directional_shadow_quality_set, ShadowQuality); + FUNCRID(scenario) FUNC2(scenario_set_debug, RID, ScenarioDebugMode) @@ -506,6 +532,11 @@ public: FUNC5(instance_geometry_set_draw_range, RID, float, float, float, float) FUNC2(instance_geometry_set_as_instance_lod, RID, RID) + FUNC3(instance_geometry_set_shader_parameter, RID, const StringName &, const Variant &) + FUNC2RC(Variant, instance_geometry_get_shader_parameter, RID, const StringName &) + FUNC2RC(Variant, instance_geometry_get_shader_parameter_default_value, RID, const StringName &) + FUNC2SC(instance_geometry_get_shader_parameter_list, RID, List<PropertyInfo> *) + /* CANVAS (2D) */ FUNCRID(canvas) @@ -599,6 +630,18 @@ public: FUNC2(canvas_occluder_polygon_set_cull_mode, RID, CanvasOccluderPolygonCullMode) + /* GLOBAL VARIABLES */ + + FUNC3(global_variable_add, const StringName &, GlobalVariableType, const Variant &) + FUNC1(global_variable_remove, const StringName &) + FUNC0RC(Vector<StringName>, global_variable_get_list) + FUNC2(global_variable_set, const StringName &, const Variant &) + FUNC2(global_variable_set_override, const StringName &, const Variant &) + FUNC1RC(GlobalVariableType, global_variable_get_type, const StringName &) + FUNC1RC(Variant, global_variable_get, const StringName &) + FUNC1(global_variables_load_settings, bool) + FUNC0(global_variables_clear) + /* BLACK BARS */ FUNC4(black_bars_set_margins, int, int, int, int) diff --git a/servers/rendering/shader_language.cpp b/servers/rendering/shader_language.cpp index 76a81a4a1c..93593effd4 100644 --- a/servers/rendering/shader_language.cpp +++ b/servers/rendering/shader_language.cpp @@ -194,6 +194,8 @@ const char *ShaderLanguage::token_names[TK_MAX] = { "SEMICOLON", "PERIOD", "UNIFORM", + "INSTANCE", + "GLOBAL", "VARYING", "IN", "OUT", @@ -207,6 +209,7 @@ const char *ShaderLanguage::token_names[TK_MAX] = { "HINT_BLACK_ALBEDO_TEXTURE", "HINT_COLOR", "HINT_RANGE", + "HINT_INSTANCE_INDEX", "FILTER_NEAREST", "FILTER_LINEAR", "FILTER_NEAREST_MIPMAP", @@ -300,6 +303,8 @@ const ShaderLanguage::KeyWord ShaderLanguage::keyword_list[] = { { TK_CF_RETURN, "return" }, { TK_CF_DISCARD, "discard" }, { TK_UNIFORM, "uniform" }, + { TK_INSTANCE, "instance" }, + { TK_GLOBAL, "global" }, { TK_VARYING, "varying" }, { TK_ARG_IN, "in" }, { TK_ARG_OUT, "out" }, @@ -319,6 +324,7 @@ const ShaderLanguage::KeyWord ShaderLanguage::keyword_list[] = { { TK_HINT_BLACK_ALBEDO_TEXTURE, "hint_black_albedo" }, { TK_HINT_COLOR, "hint_color" }, { TK_HINT_RANGE, "hint_range" }, + { TK_HINT_INSTANCE_INDEX, "instance_index" }, { TK_FILTER_NEAREST, "filter_nearest" }, { TK_FILTER_LINEAR, "filter_linear" }, { TK_FILTER_NEAREST_MIPMAP, "filter_nearest_mipmap" }, @@ -864,6 +870,7 @@ String ShaderLanguage::get_datatype_name(DataType p_type) { case TYPE_USAMPLER3D: return "usampler3D"; case TYPE_SAMPLERCUBE: return "samplerCube"; case TYPE_STRUCT: return "struct"; + case TYPE_MAX: return "invalid"; } return ""; @@ -2678,6 +2685,8 @@ Variant ShaderLanguage::constant_value_to_variant(const Vector<ShaderLanguage::C break; case ShaderLanguage::TYPE_VOID: break; + case ShaderLanguage::TYPE_MAX: + break; } return value; } @@ -2774,6 +2783,8 @@ PropertyInfo ShaderLanguage::uniform_to_property_info(const ShaderNode::Uniform case ShaderLanguage::TYPE_STRUCT: { // FIXME: Implement this. } break; + case ShaderLanguage::TYPE_MAX: + break; } return pi; } @@ -2822,6 +2833,8 @@ uint32_t ShaderLanguage::get_type_size(DataType p_type) { case TYPE_STRUCT: // FIXME: Implement. return 0; + case ShaderLanguage::TYPE_MAX: + return 0; } return 0; } @@ -5685,6 +5698,8 @@ Error ShaderLanguage::_parse_shader(const Map<StringName, FunctionInfo> &p_funct int texture_uniforms = 0; int uniforms = 0; + int instance_index = 0; + ShaderNode::Uniform::Scope uniform_scope = ShaderNode::Uniform::SCOPE_LOCAL; while (tk.type != TK_EOF) { @@ -5853,6 +5868,27 @@ Error ShaderLanguage::_parse_shader(const Map<StringName, FunctionInfo> &p_funct shader->vstructs.push_back(st); // struct's order is important! } break; + case TK_GLOBAL: { + + tk = _get_token(); + if (tk.type != TK_UNIFORM) { + _set_error("Expected 'uniform' after 'global'"); + return ERR_PARSE_ERROR; + } + uniform_scope = ShaderNode::Uniform::SCOPE_GLOBAL; + }; + [[fallthrough]]; + case TK_INSTANCE: { + if (uniform_scope == ShaderNode::Uniform::SCOPE_LOCAL) { + tk = _get_token(); + if (tk.type != TK_UNIFORM) { + _set_error("Expected 'uniform' after 'instance'"); + return ERR_PARSE_ERROR; + } + uniform_scope = ShaderNode::Uniform::SCOPE_INSTANCE; + } + }; + [[fallthrough]]; case TK_UNIFORM: case TK_VARYING: { @@ -5910,25 +5946,50 @@ Error ShaderLanguage::_parse_shader(const Map<StringName, FunctionInfo> &p_funct if (uniform) { + if (uniform_scope == ShaderNode::Uniform::SCOPE_GLOBAL) { + //validate global uniform + DataType gvtype = global_var_get_type_func(name); + if (gvtype == TYPE_MAX) { + _set_error("Global uniform '" + String(name) + "' does not exist. Create it in Project Settings."); + return ERR_PARSE_ERROR; + } + + if (type != gvtype) { + _set_error("Global uniform '" + String(name) + "' must be of type '" + get_datatype_name(gvtype) + "'."); + return ERR_PARSE_ERROR; + } + } ShaderNode::Uniform uniform2; if (is_sampler_type(type)) { + if (uniform_scope == ShaderNode::Uniform::SCOPE_INSTANCE) { + _set_error("Uniforms with 'instance' qualifiers can't be of sampler type."); + return ERR_PARSE_ERROR; + } uniform2.texture_order = texture_uniforms++; uniform2.order = -1; if (_validate_datatype(type) != OK) { return ERR_PARSE_ERROR; } } else { + if (uniform_scope == ShaderNode::Uniform::SCOPE_LOCAL && (type == TYPE_MAT2 || type == TYPE_MAT3 || type == TYPE_MAT4)) { + _set_error("Uniforms with 'instance' qualifiers can't be of matrix type."); + return ERR_PARSE_ERROR; + } + uniform2.texture_order = -1; uniform2.order = uniforms++; } uniform2.type = type; + uniform2.scope = uniform_scope; uniform2.precision = precision; //todo parse default value tk = _get_token(); + int custom_instance_index = -1; + if (tk.type == TK_COLON) { //hint do { @@ -6039,7 +6100,45 @@ Error ShaderLanguage::_parse_shader(const Map<StringName, FunctionInfo> &p_funct } if (tk.type != TK_PARENTHESIS_CLOSE) { - _set_error("Expected ','"); + _set_error("Expected ')'"); + return ERR_PARSE_ERROR; + } + } else if (tk.type == TK_HINT_INSTANCE_INDEX) { + + if (custom_instance_index != -1) { + _set_error("Can only specify 'instance_index' once."); + return ERR_PARSE_ERROR; + } + + tk = _get_token(); + if (tk.type != TK_PARENTHESIS_OPEN) { + _set_error("Expected '(' after 'instance_index'"); + return ERR_PARSE_ERROR; + } + + tk = _get_token(); + + if (tk.type == TK_OP_SUB) { + _set_error("The instance index can't be negative."); + return ERR_PARSE_ERROR; + } + + if (tk.type != TK_INT_CONSTANT) { + _set_error("Expected integer constant"); + return ERR_PARSE_ERROR; + } + + custom_instance_index = tk.constant; + + if (custom_instance_index >= MAX_INSTANCE_UNIFORM_INDICES) { + _set_error("Allowed instance uniform indices are 0-" + itos(MAX_INSTANCE_UNIFORM_INDICES - 1)); + return ERR_PARSE_ERROR; + } + + tk = _get_token(); + + if (tk.type != TK_PARENTHESIS_CLOSE) { + _set_error("Expected ')'"); return ERR_PARSE_ERROR; } } else if (tk.type == TK_FILTER_LINEAR) { @@ -6072,6 +6171,20 @@ Error ShaderLanguage::_parse_shader(const Map<StringName, FunctionInfo> &p_funct } while (tk.type == TK_COMMA); } + if (uniform_scope == ShaderNode::Uniform::SCOPE_INSTANCE) { + if (custom_instance_index >= 0) { + uniform2.instance_index = custom_instance_index; + } else { + uniform2.instance_index = instance_index++; + if (instance_index > MAX_INSTANCE_UNIFORM_INDICES) { + _set_error("Too many 'instance' uniforms in shader, maximum supported is " + itos(MAX_INSTANCE_UNIFORM_INDICES)); + return ERR_PARSE_ERROR; + } + } + } + + //reset scope for next uniform + if (tk.type == TK_OP_ASSIGN) { Node *expr = _parse_and_reduce_expression(nullptr, Map<StringName, BuiltInInfo>()); @@ -6094,6 +6207,8 @@ Error ShaderLanguage::_parse_shader(const Map<StringName, FunctionInfo> &p_funct } shader->uniforms[name] = uniform2; + //reset scope for next uniform + uniform_scope = ShaderNode::Uniform::SCOPE_LOCAL; if (tk.type != TK_SEMICOLON) { _set_error("Expected ';'"); @@ -6219,6 +6334,7 @@ Error ShaderLanguage::_parse_shader(const Map<StringName, FunctionInfo> &p_funct while (true) { ShaderNode::Constant constant; + constant.name = name; constant.type = is_struct ? TYPE_STRUCT : type; constant.type_str = struct_name; constant.precision = precision; @@ -6258,6 +6374,8 @@ Error ShaderLanguage::_parse_shader(const Map<StringName, FunctionInfo> &p_funct } shader->constants[name] = constant; + shader->vconstants.push_back(constant); + if (tk.type == TK_COMMA) { tk = _get_token(); if (tk.type != TK_IDENTIFIER) { @@ -6639,11 +6757,12 @@ String ShaderLanguage::get_shader_type(const String &p_code) { return String(); } -Error ShaderLanguage::compile(const String &p_code, const Map<StringName, FunctionInfo> &p_functions, const Vector<StringName> &p_render_modes, const Set<String> &p_shader_types) { +Error ShaderLanguage::compile(const String &p_code, const Map<StringName, FunctionInfo> &p_functions, const Vector<StringName> &p_render_modes, const Set<String> &p_shader_types, GlobalVariableGetTypeFunc p_global_variable_type_func) { clear(); code = p_code; + global_var_get_type_func = p_global_variable_type_func; nodes = nullptr; @@ -6656,13 +6775,14 @@ Error ShaderLanguage::compile(const String &p_code, const Map<StringName, Functi return OK; } -Error ShaderLanguage::complete(const String &p_code, const Map<StringName, FunctionInfo> &p_functions, const Vector<StringName> &p_render_modes, const Set<String> &p_shader_types, List<ScriptCodeCompletionOption> *r_options, String &r_call_hint) { +Error ShaderLanguage::complete(const String &p_code, const Map<StringName, FunctionInfo> &p_functions, const Vector<StringName> &p_render_modes, const Set<String> &p_shader_types, GlobalVariableGetTypeFunc p_global_variable_type_func, List<ScriptCodeCompletionOption> *r_options, String &r_call_hint) { clear(); code = p_code; nodes = nullptr; + global_var_get_type_func = p_global_variable_type_func; shader = alloc_node<ShaderNode>(); _parse_shader(p_functions, p_render_modes, p_shader_types); diff --git a/servers/rendering/shader_language.h b/servers/rendering/shader_language.h index beabae0dda..973e1c4937 100644 --- a/servers/rendering/shader_language.h +++ b/servers/rendering/shader_language.h @@ -143,6 +143,8 @@ public: TK_SEMICOLON, TK_PERIOD, TK_UNIFORM, + TK_INSTANCE, + TK_GLOBAL, TK_VARYING, TK_ARG_IN, TK_ARG_OUT, @@ -162,6 +164,7 @@ public: TK_HINT_BLACK_ALBEDO_TEXTURE, TK_HINT_COLOR, TK_HINT_RANGE, + TK_HINT_INSTANCE_INDEX, TK_FILTER_NEAREST, TK_FILTER_LINEAR, TK_FILTER_NEAREST_MIPMAP, @@ -216,6 +219,7 @@ public: TYPE_USAMPLER3D, TYPE_SAMPLERCUBE, TYPE_STRUCT, + TYPE_MAX }; enum DataPrecision { @@ -317,6 +321,10 @@ public: REPEAT_DEFAULT, }; + enum { + MAX_INSTANCE_UNIFORM_INDICES = 16 + }; + struct Node { Node *next; @@ -599,6 +607,7 @@ public: struct ShaderNode : public Node { struct Constant { + StringName name; DataType type; StringName type_str; DataPrecision precision; @@ -650,15 +659,23 @@ public: HINT_MAX }; + enum Scope { + SCOPE_LOCAL, + SCOPE_INSTANCE, + SCOPE_GLOBAL, + }; + int order; int texture_order; DataType type; DataPrecision precision; Vector<ConstantNode::Value> default_value; + Scope scope; Hint hint; TextureFilter filter; TextureRepeat repeat; float hint_range[3]; + int instance_index; Uniform() : order(0), @@ -667,7 +684,8 @@ public: precision(PRECISION_DEFAULT), hint(HINT_NONE), filter(FILTER_DEFAULT), - repeat(REPEAT_DEFAULT) { + repeat(REPEAT_DEFAULT), + instance_index(0) { hint_range[0] = 0.0f; hint_range[1] = 1.0f; hint_range[2] = 0.001f; @@ -681,6 +699,7 @@ public: Vector<StringName> render_modes; Vector<Function> functions; + Vector<Constant> vconstants; Vector<Struct> vstructs; ShaderNode() : @@ -764,6 +783,8 @@ public: }; static bool has_builtin(const Map<StringName, ShaderLanguage::FunctionInfo> &p_functions, const StringName &p_name); + typedef DataType (*GlobalVariableGetTypeFunc)(const StringName &p_name); + private: struct KeyWord { TokenType token; @@ -772,6 +793,8 @@ private: static const KeyWord keyword_list[]; + GlobalVariableGetTypeFunc global_var_get_type_func; + bool error_set; String error_str; int error_line; @@ -884,8 +907,8 @@ public: void clear(); static String get_shader_type(const String &p_code); - Error compile(const String &p_code, const Map<StringName, FunctionInfo> &p_functions, const Vector<StringName> &p_render_modes, const Set<String> &p_shader_types); - Error complete(const String &p_code, const Map<StringName, FunctionInfo> &p_functions, const Vector<StringName> &p_render_modes, const Set<String> &p_shader_types, List<ScriptCodeCompletionOption> *r_options, String &r_call_hint); + Error compile(const String &p_code, const Map<StringName, FunctionInfo> &p_functions, const Vector<StringName> &p_render_modes, const Set<String> &p_shader_types, GlobalVariableGetTypeFunc p_global_variable_type_func); + Error complete(const String &p_code, const Map<StringName, FunctionInfo> &p_functions, const Vector<StringName> &p_render_modes, const Set<String> &p_shader_types, GlobalVariableGetTypeFunc p_global_variable_type_func, List<ScriptCodeCompletionOption> *r_options, String &r_call_hint); String get_error_text(); int get_error_line(); diff --git a/servers/rendering/shader_types.cpp b/servers/rendering/shader_types.cpp index 78fa2c2690..78bbd73db4 100644 --- a/servers/rendering/shader_types.cpp +++ b/servers/rendering/shader_types.cpp @@ -108,7 +108,11 @@ ShaderTypes::ShaderTypes() { shader_modes[RS::SHADER_SPATIAL].functions["fragment"].built_ins["ANISOTROPY"] = ShaderLanguage::TYPE_FLOAT; shader_modes[RS::SHADER_SPATIAL].functions["fragment"].built_ins["ANISOTROPY_FLOW"] = ShaderLanguage::TYPE_VEC2; shader_modes[RS::SHADER_SPATIAL].functions["fragment"].built_ins["SSS_STRENGTH"] = ShaderLanguage::TYPE_FLOAT; - shader_modes[RS::SHADER_SPATIAL].functions["fragment"].built_ins["TRANSMISSION"] = ShaderLanguage::TYPE_VEC3; + shader_modes[RS::SHADER_SPATIAL].functions["fragment"].built_ins["SSS_TRANSMITTANCE_COLOR"] = ShaderLanguage::TYPE_VEC4; + shader_modes[RS::SHADER_SPATIAL].functions["fragment"].built_ins["SSS_TRANSMITTANCE_DEPTH"] = ShaderLanguage::TYPE_FLOAT; + shader_modes[RS::SHADER_SPATIAL].functions["fragment"].built_ins["SSS_TRANSMITTANCE_CURVE"] = ShaderLanguage::TYPE_FLOAT; + shader_modes[RS::SHADER_SPATIAL].functions["fragment"].built_ins["SSS_TRANSMITTANCE_BOOST"] = ShaderLanguage::TYPE_FLOAT; + shader_modes[RS::SHADER_SPATIAL].functions["fragment"].built_ins["BACKLIGHT"] = ShaderLanguage::TYPE_VEC3; shader_modes[RS::SHADER_SPATIAL].functions["fragment"].built_ins["AO"] = ShaderLanguage::TYPE_FLOAT; shader_modes[RS::SHADER_SPATIAL].functions["fragment"].built_ins["AO_LIGHT_AFFECT"] = ShaderLanguage::TYPE_FLOAT; shader_modes[RS::SHADER_SPATIAL].functions["fragment"].built_ins["EMISSION"] = ShaderLanguage::TYPE_VEC3; @@ -145,7 +149,7 @@ ShaderTypes::ShaderTypes() { shader_modes[RS::SHADER_SPATIAL].functions["light"].built_ins["LIGHT_COLOR"] = constt(ShaderLanguage::TYPE_VEC3); shader_modes[RS::SHADER_SPATIAL].functions["light"].built_ins["ATTENUATION"] = constt(ShaderLanguage::TYPE_VEC3); shader_modes[RS::SHADER_SPATIAL].functions["light"].built_ins["ALBEDO"] = constt(ShaderLanguage::TYPE_VEC3); - shader_modes[RS::SHADER_SPATIAL].functions["light"].built_ins["TRANSMISSION"] = constt(ShaderLanguage::TYPE_VEC3); + shader_modes[RS::SHADER_SPATIAL].functions["light"].built_ins["BACKLIGHT"] = constt(ShaderLanguage::TYPE_VEC3); shader_modes[RS::SHADER_SPATIAL].functions["light"].built_ins["ROUGHNESS"] = constt(ShaderLanguage::TYPE_FLOAT); shader_modes[RS::SHADER_SPATIAL].functions["light"].built_ins["DIFFUSE_LIGHT"] = ShaderLanguage::TYPE_VEC3; shader_modes[RS::SHADER_SPATIAL].functions["light"].built_ins["SPECULAR_LIGHT"] = ShaderLanguage::TYPE_VEC3; @@ -299,18 +303,22 @@ ShaderTypes::ShaderTypes() { shader_modes[RS::SHADER_SKY].functions["global"].built_ins["LIGHT0_DIRECTION"] = constt(ShaderLanguage::TYPE_VEC3); shader_modes[RS::SHADER_SKY].functions["global"].built_ins["LIGHT0_ENERGY"] = constt(ShaderLanguage::TYPE_FLOAT); shader_modes[RS::SHADER_SKY].functions["global"].built_ins["LIGHT0_COLOR"] = constt(ShaderLanguage::TYPE_VEC3); + shader_modes[RS::SHADER_SKY].functions["global"].built_ins["LIGHT0_SIZE"] = constt(ShaderLanguage::TYPE_FLOAT); shader_modes[RS::SHADER_SKY].functions["global"].built_ins["LIGHT1_ENABLED"] = constt(ShaderLanguage::TYPE_BOOL); shader_modes[RS::SHADER_SKY].functions["global"].built_ins["LIGHT1_DIRECTION"] = constt(ShaderLanguage::TYPE_VEC3); shader_modes[RS::SHADER_SKY].functions["global"].built_ins["LIGHT1_ENERGY"] = constt(ShaderLanguage::TYPE_FLOAT); shader_modes[RS::SHADER_SKY].functions["global"].built_ins["LIGHT1_COLOR"] = constt(ShaderLanguage::TYPE_VEC3); + shader_modes[RS::SHADER_SKY].functions["global"].built_ins["LIGHT1_SIZE"] = constt(ShaderLanguage::TYPE_FLOAT); shader_modes[RS::SHADER_SKY].functions["global"].built_ins["LIGHT2_ENABLED"] = constt(ShaderLanguage::TYPE_BOOL); shader_modes[RS::SHADER_SKY].functions["global"].built_ins["LIGHT2_DIRECTION"] = constt(ShaderLanguage::TYPE_VEC3); shader_modes[RS::SHADER_SKY].functions["global"].built_ins["LIGHT2_ENERGY"] = constt(ShaderLanguage::TYPE_FLOAT); shader_modes[RS::SHADER_SKY].functions["global"].built_ins["LIGHT2_COLOR"] = constt(ShaderLanguage::TYPE_VEC3); + shader_modes[RS::SHADER_SKY].functions["global"].built_ins["LIGHT2_SIZE"] = constt(ShaderLanguage::TYPE_FLOAT); shader_modes[RS::SHADER_SKY].functions["global"].built_ins["LIGHT3_ENABLED"] = constt(ShaderLanguage::TYPE_BOOL); shader_modes[RS::SHADER_SKY].functions["global"].built_ins["LIGHT3_DIRECTION"] = constt(ShaderLanguage::TYPE_VEC3); shader_modes[RS::SHADER_SKY].functions["global"].built_ins["LIGHT3_ENERGY"] = constt(ShaderLanguage::TYPE_FLOAT); shader_modes[RS::SHADER_SKY].functions["global"].built_ins["LIGHT3_COLOR"] = constt(ShaderLanguage::TYPE_VEC3); + shader_modes[RS::SHADER_SKY].functions["global"].built_ins["LIGHT3_SIZE"] = constt(ShaderLanguage::TYPE_FLOAT); shader_modes[RS::SHADER_SKY].functions["fragment"].built_ins["COLOR"] = ShaderLanguage::TYPE_VEC3; shader_modes[RS::SHADER_SKY].functions["fragment"].built_ins["ALPHA"] = ShaderLanguage::TYPE_FLOAT; diff --git a/servers/rendering_server.cpp b/servers/rendering_server.cpp index d417567a23..908f05702c 100644 --- a/servers/rendering_server.cpp +++ b/servers/rendering_server.cpp @@ -1565,6 +1565,42 @@ Array RenderingServer::_mesh_surface_get_skeleton_aabb_bind(RID p_mesh, int p_su return arr; } #endif + +ShaderLanguage::DataType RenderingServer::global_variable_type_get_shader_datatype(GlobalVariableType p_type) { + + switch (p_type) { + case RS::GLOBAL_VAR_TYPE_BOOL: return ShaderLanguage::TYPE_BOOL; + case RS::GLOBAL_VAR_TYPE_BVEC2: return ShaderLanguage::TYPE_BVEC2; + case RS::GLOBAL_VAR_TYPE_BVEC3: return ShaderLanguage::TYPE_BVEC3; + case RS::GLOBAL_VAR_TYPE_BVEC4: return ShaderLanguage::TYPE_BVEC4; + case RS::GLOBAL_VAR_TYPE_INT: return ShaderLanguage::TYPE_INT; + case RS::GLOBAL_VAR_TYPE_IVEC2: return ShaderLanguage::TYPE_IVEC2; + case RS::GLOBAL_VAR_TYPE_IVEC3: return ShaderLanguage::TYPE_IVEC3; + case RS::GLOBAL_VAR_TYPE_IVEC4: return ShaderLanguage::TYPE_IVEC4; + case RS::GLOBAL_VAR_TYPE_RECT2I: return ShaderLanguage::TYPE_IVEC4; + case RS::GLOBAL_VAR_TYPE_UINT: return ShaderLanguage::TYPE_UINT; + case RS::GLOBAL_VAR_TYPE_UVEC2: return ShaderLanguage::TYPE_UVEC2; + case RS::GLOBAL_VAR_TYPE_UVEC3: return ShaderLanguage::TYPE_UVEC3; + case RS::GLOBAL_VAR_TYPE_UVEC4: return ShaderLanguage::TYPE_UVEC4; + case RS::GLOBAL_VAR_TYPE_FLOAT: return ShaderLanguage::TYPE_FLOAT; + case RS::GLOBAL_VAR_TYPE_VEC2: return ShaderLanguage::TYPE_VEC2; + case RS::GLOBAL_VAR_TYPE_VEC3: return ShaderLanguage::TYPE_VEC3; + case RS::GLOBAL_VAR_TYPE_VEC4: return ShaderLanguage::TYPE_VEC4; + case RS::GLOBAL_VAR_TYPE_COLOR: return ShaderLanguage::TYPE_VEC4; + case RS::GLOBAL_VAR_TYPE_RECT2: return ShaderLanguage::TYPE_VEC4; + case RS::GLOBAL_VAR_TYPE_MAT2: return ShaderLanguage::TYPE_MAT2; + case RS::GLOBAL_VAR_TYPE_MAT3: return ShaderLanguage::TYPE_MAT3; + case RS::GLOBAL_VAR_TYPE_MAT4: return ShaderLanguage::TYPE_MAT4; + case RS::GLOBAL_VAR_TYPE_TRANSFORM_2D: return ShaderLanguage::TYPE_MAT3; + case RS::GLOBAL_VAR_TYPE_TRANSFORM: return ShaderLanguage::TYPE_MAT4; + case RS::GLOBAL_VAR_TYPE_SAMPLER2D: return ShaderLanguage::TYPE_SAMPLER2D; + case RS::GLOBAL_VAR_TYPE_SAMPLER2DARRAY: return ShaderLanguage::TYPE_SAMPLER2DARRAY; + case RS::GLOBAL_VAR_TYPE_SAMPLER3D: return ShaderLanguage::TYPE_SAMPLER3D; + case RS::GLOBAL_VAR_TYPE_SAMPLERCUBE: return ShaderLanguage::TYPE_SAMPLERCUBE; + default: return ShaderLanguage::TYPE_MAX; //invalid or not found + } +} + void RenderingServer::_bind_methods() { ClassDB::bind_method(D_METHOD("force_sync"), &RenderingServer::sync); @@ -1766,7 +1802,7 @@ void RenderingServer::_bind_methods() { ClassDB::bind_method(D_METHOD("camera_set_use_vertical_aspect", "camera", "enable"), &RenderingServer::camera_set_use_vertical_aspect); ClassDB::bind_method(D_METHOD("viewport_create"), &RenderingServer::viewport_create); - ClassDB::bind_method(D_METHOD("viewport_set_use_arvr", "viewport", "use_arvr"), &RenderingServer::viewport_set_use_arvr); + ClassDB::bind_method(D_METHOD("viewport_set_use_xr", "viewport", "use_xr"), &RenderingServer::viewport_set_use_xr); ClassDB::bind_method(D_METHOD("viewport_set_size", "viewport", "width", "height"), &RenderingServer::viewport_set_size); ClassDB::bind_method(D_METHOD("viewport_set_active", "viewport", "active"), &RenderingServer::viewport_set_active); ClassDB::bind_method(D_METHOD("viewport_set_parent_viewport", "viewport", "parent_viewport"), &RenderingServer::viewport_set_parent_viewport); @@ -1921,6 +1957,13 @@ void RenderingServer::_bind_methods() { ClassDB::bind_method(D_METHOD("canvas_occluder_polygon_set_shape_as_lines", "occluder_polygon", "shape"), &RenderingServer::canvas_occluder_polygon_set_shape_as_lines); ClassDB::bind_method(D_METHOD("canvas_occluder_polygon_set_cull_mode", "occluder_polygon", "mode"), &RenderingServer::canvas_occluder_polygon_set_cull_mode); + ClassDB::bind_method(D_METHOD("global_variable_add", "name", "type", "default_value"), &RenderingServer::global_variable_add); + ClassDB::bind_method(D_METHOD("global_variable_remove", "name"), &RenderingServer::global_variable_remove); + ClassDB::bind_method(D_METHOD("global_variable_get_list"), &RenderingServer::global_variable_get_list); + ClassDB::bind_method(D_METHOD("global_variable_set", "name", "value"), &RenderingServer::global_variable_set); + ClassDB::bind_method(D_METHOD("global_variable_get", "name"), &RenderingServer::global_variable_get); + ClassDB::bind_method(D_METHOD("global_variable_get_type", "name"), &RenderingServer::global_variable_get_type); + ClassDB::bind_method(D_METHOD("black_bars_set_margins", "left", "top", "right", "bottom"), &RenderingServer::black_bars_set_margins); ClassDB::bind_method(D_METHOD("black_bars_set_images", "left", "top", "right", "bottom"), &RenderingServer::black_bars_set_images); @@ -1955,9 +1998,6 @@ void RenderingServer::_bind_methods() { BIND_CONSTANT(MAX_GLOW_LEVELS); BIND_CONSTANT(MAX_CURSORS); - BIND_CONSTANT(MATERIAL_RENDER_PRIORITY_MIN); - BIND_CONSTANT(MATERIAL_RENDER_PRIORITY_MAX); - BIND_ENUM_CONSTANT(TEXTURE_LAYERED_2D_ARRAY); BIND_ENUM_CONSTANT(TEXTURE_LAYERED_CUBEMAP); BIND_ENUM_CONSTANT(TEXTURE_LAYERED_CUBEMAP_ARRAY); @@ -1975,6 +2015,9 @@ void RenderingServer::_bind_methods() { BIND_ENUM_CONSTANT(SHADER_SKY); BIND_ENUM_CONSTANT(SHADER_MAX); + BIND_CONSTANT(MATERIAL_RENDER_PRIORITY_MIN); + BIND_CONSTANT(MATERIAL_RENDER_PRIORITY_MAX); + BIND_ENUM_CONSTANT(ARRAY_VERTEX); BIND_ENUM_CONSTANT(ARRAY_NORMAL); BIND_ENUM_CONSTANT(ARRAY_TANGENT); @@ -2002,9 +2045,10 @@ void RenderingServer::_bind_methods() { BIND_ENUM_CONSTANT(ARRAY_COMPRESS_TEX_UV); BIND_ENUM_CONSTANT(ARRAY_COMPRESS_TEX_UV2); BIND_ENUM_CONSTANT(ARRAY_COMPRESS_INDEX); + BIND_ENUM_CONSTANT(ARRAY_COMPRESS_DEFAULT); + BIND_ENUM_CONSTANT(ARRAY_FLAG_USE_2D_VERTICES); BIND_ENUM_CONSTANT(ARRAY_FLAG_USE_DYNAMIC_UPDATE); - BIND_ENUM_CONSTANT(ARRAY_COMPRESS_DEFAULT); BIND_ENUM_CONSTANT(PRIMITIVE_POINTS); BIND_ENUM_CONSTANT(PRIMITIVE_LINES); @@ -2027,10 +2071,10 @@ void RenderingServer::_bind_methods() { BIND_ENUM_CONSTANT(LIGHT_PARAM_INDIRECT_ENERGY); BIND_ENUM_CONSTANT(LIGHT_PARAM_SPECULAR); BIND_ENUM_CONSTANT(LIGHT_PARAM_RANGE); + BIND_ENUM_CONSTANT(LIGHT_PARAM_SIZE); BIND_ENUM_CONSTANT(LIGHT_PARAM_ATTENUATION); BIND_ENUM_CONSTANT(LIGHT_PARAM_SPOT_ANGLE); BIND_ENUM_CONSTANT(LIGHT_PARAM_SPOT_ATTENUATION); - BIND_ENUM_CONSTANT(LIGHT_PARAM_CONTACT_SHADOW_SIZE); BIND_ENUM_CONSTANT(LIGHT_PARAM_SHADOW_MAX_DISTANCE); BIND_ENUM_CONSTANT(LIGHT_PARAM_SHADOW_SPLIT_1_OFFSET); BIND_ENUM_CONSTANT(LIGHT_PARAM_SHADOW_SPLIT_2_OFFSET); @@ -2038,7 +2082,9 @@ void RenderingServer::_bind_methods() { BIND_ENUM_CONSTANT(LIGHT_PARAM_SHADOW_FADE_START); BIND_ENUM_CONSTANT(LIGHT_PARAM_SHADOW_NORMAL_BIAS); BIND_ENUM_CONSTANT(LIGHT_PARAM_SHADOW_BIAS); - BIND_ENUM_CONSTANT(LIGHT_PARAM_SHADOW_BIAS_SPLIT_SCALE); + BIND_ENUM_CONSTANT(LIGHT_PARAM_SHADOW_PANCAKE_SIZE); + BIND_ENUM_CONSTANT(LIGHT_PARAM_SHADOW_BLUR); + BIND_ENUM_CONSTANT(LIGHT_PARAM_TRANSMITTANCE_BIAS); BIND_ENUM_CONSTANT(LIGHT_PARAM_MAX); BIND_ENUM_CONSTANT(LIGHT_OMNI_SHADOW_DUAL_PARABOLOID); @@ -2054,6 +2100,12 @@ void RenderingServer::_bind_methods() { BIND_ENUM_CONSTANT(REFLECTION_PROBE_UPDATE_ONCE); BIND_ENUM_CONSTANT(REFLECTION_PROBE_UPDATE_ALWAYS); + BIND_ENUM_CONSTANT(DECAL_TEXTURE_ALBEDO); + BIND_ENUM_CONSTANT(DECAL_TEXTURE_NORMAL); + BIND_ENUM_CONSTANT(DECAL_TEXTURE_ORM); + BIND_ENUM_CONSTANT(DECAL_TEXTURE_EMISSION); + BIND_ENUM_CONSTANT(DECAL_TEXTURE_MAX); + BIND_ENUM_CONSTANT(PARTICLES_DRAW_ORDER_INDEX); BIND_ENUM_CONSTANT(PARTICLES_DRAW_ORDER_LIFETIME); BIND_ENUM_CONSTANT(PARTICLES_DRAW_ORDER_VIEW_DEPTH); @@ -2073,8 +2125,11 @@ void RenderingServer::_bind_methods() { BIND_ENUM_CONSTANT(VIEWPORT_MSAA_4X); BIND_ENUM_CONSTANT(VIEWPORT_MSAA_8X); BIND_ENUM_CONSTANT(VIEWPORT_MSAA_16X); - BIND_ENUM_CONSTANT(VIEWPORT_MSAA_EXT_2X); - BIND_ENUM_CONSTANT(VIEWPORT_MSAA_EXT_4X); + BIND_ENUM_CONSTANT(VIEWPORT_MSAA_MAX); + + BIND_ENUM_CONSTANT(VIEWPORT_SCREEN_SPACE_AA_DISABLED); + BIND_ENUM_CONSTANT(VIEWPORT_SCREEN_SPACE_AA_FXAA); + BIND_ENUM_CONSTANT(VIEWPORT_SCREEN_SPACE_AA_MAX); BIND_ENUM_CONSTANT(VIEWPORT_RENDER_INFO_OBJECTS_IN_FRAME); BIND_ENUM_CONSTANT(VIEWPORT_RENDER_INFO_VERTICES_IN_FRAME); @@ -2098,6 +2153,8 @@ void RenderingServer::_bind_methods() { BIND_ENUM_CONSTANT(VIEWPORT_DEBUG_DRAW_SCENE_LUMINANCE); BIND_ENUM_CONSTANT(VIEWPORT_DEBUG_DRAW_SSAO); BIND_ENUM_CONSTANT(VIEWPORT_DEBUG_DRAW_ROUGHNESS_LIMITER); + BIND_ENUM_CONSTANT(VIEWPORT_DEBUG_DRAW_PSSM_SPLITS); + BIND_ENUM_CONSTANT(VIEWPORT_DEBUG_DRAW_DECAL_ATLAS); BIND_ENUM_CONSTANT(SKY_MODE_QUALITY); BIND_ENUM_CONSTANT(SKY_MODE_REALTIME); @@ -2130,6 +2187,11 @@ void RenderingServer::_bind_methods() { BIND_ENUM_CONSTANT(ENV_TONE_MAPPER_FILMIC); BIND_ENUM_CONSTANT(ENV_TONE_MAPPER_ACES); + BIND_ENUM_CONSTANT(ENV_SSR_ROUGNESS_QUALITY_DISABLED); + BIND_ENUM_CONSTANT(ENV_SSR_ROUGNESS_QUALITY_LOW); + BIND_ENUM_CONSTANT(ENV_SSR_ROUGNESS_QUALITY_MEDIUM); + BIND_ENUM_CONSTANT(ENV_SSR_ROUGNESS_QUALITY_HIGH); + BIND_ENUM_CONSTANT(ENV_SSAO_BLUR_DISABLED); BIND_ENUM_CONSTANT(ENV_SSAO_BLUR_1x1); BIND_ENUM_CONSTANT(ENV_SSAO_BLUR_2x2); @@ -2140,6 +2202,11 @@ void RenderingServer::_bind_methods() { BIND_ENUM_CONSTANT(ENV_SSAO_QUALITY_HIGH); BIND_ENUM_CONSTANT(ENV_SSAO_QUALITY_ULTRA); + BIND_ENUM_CONSTANT(SUB_SURFACE_SCATTERING_QUALITY_DISABLED); + BIND_ENUM_CONSTANT(SUB_SURFACE_SCATTERING_QUALITY_LOW); + BIND_ENUM_CONSTANT(SUB_SURFACE_SCATTERING_QUALITY_MEDIUM); + BIND_ENUM_CONSTANT(SUB_SURFACE_SCATTERING_QUALITY_HIGH); + BIND_ENUM_CONSTANT(DOF_BLUR_QUALITY_VERY_LOW); BIND_ENUM_CONSTANT(DOF_BLUR_QUALITY_LOW); BIND_ENUM_CONSTANT(DOF_BLUR_QUALITY_MEDIUM); @@ -2149,6 +2216,13 @@ void RenderingServer::_bind_methods() { BIND_ENUM_CONSTANT(DOF_BOKEH_HEXAGON); BIND_ENUM_CONSTANT(DOF_BOKEH_CIRCLE); + BIND_ENUM_CONSTANT(SHADOW_QUALITY_HARD); + BIND_ENUM_CONSTANT(SHADOW_QUALITY_SOFT_LOW); + BIND_ENUM_CONSTANT(SHADOW_QUALITY_SOFT_MEDIUM); + BIND_ENUM_CONSTANT(SHADOW_QUALITY_SOFT_HIGH); + BIND_ENUM_CONSTANT(SHADOW_QUALITY_SOFT_ULTRA); + BIND_ENUM_CONSTANT(SHADOW_QUALITY_MAX); + BIND_ENUM_CONSTANT(SCENARIO_DEBUG_DISABLED); BIND_ENUM_CONSTANT(SCENARIO_DEBUG_WIREFRAME); BIND_ENUM_CONSTANT(SCENARIO_DEBUG_OVERDRAW); @@ -2161,6 +2235,7 @@ void RenderingServer::_bind_methods() { BIND_ENUM_CONSTANT(INSTANCE_PARTICLES); BIND_ENUM_CONSTANT(INSTANCE_LIGHT); BIND_ENUM_CONSTANT(INSTANCE_REFLECTION_PROBE); + BIND_ENUM_CONSTANT(INSTANCE_DECAL); BIND_ENUM_CONSTANT(INSTANCE_GI_PROBE); BIND_ENUM_CONSTANT(INSTANCE_LIGHTMAP_CAPTURE); BIND_ENUM_CONSTANT(INSTANCE_MAX); @@ -2209,6 +2284,36 @@ void RenderingServer::_bind_methods() { BIND_ENUM_CONSTANT(CANVAS_OCCLUDER_POLYGON_CULL_CLOCKWISE); BIND_ENUM_CONSTANT(CANVAS_OCCLUDER_POLYGON_CULL_COUNTER_CLOCKWISE); + BIND_ENUM_CONSTANT(GLOBAL_VAR_TYPE_BOOL); + BIND_ENUM_CONSTANT(GLOBAL_VAR_TYPE_BVEC2); + BIND_ENUM_CONSTANT(GLOBAL_VAR_TYPE_BVEC3); + BIND_ENUM_CONSTANT(GLOBAL_VAR_TYPE_BVEC4); + BIND_ENUM_CONSTANT(GLOBAL_VAR_TYPE_INT); + BIND_ENUM_CONSTANT(GLOBAL_VAR_TYPE_IVEC2); + BIND_ENUM_CONSTANT(GLOBAL_VAR_TYPE_IVEC3); + BIND_ENUM_CONSTANT(GLOBAL_VAR_TYPE_IVEC4); + BIND_ENUM_CONSTANT(GLOBAL_VAR_TYPE_RECT2I); + BIND_ENUM_CONSTANT(GLOBAL_VAR_TYPE_UINT); + BIND_ENUM_CONSTANT(GLOBAL_VAR_TYPE_UVEC2); + BIND_ENUM_CONSTANT(GLOBAL_VAR_TYPE_UVEC3); + BIND_ENUM_CONSTANT(GLOBAL_VAR_TYPE_UVEC4); + BIND_ENUM_CONSTANT(GLOBAL_VAR_TYPE_FLOAT); + BIND_ENUM_CONSTANT(GLOBAL_VAR_TYPE_VEC2); + BIND_ENUM_CONSTANT(GLOBAL_VAR_TYPE_VEC3); + BIND_ENUM_CONSTANT(GLOBAL_VAR_TYPE_VEC4); + BIND_ENUM_CONSTANT(GLOBAL_VAR_TYPE_COLOR); + BIND_ENUM_CONSTANT(GLOBAL_VAR_TYPE_RECT2); + BIND_ENUM_CONSTANT(GLOBAL_VAR_TYPE_MAT2); + BIND_ENUM_CONSTANT(GLOBAL_VAR_TYPE_MAT3); + BIND_ENUM_CONSTANT(GLOBAL_VAR_TYPE_MAT4); + BIND_ENUM_CONSTANT(GLOBAL_VAR_TYPE_TRANSFORM_2D); + BIND_ENUM_CONSTANT(GLOBAL_VAR_TYPE_TRANSFORM); + BIND_ENUM_CONSTANT(GLOBAL_VAR_TYPE_SAMPLER2D); + BIND_ENUM_CONSTANT(GLOBAL_VAR_TYPE_SAMPLER2DARRAY); + BIND_ENUM_CONSTANT(GLOBAL_VAR_TYPE_SAMPLER3D); + BIND_ENUM_CONSTANT(GLOBAL_VAR_TYPE_SAMPLERCUBE); + BIND_ENUM_CONSTANT(GLOBAL_VAR_TYPE_MAX); + BIND_ENUM_CONSTANT(INFO_OBJECTS_IN_FRAME); BIND_ENUM_CONSTANT(INFO_VERTICES_IN_FRAME); BIND_ENUM_CONSTANT(INFO_MATERIAL_CHANGES_IN_FRAME); @@ -2295,9 +2400,20 @@ 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")); + GLOBAL_DEF("rendering/quality/directional_shadow/soft_shadow_quality", 2); + GLOBAL_DEF("rendering/quality/directional_shadow/soft_shadow_quality.mobile", 0); + ProjectSettings::get_singleton()->set_custom_property_info("rendering/quality/directional_shadow/soft_shadow_quality", PropertyInfo(Variant::INT, "rendering/quality/directional_shadow/soft_shadow_quality", PROPERTY_HINT_ENUM, "Hard(Fastest), Soft Low (Fast), Soft Medium (Average), Soft High (Slow), Soft Ultra (Slowest)")); + + GLOBAL_DEF("rendering/quality/shadows/soft_shadow_quality", 2); + GLOBAL_DEF("rendering/quality/shadows/soft_shadow_quality.mobile", 0); + ProjectSettings::get_singleton()->set_custom_property_info("rendering/quality/shadows/soft_shadow_quality", PropertyInfo(Variant::INT, "rendering/quality/shadows/soft_shadow_quality", PROPERTY_HINT_ENUM, "Hard(Fastest), Soft Low (Fast), Soft Medium (Average), Soft High (Slow), Soft Ultra (Slowest)")); + GLOBAL_DEF("rendering/quality/shadow_atlas/size", 4096); GLOBAL_DEF("rendering/quality/shadow_atlas/size.mobile", 2048); ProjectSettings::get_singleton()->set_custom_property_info("rendering/quality/shadow_atlas/size", PropertyInfo(Variant::INT, "rendering/quality/shadow_atlas/size", PROPERTY_HINT_RANGE, "256,16384")); @@ -2310,10 +2426,6 @@ RenderingServer::RenderingServer() { ProjectSettings::get_singleton()->set_custom_property_info("rendering/quality/shadow_atlas/quadrant_2_subdiv", PropertyInfo(Variant::INT, "rendering/quality/shadow_atlas/quadrant_2_subdiv", PROPERTY_HINT_ENUM, "Disabled,1 Shadow,4 Shadows,16 Shadows,64 Shadows,256 Shadows,1024 Shadows")); ProjectSettings::get_singleton()->set_custom_property_info("rendering/quality/shadow_atlas/quadrant_3_subdiv", PropertyInfo(Variant::INT, "rendering/quality/shadow_atlas/quadrant_3_subdiv", PROPERTY_HINT_ENUM, "Disabled,1 Shadow,4 Shadows,16 Shadows,64 Shadows,256 Shadows,1024 Shadows")); - GLOBAL_DEF("rendering/quality/shadows/filter_mode", 1); - GLOBAL_DEF("rendering/quality/shadows/filter_mode.mobile", 0); - ProjectSettings::get_singleton()->set_custom_property_info("rendering/quality/shadows/filter_mode", PropertyInfo(Variant::INT, "rendering/quality/shadows/filter_mode", PROPERTY_HINT_ENUM, "Disabled (Fastest),PCF5,PCF13 (Slowest)")); - GLOBAL_DEF("rendering/quality/reflections/roughness_layers", 8); GLOBAL_DEF("rendering/quality/reflections/texture_array_reflections", true); GLOBAL_DEF("rendering/quality/reflections/texture_array_reflections.mobile", false); @@ -2326,7 +2438,7 @@ RenderingServer::RenderingServer() { GLOBAL_DEF("rendering/quality/gi_probes/anisotropic", false); GLOBAL_DEF("rendering/quality/gi_probes/quality", 1); - ProjectSettings::get_singleton()->set_custom_property_info("rendering/quality/gi_probes/quality", PropertyInfo(Variant::INT, "rendering/quality/gi_probes/quality", PROPERTY_HINT_ENUM, "Ultra-Low (1 cone - fastest),Medium (4 cones), High (6 cones - slowest)")); + ProjectSettings::get_singleton()->set_custom_property_info("rendering/quality/gi_probes/quality", PropertyInfo(Variant::INT, "rendering/quality/gi_probes/quality", PROPERTY_HINT_ENUM, "Lowest (1 Cone - Fast),Medium (4 Cones - Average),High (6 Cones - Slow)")); GLOBAL_DEF("rendering/quality/shading/force_vertex_shading", false); GLOBAL_DEF("rendering/quality/shading/force_vertex_shading.mobile", true); @@ -2338,37 +2450,39 @@ RenderingServer::RenderingServer() { GLOBAL_DEF("rendering/quality/depth_prepass/enable", true); GLOBAL_DEF("rendering/quality/depth_prepass/disable_for_vendors", "PowerVR,Mali,Adreno,Apple"); - GLOBAL_DEF("rendering/quality/filters/use_nearest_mipmap_filter", false); - GLOBAL_DEF("rendering/quality/filters/max_anisotropy", 4); + GLOBAL_DEF("rendering/quality/texture_filters/use_nearest_mipmap_filter", false); + GLOBAL_DEF("rendering/quality/texture_filters/max_anisotropy", 4); - GLOBAL_DEF("rendering/quality/filters/depth_of_field_bokeh_shape", 1); - ProjectSettings::get_singleton()->set_custom_property_info("rendering/quality/filters/depth_of_field_bokeh_shape", PropertyInfo(Variant::INT, "rendering/quality/filters/depth_of_field_bokeh_shape", PROPERTY_HINT_ENUM, "Box (Fastest),Hexagon,Circle (Slowest)")); - GLOBAL_DEF("rendering/quality/filters/depth_of_field_bokeh_quality", 2); - ProjectSettings::get_singleton()->set_custom_property_info("rendering/quality/filters/depth_of_field_bokeh_quality", PropertyInfo(Variant::INT, "rendering/quality/filters/depth_of_field_bokeh_quality", PROPERTY_HINT_ENUM, "Very Low (Fast),Low,Medium,High (Slow)")); - GLOBAL_DEF("rendering/quality/filters/depth_of_field_use_jitter", false); + GLOBAL_DEF("rendering/quality/depth_of_field/depth_of_field_bokeh_shape", 1); + ProjectSettings::get_singleton()->set_custom_property_info("rendering/quality/depth_of_field/depth_of_field_bokeh_shape", PropertyInfo(Variant::INT, "rendering/quality/depth_of_field/depth_of_field_bokeh_shape", PROPERTY_HINT_ENUM, "Box (Fast),Hexagon (Average),Circle (Slow)")); + GLOBAL_DEF("rendering/quality/depth_of_field/depth_of_field_bokeh_quality", 2); + ProjectSettings::get_singleton()->set_custom_property_info("rendering/quality/depth_of_field/depth_of_field_bokeh_quality", PropertyInfo(Variant::INT, "rendering/quality/depth_of_field/depth_of_field_bokeh_quality", PROPERTY_HINT_ENUM, "Very Low (Fastest),Low (Fast),Medium (Average),High (Slow)")); + GLOBAL_DEF("rendering/quality/depth_of_field/depth_of_field_use_jitter", false); GLOBAL_DEF("rendering/quality/ssao/quality", 1); - ProjectSettings::get_singleton()->set_custom_property_info("rendering/quality/ssao/quality", PropertyInfo(Variant::INT, "rendering/quality/ssao/quality", PROPERTY_HINT_ENUM, "Low (Fast),Medium,High (Slow),Ultra (Very Slow)")); + ProjectSettings::get_singleton()->set_custom_property_info("rendering/quality/ssao/quality", PropertyInfo(Variant::INT, "rendering/quality/ssao/quality", PROPERTY_HINT_ENUM, "Low (Fast),Medium (Average),High (Slow),Ultra (Slower)")); GLOBAL_DEF("rendering/quality/ssao/half_size", false); - GLOBAL_DEF("rendering/quality/filters/screen_space_roughness_limiter", 0); - ProjectSettings::get_singleton()->set_custom_property_info("rendering/quality/filters/screen_space_roughness_limiter", PropertyInfo(Variant::INT, "rendering/quality/filters/screen_space_roughness_limiter", PROPERTY_HINT_ENUM, "Disabled,Enabled (Small Cost)")); - GLOBAL_DEF("rendering/quality/filters/screen_space_roughness_limiter_curve", 1.0); - ProjectSettings::get_singleton()->set_custom_property_info("rendering/quality/filters/screen_space_roughness_limiter_curve", PropertyInfo(Variant::FLOAT, "rendering/quality/filters/screen_space_roughness_limiter_curve", PROPERTY_HINT_EXP_EASING, "0.01,8,0.01")); + GLOBAL_DEF("rendering/quality/screen_filters/screen_space_roughness_limiter", 0); + ProjectSettings::get_singleton()->set_custom_property_info("rendering/quality/screen_filters/screen_space_roughness_limiter", PropertyInfo(Variant::INT, "rendering/quality/screen_filters/screen_space_roughness_limiter", PROPERTY_HINT_ENUM, "Disabled (Fast),Enabled (Average)")); + GLOBAL_DEF("rendering/quality/screen_filters/screen_space_roughness_limiter_curve", 1.0); + ProjectSettings::get_singleton()->set_custom_property_info("rendering/quality/screen_filters/screen_space_roughness_limiter_curve", PropertyInfo(Variant::FLOAT, "rendering/quality/screen_filters/screen_space_roughness_limiter_curve", PROPERTY_HINT_EXP_EASING, "0.01,8,0.01")); GLOBAL_DEF("rendering/quality/glow/upscale_mode", 1); - ProjectSettings::get_singleton()->set_custom_property_info("rendering/quality/glow/upscale_mode", PropertyInfo(Variant::INT, "rendering/quality/glow/upscale_mode", PROPERTY_HINT_ENUM, "Linear (Fast),Bicubic (Slower)")); + ProjectSettings::get_singleton()->set_custom_property_info("rendering/quality/glow/upscale_mode", PropertyInfo(Variant::INT, "rendering/quality/glow/upscale_mode", PROPERTY_HINT_ENUM, "Linear (Fast),Bicubic (Slow)")); GLOBAL_DEF("rendering/quality/glow/upscale_mode.mobile", 0); GLOBAL_DEF("rendering/quality/screen_space_reflection/roughness_quality", 1); - ProjectSettings::get_singleton()->set_custom_property_info("rendering/quality/screen_space_reflection/roughness_quality", PropertyInfo(Variant::INT, "rendering/quality/screen_space_reflection/roughness_quality", PROPERTY_HINT_ENUM, "Disabled (Fastest),Low, Medium, High (Slowest)")); + ProjectSettings::get_singleton()->set_custom_property_info("rendering/quality/screen_space_reflection/roughness_quality", PropertyInfo(Variant::INT, "rendering/quality/screen_space_reflection/roughness_quality", PROPERTY_HINT_ENUM, "Disabled (Fastest),Low (Fast),Medium (Average),High (Slow)")); GLOBAL_DEF("rendering/quality/subsurface_scattering/subsurface_scattering_quality", 1); - ProjectSettings::get_singleton()->set_custom_property_info("rendering/quality/subsurface_scattering/subsurface_scattering_quality", PropertyInfo(Variant::INT, "rendering/quality/subsurface_scattering/subsurface_scattering_quality", PROPERTY_HINT_ENUM, "Disabled, Low (Fastest),Medium, High (Slowest)")); + ProjectSettings::get_singleton()->set_custom_property_info("rendering/quality/subsurface_scattering/subsurface_scattering_quality", PropertyInfo(Variant::INT, "rendering/quality/subsurface_scattering/subsurface_scattering_quality", PROPERTY_HINT_ENUM, "Disabled (Fastest),Low (Fast),Medium (Average),High (Slow)")); GLOBAL_DEF("rendering/quality/subsurface_scattering/subsurface_scattering_scale", 0.05); ProjectSettings::get_singleton()->set_custom_property_info("rendering/quality/subsurface_scattering/subsurface_scattering_scale", PropertyInfo(Variant::FLOAT, "rendering/quality/subsurface_scattering/subsurface_scattering_scale", PROPERTY_HINT_RANGE, "0.001,1,0.001")); GLOBAL_DEF("rendering/quality/subsurface_scattering/subsurface_scattering_depth_scale", 0.01); ProjectSettings::get_singleton()->set_custom_property_info("rendering/quality/subsurface_scattering/subsurface_scattering_depth_scale", PropertyInfo(Variant::FLOAT, "rendering/quality/subsurface_scattering/subsurface_scattering_depth_scale", PROPERTY_HINT_RANGE, "0.001,1,0.001")); + + GLOBAL_DEF("rendering/high_end/global_shader_variables_buffer_size", 65536); } RenderingServer::~RenderingServer() { diff --git a/servers/rendering_server.h b/servers/rendering_server.h index ac8e92be59..8ca070b4a9 100644 --- a/servers/rendering_server.h +++ b/servers/rendering_server.h @@ -38,6 +38,7 @@ #include "core/rid.h" #include "core/variant.h" #include "servers/display_server.h" +#include "servers/rendering/shader_language.h" class RenderingServer : public Object { @@ -85,7 +86,6 @@ public: }; enum CubeMapLayer { - CUBEMAP_LAYER_LEFT, CUBEMAP_LAYER_RIGHT, CUBEMAP_LAYER_BOTTOM, @@ -157,7 +157,6 @@ public: /* SHADER API */ enum ShaderMode { - SHADER_SPATIAL, SHADER_CANVAS_ITEM, SHADER_PARTICLES, @@ -181,8 +180,8 @@ public: enum { MATERIAL_RENDER_PRIORITY_MIN = -128, MATERIAL_RENDER_PRIORITY_MAX = 127, - }; + virtual RID material_create() = 0; virtual void material_set_shader(RID p_shader_material, RID p_shader) = 0; @@ -197,7 +196,6 @@ public: /* MESH API */ enum ArrayType { - ARRAY_VERTEX = 0, ARRAY_NORMAL = 1, ARRAY_TANGENT = 2, @@ -229,12 +227,10 @@ public: ARRAY_COMPRESS_TEX_UV = 1 << (ARRAY_TEX_UV + ARRAY_COMPRESS_BASE), ARRAY_COMPRESS_TEX_UV2 = 1 << (ARRAY_TEX_UV2 + ARRAY_COMPRESS_BASE), ARRAY_COMPRESS_INDEX = 1 << (ARRAY_INDEX + ARRAY_COMPRESS_BASE), + ARRAY_COMPRESS_DEFAULT = ARRAY_COMPRESS_NORMAL | ARRAY_COMPRESS_TANGENT | ARRAY_COMPRESS_COLOR | ARRAY_COMPRESS_TEX_UV | ARRAY_COMPRESS_TEX_UV2, ARRAY_FLAG_USE_2D_VERTICES = ARRAY_COMPRESS_INDEX << 1, ARRAY_FLAG_USE_DYNAMIC_UPDATE = ARRAY_COMPRESS_INDEX << 3, - - ARRAY_COMPRESS_DEFAULT = ARRAY_COMPRESS_NORMAL | ARRAY_COMPRESS_TANGENT | ARRAY_COMPRESS_COLOR | ARRAY_COMPRESS_TEX_UV | ARRAY_COMPRESS_TEX_UV2 - }; enum PrimitiveType { @@ -377,15 +373,14 @@ public: }; enum LightParam { - LIGHT_PARAM_ENERGY, LIGHT_PARAM_INDIRECT_ENERGY, LIGHT_PARAM_SPECULAR, LIGHT_PARAM_RANGE, + LIGHT_PARAM_SIZE, LIGHT_PARAM_ATTENUATION, LIGHT_PARAM_SPOT_ANGLE, LIGHT_PARAM_SPOT_ATTENUATION, - LIGHT_PARAM_CONTACT_SHADOW_SIZE, LIGHT_PARAM_SHADOW_MAX_DISTANCE, LIGHT_PARAM_SHADOW_SPLIT_1_OFFSET, LIGHT_PARAM_SHADOW_SPLIT_2_OFFSET, @@ -393,7 +388,9 @@ public: LIGHT_PARAM_SHADOW_FADE_START, LIGHT_PARAM_SHADOW_NORMAL_BIAS, LIGHT_PARAM_SHADOW_BIAS, - LIGHT_PARAM_SHADOW_BIAS_SPLIT_SCALE, + LIGHT_PARAM_SHADOW_PANCAKE_SIZE, + LIGHT_PARAM_SHADOW_BLUR, + LIGHT_PARAM_TRANSMITTANCE_BIAS, LIGHT_PARAM_MAX }; @@ -460,6 +457,27 @@ public: virtual void reflection_probe_set_cull_mask(RID p_probe, uint32_t p_layers) = 0; virtual void reflection_probe_set_resolution(RID p_probe, int p_resolution) = 0; + /* DECAL API */ + + enum DecalTexture { + DECAL_TEXTURE_ALBEDO, + DECAL_TEXTURE_NORMAL, + DECAL_TEXTURE_ORM, + DECAL_TEXTURE_EMISSION, + DECAL_TEXTURE_MAX + }; + + virtual RID decal_create() = 0; + virtual void decal_set_extents(RID p_decal, const Vector3 &p_extents) = 0; + virtual void decal_set_texture(RID p_decal, DecalTexture p_type, RID p_texture) = 0; + virtual void decal_set_emission_energy(RID p_decal, float p_energy) = 0; + virtual void decal_set_albedo_mix(RID p_decal, float p_mix) = 0; + virtual void decal_set_modulate(RID p_decal, const Color &p_modulate) = 0; + virtual void decal_set_cull_mask(RID p_decal, uint32_t p_layers) = 0; + virtual void decal_set_distance_fade(RID p_decal, bool p_enabled, float p_begin, float p_length) = 0; + virtual void decal_set_fade(RID p_decal, float p_above, float p_below) = 0; + virtual void decal_set_normal_fade(RID p_decal, float p_fade) = 0; + /* GI PROBE API */ virtual RID gi_probe_create() = 0; @@ -575,12 +593,13 @@ public: }; virtual void particles_set_collision(RID p_particles,ParticlesCollisionMode p_mode,const Transform&, p_xform,const RID p_depth_tex,const RID p_normal_tex)=0; -*/ + */ + /* VIEWPORT TARGET API */ virtual RID viewport_create() = 0; - virtual void viewport_set_use_arvr(RID p_viewport, bool p_use_arvr) = 0; + virtual void viewport_set_use_xr(RID p_viewport, bool p_use_xr) = 0; virtual void viewport_set_size(RID p_viewport, int p_width, int p_height) = 0; virtual void viewport_set_active(RID p_viewport, bool p_active) = 0; virtual void viewport_set_parent_viewport(RID p_viewport, RID p_parent_viewport) = 0; @@ -599,7 +618,6 @@ public: virtual void viewport_set_update_mode(RID p_viewport, ViewportUpdateMode p_mode) = 0; enum ViewportClearMode { - VIEWPORT_CLEAR_ALWAYS, VIEWPORT_CLEAR_NEVER, VIEWPORT_CLEAR_ONLY_NEXT_FRAME @@ -632,21 +650,27 @@ public: VIEWPORT_MSAA_4X, VIEWPORT_MSAA_8X, VIEWPORT_MSAA_16X, - VIEWPORT_MSAA_EXT_2X, - VIEWPORT_MSAA_EXT_4X, + VIEWPORT_MSAA_MAX, }; virtual void viewport_set_msaa(RID p_viewport, ViewportMSAA p_msaa) = 0; - enum ViewportRenderInfo { + enum ViewportScreenSpaceAA { + VIEWPORT_SCREEN_SPACE_AA_DISABLED, + VIEWPORT_SCREEN_SPACE_AA_FXAA, + VIEWPORT_SCREEN_SPACE_AA_MAX, + }; + + virtual void viewport_set_screen_space_aa(RID p_viewport, ViewportScreenSpaceAA p_mode) = 0; + enum ViewportRenderInfo { VIEWPORT_RENDER_INFO_OBJECTS_IN_FRAME, VIEWPORT_RENDER_INFO_VERTICES_IN_FRAME, VIEWPORT_RENDER_INFO_MATERIAL_CHANGES_IN_FRAME, VIEWPORT_RENDER_INFO_SHADER_CHANGES_IN_FRAME, VIEWPORT_RENDER_INFO_SURFACE_CHANGES_IN_FRAME, VIEWPORT_RENDER_INFO_DRAW_CALLS_IN_FRAME, - VIEWPORT_RENDER_INFO_MAX + VIEWPORT_RENDER_INFO_MAX, }; virtual int viewport_get_render_info(RID p_viewport, ViewportRenderInfo p_info) = 0; @@ -666,11 +690,16 @@ public: VIEWPORT_DEBUG_DRAW_SCENE_LUMINANCE, VIEWPORT_DEBUG_DRAW_SSAO, VIEWPORT_DEBUG_DRAW_ROUGHNESS_LIMITER, - + VIEWPORT_DEBUG_DRAW_PSSM_SPLITS, + VIEWPORT_DEBUG_DRAW_DECAL_ATLAS, }; virtual void viewport_set_debug_draw(RID p_viewport, ViewportDebugDraw p_draw) = 0; + virtual void viewport_set_measure_render_time(RID p_viewport, bool p_enable) = 0; + virtual float viewport_get_measured_render_time_cpu(RID p_viewport) const = 0; + virtual float viewport_get_measured_render_time_gpu(RID p_viewport) const = 0; + virtual void directional_shadow_atlas_set_size(int p_size) = 0; /* SKY API */ @@ -690,7 +719,6 @@ public: virtual RID environment_create() = 0; enum EnvironmentBG { - ENV_BG_CLEAR_COLOR, ENV_BG_COLOR, ENV_BG_SKY, @@ -733,6 +761,7 @@ public: ENV_GLOW_BLEND_MODE_REPLACE, ENV_GLOW_BLEND_MODE_MIX, }; + virtual void environment_set_glow(RID p_env, bool p_enable, int p_level_flags, float p_intensity, float p_strength, float p_mix, float p_bloom_threshold, EnvironmentGlowBlendMode p_blend_mode, float p_hdr_bleed_threshold, float p_hdr_bleed_scale, float p_hdr_luminance_cap) = 0; virtual void environment_glow_set_use_bicubic_upscale(bool p_enable) = 0; @@ -816,6 +845,18 @@ public: virtual void camera_effects_set_dof_blur(RID p_camera_effects, bool p_far_enable, float p_far_distance, float p_far_transition, bool p_near_enable, float p_near_distance, float p_near_transition, float p_amount) = 0; virtual void camera_effects_set_custom_exposure(RID p_camera_effects, bool p_enable, float p_exposure) = 0; + enum ShadowQuality { + SHADOW_QUALITY_HARD, + SHADOW_QUALITY_SOFT_LOW, + SHADOW_QUALITY_SOFT_MEDIUM, + SHADOW_QUALITY_SOFT_HIGH, + SHADOW_QUALITY_SOFT_ULTRA, + SHADOW_QUALITY_MAX + }; + + virtual void shadows_quality_set(ShadowQuality p_quality) = 0; + virtual void directional_shadow_quality_set(ShadowQuality p_quality) = 0; + /* SCENARIO API */ virtual RID scenario_create() = 0; @@ -825,7 +866,6 @@ public: SCENARIO_DEBUG_WIREFRAME, SCENARIO_DEBUG_OVERDRAW, SCENARIO_DEBUG_SHADELESS, - }; virtual void scenario_set_debug(RID p_scenario, ScenarioDebugMode p_debug_mode) = 0; @@ -836,7 +876,6 @@ public: /* INSTANCING API */ enum InstanceType { - INSTANCE_NONE, INSTANCE_MESH, INSTANCE_MULTIMESH, @@ -844,6 +883,7 @@ public: INSTANCE_PARTICLES, INSTANCE_LIGHT, INSTANCE_REFLECTION_PROBE, + INSTANCE_DECAL, INSTANCE_GI_PROBE, INSTANCE_LIGHTMAP_CAPTURE, INSTANCE_MAX, @@ -903,6 +943,11 @@ public: virtual void instance_geometry_set_draw_range(RID p_instance, float p_min, float p_max, float p_min_margin, float p_max_margin) = 0; virtual void instance_geometry_set_as_instance_lod(RID p_instance, RID p_as_lod_of_instance) = 0; + virtual void instance_geometry_set_shader_parameter(RID p_instance, const StringName &, const Variant &p_value) = 0; + virtual Variant instance_geometry_get_shader_parameter(RID p_instance, const StringName &) const = 0; + virtual Variant instance_geometry_get_shader_parameter_default_value(RID p_instance, const StringName &) const = 0; + virtual void instance_geometry_get_shader_parameter_list(RID p_instance, List<PropertyInfo> *p_parameters) const = 0; + /* CANVAS (2D) */ virtual RID canvas_create() = 0; @@ -1041,8 +1086,58 @@ public: CANVAS_OCCLUDER_POLYGON_CULL_CLOCKWISE, CANVAS_OCCLUDER_POLYGON_CULL_COUNTER_CLOCKWISE, }; + virtual void canvas_occluder_polygon_set_cull_mode(RID p_occluder_polygon, CanvasOccluderPolygonCullMode p_mode) = 0; + /* GLOBAL VARIABLES */ + + enum GlobalVariableType { + GLOBAL_VAR_TYPE_BOOL, + GLOBAL_VAR_TYPE_BVEC2, + GLOBAL_VAR_TYPE_BVEC3, + GLOBAL_VAR_TYPE_BVEC4, + GLOBAL_VAR_TYPE_INT, + GLOBAL_VAR_TYPE_IVEC2, + GLOBAL_VAR_TYPE_IVEC3, + GLOBAL_VAR_TYPE_IVEC4, + GLOBAL_VAR_TYPE_RECT2I, + GLOBAL_VAR_TYPE_UINT, + GLOBAL_VAR_TYPE_UVEC2, + GLOBAL_VAR_TYPE_UVEC3, + GLOBAL_VAR_TYPE_UVEC4, + GLOBAL_VAR_TYPE_FLOAT, + GLOBAL_VAR_TYPE_VEC2, + GLOBAL_VAR_TYPE_VEC3, + GLOBAL_VAR_TYPE_VEC4, + GLOBAL_VAR_TYPE_COLOR, + GLOBAL_VAR_TYPE_RECT2, + GLOBAL_VAR_TYPE_MAT2, + GLOBAL_VAR_TYPE_MAT3, + GLOBAL_VAR_TYPE_MAT4, + GLOBAL_VAR_TYPE_TRANSFORM_2D, + GLOBAL_VAR_TYPE_TRANSFORM, + GLOBAL_VAR_TYPE_SAMPLER2D, + GLOBAL_VAR_TYPE_SAMPLER2DARRAY, + GLOBAL_VAR_TYPE_SAMPLER3D, + GLOBAL_VAR_TYPE_SAMPLERCUBE, + GLOBAL_VAR_TYPE_MAX + }; + + virtual void global_variable_add(const StringName &p_name, GlobalVariableType p_type, const Variant &p_value) = 0; + virtual void global_variable_remove(const StringName &p_name) = 0; + virtual Vector<StringName> global_variable_get_list() const = 0; + + virtual void global_variable_set(const StringName &p_name, const Variant &p_value) = 0; + virtual void global_variable_set_override(const StringName &p_name, const Variant &p_value) = 0; + + virtual Variant global_variable_get(const StringName &p_name) const = 0; + virtual GlobalVariableType global_variable_get_type(const StringName &p_name) const = 0; + + virtual void global_variables_load_settings(bool p_load_textures) = 0; + virtual void global_variables_clear() = 0; + + static ShaderLanguage::DataType global_variable_type_get_shader_datatype(GlobalVariableType p_type); + /* BLACK BARS */ virtual void black_bars_set_margins(int p_left, int p_top, int p_right, int p_bottom) = 0; @@ -1065,7 +1160,6 @@ public: /* STATUS INFORMATION */ enum RenderInfo { - INFO_OBJECTS_IN_FRAME, INFO_VERTICES_IN_FRAME, INFO_MATERIAL_CHANGES_IN_FRAME, @@ -1143,10 +1237,12 @@ VARIANT_ENUM_CAST(RenderingServer::LightOmniShadowMode); VARIANT_ENUM_CAST(RenderingServer::LightDirectionalShadowMode); VARIANT_ENUM_CAST(RenderingServer::LightDirectionalShadowDepthRangeMode); VARIANT_ENUM_CAST(RenderingServer::ReflectionProbeUpdateMode); +VARIANT_ENUM_CAST(RenderingServer::DecalTexture); VARIANT_ENUM_CAST(RenderingServer::ParticlesDrawOrder); VARIANT_ENUM_CAST(RenderingServer::ViewportUpdateMode); VARIANT_ENUM_CAST(RenderingServer::ViewportClearMode); VARIANT_ENUM_CAST(RenderingServer::ViewportMSAA); +VARIANT_ENUM_CAST(RenderingServer::ViewportScreenSpaceAA); VARIANT_ENUM_CAST(RenderingServer::ViewportRenderInfo); VARIANT_ENUM_CAST(RenderingServer::ViewportDebugDraw); VARIANT_ENUM_CAST(RenderingServer::SkyMode); @@ -1155,10 +1251,13 @@ VARIANT_ENUM_CAST(RenderingServer::EnvironmentAmbientSource); VARIANT_ENUM_CAST(RenderingServer::EnvironmentReflectionSource); VARIANT_ENUM_CAST(RenderingServer::EnvironmentGlowBlendMode); VARIANT_ENUM_CAST(RenderingServer::EnvironmentToneMapper); -VARIANT_ENUM_CAST(RenderingServer::EnvironmentSSAOQuality); +VARIANT_ENUM_CAST(RenderingServer::EnvironmentSSRRoughnessQuality); VARIANT_ENUM_CAST(RenderingServer::EnvironmentSSAOBlur); +VARIANT_ENUM_CAST(RenderingServer::EnvironmentSSAOQuality); +VARIANT_ENUM_CAST(RenderingServer::SubSurfaceScatteringQuality); VARIANT_ENUM_CAST(RenderingServer::DOFBlurQuality); VARIANT_ENUM_CAST(RenderingServer::DOFBokehShape); +VARIANT_ENUM_CAST(RenderingServer::ShadowQuality); VARIANT_ENUM_CAST(RenderingServer::ScenarioDebugMode); VARIANT_ENUM_CAST(RenderingServer::InstanceType); VARIANT_ENUM_CAST(RenderingServer::InstanceFlags); @@ -1169,10 +1268,11 @@ VARIANT_ENUM_CAST(RenderingServer::CanvasItemTextureRepeat); VARIANT_ENUM_CAST(RenderingServer::CanvasLightMode); VARIANT_ENUM_CAST(RenderingServer::CanvasLightShadowFilter); VARIANT_ENUM_CAST(RenderingServer::CanvasOccluderPolygonCullMode); +VARIANT_ENUM_CAST(RenderingServer::GlobalVariableType); VARIANT_ENUM_CAST(RenderingServer::RenderInfo); VARIANT_ENUM_CAST(RenderingServer::Features); -//typedef RenderingServer VS; // makes it easier to use +// Alias to make it easier to use. #define RS RenderingServer -#endif +#endif // RENDERING_SERVER_H diff --git a/servers/arvr/SCsub b/servers/xr/SCsub index 86681f9c74..86681f9c74 100644 --- a/servers/arvr/SCsub +++ b/servers/xr/SCsub diff --git a/servers/arvr/arvr_interface.cpp b/servers/xr/xr_interface.cpp index 577b4cdd8a..c1233ae810 100644 --- a/servers/arvr/arvr_interface.cpp +++ b/servers/xr/xr_interface.cpp @@ -1,5 +1,5 @@ /*************************************************************************/ -/* arvr_interface.cpp */ +/* xr_interface.cpp */ /*************************************************************************/ /* This file is part of: */ /* GODOT ENGINE */ @@ -28,24 +28,24 @@ /* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ /*************************************************************************/ -#include "arvr_interface.h" +#include "xr_interface.h" -void ARVRInterface::_bind_methods() { - ClassDB::bind_method(D_METHOD("get_name"), &ARVRInterface::get_name); - ClassDB::bind_method(D_METHOD("get_capabilities"), &ARVRInterface::get_capabilities); +void XRInterface::_bind_methods() { + ClassDB::bind_method(D_METHOD("get_name"), &XRInterface::get_name); + ClassDB::bind_method(D_METHOD("get_capabilities"), &XRInterface::get_capabilities); - ClassDB::bind_method(D_METHOD("is_primary"), &ARVRInterface::is_primary); - ClassDB::bind_method(D_METHOD("set_is_primary", "enable"), &ARVRInterface::set_is_primary); + ClassDB::bind_method(D_METHOD("is_primary"), &XRInterface::is_primary); + ClassDB::bind_method(D_METHOD("set_is_primary", "enable"), &XRInterface::set_is_primary); - ClassDB::bind_method(D_METHOD("is_initialized"), &ARVRInterface::is_initialized); - ClassDB::bind_method(D_METHOD("set_is_initialized", "initialized"), &ARVRInterface::set_is_initialized); - ClassDB::bind_method(D_METHOD("initialize"), &ARVRInterface::initialize); - ClassDB::bind_method(D_METHOD("uninitialize"), &ARVRInterface::uninitialize); + ClassDB::bind_method(D_METHOD("is_initialized"), &XRInterface::is_initialized); + ClassDB::bind_method(D_METHOD("set_is_initialized", "initialized"), &XRInterface::set_is_initialized); + ClassDB::bind_method(D_METHOD("initialize"), &XRInterface::initialize); + ClassDB::bind_method(D_METHOD("uninitialize"), &XRInterface::uninitialize); - ClassDB::bind_method(D_METHOD("get_tracking_status"), &ARVRInterface::get_tracking_status); + ClassDB::bind_method(D_METHOD("get_tracking_status"), &XRInterface::get_tracking_status); - ClassDB::bind_method(D_METHOD("get_render_targetsize"), &ARVRInterface::get_render_targetsize); - ClassDB::bind_method(D_METHOD("is_stereo"), &ARVRInterface::is_stereo); + ClassDB::bind_method(D_METHOD("get_render_targetsize"), &XRInterface::get_render_targetsize); + ClassDB::bind_method(D_METHOD("is_stereo"), &XRInterface::is_stereo); ADD_GROUP("Interface", "interface_"); ADD_PROPERTY(PropertyInfo(Variant::BOOL, "interface_is_primary"), "set_is_primary", "is_primary"); @@ -54,55 +54,55 @@ void ARVRInterface::_bind_methods() { // we don't have any properties specific to VR yet.... // but we do have properties specific to AR.... - ClassDB::bind_method(D_METHOD("get_anchor_detection_is_enabled"), &ARVRInterface::get_anchor_detection_is_enabled); - ClassDB::bind_method(D_METHOD("set_anchor_detection_is_enabled", "enable"), &ARVRInterface::set_anchor_detection_is_enabled); - ClassDB::bind_method(D_METHOD("get_camera_feed_id"), &ARVRInterface::get_camera_feed_id); + ClassDB::bind_method(D_METHOD("get_anchor_detection_is_enabled"), &XRInterface::get_anchor_detection_is_enabled); + ClassDB::bind_method(D_METHOD("set_anchor_detection_is_enabled", "enable"), &XRInterface::set_anchor_detection_is_enabled); + ClassDB::bind_method(D_METHOD("get_camera_feed_id"), &XRInterface::get_camera_feed_id); ADD_GROUP("AR", "ar_"); ADD_PROPERTY(PropertyInfo(Variant::BOOL, "ar_is_anchor_detection_enabled"), "set_anchor_detection_is_enabled", "get_anchor_detection_is_enabled"); - BIND_ENUM_CONSTANT(ARVR_NONE); - BIND_ENUM_CONSTANT(ARVR_MONO); - BIND_ENUM_CONSTANT(ARVR_STEREO); - BIND_ENUM_CONSTANT(ARVR_AR); - BIND_ENUM_CONSTANT(ARVR_EXTERNAL); + BIND_ENUM_CONSTANT(XR_NONE); + BIND_ENUM_CONSTANT(XR_MONO); + BIND_ENUM_CONSTANT(XR_STEREO); + BIND_ENUM_CONSTANT(XR_AR); + BIND_ENUM_CONSTANT(XR_EXTERNAL); BIND_ENUM_CONSTANT(EYE_MONO); BIND_ENUM_CONSTANT(EYE_LEFT); BIND_ENUM_CONSTANT(EYE_RIGHT); - BIND_ENUM_CONSTANT(ARVR_NORMAL_TRACKING); - BIND_ENUM_CONSTANT(ARVR_EXCESSIVE_MOTION); - BIND_ENUM_CONSTANT(ARVR_INSUFFICIENT_FEATURES); - BIND_ENUM_CONSTANT(ARVR_UNKNOWN_TRACKING); - BIND_ENUM_CONSTANT(ARVR_NOT_TRACKING); + BIND_ENUM_CONSTANT(XR_NORMAL_TRACKING); + BIND_ENUM_CONSTANT(XR_EXCESSIVE_MOTION); + BIND_ENUM_CONSTANT(XR_INSUFFICIENT_FEATURES); + BIND_ENUM_CONSTANT(XR_UNKNOWN_TRACKING); + BIND_ENUM_CONSTANT(XR_NOT_TRACKING); }; -StringName ARVRInterface::get_name() const { +StringName XRInterface::get_name() const { return "Unknown"; }; -bool ARVRInterface::is_primary() { - ARVRServer *arvr_server = ARVRServer::get_singleton(); - ERR_FAIL_NULL_V(arvr_server, false); +bool XRInterface::is_primary() { + XRServer *xr_server = XRServer::get_singleton(); + ERR_FAIL_NULL_V(xr_server, false); - return arvr_server->get_primary_interface() == this; + return xr_server->get_primary_interface() == this; }; -void ARVRInterface::set_is_primary(bool p_is_primary) { - ARVRServer *arvr_server = ARVRServer::get_singleton(); - ERR_FAIL_NULL(arvr_server); +void XRInterface::set_is_primary(bool p_is_primary) { + XRServer *xr_server = XRServer::get_singleton(); + ERR_FAIL_NULL(xr_server); if (p_is_primary) { ERR_FAIL_COND(!is_initialized()); - arvr_server->set_primary_interface(this); + xr_server->set_primary_interface(this); } else { - arvr_server->clear_primary_interface_if(this); + xr_server->clear_primary_interface_if(this); }; }; -void ARVRInterface::set_is_initialized(bool p_initialized) { +void XRInterface::set_is_initialized(bool p_initialized) { if (p_initialized) { if (!is_initialized()) { initialize(); @@ -114,31 +114,31 @@ void ARVRInterface::set_is_initialized(bool p_initialized) { }; }; -ARVRInterface::Tracking_status ARVRInterface::get_tracking_status() const { +XRInterface::Tracking_status XRInterface::get_tracking_status() const { return tracking_state; }; -ARVRInterface::ARVRInterface() { - tracking_state = ARVR_UNKNOWN_TRACKING; +XRInterface::XRInterface() { + tracking_state = XR_UNKNOWN_TRACKING; }; -ARVRInterface::~ARVRInterface(){}; +XRInterface::~XRInterface(){}; // optional render to external texture which enhances performance on those platforms that require us to submit our end result into special textures. -unsigned int ARVRInterface::get_external_texture_for_eye(ARVRInterface::Eyes p_eye) { +unsigned int XRInterface::get_external_texture_for_eye(XRInterface::Eyes p_eye) { return 0; }; /** these will only be implemented on AR interfaces, so we want dummies for VR **/ -bool ARVRInterface::get_anchor_detection_is_enabled() const { +bool XRInterface::get_anchor_detection_is_enabled() const { return false; }; -void ARVRInterface::set_anchor_detection_is_enabled(bool p_enable){ +void XRInterface::set_anchor_detection_is_enabled(bool p_enable){ // don't do anything here, this needs to be implemented on AR interface to enable/disable things like plane detection etc. }; -int ARVRInterface::get_camera_feed_id() { +int XRInterface::get_camera_feed_id() { // don't do anything here, this needs to be implemented on AR interface to enable/disable things like plane detection etc. return 0; diff --git a/servers/arvr/arvr_interface.h b/servers/xr/xr_interface.h index 861061cbf5..99fcef7925 100644 --- a/servers/arvr/arvr_interface.h +++ b/servers/xr/xr_interface.h @@ -1,5 +1,5 @@ /*************************************************************************/ -/* arvr_interface.h */ +/* xr_interface.h */ /*************************************************************************/ /* This file is part of: */ /* GODOT ENGINE */ @@ -28,18 +28,18 @@ /* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ /*************************************************************************/ -#ifndef ARVR_INTERFACE_H -#define ARVR_INTERFACE_H +#ifndef XR_INTERFACE_H +#define XR_INTERFACE_H #include "core/math/camera_matrix.h" #include "core/os/thread_safe.h" #include "scene/main/window.h" -#include "servers/arvr_server.h" +#include "servers/xr_server.h" /** @author Bastiaan Olij <mux213@gmail.com> - The ARVR interface is a template class ontop of which we build interface to different AR, VR and tracking SDKs. + The XR interface is a template class ontop of which we build interface to different AR, VR and tracking SDKs. The idea is that we subclass this class, implement the logic, and then instantiate a singleton of each interface when Godot starts. These instances do not initialize themselves but register themselves with the AR/VR server. @@ -48,16 +48,16 @@ Note that we may make this into a fully instantiable class for GDNative support. */ -class ARVRInterface : public Reference { - GDCLASS(ARVRInterface, Reference); +class XRInterface : public Reference { + GDCLASS(XRInterface, Reference); public: enum Capabilities { /* purely meta data, provides some info about what this interface supports */ - ARVR_NONE = 0, /* no capabilities */ - ARVR_MONO = 1, /* can be used with mono output */ - ARVR_STEREO = 2, /* can be used with stereo output */ - ARVR_AR = 4, /* offers a camera feed for AR */ - ARVR_EXTERNAL = 8 /* renders to external device */ + XR_NONE = 0, /* no capabilities */ + XR_MONO = 1, /* can be used with mono output */ + XR_STEREO = 2, /* can be used with stereo output */ + XR_AR = 4, /* offers a camera feed for AR */ + XR_EXTERNAL = 8 /* renders to external device */ }; enum Eyes { @@ -67,11 +67,11 @@ public: }; enum Tracking_status { /* tracking status currently based on AR but we can start doing more with this for VR as well */ - ARVR_NORMAL_TRACKING, - ARVR_EXCESSIVE_MOTION, - ARVR_INSUFFICIENT_FEATURES, - ARVR_UNKNOWN_TRACKING, - ARVR_NOT_TRACKING + XR_NORMAL_TRACKING, + XR_EXCESSIVE_MOTION, + XR_INSUFFICIENT_FEATURES, + XR_UNKNOWN_TRACKING, + XR_NOT_TRACKING }; protected: @@ -107,20 +107,20 @@ public: virtual Size2 get_render_targetsize() = 0; /* returns the recommended render target size per eye for this device */ virtual bool is_stereo() = 0; /* returns true if this interface requires stereo rendering (for VR HMDs) or mono rendering (for mobile AR) */ - virtual Transform get_transform_for_eye(ARVRInterface::Eyes p_eye, const Transform &p_cam_transform) = 0; /* get each eyes camera transform, also implement EYE_MONO */ - virtual CameraMatrix get_projection_for_eye(ARVRInterface::Eyes p_eye, real_t p_aspect, real_t p_z_near, real_t p_z_far) = 0; /* get each eyes projection matrix */ - virtual unsigned int get_external_texture_for_eye(ARVRInterface::Eyes p_eye); /* if applicable return external texture to render to */ - virtual void commit_for_eye(ARVRInterface::Eyes p_eye, RID p_render_target, const Rect2 &p_screen_rect) = 0; /* output the left or right eye */ + virtual Transform get_transform_for_eye(XRInterface::Eyes p_eye, const Transform &p_cam_transform) = 0; /* get each eyes camera transform, also implement EYE_MONO */ + virtual CameraMatrix get_projection_for_eye(XRInterface::Eyes p_eye, real_t p_aspect, real_t p_z_near, real_t p_z_far) = 0; /* get each eyes projection matrix */ + virtual unsigned int get_external_texture_for_eye(XRInterface::Eyes p_eye); /* if applicable return external texture to render to */ + virtual void commit_for_eye(XRInterface::Eyes p_eye, RID p_render_target, const Rect2 &p_screen_rect) = 0; /* output the left or right eye */ virtual void process() = 0; virtual void notification(int p_what) = 0; - ARVRInterface(); - ~ARVRInterface(); + XRInterface(); + ~XRInterface(); }; -VARIANT_ENUM_CAST(ARVRInterface::Capabilities); -VARIANT_ENUM_CAST(ARVRInterface::Eyes); -VARIANT_ENUM_CAST(ARVRInterface::Tracking_status); +VARIANT_ENUM_CAST(XRInterface::Capabilities); +VARIANT_ENUM_CAST(XRInterface::Eyes); +VARIANT_ENUM_CAST(XRInterface::Tracking_status); #endif diff --git a/servers/xr/xr_positional_tracker.cpp b/servers/xr/xr_positional_tracker.cpp new file mode 100644 index 0000000000..20853c9027 --- /dev/null +++ b/servers/xr/xr_positional_tracker.cpp @@ -0,0 +1,238 @@ +/*************************************************************************/ +/* xr_positional_tracker.cpp */ +/*************************************************************************/ +/* This file is part of: */ +/* GODOT ENGINE */ +/* https://godotengine.org */ +/*************************************************************************/ +/* Copyright (c) 2007-2020 Juan Linietsky, Ariel Manzur. */ +/* Copyright (c) 2014-2020 Godot Engine contributors (cf. AUTHORS.md). */ +/* */ +/* Permission is hereby granted, free of charge, to any person obtaining */ +/* a copy of this software and associated documentation files (the */ +/* "Software"), to deal in the Software without restriction, including */ +/* without limitation the rights to use, copy, modify, merge, publish, */ +/* distribute, sublicense, and/or sell copies of the Software, and to */ +/* permit persons to whom the Software is furnished to do so, subject to */ +/* the following conditions: */ +/* */ +/* The above copyright notice and this permission notice shall be */ +/* included in all copies or substantial portions of the Software. */ +/* */ +/* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, */ +/* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF */ +/* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.*/ +/* IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY */ +/* CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, */ +/* TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE */ +/* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ +/*************************************************************************/ + +#include "xr_positional_tracker.h" + +#include "core/input/input.h" + +void XRPositionalTracker::_bind_methods() { + BIND_ENUM_CONSTANT(TRACKER_HAND_UNKNOWN); + BIND_ENUM_CONSTANT(TRACKER_LEFT_HAND); + BIND_ENUM_CONSTANT(TRACKER_RIGHT_HAND); + + // this class is read only from GDScript, so we only have access to getters.. + ClassDB::bind_method(D_METHOD("get_type"), &XRPositionalTracker::get_type); + ClassDB::bind_method(D_METHOD("get_tracker_id"), &XRPositionalTracker::get_tracker_id); + ClassDB::bind_method(D_METHOD("get_name"), &XRPositionalTracker::get_name); + ClassDB::bind_method(D_METHOD("get_joy_id"), &XRPositionalTracker::get_joy_id); + ClassDB::bind_method(D_METHOD("get_tracks_orientation"), &XRPositionalTracker::get_tracks_orientation); + ClassDB::bind_method(D_METHOD("get_orientation"), &XRPositionalTracker::get_orientation); + ClassDB::bind_method(D_METHOD("get_tracks_position"), &XRPositionalTracker::get_tracks_position); + ClassDB::bind_method(D_METHOD("get_position"), &XRPositionalTracker::get_position); + ClassDB::bind_method(D_METHOD("get_hand"), &XRPositionalTracker::get_hand); + ClassDB::bind_method(D_METHOD("get_transform", "adjust_by_reference_frame"), &XRPositionalTracker::get_transform); + ClassDB::bind_method(D_METHOD("get_mesh"), &XRPositionalTracker::get_mesh); + + // these functions we don't want to expose to normal users but do need to be callable from GDNative + ClassDB::bind_method(D_METHOD("_set_type", "type"), &XRPositionalTracker::set_type); + ClassDB::bind_method(D_METHOD("_set_name", "name"), &XRPositionalTracker::set_name); + ClassDB::bind_method(D_METHOD("_set_joy_id", "joy_id"), &XRPositionalTracker::set_joy_id); + ClassDB::bind_method(D_METHOD("_set_orientation", "orientation"), &XRPositionalTracker::set_orientation); + ClassDB::bind_method(D_METHOD("_set_rw_position", "rw_position"), &XRPositionalTracker::set_rw_position); + ClassDB::bind_method(D_METHOD("_set_mesh", "mesh"), &XRPositionalTracker::set_mesh); + ClassDB::bind_method(D_METHOD("get_rumble"), &XRPositionalTracker::get_rumble); + ClassDB::bind_method(D_METHOD("set_rumble", "rumble"), &XRPositionalTracker::set_rumble); + + ADD_PROPERTY(PropertyInfo(Variant::FLOAT, "rumble"), "set_rumble", "get_rumble"); +}; + +void XRPositionalTracker::set_type(XRServer::TrackerType p_type) { + if (type != p_type) { + type = p_type; + hand = XRPositionalTracker::TRACKER_HAND_UNKNOWN; + + XRServer *xr_server = XRServer::get_singleton(); + ERR_FAIL_NULL(xr_server); + + // get a tracker id for our type + // note if this is a controller this will be 3 or higher but we may change it later. + tracker_id = xr_server->get_free_tracker_id_for_type(p_type); + }; +}; + +XRServer::TrackerType XRPositionalTracker::get_type() const { + return type; +}; + +void XRPositionalTracker::set_name(const String &p_name) { + name = p_name; +}; + +StringName XRPositionalTracker::get_name() const { + return name; +}; + +int XRPositionalTracker::get_tracker_id() const { + return tracker_id; +}; + +void XRPositionalTracker::set_joy_id(int p_joy_id) { + joy_id = p_joy_id; +}; + +int XRPositionalTracker::get_joy_id() const { + return joy_id; +}; + +bool XRPositionalTracker::get_tracks_orientation() const { + return tracks_orientation; +}; + +void XRPositionalTracker::set_orientation(const Basis &p_orientation) { + _THREAD_SAFE_METHOD_ + + tracks_orientation = true; // obviously we have this + orientation = p_orientation; +}; + +Basis XRPositionalTracker::get_orientation() const { + _THREAD_SAFE_METHOD_ + + return orientation; +}; + +bool XRPositionalTracker::get_tracks_position() const { + return tracks_position; +}; + +void XRPositionalTracker::set_position(const Vector3 &p_position) { + _THREAD_SAFE_METHOD_ + + XRServer *xr_server = XRServer::get_singleton(); + ERR_FAIL_NULL(xr_server); + real_t world_scale = xr_server->get_world_scale(); + ERR_FAIL_COND(world_scale == 0); + + tracks_position = true; // obviously we have this + rw_position = p_position / world_scale; +}; + +Vector3 XRPositionalTracker::get_position() const { + _THREAD_SAFE_METHOD_ + + XRServer *xr_server = XRServer::get_singleton(); + ERR_FAIL_NULL_V(xr_server, rw_position); + real_t world_scale = xr_server->get_world_scale(); + + return rw_position * world_scale; +}; + +void XRPositionalTracker::set_rw_position(const Vector3 &p_rw_position) { + _THREAD_SAFE_METHOD_ + + tracks_position = true; // obviously we have this + rw_position = p_rw_position; +}; + +Vector3 XRPositionalTracker::get_rw_position() const { + _THREAD_SAFE_METHOD_ + + return rw_position; +}; + +void XRPositionalTracker::set_mesh(const Ref<Mesh> &p_mesh) { + _THREAD_SAFE_METHOD_ + + mesh = p_mesh; +}; + +Ref<Mesh> XRPositionalTracker::get_mesh() const { + _THREAD_SAFE_METHOD_ + + return mesh; +}; + +XRPositionalTracker::TrackerHand XRPositionalTracker::get_hand() const { + return hand; +}; + +void XRPositionalTracker::set_hand(const XRPositionalTracker::TrackerHand p_hand) { + XRServer *xr_server = XRServer::get_singleton(); + ERR_FAIL_NULL(xr_server); + + if (hand != p_hand) { + // we can only set this if we've previously set this to be a controller!! + ERR_FAIL_COND((type != XRServer::TRACKER_CONTROLLER) && (p_hand != XRPositionalTracker::TRACKER_HAND_UNKNOWN)); + + hand = p_hand; + if (hand == XRPositionalTracker::TRACKER_LEFT_HAND) { + if (!xr_server->is_tracker_id_in_use_for_type(type, 1)) { + tracker_id = 1; + }; + } else if (hand == XRPositionalTracker::TRACKER_RIGHT_HAND) { + if (!xr_server->is_tracker_id_in_use_for_type(type, 2)) { + tracker_id = 2; + }; + }; + }; +}; + +Transform XRPositionalTracker::get_transform(bool p_adjust_by_reference_frame) const { + Transform new_transform; + + new_transform.basis = get_orientation(); + new_transform.origin = get_position(); + + if (p_adjust_by_reference_frame) { + XRServer *xr_server = XRServer::get_singleton(); + ERR_FAIL_NULL_V(xr_server, new_transform); + + new_transform = xr_server->get_reference_frame() * new_transform; + }; + + return new_transform; +}; + +real_t XRPositionalTracker::get_rumble() const { + return rumble; +}; + +void XRPositionalTracker::set_rumble(real_t p_rumble) { + if (p_rumble > 0.0) { + rumble = p_rumble; + } else { + rumble = 0.0; + }; +}; + +XRPositionalTracker::XRPositionalTracker() { + type = XRServer::TRACKER_UNKNOWN; + name = "Unknown"; + joy_id = -1; + tracker_id = 0; + tracks_orientation = false; + tracks_position = false; + hand = TRACKER_HAND_UNKNOWN; + rumble = 0.0; +}; + +XRPositionalTracker::~XRPositionalTracker(){ + +}; diff --git a/servers/arvr/arvr_positional_tracker.h b/servers/xr/xr_positional_tracker.h index 03c6b33ffe..d9d1f909e9 100644 --- a/servers/arvr/arvr_positional_tracker.h +++ b/servers/xr/xr_positional_tracker.h @@ -1,5 +1,5 @@ /*************************************************************************/ -/* arvr_positional_tracker.h */ +/* xr_positional_tracker.h */ /*************************************************************************/ /* This file is part of: */ /* GODOT ENGINE */ @@ -28,12 +28,12 @@ /* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ /*************************************************************************/ -#ifndef ARVR_POSITIONAL_TRACKER_H -#define ARVR_POSITIONAL_TRACKER_H +#ifndef XR_POSITIONAL_TRACKER_H +#define XR_POSITIONAL_TRACKER_H #include "core/os/thread_safe.h" #include "scene/resources/mesh.h" -#include "servers/arvr_server.h" +#include "servers/xr_server.h" /** @author Bastiaan Olij <mux213@gmail.com> @@ -43,8 +43,8 @@ This is where potentially additional AR/VR interfaces may be active as there are AR/VR SDKs that solely deal with positional tracking. */ -class ARVRPositionalTracker : public Object { - GDCLASS(ARVRPositionalTracker, Object); +class XRPositionalTracker : public Object { + GDCLASS(XRPositionalTracker, Object); _THREAD_SAFE_CLASS_ public: @@ -55,7 +55,7 @@ public: }; private: - ARVRServer::TrackerType type; // type of tracker + XRServer::TrackerType type; // type of tracker StringName name; // (unique) name of the tracker int tracker_id; // tracker index id that is unique per type int joy_id; // if we also have a related joystick entity, the id of the joystick @@ -65,14 +65,14 @@ private: Vector3 rw_position; // our position "in the real world, so without world_scale applied" Ref<Mesh> mesh; // when available, a mesh that can be used to render this tracker TrackerHand hand; // if known, the hand this tracker is held in - real_t rumble; // rumble strength, 0.0 is off, 1.0 is maximum, note that we only record here, arvr_interface is responsible for execution + real_t rumble; // rumble strength, 0.0 is off, 1.0 is maximum, note that we only record here, xr_interface is responsible for execution protected: static void _bind_methods(); public: - void set_type(ARVRServer::TrackerType p_type); - ARVRServer::TrackerType get_type() const; + void set_type(XRServer::TrackerType p_type); + XRServer::TrackerType get_type() const; void set_name(const String &p_name); StringName get_name() const; int get_tracker_id() const; @@ -86,8 +86,8 @@ public: Vector3 get_position() const; // get position with world_scale applied void set_rw_position(const Vector3 &p_rw_position); Vector3 get_rw_position() const; - ARVRPositionalTracker::TrackerHand get_hand() const; - void set_hand(const ARVRPositionalTracker::TrackerHand p_hand); + XRPositionalTracker::TrackerHand get_hand() const; + void set_hand(const XRPositionalTracker::TrackerHand p_hand); real_t get_rumble() const; void set_rumble(real_t p_rumble); void set_mesh(const Ref<Mesh> &p_mesh); @@ -95,10 +95,10 @@ public: Transform get_transform(bool p_adjust_by_reference_frame) const; - ARVRPositionalTracker(); - ~ARVRPositionalTracker(); + XRPositionalTracker(); + ~XRPositionalTracker(); }; -VARIANT_ENUM_CAST(ARVRPositionalTracker::TrackerHand); +VARIANT_ENUM_CAST(XRPositionalTracker::TrackerHand); #endif diff --git a/servers/arvr_server.cpp b/servers/xr_server.cpp index f5597d8974..a93b99025f 100644 --- a/servers/arvr_server.cpp +++ b/servers/xr_server.cpp @@ -1,5 +1,5 @@ /*************************************************************************/ -/* arvr_server.cpp */ +/* xr_server.cpp */ /*************************************************************************/ /* This file is part of: */ /* GODOT ENGINE */ @@ -28,41 +28,41 @@ /* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ /*************************************************************************/ -#include "arvr_server.h" -#include "arvr/arvr_interface.h" -#include "arvr/arvr_positional_tracker.h" +#include "xr_server.h" #include "core/project_settings.h" +#include "xr/xr_interface.h" +#include "xr/xr_positional_tracker.h" -ARVRServer *ARVRServer::singleton = nullptr; +XRServer *XRServer::singleton = nullptr; -ARVRServer *ARVRServer::get_singleton() { +XRServer *XRServer::get_singleton() { return singleton; }; -void ARVRServer::_bind_methods() { - ClassDB::bind_method(D_METHOD("get_world_scale"), &ARVRServer::get_world_scale); - ClassDB::bind_method(D_METHOD("set_world_scale"), &ARVRServer::set_world_scale); - ClassDB::bind_method(D_METHOD("get_reference_frame"), &ARVRServer::get_reference_frame); - ClassDB::bind_method(D_METHOD("center_on_hmd", "rotation_mode", "keep_height"), &ARVRServer::center_on_hmd); - ClassDB::bind_method(D_METHOD("get_hmd_transform"), &ARVRServer::get_hmd_transform); +void XRServer::_bind_methods() { + ClassDB::bind_method(D_METHOD("get_world_scale"), &XRServer::get_world_scale); + ClassDB::bind_method(D_METHOD("set_world_scale"), &XRServer::set_world_scale); + ClassDB::bind_method(D_METHOD("get_reference_frame"), &XRServer::get_reference_frame); + ClassDB::bind_method(D_METHOD("center_on_hmd", "rotation_mode", "keep_height"), &XRServer::center_on_hmd); + ClassDB::bind_method(D_METHOD("get_hmd_transform"), &XRServer::get_hmd_transform); ADD_PROPERTY(PropertyInfo(Variant::FLOAT, "world_scale"), "set_world_scale", "get_world_scale"); - ClassDB::bind_method(D_METHOD("get_interface_count"), &ARVRServer::get_interface_count); - ClassDB::bind_method(D_METHOD("get_interface", "idx"), &ARVRServer::get_interface); - ClassDB::bind_method(D_METHOD("get_interfaces"), &ARVRServer::get_interfaces); - ClassDB::bind_method(D_METHOD("find_interface", "name"), &ARVRServer::find_interface); - ClassDB::bind_method(D_METHOD("get_tracker_count"), &ARVRServer::get_tracker_count); - ClassDB::bind_method(D_METHOD("get_tracker", "idx"), &ARVRServer::get_tracker); + ClassDB::bind_method(D_METHOD("get_interface_count"), &XRServer::get_interface_count); + ClassDB::bind_method(D_METHOD("get_interface", "idx"), &XRServer::get_interface); + ClassDB::bind_method(D_METHOD("get_interfaces"), &XRServer::get_interfaces); + ClassDB::bind_method(D_METHOD("find_interface", "name"), &XRServer::find_interface); + ClassDB::bind_method(D_METHOD("get_tracker_count"), &XRServer::get_tracker_count); + ClassDB::bind_method(D_METHOD("get_tracker", "idx"), &XRServer::get_tracker); - ClassDB::bind_method(D_METHOD("get_primary_interface"), &ARVRServer::get_primary_interface); - ClassDB::bind_method(D_METHOD("set_primary_interface", "interface"), &ARVRServer::set_primary_interface); + ClassDB::bind_method(D_METHOD("get_primary_interface"), &XRServer::get_primary_interface); + ClassDB::bind_method(D_METHOD("set_primary_interface", "interface"), &XRServer::set_primary_interface); ADD_PROPERTY(PropertyInfo(Variant::OBJECT, "primary_interface"), "set_primary_interface", "get_primary_interface"); - ClassDB::bind_method(D_METHOD("get_last_process_usec"), &ARVRServer::get_last_process_usec); - ClassDB::bind_method(D_METHOD("get_last_commit_usec"), &ARVRServer::get_last_commit_usec); - ClassDB::bind_method(D_METHOD("get_last_frame_usec"), &ARVRServer::get_last_frame_usec); + ClassDB::bind_method(D_METHOD("get_last_process_usec"), &XRServer::get_last_process_usec); + ClassDB::bind_method(D_METHOD("get_last_commit_usec"), &XRServer::get_last_commit_usec); + ClassDB::bind_method(D_METHOD("get_last_frame_usec"), &XRServer::get_last_frame_usec); BIND_ENUM_CONSTANT(TRACKER_CONTROLLER); BIND_ENUM_CONSTANT(TRACKER_BASESTATION); @@ -82,11 +82,11 @@ void ARVRServer::_bind_methods() { ADD_SIGNAL(MethodInfo("tracker_removed", PropertyInfo(Variant::STRING_NAME, "tracker_name"), PropertyInfo(Variant::INT, "type"), PropertyInfo(Variant::INT, "id"))); }; -real_t ARVRServer::get_world_scale() const { +real_t XRServer::get_world_scale() const { return world_scale; }; -void ARVRServer::set_world_scale(real_t p_world_scale) { +void XRServer::set_world_scale(real_t p_world_scale) { if (p_world_scale < 0.01) { p_world_scale = 0.01; } else if (p_world_scale > 1000.0) { @@ -96,25 +96,25 @@ void ARVRServer::set_world_scale(real_t p_world_scale) { world_scale = p_world_scale; }; -Transform ARVRServer::get_world_origin() const { +Transform XRServer::get_world_origin() const { return world_origin; }; -void ARVRServer::set_world_origin(const Transform &p_world_origin) { +void XRServer::set_world_origin(const Transform &p_world_origin) { world_origin = p_world_origin; }; -Transform ARVRServer::get_reference_frame() const { +Transform XRServer::get_reference_frame() const { return reference_frame; }; -void ARVRServer::center_on_hmd(RotationMode p_rotation_mode, bool p_keep_height) { +void XRServer::center_on_hmd(RotationMode p_rotation_mode, bool p_keep_height) { if (primary_interface != nullptr) { // clear our current reference frame or we'll end up double adjusting it reference_frame = Transform(); // requesting our EYE_MONO transform should return our current HMD position - Transform new_reference_frame = primary_interface->get_transform_for_eye(ARVRInterface::EYE_MONO, Transform()); + Transform new_reference_frame = primary_interface->get_transform_for_eye(XRInterface::EYE_MONO, Transform()); // remove our tilt if (p_rotation_mode == 1) { @@ -140,15 +140,15 @@ void ARVRServer::center_on_hmd(RotationMode p_rotation_mode, bool p_keep_height) }; }; -Transform ARVRServer::get_hmd_transform() { +Transform XRServer::get_hmd_transform() { Transform hmd_transform; if (primary_interface != nullptr) { - hmd_transform = primary_interface->get_transform_for_eye(ARVRInterface::EYE_MONO, hmd_transform); + hmd_transform = primary_interface->get_transform_for_eye(XRInterface::EYE_MONO, hmd_transform); }; return hmd_transform; }; -void ARVRServer::add_interface(const Ref<ARVRInterface> &p_interface) { +void XRServer::add_interface(const Ref<XRInterface> &p_interface) { ERR_FAIL_COND(p_interface.is_null()); for (int i = 0; i < interfaces.size(); i++) { @@ -163,7 +163,7 @@ void ARVRServer::add_interface(const Ref<ARVRInterface> &p_interface) { emit_signal("interface_added", p_interface->get_name()); }; -void ARVRServer::remove_interface(const Ref<ARVRInterface> &p_interface) { +void XRServer::remove_interface(const Ref<XRInterface> &p_interface) { ERR_FAIL_COND(p_interface.is_null()); int idx = -1; @@ -178,23 +178,23 @@ void ARVRServer::remove_interface(const Ref<ARVRInterface> &p_interface) { ERR_FAIL_COND(idx == -1); - print_verbose("ARVR: Removed interface" + p_interface->get_name()); + print_verbose("XR: Removed interface" + p_interface->get_name()); emit_signal("interface_removed", p_interface->get_name()); interfaces.remove(idx); }; -int ARVRServer::get_interface_count() const { +int XRServer::get_interface_count() const { return interfaces.size(); }; -Ref<ARVRInterface> ARVRServer::get_interface(int p_index) const { +Ref<XRInterface> XRServer::get_interface(int p_index) const { ERR_FAIL_INDEX_V(p_index, interfaces.size(), nullptr); return interfaces[p_index]; }; -Ref<ARVRInterface> ARVRServer::find_interface(const String &p_name) const { +Ref<XRInterface> XRServer::find_interface(const String &p_name) const { int idx = -1; for (int i = 0; i < interfaces.size(); i++) { @@ -210,7 +210,7 @@ Ref<ARVRInterface> ARVRServer::find_interface(const String &p_name) const { return interfaces[idx]; }; -Array ARVRServer::get_interfaces() const { +Array XRServer::get_interfaces() const { Array ret; for (int i = 0; i < interfaces.size(); i++) { @@ -238,7 +238,7 @@ Array ARVRServer::get_interfaces() const { - using this approach the shield disappears or is no longer tracked, but the gun stays firmly in your right hand because that is still controller 2, further more, if controller 1 is replaced the shield will return. */ -bool ARVRServer::is_tracker_id_in_use_for_type(TrackerType p_tracker_type, int p_tracker_id) const { +bool XRServer::is_tracker_id_in_use_for_type(TrackerType p_tracker_type, int p_tracker_id) const { for (int i = 0; i < trackers.size(); i++) { if (trackers[i]->get_type() == p_tracker_type && trackers[i]->get_tracker_id() == p_tracker_id) { return true; @@ -249,13 +249,13 @@ bool ARVRServer::is_tracker_id_in_use_for_type(TrackerType p_tracker_type, int p return false; }; -int ARVRServer::get_free_tracker_id_for_type(TrackerType p_tracker_type) { +int XRServer::get_free_tracker_id_for_type(TrackerType p_tracker_type) { // We start checking at 1, 0 means that it's not a controller.. // Note that for controller we reserve: // - 1 for the left hand controller and // - 2 for the right hand controller // so we start at 3 :) - int tracker_id = p_tracker_type == ARVRServer::TRACKER_CONTROLLER ? 3 : 1; + int tracker_id = p_tracker_type == XRServer::TRACKER_CONTROLLER ? 3 : 1; while (is_tracker_id_in_use_for_type(p_tracker_type, tracker_id)) { // try the next one @@ -265,14 +265,14 @@ int ARVRServer::get_free_tracker_id_for_type(TrackerType p_tracker_type) { return tracker_id; }; -void ARVRServer::add_tracker(ARVRPositionalTracker *p_tracker) { +void XRServer::add_tracker(XRPositionalTracker *p_tracker) { ERR_FAIL_NULL(p_tracker); trackers.push_back(p_tracker); emit_signal("tracker_added", p_tracker->get_name(), p_tracker->get_type(), p_tracker->get_tracker_id()); }; -void ARVRServer::remove_tracker(ARVRPositionalTracker *p_tracker) { +void XRServer::remove_tracker(XRPositionalTracker *p_tracker) { ERR_FAIL_NULL(p_tracker); int idx = -1; @@ -291,17 +291,17 @@ void ARVRServer::remove_tracker(ARVRPositionalTracker *p_tracker) { trackers.remove(idx); }; -int ARVRServer::get_tracker_count() const { +int XRServer::get_tracker_count() const { return trackers.size(); }; -ARVRPositionalTracker *ARVRServer::get_tracker(int p_index) const { +XRPositionalTracker *XRServer::get_tracker(int p_index) const { ERR_FAIL_INDEX_V(p_index, trackers.size(), nullptr); return trackers[p_index]; }; -ARVRPositionalTracker *ARVRServer::find_by_type_and_id(TrackerType p_tracker_type, int p_tracker_id) const { +XRPositionalTracker *XRServer::find_by_type_and_id(TrackerType p_tracker_type, int p_tracker_id) const { ERR_FAIL_COND_V(p_tracker_id == 0, nullptr); for (int i = 0; i < trackers.size(); i++) { @@ -313,36 +313,36 @@ ARVRPositionalTracker *ARVRServer::find_by_type_and_id(TrackerType p_tracker_typ return nullptr; }; -Ref<ARVRInterface> ARVRServer::get_primary_interface() const { +Ref<XRInterface> XRServer::get_primary_interface() const { return primary_interface; }; -void ARVRServer::set_primary_interface(const Ref<ARVRInterface> &p_primary_interface) { +void XRServer::set_primary_interface(const Ref<XRInterface> &p_primary_interface) { primary_interface = p_primary_interface; - print_verbose("ARVR: Primary interface set to: " + primary_interface->get_name()); + print_verbose("XR: Primary interface set to: " + primary_interface->get_name()); }; -void ARVRServer::clear_primary_interface_if(const Ref<ARVRInterface> &p_primary_interface) { +void XRServer::clear_primary_interface_if(const Ref<XRInterface> &p_primary_interface) { if (primary_interface == p_primary_interface) { - print_verbose("ARVR: Clearing primary interface"); + print_verbose("XR: Clearing primary interface"); primary_interface.unref(); }; }; -uint64_t ARVRServer::get_last_process_usec() { +uint64_t XRServer::get_last_process_usec() { return last_process_usec; }; -uint64_t ARVRServer::get_last_commit_usec() { +uint64_t XRServer::get_last_commit_usec() { return last_commit_usec; }; -uint64_t ARVRServer::get_last_frame_usec() { +uint64_t XRServer::get_last_frame_usec() { return last_frame_usec; }; -void ARVRServer::_process() { +void XRServer::_process() { /* called from rendering_server_viewport.draw_viewports right before we start drawing our viewports */ /* mark for our frame timing */ @@ -358,7 +358,7 @@ void ARVRServer::_process() { }; }; -void ARVRServer::_mark_commit() { +void XRServer::_mark_commit() { /* time this */ last_commit_usec = OS::get_singleton()->get_ticks_usec(); @@ -366,12 +366,12 @@ void ARVRServer::_mark_commit() { last_frame_usec = last_commit_usec - last_process_usec; }; -ARVRServer::ARVRServer() { +XRServer::XRServer() { singleton = this; world_scale = 1.0; }; -ARVRServer::~ARVRServer() { +XRServer::~XRServer() { primary_interface.unref(); while (interfaces.size() > 0) { diff --git a/servers/arvr_server.h b/servers/xr_server.h index ab2f0d721b..e04c7b3592 100644 --- a/servers/arvr_server.h +++ b/servers/xr_server.h @@ -1,5 +1,5 @@ /*************************************************************************/ -/* arvr_server.h */ +/* xr_server.h */ /*************************************************************************/ /* This file is part of: */ /* GODOT ENGINE */ @@ -28,8 +28,8 @@ /* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ /*************************************************************************/ -#ifndef ARVR_SERVER_H -#define ARVR_SERVER_H +#ifndef XR_SERVER_H +#define XR_SERVER_H #include "core/os/os.h" #include "core/os/thread_safe.h" @@ -37,16 +37,16 @@ #include "core/rid.h" #include "core/variant.h" -class ARVRInterface; -class ARVRPositionalTracker; +class XRInterface; +class XRPositionalTracker; /** @author Bastiaan Olij <mux213@gmail.com> - The ARVR server is a singleton object that gives access to the various + The XR server is a singleton object that gives access to the various objects and SDKs that are available on the system. Because there can be multiple SDKs active this is exposed as an array - and our ARVR server object acts as a pass through + and our XR server object acts as a pass through Also each positioning tracker is accessible from here. I've added some additional info into this header file that should move @@ -54,8 +54,8 @@ class ARVRPositionalTracker; or as a separate PR once this has been merged into the master branch. **/ -class ARVRServer : public Object { - GDCLASS(ARVRServer, Object); +class XRServer : public Object { + GDCLASS(XRServer, Object); _THREAD_SAFE_CLASS_ public: @@ -76,10 +76,10 @@ public: }; private: - Vector<Ref<ARVRInterface>> interfaces; - Vector<ARVRPositionalTracker *> trackers; + Vector<Ref<XRInterface>> interfaces; + Vector<XRPositionalTracker *> trackers; - Ref<ARVRInterface> primary_interface; /* we'll identify one interface as primary, this will be used by our viewports */ + Ref<XRInterface> primary_interface; /* we'll identify one interface as primary, this will be used by our viewports */ real_t world_scale; /* scale by which we multiply our tracker positions */ Transform world_origin; /* our world origin point, maps a location in our virtual world to the origin point in our real world tracking volume */ @@ -90,12 +90,12 @@ private: uint64_t last_frame_usec; /* time it took between process and committing, we should probably average this over the last x frames */ protected: - static ARVRServer *singleton; + static XRServer *singleton; static void _bind_methods(); public: - static ARVRServer *get_singleton(); + static XRServer *get_singleton(); /* World scale allows you to specify a scale factor that is applied to all positioning vectors in our VR world in essence scaling up, or scaling down the world. @@ -105,7 +105,7 @@ public: Most VR platforms, and our assumption, is that 1 unit in our virtual world equates to 1 meter in the real mode. This scale basically effects the unit size relationship to real world size. - I may remove access to this property in GDScript in favour of exposing it on the ARVROrigin node + I may remove access to this property in GDScript in favour of exposing it on the XROrigin3D node */ real_t get_world_scale() const; void set_world_scale(real_t p_world_scale); @@ -116,7 +116,7 @@ public: actions be it straffing, teleporting, etc. Movement of the player by moving through the physical space is always tracked in relation to this point. - Note that the ARVROrigin spatial node in your scene automatically updates this property and it should be used instead of + Note that the XROrigin3D spatial node in your scene automatically updates this property and it should be used instead of direct access to this property and it therefore is not available in GDScript Note: this should not be used in AR and should be ignored by an AR based interface as it would throw what you're looking at in the real world @@ -146,20 +146,20 @@ public: /* Interfaces are objects that 'glue' Godot to an AR or VR SDK such as the Oculus SDK, OpenVR, OpenHMD, etc. */ - void add_interface(const Ref<ARVRInterface> &p_interface); - void remove_interface(const Ref<ARVRInterface> &p_interface); + void add_interface(const Ref<XRInterface> &p_interface); + void remove_interface(const Ref<XRInterface> &p_interface); int get_interface_count() const; - Ref<ARVRInterface> get_interface(int p_index) const; - Ref<ARVRInterface> find_interface(const String &p_name) const; + Ref<XRInterface> get_interface(int p_index) const; + Ref<XRInterface> find_interface(const String &p_name) const; Array get_interfaces() const; /* note, more then one interface can technically be active, especially on mobile, but only one interface is used for rendering. This interface identifies itself by calling set_primary_interface when it is initialized */ - Ref<ARVRInterface> get_primary_interface() const; - void set_primary_interface(const Ref<ARVRInterface> &p_primary_interface); - void clear_primary_interface_if(const Ref<ARVRInterface> &p_primary_interface); /* this is automatically called if an interface destructs */ + Ref<XRInterface> get_primary_interface() const; + void set_primary_interface(const Ref<XRInterface> &p_primary_interface); + void clear_primary_interface_if(const Ref<XRInterface> &p_primary_interface); /* this is automatically called if an interface destructs */ /* Our trackers are objects that expose the orientation and position of physical devices such as controller, anchor points, etc. @@ -167,11 +167,11 @@ public: */ bool is_tracker_id_in_use_for_type(TrackerType p_tracker_type, int p_tracker_id) const; int get_free_tracker_id_for_type(TrackerType p_tracker_type); - void add_tracker(ARVRPositionalTracker *p_tracker); - void remove_tracker(ARVRPositionalTracker *p_tracker); + void add_tracker(XRPositionalTracker *p_tracker); + void remove_tracker(XRPositionalTracker *p_tracker); int get_tracker_count() const; - ARVRPositionalTracker *get_tracker(int p_index) const; - ARVRPositionalTracker *find_by_type_and_id(TrackerType p_tracker_type, int p_tracker_id) const; + XRPositionalTracker *get_tracker(int p_index) const; + XRPositionalTracker *find_by_type_and_id(TrackerType p_tracker_type, int p_tracker_id) const; uint64_t get_last_process_usec(); uint64_t get_last_commit_usec(); @@ -180,13 +180,13 @@ public: void _process(); void _mark_commit(); - ARVRServer(); - ~ARVRServer(); + XRServer(); + ~XRServer(); }; -#define ARVR ARVRServer +#define XR XRServer -VARIANT_ENUM_CAST(ARVRServer::TrackerType); -VARIANT_ENUM_CAST(ARVRServer::RotationMode); +VARIANT_ENUM_CAST(XRServer::TrackerType); +VARIANT_ENUM_CAST(XRServer::RotationMode); #endif diff --git a/thirdparty/README.md b/thirdparty/README.md index 95a6902089..5821ca1424 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,9 +40,11 @@ Files extracted from upstream source: ## bullet - Upstream: https://github.com/bulletphysics/bullet3 -- Version: 2.89 +- Version: git pre-2.90 (cd8cf7521cbb8b7808126a6adebd47bb83ea166a, 2020) - License: zlib +Important: Synced with a pre-release version of bullet 2.90 from the master branch. + Files extracted from upstream source: - src/* apart from CMakeLists.txt and premake4.lua files @@ -52,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: @@ -64,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: @@ -75,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: @@ -85,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: @@ -117,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. @@ -125,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 @@ -138,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: @@ -151,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. @@ -182,18 +184,20 @@ Patches in the `patches` directory should be re-applied after updates. ## jpeg-compressor - Upstream: https://github.com/richgel999/jpeg-compressor -- Version: 1.04 +- Version: 2.00 (1eb17d558b9d3b7442d256642a5745974e9eeb1e, 2020) - License: Public domain Files extracted from upstream source: -- `jpgd.{c,h}` +- `jpgd*.{c,h}` + +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: @@ -206,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: @@ -221,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, @@ -240,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: @@ -256,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: @@ -269,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: @@ -286,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: @@ -302,7 +306,7 @@ changes are marked with `// -- GODOT --` comments. ## mbedtls - Upstream: https://tls.mbed.org/ -- Version: 2.16.5 +- Version: 2.16.6 (2020) - License: Apache 2.0 File extracted from upstream release tarball (`-apache.tgz` variant): @@ -322,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: @@ -338,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: @@ -358,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 @@ -374,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 @@ -382,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}` @@ -392,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: ? @@ -405,29 +405,29 @@ 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 ## nanosvg - Upstream: https://github.com/memononen/nanosvg -- Version: git (25241c5, 2019) +- Version: git (25241c5a8f8451d41ab1b02ab2d865b01600d949, 2019) - License: zlib Files extracted from the upstream source: @@ -439,7 +439,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: @@ -456,14 +456,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/* @@ -473,7 +472,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: @@ -485,19 +484,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: @@ -513,7 +512,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: @@ -528,7 +527,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: @@ -539,7 +538,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: @@ -556,7 +555,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 @@ -578,7 +577,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. @@ -586,7 +585,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: @@ -611,7 +610,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: @@ -622,7 +621,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/basis_universal/basisu_enc.h b/thirdparty/basis_universal/basisu_enc.h index c2b9133045..0a0c3c6fc0 100644 --- a/thirdparty/basis_universal/basisu_enc.h +++ b/thirdparty/basis_universal/basisu_enc.h @@ -22,6 +22,7 @@ #include <functional> #include <thread> #include <unordered_map> +#include <ostream> #if !defined(_WIN32) || defined(__MINGW32__) #include <libgen.h> diff --git a/thirdparty/bullet/BulletCollision/BroadphaseCollision/btDbvt.h b/thirdparty/bullet/BulletCollision/BroadphaseCollision/btDbvt.h index 980d19a754..55daa7fb57 100644 --- a/thirdparty/bullet/BulletCollision/BroadphaseCollision/btDbvt.h +++ b/thirdparty/bullet/BulletCollision/BroadphaseCollision/btDbvt.h @@ -203,8 +203,8 @@ struct btDbvntNode btDbvntNode(const btDbvtNode* n) : volume(n->volume) - , angle(0) , normal(0,0,0) + , angle(0) , data(n->data) { childs[0] = 0; diff --git a/thirdparty/bullet/BulletCollision/BroadphaseCollision/btOverlappingPairCache.h b/thirdparty/bullet/BulletCollision/BroadphaseCollision/btOverlappingPairCache.h index f4a2d5e368..56011899cb 100644 --- a/thirdparty/bullet/BulletCollision/BroadphaseCollision/btOverlappingPairCache.h +++ b/thirdparty/bullet/BulletCollision/BroadphaseCollision/btOverlappingPairCache.h @@ -61,7 +61,8 @@ public: virtual void cleanOverlappingPair(btBroadphasePair& pair, btDispatcher* dispatcher) = 0; virtual int getNumOverlappingPairs() const = 0; - + virtual bool needsBroadphaseCollision(btBroadphaseProxy * proxy0, btBroadphaseProxy * proxy1) const = 0; + virtual btOverlapFilterCallback* getOverlapFilterCallback() = 0; virtual void cleanProxyFromPairs(btBroadphaseProxy* proxy, btDispatcher* dispatcher) = 0; virtual void setOverlapFilterCallback(btOverlapFilterCallback* callback) = 0; @@ -380,6 +381,14 @@ public: { } + bool needsBroadphaseCollision(btBroadphaseProxy*, btBroadphaseProxy*) const + { + return true; + } + btOverlapFilterCallback* getOverlapFilterCallback() + { + return 0; + } virtual void setOverlapFilterCallback(btOverlapFilterCallback* /*callback*/) { } diff --git a/thirdparty/bullet/BulletCollision/BroadphaseCollision/btQuantizedBvh.cpp b/thirdparty/bullet/BulletCollision/BroadphaseCollision/btQuantizedBvh.cpp index b814fd84d8..4954e773e2 100644 --- a/thirdparty/bullet/BulletCollision/BroadphaseCollision/btQuantizedBvh.cpp +++ b/thirdparty/bullet/BulletCollision/BroadphaseCollision/btQuantizedBvh.cpp @@ -468,7 +468,7 @@ void btQuantizedBvh::walkStacklessTreeAgainstRay(btNodeOverlapCallback* nodeCall #ifdef RAYAABB2 btVector3 rayDir = (rayTarget - raySource); - rayDir.normalize(); + rayDir.safeNormalize();// stephengold changed normalize to safeNormalize 2020-02-17 lambda_max = rayDir.dot(rayTarget - raySource); ///what about division by zero? --> just set rayDirection[i] to 1.0 btVector3 rayDirectionInverse; @@ -554,7 +554,7 @@ void btQuantizedBvh::walkStacklessQuantizedTreeAgainstRay(btNodeOverlapCallback* #ifdef RAYAABB2 btVector3 rayDirection = (rayTarget - raySource); - rayDirection.normalize(); + rayDirection.safeNormalize();// stephengold changed normalize to safeNormalize 2020-02-17 lambda_max = rayDirection.dot(rayTarget - raySource); ///what about division by zero? --> just set rayDirection[i] to 1.0 rayDirection[0] = rayDirection[0] == btScalar(0.0) ? btScalar(BT_LARGE_FLOAT) : btScalar(1.0) / rayDirection[0]; diff --git a/thirdparty/bullet/BulletCollision/CollisionDispatch/btCollisionDispatcher.h b/thirdparty/bullet/BulletCollision/CollisionDispatch/btCollisionDispatcher.h index 6b9f5e23a5..04309670cf 100644 --- a/thirdparty/bullet/BulletCollision/CollisionDispatch/btCollisionDispatcher.h +++ b/thirdparty/bullet/BulletCollision/CollisionDispatch/btCollisionDispatcher.h @@ -46,8 +46,6 @@ protected: btAlignedObjectArray<btPersistentManifold*> m_manifoldsPtr; - btManifoldResult m_defaultManifoldResult; - btNearCallback m_nearCallback; btPoolAllocator* m_collisionAlgorithmPoolAllocator; @@ -95,11 +93,15 @@ public: btPersistentManifold* getManifoldByIndexInternal(int index) { + btAssert(index>=0); + btAssert(index<m_manifoldsPtr.size()); return m_manifoldsPtr[index]; } const btPersistentManifold* getManifoldByIndexInternal(int index) const { + btAssert(index>=0); + btAssert(index<m_manifoldsPtr.size()); return m_manifoldsPtr[index]; } diff --git a/thirdparty/bullet/BulletCollision/CollisionDispatch/btCollisionDispatcherMt.cpp b/thirdparty/bullet/BulletCollision/CollisionDispatch/btCollisionDispatcherMt.cpp index 6fe56538d2..89bc8d920e 100644 --- a/thirdparty/bullet/BulletCollision/CollisionDispatch/btCollisionDispatcherMt.cpp +++ b/thirdparty/bullet/BulletCollision/CollisionDispatch/btCollisionDispatcherMt.cpp @@ -28,6 +28,7 @@ subject to the following restrictions: btCollisionDispatcherMt::btCollisionDispatcherMt(btCollisionConfiguration* config, int grainSize) : btCollisionDispatcher(config) { + m_batchManifoldsPtr.resize(btGetTaskScheduler()->getNumThreads()); m_batchUpdating = false; m_grainSize = grainSize; // iterations per task } @@ -65,6 +66,10 @@ btPersistentManifold* btCollisionDispatcherMt::getNewManifold(const btCollisionO manifold->m_index1a = m_manifoldsPtr.size(); m_manifoldsPtr.push_back(manifold); } + else + { + m_batchManifoldsPtr[btGetCurrentThreadIndex()].push_back(manifold); + } return manifold; } @@ -121,7 +126,7 @@ struct CollisionDispatcherUpdater : public btIParallelForBody void btCollisionDispatcherMt::dispatchAllCollisionPairs(btOverlappingPairCache* pairCache, const btDispatcherInfo& info, btDispatcher* dispatcher) { - int pairCount = pairCache->getNumOverlappingPairs(); + const int pairCount = pairCache->getNumOverlappingPairs(); if (pairCount == 0) { return; @@ -136,16 +141,17 @@ void btCollisionDispatcherMt::dispatchAllCollisionPairs(btOverlappingPairCache* btParallelFor(0, pairCount, m_grainSize, updater); m_batchUpdating = false; - // reconstruct the manifolds array to ensure determinism - m_manifoldsPtr.resizeNoInitialize(0); - - btBroadphasePair* pairs = pairCache->getOverlappingPairArrayPtr(); - for (int i = 0; i < pairCount; ++i) + // merge new manifolds, if any + for (int i = 0; i < m_batchManifoldsPtr.size(); ++i) { - if (btCollisionAlgorithm* algo = pairs[i].m_algorithm) + btAlignedObjectArray<btPersistentManifold*>& batchManifoldsPtr = m_batchManifoldsPtr[i]; + + for (int j = 0; j < batchManifoldsPtr.size(); ++j) { - algo->getAllContactManifolds(m_manifoldsPtr); + m_manifoldsPtr.push_back(batchManifoldsPtr[j]); } + + batchManifoldsPtr.resizeNoInitialize(0); } // update the indices (used when releasing manifolds) diff --git a/thirdparty/bullet/BulletCollision/CollisionDispatch/btCollisionDispatcherMt.h b/thirdparty/bullet/BulletCollision/CollisionDispatch/btCollisionDispatcherMt.h index 28eba7f32a..1155de2cfe 100644 --- a/thirdparty/bullet/BulletCollision/CollisionDispatch/btCollisionDispatcherMt.h +++ b/thirdparty/bullet/BulletCollision/CollisionDispatch/btCollisionDispatcherMt.h @@ -30,6 +30,7 @@ public: virtual void dispatchAllCollisionPairs(btOverlappingPairCache* pairCache, const btDispatcherInfo& info, btDispatcher* dispatcher) BT_OVERRIDE; protected: + btAlignedObjectArray<btAlignedObjectArray<btPersistentManifold*> > m_batchManifoldsPtr; bool m_batchUpdating; int m_grainSize; }; diff --git a/thirdparty/bullet/BulletCollision/CollisionDispatch/btCompoundCollisionAlgorithm.cpp b/thirdparty/bullet/BulletCollision/CollisionDispatch/btCompoundCollisionAlgorithm.cpp index 1bb21104cb..b5f4a3c869 100644 --- a/thirdparty/bullet/BulletCollision/CollisionDispatch/btCompoundCollisionAlgorithm.cpp +++ b/thirdparty/bullet/BulletCollision/CollisionDispatch/btCompoundCollisionAlgorithm.cpp @@ -139,7 +139,12 @@ public: if (TestAabbAgainstAabb2(aabbMin0, aabbMax0, aabbMin1, aabbMax1)) { - btCollisionObjectWrapper compoundWrap(this->m_compoundColObjWrap, childShape, m_compoundColObjWrap->getCollisionObject(), newChildWorldTrans, childTrans, -1, index); + btTransform preTransform = childTrans; + if (this->m_compoundColObjWrap->m_preTransform) + { + preTransform = preTransform *(*(this->m_compoundColObjWrap->m_preTransform)); + } + btCollisionObjectWrapper compoundWrap(this->m_compoundColObjWrap, childShape, m_compoundColObjWrap->getCollisionObject(), newChildWorldTrans, preTransform, -1, index); btCollisionAlgorithm* algo = 0; bool allocatedAlgorithm = false; diff --git a/thirdparty/bullet/BulletDynamics/ConstraintSolver/btContactSolverInfo.h b/thirdparty/bullet/BulletDynamics/ConstraintSolver/btContactSolverInfo.h index e82d1b139e..4356c12abf 100644 --- a/thirdparty/bullet/BulletDynamics/ConstraintSolver/btContactSolverInfo.h +++ b/thirdparty/bullet/BulletDynamics/ConstraintSolver/btContactSolverInfo.h @@ -46,7 +46,7 @@ struct btContactSolverInfoData btScalar m_sor; //successive over-relaxation term btScalar m_erp; //error reduction for non-contact constraints btScalar m_erp2; //error reduction for contact constraints - btScalar m_deformable_erp; //error reduction for deformable constraints + btScalar m_deformable_erp; //error reduction for deformable constraints btScalar m_globalCfm; //constraint force mixing for contacts and non-contacts btScalar m_frictionERP; //error reduction for friction constraints btScalar m_frictionCFM; //constraint force mixing for friction constraints @@ -67,6 +67,7 @@ struct btContactSolverInfoData bool m_jointFeedbackInWorldSpace; bool m_jointFeedbackInJointFrame; int m_reportSolverAnalytics; + int m_numNonContactInnerIterations; }; struct btContactSolverInfo : public btContactSolverInfoData @@ -82,7 +83,7 @@ struct btContactSolverInfo : public btContactSolverInfoData m_numIterations = 10; m_erp = btScalar(0.2); m_erp2 = btScalar(0.2); - m_deformable_erp = btScalar(0.); + m_deformable_erp = btScalar(0.1); m_globalCfm = btScalar(0.); m_frictionERP = btScalar(0.2); //positional friction 'anchors' are disabled by default m_frictionCFM = btScalar(0.); @@ -104,6 +105,7 @@ struct btContactSolverInfo : public btContactSolverInfoData m_jointFeedbackInWorldSpace = false; m_jointFeedbackInJointFrame = false; m_reportSolverAnalytics = 0; + m_numNonContactInnerIterations = 1; // the number of inner iterations for solving motor constraint in a single iteration of the constraint solve } }; diff --git a/thirdparty/bullet/BulletDynamics/ConstraintSolver/btGeneric6DofSpring2Constraint.cpp b/thirdparty/bullet/BulletDynamics/ConstraintSolver/btGeneric6DofSpring2Constraint.cpp index 93626f18ff..74a13c6249 100644 --- a/thirdparty/bullet/BulletDynamics/ConstraintSolver/btGeneric6DofSpring2Constraint.cpp +++ b/thirdparty/bullet/BulletDynamics/ConstraintSolver/btGeneric6DofSpring2Constraint.cpp @@ -876,7 +876,10 @@ int btGeneric6DofSpring2Constraint::get_limit_motor_info2( // will we not request a velocity with the wrong direction ? // and the answer is not, because in practice during the solving the current velocity is subtracted from the m_constraintError // so the sign of the force that is really matters - info->m_constraintError[srow] = (rotational ? -1 : 1) * (f < 0 ? -SIMD_INFINITY : SIMD_INFINITY); + if (m_flags & BT_6DOF_FLAGS_USE_INFINITE_ERROR) + info->m_constraintError[srow] = (rotational ? -1 : 1) * (f < 0 ? -SIMD_INFINITY : SIMD_INFINITY); + else + info->m_constraintError[srow] = vel + f / m * (rotational ? -1 : 1); btScalar minf = f < fd ? f : fd; btScalar maxf = f < fd ? fd : f; diff --git a/thirdparty/bullet/BulletDynamics/ConstraintSolver/btGeneric6DofSpring2Constraint.h b/thirdparty/bullet/BulletDynamics/ConstraintSolver/btGeneric6DofSpring2Constraint.h index 00e24364e0..c86dc373da 100644 --- a/thirdparty/bullet/BulletDynamics/ConstraintSolver/btGeneric6DofSpring2Constraint.h +++ b/thirdparty/bullet/BulletDynamics/ConstraintSolver/btGeneric6DofSpring2Constraint.h @@ -265,6 +265,7 @@ enum bt6DofFlags2 BT_6DOF_FLAGS_ERP_STOP2 = 2, BT_6DOF_FLAGS_CFM_MOTO2 = 4, BT_6DOF_FLAGS_ERP_MOTO2 = 8, + BT_6DOF_FLAGS_USE_INFINITE_ERROR = (1<<16) }; #define BT_6DOF_FLAGS_AXIS_SHIFT2 4 // bits per axis diff --git a/thirdparty/bullet/BulletDynamics/ConstraintSolver/btSequentialImpulseConstraintSolver.cpp b/thirdparty/bullet/BulletDynamics/ConstraintSolver/btSequentialImpulseConstraintSolver.cpp index e4da468299..d2641c582f 100644 --- a/thirdparty/bullet/BulletDynamics/ConstraintSolver/btSequentialImpulseConstraintSolver.cpp +++ b/thirdparty/bullet/BulletDynamics/ConstraintSolver/btSequentialImpulseConstraintSolver.cpp @@ -14,7 +14,9 @@ subject to the following restrictions: */ //#define COMPUTE_IMPULSE_DENOM 1 -//#define BT_ADDITIONAL_DEBUG +#ifdef BT_DEBUG +# define BT_ADDITIONAL_DEBUG +#endif //It is not necessary (redundant) to refresh contact manifolds, this refresh has been moved to the collision algorithms. @@ -690,8 +692,10 @@ int btSequentialImpulseConstraintSolver::getOrInitSolverBody(btCollisionObject& { #if BT_THREADSAFE int solverBodyId = -1; - bool isRigidBodyType = btRigidBody::upcast(&body) != NULL; - if (isRigidBodyType && !body.isStaticOrKinematicObject()) + const bool isRigidBodyType = btRigidBody::upcast(&body) != NULL; + const bool isStaticOrKinematic = body.isStaticOrKinematicObject(); + const bool isKinematic = body.isKinematicObject(); + if (isRigidBodyType && !isStaticOrKinematic) { // dynamic body // Dynamic bodies can only be in one island, so it's safe to write to the companionId @@ -704,7 +708,7 @@ int btSequentialImpulseConstraintSolver::getOrInitSolverBody(btCollisionObject& body.setCompanionId(solverBodyId); } } - else if (isRigidBodyType && body.isKinematicObject()) + else if (isRigidBodyType && isKinematic) { // // NOTE: must test for kinematic before static because some kinematic objects also diff --git a/thirdparty/bullet/BulletDynamics/Dynamics/btDiscreteDynamicsWorld.cpp b/thirdparty/bullet/BulletDynamics/Dynamics/btDiscreteDynamicsWorld.cpp index a3c9f42eb9..fb15ae31eb 100644 --- a/thirdparty/bullet/BulletDynamics/Dynamics/btDiscreteDynamicsWorld.cpp +++ b/thirdparty/bullet/BulletDynamics/Dynamics/btDiscreteDynamicsWorld.cpp @@ -800,6 +800,14 @@ public: ///don't do CCD when the collision filters are not matching if (!ClosestConvexResultCallback::needsCollision(proxy0)) return false; + if (m_pairCache->getOverlapFilterCallback()) { + btBroadphaseProxy* proxy1 = m_me->getBroadphaseHandle(); + bool collides = m_pairCache->needsBroadphaseCollision(proxy0, proxy1); + if (!collides) + { + return false; + } + } btCollisionObject* otherObj = (btCollisionObject*)proxy0->m_clientObject; diff --git a/thirdparty/bullet/BulletDynamics/Dynamics/btRigidBody.cpp b/thirdparty/bullet/BulletDynamics/Dynamics/btRigidBody.cpp index 9e8705b001..27fdead761 100644 --- a/thirdparty/bullet/BulletDynamics/Dynamics/btRigidBody.cpp +++ b/thirdparty/bullet/BulletDynamics/Dynamics/btRigidBody.cpp @@ -136,8 +136,13 @@ void btRigidBody::setGravity(const btVector3& acceleration) void btRigidBody::setDamping(btScalar lin_damping, btScalar ang_damping) { - m_linearDamping = btClamped(lin_damping, (btScalar)btScalar(0.0), (btScalar)btScalar(1.0)); - m_angularDamping = btClamped(ang_damping, (btScalar)btScalar(0.0), (btScalar)btScalar(1.0)); +#ifdef BT_USE_OLD_DAMPING_METHOD + m_linearDamping = btMax(lin_damping, btScalar(0.0)); + m_angularDamping = btMax(ang_damping, btScalar(0.0)); +#else + m_linearDamping = btClamped(lin_damping, btScalar(0.0), btScalar(1.0)); + m_angularDamping = btClamped(ang_damping, btScalar(0.0), btScalar(1.0)); +#endif } ///applyDamping damps the velocity, using the given m_linearDamping and m_angularDamping @@ -146,10 +151,9 @@ void btRigidBody::applyDamping(btScalar timeStep) //On new damping: see discussion/issue report here: http://code.google.com/p/bullet/issues/detail?id=74 //todo: do some performance comparisons (but other parts of the engine are probably bottleneck anyway -//#define USE_OLD_DAMPING_METHOD 1 -#ifdef USE_OLD_DAMPING_METHOD - m_linearVelocity *= GEN_clamped((btScalar(1.) - timeStep * m_linearDamping), (btScalar)btScalar(0.0), (btScalar)btScalar(1.0)); - m_angularVelocity *= GEN_clamped((btScalar(1.) - timeStep * m_angularDamping), (btScalar)btScalar(0.0), (btScalar)btScalar(1.0)); +#ifdef BT_USE_OLD_DAMPING_METHOD + m_linearVelocity *= btMax((btScalar(1.0) - timeStep * m_linearDamping), btScalar(0.0)); + m_angularVelocity *= btMax((btScalar(1.0) - timeStep * m_angularDamping), btScalar(0.0)); #else m_linearVelocity *= btPow(btScalar(1) - m_linearDamping, timeStep); m_angularVelocity *= btPow(btScalar(1) - m_angularDamping, timeStep); @@ -380,6 +384,9 @@ void btRigidBody::integrateVelocities(btScalar step) { m_angularVelocity *= (MAX_ANGVEL / step) / angvel; } + #if defined(BT_CLAMP_VELOCITY_TO) && BT_CLAMP_VELOCITY_TO > 0 + clampVelocity(m_angularVelocity); + #endif } btQuaternion btRigidBody::getOrientation() const diff --git a/thirdparty/bullet/BulletDynamics/Dynamics/btRigidBody.h b/thirdparty/bullet/BulletDynamics/Dynamics/btRigidBody.h index 39d47cbbda..943d724cce 100644 --- a/thirdparty/bullet/BulletDynamics/Dynamics/btRigidBody.h +++ b/thirdparty/bullet/BulletDynamics/Dynamics/btRigidBody.h @@ -305,6 +305,9 @@ public: void applyTorque(const btVector3& torque) { m_totalTorque += torque * m_angularFactor; + #if defined(BT_CLAMP_VELOCITY_TO) && BT_CLAMP_VELOCITY_TO > 0 + clampVelocity(m_totalTorque); + #endif } void applyForce(const btVector3& force, const btVector3& rel_pos) @@ -316,11 +319,17 @@ public: void applyCentralImpulse(const btVector3& impulse) { m_linearVelocity += impulse * m_linearFactor * m_inverseMass; + #if defined(BT_CLAMP_VELOCITY_TO) && BT_CLAMP_VELOCITY_TO > 0 + clampVelocity(m_linearVelocity); + #endif } void applyTorqueImpulse(const btVector3& torque) { m_angularVelocity += m_invInertiaTensorWorld * torque * m_angularFactor; + #if defined(BT_CLAMP_VELOCITY_TO) && BT_CLAMP_VELOCITY_TO > 0 + clampVelocity(m_angularVelocity); + #endif } void applyImpulse(const btVector3& impulse, const btVector3& rel_pos) @@ -361,20 +370,46 @@ public: { m_pushVelocity = v; } - + + #if defined(BT_CLAMP_VELOCITY_TO) && BT_CLAMP_VELOCITY_TO > 0 + void clampVelocity(btVector3& v) const { + v.setX( + fmax(-BT_CLAMP_VELOCITY_TO, + fmin(BT_CLAMP_VELOCITY_TO, v.getX())) + ); + v.setY( + fmax(-BT_CLAMP_VELOCITY_TO, + fmin(BT_CLAMP_VELOCITY_TO, v.getY())) + ); + v.setZ( + fmax(-BT_CLAMP_VELOCITY_TO, + fmin(BT_CLAMP_VELOCITY_TO, v.getZ())) + ); + } + #endif + void setTurnVelocity(const btVector3& v) { m_turnVelocity = v; + #if defined(BT_CLAMP_VELOCITY_TO) && BT_CLAMP_VELOCITY_TO > 0 + clampVelocity(m_turnVelocity); + #endif } void applyCentralPushImpulse(const btVector3& impulse) { m_pushVelocity += impulse * m_linearFactor * m_inverseMass; + #if defined(BT_CLAMP_VELOCITY_TO) && BT_CLAMP_VELOCITY_TO > 0 + clampVelocity(m_pushVelocity); + #endif } void applyTorqueTurnImpulse(const btVector3& torque) { m_turnVelocity += m_invInertiaTensorWorld * torque * m_angularFactor; + #if defined(BT_CLAMP_VELOCITY_TO) && BT_CLAMP_VELOCITY_TO > 0 + clampVelocity(m_turnVelocity); + #endif } void clearForces() @@ -408,12 +443,18 @@ public: { m_updateRevision++; m_linearVelocity = lin_vel; + #if defined(BT_CLAMP_VELOCITY_TO) && BT_CLAMP_VELOCITY_TO > 0 + clampVelocity(m_linearVelocity); + #endif } inline void setAngularVelocity(const btVector3& ang_vel) { m_updateRevision++; m_angularVelocity = ang_vel; + #if defined(BT_CLAMP_VELOCITY_TO) && BT_CLAMP_VELOCITY_TO > 0 + clampVelocity(m_angularVelocity); + #endif } btVector3 getVelocityInLocalPoint(const btVector3& rel_pos) const diff --git a/thirdparty/bullet/BulletDynamics/Dynamics/btSimulationIslandManagerMt.cpp b/thirdparty/bullet/BulletDynamics/Dynamics/btSimulationIslandManagerMt.cpp index 5353fe009e..772b774202 100644 --- a/thirdparty/bullet/BulletDynamics/Dynamics/btSimulationIslandManagerMt.cpp +++ b/thirdparty/bullet/BulletDynamics/Dynamics/btSimulationIslandManagerMt.cpp @@ -171,6 +171,8 @@ void btSimulationIslandManagerMt::initIslandPools() btSimulationIslandManagerMt::Island* btSimulationIslandManagerMt::getIsland(int id) { + btAssert(id >= 0); + btAssert(id < m_lookupIslandFromId.size()); Island* island = m_lookupIslandFromId[id]; if (island == NULL) { diff --git a/thirdparty/bullet/BulletDynamics/Featherstone/btMultiBody.cpp b/thirdparty/bullet/BulletDynamics/Featherstone/btMultiBody.cpp index bdaa473476..a1d5bb9ca8 100644 --- a/thirdparty/bullet/BulletDynamics/Featherstone/btMultiBody.cpp +++ b/thirdparty/bullet/BulletDynamics/Featherstone/btMultiBody.cpp @@ -583,52 +583,6 @@ void btMultiBody::compTreeLinkVelocities(btVector3 *omega, btVector3 *vel) const } } -btScalar btMultiBody::getKineticEnergy() const -{ - int num_links = getNumLinks(); - // TODO: would be better not to allocate memory here - btAlignedObjectArray<btVector3> omega; - omega.resize(num_links + 1); - btAlignedObjectArray<btVector3> vel; - vel.resize(num_links + 1); - compTreeLinkVelocities(&omega[0], &vel[0]); - - // we will do the factor of 0.5 at the end - btScalar result = m_baseMass * vel[0].dot(vel[0]); - result += omega[0].dot(m_baseInertia * omega[0]); - - for (int i = 0; i < num_links; ++i) - { - result += m_links[i].m_mass * vel[i + 1].dot(vel[i + 1]); - result += omega[i + 1].dot(m_links[i].m_inertiaLocal * omega[i + 1]); - } - - return 0.5f * result; -} - -btVector3 btMultiBody::getAngularMomentum() const -{ - int num_links = getNumLinks(); - // TODO: would be better not to allocate memory here - btAlignedObjectArray<btVector3> omega; - omega.resize(num_links + 1); - btAlignedObjectArray<btVector3> vel; - vel.resize(num_links + 1); - btAlignedObjectArray<btQuaternion> rot_from_world; - rot_from_world.resize(num_links + 1); - compTreeLinkVelocities(&omega[0], &vel[0]); - - rot_from_world[0] = m_baseQuat; - btVector3 result = quatRotate(rot_from_world[0].inverse(), (m_baseInertia * omega[0])); - - for (int i = 0; i < num_links; ++i) - { - rot_from_world[i + 1] = m_links[i].m_cachedRotParentToThis * rot_from_world[m_links[i].m_parent + 1]; - result += (quatRotate(rot_from_world[i + 1].inverse(), (m_links[i].m_inertiaLocal * omega[i + 1]))); - } - - return result; -} void btMultiBody::clearConstraintForces() { diff --git a/thirdparty/bullet/BulletDynamics/Featherstone/btMultiBody.h b/thirdparty/bullet/BulletDynamics/Featherstone/btMultiBody.h index afed669a7b..be795633fd 100644 --- a/thirdparty/bullet/BulletDynamics/Featherstone/btMultiBody.h +++ b/thirdparty/bullet/BulletDynamics/Featherstone/btMultiBody.h @@ -307,13 +307,6 @@ public: // btMatrix3x3 localFrameToWorld(int i, const btMatrix3x3 &local_frame) const; - // - // calculate kinetic energy and angular momentum - // useful for debugging. - // - - btScalar getKineticEnergy() const; - btVector3 getAngularMomentum() const; // // set external forces and torques. Note all external forces/torques are given in the WORLD frame. diff --git a/thirdparty/bullet/BulletDynamics/Featherstone/btMultiBodyConstraintSolver.cpp b/thirdparty/bullet/BulletDynamics/Featherstone/btMultiBodyConstraintSolver.cpp index ffae5300f0..2788367431 100644 --- a/thirdparty/bullet/BulletDynamics/Featherstone/btMultiBodyConstraintSolver.cpp +++ b/thirdparty/bullet/BulletDynamics/Featherstone/btMultiBodyConstraintSolver.cpp @@ -30,23 +30,28 @@ btScalar btMultiBodyConstraintSolver::solveSingleIteration(int iteration, btColl btScalar leastSquaredResidual = btSequentialImpulseConstraintSolver::solveSingleIteration(iteration, bodies, numBodies, manifoldPtr, numManifolds, constraints, numConstraints, infoGlobal, debugDrawer); //solve featherstone non-contact constraints - + btScalar nonContactResidual = 0; //printf("m_multiBodyNonContactConstraints = %d\n",m_multiBodyNonContactConstraints.size()); - - for (int j = 0; j < m_multiBodyNonContactConstraints.size(); j++) + for (int i = 0; i < infoGlobal.m_numNonContactInnerIterations; ++i) { - int index = iteration & 1 ? j : m_multiBodyNonContactConstraints.size() - 1 - j; + // reset the nonContactResdual to 0 at start of each inner iteration + nonContactResidual = 0; + for (int j = 0; j < m_multiBodyNonContactConstraints.size(); j++) + { + int index = iteration & 1 ? j : m_multiBodyNonContactConstraints.size() - 1 - j; - btMultiBodySolverConstraint& constraint = m_multiBodyNonContactConstraints[index]; + btMultiBodySolverConstraint& constraint = m_multiBodyNonContactConstraints[index]; - btScalar residual = resolveSingleConstraintRowGeneric(constraint); - leastSquaredResidual = btMax(leastSquaredResidual, residual * residual); + btScalar residual = resolveSingleConstraintRowGeneric(constraint); + nonContactResidual = btMax(nonContactResidual, residual * residual); - if (constraint.m_multiBodyA) - constraint.m_multiBodyA->setPosUpdated(false); - if (constraint.m_multiBodyB) - constraint.m_multiBodyB->setPosUpdated(false); + if (constraint.m_multiBodyA) + constraint.m_multiBodyA->setPosUpdated(false); + if (constraint.m_multiBodyB) + constraint.m_multiBodyB->setPosUpdated(false); + } } + leastSquaredResidual = btMax(leastSquaredResidual, nonContactResidual); //solve featherstone normal contact for (int j0 = 0; j0 < m_multiBodyNormalContactConstraints.size(); j0++) @@ -1250,7 +1255,7 @@ void btMultiBodyConstraintSolver::convertMultiBodyContact(btPersistentManifold* { const btMultiBodyLinkCollider* fcA = btMultiBodyLinkCollider::upcast(manifold->getBody0()); const btMultiBodyLinkCollider* fcB = btMultiBodyLinkCollider::upcast(manifold->getBody1()); - + btMultiBody* mbA = fcA ? fcA->m_multiBody : 0; btMultiBody* mbB = fcB ? fcB->m_multiBody : 0; @@ -1270,7 +1275,7 @@ void btMultiBodyConstraintSolver::convertMultiBodyContact(btPersistentManifold* // return; //only a single rollingFriction per manifold - int rollingFriction = 1; + int rollingFriction = 4; for (int j = 0; j < manifold->getNumContacts(); j++) { diff --git a/thirdparty/bullet/BulletSoftBody/btConjugateResidual.h b/thirdparty/bullet/BulletSoftBody/btConjugateResidual.h new file mode 100644 index 0000000000..7b211c4172 --- /dev/null +++ b/thirdparty/bullet/BulletSoftBody/btConjugateResidual.h @@ -0,0 +1,188 @@ +/* + Written by Xuchen Han <xuchenhan2015@u.northwestern.edu> + + Bullet Continuous Collision Detection and Physics Library + Copyright (c) 2019 Google Inc. http://bulletphysics.org + This software is provided 'as-is', without any express or implied warranty. + In no event will the authors be held liable for any damages arising from the use of this software. + Permission is granted to anyone to use this software for any purpose, + including commercial applications, and to alter it and redistribute it freely, + subject to the following restrictions: + 1. The origin of this software must not be misrepresented; you must not claim that you wrote the original software. If you use this software in a product, an acknowledgment in the product documentation would be appreciated but is not required. + 2. Altered source versions must be plainly marked as such, and must not be misrepresented as being the original software. + 3. This notice may not be removed or altered from any source distribution. + */ + +#ifndef BT_CONJUGATE_RESIDUAL_H +#define BT_CONJUGATE_RESIDUAL_H +#include <iostream> +#include <cmath> +#include <limits> +#include <LinearMath/btAlignedObjectArray.h> +#include <LinearMath/btVector3.h> +#include <LinearMath/btScalar.h> +#include "LinearMath/btQuickprof.h" +template <class MatrixX> +class btConjugateResidual +{ + typedef btAlignedObjectArray<btVector3> TVStack; + TVStack r,p,z,temp_p, temp_r, best_x; + // temp_r = A*r + // temp_p = A*p + // z = M^(-1) * temp_p = M^(-1) * A * p + int max_iterations; + btScalar tolerance_squared, best_r; +public: + btConjugateResidual(const int max_it_in) + : max_iterations(max_it_in) + { + tolerance_squared = 1e-2; + } + + virtual ~btConjugateResidual(){} + + // return the number of iterations taken + int solve(MatrixX& A, TVStack& x, const TVStack& b, bool verbose = false) + { + BT_PROFILE("CRSolve"); + btAssert(x.size() == b.size()); + reinitialize(b); + // r = b - A * x --with assigned dof zeroed out + A.multiply(x, temp_r); // borrow temp_r here to store A*x + r = sub(b, temp_r); + // z = M^(-1) * r + A.precondition(r, z); // borrow z to store preconditioned r + r = z; + btScalar residual_norm = norm(r); + if (residual_norm <= tolerance_squared) { + if (verbose) + { + std::cout << "Iteration = 0" << std::endl; + std::cout << "Two norm of the residual = " << residual_norm << std::endl; + } + return 0; + } + p = r; + btScalar r_dot_Ar, r_dot_Ar_new; + // temp_p = A*p + A.multiply(p, temp_p); + // temp_r = A*r + temp_r = temp_p; + r_dot_Ar = dot(r, temp_r); + for (int k = 1; k <= max_iterations; k++) { + // z = M^(-1) * Ap + A.precondition(temp_p, z); + // alpha = r^T * A * r / (Ap)^T * M^-1 * Ap) + btScalar alpha = r_dot_Ar / dot(temp_p, z); + // x += alpha * p; + multAndAddTo(alpha, p, x); + // r -= alpha * z; + multAndAddTo(-alpha, z, r); + btScalar norm_r = norm(r); + if (norm_r < best_r) + { + best_x = x; + best_r = norm_r; + if (norm_r < tolerance_squared) { + if (verbose) + { + std::cout << "ConjugateResidual iterations " << k << std::endl; + } + return k; + } + else + { + if (verbose) + { + std::cout << "ConjugateResidual iterations " << k << " has residual "<< norm_r << std::endl; + } + } + } + // temp_r = A * r; + A.multiply(r, temp_r); + r_dot_Ar_new = dot(r, temp_r); + btScalar beta = r_dot_Ar_new/r_dot_Ar; + r_dot_Ar = r_dot_Ar_new; + // p = beta*p + r; + p = multAndAdd(beta, p, r); + // temp_p = beta*temp_p + temp_r; + temp_p = multAndAdd(beta, temp_p, temp_r); + } + if (verbose) + { + std::cout << "ConjugateResidual max iterations reached " << max_iterations << std::endl; + } + x = best_x; + return max_iterations; + } + + void reinitialize(const TVStack& b) + { + r.resize(b.size()); + p.resize(b.size()); + z.resize(b.size()); + temp_p.resize(b.size()); + temp_r.resize(b.size()); + best_x.resize(b.size()); + best_r = SIMD_INFINITY; + } + + TVStack sub(const TVStack& a, const TVStack& b) + { + // c = a-b + btAssert(a.size() == b.size()); + TVStack c; + c.resize(a.size()); + for (int i = 0; i < a.size(); ++i) + { + c[i] = a[i] - b[i]; + } + return c; + } + + btScalar squaredNorm(const TVStack& a) + { + return dot(a,a); + } + + btScalar norm(const TVStack& a) + { + btScalar ret = 0; + for (int i = 0; i < a.size(); ++i) + { + for (int d = 0; d < 3; ++d) + { + ret = btMax(ret, btFabs(a[i][d])); + } + } + return ret; + } + + btScalar dot(const TVStack& a, const TVStack& b) + { + btScalar ans(0); + for (int i = 0; i < a.size(); ++i) + ans += a[i].dot(b[i]); + return ans; + } + + void multAndAddTo(btScalar s, const TVStack& a, TVStack& result) + { + // result += s*a + btAssert(a.size() == result.size()); + for (int i = 0; i < a.size(); ++i) + result[i] += s * a[i]; + } + + TVStack multAndAdd(btScalar s, const TVStack& a, const TVStack& b) + { + // result = a*s + b + TVStack result; + result.resize(a.size()); + for (int i = 0; i < a.size(); ++i) + result[i] = s * a[i] + b[i]; + return result; + } +}; +#endif /* btConjugateResidual_h */ + diff --git a/thirdparty/bullet/BulletSoftBody/btDeformableBackwardEulerObjective.cpp b/thirdparty/bullet/BulletSoftBody/btDeformableBackwardEulerObjective.cpp index 1b247641aa..5381ee6265 100644 --- a/thirdparty/bullet/BulletSoftBody/btDeformableBackwardEulerObjective.cpp +++ b/thirdparty/bullet/BulletSoftBody/btDeformableBackwardEulerObjective.cpp @@ -23,12 +23,15 @@ btDeformableBackwardEulerObjective::btDeformableBackwardEulerObjective(btAligned , m_backupVelocity(backup_v) , m_implicit(false) { - m_preconditioner = new MassPreconditioner(m_softBodies); + m_massPreconditioner = new MassPreconditioner(m_softBodies); + m_KKTPreconditioner = new KKTPreconditioner(m_softBodies, m_projection, m_lf, m_dt, m_implicit); + m_preconditioner = m_KKTPreconditioner; } btDeformableBackwardEulerObjective::~btDeformableBackwardEulerObjective() { - delete m_preconditioner; + delete m_KKTPreconditioner; + delete m_massPreconditioner; } void btDeformableBackwardEulerObjective::reinitialize(bool nodeUpdated, btScalar dt) @@ -47,7 +50,7 @@ void btDeformableBackwardEulerObjective::reinitialize(bool nodeUpdated, btScalar m_lf[i]->reinitialize(nodeUpdated); } m_projection.reinitialize(nodeUpdated); - m_preconditioner->reinitialize(nodeUpdated); +// m_preconditioner->reinitialize(nodeUpdated); } void btDeformableBackwardEulerObjective::setDt(btScalar dt) @@ -80,6 +83,33 @@ void btDeformableBackwardEulerObjective::multiply(const TVStack& x, TVStack& b) m_lf[i]->addScaledElasticForceDifferential(-m_dt*m_dt, x, b); } } + int offset = m_nodes.size(); + for (int i = offset; i < b.size(); ++i) + { + b[i].setZero(); + } + // add in the lagrange multiplier terms + + for (int c = 0; c < m_projection.m_lagrangeMultipliers.size(); ++c) + { + // C^T * lambda + const LagrangeMultiplier& lm = m_projection.m_lagrangeMultipliers[c]; + for (int i = 0; i < lm.m_num_nodes; ++i) + { + for (int j = 0; j < lm.m_num_constraints; ++j) + { + b[lm.m_indices[i]] += x[offset+c][j] * lm.m_weights[i] * lm.m_dirs[j]; + } + } + // C * x + for (int d = 0; d < lm.m_num_constraints; ++d) + { + for (int i = 0; i < lm.m_num_nodes; ++i) + { + b[offset+c][d] += lm.m_weights[i] * x[lm.m_indices[i]].dot(lm.m_dirs[d]); + } + } + } } void btDeformableBackwardEulerObjective::updateVelocity(const TVStack& dv) @@ -134,7 +164,7 @@ void btDeformableBackwardEulerObjective::computeResidual(btScalar dt, TVStack &r m_lf[i]->addScaledDampingForce(dt, residual); } } - m_projection.project(residual); +// m_projection.project(residual); } btScalar btDeformableBackwardEulerObjective::computeNorm(const TVStack& residual) const @@ -186,9 +216,9 @@ void btDeformableBackwardEulerObjective::initialGuess(TVStack& dv, const TVStack } //set constraints as projections -void btDeformableBackwardEulerObjective::setConstraints() +void btDeformableBackwardEulerObjective::setConstraints(const btContactSolverInfo& infoGlobal) { - m_projection.setConstraints(); + m_projection.setConstraints(infoGlobal); } void btDeformableBackwardEulerObjective::applyDynamicFriction(TVStack& r) diff --git a/thirdparty/bullet/BulletSoftBody/btDeformableBackwardEulerObjective.h b/thirdparty/bullet/BulletSoftBody/btDeformableBackwardEulerObjective.h index 05ab42ff0a..86579e71ac 100644 --- a/thirdparty/bullet/BulletSoftBody/btDeformableBackwardEulerObjective.h +++ b/thirdparty/bullet/BulletSoftBody/btDeformableBackwardEulerObjective.h @@ -15,11 +15,12 @@ #ifndef BT_BACKWARD_EULER_OBJECTIVE_H #define BT_BACKWARD_EULER_OBJECTIVE_H -#include "btConjugateGradient.h" +//#include "btConjugateGradient.h" #include "btDeformableLagrangianForce.h" #include "btDeformableMassSpringForce.h" #include "btDeformableGravityForce.h" #include "btDeformableCorotatedForce.h" +#include "btDeformableMousePickingForce.h" #include "btDeformableLinearElasticityForce.h" #include "btDeformableNeoHookeanForce.h" #include "btDeformableContactProjection.h" @@ -39,6 +40,8 @@ public: const TVStack& m_backupVelocity; btAlignedObjectArray<btSoftBody::Node* > m_nodes; bool m_implicit; + MassPreconditioner* m_massPreconditioner; + KKTPreconditioner* m_KKTPreconditioner; btDeformableBackwardEulerObjective(btAlignedObjectArray<btSoftBody *>& softBodies, const TVStack& backup_v); @@ -79,7 +82,7 @@ public: void updateVelocity(const TVStack& dv); //set constraints as projections - void setConstraints(); + void setConstraints(const btContactSolverInfo& infoGlobal); // update the projections and project the residual void project(TVStack& r) @@ -129,6 +132,42 @@ public: // Calculate the total potential energy in the system btScalar totalEnergy(btScalar dt); + + void addLagrangeMultiplier(const TVStack& vec, TVStack& extended_vec) + { + extended_vec.resize(vec.size() + m_projection.m_lagrangeMultipliers.size()); + for (int i = 0; i < vec.size(); ++i) + { + extended_vec[i] = vec[i]; + } + int offset = vec.size(); + for (int i = 0; i < m_projection.m_lagrangeMultipliers.size(); ++i) + { + extended_vec[offset + i].setZero(); + } + } + + void addLagrangeMultiplierRHS(const TVStack& residual, const TVStack& m_dv, TVStack& extended_residual) + { + extended_residual.resize(residual.size() + m_projection.m_lagrangeMultipliers.size()); + for (int i = 0; i < residual.size(); ++i) + { + extended_residual[i] = residual[i]; + } + int offset = residual.size(); + for (int i = 0; i < m_projection.m_lagrangeMultipliers.size(); ++i) + { + const LagrangeMultiplier& lm = m_projection.m_lagrangeMultipliers[i]; + extended_residual[offset + i].setZero(); + for (int d = 0; d < lm.m_num_constraints; ++d) + { + for (int n = 0; n < lm.m_num_nodes; ++n) + { + extended_residual[offset + i][d] += lm.m_weights[n] * m_dv[lm.m_indices[n]].dot(lm.m_dirs[d]); + } + } + } + } }; #endif /* btBackwardEulerObjective_h */ diff --git a/thirdparty/bullet/BulletSoftBody/btDeformableBodySolver.cpp b/thirdparty/bullet/BulletSoftBody/btDeformableBodySolver.cpp index 7724a8ec69..132699c54f 100644 --- a/thirdparty/bullet/BulletSoftBody/btDeformableBodySolver.cpp +++ b/thirdparty/bullet/BulletSoftBody/btDeformableBodySolver.cpp @@ -18,13 +18,15 @@ #include "btDeformableBodySolver.h" #include "btSoftBodyInternals.h" #include "LinearMath/btQuickprof.h" -static const int kMaxConjugateGradientIterations = 50; +static const int kMaxConjugateGradientIterations = 50; btDeformableBodySolver::btDeformableBodySolver() : m_numNodes(0) , m_cg(kMaxConjugateGradientIterations) +, m_cr(kMaxConjugateGradientIterations) , m_maxNewtonIterations(5) , m_newtonTolerance(1e-4) , m_lineSearch(false) +, m_useProjection(false) { m_objective = new btDeformableBackwardEulerObjective(m_softBodies, m_backupVelocity); } @@ -41,7 +43,22 @@ void btDeformableBodySolver::solveDeformableConstraints(btScalar solverdt) { m_objective->computeResidual(solverdt, m_residual); m_objective->applyDynamicFriction(m_residual); - computeStep(m_dv, m_residual); + if (m_useProjection) + { + computeStep(m_dv, m_residual); + } + else + { + TVStack rhs, x; + m_objective->addLagrangeMultiplierRHS(m_residual, m_dv, rhs); + m_objective->addLagrangeMultiplier(m_dv, x); + m_objective->m_preconditioner->reinitialize(true); + computeStep(x, rhs); + for (int i = 0; i<m_dv.size(); ++i) + { + m_dv[i] = x[i]; + } + } updateVelocity(); } else @@ -63,7 +80,7 @@ void btDeformableBodySolver::solveDeformableConstraints(btScalar solverdt) ++counter; } } - + m_objective->computeResidual(solverdt, m_residual); if (m_objective->computeNorm(m_residual) < m_newtonTolerance && i > 0) { @@ -200,7 +217,10 @@ void btDeformableBodySolver::updateDv(btScalar scale) void btDeformableBodySolver::computeStep(TVStack& ddv, const TVStack& residual) { - m_cg.solve(*m_objective, ddv, residual); + if (m_useProjection) + m_cg.solve(*m_objective, ddv, residual, false); + else + m_cr.solve(*m_objective, ddv, residual, false); } void btDeformableBodySolver::reinitialize(const btAlignedObjectArray<btSoftBody *>& softBodies, btScalar dt) @@ -226,27 +246,22 @@ void btDeformableBodySolver::reinitialize(const btAlignedObjectArray<btSoftBody m_dt = dt; m_objective->reinitialize(nodeUpdated, dt); + updateSoftBodies(); } -void btDeformableBodySolver::setConstraints() +void btDeformableBodySolver::setConstraints(const btContactSolverInfo& infoGlobal) { BT_PROFILE("setConstraint"); - m_objective->setConstraints(); + m_objective->setConstraints(infoGlobal); } -btScalar btDeformableBodySolver::solveContactConstraints(btCollisionObject** deformableBodies,int numDeformableBodies) +btScalar btDeformableBodySolver::solveContactConstraints(btCollisionObject** deformableBodies,int numDeformableBodies, const btContactSolverInfo& infoGlobal) { BT_PROFILE("solveContactConstraints"); - btScalar maxSquaredResidual = m_objective->m_projection.update(deformableBodies,numDeformableBodies); + btScalar maxSquaredResidual = m_objective->m_projection.update(deformableBodies,numDeformableBodies, infoGlobal); return maxSquaredResidual; } -btScalar btDeformableBodySolver::solveSplitImpulse(const btContactSolverInfo& infoGlobal) -{ - BT_PROFILE("solveSplitImpulse"); - return m_objective->m_projection.solveSplitImpulse(infoGlobal); -} - void btDeformableBodySolver::splitImpulseSetup(const btContactSolverInfo& infoGlobal) { m_objective->m_projection.splitImpulseSetup(infoGlobal); @@ -333,8 +348,10 @@ void btDeformableBodySolver::setupDeformableSolve(bool implicit) m_backupVelocity[counter] = psb->m_nodes[j].m_vn; } else + { m_dv[counter] = psb->m_nodes[j].m_v - m_backupVelocity[counter]; - psb->m_nodes[j].m_v = m_backupVelocity[counter] + psb->m_nodes[j].m_vsplit; + } + psb->m_nodes[j].m_v = m_backupVelocity[counter]; ++counter; } } @@ -385,6 +402,7 @@ void btDeformableBodySolver::predictMotion(btScalar solverdt) void btDeformableBodySolver::predictDeformableMotion(btSoftBody* psb, btScalar dt) { + BT_PROFILE("btDeformableBodySolver::predictDeformableMotion"); int i, ni; /* Update */ @@ -423,40 +441,22 @@ void btDeformableBodySolver::predictDeformableMotion(btSoftBody* psb, btScalar d n.m_v *= max_v; } n.m_q = n.m_x + n.m_v * dt; + n.m_penetration = 0; } /* Nodes */ - ATTRIBUTE_ALIGNED16(btDbvtVolume) - vol; - for (i = 0, ni = psb->m_nodes.size(); i < ni; ++i) - { - btSoftBody::Node& n = psb->m_nodes[i]; - btVector3 points[2] = {n.m_x, n.m_q}; - vol = btDbvtVolume::FromPoints(points, 2); - vol.Expand(btVector3(psb->m_sst.radmrg, psb->m_sst.radmrg, psb->m_sst.radmrg)); - psb->m_ndbvt.update(n.m_leaf, vol); - } - + psb->updateNodeTree(true, true); if (!psb->m_fdbvt.empty()) { - for (int i = 0; i < psb->m_faces.size(); ++i) - { - btSoftBody::Face& f = psb->m_faces[i]; - btVector3 points[6] = {f.m_n[0]->m_x, f.m_n[0]->m_q, - f.m_n[1]->m_x, f.m_n[1]->m_q, - f.m_n[2]->m_x, f.m_n[2]->m_q}; - vol = btDbvtVolume::FromPoints(points, 6); - vol.Expand(btVector3(psb->m_sst.radmrg, psb->m_sst.radmrg, psb->m_sst.radmrg)); - psb->m_fdbvt.update(f.m_leaf, vol); - } + psb->updateFaceTree(true, true); } - /* Clear contacts */ + /* Clear contacts */ psb->m_nodeRigidContacts.resize(0); psb->m_faceRigidContacts.resize(0); psb->m_faceNodeContacts.resize(0); /* Optimize dbvt's */ - psb->m_ndbvt.optimizeIncremental(1); - psb->m_fdbvt.optimizeIncremental(1); +// psb->m_ndbvt.optimizeIncremental(1); +// psb->m_fdbvt.optimizeIncremental(1); } diff --git a/thirdparty/bullet/BulletSoftBody/btDeformableBodySolver.h b/thirdparty/bullet/BulletSoftBody/btDeformableBodySolver.h index f78a8f696b..d4e5f4c603 100644 --- a/thirdparty/bullet/BulletSoftBody/btDeformableBodySolver.h +++ b/thirdparty/bullet/BulletSoftBody/btDeformableBodySolver.h @@ -22,7 +22,8 @@ #include "btDeformableMultiBodyDynamicsWorld.h" #include "BulletDynamics/Featherstone/btMultiBodyLinkCollider.h" #include "BulletDynamics/Featherstone/btMultiBodyConstraint.h" - +#include "btConjugateResidual.h" +#include "btConjugateGradient.h" struct btCollisionObjectWrapper; class btDeformableBackwardEulerObjective; class btDeformableMultiBodyDynamicsWorld; @@ -40,14 +41,15 @@ protected: TVStack m_backupVelocity; // backed up v, equals v_n for implicit, equals v_{n+1}^* for explicit btScalar m_dt; // dt btConjugateGradient<btDeformableBackwardEulerObjective> m_cg; // CG solver + btConjugateResidual<btDeformableBackwardEulerObjective> m_cr; // CR solver bool m_implicit; // use implicit scheme if true, explicit scheme if false int m_maxNewtonIterations; // max number of newton iterations btScalar m_newtonTolerance; // stop newton iterations if f(x) < m_newtonTolerance bool m_lineSearch; // If true, use newton's method with line search under implicit scheme - public: // handles data related to objective function btDeformableBackwardEulerObjective* m_objective; + bool m_useProjection; btDeformableBodySolver(); @@ -61,15 +63,11 @@ public: // update soft body normals virtual void updateSoftBodies(); + virtual btScalar solveContactConstraints(btCollisionObject** deformableBodies,int numDeformableBodies, const btContactSolverInfo& infoGlobal); + // solve the momentum equation virtual void solveDeformableConstraints(btScalar solverdt); - // solve the contact between deformable and rigid as well as among deformables - btScalar solveContactConstraints(btCollisionObject** deformableBodies,int numDeformableBodies); - - // solve the position error between deformable and rigid as well as among deformables; - btScalar solveSplitImpulse(const btContactSolverInfo& infoGlobal); - // set up the position error in split impulse void splitImpulseSetup(const btContactSolverInfo& infoGlobal); @@ -77,7 +75,7 @@ public: void reinitialize(const btAlignedObjectArray<btSoftBody *>& softBodies, btScalar dt); // set up contact constraints - void setConstraints(); + void setConstraints(const btContactSolverInfo& infoGlobal); // add in elastic forces and gravity to obtain v_{n+1}^* and calls predictDeformableMotion virtual void predictMotion(btScalar solverdt); diff --git a/thirdparty/bullet/BulletSoftBody/btDeformableContactConstraint.cpp b/thirdparty/bullet/BulletSoftBody/btDeformableContactConstraint.cpp index e8219dc50e..2864446de6 100644 --- a/thirdparty/bullet/BulletSoftBody/btDeformableContactConstraint.cpp +++ b/thirdparty/bullet/BulletSoftBody/btDeformableContactConstraint.cpp @@ -15,9 +15,9 @@ #include "btDeformableContactConstraint.h" /* ================ Deformable Node Anchor =================== */ -btDeformableNodeAnchorConstraint::btDeformableNodeAnchorConstraint(const btSoftBody::DeformableNodeRigidAnchor& a) +btDeformableNodeAnchorConstraint::btDeformableNodeAnchorConstraint(const btSoftBody::DeformableNodeRigidAnchor& a, const btContactSolverInfo& infoGlobal) : m_anchor(&a) -, btDeformableContactConstraint(a.m_cti.m_normal) +, btDeformableContactConstraint(a.m_cti.m_normal, infoGlobal) { } @@ -79,14 +79,14 @@ btVector3 btDeformableNodeAnchorConstraint::getVa() const return va; } -btScalar btDeformableNodeAnchorConstraint::solveConstraint() +btScalar btDeformableNodeAnchorConstraint::solveConstraint(const btContactSolverInfo& infoGlobal) { const btSoftBody::sCti& cti = m_anchor->m_cti; btVector3 va = getVa(); btVector3 vb = getVb(); btVector3 vr = (vb - va); // + (m_anchor->m_node->m_x - cti.m_colObj->getWorldTransform() * m_anchor->m_local) * 10.0 - const btScalar dn = btDot(vr, cti.m_normal); + const btScalar dn = btDot(vr, vr); // dn is the normal component of velocity diffrerence. Approximates the residual. // todo xuchenhan@: this prob needs to be scaled by dt btScalar residualSquare = dn*dn; btVector3 impulse = m_anchor->m_c0 * vr; @@ -134,14 +134,15 @@ void btDeformableNodeAnchorConstraint::applyImpulse(const btVector3& impulse) } /* ================ Deformable vs. Rigid =================== */ -btDeformableRigidContactConstraint::btDeformableRigidContactConstraint(const btSoftBody::DeformableRigidContact& c) +btDeformableRigidContactConstraint::btDeformableRigidContactConstraint(const btSoftBody::DeformableRigidContact& c, const btContactSolverInfo& infoGlobal) : m_contact(&c) -, btDeformableContactConstraint(c.m_cti.m_normal) +, btDeformableContactConstraint(c.m_cti.m_normal, infoGlobal) { m_total_normal_dv.setZero(); m_total_tangent_dv.setZero(); - // penetration is non-positive. The magnitude of penetration is the depth of penetration. - m_penetration = btMin(btScalar(0), c.m_cti.m_offset); + // The magnitude of penetration is the depth of penetration. + m_penetration = c.m_cti.m_offset; +// m_penetration = btMin(btScalar(0),c.m_cti.m_offset); } btDeformableRigidContactConstraint::btDeformableRigidContactConstraint(const btDeformableRigidContactConstraint& other) @@ -206,16 +207,16 @@ btVector3 btDeformableRigidContactConstraint::getVa() const return va; } -btScalar btDeformableRigidContactConstraint::solveConstraint() +btScalar btDeformableRigidContactConstraint::solveConstraint(const btContactSolverInfo& infoGlobal) { const btSoftBody::sCti& cti = m_contact->m_cti; btVector3 va = getVa(); btVector3 vb = getVb(); btVector3 vr = vb - va; - const btScalar dn = btDot(vr, cti.m_normal); + btScalar dn = btDot(vr, cti.m_normal) + m_penetration * infoGlobal.m_deformable_erp / infoGlobal.m_timeStep; // dn is the normal component of velocity diffrerence. Approximates the residual. // todo xuchenhan@: this prob needs to be scaled by dt btScalar residualSquare = dn*dn; - btVector3 impulse = m_contact->m_c0 * vr; + btVector3 impulse = m_contact->m_c0 * (vr + m_penetration * infoGlobal.m_deformable_erp / infoGlobal.m_timeStep * cti.m_normal) ; const btVector3 impulse_normal = m_contact->m_c0 * (cti.m_normal * dn); btVector3 impulse_tangent = impulse - impulse_normal; btVector3 old_total_tangent_dv = m_total_tangent_dv; @@ -256,6 +257,8 @@ btScalar btDeformableRigidContactConstraint::solveConstraint() impulse = impulse_normal + impulse_tangent; // apply impulse to deformable nodes involved and change their velocities applyImpulse(impulse); + if (residualSquare < 1e-7) + return residualSquare; // apply impulse to the rigid/multibodies involved and change their velocities if (cti.m_colObj->getInternalType() == btCollisionObject::CO_RIGID_BODY) { @@ -285,43 +288,17 @@ btScalar btDeformableRigidContactConstraint::solveConstraint() } } } +// va = getVa(); +// vb = getVb(); +// vr = vb - va; +// btScalar dn1 = btDot(vr, cti.m_normal) / 150; +// m_penetration += dn1; return residualSquare; } - -btScalar btDeformableRigidContactConstraint::solveSplitImpulse(const btContactSolverInfo& infoGlobal) -{ - const btSoftBody::sCti& cti = m_contact->m_cti; - const btScalar dn = m_penetration; - if (dn != 0) - { - const btVector3 impulse = (m_contact->m_c0 * (cti.m_normal * dn / infoGlobal.m_timeStep)); - // one iteration of the position impulse corrects all the position error at this timestep - m_penetration -= dn; - // apply impulse to deformable nodes involved and change their position - applySplitImpulse(impulse); - // apply impulse to the rigid/multibodies involved and change their position - if (cti.m_colObj->getInternalType() == btCollisionObject::CO_RIGID_BODY) - { - btRigidBody* rigidCol = 0; - rigidCol = (btRigidBody*)btRigidBody::upcast(cti.m_colObj); - if (rigidCol) - { - rigidCol->applyPushImpulse(impulse, m_contact->m_c1); - } - } - else if (cti.m_colObj->getInternalType() == btCollisionObject::CO_FEATHERSTONE_LINK) - { - // todo xuchenhan@ - } - return (m_penetration/infoGlobal.m_timeStep) * (m_penetration/infoGlobal.m_timeStep); - } - return 0; -} - /* ================ Node vs. Rigid =================== */ -btDeformableNodeRigidContactConstraint::btDeformableNodeRigidContactConstraint(const btSoftBody::DeformableNodeRigidContact& contact) +btDeformableNodeRigidContactConstraint::btDeformableNodeRigidContactConstraint(const btSoftBody::DeformableNodeRigidContact& contact, const btContactSolverInfo& infoGlobal) : m_node(contact.m_node) - , btDeformableRigidContactConstraint(contact) + , btDeformableRigidContactConstraint(contact, infoGlobal) { } @@ -349,22 +326,17 @@ void btDeformableNodeRigidContactConstraint::applyImpulse(const btVector3& impul contact->m_node->m_v -= dv; } -void btDeformableNodeRigidContactConstraint::applySplitImpulse(const btVector3& impulse) -{ - const btSoftBody::DeformableNodeRigidContact* contact = getContact(); - btVector3 dv = impulse * contact->m_c2; - contact->m_node->m_vsplit -= dv; -}; - /* ================ Face vs. Rigid =================== */ -btDeformableFaceRigidContactConstraint::btDeformableFaceRigidContactConstraint(const btSoftBody::DeformableFaceRigidContact& contact) +btDeformableFaceRigidContactConstraint::btDeformableFaceRigidContactConstraint(const btSoftBody::DeformableFaceRigidContact& contact, const btContactSolverInfo& infoGlobal, bool useStrainLimiting) : m_face(contact.m_face) -, btDeformableRigidContactConstraint(contact) +, m_useStrainLimiting(useStrainLimiting) +, btDeformableRigidContactConstraint(contact, infoGlobal) { } btDeformableFaceRigidContactConstraint::btDeformableFaceRigidContactConstraint(const btDeformableFaceRigidContactConstraint& other) : m_face(other.m_face) +, m_useStrainLimiting(other.m_useStrainLimiting) , btDeformableRigidContactConstraint(other) { } @@ -411,47 +383,70 @@ void btDeformableFaceRigidContactConstraint::applyImpulse(const btVector3& impul v1 -= dv * contact->m_weights[1]; if (im2 > 0) v2 -= dv * contact->m_weights[2]; - - // apply strain limiting to prevent undamped modes - btScalar m01 = (btScalar(1)/(im0 + im1)); - btScalar m02 = (btScalar(1)/(im0 + im2)); - btScalar m12 = (btScalar(1)/(im1 + im2)); - - btVector3 dv0 = im0 * (m01 * (v1-v0) + m02 * (v2-v0)); - btVector3 dv1 = im1 * (m01 * (v0-v1) + m12 * (v2-v1)); - btVector3 dv2 = im2 * (m12 * (v1-v2) + m02 * (v0-v2)); - - v0 += dv0; - v1 += dv1; - v2 += dv2; -} - -void btDeformableFaceRigidContactConstraint::applySplitImpulse(const btVector3& impulse) -{ - const btSoftBody::DeformableFaceRigidContact* contact = getContact(); - btVector3 dv = impulse * contact->m_c2; - btSoftBody::Face* face = contact->m_face; - - btVector3& v0 = face->m_n[0]->m_vsplit; - btVector3& v1 = face->m_n[1]->m_vsplit; - btVector3& v2 = face->m_n[2]->m_vsplit; - const btScalar& im0 = face->m_n[0]->m_im; - const btScalar& im1 = face->m_n[1]->m_im; - const btScalar& im2 = face->m_n[2]->m_im; - if (im0 > 0) - v0 -= dv * contact->m_weights[0]; - if (im1 > 0) - v1 -= dv * contact->m_weights[1]; - if (im2 > 0) - v2 -= dv * contact->m_weights[2]; + if (m_useStrainLimiting) + { + btScalar relaxation = 1./btScalar(m_infoGlobal->m_numIterations); + btScalar m01 = (relaxation/(im0 + im1)); + btScalar m02 = (relaxation/(im0 + im2)); + btScalar m12 = (relaxation/(im1 + im2)); + #ifdef USE_STRAIN_RATE_LIMITING + // apply strain limiting to prevent the new velocity to change the current length of the edge by more than 1%. + btScalar p = 0.01; + btVector3& x0 = face->m_n[0]->m_x; + btVector3& x1 = face->m_n[1]->m_x; + btVector3& x2 = face->m_n[2]->m_x; + const btVector3 x_diff[3] = {x1-x0, x2-x0, x2-x1}; + const btVector3 v_diff[3] = {v1-v0, v2-v0, v2-v1}; + btVector3 u[3]; + btScalar x_diff_dot_u, dn[3]; + btScalar dt = m_infoGlobal->m_timeStep; + for (int i = 0; i < 3; ++i) + { + btScalar x_diff_norm = x_diff[i].safeNorm(); + btScalar x_diff_norm_new = (x_diff[i] + v_diff[i] * dt).safeNorm(); + btScalar strainRate = x_diff_norm_new/x_diff_norm; + u[i] = v_diff[i]; + u[i].safeNormalize(); + if (x_diff_norm == 0 || (1-p <= strainRate && strainRate <= 1+p)) + { + dn[i] = 0; + continue; + } + x_diff_dot_u = btDot(x_diff[i], u[i]); + btScalar s; + if (1-p > strainRate) + { + s = 1/dt * (-x_diff_dot_u - btSqrt(x_diff_dot_u*x_diff_dot_u + (p*p-2*p) * x_diff_norm * x_diff_norm)); + } + else + { + s = 1/dt * (-x_diff_dot_u + btSqrt(x_diff_dot_u*x_diff_dot_u + (p*p+2*p) * x_diff_norm * x_diff_norm)); + } + // x_diff_norm_new = (x_diff[i] + s * u[i] * dt).safeNorm(); + // strainRate = x_diff_norm_new/x_diff_norm; + dn[i] = s - v_diff[i].safeNorm(); + } + btVector3 dv0 = im0 * (m01 * u[0]*(-dn[0]) + m02 * u[1]*-(dn[1])); + btVector3 dv1 = im1 * (m01 * u[0]*(dn[0]) + m12 * u[2]*(-dn[2])); + btVector3 dv2 = im2 * (m12 * u[2]*(dn[2]) + m02 * u[1]*(dn[1])); + #else + // apply strain limiting to prevent undamped modes + btVector3 dv0 = im0 * (m01 * (v1-v0) + m02 * (v2-v0)); + btVector3 dv1 = im1 * (m01 * (v0-v1) + m12 * (v2-v1)); + btVector3 dv2 = im2 * (m12 * (v1-v2) + m02 * (v0-v2)); + #endif + v0 += dv0; + v1 += dv1; + v2 += dv2; + } } /* ================ Face vs. Node =================== */ -btDeformableFaceNodeContactConstraint::btDeformableFaceNodeContactConstraint(const btSoftBody::DeformableFaceNodeContact& contact) +btDeformableFaceNodeContactConstraint::btDeformableFaceNodeContactConstraint(const btSoftBody::DeformableFaceNodeContact& contact, const btContactSolverInfo& infoGlobal) : m_node(contact.m_node) , m_face(contact.m_face) , m_contact(&contact) -, btDeformableContactConstraint(contact.m_normal) +, btDeformableContactConstraint(contact.m_normal, infoGlobal) { m_total_normal_dv.setZero(); m_total_tangent_dv.setZero(); @@ -487,7 +482,7 @@ btVector3 btDeformableFaceNodeContactConstraint::getDv(const btSoftBody::Node* n return dv * contact->m_weights[2]; } -btScalar btDeformableFaceNodeContactConstraint::solveConstraint() +btScalar btDeformableFaceNodeContactConstraint::solveConstraint(const btContactSolverInfo& infoGlobal) { btVector3 va = getVa(); btVector3 vb = getVb(); @@ -577,15 +572,4 @@ void btDeformableFaceNodeContactConstraint::applyImpulse(const btVector3& impuls { v2 -= dvb * contact->m_weights[2]; } - // todo: Face node constraints needs more work -// btScalar m01 = (btScalar(1)/(im0 + im1)); -// btScalar m02 = (btScalar(1)/(im0 + im2)); -// btScalar m12 = (btScalar(1)/(im1 + im2)); -// -// btVector3 dv0 = im0 * (m01 * (v1-v0) + m02 * (v2-v0)); -// btVector3 dv1 = im1 * (m01 * (v0-v1) + m12 * (v2-v1)); -// btVector3 dv2 = im2 * (m12 * (v1-v2) + m02 * (v0-v2)); -// v0 += dv0; -// v1 += dv1; -// v2 += dv2; } diff --git a/thirdparty/bullet/BulletSoftBody/btDeformableContactConstraint.h b/thirdparty/bullet/BulletSoftBody/btDeformableContactConstraint.h index 912119e7c3..9f9d5bf0a3 100644 --- a/thirdparty/bullet/BulletSoftBody/btDeformableContactConstraint.h +++ b/thirdparty/bullet/BulletSoftBody/btDeformableContactConstraint.h @@ -24,34 +24,33 @@ public: // True if the friction is static // False if the friction is dynamic bool m_static; - - // normal of the contact - btVector3 m_normal; - - btDeformableContactConstraint(const btVector3& normal): m_static(false), m_normal(normal) - { - } - - btDeformableContactConstraint(bool isStatic, const btVector3& normal): m_static(isStatic), m_normal(normal) - { - } - - btDeformableContactConstraint(const btDeformableContactConstraint& other) - : m_static(other.m_static) - , m_normal(other.m_normal) - { - - } - btDeformableContactConstraint(){} - + const btContactSolverInfo* m_infoGlobal; + + // normal of the contact + btVector3 m_normal; + + btDeformableContactConstraint(const btVector3& normal, const btContactSolverInfo& infoGlobal): m_static(false), m_normal(normal), m_infoGlobal(&infoGlobal) + { + } + + btDeformableContactConstraint(bool isStatic, const btVector3& normal, const btContactSolverInfo& infoGlobal): m_static(isStatic), m_normal(normal), m_infoGlobal(&infoGlobal) + { + } + + btDeformableContactConstraint(){} + + btDeformableContactConstraint(const btDeformableContactConstraint& other) + : m_static(other.m_static) + , m_normal(other.m_normal) + , m_infoGlobal(other.m_infoGlobal) + { + } + virtual ~btDeformableContactConstraint(){} // solve the constraint with inelastic impulse and return the error, which is the square of normal component of velocity diffrerence // the constraint is solved by calculating the impulse between object A and B in the contact and apply the impulse to both objects involved in the contact - virtual btScalar solveConstraint() = 0; - - // solve the position error by applying an inelastic impulse that changes only the position (not velocity) - virtual btScalar solveSplitImpulse(const btContactSolverInfo& infoGlobal) = 0; + virtual btScalar solveConstraint(const btContactSolverInfo& infoGlobal) = 0; // get the velocity of the object A in the contact virtual btVector3 getVa() const = 0; @@ -65,9 +64,6 @@ public: // apply impulse to the soft body node and/or face involved virtual void applyImpulse(const btVector3& impulse) = 0; - // apply position based impulse to the soft body node and/or face involved - virtual void applySplitImpulse(const btVector3& impulse) = 0; - // scale the penetration depth by erp virtual void setPenetrationScale(btScalar scale) = 0; }; @@ -77,29 +73,21 @@ public: class btDeformableStaticConstraint : public btDeformableContactConstraint { public: - const btSoftBody::Node* m_node; - - btDeformableStaticConstraint(){} + btSoftBody::Node* m_node; - btDeformableStaticConstraint(const btSoftBody::Node* node): m_node(node), btDeformableContactConstraint(false, btVector3(0,0,0)) + btDeformableStaticConstraint(btSoftBody::Node* node, const btContactSolverInfo& infoGlobal): m_node(node), btDeformableContactConstraint(false, btVector3(0,0,0), infoGlobal) { } - + btDeformableStaticConstraint(){} btDeformableStaticConstraint(const btDeformableStaticConstraint& other) : m_node(other.m_node) , btDeformableContactConstraint(other) { - } virtual ~btDeformableStaticConstraint(){} - virtual btScalar solveConstraint() - { - return 0; - } - - virtual btScalar solveSplitImpulse(const btContactSolverInfo& infoGlobal) + virtual btScalar solveConstraint(const btContactSolverInfo& infoGlobal) { return 0; } @@ -120,7 +108,6 @@ public: } virtual void applyImpulse(const btVector3& impulse){} - virtual void applySplitImpulse(const btVector3& impulse){} virtual void setPenetrationScale(btScalar scale){} }; @@ -130,19 +117,15 @@ class btDeformableNodeAnchorConstraint : public btDeformableContactConstraint { public: const btSoftBody::DeformableNodeRigidAnchor* m_anchor; - - btDeformableNodeAnchorConstraint(){} - btDeformableNodeAnchorConstraint(const btSoftBody::DeformableNodeRigidAnchor& c); + + btDeformableNodeAnchorConstraint(const btSoftBody::DeformableNodeRigidAnchor& c, const btContactSolverInfo& infoGlobal); btDeformableNodeAnchorConstraint(const btDeformableNodeAnchorConstraint& other); + btDeformableNodeAnchorConstraint(){} virtual ~btDeformableNodeAnchorConstraint() { } - virtual btScalar solveConstraint(); - virtual btScalar solveSplitImpulse(const btContactSolverInfo& infoGlobal) - { - // todo xuchenhan@ - return 0; - } + virtual btScalar solveConstraint(const btContactSolverInfo& infoGlobal); + // object A is the rigid/multi body, and object B is the deformable node/face virtual btVector3 getVa() const; // get the velocity of the deformable node in contact @@ -152,10 +135,7 @@ public: return btVector3(0,0,0); } virtual void applyImpulse(const btVector3& impulse); - virtual void applySplitImpulse(const btVector3& impulse) - { - // todo xuchenhan@ - }; + virtual void setPenetrationScale(btScalar scale){} }; @@ -169,10 +149,10 @@ public: btVector3 m_total_tangent_dv; btScalar m_penetration; const btSoftBody::DeformableRigidContact* m_contact; - - btDeformableRigidContactConstraint(){} - btDeformableRigidContactConstraint(const btSoftBody::DeformableRigidContact& c); + + btDeformableRigidContactConstraint(const btSoftBody::DeformableRigidContact& c, const btContactSolverInfo& infoGlobal); btDeformableRigidContactConstraint(const btDeformableRigidContactConstraint& other); + btDeformableRigidContactConstraint(){} virtual ~btDeformableRigidContactConstraint() { } @@ -180,9 +160,7 @@ public: // object A is the rigid/multi body, and object B is the deformable node/face virtual btVector3 getVa() const; - virtual btScalar solveConstraint(); - - virtual btScalar solveSplitImpulse(const btContactSolverInfo& infoGlobal); + virtual btScalar solveConstraint(const btContactSolverInfo& infoGlobal); virtual void setPenetrationScale(btScalar scale) { @@ -196,12 +174,11 @@ class btDeformableNodeRigidContactConstraint : public btDeformableRigidContactCo { public: // the deformable node in contact - const btSoftBody::Node* m_node; - - btDeformableNodeRigidContactConstraint(){} - btDeformableNodeRigidContactConstraint(const btSoftBody::DeformableNodeRigidContact& contact); + btSoftBody::Node* m_node; + + btDeformableNodeRigidContactConstraint(const btSoftBody::DeformableNodeRigidContact& contact, const btContactSolverInfo& infoGlobal); btDeformableNodeRigidContactConstraint(const btDeformableNodeRigidContactConstraint& other); - + btDeformableNodeRigidContactConstraint(){} virtual ~btDeformableNodeRigidContactConstraint() { } @@ -219,7 +196,6 @@ public: } virtual void applyImpulse(const btVector3& impulse); - virtual void applySplitImpulse(const btVector3& impulse); }; // @@ -228,10 +204,10 @@ class btDeformableFaceRigidContactConstraint : public btDeformableRigidContactCo { public: const btSoftBody::Face* m_face; - btDeformableFaceRigidContactConstraint(){} - btDeformableFaceRigidContactConstraint(const btSoftBody::DeformableFaceRigidContact& contact); + bool m_useStrainLimiting; + btDeformableFaceRigidContactConstraint(const btSoftBody::DeformableFaceRigidContact& contact, const btContactSolverInfo& infoGlobal, bool useStrainLimiting); btDeformableFaceRigidContactConstraint(const btDeformableFaceRigidContactConstraint& other); - + btDeformableFaceRigidContactConstraint(): m_useStrainLimiting(false) {} virtual ~btDeformableFaceRigidContactConstraint() { } @@ -249,7 +225,6 @@ public: } virtual void applyImpulse(const btVector3& impulse); - virtual void applySplitImpulse(const btVector3& impulse); }; // @@ -263,19 +238,11 @@ public: btVector3 m_total_normal_dv; btVector3 m_total_tangent_dv; - btDeformableFaceNodeContactConstraint(){} - - btDeformableFaceNodeContactConstraint(const btSoftBody::DeformableFaceNodeContact& contact); - + btDeformableFaceNodeContactConstraint(const btSoftBody::DeformableFaceNodeContact& contact, const btContactSolverInfo& infoGlobal); + btDeformableFaceNodeContactConstraint(){} virtual ~btDeformableFaceNodeContactConstraint(){} - virtual btScalar solveConstraint(); - - virtual btScalar solveSplitImpulse(const btContactSolverInfo& infoGlobal) - { - // todo: xuchenhan@ - return 0; - } + virtual btScalar solveConstraint(const btContactSolverInfo& infoGlobal); // get the velocity of the object A in the contact virtual btVector3 getVa() const; @@ -293,10 +260,7 @@ public: } virtual void applyImpulse(const btVector3& impulse); - virtual void applySplitImpulse(const btVector3& impulse) - { - // todo xuchenhan@ - } + virtual void setPenetrationScale(btScalar scale){} }; #endif /* BT_DEFORMABLE_CONTACT_CONSTRAINT_H */ diff --git a/thirdparty/bullet/BulletSoftBody/btDeformableContactProjection.cpp b/thirdparty/bullet/BulletSoftBody/btDeformableContactProjection.cpp index 5a4f3241b4..22ca8bf582 100644 --- a/thirdparty/bullet/BulletSoftBody/btDeformableContactProjection.cpp +++ b/thirdparty/bullet/BulletSoftBody/btDeformableContactProjection.cpp @@ -17,7 +17,7 @@ #include "btDeformableMultiBodyDynamicsWorld.h" #include <algorithm> #include <cmath> -btScalar btDeformableContactProjection::update(btCollisionObject** deformableBodies,int numDeformableBodies) +btScalar btDeformableContactProjection::update(btCollisionObject** deformableBodies,int numDeformableBodies, const btContactSolverInfo& infoGlobal) { btScalar residualSquare = 0; for (int i = 0; i < numDeformableBodies; ++i) @@ -32,25 +32,25 @@ btScalar btDeformableContactProjection::update(btCollisionObject** deformableBod for (int k = 0; k < m_nodeRigidConstraints[j].size(); ++k) { btDeformableNodeRigidContactConstraint& constraint = m_nodeRigidConstraints[j][k]; - btScalar localResidualSquare = constraint.solveConstraint(); + btScalar localResidualSquare = constraint.solveConstraint(infoGlobal); residualSquare = btMax(residualSquare, localResidualSquare); } for (int k = 0; k < m_nodeAnchorConstraints[j].size(); ++k) { btDeformableNodeAnchorConstraint& constraint = m_nodeAnchorConstraints[j][k]; - btScalar localResidualSquare = constraint.solveConstraint(); + btScalar localResidualSquare = constraint.solveConstraint(infoGlobal); residualSquare = btMax(residualSquare, localResidualSquare); } for (int k = 0; k < m_faceRigidConstraints[j].size(); ++k) { btDeformableFaceRigidContactConstraint& constraint = m_faceRigidConstraints[j][k]; - btScalar localResidualSquare = constraint.solveConstraint(); + btScalar localResidualSquare = constraint.solveConstraint(infoGlobal); residualSquare = btMax(residualSquare, localResidualSquare); } for (int k = 0; k < m_deformableConstraints[j].size(); ++k) { btDeformableFaceNodeContactConstraint& constraint = m_deformableConstraints[j][k]; - btScalar localResidualSquare = constraint.solveConstraint(); + btScalar localResidualSquare = constraint.solveConstraint(infoGlobal); residualSquare = btMax(residualSquare, localResidualSquare); } } @@ -77,39 +77,8 @@ void btDeformableContactProjection::splitImpulseSetup(const btContactSolverInfo& } } -btScalar btDeformableContactProjection::solveSplitImpulse(const btContactSolverInfo& infoGlobal) -{ - btScalar residualSquare = 0; - for (int i = 0; i < m_softBodies.size(); ++i) - { - // node constraints - for (int j = 0; j < m_nodeRigidConstraints[i].size(); ++j) - { - btDeformableNodeRigidContactConstraint& constraint = m_nodeRigidConstraints[i][j]; - btScalar localResidualSquare = constraint.solveSplitImpulse(infoGlobal); - residualSquare = btMax(residualSquare, localResidualSquare); - } - // anchor constraints - for (int j = 0; j < m_nodeAnchorConstraints[i].size(); ++j) - { - btDeformableNodeAnchorConstraint& constraint = m_nodeAnchorConstraints[i][j]; - btScalar localResidualSquare = constraint.solveSplitImpulse(infoGlobal); - residualSquare = btMax(residualSquare, localResidualSquare); - } - // face constraints - for (int j = 0; j < m_faceRigidConstraints[i].size(); ++j) - { - btDeformableFaceRigidContactConstraint& constraint = m_faceRigidConstraints[i][j]; - btScalar localResidualSquare = constraint.solveSplitImpulse(infoGlobal); - residualSquare = btMax(residualSquare, localResidualSquare); - } - - } - return residualSquare; -} - -void btDeformableContactProjection::setConstraints() -{ +void btDeformableContactProjection::setConstraints(const btContactSolverInfo& infoGlobal) +{ BT_PROFILE("setConstraints"); for (int i = 0; i < m_softBodies.size(); ++i) { @@ -124,7 +93,7 @@ void btDeformableContactProjection::setConstraints() { if (psb->m_nodes[j].m_im == 0) { - btDeformableStaticConstraint static_constraint(&psb->m_nodes[j]); + btDeformableStaticConstraint static_constraint(&psb->m_nodes[j], infoGlobal); m_staticConstraints[i].push_back(static_constraint); } } @@ -139,7 +108,7 @@ void btDeformableContactProjection::setConstraints() continue; } anchor.m_c1 = anchor.m_cti.m_colObj->getWorldTransform().getBasis() * anchor.m_local; - btDeformableNodeAnchorConstraint constraint(anchor); + btDeformableNodeAnchorConstraint constraint(anchor, infoGlobal); m_nodeAnchorConstraints[i].push_back(constraint); } @@ -152,7 +121,7 @@ void btDeformableContactProjection::setConstraints() { continue; } - btDeformableNodeRigidContactConstraint constraint(contact); + btDeformableNodeRigidContactConstraint constraint(contact, infoGlobal); btVector3 va = constraint.getVa(); btVector3 vb = constraint.getVb(); const btVector3 vr = vb - va; @@ -173,7 +142,7 @@ void btDeformableContactProjection::setConstraints() { continue; } - btDeformableFaceRigidContactConstraint constraint(contact); + btDeformableFaceRigidContactConstraint constraint(contact, infoGlobal, m_useStrainLimiting); btVector3 va = constraint.getVa(); btVector3 vb = constraint.getVb(); const btVector3 vr = vb - va; @@ -184,253 +153,404 @@ void btDeformableContactProjection::setConstraints() m_faceRigidConstraints[i].push_back(constraint); } } - - // set Deformable Face vs. Deformable Node constraint - for (int j = 0; j < psb->m_faceNodeContacts.size(); ++j) - { - const btSoftBody::DeformableFaceNodeContact& contact = psb->m_faceNodeContacts[j]; - - btDeformableFaceNodeContactConstraint constraint(contact); - btVector3 va = constraint.getVa(); - btVector3 vb = constraint.getVb(); - const btVector3 vr = vb - va; - const btScalar dn = btDot(vr, contact.m_normal); - if (dn > -SIMD_EPSILON) - { - m_deformableConstraints[i].push_back(constraint); - } - } } } void btDeformableContactProjection::project(TVStack& x) { - const int dim = 3; - for (int index = 0; index < m_projectionsDict.size(); ++index) - { - btAlignedObjectArray<btVector3>& projectionDirs = *m_projectionsDict.getAtIndex(index); - size_t i = m_projectionsDict.getKeyAtIndex(index).getUid1(); - if (projectionDirs.size() >= dim) - { - // static node - x[i].setZero(); - continue; - } - else if (projectionDirs.size() == 2) - { - btVector3 dir0 = projectionDirs[0]; - btVector3 dir1 = projectionDirs[1]; - btVector3 free_dir = btCross(dir0, dir1); - if (free_dir.safeNorm() < SIMD_EPSILON) - { - x[i] -= x[i].dot(dir0) * dir0; - x[i] -= x[i].dot(dir1) * dir1; - } - else - { - free_dir.normalize(); - x[i] = x[i].dot(free_dir) * free_dir; - } - } - else - { - btAssert(projectionDirs.size() == 1); - btVector3 dir0 = projectionDirs[0]; - x[i] -= x[i].dot(dir0) * dir0; - } - } +#ifndef USE_MGS + const int dim = 3; + for (int index = 0; index < m_projectionsDict.size(); ++index) + { + btAlignedObjectArray<btVector3>& projectionDirs = *m_projectionsDict.getAtIndex(index); + size_t i = m_projectionsDict.getKeyAtIndex(index).getUid1(); + if (projectionDirs.size() >= dim) + { + // static node + x[i].setZero(); + continue; + } + else if (projectionDirs.size() == 2) + { + btVector3 dir0 = projectionDirs[0]; + btVector3 dir1 = projectionDirs[1]; + btVector3 free_dir = btCross(dir0, dir1); + if (free_dir.safeNorm() < SIMD_EPSILON) + { + x[i] -= x[i].dot(dir0) * dir0; + x[i] -= x[i].dot(dir1) * dir1; + } + else + { + free_dir.normalize(); + x[i] = x[i].dot(free_dir) * free_dir; + } + } + else + { + btAssert(projectionDirs.size() == 1); + btVector3 dir0 = projectionDirs[0]; + x[i] -= x[i].dot(dir0) * dir0; + } + } +#else + btReducedVector p(x.size()); + for (int i = 0; i < m_projections.size(); ++i) + { + p += (m_projections[i].dot(x) * m_projections[i]); + } + for (int i = 0; i < p.m_indices.size(); ++i) + { + x[p.m_indices[i]] -= p.m_vecs[i]; + } +#endif } void btDeformableContactProjection::setProjection() { - btAlignedObjectArray<btVector3> units; - units.push_back(btVector3(1,0,0)); - units.push_back(btVector3(0,1,0)); - units.push_back(btVector3(0,0,1)); - for (int i = 0; i < m_softBodies.size(); ++i) - { - btSoftBody* psb = m_softBodies[i]; - if (!psb->isActive()) - { - continue; - } - for (int j = 0; j < m_staticConstraints[i].size(); ++j) - { - int index = m_staticConstraints[i][j].m_node->index; - if (m_projectionsDict.find(index) == NULL) +#ifndef USE_MGS + BT_PROFILE("btDeformableContactProjection::setProjection"); + btAlignedObjectArray<btVector3> units; + units.push_back(btVector3(1,0,0)); + units.push_back(btVector3(0,1,0)); + units.push_back(btVector3(0,0,1)); + for (int i = 0; i < m_softBodies.size(); ++i) + { + btSoftBody* psb = m_softBodies[i]; + if (!psb->isActive()) + { + continue; + } + for (int j = 0; j < m_staticConstraints[i].size(); ++j) + { + int index = m_staticConstraints[i][j].m_node->index; + m_staticConstraints[i][j].m_node->m_penetration = SIMD_INFINITY; + if (m_projectionsDict.find(index) == NULL) + { + m_projectionsDict.insert(index, units); + } + else + { + btAlignedObjectArray<btVector3>& projections = *m_projectionsDict[index]; + for (int k = 0; k < 3; ++k) + { + projections.push_back(units[k]); + } + } + } + for (int j = 0; j < m_nodeAnchorConstraints[i].size(); ++j) + { + int index = m_nodeAnchorConstraints[i][j].m_anchor->m_node->index; + m_nodeAnchorConstraints[i][j].m_anchor->m_node->m_penetration = SIMD_INFINITY; + if (m_projectionsDict.find(index) == NULL) + { + m_projectionsDict.insert(index, units); + } + else + { + btAlignedObjectArray<btVector3>& projections = *m_projectionsDict[index]; + for (int k = 0; k < 3; ++k) + { + projections.push_back(units[k]); + } + } + } + for (int j = 0; j < m_nodeRigidConstraints[i].size(); ++j) + { + int index = m_nodeRigidConstraints[i][j].m_node->index; + m_nodeRigidConstraints[i][j].m_node->m_penetration = -m_nodeRigidConstraints[i][j].getContact()->m_cti.m_offset; + if (m_nodeRigidConstraints[i][j].m_static) + { + if (m_projectionsDict.find(index) == NULL) + { + m_projectionsDict.insert(index, units); + } + else + { + btAlignedObjectArray<btVector3>& projections = *m_projectionsDict[index]; + for (int k = 0; k < 3; ++k) + { + projections.push_back(units[k]); + } + } + } + else + { + if (m_projectionsDict.find(index) == NULL) + { + btAlignedObjectArray<btVector3> projections; + projections.push_back(m_nodeRigidConstraints[i][j].m_normal); + m_projectionsDict.insert(index, projections); + } + else + { + btAlignedObjectArray<btVector3>& projections = *m_projectionsDict[index]; + projections.push_back(m_nodeRigidConstraints[i][j].m_normal); + } + } + } + for (int j = 0; j < m_faceRigidConstraints[i].size(); ++j) + { + const btSoftBody::Face* face = m_faceRigidConstraints[i][j].m_face; + btScalar penetration = -m_faceRigidConstraints[i][j].getContact()->m_cti.m_offset; + for (int k = 0; k < 3; ++k) + { + face->m_n[k]->m_penetration = btMax(face->m_n[k]->m_penetration, penetration); + } + for (int k = 0; k < 3; ++k) + { + btSoftBody::Node* node = face->m_n[k]; + node->m_penetration = true; + int index = node->index; + if (m_faceRigidConstraints[i][j].m_static) + { + if (m_projectionsDict.find(index) == NULL) + { + m_projectionsDict.insert(index, units); + } + else + { + btAlignedObjectArray<btVector3>& projections = *m_projectionsDict[index]; + for (int k = 0; k < 3; ++k) + { + projections.push_back(units[k]); + } + } + } + else + { + if (m_projectionsDict.find(index) == NULL) + { + btAlignedObjectArray<btVector3> projections; + projections.push_back(m_faceRigidConstraints[i][j].m_normal); + m_projectionsDict.insert(index, projections); + } + else + { + btAlignedObjectArray<btVector3>& projections = *m_projectionsDict[index]; + projections.push_back(m_faceRigidConstraints[i][j].m_normal); + } + } + } + } + } +#else + int dof = 0; + for (int i = 0; i < m_softBodies.size(); ++i) + { + dof += m_softBodies[i]->m_nodes.size(); + } + for (int i = 0; i < m_softBodies.size(); ++i) + { + btSoftBody* psb = m_softBodies[i]; + if (!psb->isActive()) + { + continue; + } + for (int j = 0; j < m_staticConstraints[i].size(); ++j) + { + int index = m_staticConstraints[i][j].m_node->index; + m_staticConstraints[i][j].m_node->m_penetration = SIMD_INFINITY; + btAlignedObjectArray<int> indices; + btAlignedObjectArray<btVector3> vecs1,vecs2,vecs3; + indices.push_back(index); + vecs1.push_back(btVector3(1,0,0)); + vecs2.push_back(btVector3(0,1,0)); + vecs3.push_back(btVector3(0,0,1)); + m_projections.push_back(btReducedVector(dof, indices, vecs1)); + m_projections.push_back(btReducedVector(dof, indices, vecs2)); + m_projections.push_back(btReducedVector(dof, indices, vecs3)); + } + + for (int j = 0; j < m_nodeAnchorConstraints[i].size(); ++j) + { + int index = m_nodeAnchorConstraints[i][j].m_anchor->m_node->index; + m_nodeAnchorConstraints[i][j].m_anchor->m_node->m_penetration = SIMD_INFINITY; + btAlignedObjectArray<int> indices; + btAlignedObjectArray<btVector3> vecs1,vecs2,vecs3; + indices.push_back(index); + vecs1.push_back(btVector3(1,0,0)); + vecs2.push_back(btVector3(0,1,0)); + vecs3.push_back(btVector3(0,0,1)); + m_projections.push_back(btReducedVector(dof, indices, vecs1)); + m_projections.push_back(btReducedVector(dof, indices, vecs2)); + m_projections.push_back(btReducedVector(dof, indices, vecs3)); + } + for (int j = 0; j < m_nodeRigidConstraints[i].size(); ++j) + { + int index = m_nodeRigidConstraints[i][j].m_node->index; + m_nodeRigidConstraints[i][j].m_node->m_penetration = -m_nodeRigidConstraints[i][j].getContact()->m_cti.m_offset; + btAlignedObjectArray<int> indices; + indices.push_back(index); + btAlignedObjectArray<btVector3> vecs1,vecs2,vecs3; + if (m_nodeRigidConstraints[i][j].m_static) + { + vecs1.push_back(btVector3(1,0,0)); + vecs2.push_back(btVector3(0,1,0)); + vecs3.push_back(btVector3(0,0,1)); + m_projections.push_back(btReducedVector(dof, indices, vecs1)); + m_projections.push_back(btReducedVector(dof, indices, vecs2)); + m_projections.push_back(btReducedVector(dof, indices, vecs3)); + } + else + { + vecs1.push_back(m_nodeRigidConstraints[i][j].m_normal); + m_projections.push_back(btReducedVector(dof, indices, vecs1)); + } + } + for (int j = 0; j < m_faceRigidConstraints[i].size(); ++j) + { + const btSoftBody::Face* face = m_faceRigidConstraints[i][j].m_face; + btVector3 bary = m_faceRigidConstraints[i][j].getContact()->m_bary; + btScalar penetration = -m_faceRigidConstraints[i][j].getContact()->m_cti.m_offset; + for (int k = 0; k < 3; ++k) + { + face->m_n[k]->m_penetration = btMax(face->m_n[k]->m_penetration, penetration); + } + if (m_faceRigidConstraints[i][j].m_static) { - m_projectionsDict.insert(index, units); - } - else - { - btAlignedObjectArray<btVector3>& projections = *m_projectionsDict[index]; - for (int k = 0; k < 3; ++k) + for (int l = 0; l < 3; ++l) { - projections.push_back(units[k]); - } - } - } - for (int j = 0; j < m_nodeAnchorConstraints[i].size(); ++j) - { - int index = m_nodeAnchorConstraints[i][j].m_anchor->m_node->index; - if (m_projectionsDict.find(index) == NULL) - { - m_projectionsDict.insert(index, units); - } - else - { - btAlignedObjectArray<btVector3>& projections = *m_projectionsDict[index]; - for (int k = 0; k < 3; ++k) - { - projections.push_back(units[k]); - } - } - } - for (int j = 0; j < m_nodeRigidConstraints[i].size(); ++j) - { - int index = m_nodeRigidConstraints[i][j].m_node->index; - if (m_nodeRigidConstraints[i][j].m_static) - { - if (m_projectionsDict.find(index) == NULL) - { - m_projectionsDict.insert(index, units); - } - else - { - btAlignedObjectArray<btVector3>& projections = *m_projectionsDict[index]; + + btReducedVector rv(dof); for (int k = 0; k < 3; ++k) { - projections.push_back(units[k]); + rv.m_indices.push_back(face->m_n[k]->index); + btVector3 v(0,0,0); + v[l] = bary[k]; + rv.m_vecs.push_back(v); + rv.sort(); } + m_projections.push_back(rv); } } else { - if (m_projectionsDict.find(index) == NULL) - { - btAlignedObjectArray<btVector3> projections; - projections.push_back(m_nodeRigidConstraints[i][j].m_normal); - m_projectionsDict.insert(index, projections); - } - else - { - btAlignedObjectArray<btVector3>& projections = *m_projectionsDict[index]; - projections.push_back(m_nodeRigidConstraints[i][j].m_normal); - } - } - } - for (int j = 0; j < m_faceRigidConstraints[i].size(); ++j) - { - const btSoftBody::Face* face = m_faceRigidConstraints[i][j].m_face; - for (int k = 0; k < 3; ++k) - { - const btSoftBody::Node* node = face->m_n[k]; - int index = node->index; - if (m_faceRigidConstraints[i][j].m_static) + btReducedVector rv(dof); + for (int k = 0; k < 3; ++k) { - if (m_projectionsDict.find(index) == NULL) - { - m_projectionsDict.insert(index, units); - } - else - { - btAlignedObjectArray<btVector3>& projections = *m_projectionsDict[index]; - for (int k = 0; k < 3; ++k) - { - projections.push_back(units[k]); - } - } - } - else - { - if (m_projectionsDict.find(index) == NULL) - { - btAlignedObjectArray<btVector3> projections; - projections.push_back(m_faceRigidConstraints[i][j].m_normal); - m_projectionsDict.insert(index, projections); - } - else - { - btAlignedObjectArray<btVector3>& projections = *m_projectionsDict[index]; - projections.push_back(m_faceRigidConstraints[i][j].m_normal); - } + rv.m_indices.push_back(face->m_n[k]->index); + rv.m_vecs.push_back(bary[k] * m_faceRigidConstraints[i][j].m_normal); + rv.sort(); } + m_projections.push_back(rv); } } - for (int j = 0; j < m_deformableConstraints[i].size(); ++j) - { - const btSoftBody::Face* face = m_deformableConstraints[i][j].m_face; - for (int k = 0; k < 3; ++k) - { - const btSoftBody::Node* node = face->m_n[k]; - int index = node->index; - if (m_deformableConstraints[i][j].m_static) - { - if (m_projectionsDict.find(index) == NULL) - { - m_projectionsDict.insert(index, units); - } - else - { - btAlignedObjectArray<btVector3>& projections = *m_projectionsDict[index]; - for (int k = 0; k < 3; ++k) - { - projections.push_back(units[k]); - } - } - } - else - { - if (m_projectionsDict.find(index) == NULL) - { - btAlignedObjectArray<btVector3> projections; - projections.push_back(m_deformableConstraints[i][j].m_normal); - m_projectionsDict.insert(index, projections); - } - else - { - btAlignedObjectArray<btVector3>& projections = *m_projectionsDict[index]; - projections.push_back(m_deformableConstraints[i][j].m_normal); - } - } - } + } + btModifiedGramSchmidt<btReducedVector> mgs(m_projections); + mgs.solve(); + m_projections = mgs.m_out; +#endif +} + +void btDeformableContactProjection::checkConstraints(const TVStack& x) +{ + for (int i = 0; i < m_lagrangeMultipliers.size(); ++i) + { + btVector3 d(0,0,0); + const LagrangeMultiplier& lm = m_lagrangeMultipliers[i]; + for (int j = 0; j < lm.m_num_constraints; ++j) + { + for (int k = 0; k < lm.m_num_nodes; ++k) + { + d[j] += lm.m_weights[k] * x[lm.m_indices[k]].dot(lm.m_dirs[j]); + } + } + printf("d = %f, %f, %f\n",d[0],d[1],d[2]); + } +} + +void btDeformableContactProjection::setLagrangeMultiplier() +{ + for (int i = 0; i < m_softBodies.size(); ++i) + { + btSoftBody* psb = m_softBodies[i]; + if (!psb->isActive()) + { + continue; + } + for (int j = 0; j < m_staticConstraints[i].size(); ++j) + { + int index = m_staticConstraints[i][j].m_node->index; + m_staticConstraints[i][j].m_node->m_penetration = SIMD_INFINITY; + LagrangeMultiplier lm; + lm.m_num_nodes = 1; + lm.m_indices[0] = index; + lm.m_weights[0] = 1.0; + lm.m_num_constraints = 3; + lm.m_dirs[0] = btVector3(1,0,0); + lm.m_dirs[1] = btVector3(0,1,0); + lm.m_dirs[2] = btVector3(0,0,1); + m_lagrangeMultipliers.push_back(lm); + } + for (int j = 0; j < m_nodeAnchorConstraints[i].size(); ++j) + { + int index = m_nodeAnchorConstraints[i][j].m_anchor->m_node->index; + m_nodeAnchorConstraints[i][j].m_anchor->m_node->m_penetration = SIMD_INFINITY; + LagrangeMultiplier lm; + lm.m_num_nodes = 1; + lm.m_indices[0] = index; + lm.m_weights[0] = 1.0; + lm.m_num_constraints = 3; + lm.m_dirs[0] = btVector3(1,0,0); + lm.m_dirs[1] = btVector3(0,1,0); + lm.m_dirs[2] = btVector3(0,0,1); + m_lagrangeMultipliers.push_back(lm); + } + for (int j = 0; j < m_nodeRigidConstraints[i].size(); ++j) + { + int index = m_nodeRigidConstraints[i][j].m_node->index; + m_nodeRigidConstraints[i][j].m_node->m_penetration = -m_nodeRigidConstraints[i][j].getContact()->m_cti.m_offset; + LagrangeMultiplier lm; + lm.m_num_nodes = 1; + lm.m_indices[0] = index; + lm.m_weights[0] = 1.0; + if (m_nodeRigidConstraints[i][j].m_static) + { + lm.m_num_constraints = 3; + lm.m_dirs[0] = btVector3(1,0,0); + lm.m_dirs[1] = btVector3(0,1,0); + lm.m_dirs[2] = btVector3(0,0,1); + } + else + { + lm.m_num_constraints = 1; + lm.m_dirs[0] = m_nodeRigidConstraints[i][j].m_normal; + } + m_lagrangeMultipliers.push_back(lm); + } + for (int j = 0; j < m_faceRigidConstraints[i].size(); ++j) + { + const btSoftBody::Face* face = m_faceRigidConstraints[i][j].m_face; - const btSoftBody::Node* node = m_deformableConstraints[i][j].m_node; - int index = node->index; - if (m_deformableConstraints[i][j].m_static) + btVector3 bary = m_faceRigidConstraints[i][j].getContact()->m_bary; + btScalar penetration = -m_faceRigidConstraints[i][j].getContact()->m_cti.m_offset; + LagrangeMultiplier lm; + lm.m_num_nodes = 3; + for (int k = 0; k<3; ++k) { - if (m_projectionsDict.find(index) == NULL) - { - m_projectionsDict.insert(index, units); - } - else - { - btAlignedObjectArray<btVector3>& projections = *m_projectionsDict[index]; - for (int k = 0; k < 3; ++k) - { - projections.push_back(units[k]); - } - } + face->m_n[k]->m_penetration = btMax(face->m_n[k]->m_penetration, penetration); + lm.m_indices[k] = face->m_n[k]->index; + lm.m_weights[k] = bary[k]; + } + if (m_faceRigidConstraints[i][j].m_static) + { + lm.m_num_constraints = 3; + lm.m_dirs[0] = btVector3(1,0,0); + lm.m_dirs[1] = btVector3(0,1,0); + lm.m_dirs[2] = btVector3(0,0,1); } else { - if (m_projectionsDict.find(index) == NULL) - { - btAlignedObjectArray<btVector3> projections; - projections.push_back(m_deformableConstraints[i][j].m_normal); - m_projectionsDict.insert(index, projections); - } - else - { - btAlignedObjectArray<btVector3>& projections = *m_projectionsDict[index]; - projections.push_back(m_deformableConstraints[i][j].m_normal); - } + lm.m_num_constraints = 1; + lm.m_dirs[0] = m_faceRigidConstraints[i][j].m_normal; } + m_lagrangeMultipliers.push_back(lm); } } } - +// void btDeformableContactProjection::applyDynamicFriction(TVStack& f) { for (int i = 0; i < m_softBodies.size(); ++i) @@ -502,7 +622,12 @@ void btDeformableContactProjection::reinitialize(bool nodeUpdated) m_faceRigidConstraints[i].clear(); m_deformableConstraints[i].clear(); } - m_projectionsDict.clear(); +#ifndef USE_MGS + m_projectionsDict.clear(); +#else + m_projections.clear(); +#endif + m_lagrangeMultipliers.clear(); } diff --git a/thirdparty/bullet/BulletSoftBody/btDeformableContactProjection.h b/thirdparty/bullet/BulletSoftBody/btDeformableContactProjection.h index 3c4490765e..8d7e94d4fb 100644 --- a/thirdparty/bullet/BulletSoftBody/btDeformableContactProjection.h +++ b/thirdparty/bullet/BulletSoftBody/btDeformableContactProjection.h @@ -21,30 +21,37 @@ #include "BulletDynamics/Featherstone/btMultiBodyConstraint.h" #include "btDeformableContactConstraint.h" #include "LinearMath/btHashMap.h" +#include "LinearMath/btReducedVector.h" +#include "LinearMath/btModifiedGramSchmidt.h" #include <vector> + +struct LagrangeMultiplier +{ + int m_num_constraints; // Number of constraints + int m_num_nodes; // Number of nodes in these constraints + btScalar m_weights[3]; // weights of the nodes involved, same size as m_num_nodes + btVector3 m_dirs[3]; // Constraint directions, same size of m_num_constraints; + int m_indices[3]; // indices of the nodes involved, same size as m_num_nodes; +}; + + class btDeformableContactProjection { public: typedef btAlignedObjectArray<btVector3> TVStack; btAlignedObjectArray<btSoftBody *>& m_softBodies; - -// // map from node index to static constraint -// btHashMap<btHashInt, btDeformableStaticConstraint> m_staticConstraints; -// // map from node index to node rigid constraint -// btHashMap<btHashInt, btAlignedObjectArray<btDeformableNodeRigidContactConstraint> > m_nodeRigidConstraints; -// // map from node index to face rigid constraint -// btHashMap<btHashInt, btAlignedObjectArray<btDeformableFaceRigidContactConstraint*> > m_faceRigidConstraints; -// // map from node index to deformable constraint -// btHashMap<btHashInt, btAlignedObjectArray<btDeformableFaceNodeContactConstraint*> > m_deformableConstraints; -// // map from node index to node anchor constraint -// btHashMap<btHashInt, btDeformableNodeAnchorConstraint> m_nodeAnchorConstraints; // all constraints involving face btAlignedObjectArray<btDeformableContactConstraint*> m_allFaceConstraints; - +#ifndef USE_MGS // map from node index to projection directions btHashMap<btHashInt, btAlignedObjectArray<btVector3> > m_projectionsDict; - +#else + btAlignedObjectArray<btReducedVector> m_projections; +#endif + + btAlignedObjectArray<LagrangeMultiplier> m_lagrangeMultipliers; + // map from node index to static constraint btAlignedObjectArray<btAlignedObjectArray<btDeformableStaticConstraint> > m_staticConstraints; // map from node index to node rigid constraint @@ -56,6 +63,8 @@ public: // map from node index to node anchor constraint btAlignedObjectArray<btAlignedObjectArray<btDeformableNodeAnchorConstraint> > m_nodeAnchorConstraints; + bool m_useStrainLimiting; + btDeformableContactProjection(btAlignedObjectArray<btSoftBody *>& softBodies) : m_softBodies(softBodies) { @@ -72,13 +81,10 @@ public: virtual void applyDynamicFriction(TVStack& f); // update and solve the constraints - virtual btScalar update(btCollisionObject** deformableBodies,int numDeformableBodies); - - // solve the position error using split impulse - virtual btScalar solveSplitImpulse(const btContactSolverInfo& infoGlobal); + virtual btScalar update(btCollisionObject** deformableBodies,int numDeformableBodies, const btContactSolverInfo& infoGlobal); // Add constraints to m_constraints. In addition, the constraints that each vertex own are recorded in m_constraintsDict. - virtual void setConstraints(); + virtual void setConstraints(const btContactSolverInfo& infoGlobal); // Set up projections for each vertex by adding the projection direction to virtual void setProjection(); @@ -86,5 +92,9 @@ public: virtual void reinitialize(bool nodeUpdated); virtual void splitImpulseSetup(const btContactSolverInfo& infoGlobal); + + virtual void setLagrangeMultiplier(); + + void checkConstraints(const TVStack& x); }; #endif /* btDeformableContactProjection_h */ diff --git a/thirdparty/bullet/BulletSoftBody/btDeformableCorotatedForce.h b/thirdparty/bullet/BulletSoftBody/btDeformableCorotatedForce.h index c2a26338e7..2d042df729 100644 --- a/thirdparty/bullet/BulletSoftBody/btDeformableCorotatedForce.h +++ b/thirdparty/bullet/BulletSoftBody/btDeformableCorotatedForce.h @@ -114,6 +114,8 @@ public: { } + virtual void buildDampingForceDifferentialDiagonal(btScalar scale, TVStack& diagA){} + virtual btDeformableLagrangianForceType getForceType() { return BT_COROTATED_FORCE; diff --git a/thirdparty/bullet/BulletSoftBody/btDeformableGravityForce.h b/thirdparty/bullet/BulletSoftBody/btDeformableGravityForce.h index 33e5a8564a..13ee3eacb6 100644 --- a/thirdparty/bullet/BulletSoftBody/btDeformableGravityForce.h +++ b/thirdparty/bullet/BulletSoftBody/btDeformableGravityForce.h @@ -50,6 +50,8 @@ public: { } + virtual void buildDampingForceDifferentialDiagonal(btScalar scale, TVStack& diagA){} + virtual void addScaledGravityForce(btScalar scale, TVStack& force) { int numNodes = getNumNodes(); diff --git a/thirdparty/bullet/BulletSoftBody/btDeformableLagrangianForce.h b/thirdparty/bullet/BulletSoftBody/btDeformableLagrangianForce.h index 64e80e23b3..0b6447442d 100644 --- a/thirdparty/bullet/BulletSoftBody/btDeformableLagrangianForce.h +++ b/thirdparty/bullet/BulletSoftBody/btDeformableLagrangianForce.h @@ -26,7 +26,8 @@ enum btDeformableLagrangianForceType BT_MASSSPRING_FORCE = 2, BT_COROTATED_FORCE = 3, BT_NEOHOOKEAN_FORCE = 4, - BT_LINEAR_ELASTICITY_FORCE = 5 + BT_LINEAR_ELASTICITY_FORCE = 5, + BT_MOUSE_PICKING_FORCE = 6 }; static inline double randomDouble(double low, double high) @@ -53,6 +54,9 @@ public: // add damping df virtual void addScaledDampingForceDifferential(btScalar scale, const TVStack& dv, TVStack& df) = 0; + // build diagonal of A matrix + virtual void buildDampingForceDifferentialDiagonal(btScalar scale, TVStack& diagA) = 0; + // add elastic df virtual void addScaledElasticForceDifferential(btScalar scale, const TVStack& dx, TVStack& df) = 0; @@ -85,6 +89,11 @@ public: m_softBodies.push_back(psb); } + virtual void removeSoftBody(btSoftBody* psb) + { + m_softBodies.remove(psb); + } + virtual void setIndices(const btAlignedObjectArray<btSoftBody::Node*>* nodes) { m_nodes = nodes; diff --git a/thirdparty/bullet/BulletSoftBody/btDeformableMassSpringForce.h b/thirdparty/bullet/BulletSoftBody/btDeformableMassSpringForce.h index 54b4e4481d..b128df92cc 100644 --- a/thirdparty/bullet/BulletSoftBody/btDeformableMassSpringForce.h +++ b/thirdparty/bullet/BulletSoftBody/btDeformableMassSpringForce.h @@ -149,6 +149,52 @@ public: } } + virtual void buildDampingForceDifferentialDiagonal(btScalar scale, TVStack& diagA) + { + // implicit damping force differential + for (int i = 0; i < m_softBodies.size(); ++i) + { + btSoftBody* psb = m_softBodies[i]; + if (!psb->isActive()) + { + continue; + } + btScalar scaled_k_damp = m_dampingStiffness * scale; + for (int j = 0; j < psb->m_links.size(); ++j) + { + const btSoftBody::Link& link = psb->m_links[j]; + btSoftBody::Node* node1 = link.m_n[0]; + btSoftBody::Node* node2 = link.m_n[1]; + size_t id1 = node1->index; + size_t id2 = node2->index; + if (m_momentum_conserving) + { + if ((node2->m_x - node1->m_x).norm() > SIMD_EPSILON) + { + btVector3 dir = (node2->m_x - node1->m_x).normalized(); + for (int d = 0; d < 3; ++d) + { + if (node1->m_im > 0) + diagA[id1][d] -= scaled_k_damp * dir[d] * dir[d]; + if (node2->m_im > 0) + diagA[id2][d] -= scaled_k_damp * dir[d] * dir[d]; + } + } + } + else + { + for (int d = 0; d < 3; ++d) + { + if (node1->m_im > 0) + diagA[id1][d] -= scaled_k_damp; + if (node2->m_im > 0) + diagA[id2][d] -= scaled_k_damp; + } + } + } + } + } + virtual double totalElasticEnergy(btScalar dt) { double energy = 0; diff --git a/thirdparty/bullet/BulletSoftBody/btDeformableMousePickingForce.h b/thirdparty/bullet/BulletSoftBody/btDeformableMousePickingForce.h new file mode 100644 index 0000000000..07c10935f4 --- /dev/null +++ b/thirdparty/bullet/BulletSoftBody/btDeformableMousePickingForce.h @@ -0,0 +1,145 @@ +/* + Written by Xuchen Han <xuchenhan2015@u.northwestern.edu> + + Bullet Continuous Collision Detection and Physics Library + Copyright (c) 2019 Google Inc. http://bulletphysics.org + This software is provided 'as-is', without any express or implied warranty. + In no event will the authors be held liable for any damages arising from the use of this software. + Permission is granted to anyone to use this software for any purpose, + including commercial applications, and to alter it and redistribute it freely, + subject to the following restrictions: + 1. The origin of this software must not be misrepresented; you must not claim that you wrote the original software. If you use this software in a product, an acknowledgment in the product documentation would be appreciated but is not required. + 2. Altered source versions must be plainly marked as such, and must not be misrepresented as being the original software. + 3. This notice may not be removed or altered from any source distribution. + */ + +#ifndef BT_MOUSE_PICKING_FORCE_H +#define BT_MOUSE_PICKING_FORCE_H + +#include "btDeformableLagrangianForce.h" + +class btDeformableMousePickingForce : public btDeformableLagrangianForce +{ + // If true, the damping force will be in the direction of the spring + // If false, the damping force will be in the direction of the velocity + btScalar m_elasticStiffness, m_dampingStiffness; + const btSoftBody::Face& m_face; + btVector3 m_mouse_pos; + btScalar m_maxForce; +public: + typedef btAlignedObjectArray<btVector3> TVStack; + btDeformableMousePickingForce(btScalar k, btScalar d, const btSoftBody::Face& face, btVector3 mouse_pos, btScalar maxForce = 0.3) : m_elasticStiffness(k), m_dampingStiffness(d), m_face(face), m_mouse_pos(mouse_pos), m_maxForce(maxForce) + { + } + + virtual void addScaledForces(btScalar scale, TVStack& force) + { + addScaledDampingForce(scale, force); + addScaledElasticForce(scale, force); + } + + virtual void addScaledExplicitForce(btScalar scale, TVStack& force) + { + addScaledElasticForce(scale, force); + } + + virtual void addScaledDampingForce(btScalar scale, TVStack& force) + { + for (int i = 0; i < 3; ++i) + { + btVector3 v_diff = m_face.m_n[i]->m_v; + btVector3 scaled_force = scale * m_dampingStiffness * v_diff; + if ((m_face.m_n[i]->m_x - m_mouse_pos).norm() > SIMD_EPSILON) + { + btVector3 dir = (m_face.m_n[i]->m_x - m_mouse_pos).normalized(); + scaled_force = scale * m_dampingStiffness * v_diff.dot(dir) * dir; + } + force[m_face.m_n[i]->index] -= scaled_force; + } + } + + virtual void addScaledElasticForce(btScalar scale, TVStack& force) + { + btScalar scaled_stiffness = scale * m_elasticStiffness; + for (int i = 0; i < 3; ++i) + { + btVector3 dir = (m_face.m_n[i]->m_q - m_mouse_pos); + btVector3 scaled_force = scaled_stiffness * dir; + if (scaled_force.safeNorm() > m_maxForce) + { + scaled_force.safeNormalize(); + scaled_force *= m_maxForce; + } + force[m_face.m_n[i]->index] -= scaled_force; + } + } + + virtual void addScaledDampingForceDifferential(btScalar scale, const TVStack& dv, TVStack& df) + { + btScalar scaled_k_damp = m_dampingStiffness * scale; + for (int i = 0; i < 3; ++i) + { + btVector3 local_scaled_df = scaled_k_damp * dv[m_face.m_n[i]->index]; + if ((m_face.m_n[i]->m_x - m_mouse_pos).norm() > SIMD_EPSILON) + { + btVector3 dir = (m_face.m_n[i]->m_x - m_mouse_pos).normalized(); + local_scaled_df= scaled_k_damp * dv[m_face.m_n[i]->index].dot(dir) * dir; + } + df[m_face.m_n[i]->index] -= local_scaled_df; + } + } + + virtual void buildDampingForceDifferentialDiagonal(btScalar scale, TVStack& diagA){} + + virtual double totalElasticEnergy(btScalar dt) + { + double energy = 0; + for (int i = 0; i < 3; ++i) + { + btVector3 dir = (m_face.m_n[i]->m_q - m_mouse_pos); + btVector3 scaled_force = m_elasticStiffness * dir; + if (scaled_force.safeNorm() > m_maxForce) + { + scaled_force.safeNormalize(); + scaled_force *= m_maxForce; + } + energy += 0.5 * scaled_force.dot(dir); + } + return energy; + } + + virtual double totalDampingEnergy(btScalar dt) + { + double energy = 0; + for (int i = 0; i < 3; ++i) + { + btVector3 v_diff = m_face.m_n[i]->m_v; + btVector3 scaled_force = m_dampingStiffness * v_diff; + if ((m_face.m_n[i]->m_x - m_mouse_pos).norm() > SIMD_EPSILON) + { + btVector3 dir = (m_face.m_n[i]->m_x - m_mouse_pos).normalized(); + scaled_force = m_dampingStiffness * v_diff.dot(dir) * dir; + } + energy -= scaled_force.dot(m_face.m_n[i]->m_v) / dt; + } + return energy; + } + + virtual void addScaledElasticForceDifferential(btScalar scale, const TVStack& dx, TVStack& df) + { + //TODO + } + + void setMousePos(const btVector3& p) + { + m_mouse_pos = p; + } + + virtual btDeformableLagrangianForceType getForceType() + { + return BT_MOUSE_PICKING_FORCE; + } + +}; + +#endif /* btMassSpring_h */ diff --git a/thirdparty/bullet/BulletSoftBody/btDeformableMultiBodyConstraintSolver.cpp b/thirdparty/bullet/BulletSoftBody/btDeformableMultiBodyConstraintSolver.cpp index 06f95d69f6..c8cc47923e 100644 --- a/thirdparty/bullet/BulletSoftBody/btDeformableMultiBodyConstraintSolver.cpp +++ b/thirdparty/bullet/BulletSoftBody/btDeformableMultiBodyConstraintSolver.cpp @@ -32,7 +32,7 @@ btScalar btDeformableMultiBodyConstraintSolver::solveDeformableGroupIterations(b m_leastSquaresResidual = solveSingleIteration(iteration, bodies, numBodies, manifoldPtr, numManifolds, constraints, numConstraints, infoGlobal, debugDrawer); // solver body velocity -> rigid body velocity solverBodyWriteBack(infoGlobal); - btScalar deformableResidual = m_deformableSolver->solveContactConstraints(deformableBodies,numDeformableBodies); + btScalar deformableResidual = m_deformableSolver->solveContactConstraints(deformableBodies,numDeformableBodies, infoGlobal); // update rigid body velocity in rigid/deformable contact m_leastSquaresResidual = btMax(m_leastSquaresResidual, deformableResidual); // solver body velocity <- rigid body velocity @@ -112,7 +112,7 @@ void btDeformableMultiBodyConstraintSolver::solveGroupCacheFriendlySplitImpulseI if (infoGlobal.m_splitImpulse) { { - m_deformableSolver->splitImpulseSetup(infoGlobal); +// m_deformableSolver->splitImpulseSetup(infoGlobal); for (iteration = 0; iteration < infoGlobal.m_numIterations; iteration++) { btScalar leastSquaresResidual = 0.f; @@ -127,8 +127,8 @@ void btDeformableMultiBodyConstraintSolver::solveGroupCacheFriendlySplitImpulseI leastSquaresResidual = btMax(leastSquaresResidual, residual * residual); } // solve the position correction between deformable and rigid/multibody - btScalar residual = m_deformableSolver->solveSplitImpulse(infoGlobal); - leastSquaresResidual = btMax(leastSquaresResidual, residual * residual); +// btScalar residual = m_deformableSolver->solveSplitImpulse(infoGlobal); +// leastSquaresResidual = btMax(leastSquaresResidual, residual * residual); } if (leastSquaresResidual <= infoGlobal.m_leastSquaresResidualThreshold || iteration >= (infoGlobal.m_numIterations - 1)) { diff --git a/thirdparty/bullet/BulletSoftBody/btDeformableMultiBodyDynamicsWorld.cpp b/thirdparty/bullet/BulletSoftBody/btDeformableMultiBodyDynamicsWorld.cpp index 618e5c0d7b..6b742978ef 100644 --- a/thirdparty/bullet/BulletSoftBody/btDeformableMultiBodyDynamicsWorld.cpp +++ b/thirdparty/bullet/BulletSoftBody/btDeformableMultiBodyDynamicsWorld.cpp @@ -22,7 +22,6 @@ Call internalStepSimulation multiple times, to achieve 240Hz (4 steps of 60Hz). 2. Detect discrete collisions between rigid and deformable bodies at position x_{n+1}^* = x_n + dt * v_{n+1}^*. 3a. Solve all constraints, including LCP. Contact, position correction due to numerical drift, friction, and anchors for deformable. - TODO: add option for positional drift correction (using vel_target += erp * pos_error/dt 3b. 5 Newton steps (multiple step). Conjugent Gradient solves linear system. Deformable Damping: Then velocities of deformable bodies v_{n+1} are solved in M(v_{n+1} - v_{n+1}^*) = damping_force * dt / mass, @@ -58,14 +57,20 @@ m_deformableBodySolver(deformableBodySolver), m_solverCallback(0) m_sbi.water_density = 0; m_sbi.water_offset = 0; m_sbi.water_normal = btVector3(0, 0, 0); - m_sbi.m_gravity.setValue(0, -10, 0); + m_sbi.m_gravity.setValue(0, -9.8, 0); m_internalTime = 0.0; m_implicit = false; m_lineSearch = false; - m_selfCollision = true; + m_useProjection = true; + m_ccdIterations = 5; m_solverDeformableBodyIslandCallback = new DeformableBodyInplaceSolverIslandCallback(constraintSolver, dispatcher); } +btDeformableMultiBodyDynamicsWorld::~btDeformableMultiBodyDynamicsWorld() +{ + delete m_solverDeformableBodyIslandCallback; +} + void btDeformableMultiBodyDynamicsWorld::internalSingleStepSimulation(btScalar timeStep) { BT_PROFILE("internalSingleStepSimulation"); @@ -74,20 +79,16 @@ void btDeformableMultiBodyDynamicsWorld::internalSingleStepSimulation(btScalar t (*m_internalPreTickCallback)(this, timeStep); } reinitialize(timeStep); + // add gravity to velocity of rigid and multi bodys applyRigidBodyGravity(timeStep); ///apply gravity and explicit force to velocity, predict motion predictUnconstraintMotion(timeStep); - ///perform collision detection + ///perform collision detection that involves rigid/multi bodies btMultiBodyDynamicsWorld::performDiscreteCollisionDetection(); - if (m_selfCollision) - { - softBodySelfCollision(); - } - btMultiBodyDynamicsWorld::calculateSimulationIslands(); beforeSolverCallbacks(timeStep); @@ -96,7 +97,13 @@ void btDeformableMultiBodyDynamicsWorld::internalSingleStepSimulation(btScalar t solveConstraints(timeStep); afterSolverCallbacks(timeStep); - + + performDeformableCollisionDetection(); + + applyRepulsionForce(timeStep); + + performGeometricCollisions(timeStep); + integrateTransforms(timeStep); ///update vehicle simulation @@ -107,6 +114,27 @@ void btDeformableMultiBodyDynamicsWorld::internalSingleStepSimulation(btScalar t // /////////////////////////////// } +void btDeformableMultiBodyDynamicsWorld::performDeformableCollisionDetection() +{ + for (int i = 0; i < m_softBodies.size(); ++i) + { + m_softBodies[i]->m_softSoftCollision = true; + } + + for (int i = 0; i < m_softBodies.size(); ++i) + { + for (int j = i; j < m_softBodies.size(); ++j) + { + m_softBodies[i]->defaultCollisionHandler(m_softBodies[j]); + } + } + + for (int i = 0; i < m_softBodies.size(); ++i) + { + m_softBodies[i]->m_softSoftCollision = false; + } +} + void btDeformableMultiBodyDynamicsWorld::updateActivationState(btScalar timeStep) { for (int i = 0; i < m_softBodies.size(); i++) @@ -131,10 +159,106 @@ void btDeformableMultiBodyDynamicsWorld::updateActivationState(btScalar timeStep btMultiBodyDynamicsWorld::updateActivationState(timeStep); } +void btDeformableMultiBodyDynamicsWorld::applyRepulsionForce(btScalar timeStep) +{ + BT_PROFILE("btDeformableMultiBodyDynamicsWorld::applyRepulsionForce"); + for (int i = 0; i < m_softBodies.size(); i++) + { + btSoftBody* psb = m_softBodies[i]; + if (psb->isActive()) + { + psb->applyRepulsionForce(timeStep, true); + } + } +} + +void btDeformableMultiBodyDynamicsWorld::performGeometricCollisions(btScalar timeStep) +{ + BT_PROFILE("btDeformableMultiBodyDynamicsWorld::performGeometricCollisions"); + // refit the BVH tree for CCD + for (int i = 0; i < m_softBodies.size(); ++i) + { + btSoftBody* psb = m_softBodies[i]; + if (psb->isActive()) + { + m_softBodies[i]->updateFaceTree(true, false); + m_softBodies[i]->updateNodeTree(true, false); + for (int j = 0; j < m_softBodies[i]->m_faces.size(); ++j) + { + btSoftBody::Face& f = m_softBodies[i]->m_faces[j]; + f.m_n0 = (f.m_n[1]->m_x - f.m_n[0]->m_x).cross(f.m_n[2]->m_x - f.m_n[0]->m_x); + } + } + } + + // clear contact points & update DBVT + for (int r = 0; r < m_ccdIterations; ++r) + { + for (int i = 0; i < m_softBodies.size(); ++i) + { + btSoftBody* psb = m_softBodies[i]; + if (psb->isActive()) + { + // clear contact points in the previous iteration + psb->m_faceNodeContacts.clear(); + + // update m_q and normals for CCD calculation + for (int j = 0; j < psb->m_nodes.size(); ++j) + { + psb->m_nodes[j].m_q = psb->m_nodes[j].m_x + timeStep * psb->m_nodes[j].m_v; + } + for (int j = 0; j < psb->m_faces.size(); ++j) + { + btSoftBody::Face& f = psb->m_faces[j]; + f.m_n1 = (f.m_n[1]->m_q - f.m_n[0]->m_q).cross(f.m_n[2]->m_q - f.m_n[0]->m_q); + f.m_vn = (f.m_n[1]->m_v - f.m_n[0]->m_v).cross(f.m_n[2]->m_v - f.m_n[0]->m_v) * timeStep * timeStep; + } + } + } + + // apply CCD to register new contact points + for (int i = 0; i < m_softBodies.size(); ++i) + { + for (int j = i; j < m_softBodies.size(); ++j) + { + btSoftBody* psb1 = m_softBodies[i]; + btSoftBody* psb2 = m_softBodies[j]; + if (psb1->isActive() && psb2->isActive()) + { + m_softBodies[i]->geometricCollisionHandler(m_softBodies[j]); + } + } + } + + int penetration_count = 0; + for (int i = 0; i < m_softBodies.size(); ++i) + { + btSoftBody* psb = m_softBodies[i]; + if (psb->isActive()) + { + penetration_count += psb->m_faceNodeContacts.size(); + } + } + if (penetration_count == 0) + { + break; + } + + // apply inelastic impulse + for (int i = 0; i < m_softBodies.size(); ++i) + { + btSoftBody* psb = m_softBodies[i]; + if (psb->isActive()) + { + psb->applyRepulsionForce(timeStep, false); + } + } + } +} void btDeformableMultiBodyDynamicsWorld::softBodySelfCollision() { - m_deformableBodySolver->updateSoftBodies(); + BT_PROFILE("btDeformableMultiBodyDynamicsWorld::softBodySelfCollision"); for (int i = 0; i < m_softBodies.size(); i++) { btSoftBody* psb = m_softBodies[i]; @@ -192,8 +316,6 @@ void btDeformableMultiBodyDynamicsWorld::integrateTransforms(btScalar timeStep) } } node.m_x = node.m_x + timeStep * node.m_v; - node.m_v -= node.m_vsplit; - node.m_vsplit.setZero(); node.m_q = node.m_x; node.m_vn = node.m_v; } @@ -255,6 +377,7 @@ void btDeformableMultiBodyDynamicsWorld::integrateTransforms(btScalar timeStep) void btDeformableMultiBodyDynamicsWorld::solveConstraints(btScalar timeStep) { + BT_PROFILE("btDeformableMultiBodyDynamicsWorld::solveConstraints"); // save v_{n+1}^* velocity after explicit forces m_deformableBodySolver->backupVelocity(); @@ -265,8 +388,11 @@ void btDeformableMultiBodyDynamicsWorld::solveConstraints(btScalar timeStep) solveContactConstraints(); // set up the directions in which the velocity does not change in the momentum solve - m_deformableBodySolver->m_objective->m_projection.setProjection(); - + if (m_useProjection) + m_deformableBodySolver->m_objective->m_projection.setProjection(); + else + m_deformableBodySolver->m_objective->m_projection.setLagrangeMultiplier(); + // for explicit scheme, m_backupVelocity = v_{n+1}^* // for implicit scheme, m_backupVelocity = v_n // Here, set dv = v_{n+1} - v_n for nodes in contact @@ -280,7 +406,7 @@ void btDeformableMultiBodyDynamicsWorld::solveConstraints(btScalar timeStep) void btDeformableMultiBodyDynamicsWorld::setupConstraints() { // set up constraints between multibody and deformable bodies - m_deformableBodySolver->setConstraints(); + m_deformableBodySolver->setConstraints(m_solverInfo); // set up constraints among multibodies { @@ -403,6 +529,17 @@ void btDeformableMultiBodyDynamicsWorld::reinitialize(btScalar timeStep) dispatchInfo.m_stepCount = 0; dispatchInfo.m_debugDraw = btMultiBodyDynamicsWorld::getDebugDrawer(); btMultiBodyDynamicsWorld::getSolverInfo().m_timeStep = timeStep; + if (m_useProjection) + { + m_deformableBodySolver->m_useProjection = true; +// m_deformableBodySolver->m_objective->m_projection.m_useStrainLimiting = true; + m_deformableBodySolver->m_objective->m_preconditioner = m_deformableBodySolver->m_objective->m_massPreconditioner; + } + else + { + m_deformableBodySolver->m_objective->m_preconditioner = m_deformableBodySolver->m_objective->m_KKTPreconditioner; + } + } @@ -566,6 +703,24 @@ void btDeformableMultiBodyDynamicsWorld::addForce(btSoftBody* psb, btDeformableL } } +void btDeformableMultiBodyDynamicsWorld::removeForce(btSoftBody* psb, btDeformableLagrangianForce* force) +{ + btAlignedObjectArray<btDeformableLagrangianForce*>& forces = m_deformableBodySolver->m_objective->m_lf; + int removed_index = -1; + for (int i = 0; i < forces.size(); ++i) + { + if (forces[i]->getForceType() == force->getForceType()) + { + forces[i]->removeSoftBody(psb); + if (forces[i]->m_softBodies.size() == 0) + removed_index = i; + break; + } + } + if (removed_index >= 0) + forces.removeAtIndex(removed_index); +} + void btDeformableMultiBodyDynamicsWorld::removeSoftBody(btSoftBody* body) { m_softBodies.remove(body); diff --git a/thirdparty/bullet/BulletSoftBody/btDeformableMultiBodyDynamicsWorld.h b/thirdparty/bullet/BulletSoftBody/btDeformableMultiBodyDynamicsWorld.h index 7630385767..76b58a0378 100644 --- a/thirdparty/bullet/BulletSoftBody/btDeformableMultiBodyDynamicsWorld.h +++ b/thirdparty/bullet/BulletSoftBody/btDeformableMultiBodyDynamicsWorld.h @@ -46,10 +46,10 @@ class btDeformableMultiBodyDynamicsWorld : public btMultiBodyDynamicsWorld bool m_drawClusterTree; btSoftBodyWorldInfo m_sbi; btScalar m_internalTime; - int m_contact_iterations; + int m_ccdIterations; bool m_implicit; bool m_lineSearch; - bool m_selfCollision; + bool m_useProjection; DeformableBodyInplaceSolverIslandCallback* m_solverDeformableBodyIslandCallback; typedef void (*btSolverCallback)(btScalar time, btDeformableMultiBodyDynamicsWorld* world); @@ -80,9 +80,7 @@ public: m_solverCallback = cb; } - virtual ~btDeformableMultiBodyDynamicsWorld() - { - } + virtual ~btDeformableMultiBodyDynamicsWorld(); virtual btMultiBodyDynamicsWorld* getMultiBodyDynamicsWorld() { @@ -133,6 +131,8 @@ public: void addForce(btSoftBody* psb, btDeformableLagrangianForce* force); + void removeForce(btSoftBody* psb, btDeformableLagrangianForce* force); + void removeSoftBody(btSoftBody* body); void removeCollisionObject(btCollisionObject* collisionObject); @@ -142,6 +142,8 @@ public: void setupConstraints(); + void performDeformableCollisionDetection(); + void solveMultiBodyConstraints(); void solveContactConstraints(); @@ -159,7 +161,151 @@ public: { m_lineSearch = lineSearch; } + + void applyRepulsionForce(btScalar timeStep); + + void performGeometricCollisions(btScalar timeStep); + + struct btDeformableSingleRayCallback : public btBroadphaseRayCallback + { + btVector3 m_rayFromWorld; + btVector3 m_rayToWorld; + btTransform m_rayFromTrans; + btTransform m_rayToTrans; + btVector3 m_hitNormal; + + const btDeformableMultiBodyDynamicsWorld* m_world; + btCollisionWorld::RayResultCallback& m_resultCallback; + + btDeformableSingleRayCallback(const btVector3& rayFromWorld, const btVector3& rayToWorld, const btDeformableMultiBodyDynamicsWorld* world, btCollisionWorld::RayResultCallback& resultCallback) + : m_rayFromWorld(rayFromWorld), + m_rayToWorld(rayToWorld), + m_world(world), + m_resultCallback(resultCallback) + { + m_rayFromTrans.setIdentity(); + m_rayFromTrans.setOrigin(m_rayFromWorld); + m_rayToTrans.setIdentity(); + m_rayToTrans.setOrigin(m_rayToWorld); + + btVector3 rayDir = (rayToWorld - rayFromWorld); + + rayDir.normalize(); + ///what about division by zero? --> just set rayDirection[i] to INF/1e30 + m_rayDirectionInverse[0] = rayDir[0] == btScalar(0.0) ? btScalar(1e30) : btScalar(1.0) / rayDir[0]; + m_rayDirectionInverse[1] = rayDir[1] == btScalar(0.0) ? btScalar(1e30) : btScalar(1.0) / rayDir[1]; + m_rayDirectionInverse[2] = rayDir[2] == btScalar(0.0) ? btScalar(1e30) : btScalar(1.0) / rayDir[2]; + m_signs[0] = m_rayDirectionInverse[0] < 0.0; + m_signs[1] = m_rayDirectionInverse[1] < 0.0; + m_signs[2] = m_rayDirectionInverse[2] < 0.0; + + m_lambda_max = rayDir.dot(m_rayToWorld - m_rayFromWorld); + } + + virtual bool process(const btBroadphaseProxy* proxy) + { + ///terminate further ray tests, once the closestHitFraction reached zero + if (m_resultCallback.m_closestHitFraction == btScalar(0.f)) + return false; + + btCollisionObject* collisionObject = (btCollisionObject*)proxy->m_clientObject; + + //only perform raycast if filterMask matches + if (m_resultCallback.needsCollision(collisionObject->getBroadphaseHandle())) + { + //RigidcollisionObject* collisionObject = ctrl->GetRigidcollisionObject(); + //btVector3 collisionObjectAabbMin,collisionObjectAabbMax; +#if 0 +#ifdef RECALCULATE_AABB + btVector3 collisionObjectAabbMin,collisionObjectAabbMax; + collisionObject->getCollisionShape()->getAabb(collisionObject->getWorldTransform(),collisionObjectAabbMin,collisionObjectAabbMax); +#else + //getBroadphase()->getAabb(collisionObject->getBroadphaseHandle(),collisionObjectAabbMin,collisionObjectAabbMax); + const btVector3& collisionObjectAabbMin = collisionObject->getBroadphaseHandle()->m_aabbMin; + const btVector3& collisionObjectAabbMax = collisionObject->getBroadphaseHandle()->m_aabbMax; +#endif +#endif + //btScalar hitLambda = m_resultCallback.m_closestHitFraction; + //culling already done by broadphase + //if (btRayAabb(m_rayFromWorld,m_rayToWorld,collisionObjectAabbMin,collisionObjectAabbMax,hitLambda,m_hitNormal)) + { + m_world->rayTestSingle(m_rayFromTrans, m_rayToTrans, + collisionObject, + collisionObject->getCollisionShape(), + collisionObject->getWorldTransform(), + m_resultCallback); + } + } + return true; + } + }; + + + void rayTest(const btVector3& rayFromWorld, const btVector3& rayToWorld, RayResultCallback& resultCallback) const + { + BT_PROFILE("rayTest"); + /// use the broadphase to accelerate the search for objects, based on their aabb + /// and for each object with ray-aabb overlap, perform an exact ray test + btDeformableSingleRayCallback rayCB(rayFromWorld, rayToWorld, this, resultCallback); + +#ifndef USE_BRUTEFORCE_RAYBROADPHASE + m_broadphasePairCache->rayTest(rayFromWorld, rayToWorld, rayCB); +#else + for (int i = 0; i < this->getNumCollisionObjects(); i++) + { + rayCB.process(m_collisionObjects[i]->getBroadphaseHandle()); + } +#endif //USE_BRUTEFORCE_RAYBROADPHASE + } + + void rayTestSingle(const btTransform& rayFromTrans, const btTransform& rayToTrans, + btCollisionObject* collisionObject, + const btCollisionShape* collisionShape, + const btTransform& colObjWorldTransform, + RayResultCallback& resultCallback) const + { + if (collisionShape->isSoftBody()) + { + btSoftBody* softBody = btSoftBody::upcast(collisionObject); + if (softBody) + { + btSoftBody::sRayCast softResult; + if (softBody->rayFaceTest(rayFromTrans.getOrigin(), rayToTrans.getOrigin(), softResult)) + { + if (softResult.fraction <= resultCallback.m_closestHitFraction) + { + btCollisionWorld::LocalShapeInfo shapeInfo; + shapeInfo.m_shapePart = 0; + shapeInfo.m_triangleIndex = softResult.index; + // get the normal + btVector3 rayDir = rayToTrans.getOrigin() - rayFromTrans.getOrigin(); + btVector3 normal = -rayDir; + normal.normalize(); + { + normal = softBody->m_faces[softResult.index].m_normal; + if (normal.dot(rayDir) > 0) + { + // normal always point toward origin of the ray + normal = -normal; + } + } + + btCollisionWorld::LocalRayResult rayResult(collisionObject, + &shapeInfo, + normal, + softResult.fraction); + bool normalInWorldSpace = true; + resultCallback.addSingleResult(rayResult, normalInWorldSpace); + } + } + } + } + else + { + btCollisionWorld::rayTestSingle(rayFromTrans, rayToTrans, collisionObject, collisionShape, colObjWorldTransform, resultCallback); + } + } }; #endif //BT_DEFORMABLE_MULTIBODY_DYNAMICS_WORLD_H diff --git a/thirdparty/bullet/BulletSoftBody/btDeformableNeoHookeanForce.h b/thirdparty/bullet/BulletSoftBody/btDeformableNeoHookeanForce.h index 3d06e304d2..d89bc4aca4 100644 --- a/thirdparty/bullet/BulletSoftBody/btDeformableNeoHookeanForce.h +++ b/thirdparty/bullet/BulletSoftBody/btDeformableNeoHookeanForce.h @@ -24,21 +24,65 @@ class btDeformableNeoHookeanForce : public btDeformableLagrangianForce { public: typedef btAlignedObjectArray<btVector3> TVStack; - btScalar m_mu, m_lambda; + btScalar m_mu, m_lambda; // Lame Parameters + btScalar m_E, m_nu; // Young's modulus and Poisson ratio btScalar m_mu_damp, m_lambda_damp; btDeformableNeoHookeanForce(): m_mu(1), m_lambda(1) { btScalar damping = 0.05; m_mu_damp = damping * m_mu; m_lambda_damp = damping * m_lambda; + updateYoungsModulusAndPoissonRatio(); } btDeformableNeoHookeanForce(btScalar mu, btScalar lambda, btScalar damping = 0.05): m_mu(mu), m_lambda(lambda) { m_mu_damp = damping * m_mu; m_lambda_damp = damping * m_lambda; + updateYoungsModulusAndPoissonRatio(); } - + + void updateYoungsModulusAndPoissonRatio() + { + // conversion from Lame Parameters to Young's modulus and Poisson ratio + // https://en.wikipedia.org/wiki/Lam%C3%A9_parameters + m_E = m_mu * (3*m_lambda + 2*m_mu)/(m_lambda + m_mu); + m_nu = m_lambda * 0.5 / (m_mu + m_lambda); + } + + void updateLameParameters() + { + // conversion from Young's modulus and Poisson ratio to Lame Parameters + // https://en.wikipedia.org/wiki/Lam%C3%A9_parameters + m_mu = m_E * 0.5 / (1 + m_nu); + m_lambda = m_E * m_nu / ((1 + m_nu) * (1- 2*m_nu)); + } + + void setYoungsModulus(btScalar E) + { + m_E = E; + updateLameParameters(); + } + + void setPoissonRatio(btScalar nu) + { + m_nu = nu; + updateLameParameters(); + } + + void setDamping(btScalar damping) + { + m_mu_damp = damping * m_mu; + m_lambda_damp = damping * m_lambda; + } + + void setLameParameters(btScalar mu, btScalar lambda) + { + m_mu = mu; + m_lambda = lambda; + updateYoungsModulusAndPoissonRatio(); + } + virtual void addScaledForces(btScalar scale, TVStack& force) { addScaledDampingForce(scale, force); @@ -269,6 +313,8 @@ public: } } + virtual void buildDampingForceDifferentialDiagonal(btScalar scale, TVStack& diagA){} + virtual void addScaledElasticForceDifferential(btScalar scale, const TVStack& dx, TVStack& df) { int numNodes = getNumNodes(); diff --git a/thirdparty/bullet/BulletSoftBody/btPreconditioner.h b/thirdparty/bullet/BulletSoftBody/btPreconditioner.h index d712420381..c2db448ef8 100644 --- a/thirdparty/bullet/BulletSoftBody/btPreconditioner.h +++ b/thirdparty/bullet/BulletSoftBody/btPreconditioner.h @@ -68,12 +68,221 @@ public: virtual void operator()(const TVStack& x, TVStack& b) { btAssert(b.size() == x.size()); - btAssert(m_inv_mass.size() == x.size()); - for (int i = 0; i < b.size(); ++i) + btAssert(m_inv_mass.size() <= x.size()); + for (int i = 0; i < m_inv_mass.size(); ++i) { b[i] = x[i] * m_inv_mass[i]; } + for (int i = m_inv_mass.size(); i < b.size(); ++i) + { + b[i] = x[i]; + } + } +}; + + +class KKTPreconditioner : public Preconditioner +{ + const btAlignedObjectArray<btSoftBody *>& m_softBodies; + const btDeformableContactProjection& m_projections; + const btAlignedObjectArray<btDeformableLagrangianForce*>& m_lf; + TVStack m_inv_A, m_inv_S; + const btScalar& m_dt; + const bool& m_implicit; +public: + KKTPreconditioner(const btAlignedObjectArray<btSoftBody *>& softBodies, const btDeformableContactProjection& projections, const btAlignedObjectArray<btDeformableLagrangianForce*>& lf, const btScalar& dt, const bool& implicit) + : m_softBodies(softBodies) + , m_projections(projections) + , m_lf(lf) + , m_dt(dt) + , m_implicit(implicit) + { + } + + virtual void reinitialize(bool nodeUpdated) + { + if (nodeUpdated) + { + int num_nodes = 0; + for (int i = 0; i < m_softBodies.size(); ++i) + { + btSoftBody* psb = m_softBodies[i]; + num_nodes += psb->m_nodes.size(); + } + m_inv_A.resize(num_nodes); + } + buildDiagonalA(m_inv_A); + for (int i = 0; i < m_inv_A.size(); ++i) + { +// printf("A[%d] = %f, %f, %f \n", i, m_inv_A[i][0], m_inv_A[i][1], m_inv_A[i][2]); + for (int d = 0; d < 3; ++d) + { + m_inv_A[i][d] = (m_inv_A[i][d] == 0) ? 0.0 : 1.0/ m_inv_A[i][d]; + } + } + m_inv_S.resize(m_projections.m_lagrangeMultipliers.size()); +// printf("S.size() = %d \n", m_inv_S.size()); + buildDiagonalS(m_inv_A, m_inv_S); + for (int i = 0; i < m_inv_S.size(); ++i) + { +// printf("S[%d] = %f, %f, %f \n", i, m_inv_S[i][0], m_inv_S[i][1], m_inv_S[i][2]); + for (int d = 0; d < 3; ++d) + { + m_inv_S[i][d] = (m_inv_S[i][d] == 0) ? 0.0 : 1.0/ m_inv_S[i][d]; + } + } + } + + void buildDiagonalA(TVStack& diagA) const + { + size_t counter = 0; + for (int i = 0; i < m_softBodies.size(); ++i) + { + btSoftBody* psb = m_softBodies[i]; + for (int j = 0; j < psb->m_nodes.size(); ++j) + { + const btSoftBody::Node& node = psb->m_nodes[j]; + diagA[counter] = (node.m_im == 0) ? btVector3(0,0,0) : btVector3(1.0/node.m_im, 1.0 / node.m_im, 1.0 / node.m_im); + ++counter; + } + } + if (m_implicit) + { + printf("implicit not implemented\n"); + btAssert(false); + } + for (int i = 0; i < m_lf.size(); ++i) + { + // add damping matrix + m_lf[i]->buildDampingForceDifferentialDiagonal(-m_dt, diagA); + } + } + + void buildDiagonalS(const TVStack& inv_A, TVStack& diagS) + { + for (int c = 0; c < m_projections.m_lagrangeMultipliers.size(); ++c) + { + // S[k,k] = e_k^T * C A_d^-1 C^T * e_k + const LagrangeMultiplier& lm = m_projections.m_lagrangeMultipliers[c]; + btVector3& t = diagS[c]; + t.setZero(); + for (int j = 0; j < lm.m_num_constraints; ++j) + { + for (int i = 0; i < lm.m_num_nodes; ++i) + { + for (int d = 0; d < 3; ++d) + { + t[j] += inv_A[lm.m_indices[i]][d] * lm.m_dirs[j][d] * lm.m_dirs[j][d] * lm.m_weights[i] * lm.m_weights[i]; + } + } + } + } + } +#define USE_FULL_PRECONDITIONER +#ifndef USE_FULL_PRECONDITIONER + virtual void operator()(const TVStack& x, TVStack& b) + { + btAssert(b.size() == x.size()); + for (int i = 0; i < m_inv_A.size(); ++i) + { + b[i] = x[i] * m_inv_A[i]; + } + int offset = m_inv_A.size(); + for (int i = 0; i < m_inv_S.size(); ++i) + { + b[i+offset] = x[i+offset] * m_inv_S[i]; + } + } +#else + virtual void operator()(const TVStack& x, TVStack& b) + { + btAssert(b.size() == x.size()); + int offset = m_inv_A.size(); + + for (int i = 0; i < m_inv_A.size(); ++i) + { + b[i] = x[i] * m_inv_A[i]; + } + + for (int i = 0; i < m_inv_S.size(); ++i) + { + b[i+offset].setZero(); + } + + for (int c = 0; c < m_projections.m_lagrangeMultipliers.size(); ++c) + { + const LagrangeMultiplier& lm = m_projections.m_lagrangeMultipliers[c]; + // C * x + for (int d = 0; d < lm.m_num_constraints; ++d) + { + for (int i = 0; i < lm.m_num_nodes; ++i) + { + b[offset+c][d] += lm.m_weights[i] * b[lm.m_indices[i]].dot(lm.m_dirs[d]); + } + } + } + + for (int i = 0; i < m_inv_S.size(); ++i) + { + b[i+offset] = b[i+offset] * m_inv_S[i]; + } + + for (int i = 0; i < m_inv_A.size(); ++i) + { + b[i].setZero(); + } + + for (int c = 0; c < m_projections.m_lagrangeMultipliers.size(); ++c) + { + // C^T * lambda + const LagrangeMultiplier& lm = m_projections.m_lagrangeMultipliers[c]; + for (int i = 0; i < lm.m_num_nodes; ++i) + { + for (int j = 0; j < lm.m_num_constraints; ++j) + { + b[lm.m_indices[i]] += b[offset+c][j] * lm.m_weights[i] * lm.m_dirs[j]; + } + } + } + + for (int i = 0; i < m_inv_A.size(); ++i) + { + b[i] = (x[i] - b[i]) * m_inv_A[i]; + } + + TVStack t; + t.resize(b.size()); + for (int i = 0; i < m_inv_S.size(); ++i) + { + t[i+offset] = x[i+offset] * m_inv_S[i]; + } + for (int i = 0; i < m_inv_A.size(); ++i) + { + t[i].setZero(); + } + for (int c = 0; c < m_projections.m_lagrangeMultipliers.size(); ++c) + { + // C^T * lambda + const LagrangeMultiplier& lm = m_projections.m_lagrangeMultipliers[c]; + for (int i = 0; i < lm.m_num_nodes; ++i) + { + for (int j = 0; j < lm.m_num_constraints; ++j) + { + t[lm.m_indices[i]] += t[offset+c][j] * lm.m_weights[i] * lm.m_dirs[j]; + } + } + } + for (int i = 0; i < m_inv_A.size(); ++i) + { + b[i] += t[i] * m_inv_A[i]; + } + + for (int i = 0; i < m_inv_S.size(); ++i) + { + b[i+offset] -= x[i+offset] * m_inv_S[i]; + } } +#endif }; #endif /* BT_PRECONDITIONER_H */ diff --git a/thirdparty/bullet/BulletSoftBody/btSoftBody.cpp b/thirdparty/bullet/BulletSoftBody/btSoftBody.cpp index 2a458b1d80..81b846d7f8 100644 --- a/thirdparty/bullet/BulletSoftBody/btSoftBody.cpp +++ b/thirdparty/bullet/BulletSoftBody/btSoftBody.cpp @@ -18,6 +18,7 @@ subject to the following restrictions: #include "BulletSoftBody/btSoftBodySolvers.h" #include "btSoftBodyData.h" #include "LinearMath/btSerializer.h" +#include "LinearMath/btImplicitQRSVD.h" #include "LinearMath/btAlignedAllocator.h" #include "BulletDynamics/Featherstone/btMultiBodyLinkCollider.h" #include "BulletDynamics/Featherstone/btMultiBodyConstraint.h" @@ -25,6 +26,107 @@ subject to the following restrictions: #include "BulletCollision/CollisionShapes/btTriangleShape.h" #include <iostream> // +static inline btDbvtNode* buildTreeBottomUp(btAlignedObjectArray<btDbvtNode*>& leafNodes, btAlignedObjectArray<btAlignedObjectArray<int> >& adj) +{ + int N = leafNodes.size(); + if (N == 0) + { + return NULL; + } + while (N > 1) + { + btAlignedObjectArray<bool> marked; + btAlignedObjectArray<btDbvtNode*> newLeafNodes; + btAlignedObjectArray<std::pair<int,int> > childIds; + btAlignedObjectArray<btAlignedObjectArray<int> > newAdj; + marked.resize(N); + for (int i = 0; i < N; ++i) + marked[i] = false; + + // pair adjacent nodes into new(parent) node + for (int i = 0; i < N; ++i) + { + if (marked[i]) + continue; + bool merged = false; + for (int j = 0; j < adj[i].size(); ++j) + { + int n = adj[i][j]; + if (!marked[adj[i][j]]) + { + btDbvtNode* node = new (btAlignedAlloc(sizeof(btDbvtNode), 16)) btDbvtNode(); + node->parent = NULL; + node->childs[0] = leafNodes[i]; + node->childs[1] = leafNodes[n]; + leafNodes[i]->parent = node; + leafNodes[n]->parent = node; + newLeafNodes.push_back(node); + childIds.push_back(std::make_pair(i,n)); + merged = true; + marked[n] = true; + break; + } + } + if (!merged) + { + newLeafNodes.push_back(leafNodes[i]); + childIds.push_back(std::make_pair(i,-1)); + } + marked[i] = true; + } + // update adjacency matrix + newAdj.resize(newLeafNodes.size()); + for (int i = 0; i < newLeafNodes.size(); ++i) + { + for (int j = i+1; j < newLeafNodes.size(); ++j) + { + bool neighbor = false; + const btAlignedObjectArray<int>& leftChildNeighbors = adj[childIds[i].first]; + for (int k = 0; k < leftChildNeighbors.size(); ++k) + { + if (leftChildNeighbors[k] == childIds[j].first || leftChildNeighbors[k] == childIds[j].second) + { + neighbor = true; + break; + } + } + if (!neighbor && childIds[i].second != -1) + { + const btAlignedObjectArray<int>& rightChildNeighbors = adj[childIds[i].second]; + for (int k = 0; k < rightChildNeighbors.size(); ++k) + { + if (rightChildNeighbors[k] == childIds[j].first || rightChildNeighbors[k] == childIds[j].second) + { + neighbor = true; + break; + } + } + } + if (neighbor) + { + newAdj[i].push_back(j); + newAdj[j].push_back(i); + } + } + } + leafNodes = newLeafNodes; + //this assignment leaks memory, the assignment doesn't do a deep copy, for now a manual copy + //adj = newAdj; + adj.clear(); + adj.resize(newAdj.size()); + for (int i = 0; i < newAdj.size(); i++) + { + for (int j = 0; j < newAdj[i].size(); j++) + { + adj[i].push_back(newAdj[i][j]); + } + } + N = leafNodes.size(); + } + return leafNodes[0]; +} + +// btSoftBody::btSoftBody(btSoftBodyWorldInfo* worldInfo, int node_count, const btVector3* x, const btScalar* m) : m_softBodySolver(0), m_worldInfo(worldInfo) { @@ -41,6 +143,7 @@ btSoftBody::btSoftBody(btSoftBodyWorldInfo* worldInfo, int node_count, const btV /* Nodes */ const btScalar margin = getCollisionShape()->getMargin(); m_nodes.resize(node_count); + m_X.resize(node_count); for (int i = 0, ni = node_count; i < ni; ++i) { Node& n = m_nodes[i]; @@ -51,8 +154,11 @@ btSoftBody::btSoftBody(btSoftBodyWorldInfo* worldInfo, int node_count, const btV n.m_im = n.m_im > 0 ? 1 / n.m_im : 0; n.m_leaf = m_ndbvt.insert(btDbvtVolume::FromCR(n.m_x, margin), &n); n.m_material = pm; + m_X[i] = n.m_x; } updateBounds(); + setCollisionQuadrature(3); + m_fdbvnt = 0; } btSoftBody::btSoftBody(btSoftBodyWorldInfo* worldInfo) @@ -111,15 +217,18 @@ void btSoftBody::initDefaults() m_collisionShape = new btSoftBodyCollisionShape(this); m_collisionShape->setMargin(0.25f); - m_initialWorldTransform.setIdentity(); + m_worldTransform.setIdentity(); m_windVelocity = btVector3(0, 0, 0); m_restLengthScale = btScalar(1.0); - m_dampingCoefficient = 1; - m_sleepingThreshold = 0.1; - m_useFaceContact = true; + m_dampingCoefficient = 1.0; + m_sleepingThreshold = .4; m_useSelfCollision = false; - m_collisionFlags = 0; + m_collisionFlags = 0; + m_softSoftCollision = false; + m_maxSpeedSquared = 0; + m_repulsionStiffness = 0.5; + m_fdbvnt = 0; } // @@ -134,6 +243,8 @@ btSoftBody::~btSoftBody() btAlignedFree(m_materials[i]); for (i = 0; i < m_joints.size(); ++i) btAlignedFree(m_joints[i]); + if (m_fdbvnt) + delete m_fdbvnt; } // @@ -897,6 +1008,71 @@ void btSoftBody::setVolumeDensity(btScalar density) } // +btVector3 btSoftBody::getLinearVelocity() +{ + btVector3 total_momentum = btVector3(0,0,0); + for (int i = 0; i < m_nodes.size(); ++i) + { + btScalar mass = m_nodes[i].m_im == 0 ? 0 : 1.0/m_nodes[i].m_im; + total_momentum += mass * m_nodes[i].m_v; + } + btScalar total_mass = getTotalMass(); + return total_mass == 0 ? total_momentum : total_momentum / total_mass; +} + +// +void btSoftBody::setLinearVelocity(const btVector3& linVel) +{ + btVector3 old_vel = getLinearVelocity(); + btVector3 diff = linVel - old_vel; + for (int i = 0; i < m_nodes.size(); ++i) + m_nodes[i].m_v += diff; +} + +// +void btSoftBody::setAngularVelocity(const btVector3& angVel) +{ + btVector3 old_vel = getLinearVelocity(); + btVector3 com = getCenterOfMass(); + for (int i = 0; i < m_nodes.size(); ++i) + { + m_nodes[i].m_v = angVel.cross(m_nodes[i].m_x - com) + old_vel; + } +} + +// +btTransform btSoftBody::getRigidTransform() +{ + btVector3 t = getCenterOfMass(); + btMatrix3x3 S; + S.setZero(); + // get rotation that minimizes L2 difference: \sum_i || RX_i + t - x_i || + for (int i = 0; i < m_nodes.size(); ++i) + { + S += OuterProduct(m_X[i], t-m_nodes[i].m_x); + } + btVector3 sigma; + btMatrix3x3 U,V; + singularValueDecomposition(S,U,sigma,V); + btMatrix3x3 R = V * U.transpose(); + btTransform trs; + trs.setIdentity(); + trs.setOrigin(t); + trs.setBasis(R); + return trs; +} + +// +void btSoftBody::transformTo(const btTransform& trs) +{ + // get the current best rigid fit + btTransform current_transform = getRigidTransform(); + // apply transform in material space + btTransform new_transform = trs * current_transform.inverse(); + transform(new_transform); +} + +// void btSoftBody::transform(const btTransform& trs) { const btScalar margin = getCollisionShape()->getMargin(); @@ -916,7 +1092,6 @@ void btSoftBody::transform(const btTransform& trs) updateNormals(); updateBounds(); updateConstants(); - m_initialWorldTransform = trs; } // @@ -1834,6 +2009,25 @@ bool btSoftBody::rayTest(const btVector3& rayFrom, return (rayTest(rayFrom, rayTo, results.fraction, results.feature, results.index, false) != 0); } +bool btSoftBody::rayFaceTest(const btVector3& rayFrom, + const btVector3& rayTo, + sRayCast& results) +{ + if (m_faces.size() == 0) + return false; + else + { + if (m_fdbvt.empty()) + initializeFaceTree(); + } + + results.body = this; + results.fraction = 1.f; + results.index = -1; + + return (rayFaceTest(rayFrom, rayTo, results.fraction, results.index) != 0); +} + // void btSoftBody::setSolver(eSolverPresets::_ preset) { @@ -2339,15 +2533,160 @@ int btSoftBody::rayTest(const btVector3& rayFrom, const btVector3& rayTo, return (cnt); } +int btSoftBody::rayFaceTest(const btVector3& rayFrom, const btVector3& rayTo, + btScalar& mint, int& index) const +{ + int cnt = 0; + { /* Use dbvt */ + RayFromToCaster collider(rayFrom, rayTo, mint); + + btDbvt::rayTest(m_fdbvt.m_root, rayFrom, rayTo, collider); + if (collider.m_face) + { + mint = collider.m_mint; + index = (int)(collider.m_face - &m_faces[0]); + cnt = 1; + } + } + return (cnt); +} + + // +static inline btDbvntNode* copyToDbvnt(const btDbvtNode* n) +{ + if (n == 0) + return 0; + btDbvntNode* root = new btDbvntNode(n); + if (n->isinternal()) + { + btDbvntNode* c0 = copyToDbvnt(n->childs[0]); + root->childs[0] = c0; + btDbvntNode* c1 = copyToDbvnt(n->childs[1]); + root->childs[1] = c1; + } + return root; +} + +static inline void calculateNormalCone(btDbvntNode* root) +{ + if (!root) + return; + if (root->isleaf()) + { + const btSoftBody::Face* face = (btSoftBody::Face*)root->data; + root->normal = face->m_normal; + root->angle = 0; + } + else + { + btVector3 n0(0,0,0), n1(0,0,0); + btScalar a0 = 0, a1 = 0; + if (root->childs[0]) + { + calculateNormalCone(root->childs[0]); + n0 = root->childs[0]->normal; + a0 = root->childs[0]->angle; + } + if (root->childs[1]) + { + calculateNormalCone(root->childs[1]); + n1 = root->childs[1]->normal; + a1 = root->childs[1]->angle; + } + root->normal = (n0+n1).safeNormalize(); + root->angle = btMax(a0,a1) + btAngle(n0, n1)*0.5; + } +} + void btSoftBody::initializeFaceTree() { + BT_PROFILE("btSoftBody::initializeFaceTree"); m_fdbvt.clear(); + // create leaf nodes; + btAlignedObjectArray<btDbvtNode*> leafNodes; + leafNodes.resize(m_faces.size()); for (int i = 0; i < m_faces.size(); ++i) { Face& f = m_faces[i]; - f.m_leaf = m_fdbvt.insert(VolumeOf(f, 0), &f); + ATTRIBUTE_ALIGNED16(btDbvtVolume) vol = VolumeOf(f, 0); + btDbvtNode* node = new (btAlignedAlloc(sizeof(btDbvtNode), 16)) btDbvtNode(); + node->parent = NULL; + node->data = &f; + node->childs[1] = 0; + node->volume = vol; + leafNodes[i] = node; + f.m_leaf = node; } + btAlignedObjectArray<btAlignedObjectArray<int> > adj; + adj.resize(m_faces.size()); + // construct the adjacency list for triangles + for (int i = 0; i < adj.size(); ++i) + { + for (int j = i+1; j < adj.size(); ++j) + { + int dup = 0; + for (int k = 0; k < 3; ++k) + { + for (int l = 0; l < 3; ++l) + { + if (m_faces[i].m_n[k] == m_faces[j].m_n[l]) + { + ++dup; + break; + } + } + if (dup == 2) + { + adj[i].push_back(j); + adj[j].push_back(i); + } + } + } + } + m_fdbvt.m_root = buildTreeBottomUp(leafNodes, adj); + if (m_fdbvnt) + delete m_fdbvnt; + m_fdbvnt = copyToDbvnt(m_fdbvt.m_root); + updateFaceTree(false, false); + rebuildNodeTree(); +} + +// +void btSoftBody::rebuildNodeTree() +{ + m_ndbvt.clear(); + btAlignedObjectArray<btDbvtNode*> leafNodes; + leafNodes.resize(m_nodes.size()); + for (int i = 0; i < m_nodes.size(); ++i) + { + Node& n = m_nodes[i]; + ATTRIBUTE_ALIGNED16(btDbvtVolume) vol = btDbvtVolume::FromCR(n.m_x, 0); + btDbvtNode* node = new (btAlignedAlloc(sizeof(btDbvtNode), 16)) btDbvtNode(); + node->parent = NULL; + node->data = &n; + node->childs[1] = 0; + node->volume = vol; + leafNodes[i] = node; + n.m_leaf = node; + } + btAlignedObjectArray<btAlignedObjectArray<int> > adj; + adj.resize(m_nodes.size()); + btAlignedObjectArray<int> old_id; + old_id.resize(m_nodes.size()); + for (int i = 0; i < m_nodes.size(); ++i) + old_id[i] = m_nodes[i].index; + for (int i = 0; i < m_nodes.size(); ++i) + m_nodes[i].index = i; + for (int i = 0; i < m_links.size(); ++i) + { + Link& l = m_links[i]; + adj[l.m_n[0]->index].push_back(l.m_n[1]->index); + adj[l.m_n[1]->index].push_back(l.m_n[0]->index); + } + m_ndbvt.m_root = buildTreeBottomUp(leafNodes, adj); + for (int i = 0; i < m_nodes.size(); ++i) + m_nodes[i].index = old_id[i]; } // @@ -2403,10 +2742,9 @@ bool btSoftBody::checkDeformableContact(const btCollisionObjectWrapper* colObjWr const btCollisionObject* tmpCollisionObj = colObjWrap->getCollisionObject(); // use the position x_{n+1}^* = x_n + dt * v_{n+1}^* where v_{n+1}^* = v_n + dtg for collision detect // but resolve contact at x_n -// btTransform wtr = (predict) ? -// (colObjWrap->m_preTransform != NULL ? tmpCollisionObj->getInterpolationWorldTransform()*(*colObjWrap->m_preTransform) : tmpCollisionObj->getInterpolationWorldTransform()) -// : colObjWrap->getWorldTransform(); - const btTransform& wtr = colObjWrap->getWorldTransform(); + btTransform wtr = (predict) ? + (colObjWrap->m_preTransform != NULL ? tmpCollisionObj->getInterpolationWorldTransform()*(*colObjWrap->m_preTransform) : tmpCollisionObj->getInterpolationWorldTransform()) + : colObjWrap->getWorldTransform(); btScalar dst = m_worldInfo->m_sparsesdf.Evaluate( wtr.invXform(x), @@ -2457,7 +2795,6 @@ bool btSoftBody::checkDeformableFaceContact(const btCollisionObjectWrapper* colO btTransform wtr = (predict) ? (colObjWrap->m_preTransform != NULL ? tmpCollisionObj->getInterpolationWorldTransform()*(*colObjWrap->m_preTransform) : tmpCollisionObj->getInterpolationWorldTransform()) : colObjWrap->getWorldTransform(); -// const btTransform& wtr = colObjWrap->getWorldTransform(); btScalar dst; //#define USE_QUADRATURE 1 @@ -2476,6 +2813,7 @@ bool btSoftBody::checkDeformableFaceContact(const btCollisionObjectWrapper* colO nrm, margin); nrm = wtr.getBasis() * nrm; + cti.m_colObj = colObjWrap->getCollisionObject(); // use cached contact point } else @@ -2492,10 +2830,11 @@ bool btSoftBody::checkDeformableFaceContact(const btCollisionObjectWrapper* colO contact_point = results.witnesses[0]; getBarycentric(contact_point, f.m_n[0]->m_x, f.m_n[1]->m_x, f.m_n[2]->m_x, bary); nrm = results.normal; + cti.m_colObj = colObjWrap->getCollisionObject(); for (int i = 0; i < 3; ++i) f.m_pcontact[i] = bary[i]; } - + return (dst < 0); #endif // use collision quadrature point @@ -2505,7 +2844,11 @@ bool btSoftBody::checkDeformableFaceContact(const btCollisionObjectWrapper* colO btVector3 local_nrm; for (int q = 0; q < m_quads.size(); ++q) { - btVector3 p = BaryEval(f.m_n[0]->m_x, f.m_n[1]->m_x, f.m_n[2]->m_x, m_quads[q]); + btVector3 p; + if (predict) + p = BaryEval(f.m_n[0]->m_q, f.m_n[1]->m_q, f.m_n[2]->m_q, m_quads[q]); + else + p = BaryEval(f.m_n[0]->m_x, f.m_n[1]->m_x, f.m_n[2]->m_x, m_quads[q]); btScalar local_dst = m_worldInfo->m_sparsesdf.Evaluate( wtr.invXform(p), shp, @@ -2513,43 +2856,83 @@ bool btSoftBody::checkDeformableFaceContact(const btCollisionObjectWrapper* colO margin); if (local_dst < dst) { + if (local_dst < 0 && predict) + return true; dst = local_dst; contact_point = p; bary = m_quads[q]; - nrm = wtr.getBasis() * local_nrm; + nrm = local_nrm; + } + if (!predict) + { + cti.m_colObj = colObjWrap->getCollisionObject(); + cti.m_normal = wtr.getBasis() * nrm; + cti.m_offset = dst; } } + return (dst < 0); } #endif +// // regular face contact +// { +// btGjkEpaSolver2::sResults results; +// btTransform triangle_transform; +// triangle_transform.setIdentity(); +// triangle_transform.setOrigin(f.m_n[0]->m_x); +// btTriangleShape triangle(btVector3(0,0,0), f.m_n[1]->m_x-f.m_n[0]->m_x, f.m_n[2]->m_x-f.m_n[0]->m_x); +// btVector3 guess(0,0,0); +// if (predict) +// { +// triangle_transform.setOrigin(f.m_n[0]->m_q); +// triangle = btTriangleShape(btVector3(0,0,0), f.m_n[1]->m_q-f.m_n[0]->m_q, f.m_n[2]->m_q-f.m_n[0]->m_q); +// } +// const btConvexShape* csh = static_cast<const btConvexShape*>(shp); +//// btGjkEpaSolver2::SignedDistance(&triangle, triangle_transform, csh, wtr, guess, results); +//// dst = results.distance - margin; +//// contact_point = results.witnesses[0]; +// btGjkEpaSolver2::Penetration(&triangle, triangle_transform, csh, wtr, guess, results); +// if (results.status == btGjkEpaSolver2::sResults::Separated) +// return false; +// dst = results.distance - margin; +// contact_point = results.witnesses[1]; +// getBarycentric(contact_point, f.m_n[0]->m_x, f.m_n[1]->m_x, f.m_n[2]->m_x, bary); +// nrm = results.normal; +// for (int i = 0; i < 3; ++i) +// f.m_pcontact[i] = bary[i]; +// } +// +// if (!predict) +// { +// cti.m_colObj = colObjWrap->getCollisionObject(); +// cti.m_normal = nrm; +// cti.m_offset = dst; +// } +// + // regular face contact { btGjkEpaSolver2::sResults results; btTransform triangle_transform; triangle_transform.setIdentity(); - triangle_transform.setOrigin(f.m_n[0]->m_x); - btTriangleShape triangle(btVector3(0,0,0), f.m_n[1]->m_x-f.m_n[0]->m_x, f.m_n[2]->m_x-f.m_n[0]->m_x); + triangle_transform.setOrigin(f.m_n[0]->m_q); + btTriangleShape triangle(btVector3(0,0,0), f.m_n[1]->m_q-f.m_n[0]->m_q, f.m_n[2]->m_q-f.m_n[0]->m_q); btVector3 guess(0,0,0); const btConvexShape* csh = static_cast<const btConvexShape*>(shp); btGjkEpaSolver2::SignedDistance(&triangle, triangle_transform, csh, wtr, guess, results); - dst = results.distance - margin; + dst = results.distance-csh->getMargin(); + dst -= margin; + if (dst >= 0) + return false; contact_point = results.witnesses[0]; - getBarycentric(contact_point, f.m_n[0]->m_x, f.m_n[1]->m_x, f.m_n[2]->m_x, bary); + getBarycentric(contact_point, f.m_n[0]->m_q, f.m_n[1]->m_q, f.m_n[2]->m_q, bary); + btVector3 curr = BaryEval(f.m_n[0]->m_x, f.m_n[1]->m_x, f.m_n[2]->m_x, bary); nrm = results.normal; - for (int i = 0; i < 3; ++i) - f.m_pcontact[i] = bary[i]; - } - - if (!predict) - { cti.m_colObj = colObjWrap->getCollisionObject(); cti.m_normal = nrm; - cti.m_offset = dst; + cti.m_offset = dst + (curr - contact_point).dot(nrm); } - - if (dst < 0) - return true; - return (false); + return (dst < 0); } // @@ -3075,6 +3458,7 @@ void btSoftBody::setSpringStiffness(btScalar k) { m_links[i].Feature::m_material->m_kLST = k; } + m_repulsionStiffness = k; } void btSoftBody::initializeDmInverse() @@ -3372,18 +3756,39 @@ void btSoftBody::setMaxStress(btScalar maxStress) // void btSoftBody::interpolateRenderMesh() { - for (int i = 0; i < m_renderNodes.size(); ++i) - { - Node& n = m_renderNodes[i]; - n.m_x.setZero(); - for (int j = 0; j < 4; ++j) - { - if (m_renderNodesParents[i].size()) + if (m_z.size() > 0) + { + for (int i = 0; i < m_renderNodes.size(); ++i) + { + const Node* p0 = m_renderNodesParents[i][0]; + const Node* p1 = m_renderNodesParents[i][1]; + const Node* p2 = m_renderNodesParents[i][2]; + btVector3 normal = btCross(p1->m_x - p0->m_x, p2->m_x - p0->m_x); + btVector3 unit_normal = normal.normalized(); + Node& n = m_renderNodes[i]; + n.m_x.setZero(); + for (int j = 0; j < 3; ++j) { n.m_x += m_renderNodesParents[i][j]->m_x * m_renderNodesInterpolationWeights[i][j]; } - } - } + n.m_x += m_z[i] * unit_normal; + } + } + else + { + for (int i = 0; i < m_renderNodes.size(); ++i) + { + Node& n = m_renderNodes[i]; + n.m_x.setZero(); + for (int j = 0; j < 4; ++j) + { + if (m_renderNodesParents[i].size()) + { + n.m_x += m_renderNodesParents[i][j]->m_x * m_renderNodesInterpolationWeights[i][j]; + } + } + } + } } void btSoftBody::setCollisionQuadrature(int N) @@ -3649,13 +4054,10 @@ void btSoftBody::defaultCollisionHandler(const btCollisionObjectWrapper* pcoWrap break; case fCollision::SDF_RD: { - btRigidBody* prb1 = (btRigidBody*)btRigidBody::upcast(pcoWrap->getCollisionObject()); if (pcoWrap->getCollisionObject()->isActive() || this->isActive()) { const btTransform wtr = pcoWrap->getWorldTransform(); -// const btTransform ctr = pcoWrap->getWorldTransform(); -// const btScalar timemargin = (wtr.getOrigin() - ctr.getOrigin()).length(); const btScalar timemargin = 0; const btScalar basemargin = getCollisionShape()->getMargin(); btVector3 mins; @@ -3667,22 +4069,25 @@ void btSoftBody::defaultCollisionHandler(const btCollisionObjectWrapper* pcoWrap maxs); volume = btDbvtVolume::FromMM(mins, maxs); volume.Expand(btVector3(basemargin, basemargin, basemargin)); - btSoftColliders::CollideSDF_RD docollideNode; - docollideNode.psb = this; - docollideNode.m_colObj1Wrap = pcoWrap; - docollideNode.m_rigidBody = prb1; - docollideNode.dynmargin = basemargin + timemargin; - docollideNode.stamargin = basemargin; - m_ndbvt.collideTV(m_ndbvt.m_root, volume, docollideNode); - - if (this->m_useFaceContact) + if (m_cfg.collisions & fCollision::SDF_RDN) + { + btSoftColliders::CollideSDF_RD docollideNode; + docollideNode.psb = this; + docollideNode.m_colObj1Wrap = pcoWrap; + docollideNode.m_rigidBody = prb1; + docollideNode.dynmargin = basemargin + timemargin; + docollideNode.stamargin = basemargin; + m_ndbvt.collideTV(m_ndbvt.m_root, volume, docollideNode); + } + + if (((pcoWrap->getCollisionObject()->getInternalType() == CO_RIGID_BODY) && (m_cfg.collisions & fCollision::SDF_RDF)) || ((pcoWrap->getCollisionObject()->getInternalType() == CO_FEATHERSTONE_LINK) && (m_cfg.collisions & fCollision::SDF_MDF))) { btSoftColliders::CollideSDF_RDF docollideFace; docollideFace.psb = this; docollideFace.m_colObj1Wrap = pcoWrap; docollideFace.m_rigidBody = prb1; - docollideFace.dynmargin = basemargin + timemargin; - docollideFace.stamargin = basemargin; + docollideFace.dynmargin = basemargin + timemargin; + docollideFace.stamargin = basemargin; m_fdbvt.collideTV(m_fdbvt.m_root, volume, docollideFace); } } @@ -3691,51 +4096,6 @@ void btSoftBody::defaultCollisionHandler(const btCollisionObjectWrapper* pcoWrap } } -static inline btDbvntNode* copyToDbvnt(const btDbvtNode* n) -{ - if (n == 0) - return 0; - btDbvntNode* root = new btDbvntNode(n); - if (n->isinternal()) - { - btDbvntNode* c0 = copyToDbvnt(n->childs[0]); - root->childs[0] = c0; - btDbvntNode* c1 = copyToDbvnt(n->childs[1]); - root->childs[1] = c1; - } - return root; -} - -static inline void calculateNormalCone(btDbvntNode* root) -{ - if (!root) - return; - if (root->isleaf()) - { - const btSoftBody::Face* face = (btSoftBody::Face*)root->data; - root->normal = face->m_normal; - root->angle = 0; - } - else - { - btVector3 n0(0,0,0), n1(0,0,0); - btScalar a0 = 0, a1 = 0; - if (root->childs[0]) - { - calculateNormalCone(root->childs[0]); - n0 = root->childs[0]->normal; - a0 = root->childs[0]->angle; - } - if (root->childs[1]) - { - calculateNormalCone(root->childs[1]); - n1 = root->childs[1]->normal; - a1 = root->childs[1]->angle; - } - root->normal = (n0+n1).safeNormalize(); - root->angle = btMax(a0,a1) + btAngle(n0, n1)*0.5; - } -} // void btSoftBody::defaultCollisionHandler(btSoftBody* psb) { @@ -3779,6 +4139,8 @@ void btSoftBody::defaultCollisionHandler(btSoftBody* psb) break; case fCollision::VF_DD: { + if (!psb->m_softSoftCollision) + return; if (psb->isActive() || this->isActive()) { if (this != psb) @@ -3797,6 +4159,7 @@ void btSoftBody::defaultCollisionHandler(btSoftBody* psb) docollide.psb[0]->m_ndbvt.collideTT(docollide.psb[0]->m_ndbvt.m_root, docollide.psb[1]->m_fdbvt.m_root, docollide); + /* psb1 nodes vs psb0 faces */ if (this->m_tetras.size() > 0) docollide.useFaceNormal = true; @@ -3812,20 +4175,17 @@ void btSoftBody::defaultCollisionHandler(btSoftBody* psb) { if (psb->useSelfCollision()) { - btSoftColliders::CollideFF_DD docollide; - docollide.mrg = getCollisionShape()->getMargin() + - psb->getCollisionShape()->getMargin(); - docollide.psb[0] = this; - docollide.psb[1] = psb; - if (this->m_tetras.size() > 0) - docollide.useFaceNormal = true; - else - docollide.useFaceNormal = false; - /* psb0 faces vs psb0 faces */ - btDbvntNode* root = copyToDbvnt(this->m_fdbvt.m_root); - calculateNormalCone(root); - this->m_fdbvt.selfCollideT(root,docollide); - delete root; + btSoftColliders::CollideFF_DD docollide; + docollide.mrg = 2*getCollisionShape()->getMargin(); + docollide.psb[0] = this; + docollide.psb[1] = psb; + if (this->m_tetras.size() > 0) + docollide.useFaceNormal = true; + else + docollide.useFaceNormal = false; + /* psb0 faces vs psb0 faces */ + calculateNormalCone(this->m_fdbvnt); + this->m_fdbvt.selfCollideT(m_fdbvnt,docollide); } } } @@ -3837,6 +4197,58 @@ void btSoftBody::defaultCollisionHandler(btSoftBody* psb) } } +void btSoftBody::geometricCollisionHandler(btSoftBody* psb) +{ + if (psb->isActive() || this->isActive()) + { + if (this != psb) + { + btSoftColliders::CollideCCD docollide; + /* common */ + docollide.mrg = SAFE_EPSILON; // for rounding error instead of actual margin + docollide.dt = psb->m_sst.sdt; + /* psb0 nodes vs psb1 faces */ + if (psb->m_tetras.size() > 0) + docollide.useFaceNormal = true; + else + docollide.useFaceNormal = false; + docollide.psb[0] = this; + docollide.psb[1] = psb; + docollide.psb[0]->m_ndbvt.collideTT(docollide.psb[0]->m_ndbvt.m_root, + docollide.psb[1]->m_fdbvt.m_root, + docollide); + /* psb1 nodes vs psb0 faces */ + if (this->m_tetras.size() > 0) + docollide.useFaceNormal = true; + else + docollide.useFaceNormal = false; + docollide.psb[0] = psb; + docollide.psb[1] = this; + docollide.psb[0]->m_ndbvt.collideTT(docollide.psb[0]->m_ndbvt.m_root, + docollide.psb[1]->m_fdbvt.m_root, + docollide); + } + else + { + if (psb->useSelfCollision()) + { + btSoftColliders::CollideCCD docollide; + docollide.mrg = SAFE_EPSILON; + docollide.psb[0] = this; + docollide.psb[1] = psb; + docollide.dt = psb->m_sst.sdt; + if (this->m_tetras.size() > 0) + docollide.useFaceNormal = true; + else + docollide.useFaceNormal = false; + /* psb0 faces vs psb0 faces */ + calculateNormalCone(this->m_fdbvnt); // should compute this outside of this scope + this->m_fdbvt.selfCollideT(m_fdbvnt,docollide); + } + } + } +} + void btSoftBody::setWindVelocity(const btVector3& velocity) { m_windVelocity = velocity; diff --git a/thirdparty/bullet/BulletSoftBody/btSoftBody.h b/thirdparty/bullet/BulletSoftBody/btSoftBody.h index 2b048c1118..6a55eccbd2 100644 --- a/thirdparty/bullet/BulletSoftBody/btSoftBody.h +++ b/thirdparty/bullet/BulletSoftBody/btSoftBody.h @@ -35,6 +35,8 @@ subject to the following restrictions: //#else #define btSoftBodyData btSoftBodyFloatData #define btSoftBodyDataName "btSoftBodyFloatData" +static const btScalar OVERLAP_REDUCTION_FACTOR = 0.1; +static unsigned long seed = 243703; //#endif //BT_USE_DOUBLE_PRECISION class btBroadphaseInterface; @@ -161,14 +163,18 @@ public: RVSmask = 0x000f, ///Rigid versus soft mask SDF_RS = 0x0001, ///SDF based rigid vs soft CL_RS = 0x0002, ///Cluster vs convex rigid vs soft - SDF_RD = 0x0003, ///DF based rigid vs deformable - SDF_RDF = 0x0004, ///DF based rigid vs deformable faces + SDF_RD = 0x0004, ///rigid vs deformable - SVSmask = 0x00F0, ///Rigid versus soft mask + SVSmask = 0x00f0, ///Rigid versus soft mask VF_SS = 0x0010, ///Vertex vs face soft vs soft handling CL_SS = 0x0020, ///Cluster vs cluster soft vs soft handling CL_SELF = 0x0040, ///Cluster soft body self collision - VF_DD = 0x0050, ///Vertex vs face soft vs soft handling + VF_DD = 0x0080, ///Vertex vs face soft vs soft handling + + RVDFmask = 0x0f00, /// Rigid versus deformable face mask + SDF_RDF = 0x0100, /// GJK based Rigid vs. deformable face + SDF_MDF = 0x0200, /// GJK based Multibody vs. deformable face + SDF_RDN = 0x0400, /// SDF based Rigid vs. deformable node /* presets */ Default = SDF_RS, END @@ -257,13 +263,13 @@ public: btVector3 m_x; // Position btVector3 m_q; // Previous step position/Test position btVector3 m_v; // Velocity - btVector3 m_vsplit; // Temporary Velocity in addintion to velocity used in split impulse btVector3 m_vn; // Previous step velocity btVector3 m_f; // Force accumulator btVector3 m_n; // Normal btScalar m_im; // 1/mass btScalar m_area; // Area btDbvtNode* m_leaf; // Leaf data + btScalar m_penetration; // depth of penetration int m_battach : 1; // Attached int index; }; @@ -289,6 +295,7 @@ public: btScalar m_ra; // Rest area btDbvtNode* m_leaf; // Leaf data btVector4 m_pcontact; // barycentric weights of the persistent contact + btVector3 m_n0, m_n1, m_vn; int m_index; }; /* Tetra */ @@ -717,6 +724,15 @@ public: /* SolverState */ struct SolverState { + //if you add new variables, always initialize them! + SolverState() + :sdt(0), + isdt(0), + velmrg(0), + radmrg(0), + updmrg(0) + { + } btScalar sdt; // dt*timescale btScalar isdt; // 1/sdt btScalar velmrg; // velocity margin @@ -796,22 +812,24 @@ public: bool m_bUpdateRtCst; // Update runtime constants btDbvt m_ndbvt; // Nodes tree btDbvt m_fdbvt; // Faces tree + btDbvntNode* m_fdbvnt; // Faces tree with normals btDbvt m_cdbvt; // Clusters tree tClusterArray m_clusters; // Clusters - btScalar m_dampingCoefficient; // Damping Coefficient - btScalar m_sleepingThreshold; - btScalar m_maxSpeedSquared; - bool m_useFaceContact; - btAlignedObjectArray<btVector3> m_quads; // quadrature points for collision detection - - btAlignedObjectArray<btVector4> m_renderNodesInterpolationWeights; - btAlignedObjectArray<btAlignedObjectArray<const btSoftBody::Node*> > m_renderNodesParents; - bool m_useSelfCollision; + btScalar m_dampingCoefficient; // Damping Coefficient + btScalar m_sleepingThreshold; + btScalar m_maxSpeedSquared; + btAlignedObjectArray<btVector3> m_quads; // quadrature points for collision detection + btScalar m_repulsionStiffness; + btAlignedObjectArray<btVector3> m_X; // initial positions + + btAlignedObjectArray<btVector4> m_renderNodesInterpolationWeights; + btAlignedObjectArray<btAlignedObjectArray<const btSoftBody::Node*> > m_renderNodesParents; + btAlignedObjectArray<btScalar> m_z; // vertical distance used in extrapolation + bool m_useSelfCollision; + bool m_softSoftCollision; btAlignedObjectArray<bool> m_clusterConnectivity; //cluster connectivity, for self-collision - btTransform m_initialWorldTransform; - btVector3 m_windVelocity; btScalar m_restLengthScale; @@ -843,11 +861,6 @@ public: { m_dampingCoefficient = damping_coeff; } - - void setUseFaceContact(bool useFaceContact) - { - m_useFaceContact = false; - } ///@todo: avoid internal softbody shape hack and move collision code to collision library virtual void setCollisionShape(btCollisionShape* collisionShape) @@ -957,6 +970,16 @@ public: void setVolumeMass(btScalar mass); /* Set volume density (using tetrahedrons) */ void setVolumeDensity(btScalar density); + /* Get the linear velocity of the center of mass */ + btVector3 getLinearVelocity(); + /* Set the linear velocity of the center of mass */ + void setLinearVelocity(const btVector3& linVel); + /* Set the angular velocity of the center of mass */ + void setAngularVelocity(const btVector3& angVel); + /* Get best fit rigid transform */ + btTransform getRigidTransform(); + /* Transform to given pose */ + void transformTo(const btTransform& trs); /* Transform */ void transform(const btTransform& trs); /* Translate */ @@ -1023,6 +1046,11 @@ public: bool rayTest(const btVector3& rayFrom, const btVector3& rayTo, sRayCast& results); + bool rayFaceTest(const btVector3& rayFrom, + const btVector3& rayTo, + sRayCast& results); + int rayFaceTest(const btVector3& rayFrom, const btVector3& rayTo, + btScalar& mint, int& index) const; /* Solver presets */ void setSolver(eSolverPresets::_ preset); /* predictMotion */ @@ -1120,6 +1148,7 @@ public: int rayTest(const btVector3& rayFrom, const btVector3& rayTo, btScalar& mint, eFeature::_& feature, int& index, bool bcountonly) const; void initializeFaceTree(); + void rebuildNodeTree(); btVector3 evaluateCom() const; bool checkDeformableContact(const btCollisionObjectWrapper* colObjWrap, const btVector3& x, btScalar margin, btSoftBody::sCti& cti, bool predict = false) const; bool checkDeformableFaceContact(const btCollisionObjectWrapper* colObjWrap, Face& f, btVector3& contact_point, btVector3& bary, btScalar margin, btSoftBody::sCti& cti, bool predict = false) const; @@ -1152,7 +1181,180 @@ public: static void VSolve_Links(btSoftBody* psb, btScalar kst); static psolver_t getSolver(ePSolver::_ solver); static vsolver_t getSolver(eVSolver::_ solver); + void geometricCollisionHandler(btSoftBody* psb); +#define SAFE_EPSILON SIMD_EPSILON*100.0 + void updateNode(btDbvtNode* node, bool use_velocity, bool margin) + { + if (node->isleaf()) + { + btSoftBody::Node* n = (btSoftBody::Node*)(node->data); + ATTRIBUTE_ALIGNED16(btDbvtVolume) vol; + btScalar pad = margin ? m_sst.radmrg : SAFE_EPSILON; // use user defined margin or margin for floating point precision + if (use_velocity) + { + btVector3 points[2] = {n->m_x, n->m_x + m_sst.sdt * n->m_v}; + vol = btDbvtVolume::FromPoints(points, 2); + vol.Expand(btVector3(pad, pad, pad)); + } + else + { + vol = btDbvtVolume::FromCR(n->m_x, pad); + } + node->volume = vol; + return; + } + else + { + updateNode(node->childs[0], use_velocity, margin); + updateNode(node->childs[1], use_velocity, margin); + ATTRIBUTE_ALIGNED16(btDbvtVolume) vol; + Merge(node->childs[0]->volume, node->childs[1]->volume, vol); + node->volume = vol; + } + } + + void updateNodeTree(bool use_velocity, bool margin) + { + if (m_ndbvt.m_root) + updateNode(m_ndbvt.m_root, use_velocity, margin); + } + + template <class DBVTNODE> // btDbvtNode or btDbvntNode + void updateFace(DBVTNODE* node, bool use_velocity, bool margin) + { + if (node->isleaf()) + { + btSoftBody::Face* f = (btSoftBody::Face*)(node->data); + btScalar pad = margin ? m_sst.radmrg : SAFE_EPSILON; // use user defined margin or margin for floating point precision + ATTRIBUTE_ALIGNED16(btDbvtVolume) vol; + if (use_velocity) + { + btVector3 points[6] = {f->m_n[0]->m_x, f->m_n[0]->m_x + m_sst.sdt * f->m_n[0]->m_v, + f->m_n[1]->m_x, f->m_n[1]->m_x + m_sst.sdt * f->m_n[1]->m_v, + f->m_n[2]->m_x, f->m_n[2]->m_x + m_sst.sdt * f->m_n[2]->m_v}; + vol = btDbvtVolume::FromPoints(points, 6); + } + else + { + btVector3 points[3] = {f->m_n[0]->m_x, + f->m_n[1]->m_x, + f->m_n[2]->m_x}; + vol = btDbvtVolume::FromPoints(points, 3); + } + vol.Expand(btVector3(pad, pad, pad)); + node->volume = vol; + return; + } + else + { + updateFace(node->childs[0], use_velocity, margin); + updateFace(node->childs[1], use_velocity, margin); + ATTRIBUTE_ALIGNED16(btDbvtVolume) vol; + Merge(node->childs[0]->volume, node->childs[1]->volume, vol); + node->volume = vol; + } + } + void updateFaceTree(bool use_velocity, bool margin) + { + if (m_fdbvt.m_root) + updateFace(m_fdbvt.m_root, use_velocity, margin); + if (m_fdbvnt) + updateFace(m_fdbvnt, use_velocity, margin); + } + + template <typename T> + static inline T BaryEval(const T& a, + const T& b, + const T& c, + const btVector3& coord) + { + return (a * coord.x() + b * coord.y() + c * coord.z()); + } + void applyRepulsionForce(btScalar timeStep, bool applySpringForce) + { + btAlignedObjectArray<int> indices; + { + // randomize the order of repulsive force + indices.resize(m_faceNodeContacts.size()); + for (int i = 0; i < m_faceNodeContacts.size(); ++i) + indices[i] = i; +#define NEXTRAND (seed = (1664525L * seed + 1013904223L) & 0xffffffff) + int i, ni; + + for (i = 0, ni = indices.size(); i < ni; ++i) + { + btSwap(indices[i], indices[NEXTRAND % ni]); + } + } + for (int k = 0; k < m_faceNodeContacts.size(); ++k) + { + int i = indices[k]; + btSoftBody::DeformableFaceNodeContact& c = m_faceNodeContacts[i]; + btSoftBody::Node* node = c.m_node; + btSoftBody::Face* face = c.m_face; + const btVector3& w = c.m_bary; + const btVector3& n = c.m_normal; + btVector3 l = node->m_x - BaryEval(face->m_n[0]->m_x, face->m_n[1]->m_x, face->m_n[2]->m_x, w); + btScalar d = c.m_margin - n.dot(l); + d = btMax(btScalar(0),d); + + const btVector3& va = node->m_v; + btVector3 vb = BaryEval(face->m_n[0]->m_v, face->m_n[1]->m_v, face->m_n[2]->m_v, w); + btVector3 vr = va - vb; + const btScalar vn = btDot(vr, n); // dn < 0 <==> opposing + if (vn > OVERLAP_REDUCTION_FACTOR * d / timeStep) + continue; + btVector3 vt = vr - vn*n; + btScalar I = 0; + btScalar mass = node->m_im == 0 ? 0 : btScalar(1)/node->m_im; + if (applySpringForce) + I = -btMin(m_repulsionStiffness * timeStep * d, mass * (OVERLAP_REDUCTION_FACTOR * d / timeStep - vn)); + if (vn < 0) + I += 0.5 * mass * vn; + btScalar face_penetration = 0, node_penetration = node->m_penetration; + for (int i = 0; i < 3; ++i) + face_penetration = btMax(face_penetration, face->m_n[i]->m_penetration); + btScalar I_tilde = .5 *I /(1.0+w.length2()); + +// double the impulse if node or face is constrained. + if (face_penetration > 0 || node_penetration > 0) + I_tilde *= 2.0; + if (face_penetration <= node_penetration) + { + for (int j = 0; j < 3; ++j) + face->m_n[j]->m_v += w[j]*n*I_tilde*node->m_im; + } + if (face_penetration >= node_penetration) + { + node->m_v -= I_tilde*node->m_im*n; + } + + // apply frictional impulse + btScalar vt_norm = vt.safeNorm(); + if (vt_norm > SIMD_EPSILON) + { + btScalar delta_vn = -2 * I * node->m_im; + btScalar mu = c.m_friction; + btScalar vt_new = btMax(btScalar(1) - mu * delta_vn / (vt_norm + SIMD_EPSILON), btScalar(0))*vt_norm; + I = 0.5 * mass * (vt_norm-vt_new); + vt.safeNormalize(); + I_tilde = .5 *I /(1.0+w.length2()); +// double the impulse if node or face is constrained. +// if (face_penetration > 0 || node_penetration > 0) +// I_tilde *= 2.0; + if (face_penetration <= node_penetration) + { + for (int j = 0; j < 3; ++j) + face->m_n[j]->m_v += w[j] * vt * I_tilde * (face->m_n[j])->m_im; + } + if (face_penetration >= node_penetration) + { + node->m_v -= I_tilde * node->m_im * vt; + } + } + } + } virtual int calculateSerializeBufferSize() const; ///fills the dataBuffer and returns the struct name (and 0 on failure) diff --git a/thirdparty/bullet/BulletSoftBody/btSoftBodyHelpers.cpp b/thirdparty/bullet/BulletSoftBody/btSoftBodyHelpers.cpp index 649d6f58cf..c1a87c7d57 100644 --- a/thirdparty/bullet/BulletSoftBody/btSoftBodyHelpers.cpp +++ b/thirdparty/bullet/BulletSoftBody/btSoftBodyHelpers.cpp @@ -1300,13 +1300,23 @@ btSoftBody* btSoftBodyHelpers::CreateFromVtkFile(btSoftBodyWorldInfo& worldInfo, } else if (reading_tets) { + int d; + ss >> d; + if (d != 4) + { + printf("Load deformable failed: Only Tetrahedra are supported in VTK file.\n"); + fs.close(); + return 0; + } ss.ignore(128, ' '); // ignore "4" Index tet; tet.resize(4); for (size_t i = 0; i < 4; i++) { ss >> tet[i]; + printf("%d ", tet[i]); } + printf("\n"); indices[indices_count++] = tet; } } @@ -1500,10 +1510,27 @@ void btSoftBodyHelpers::getBarycentricWeights(const btVector3& a, const btVector bary = btVector4(va6*v6, vb6*v6, vc6*v6, vd6*v6); } +// Given a simplex with vertices a,b,c, find the barycentric weights of p in this simplex. bary[3] = 0. +void btSoftBodyHelpers::getBarycentricWeights(const btVector3& a, const btVector3& b, const btVector3& c, const btVector3& p, btVector4& bary) +{ + btVector3 v0 = b - a, v1 = c - a, v2 = p - a; + btScalar d00 = btDot(v0, v0); + btScalar d01 = btDot(v0, v1); + btScalar d11 = btDot(v1, v1); + btScalar d20 = btDot(v2, v0); + btScalar d21 = btDot(v2, v1); + btScalar invDenom = 1.0 / (d00 * d11 - d01 * d01); + bary[1] = (d11 * d20 - d01 * d21) * invDenom; + bary[2] = (d00 * d21 - d01 * d20) * invDenom; + bary[0] = 1.0 - bary[1] - bary[2]; + bary[3] = 0; +} + // Iterate through all render nodes to find the simulation tetrahedron that contains the render node and record the barycentric weights // If the node is not inside any tetrahedron, assign it to the tetrahedron in which the node has the least negative barycentric weight void btSoftBodyHelpers::interpolateBarycentricWeights(btSoftBody* psb) { + psb->m_z.resize(0); psb->m_renderNodesInterpolationWeights.resize(psb->m_renderNodes.size()); psb->m_renderNodesParents.resize(psb->m_renderNodes.size()); for (int i = 0; i < psb->m_renderNodes.size(); ++i) @@ -1513,7 +1540,6 @@ void btSoftBodyHelpers::interpolateBarycentricWeights(btSoftBody* psb) btVector4 optimal_bary; btScalar min_bary_weight = -1e3; btAlignedObjectArray<const btSoftBody::Node*> optimal_parents; - bool found = false; for (int j = 0; j < psb->m_tetras.size(); ++j) { const btSoftBody::Tetra& t = psb->m_tetras[j]; @@ -1544,3 +1570,55 @@ void btSoftBodyHelpers::interpolateBarycentricWeights(btSoftBody* psb) psb->m_renderNodesParents[i] = optimal_parents; } } + + +// Iterate through all render nodes to find the simulation triangle that's closest to the node in the barycentric sense. +void btSoftBodyHelpers::extrapolateBarycentricWeights(btSoftBody* psb) +{ + psb->m_renderNodesInterpolationWeights.resize(psb->m_renderNodes.size()); + psb->m_renderNodesParents.resize(psb->m_renderNodes.size()); + psb->m_z.resize(psb->m_renderNodes.size()); + for (int i = 0; i < psb->m_renderNodes.size(); ++i) + { + const btVector3& p = psb->m_renderNodes[i].m_x; + btVector4 bary; + btVector4 optimal_bary; + btScalar min_bary_weight = -SIMD_INFINITY; + btAlignedObjectArray<const btSoftBody::Node*> optimal_parents; + btScalar dist = 0, optimal_dist = 0; + for (int j = 0; j < psb->m_faces.size(); ++j) + { + const btSoftBody::Face& f = psb->m_faces[j]; + btVector3 n = btCross(f.m_n[1]->m_x - f.m_n[0]->m_x, f.m_n[2]->m_x - f.m_n[0]->m_x); + btVector3 unit_n = n.normalized(); + dist = (p-f.m_n[0]->m_x).dot(unit_n); + btVector3 proj_p = p - dist*unit_n; + getBarycentricWeights(f.m_n[0]->m_x, f.m_n[1]->m_x, f.m_n[2]->m_x, proj_p, bary); + btScalar new_min_bary_weight = bary[0]; + for (int k = 1; k < 3; ++k) + { + new_min_bary_weight = btMin(new_min_bary_weight, bary[k]); + } + + // p is out of the current best triangle, we found a traingle that's better + bool better_than_closest_outisde = (new_min_bary_weight > min_bary_weight && min_bary_weight<0.); + // p is inside of the current best triangle, we found a triangle that's better + bool better_than_best_inside = (new_min_bary_weight>=0 && min_bary_weight>=0 && btFabs(dist)<btFabs(optimal_dist)); + + if (better_than_closest_outisde || better_than_best_inside) + { + btAlignedObjectArray<const btSoftBody::Node*> parents; + parents.push_back(f.m_n[0]); + parents.push_back(f.m_n[1]); + parents.push_back(f.m_n[2]); + optimal_parents = parents; + optimal_bary = bary; + optimal_dist = dist; + min_bary_weight = new_min_bary_weight; + } + } + psb->m_renderNodesInterpolationWeights[i] = optimal_bary; + psb->m_renderNodesParents[i] = optimal_parents; + psb->m_z[i] = optimal_dist; + } +} diff --git a/thirdparty/bullet/BulletSoftBody/btSoftBodyHelpers.h b/thirdparty/bullet/BulletSoftBody/btSoftBodyHelpers.h index b20f2f6d62..abe1870890 100644 --- a/thirdparty/bullet/BulletSoftBody/btSoftBodyHelpers.h +++ b/thirdparty/bullet/BulletSoftBody/btSoftBodyHelpers.h @@ -148,8 +148,12 @@ struct btSoftBodyHelpers static void getBarycentricWeights(const btVector3& a, const btVector3& b, const btVector3& c, const btVector3& d, const btVector3& p, btVector4& bary); + static void getBarycentricWeights(const btVector3& a, const btVector3& b, const btVector3& c, const btVector3& p, btVector4& bary); + static void interpolateBarycentricWeights(btSoftBody* psb); + static void extrapolateBarycentricWeights(btSoftBody* psb); + static void generateBoundaryFaces(btSoftBody* psb); static void duplicateFaces(const char* filename, const btSoftBody* psb); diff --git a/thirdparty/bullet/BulletSoftBody/btSoftBodyInternals.h b/thirdparty/bullet/BulletSoftBody/btSoftBodyInternals.h index cde4746d58..b9ebc95b6b 100644 --- a/thirdparty/bullet/BulletSoftBody/btSoftBodyInternals.h +++ b/thirdparty/bullet/BulletSoftBody/btSoftBodyInternals.h @@ -18,7 +18,6 @@ subject to the following restrictions: #define _BT_SOFT_BODY_INTERNALS_H #include "btSoftBody.h" - #include "LinearMath/btQuickprof.h" #include "LinearMath/btPolarDecomposition.h" #include "BulletCollision/BroadphaseCollision/btBroadphaseInterface.h" @@ -29,9 +28,10 @@ subject to the following restrictions: #include "BulletDynamics/Featherstone/btMultiBodyConstraint.h" #include <string.h> //for memset #include <cmath> +#include "poly34.h" // Given a multibody link, a contact point and a contact direction, fill in the jacobian data needed to calculate the velocity change given an impulse in the contact direction -static void findJacobian(const btMultiBodyLinkCollider* multibodyLinkCol, +static SIMD_FORCE_INLINE void findJacobian(const btMultiBodyLinkCollider* multibodyLinkCol, btMultiBodyJacobianData& jacobianData, const btVector3& contact_point, const btVector3& dir) @@ -44,7 +44,7 @@ static void findJacobian(const btMultiBodyLinkCollider* multibodyLinkCol, multibodyLinkCol->m_multiBody->fillContactJacobianMultiDof(multibodyLinkCol->m_link, contact_point, dir, jac, jacobianData.scratch_r, jacobianData.scratch_v, jacobianData.scratch_m); multibodyLinkCol->m_multiBody->calcAccelerationDeltasMultiDof(&jacobianData.m_jacobians[0], &jacobianData.m_deltaVelocitiesUnitImpulse[0], jacobianData.scratch_r, jacobianData.scratch_v); } -static btVector3 generateUnitOrthogonalVector(const btVector3& u) +static SIMD_FORCE_INLINE btVector3 generateUnitOrthogonalVector(const btVector3& u) { btScalar ux = u.getX(); btScalar uy = u.getY(); @@ -62,6 +62,571 @@ static btVector3 generateUnitOrthogonalVector(const btVector3& u) v.normalize(); return v; } + +static SIMD_FORCE_INLINE bool proximityTest(const btVector3& x1, const btVector3& x2, const btVector3& x3, const btVector3& x4, const btVector3& normal, const btScalar& mrg, btVector3& bary) +{ + btVector3 x43 = x4-x3; + if (std::abs(x43.dot(normal)) > mrg) + return false; + btVector3 x13 = x1-x3; + btVector3 x23 = x2-x3; + btScalar a11 = x13.length2(); + btScalar a22 = x23.length2(); + btScalar a12 = x13.dot(x23); + btScalar b1 = x13.dot(x43); + btScalar b2 = x23.dot(x43); + btScalar det = a11*a22 - a12*a12; + if (det < SIMD_EPSILON) + return false; + btScalar w1 = (b1*a22-b2*a12)/det; + btScalar w2 = (b2*a11-b1*a12)/det; + btScalar w3 = 1-w1-w2; + btScalar delta = mrg / std::sqrt(0.5*std::abs(x13.cross(x23).safeNorm())); + bary = btVector3(w1,w2,w3); + for (int i = 0; i < 3; ++i) + { + if (bary[i] < -delta || bary[i] > 1+delta) + return false; + } + return true; +} +static const int KDOP_COUNT = 13; +static btVector3 dop[KDOP_COUNT]={btVector3(1,0,0), + btVector3(0,1,0), + btVector3(0,0,1), + btVector3(1,1,0), + btVector3(1,0,1), + btVector3(0,1,1), + btVector3(1,-1,0), + btVector3(1,0,-1), + btVector3(0,1,-1), + btVector3(1,1,1), + btVector3(1,-1,1), + btVector3(1,1,-1), + btVector3(1,-1,-1) +}; + +static inline int getSign(const btVector3& n, const btVector3& x) +{ + btScalar d = n.dot(x); + if (d>SIMD_EPSILON) + return 1; + if (d<-SIMD_EPSILON) + return -1; + return 0; +} + +static SIMD_FORCE_INLINE bool hasSeparatingPlane(const btSoftBody::Face* face, const btSoftBody::Node* node, const btScalar& dt) +{ + btVector3 hex[6] = {face->m_n[0]->m_x - node->m_x, + face->m_n[1]->m_x - node->m_x, + face->m_n[2]->m_x - node->m_x, + face->m_n[0]->m_x + dt*face->m_n[0]->m_v - node->m_x, + face->m_n[1]->m_x + dt*face->m_n[1]->m_v - node->m_x, + face->m_n[2]->m_x + dt*face->m_n[2]->m_v - node->m_x + }; + btVector3 segment = dt*node->m_v; + for (int i = 0; i < KDOP_COUNT; ++i) + { + int s = getSign(dop[i], segment); + int j = 0; + for (; j < 6; ++j) + { + if (getSign(dop[i], hex[j]) == s) + break; + } + if (j == 6) + return true; + } + return false; +} + +static SIMD_FORCE_INLINE bool nearZero(const btScalar& a) +{ + return (a>-SAFE_EPSILON && a<SAFE_EPSILON); +} +static SIMD_FORCE_INLINE bool sameSign(const btScalar& a, const btScalar& b) +{ + return (nearZero(a) || nearZero(b) || (a>SAFE_EPSILON && b>SAFE_EPSILON) || (a<-SAFE_EPSILON && b<-SAFE_EPSILON)); +} +static SIMD_FORCE_INLINE bool diffSign(const btScalar& a, const btScalar& b) +{ + return !sameSign(a, b); +} +inline btScalar evaluateBezier2(const btScalar &p0, const btScalar &p1, const btScalar &p2, const btScalar &t, const btScalar &s) +{ + btScalar s2 = s*s; + btScalar t2 = t*t; + + return p0*s2+p1*btScalar(2.0)*s*t+p2*t2; +} +inline btScalar evaluateBezier(const btScalar &p0, const btScalar &p1, const btScalar &p2, const btScalar &p3, const btScalar &t, const btScalar &s) +{ + btScalar s2 = s*s; + btScalar s3 = s2*s; + btScalar t2 = t*t; + btScalar t3 = t2*t; + + return p0*s3+p1*btScalar(3.0)*s2*t+p2*btScalar(3.0)*s*t2+p3*t3; +} +static SIMD_FORCE_INLINE bool getSigns(bool type_c, const btScalar& k0, const btScalar& k1, const btScalar& k2, const btScalar& k3, const btScalar& t0, const btScalar& t1, btScalar <0, btScalar <1) +{ + if (sameSign(t0, t1)) { + lt0 = t0; + lt1 = t0; + return true; + } + + if (type_c || diffSign(k0, k3)) { + btScalar ft = evaluateBezier(k0, k1, k2, k3, t0, -t1); + if (t0<-0) + ft = -ft; + + if (sameSign(ft, k0)) { + lt0 = t1; + lt1 = t1; + } + else { + lt0 = t0; + lt1 = t0; + } + return true; + } + + if (!type_c) { + btScalar ft = evaluateBezier(k0, k1, k2, k3, t0, -t1); + if (t0<-0) + ft = -ft; + + if (diffSign(ft, k0)) { + lt0 = t0; + lt1 = t1; + return true; + } + + btScalar fk = evaluateBezier2(k1-k0, k2-k1, k3-k2, t0, -t1); + + if (sameSign(fk, k1-k0)) + lt0 = lt1 = t1; + else + lt0 = lt1 = t0; + + return true; + } + return false; +} + +static SIMD_FORCE_INLINE void getBernsteinCoeff(const btSoftBody::Face* face, const btSoftBody::Node* node, const btScalar& dt, btScalar& k0, btScalar& k1, btScalar& k2, btScalar& k3) +{ + const btVector3& n0 = face->m_n0; + const btVector3& n1 = face->m_n1; + btVector3 n_hat = n0 + n1 - face->m_vn; + btVector3 p0ma0 = node->m_x - face->m_n[0]->m_x; + btVector3 p1ma1 = node->m_q - face->m_n[0]->m_q; + k0 = (p0ma0).dot(n0) * 3.0; + k1 = (p0ma0).dot(n_hat) + (p1ma1).dot(n0); + k2 = (p1ma1).dot(n_hat) + (p0ma0).dot(n1); + k3 = (p1ma1).dot(n1) * 3.0; +} + +static SIMD_FORCE_INLINE void polyDecomposition(const btScalar& k0, const btScalar& k1, const btScalar& k2, const btScalar& k3, const btScalar& j0, const btScalar& j1, const btScalar& j2, btScalar& u0, btScalar& u1, btScalar& v0, btScalar& v1) +{ + btScalar denom = 4.0 * (j1-j2) * (j1-j0) + (j2-j0) * (j2-j0); + u0 = (2.0*(j1-j2)*(3.0*k1-2.0*k0-k3) - (j0-j2)*(3.0*k2-2.0*k3-k0)) / denom; + u1 = (2.0*(j1-j0)*(3.0*k2-2.0*k3-k0) - (j2-j0)*(3.0*k1-2.0*k0-k3)) / denom; + v0 = k0-u0*j0; + v1 = k3-u1*j2; +} + +static SIMD_FORCE_INLINE bool rootFindingLemma(const btScalar& k0, const btScalar& k1, const btScalar& k2, const btScalar& k3) +{ + btScalar u0, u1, v0, v1; + btScalar j0 = 3.0*(k1-k0); + btScalar j1 = 3.0*(k2-k1); + btScalar j2 = 3.0*(k3-k2); + polyDecomposition(k0,k1,k2,k3,j0,j1,j2,u0,u1,v0,v1); + if (sameSign(v0, v1)) + { + btScalar Ypa = j0*(1.0-v0)*(1.0-v0) + 2.0*j1*v0*(1.0-v0) + j2*v0*v0; // Y'(v0) + if (sameSign(Ypa, j0)) + { + return (diffSign(k0,v1)); + } + } + return diffSign(k0,v0); +} + +static SIMD_FORCE_INLINE void getJs(const btScalar& k0, const btScalar& k1, const btScalar& k2, const btScalar& k3, const btSoftBody::Node* a, const btSoftBody::Node* b, const btSoftBody::Node* c, const btSoftBody::Node* p, const btScalar& dt, btScalar& j0, btScalar& j1, btScalar& j2) +{ + const btVector3& a0 = a->m_x; + const btVector3& b0 = b->m_x; + const btVector3& c0 = c->m_x; + const btVector3& va = a->m_v; + const btVector3& vb = b->m_v; + const btVector3& vc = c->m_v; + const btVector3 a1 = a0 + dt*va; + const btVector3 b1 = b0 + dt*vb; + const btVector3 c1 = c0 + dt*vc; + btVector3 n0 = (b0-a0).cross(c0-a0); + btVector3 n1 = (b1-a1).cross(c1-a1); + btVector3 n_hat = n0+n1 - dt*dt*(vb-va).cross(vc-va); + const btVector3& p0 = p->m_x; + const btVector3& vp = p->m_v; + btVector3 p1 = p0 + dt*vp; + btVector3 m0 = (b0-p0).cross(c0-p0); + btVector3 m1 = (b1-p1).cross(c1-p1); + btVector3 m_hat = m0+m1 - dt*dt*(vb-vp).cross(vc-vp); + btScalar l0 = m0.dot(n0); + btScalar l1 = 0.25 * (m0.dot(n_hat) + m_hat.dot(n0)); + btScalar l2 = btScalar(1)/btScalar(6)*(m0.dot(n1) + m_hat.dot(n_hat) + m1.dot(n0)); + btScalar l3 = 0.25 * (m_hat.dot(n1) + m1.dot(n_hat)); + btScalar l4 = m1.dot(n1); + + btScalar k1p = 0.25 * k0 + 0.75 * k1; + btScalar k2p = 0.5 * k1 + 0.5 * k2; + btScalar k3p = 0.75 * k2 + 0.25 * k3; + + btScalar s0 = (l1 * k0 - l0 * k1p)*4.0; + btScalar s1 = (l2 * k0 - l0 * k2p)*2.0; + btScalar s2 = (l3 * k0 - l0 * k3p)*btScalar(4)/btScalar(3); + btScalar s3 = l4 * k0 - l0 * k3; + + j0 = (s1*k0 - s0*k1) * 3.0; + j1 = (s2*k0 - s0*k2) * 1.5; + j2 = (s3*k0 - s0*k3); +} + +static SIMD_FORCE_INLINE bool signDetermination1Internal(const btScalar& k0, const btScalar& k1, const btScalar& k2, const btScalar& k3, const btScalar& u0, const btScalar& u1, const btScalar& v0, const btScalar& v1) +{ + btScalar Yu0 = k0*(1.0-u0)*(1.0-u0)*(1.0-u0) + 3.0*k1*u0*(1.0-u0)*(1.0-u0) + 3.0*k2*u0*u0*(1.0-u0) + k3*u0*u0*u0; // Y(u0) + btScalar Yv0 = k0*(1.0-v0)*(1.0-v0)*(1.0-v0) + 3.0*k1*v0*(1.0-v0)*(1.0-v0) + 3.0*k2*v0*v0*(1.0-v0) + k3*v0*v0*v0; // Y(v0) + + btScalar sign_Ytp = (u0 > u1) ? Yu0 : -Yu0; + btScalar L = sameSign(sign_Ytp, k0) ? u1 : u0; + sign_Ytp = (v0 > v1) ? Yv0 : -Yv0; + btScalar K = (sameSign(sign_Ytp,k0)) ? v1 : v0; + return diffSign(L,K); +} + +static SIMD_FORCE_INLINE bool signDetermination2Internal(const btScalar& k0, const btScalar& k1, const btScalar& k2, const btScalar& k3, const btScalar& j0, const btScalar& j1, const btScalar& j2, const btScalar& u0, const btScalar& u1, const btScalar& v0, const btScalar& v1) +{ + btScalar Yu0 = k0*(1.0-u0)*(1.0-u0)*(1.0-u0) + 3.0*k1*u0*(1.0-u0)*(1.0-u0) + 3.0*k2*u0*u0*(1.0-u0) + k3*u0*u0*u0; // Y(u0) + btScalar sign_Ytp = (u0 > u1) ? Yu0 : -Yu0, L1, L2; + if (diffSign(sign_Ytp,k0)) + { + L1 = u0; + L2 = u1; + } + else + { + btScalar Yp_u0 = j0*(1.0-u0)*(1.0-u0) + 2.0*j1*(1.0-u0)*u0 + j2*u0*u0; + if (sameSign(Yp_u0,j0)) + { + L1 = u1; + L2 = u1; + } + else + { + L1 = u0; + L2 = u0; + } + } + btScalar Yv0 = k0*(1.0-v0)*(1.0-v0)*(1.0-v0) + 3.0*k1*v0*(1.0-v0)*(1.0-v0) + 3.0*k2*v0*v0*(1.0-v0) + k3*v0*v0*v0; // Y(uv0) + sign_Ytp = (v0 > v1) ? Yv0 : -Yv0; + btScalar K1, K2; + if (diffSign(sign_Ytp,k0)) + { + K1 = v0; + K2 = v1; + } + else + { + btScalar Yp_v0 = j0*(1.0-v0)*(1.0-v0) + 2.0*j1*(1.0-v0)*v0 + j2*v0*v0; + if (sameSign(Yp_v0,j0)) + { + K1 = v1; + K2 = v1; + } + else + { + K1 = v0; + K2 = v0; + } + } + return (diffSign(K1, L1) || diffSign(L2, K2)); +} + +static SIMD_FORCE_INLINE bool signDetermination1(const btScalar& k0, const btScalar& k1, const btScalar& k2, const btScalar& k3, const btSoftBody::Face* face, const btSoftBody::Node* node, const btScalar& dt) +{ + btScalar j0, j1, j2, u0, u1, v0, v1; + // p1 + getJs(k0,k1,k2,k3,face->m_n[0], face->m_n[1], face->m_n[2], node, dt, j0, j1, j2); + if (nearZero(j0+j2-j1*2.0)) + { + btScalar lt0, lt1; + getSigns(true, k0, k1, k2, k3, j0, j2, lt0, lt1); + if (lt0 < -SAFE_EPSILON) + return false; + } + else + { + polyDecomposition(k0,k1,k2,k3,j0,j1,j2,u0,u1,v0,v1); + if (!signDetermination1Internal(k0,k1,k2,k3,u0,u1,v0,v1)) + return false; + } + // p2 + getJs(k0,k1,k2,k3,face->m_n[1], face->m_n[2], face->m_n[0], node, dt, j0, j1, j2); + if (nearZero(j0+j2-j1*2.0)) + { + btScalar lt0, lt1; + getSigns(true, k0, k1, k2, k3, j0, j2, lt0, lt1); + if (lt0 < -SAFE_EPSILON) + return false; + } + else + { + polyDecomposition(k0,k1,k2,k3,j0,j1,j2,u0,u1,v0,v1); + if (!signDetermination1Internal(k0,k1,k2,k3,u0,u1,v0,v1)) + return false; + } + // p3 + getJs(k0,k1,k2,k3,face->m_n[2], face->m_n[0], face->m_n[1], node, dt, j0, j1, j2); + if (nearZero(j0+j2-j1*2.0)) + { + btScalar lt0, lt1; + getSigns(true, k0, k1, k2, k3, j0, j2, lt0, lt1); + if (lt0 < -SAFE_EPSILON) + return false; + } + else + { + polyDecomposition(k0,k1,k2,k3,j0,j1,j2,u0,u1,v0,v1); + if (!signDetermination1Internal(k0,k1,k2,k3,u0,u1,v0,v1)) + return false; + } + return true; +} + +static SIMD_FORCE_INLINE bool signDetermination2(const btScalar& k0, const btScalar& k1, const btScalar& k2, const btScalar& k3, const btSoftBody::Face* face, const btSoftBody::Node* node, const btScalar& dt) +{ + btScalar j0, j1, j2, u0, u1, v0, v1; + // p1 + getJs(k0,k1,k2,k3,face->m_n[0], face->m_n[1], face->m_n[2], node, dt, j0, j1, j2); + if (nearZero(j0+j2-j1*2.0)) + { + btScalar lt0, lt1; + bool bt0 = true, bt1=true; + getSigns(false, k0, k1, k2, k3, j0, j2, lt0, lt1); + if (lt0 < -SAFE_EPSILON) + bt0 = false; + if (lt1 < -SAFE_EPSILON) + bt1 = false; + if (!bt0 && !bt1) + return false; + } + else + { + polyDecomposition(k0,k1,k2,k3,j0,j1,j2,u0,u1,v0,v1); + if (!signDetermination2Internal(k0,k1,k2,k3,j0,j1,j2,u0,u1,v0,v1)) + return false; + } + // p2 + getJs(k0,k1,k2,k3,face->m_n[1], face->m_n[2], face->m_n[0], node, dt, j0, j1, j2); + if (nearZero(j0+j2-j1*2.0)) + { + btScalar lt0, lt1; + bool bt0=true, bt1=true; + getSigns(false, k0, k1, k2, k3, j0, j2, lt0, lt1); + if (lt0 < -SAFE_EPSILON) + bt0 = false; + if (lt1 < -SAFE_EPSILON) + bt1 = false; + if (!bt0 && !bt1) + return false; + } + else + { + polyDecomposition(k0,k1,k2,k3,j0,j1,j2,u0,u1,v0,v1); + if (!signDetermination2Internal(k0,k1,k2,k3,j0,j1,j2,u0,u1,v0,v1)) + return false; + } + // p3 + getJs(k0,k1,k2,k3,face->m_n[2], face->m_n[0], face->m_n[1], node, dt, j0, j1, j2); + if (nearZero(j0+j2-j1*2.0)) + { + btScalar lt0, lt1; + bool bt0=true, bt1=true; + getSigns(false, k0, k1, k2, k3, j0, j2, lt0, lt1); + if (lt0 < -SAFE_EPSILON) + bt0 = false; + if (lt1 < -SAFE_EPSILON) + bt1 = false; + if (!bt0 && !bt1) + return false; + } + else + { + polyDecomposition(k0,k1,k2,k3,j0,j1,j2,u0,u1,v0,v1); + if (!signDetermination2Internal(k0,k1,k2,k3,j0,j1,j2,u0,u1,v0,v1)) + return false; + } + return true; +} + +static SIMD_FORCE_INLINE bool coplanarAndInsideTest(const btScalar& k0, const btScalar& k1, const btScalar& k2, const btScalar& k3, const btSoftBody::Face* face, const btSoftBody::Node* node, const btScalar& dt) +{ + // Coplanar test + if (diffSign(k1-k0, k3-k2)) + { + // Case b: + if (sameSign(k0, k3) && !rootFindingLemma(k0,k1,k2,k3)) + return false; + // inside test + return signDetermination2(k0, k1, k2, k3, face, node, dt); + } + else + { + // Case c: + if (sameSign(k0, k3)) + return false; + // inside test + return signDetermination1(k0, k1, k2, k3, face, node, dt); + } + return false; +} +static SIMD_FORCE_INLINE bool conservativeCulling(const btScalar& k0, const btScalar& k1, const btScalar& k2, const btScalar& k3, const btScalar& mrg) +{ + if (k0 > mrg && k1 > mrg && k2 > mrg && k3 > mrg) + return true; + if (k0 < -mrg && k1 < -mrg && k2 < -mrg && k3 < -mrg) + return true; + return false; +} + +static SIMD_FORCE_INLINE bool bernsteinVFTest(const btScalar& k0, const btScalar& k1, const btScalar& k2, const btScalar& k3, const btScalar& mrg, const btSoftBody::Face* face, const btSoftBody::Node* node, const btScalar& dt) +{ + if (conservativeCulling(k0, k1, k2, k3, mrg)) + return false; + return coplanarAndInsideTest(k0, k1, k2, k3, face, node, dt); +} + +static SIMD_FORCE_INLINE void deCasteljau(const btScalar& k0, const btScalar& k1, const btScalar& k2, const btScalar& k3, const btScalar& t0, btScalar& k10, btScalar& k20, btScalar& k30, btScalar& k21, btScalar& k12) +{ + k10 = k0*(1.0-t0) + k1*t0; + btScalar k11 = k1*(1.0-t0) + k2*t0; + k12 = k2*(1.0-t0) + k3*t0; + k20 = k10*(1.0-t0) + k11*t0; + k21 = k11*(1.0-t0) + k12*t0; + k30 = k20*(1.0-t0) + k21*t0; +} +static SIMD_FORCE_INLINE bool bernsteinVFTest(const btSoftBody::Face* face, const btSoftBody::Node* node, const btScalar& dt, const btScalar& mrg) +{ + btScalar k0, k1, k2, k3; + getBernsteinCoeff(face, node, dt, k0, k1, k2, k3); + if (conservativeCulling(k0, k1, k2, k3, mrg)) + return false; + return true; + if (diffSign(k2-2.0*k1+k0, k3-2.0*k2+k1)) + { + btScalar k10, k20, k30, k21, k12; + btScalar t0 = (k2-2.0*k1+k0)/(k0-3.0*k1+3.0*k2-k3); + deCasteljau(k0, k1, k2, k3, t0, k10, k20, k30, k21, k12); + return bernsteinVFTest(k0, k10, k20, k30, mrg, face, node, dt) || bernsteinVFTest(k30, k21, k12, k3, mrg, face, node, dt); + } + return coplanarAndInsideTest(k0, k1, k2, k3, face, node, dt); +} + +static SIMD_FORCE_INLINE bool continuousCollisionDetection(const btSoftBody::Face* face, const btSoftBody::Node* node, const btScalar& dt, const btScalar& mrg, btVector3& bary) +{ + if (hasSeparatingPlane(face, node, dt)) + return false; + btVector3 x21 = face->m_n[1]->m_x - face->m_n[0]->m_x; + btVector3 x31 = face->m_n[2]->m_x - face->m_n[0]->m_x; + btVector3 x41 = node->m_x - face->m_n[0]->m_x; + btVector3 v21 = face->m_n[1]->m_v - face->m_n[0]->m_v; + btVector3 v31 = face->m_n[2]->m_v - face->m_n[0]->m_v; + btVector3 v41 = node->m_v - face->m_n[0]->m_v; + btVector3 a = x21.cross(x31); + btVector3 b = x21.cross(v31) + v21.cross(x31); + btVector3 c = v21.cross(v31); + btVector3 d = x41; + btVector3 e = v41; + btScalar a0 = a.dot(d); + btScalar a1 = a.dot(e) + b.dot(d); + btScalar a2 = c.dot(d) + b.dot(e); + btScalar a3 = c.dot(e); + btScalar eps = SAFE_EPSILON; + int num_roots = 0; + btScalar roots[3]; + if (std::abs(a3) < eps) + { + // cubic term is zero + if (std::abs(a2) < eps) + { + if (std::abs(a1) < eps) + { + if (std::abs(a0) < eps) + { + num_roots = 2; + roots[0] = 0; + roots[1] = dt; + } + } + else + { + num_roots = 1; + roots[0] = -a0/a1; + } + } + else + { + num_roots = SolveP2(roots, a1/a2, a0/a2); + } + } + else + { + num_roots = SolveP3(roots, a2/a3, a1/a3, a0/a3); + } +// std::sort(roots, roots+num_roots); + if (num_roots > 1) + { + if (roots[0] > roots[1]) + btSwap(roots[0], roots[1]); + } + if (num_roots > 2) + { + if (roots[0] > roots[2]) + btSwap(roots[0], roots[2]); + if (roots[1] > roots[2]) + btSwap(roots[1], roots[2]); + } + for (int r = 0; r < num_roots; ++r) + { + double root = roots[r]; + if (root <= 0) + continue; + if (root > dt + SIMD_EPSILON) + return false; + btVector3 x1 = face->m_n[0]->m_x + root * face->m_n[0]->m_v; + btVector3 x2 = face->m_n[1]->m_x + root * face->m_n[1]->m_v; + btVector3 x3 = face->m_n[2]->m_x + root * face->m_n[2]->m_v; + btVector3 x4 = node->m_x + root * node->m_v; + btVector3 normal = (x2-x1).cross(x3-x1); + normal.safeNormalize(); + if (proximityTest(x1, x2, x3, x4, normal, mrg, bary)) + return true; + } + return false; +} +static SIMD_FORCE_INLINE bool bernsteinCCD(const btSoftBody::Face* face, const btSoftBody::Node* node, const btScalar& dt, const btScalar& mrg, btVector3& bary) +{ + if (!bernsteinVFTest(face, node, dt, mrg)) + return false; + if (!continuousCollisionDetection(face, node, dt, 1e-6, bary)) + return false; + return true; +} + // // btSymMatrix // @@ -373,6 +938,26 @@ static inline btMatrix3x3 OuterProduct(const btScalar* v1,const btScalar* v2,con return (m); } +static inline btMatrix3x3 OuterProduct(const btVector3& v1,const btVector3& v2) +{ + btMatrix3x3 m; + btScalar a11 = v1[0] * v2[0]; + btScalar a12 = v1[0] * v2[1]; + btScalar a13 = v1[0] * v2[2]; + + btScalar a21 = v1[1] * v2[0]; + btScalar a22 = v1[1] * v2[1]; + btScalar a23 = v1[1] * v2[2]; + + btScalar a31 = v1[2] * v2[0]; + btScalar a32 = v1[2] * v2[1]; + btScalar a33 = v1[2] * v2[2]; + m[0] = btVector3(a11, a12, a13); + m[1] = btVector3(a21, a22, a23); + m[2] = btVector3(a31, a32, a33); + return (m); +} + // static inline btMatrix3x3 Add(const btMatrix3x3& a, @@ -1070,8 +1655,8 @@ struct btSoftColliders if (!n.m_battach) { - // check for collision at x_{n+1}^* as well at x_n - if (psb->checkDeformableContact(m_colObj1Wrap, n.m_x, m, c.m_cti, /*predict = */ true) || psb->checkDeformableContact(m_colObj1Wrap, n.m_q, m, c.m_cti, /*predict = */ true)) + // check for collision at x_{n+1}^* + if (psb->checkDeformableContact(m_colObj1Wrap, n.m_q, m, c.m_cti, /*predict = */ true)) { const btScalar ima = n.m_im; // todo: collision between multibody and fixed deformable node will be missed. @@ -1159,7 +1744,6 @@ struct btSoftColliders btSoftBody::Node* n0 = f.m_n[0]; btSoftBody::Node* n1 = f.m_n[1]; btSoftBody::Node* n2 = f.m_n[2]; - const btScalar m = (n0->m_im > 0 && n1->m_im > 0 && n2->m_im > 0 )? dynmargin : stamargin; btSoftBody::DeformableFaceRigidContact c; btVector3 contact_point; @@ -1174,18 +1758,19 @@ struct btSoftColliders if (ms > 0) { // resolve contact at x_n - psb->checkDeformableFaceContact(m_colObj1Wrap, f, contact_point, bary, m, c.m_cti, /*predict = */ false); +// psb->checkDeformableFaceContact(m_colObj1Wrap, f, contact_point, bary, m, c.m_cti, /*predict = */ false); btSoftBody::sCti& cti = c.m_cti; c.m_contactPoint = contact_point; c.m_bary = bary; // todo xuchenhan@: this is assuming mass of all vertices are the same. Need to modify if mass are different for distinct vertices c.m_weights = btScalar(2)/(btScalar(1) + bary.length2()) * bary; c.m_face = &f; + // friction is handled by the nodes to prevent sticking +// const btScalar fc = 0; const btScalar fc = psb->m_cfg.kDF * m_colObj1Wrap->getCollisionObject()->getFriction(); // the effective inverse mass of the face as in https://graphics.stanford.edu/papers/cloth-sig02/cloth.pdf ima = bary.getX()*c.m_weights.getX() * n0->m_im + bary.getY()*c.m_weights.getY() * n1->m_im + bary.getZ()*c.m_weights.getZ() * n2->m_im; - c.m_c2 = ima; c.m_c3 = fc; c.m_c4 = m_colObj1Wrap->getCollisionObject()->isStaticOrKinematicObject() ? psb->m_cfg.kKHR : psb->m_cfg.kCHR; @@ -1316,19 +1901,11 @@ struct btSoftColliders { btSoftBody::Node* node = (btSoftBody::Node*)lnode->data; btSoftBody::Face* face = (btSoftBody::Face*)lface->data; - - btVector3 o = node->m_x; - btVector3 p; - btScalar d = SIMD_INFINITY; - ProjectOrigin(face->m_n[0]->m_x - o, - face->m_n[1]->m_x - o, - face->m_n[2]->m_x - o, - p, d); - const btScalar m = mrg + (o - node->m_q).safeNorm() * 2; - if (d < (m * m)) + btVector3 bary; + if (proximityTest(face->m_n[0]->m_x, face->m_n[1]->m_x, face->m_n[2]->m_x, node->m_x, face->m_normal, mrg, bary)) { const btSoftBody::Node* n[] = {face->m_n[0], face->m_n[1], face->m_n[2]}; - const btVector3 w = BaryCoord(n[0]->m_x, n[1]->m_x, n[2]->m_x, p + o); + const btVector3 w = bary; const btScalar ma = node->m_im; btScalar mb = BaryEval(n[0]->m_im, n[1]->m_im, n[2]->m_im, w); if ((n[0]->m_im <= 0) || @@ -1341,20 +1918,14 @@ struct btSoftColliders if (ms > 0) { btSoftBody::DeformableFaceNodeContact c; - if (useFaceNormal) - c.m_normal = face->m_normal; - else - c.m_normal = p / -btSqrt(d); + c.m_normal = face->m_normal; + if (!useFaceNormal && c.m_normal.dot(node->m_x - face->m_n[2]->m_x) < 0) + c.m_normal = -face->m_normal; c.m_margin = mrg; c.m_node = node; c.m_face = face; c.m_bary = w; - // todo xuchenhan@: this is assuming mass of all vertices are the same. Need to modify if mass are different for distinct vertices - c.m_weights = btScalar(2)/(btScalar(1) + w.length2()) * w; c.m_friction = psb[0]->m_cfg.kDF * psb[1]->m_cfg.kDF; - // the effective inverse mass of the face as in https://graphics.stanford.edu/papers/cloth-sig02/cloth.pdf - c.m_imf = c.m_bary[0]*c.m_weights[0] * n[0]->m_im + c.m_bary[1]*c.m_weights[1] * n[1]->m_im + c.m_bary[2]*c.m_weights[2] * n[2]->m_im; - c.m_c0 = btScalar(1)/(ma + c.m_imf); psb[0]->m_faceNodeContacts.push_back(c); } } @@ -1372,69 +1943,152 @@ struct btSoftColliders void Process(const btDbvntNode* lface1, const btDbvntNode* lface2) { - btSoftBody::Face* f = (btSoftBody::Face*)lface1->data; - btSoftBody::Face* face = (btSoftBody::Face*)lface2->data; + btSoftBody::Face* f1 = (btSoftBody::Face*)lface1->data; + btSoftBody::Face* f2 = (btSoftBody::Face*)lface2->data; + if (f1 != f2) + { + Repel(f1, f2); + Repel(f2, f1); + } + } + void Repel(btSoftBody::Face* f1, btSoftBody::Face* f2) + { + //#define REPEL_NEIGHBOR 1 +#ifndef REPEL_NEIGHBOR for (int node_id = 0; node_id < 3; ++node_id) { - btSoftBody::Node* node = f->m_n[node_id]; - bool skip = false; + btSoftBody::Node* node = f1->m_n[node_id]; for (int i = 0; i < 3; ++i) { - if (face->m_n[i] == node) + if (f2->m_n[i] == node) + return; + } + } +#endif + bool skip = false; + for (int node_id = 0; node_id < 3; ++node_id) + { + btSoftBody::Node* node = f1->m_n[node_id]; +#ifdef REPEL_NEIGHBOR + for (int i = 0; i < 3; ++i) + { + if (f2->m_n[i] == node) { skip = true; break; } } if (skip) + { + skip = false; + continue; + } +#endif + btSoftBody::Face* face = f2; + btVector3 bary; + if (!proximityTest(face->m_n[0]->m_x, face->m_n[1]->m_x, face->m_n[2]->m_x, node->m_x, face->m_normal, mrg, bary)) continue; - btVector3 o = node->m_x; - btVector3 p; - btScalar d = SIMD_INFINITY; - ProjectOrigin(face->m_n[0]->m_x - o, - face->m_n[1]->m_x - o, - face->m_n[2]->m_x - o, - p, d); - const btScalar m = mrg + (o - node->m_q).safeNorm() * 2; - if (d < (m * m)) + btSoftBody::DeformableFaceNodeContact c; + c.m_normal = face->m_normal; + if (!useFaceNormal && c.m_normal.dot(node->m_x - face->m_n[2]->m_x) < 0) + c.m_normal = -face->m_normal; + c.m_margin = mrg; + c.m_node = node; + c.m_face = face; + c.m_bary = bary; + c.m_friction = psb[0]->m_cfg.kDF * psb[1]->m_cfg.kDF; + psb[0]->m_faceNodeContacts.push_back(c); + } + } + btSoftBody* psb[2]; + btScalar mrg; + bool useFaceNormal; + }; + + struct CollideCCD : btDbvt::ICollide + { + void Process(const btDbvtNode* lnode, + const btDbvtNode* lface) + { + btSoftBody::Node* node = (btSoftBody::Node*)lnode->data; + btSoftBody::Face* face = (btSoftBody::Face*)lface->data; + btVector3 bary; + if (bernsteinCCD(face, node, dt, SAFE_EPSILON, bary)) + { + btSoftBody::DeformableFaceNodeContact c; + c.m_normal = face->m_normal; + if (!useFaceNormal && c.m_normal.dot(node->m_x - face->m_n[2]->m_x) < 0) + c.m_normal = -face->m_normal; + c.m_node = node; + c.m_face = face; + c.m_bary = bary; + c.m_friction = psb[0]->m_cfg.kDF * psb[1]->m_cfg.kDF; + psb[0]->m_faceNodeContacts.push_back(c); + } + } + void Process(const btDbvntNode* lface1, + const btDbvntNode* lface2) + { + btSoftBody::Face* f1 = (btSoftBody::Face*)lface1->data; + btSoftBody::Face* f2 = (btSoftBody::Face*)lface2->data; + if (f1 != f2) + { + Repel(f1, f2); + Repel(f2, f1); + } + } + void Repel(btSoftBody::Face* f1, btSoftBody::Face* f2) + { + //#define REPEL_NEIGHBOR 1 +#ifndef REPEL_NEIGHBOR + for (int node_id = 0; node_id < 3; ++node_id) + { + btSoftBody::Node* node = f1->m_n[node_id]; + for (int i = 0; i < 3; ++i) { - const btSoftBody::Node* n[] = {face->m_n[0], face->m_n[1], face->m_n[2]}; - const btVector3 w = BaryCoord(n[0]->m_x, n[1]->m_x, n[2]->m_x, p + o); - const btScalar ma = node->m_im; - btScalar mb = BaryEval(n[0]->m_im, n[1]->m_im, n[2]->m_im, w); - if ((n[0]->m_im <= 0) || - (n[1]->m_im <= 0) || - (n[2]->m_im <= 0)) - { - mb = 0; - } - const btScalar ms = ma + mb; - if (ms > 0) + if (f2->m_n[i] == node) + return; + } + } +#endif + bool skip = false; + for (int node_id = 0; node_id < 3; ++node_id) + { + btSoftBody::Node* node = f1->m_n[node_id]; +#ifdef REPEL_NEIGHBOR + for (int i = 0; i < 3; ++i) + { + if (f2->m_n[i] == node) { - btSoftBody::DeformableFaceNodeContact c; - if (useFaceNormal) - c.m_normal = face->m_normal; - else - c.m_normal = p / -btSqrt(d); - c.m_margin = mrg; - c.m_node = node; - c.m_face = face; - c.m_bary = w; - // todo xuchenhan@: this is assuming mass of all vertices are the same. Need to modify if mass are different for distinct vertices - c.m_weights = btScalar(2)/(btScalar(1) + w.length2()) * w; - c.m_friction = psb[0]->m_cfg.kDF * psb[1]->m_cfg.kDF; - // the effective inverse mass of the face as in https://graphics.stanford.edu/papers/cloth-sig02/cloth.pdf - c.m_imf = c.m_bary[0]*c.m_weights[0] * n[0]->m_im + c.m_bary[1]*c.m_weights[1] * n[1]->m_im + c.m_bary[2]*c.m_weights[2] * n[2]->m_im; - c.m_c0 = btScalar(1)/(ma + c.m_imf); - psb[0]->m_faceNodeContacts.push_back(c); + skip = true; + break; } } + if (skip) + { + skip = false; + continue; + } +#endif + btSoftBody::Face* face = f2; + btVector3 bary; + if (bernsteinCCD(face, node, dt, SAFE_EPSILON, bary)) + { + btSoftBody::DeformableFaceNodeContact c; + c.m_normal = face->m_normal; + if (!useFaceNormal && c.m_normal.dot(node->m_x - face->m_n[2]->m_x) < 0) + c.m_normal = -face->m_normal; + c.m_node = node; + c.m_face = face; + c.m_bary = bary; + c.m_friction = psb[0]->m_cfg.kDF * psb[1]->m_cfg.kDF; + psb[0]->m_faceNodeContacts.push_back(c); + } } } btSoftBody* psb[2]; - btScalar mrg; + btScalar dt, mrg; bool useFaceNormal; }; }; - #endif //_BT_SOFT_BODY_INTERNALS_H diff --git a/thirdparty/bullet/BulletSoftBody/btSoftRigidCollisionAlgorithm.cpp b/thirdparty/bullet/BulletSoftBody/btSoftRigidCollisionAlgorithm.cpp index 56d8083f22..5b65216e4b 100644 --- a/thirdparty/bullet/BulletSoftBody/btSoftRigidCollisionAlgorithm.cpp +++ b/thirdparty/bullet/BulletSoftBody/btSoftRigidCollisionAlgorithm.cpp @@ -48,9 +48,10 @@ btSoftRigidCollisionAlgorithm::~btSoftRigidCollisionAlgorithm() } #include <stdio.h> - +#include "LinearMath/btQuickprof.h" void btSoftRigidCollisionAlgorithm::processCollision(const btCollisionObjectWrapper* body0Wrap, const btCollisionObjectWrapper* body1Wrap, const btDispatcherInfo& dispatchInfo, btManifoldResult* resultOut) { + BT_PROFILE("btSoftRigidCollisionAlgorithm::processCollision"); (void)dispatchInfo; (void)resultOut; //printf("btSoftRigidCollisionAlgorithm\n"); diff --git a/thirdparty/bullet/BulletSoftBody/poly34.cpp b/thirdparty/bullet/BulletSoftBody/poly34.cpp new file mode 100644 index 0000000000..819d0c79f7 --- /dev/null +++ b/thirdparty/bullet/BulletSoftBody/poly34.cpp @@ -0,0 +1,419 @@ +// poly34.cpp : solution of cubic and quartic equation +// (c) Khashin S.I. http://math.ivanovo.ac.ru/dalgebra/Khashin/index.html +// khash2 (at) gmail.com +// Thanks to Alexandr Rakhmanin <rakhmanin (at) gmail.com> +// public domain +// +#include <math.h> + +#include "poly34.h" // solution of cubic and quartic equation +#define TwoPi 6.28318530717958648 +const btScalar eps = SIMD_EPSILON; + +//============================================================================= +// _root3, root3 from http://prografix.narod.ru +//============================================================================= +static SIMD_FORCE_INLINE btScalar _root3(btScalar x) +{ + btScalar s = 1.; + while (x < 1.) { + x *= 8.; + s *= 0.5; + } + while (x > 8.) { + x *= 0.125; + s *= 2.; + } + btScalar r = 1.5; + r -= 1. / 3. * (r - x / (r * r)); + r -= 1. / 3. * (r - x / (r * r)); + r -= 1. / 3. * (r - x / (r * r)); + r -= 1. / 3. * (r - x / (r * r)); + r -= 1. / 3. * (r - x / (r * r)); + r -= 1. / 3. * (r - x / (r * r)); + return r * s; +} + +btScalar SIMD_FORCE_INLINE root3(btScalar x) +{ + if (x > 0) + return _root3(x); + else if (x < 0) + return -_root3(-x); + else + return 0.; +} + +// x - array of size 2 +// return 2: 2 real roots x[0], x[1] +// return 0: pair of complex roots: x[0]i*x[1] +int SolveP2(btScalar* x, btScalar a, btScalar b) +{ // solve equation x^2 + a*x + b = 0 + btScalar D = 0.25 * a * a - b; + if (D >= 0) { + D = sqrt(D); + x[0] = -0.5 * a + D; + x[1] = -0.5 * a - D; + return 2; + } + x[0] = -0.5 * a; + x[1] = sqrt(-D); + return 0; +} +//--------------------------------------------------------------------------- +// x - array of size 3 +// In case 3 real roots: => x[0], x[1], x[2], return 3 +// 2 real roots: x[0], x[1], return 2 +// 1 real root : x[0], x[1] i*x[2], return 1 +int SolveP3(btScalar* x, btScalar a, btScalar b, btScalar c) +{ // solve cubic equation x^3 + a*x^2 + b*x + c = 0 + btScalar a2 = a * a; + btScalar q = (a2 - 3 * b) / 9; + if (q < 0) + q = eps; + btScalar r = (a * (2 * a2 - 9 * b) + 27 * c) / 54; + // equation x^3 + q*x + r = 0 + btScalar r2 = r * r; + btScalar q3 = q * q * q; + btScalar A, B; + if (r2 <= (q3 + eps)) { //<<-- FIXED! + btScalar t = r / sqrt(q3); + if (t < -1) + t = -1; + if (t > 1) + t = 1; + t = acos(t); + a /= 3; + q = -2 * sqrt(q); + x[0] = q * cos(t / 3) - a; + x[1] = q * cos((t + TwoPi) / 3) - a; + x[2] = q * cos((t - TwoPi) / 3) - a; + return (3); + } + else { + //A =-pow(fabs(r)+sqrt(r2-q3),1./3); + A = -root3(fabs(r) + sqrt(r2 - q3)); + if (r < 0) + A = -A; + B = (A == 0 ? 0 : q / A); + + a /= 3; + x[0] = (A + B) - a; + x[1] = -0.5 * (A + B) - a; + x[2] = 0.5 * sqrt(3.) * (A - B); + if (fabs(x[2]) < eps) { + x[2] = x[1]; + return (2); + } + return (1); + } +} // SolveP3(btScalar *x,btScalar a,btScalar b,btScalar c) { +//--------------------------------------------------------------------------- +// a>=0! +void CSqrt(btScalar x, btScalar y, btScalar& a, btScalar& b) // returns: a+i*s = sqrt(x+i*y) +{ + btScalar r = sqrt(x * x + y * y); + if (y == 0) { + r = sqrt(r); + if (x >= 0) { + a = r; + b = 0; + } + else { + a = 0; + b = r; + } + } + else { // y != 0 + a = sqrt(0.5 * (x + r)); + b = 0.5 * y / a; + } +} +//--------------------------------------------------------------------------- +int SolveP4Bi(btScalar* x, btScalar b, btScalar d) // solve equation x^4 + b*x^2 + d = 0 +{ + btScalar D = b * b - 4 * d; + if (D >= 0) { + btScalar sD = sqrt(D); + btScalar x1 = (-b + sD) / 2; + btScalar x2 = (-b - sD) / 2; // x2 <= x1 + if (x2 >= 0) // 0 <= x2 <= x1, 4 real roots + { + btScalar sx1 = sqrt(x1); + btScalar sx2 = sqrt(x2); + x[0] = -sx1; + x[1] = sx1; + x[2] = -sx2; + x[3] = sx2; + return 4; + } + if (x1 < 0) // x2 <= x1 < 0, two pair of imaginary roots + { + btScalar sx1 = sqrt(-x1); + btScalar sx2 = sqrt(-x2); + x[0] = 0; + x[1] = sx1; + x[2] = 0; + x[3] = sx2; + return 0; + } + // now x2 < 0 <= x1 , two real roots and one pair of imginary root + btScalar sx1 = sqrt(x1); + btScalar sx2 = sqrt(-x2); + x[0] = -sx1; + x[1] = sx1; + x[2] = 0; + x[3] = sx2; + return 2; + } + else { // if( D < 0 ), two pair of compex roots + btScalar sD2 = 0.5 * sqrt(-D); + CSqrt(-0.5 * b, sD2, x[0], x[1]); + CSqrt(-0.5 * b, -sD2, x[2], x[3]); + return 0; + } // if( D>=0 ) +} // SolveP4Bi(btScalar *x, btScalar b, btScalar d) // solve equation x^4 + b*x^2 d +//--------------------------------------------------------------------------- +#define SWAP(a, b) \ +{ \ +t = b; \ +b = a; \ +a = t; \ +} +static void dblSort3(btScalar& a, btScalar& b, btScalar& c) // make: a <= b <= c +{ + btScalar t; + if (a > b) + SWAP(a, b); // now a<=b + if (c < b) { + SWAP(b, c); // now a<=b, b<=c + if (a > b) + SWAP(a, b); // now a<=b + } +} +//--------------------------------------------------------------------------- +int SolveP4De(btScalar* x, btScalar b, btScalar c, btScalar d) // solve equation x^4 + b*x^2 + c*x + d +{ + //if( c==0 ) return SolveP4Bi(x,b,d); // After that, c!=0 + if (fabs(c) < 1e-14 * (fabs(b) + fabs(d))) + return SolveP4Bi(x, b, d); // After that, c!=0 + + int res3 = SolveP3(x, 2 * b, b * b - 4 * d, -c * c); // solve resolvent + // by Viet theorem: x1*x2*x3=-c*c not equals to 0, so x1!=0, x2!=0, x3!=0 + if (res3 > 1) // 3 real roots, + { + dblSort3(x[0], x[1], x[2]); // sort roots to x[0] <= x[1] <= x[2] + // Note: x[0]*x[1]*x[2]= c*c > 0 + if (x[0] > 0) // all roots are positive + { + btScalar sz1 = sqrt(x[0]); + btScalar sz2 = sqrt(x[1]); + btScalar sz3 = sqrt(x[2]); + // Note: sz1*sz2*sz3= -c (and not equal to 0) + if (c > 0) { + x[0] = (-sz1 - sz2 - sz3) / 2; + x[1] = (-sz1 + sz2 + sz3) / 2; + x[2] = (+sz1 - sz2 + sz3) / 2; + x[3] = (+sz1 + sz2 - sz3) / 2; + return 4; + } + // now: c<0 + x[0] = (-sz1 - sz2 + sz3) / 2; + x[1] = (-sz1 + sz2 - sz3) / 2; + x[2] = (+sz1 - sz2 - sz3) / 2; + x[3] = (+sz1 + sz2 + sz3) / 2; + return 4; + } // if( x[0] > 0) // all roots are positive + // now x[0] <= x[1] < 0, x[2] > 0 + // two pair of comlex roots + btScalar sz1 = sqrt(-x[0]); + btScalar sz2 = sqrt(-x[1]); + btScalar sz3 = sqrt(x[2]); + + if (c > 0) // sign = -1 + { + x[0] = -sz3 / 2; + x[1] = (sz1 - sz2) / 2; // x[0]i*x[1] + x[2] = sz3 / 2; + x[3] = (-sz1 - sz2) / 2; // x[2]i*x[3] + return 0; + } + // now: c<0 , sign = +1 + x[0] = sz3 / 2; + x[1] = (-sz1 + sz2) / 2; + x[2] = -sz3 / 2; + x[3] = (sz1 + sz2) / 2; + return 0; + } // if( res3>1 ) // 3 real roots, + // now resoventa have 1 real and pair of compex roots + // x[0] - real root, and x[0]>0, + // x[1]i*x[2] - complex roots, + // x[0] must be >=0. But one times x[0]=~ 1e-17, so: + if (x[0] < 0) + x[0] = 0; + btScalar sz1 = sqrt(x[0]); + btScalar szr, szi; + CSqrt(x[1], x[2], szr, szi); // (szr+i*szi)^2 = x[1]+i*x[2] + if (c > 0) // sign = -1 + { + x[0] = -sz1 / 2 - szr; // 1st real root + x[1] = -sz1 / 2 + szr; // 2nd real root + x[2] = sz1 / 2; + x[3] = szi; + return 2; + } + // now: c<0 , sign = +1 + x[0] = sz1 / 2 - szr; // 1st real root + x[1] = sz1 / 2 + szr; // 2nd real root + x[2] = -sz1 / 2; + x[3] = szi; + return 2; +} // SolveP4De(btScalar *x, btScalar b, btScalar c, btScalar d) // solve equation x^4 + b*x^2 + c*x + d +//----------------------------------------------------------------------------- +btScalar N4Step(btScalar x, btScalar a, btScalar b, btScalar c, btScalar d) // one Newton step for x^4 + a*x^3 + b*x^2 + c*x + d +{ + btScalar fxs = ((4 * x + 3 * a) * x + 2 * b) * x + c; // f'(x) + if (fxs == 0) + return x; //return 1e99; <<-- FIXED! + btScalar fx = (((x + a) * x + b) * x + c) * x + d; // f(x) + return x - fx / fxs; +} +//----------------------------------------------------------------------------- +// x - array of size 4 +// return 4: 4 real roots x[0], x[1], x[2], x[3], possible multiple roots +// return 2: 2 real roots x[0], x[1] and complex x[2]i*x[3], +// return 0: two pair of complex roots: x[0]i*x[1], x[2]i*x[3], +int SolveP4(btScalar* x, btScalar a, btScalar b, btScalar c, btScalar d) +{ // solve equation x^4 + a*x^3 + b*x^2 + c*x + d by Dekart-Euler method + // move to a=0: + btScalar d1 = d + 0.25 * a * (0.25 * b * a - 3. / 64 * a * a * a - c); + btScalar c1 = c + 0.5 * a * (0.25 * a * a - b); + btScalar b1 = b - 0.375 * a * a; + int res = SolveP4De(x, b1, c1, d1); + if (res == 4) { + x[0] -= a / 4; + x[1] -= a / 4; + x[2] -= a / 4; + x[3] -= a / 4; + } + else if (res == 2) { + x[0] -= a / 4; + x[1] -= a / 4; + x[2] -= a / 4; + } + else { + x[0] -= a / 4; + x[2] -= a / 4; + } + // one Newton step for each real root: + if (res > 0) { + x[0] = N4Step(x[0], a, b, c, d); + x[1] = N4Step(x[1], a, b, c, d); + } + if (res > 2) { + x[2] = N4Step(x[2], a, b, c, d); + x[3] = N4Step(x[3], a, b, c, d); + } + return res; +} +//----------------------------------------------------------------------------- +#define F5(t) (((((t + a) * t + b) * t + c) * t + d) * t + e) +//----------------------------------------------------------------------------- +btScalar SolveP5_1(btScalar a, btScalar b, btScalar c, btScalar d, btScalar e) // return real root of x^5 + a*x^4 + b*x^3 + c*x^2 + d*x + e = 0 +{ + int cnt; + if (fabs(e) < eps) + return 0; + + btScalar brd = fabs(a); // brd - border of real roots + if (fabs(b) > brd) + brd = fabs(b); + if (fabs(c) > brd) + brd = fabs(c); + if (fabs(d) > brd) + brd = fabs(d); + if (fabs(e) > brd) + brd = fabs(e); + brd++; // brd - border of real roots + + btScalar x0, f0; // less than root + btScalar x1, f1; // greater than root + btScalar x2, f2, f2s; // next values, f(x2), f'(x2) + btScalar dx = 0; + + if (e < 0) { + x0 = 0; + x1 = brd; + f0 = e; + f1 = F5(x1); + x2 = 0.01 * brd; + } // positive root + else { + x0 = -brd; + x1 = 0; + f0 = F5(x0); + f1 = e; + x2 = -0.01 * brd; + } // negative root + + if (fabs(f0) < eps) + return x0; + if (fabs(f1) < eps) + return x1; + + // now x0<x1, f(x0)<0, f(x1)>0 + // Firstly 10 bisections + for (cnt = 0; cnt < 10; cnt++) { + x2 = (x0 + x1) / 2; // next point + //x2 = x0 - f0*(x1 - x0) / (f1 - f0); // next point + f2 = F5(x2); // f(x2) + if (fabs(f2) < eps) + return x2; + if (f2 > 0) { + x1 = x2; + f1 = f2; + } + else { + x0 = x2; + f0 = f2; + } + } + + // At each step: + // x0<x1, f(x0)<0, f(x1)>0. + // x2 - next value + // we hope that x0 < x2 < x1, but not necessarily + do { + if (cnt++ > 50) + break; + if (x2 <= x0 || x2 >= x1) + x2 = (x0 + x1) / 2; // now x0 < x2 < x1 + f2 = F5(x2); // f(x2) + if (fabs(f2) < eps) + return x2; + if (f2 > 0) { + x1 = x2; + f1 = f2; + } + else { + x0 = x2; + f0 = f2; + } + f2s = (((5 * x2 + 4 * a) * x2 + 3 * b) * x2 + 2 * c) * x2 + d; // f'(x2) + if (fabs(f2s) < eps) { + x2 = 1e99; + continue; + } + dx = f2 / f2s; + x2 -= dx; + } while (fabs(dx) > eps); + return x2; +} // SolveP5_1(btScalar a,btScalar b,btScalar c,btScalar d,btScalar e) // return real root of x^5 + a*x^4 + b*x^3 + c*x^2 + d*x + e = 0 +//----------------------------------------------------------------------------- +int SolveP5(btScalar* x, btScalar a, btScalar b, btScalar c, btScalar d, btScalar e) // solve equation x^5 + a*x^4 + b*x^3 + c*x^2 + d*x + e = 0 +{ + btScalar r = x[0] = SolveP5_1(a, b, c, d, e); + btScalar a1 = a + r, b1 = b + r * a1, c1 = c + r * b1, d1 = d + r * c1; + return 1 + SolveP4(x + 1, a1, b1, c1, d1); +} // SolveP5(btScalar *x,btScalar a,btScalar b,btScalar c,btScalar d,btScalar e) // solve equation x^5 + a*x^4 + b*x^3 + c*x^2 + d*x + e = 0 +//----------------------------------------------------------------------------- diff --git a/thirdparty/bullet/BulletSoftBody/poly34.h b/thirdparty/bullet/BulletSoftBody/poly34.h new file mode 100644 index 0000000000..32ad5d7da5 --- /dev/null +++ b/thirdparty/bullet/BulletSoftBody/poly34.h @@ -0,0 +1,38 @@ +// poly34.h : solution of cubic and quartic equation +// (c) Khashin S.I. http://math.ivanovo.ac.ru/dalgebra/Khashin/index.html +// khash2 (at) gmail.com + +#ifndef POLY_34 +#define POLY_34 +#include "LinearMath/btScalar.h" +// x - array of size 2 +// return 2: 2 real roots x[0], x[1] +// return 0: pair of complex roots: x[0]i*x[1] +int SolveP2(btScalar* x, btScalar a, btScalar b); // solve equation x^2 + a*x + b = 0 + +// x - array of size 3 +// return 3: 3 real roots x[0], x[1], x[2] +// return 1: 1 real root x[0] and pair of complex roots: x[1]i*x[2] +int SolveP3(btScalar* x, btScalar a, btScalar b, btScalar c); // solve cubic equation x^3 + a*x^2 + b*x + c = 0 + +// x - array of size 4 +// return 4: 4 real roots x[0], x[1], x[2], x[3], possible multiple roots +// return 2: 2 real roots x[0], x[1] and complex x[2]i*x[3], +// return 0: two pair of complex roots: x[0]i*x[1], x[2]i*x[3], +int SolveP4(btScalar* x, btScalar a, btScalar b, btScalar c, btScalar d); // solve equation x^4 + a*x^3 + b*x^2 + c*x + d = 0 by Dekart-Euler method + +// x - array of size 5 +// return 5: 5 real roots x[0], x[1], x[2], x[3], x[4], possible multiple roots +// return 3: 3 real roots x[0], x[1], x[2] and complex x[3]i*x[4], +// return 1: 1 real root x[0] and two pair of complex roots: x[1]i*x[2], x[3]i*x[4], +int SolveP5(btScalar* x, btScalar a, btScalar b, btScalar c, btScalar d, btScalar e); // solve equation x^5 + a*x^4 + b*x^3 + c*x^2 + d*x + e = 0 + +//----------------------------------------------------------------------------- +// And some additional functions for internal use. +// Your may remove this definitions from here +int SolveP4Bi(btScalar* x, btScalar b, btScalar d); // solve equation x^4 + b*x^2 + d = 0 +int SolveP4De(btScalar* x, btScalar b, btScalar c, btScalar d); // solve equation x^4 + b*x^2 + c*x + d = 0 +void CSqrt(btScalar x, btScalar y, btScalar& a, btScalar& b); // returns as a+i*s, sqrt(x+i*y) +btScalar N4Step(btScalar x, btScalar a, btScalar b, btScalar c, btScalar d); // one Newton step for x^4 + a*x^3 + b*x^2 + c*x + d +btScalar SolveP5_1(btScalar a, btScalar b, btScalar c, btScalar d, btScalar e); // return real root of x^5 + a*x^4 + b*x^3 + c*x^2 + d*x + e = 0 +#endif diff --git a/thirdparty/bullet/LinearMath/btImplicitQRSVD.h b/thirdparty/bullet/LinearMath/btImplicitQRSVD.h index 7b4cfaf21e..aaedc964f6 100644 --- a/thirdparty/bullet/LinearMath/btImplicitQRSVD.h +++ b/thirdparty/bullet/LinearMath/btImplicitQRSVD.h @@ -41,7 +41,7 @@ #ifndef btImplicitQRSVD_h #define btImplicitQRSVD_h - +#include <limits> #include "btMatrix3x3.h" class btMatrix2x2 { @@ -753,7 +753,7 @@ inline int singularValueDecomposition(const btMatrix3x3& A, btMatrix3x3& V, btScalar tol = 128*std::numeric_limits<btScalar>::epsilon()) { - using std::fabs; +// using std::fabs; btMatrix3x3 B = A; U.setIdentity(); V.setIdentity(); diff --git a/thirdparty/bullet/LinearMath/btMatrix3x3.h b/thirdparty/bullet/LinearMath/btMatrix3x3.h index cc33a68664..9c90fee1d2 100644 --- a/thirdparty/bullet/LinearMath/btMatrix3x3.h +++ b/thirdparty/bullet/LinearMath/btMatrix3x3.h @@ -26,10 +26,12 @@ subject to the following restrictions: #endif #if defined(BT_USE_SSE) +#define v0000 (_mm_set_ps(0.0f, 0.0f, 0.0f, 0.0f)) #define v1000 (_mm_set_ps(0.0f, 0.0f, 0.0f, 1.0f)) #define v0100 (_mm_set_ps(0.0f, 0.0f, 1.0f, 0.0f)) #define v0010 (_mm_set_ps(0.0f, 1.0f, 0.0f, 0.0f)) #elif defined(BT_USE_NEON) +const btSimdFloat4 ATTRIBUTE_ALIGNED16(v0000) = {0.0f, 0.0f, 0.0f, 0.0f}; const btSimdFloat4 ATTRIBUTE_ALIGNED16(v1000) = {1.0f, 0.0f, 0.0f, 0.0f}; const btSimdFloat4 ATTRIBUTE_ALIGNED16(v0100) = {0.0f, 1.0f, 0.0f, 0.0f}; const btSimdFloat4 ATTRIBUTE_ALIGNED16(v0010) = {0.0f, 0.0f, 1.0f, 0.0f}; @@ -330,6 +332,20 @@ public: btScalar(0.0), btScalar(0.0), btScalar(1.0)); #endif } + + /**@brief Set the matrix to the identity */ + void setZero() + { +#if (defined(BT_USE_SSE_IN_API) && defined(BT_USE_SSE)) || defined(BT_USE_NEON) + m_el[0] = v0000; + m_el[1] = v0000; + m_el[2] = v0000; +#else + setValue(btScalar(0.0), btScalar(0.0), btScalar(0.0), + btScalar(0.0), btScalar(0.0), btScalar(0.0), + btScalar(0.0), btScalar(0.0), btScalar(0.0)); +#endif + } static const btMatrix3x3& getIdentity() { diff --git a/thirdparty/bullet/LinearMath/btMatrixX.h b/thirdparty/bullet/LinearMath/btMatrixX.h index 961c94dc63..bb0f0dd259 100644 --- a/thirdparty/bullet/LinearMath/btMatrixX.h +++ b/thirdparty/bullet/LinearMath/btMatrixX.h @@ -346,10 +346,9 @@ struct btMatrixX T dotProd = 0; { { - int r = rows(); int c = cols(); - for (int k = 0; k < cols(); k++) + for (int k = 0; k < c; k++) { T w = (*this)(i, k); if (other(k, j) != 0.f) diff --git a/thirdparty/bullet/LinearMath/btModifiedGramSchmidt.h b/thirdparty/bullet/LinearMath/btModifiedGramSchmidt.h new file mode 100644 index 0000000000..33bab8d650 --- /dev/null +++ b/thirdparty/bullet/LinearMath/btModifiedGramSchmidt.h @@ -0,0 +1,83 @@ +// +// btModifiedGramSchmidt.h +// LinearMath +// +// Created by Xuchen Han on 4/4/20. +// + +#ifndef btModifiedGramSchmidt_h +#define btModifiedGramSchmidt_h + +#include "btReducedVector.h" +#include "btAlignedObjectArray.h" +#include <iostream> +#include <cmath> +template<class TV> +class btModifiedGramSchmidt +{ +public: + btAlignedObjectArray<TV> m_in; + btAlignedObjectArray<TV> m_out; + + btModifiedGramSchmidt(const btAlignedObjectArray<TV>& vecs): m_in(vecs) + { + m_out.resize(0); + } + + void solve() + { + m_out.resize(m_in.size()); + for (int i = 0; i < m_in.size(); ++i) + { +// printf("========= starting %d ==========\n", i); + TV v(m_in[i]); +// v.print(); + for (int j = 0; j < i; ++j) + { + v = v - v.proj(m_out[j]); +// v.print(); + } + v.normalize(); + m_out[i] = v; +// v.print(); + } + } + + void test() + { + std::cout << SIMD_EPSILON << std::endl; + printf("=======inputs=========\n"); + for (int i = 0; i < m_out.size(); ++i) + { + m_in[i].print(); + } + printf("=======output=========\n"); + for (int i = 0; i < m_out.size(); ++i) + { + m_out[i].print(); + } + btScalar eps = SIMD_EPSILON; + for (int i = 0; i < m_out.size(); ++i) + { + for (int j = 0; j < m_out.size(); ++j) + { + if (i == j) + { + if (std::abs(1.0-m_out[i].dot(m_out[j])) > eps)// && std::abs(m_out[i].dot(m_out[j])) > eps) + { + printf("vec[%d] is not unit, norm squared = %f\n", i,m_out[i].dot(m_out[j])); + } + } + else + { + if (std::abs(m_out[i].dot(m_out[j])) > eps) + { + printf("vec[%d] and vec[%d] is not orthogonal, dot product = %f\n", i, j, m_out[i].dot(m_out[j])); + } + } + } + } + } +}; +template class btModifiedGramSchmidt<btReducedVector>; +#endif /* btModifiedGramSchmidt_h */ diff --git a/thirdparty/bullet/LinearMath/btReducedVector.cpp b/thirdparty/bullet/LinearMath/btReducedVector.cpp new file mode 100644 index 0000000000..1539584e7e --- /dev/null +++ b/thirdparty/bullet/LinearMath/btReducedVector.cpp @@ -0,0 +1,170 @@ +// +// btReducedVector.cpp +// LinearMath +// +// Created by Xuchen Han on 4/4/20. +// +#include <stdio.h> +#include "btReducedVector.h" +#include <cmath> + +// returns the projection of this onto other +btReducedVector btReducedVector::proj(const btReducedVector& other) const +{ + btReducedVector ret(m_sz); + btScalar other_length2 = other.length2(); + if (other_length2 < SIMD_EPSILON) + { + return ret; + } + return other*(this->dot(other))/other_length2; +} + +void btReducedVector::normalize() +{ + if (this->length2() < SIMD_EPSILON) + { + m_indices.clear(); + m_vecs.clear(); + return; + } + *this /= std::sqrt(this->length2()); +} + +bool btReducedVector::testAdd() const +{ + int sz = 5; + btAlignedObjectArray<int> id1; + id1.push_back(1); + id1.push_back(3); + btAlignedObjectArray<btVector3> v1; + v1.push_back(btVector3(1,0,1)); + v1.push_back(btVector3(3,1,5)); + btAlignedObjectArray<int> id2; + id2.push_back(2); + id2.push_back(3); + id2.push_back(5); + btAlignedObjectArray<btVector3> v2; + v2.push_back(btVector3(2,3,1)); + v2.push_back(btVector3(3,4,9)); + v2.push_back(btVector3(0,4,0)); + btAlignedObjectArray<int> id3; + id3.push_back(1); + id3.push_back(2); + id3.push_back(3); + id3.push_back(5); + btAlignedObjectArray<btVector3> v3; + v3.push_back(btVector3(1,0,1)); + v3.push_back(btVector3(2,3,1)); + v3.push_back(btVector3(6,5,14)); + v3.push_back(btVector3(0,4,0)); + btReducedVector rv1(sz, id1, v1); + btReducedVector rv2(sz, id2, v2); + btReducedVector ans(sz, id3, v3); + bool ret = ((ans == rv1+rv2) && (ans == rv2+rv1)); + if (!ret) + printf("btReducedVector testAdd failed\n"); + return ret; +} + +bool btReducedVector::testMinus() const +{ + int sz = 5; + btAlignedObjectArray<int> id1; + id1.push_back(1); + id1.push_back(3); + btAlignedObjectArray<btVector3> v1; + v1.push_back(btVector3(1,0,1)); + v1.push_back(btVector3(3,1,5)); + btAlignedObjectArray<int> id2; + id2.push_back(2); + id2.push_back(3); + id2.push_back(5); + btAlignedObjectArray<btVector3> v2; + v2.push_back(btVector3(2,3,1)); + v2.push_back(btVector3(3,4,9)); + v2.push_back(btVector3(0,4,0)); + btAlignedObjectArray<int> id3; + id3.push_back(1); + id3.push_back(2); + id3.push_back(3); + id3.push_back(5); + btAlignedObjectArray<btVector3> v3; + v3.push_back(btVector3(-1,-0,-1)); + v3.push_back(btVector3(2,3,1)); + v3.push_back(btVector3(0,3,4)); + v3.push_back(btVector3(0,4,0)); + btReducedVector rv1(sz, id1, v1); + btReducedVector rv2(sz, id2, v2); + btReducedVector ans(sz, id3, v3); + bool ret = (ans == rv2-rv1); + if (!ret) + printf("btReducedVector testMinus failed\n"); + return ret; +} + +bool btReducedVector::testDot() const +{ + int sz = 5; + btAlignedObjectArray<int> id1; + id1.push_back(1); + id1.push_back(3); + btAlignedObjectArray<btVector3> v1; + v1.push_back(btVector3(1,0,1)); + v1.push_back(btVector3(3,1,5)); + btAlignedObjectArray<int> id2; + id2.push_back(2); + id2.push_back(3); + id2.push_back(5); + btAlignedObjectArray<btVector3> v2; + v2.push_back(btVector3(2,3,1)); + v2.push_back(btVector3(3,4,9)); + v2.push_back(btVector3(0,4,0)); + btReducedVector rv1(sz, id1, v1); + btReducedVector rv2(sz, id2, v2); + btScalar ans = 58; + bool ret = (ans == rv2.dot(rv1) && ans == rv1.dot(rv2)); + ans = 14+16+9+16+81; + ret &= (ans==rv2.dot(rv2)); + + if (!ret) + printf("btReducedVector testDot failed\n"); + return ret; +} + +bool btReducedVector::testMultiply() const +{ + int sz = 5; + btAlignedObjectArray<int> id1; + id1.push_back(1); + id1.push_back(3); + btAlignedObjectArray<btVector3> v1; + v1.push_back(btVector3(1,0,1)); + v1.push_back(btVector3(3,1,5)); + btScalar s = 2; + btReducedVector rv1(sz, id1, v1); + btAlignedObjectArray<int> id2; + id2.push_back(1); + id2.push_back(3); + btAlignedObjectArray<btVector3> v2; + v2.push_back(btVector3(2,0,2)); + v2.push_back(btVector3(6,2,10)); + btReducedVector ans(sz, id2, v2); + bool ret = (ans == rv1*s); + if (!ret) + printf("btReducedVector testMultiply failed\n"); + return ret; +} + +void btReducedVector::test() const +{ + bool ans = testAdd() && testMinus() && testDot() && testMultiply(); + if (ans) + { + printf("All tests passed\n"); + } + else + { + printf("Tests failed\n"); + } +} diff --git a/thirdparty/bullet/LinearMath/btReducedVector.h b/thirdparty/bullet/LinearMath/btReducedVector.h new file mode 100644 index 0000000000..83b5e581e5 --- /dev/null +++ b/thirdparty/bullet/LinearMath/btReducedVector.h @@ -0,0 +1,320 @@ +// +// btReducedVectors.h +// BulletLinearMath +// +// Created by Xuchen Han on 4/4/20. +// +#ifndef btReducedVectors_h +#define btReducedVectors_h +#include "btVector3.h" +#include "btMatrix3x3.h" +#include "btAlignedObjectArray.h" +#include <stdio.h> +#include <vector> +#include <algorithm> +struct TwoInts +{ + int a,b; +}; +inline bool operator<(const TwoInts& A, const TwoInts& B) +{ + return A.b < B.b; +} + + +// A helper vector type used for CG projections +class btReducedVector +{ +public: + btAlignedObjectArray<int> m_indices; + btAlignedObjectArray<btVector3> m_vecs; + int m_sz; // all m_indices value < m_sz +public: + btReducedVector():m_sz(0) + { + m_indices.resize(0); + m_vecs.resize(0); + m_indices.clear(); + m_vecs.clear(); + } + + btReducedVector(int sz): m_sz(sz) + { + m_indices.resize(0); + m_vecs.resize(0); + m_indices.clear(); + m_vecs.clear(); + } + + btReducedVector(int sz, const btAlignedObjectArray<int>& indices, const btAlignedObjectArray<btVector3>& vecs): m_sz(sz), m_indices(indices), m_vecs(vecs) + { + } + + void simplify() + { + btAlignedObjectArray<int> old_indices(m_indices); + btAlignedObjectArray<btVector3> old_vecs(m_vecs); + m_indices.resize(0); + m_vecs.resize(0); + m_indices.clear(); + m_vecs.clear(); + for (int i = 0; i < old_indices.size(); ++i) + { + if (old_vecs[i].length2() > SIMD_EPSILON) + { + m_indices.push_back(old_indices[i]); + m_vecs.push_back(old_vecs[i]); + } + } + } + + btReducedVector operator+(const btReducedVector& other) + { + btReducedVector ret(m_sz); + int i=0, j=0; + while (i < m_indices.size() && j < other.m_indices.size()) + { + if (m_indices[i] < other.m_indices[j]) + { + ret.m_indices.push_back(m_indices[i]); + ret.m_vecs.push_back(m_vecs[i]); + ++i; + } + else if (m_indices[i] > other.m_indices[j]) + { + ret.m_indices.push_back(other.m_indices[j]); + ret.m_vecs.push_back(other.m_vecs[j]); + ++j; + } + else + { + ret.m_indices.push_back(other.m_indices[j]); + ret.m_vecs.push_back(m_vecs[i] + other.m_vecs[j]); + ++i; ++j; + } + } + while (i < m_indices.size()) + { + ret.m_indices.push_back(m_indices[i]); + ret.m_vecs.push_back(m_vecs[i]); + ++i; + } + while (j < other.m_indices.size()) + { + ret.m_indices.push_back(other.m_indices[j]); + ret.m_vecs.push_back(other.m_vecs[j]); + ++j; + } + ret.simplify(); + return ret; + } + + btReducedVector operator-() + { + btReducedVector ret(m_sz); + for (int i = 0; i < m_indices.size(); ++i) + { + ret.m_indices.push_back(m_indices[i]); + ret.m_vecs.push_back(-m_vecs[i]); + } + ret.simplify(); + return ret; + } + + btReducedVector operator-(const btReducedVector& other) + { + btReducedVector ret(m_sz); + int i=0, j=0; + while (i < m_indices.size() && j < other.m_indices.size()) + { + if (m_indices[i] < other.m_indices[j]) + { + ret.m_indices.push_back(m_indices[i]); + ret.m_vecs.push_back(m_vecs[i]); + ++i; + } + else if (m_indices[i] > other.m_indices[j]) + { + ret.m_indices.push_back(other.m_indices[j]); + ret.m_vecs.push_back(-other.m_vecs[j]); + ++j; + } + else + { + ret.m_indices.push_back(other.m_indices[j]); + ret.m_vecs.push_back(m_vecs[i] - other.m_vecs[j]); + ++i; ++j; + } + } + while (i < m_indices.size()) + { + ret.m_indices.push_back(m_indices[i]); + ret.m_vecs.push_back(m_vecs[i]); + ++i; + } + while (j < other.m_indices.size()) + { + ret.m_indices.push_back(other.m_indices[j]); + ret.m_vecs.push_back(-other.m_vecs[j]); + ++j; + } + ret.simplify(); + return ret; + } + + bool operator==(const btReducedVector& other) const + { + if (m_sz != other.m_sz) + return false; + if (m_indices.size() != other.m_indices.size()) + return false; + for (int i = 0; i < m_indices.size(); ++i) + { + if (m_indices[i] != other.m_indices[i] || m_vecs[i] != other.m_vecs[i]) + { + return false; + } + } + return true; + } + + bool operator!=(const btReducedVector& other) const + { + return !(*this == other); + } + + btReducedVector& operator=(const btReducedVector& other) + { + if (this == &other) + { + return *this; + } + m_sz = other.m_sz; + m_indices.copyFromArray(other.m_indices); + m_vecs.copyFromArray(other.m_vecs); + return *this; + } + + btScalar dot(const btReducedVector& other) const + { + btScalar ret = 0; + int j = 0; + for (int i = 0; i < m_indices.size(); ++i) + { + while (j < other.m_indices.size() && other.m_indices[j] < m_indices[i]) + { + ++j; + } + if (j < other.m_indices.size() && other.m_indices[j] == m_indices[i]) + { + ret += m_vecs[i].dot(other.m_vecs[j]); +// ++j; + } + } + return ret; + } + + btScalar dot(const btAlignedObjectArray<btVector3>& other) const + { + btScalar ret = 0; + for (int i = 0; i < m_indices.size(); ++i) + { + ret += m_vecs[i].dot(other[m_indices[i]]); + } + return ret; + } + + btScalar length2() const + { + return this->dot(*this); + } + + void normalize(); + + // returns the projection of this onto other + btReducedVector proj(const btReducedVector& other) const; + + bool testAdd() const; + + bool testMinus() const; + + bool testDot() const; + + bool testMultiply() const; + + void test() const; + + void print() const + { + for (int i = 0; i < m_indices.size(); ++i) + { + printf("%d: (%f, %f, %f)/", m_indices[i], m_vecs[i][0],m_vecs[i][1],m_vecs[i][2]); + } + printf("\n"); + } + + + void sort() + { + std::vector<TwoInts> tuples; + for (int i = 0; i < m_indices.size(); ++i) + { + TwoInts ti; + ti.a = i; + ti.b = m_indices[i]; + tuples.push_back(ti); + } + std::sort(tuples.begin(), tuples.end()); + btAlignedObjectArray<int> new_indices; + btAlignedObjectArray<btVector3> new_vecs; + for (int i = 0; i < tuples.size(); ++i) + { + new_indices.push_back(tuples[i].b); + new_vecs.push_back(m_vecs[tuples[i].a]); + } + m_indices = new_indices; + m_vecs = new_vecs; + } +}; + +SIMD_FORCE_INLINE btReducedVector operator*(const btReducedVector& v, btScalar s) +{ + btReducedVector ret(v.m_sz); + for (int i = 0; i < v.m_indices.size(); ++i) + { + ret.m_indices.push_back(v.m_indices[i]); + ret.m_vecs.push_back(s*v.m_vecs[i]); + } + ret.simplify(); + return ret; +} + +SIMD_FORCE_INLINE btReducedVector operator*(btScalar s, const btReducedVector& v) +{ + return v*s; +} + +SIMD_FORCE_INLINE btReducedVector operator/(const btReducedVector& v, btScalar s) +{ + return v * (1.0/s); +} + +SIMD_FORCE_INLINE btReducedVector& operator/=(btReducedVector& v, btScalar s) +{ + v = v/s; + return v; +} + +SIMD_FORCE_INLINE btReducedVector& operator+=(btReducedVector& v1, const btReducedVector& v2) +{ + v1 = v1+v2; + return v1; +} + +SIMD_FORCE_INLINE btReducedVector& operator-=(btReducedVector& v1, const btReducedVector& v2) +{ + v1 = v1-v2; + return v1; +} + +#endif /* btReducedVectors_h */ diff --git a/thirdparty/bullet/btBulletCollisionAll.cpp b/thirdparty/bullet/btBulletCollisionAll.cpp index 2851fb3b73..4a3ec8dd6f 100644 --- a/thirdparty/bullet/btBulletCollisionAll.cpp +++ b/thirdparty/bullet/btBulletCollisionAll.cpp @@ -23,6 +23,7 @@ #include "BulletCollision/CollisionDispatch/btConvexConvexAlgorithm.cpp" #include "BulletCollision/CollisionDispatch/btSphereBoxCollisionAlgorithm.cpp" #include "BulletCollision/CollisionDispatch/btCollisionDispatcher.cpp" +#include "BulletCollision/CollisionDispatch/btCollisionDispatcherMt.cpp" #include "BulletCollision/CollisionDispatch/btConvexPlaneCollisionAlgorithm.cpp" #include "BulletCollision/CollisionDispatch/btSphereSphereCollisionAlgorithm.cpp" #include "BulletCollision/CollisionDispatch/btCollisionObject.cpp" diff --git a/thirdparty/bullet/btLinearMathAll.cpp b/thirdparty/bullet/btLinearMathAll.cpp index 808f412803..d05a19e630 100644 --- a/thirdparty/bullet/btLinearMathAll.cpp +++ b/thirdparty/bullet/btLinearMathAll.cpp @@ -8,6 +8,7 @@ #include "LinearMath/btConvexHullComputer.cpp" #include "LinearMath/btQuickprof.cpp" #include "LinearMath/btThreads.cpp" +#include "LinearMath/btReducedVector.cpp" #include "LinearMath/TaskScheduler/btTaskScheduler.cpp" #include "LinearMath/TaskScheduler/btThreadSupportPosix.cpp" #include "LinearMath/TaskScheduler/btThreadSupportWin32.cpp" 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 62fbd1b72d..257d0b7574 100644 --- a/thirdparty/jpeg-compressor/jpgd.cpp +++ b/thirdparty/jpeg-compressor/jpgd.cpp @@ -1,27 +1,55 @@ -// jpgd.cpp - C++ class for JPEG decompression. -// Public domain, Rich Geldreich <richgel99@gmail.com> +// jpgd.cpp - C++ class for JPEG decompression. Written by Richard Geldreich <richgel99@gmail.com> between 1994-2020. +// Supports progressive and baseline sequential JPEG image files, and the most common chroma subsampling factors: Y, H1V1, H2V1, H1V2, and H2V2. +// Supports box and linear chroma upsampling. +// +// Released under two licenses. You are free to choose which license you want: +// License 1: +// Public Domain +// +// License 2: +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// // Alex Evans: Linear memory allocator (taken from jpge.h). -// v1.04, May. 19, 2012: Code tweaks to fix VS2008 static code analysis warnings (all looked harmless) +// v1.04, May. 19, 2012: Code tweaks to fix VS2008 static code analysis warnings +// v2.00, March 20, 2020: Fuzzed with zzuf and afl. Fixed several issues, converted most assert()'s to run-time checks. Added chroma upsampling. Removed freq. domain upsampling. gcc/clang warnings. // -// Supports progressive and baseline sequential JPEG image files, and the most common chroma subsampling factors: Y, H1V1, H2V1, H1V2, and H2V2. +// Important: +// #define JPGD_USE_SSE2 to 0 to completely disable SSE2 usage. // -// Chroma upsampling quality: H2V2 is upsampled in the frequency domain, H2V1 and H1V2 are upsampled using point sampling. -// Chroma upsampling reference: "Fast Scheme for Image Size Change in the Compressed Domain" -// http://vision.ai.uiuc.edu/~dugad/research/dct/index.html - #include "jpgd.h" #include <string.h> - +#include <algorithm> #include <assert.h> -#define JPGD_ASSERT(x) assert(x) #ifdef _MSC_VER #pragma warning (disable : 4611) // warning C4611: interaction between '_setjmp' and C++ object destruction is non-portable #endif -// Set to 1 to enable freq. domain chroma upsampling on images using H2V2 subsampling (0=faster nearest neighbor sampling). -// This is slower, but results in higher quality on images with highly saturated colors. -#define JPGD_SUPPORT_FREQ_DOMAIN_UPSAMPLING 1 +#ifndef JPGD_USE_SSE2 + + #if defined(__GNUC__) + + #if (defined(__x86_64__) || defined(_M_X64)) + #if defined(__SSE2__) + #define JPGD_USE_SSE2 (1) + #endif + #endif + + #else + #define JPGD_USE_SSE2 (1) + #endif + +#endif #define JPGD_TRUE (1) #define JPGD_FALSE (0) @@ -29,28 +57,28 @@ #define JPGD_MAX(a,b) (((a)>(b)) ? (a) : (b)) #define JPGD_MIN(a,b) (((a)<(b)) ? (a) : (b)) -// TODO: Move to header and use these constants when declaring the arrays. -#define JPGD_HUFF_TREE_MAX_LENGTH 512 -#define JPGD_HUFF_CODE_SIZE_MAX_LENGTH 256 - namespace jpgd { -static inline void *jpgd_malloc(size_t nSize) { return malloc(nSize); } -static inline void jpgd_free(void *p) { free(p); } + static inline void* jpgd_malloc(size_t nSize) { return malloc(nSize); } + static inline void jpgd_free(void* p) { free(p); } -// DCT coefficients are stored in this sequence. -static int g_ZAG[64] = { 0,1,8,16,9,2,3,10,17,24,32,25,18,11,4,5,12,19,26,33,40,48,41,34,27,20,13,6,7,14,21,28,35,42,49,56,57,50,43,36,29,22,15,23,30,37,44,51,58,59,52,45,38,31,39,46,53,60,61,54,47,55,62,63 }; + // DCT coefficients are stored in this sequence. + static int g_ZAG[64] = { 0,1,8,16,9,2,3,10,17,24,32,25,18,11,4,5,12,19,26,33,40,48,41,34,27,20,13,6,7,14,21,28,35,42,49,56,57,50,43,36,29,22,15,23,30,37,44,51,58,59,52,45,38,31,39,46,53,60,61,54,47,55,62,63 }; -enum JPEG_MARKER -{ - M_SOF0 = 0xC0, M_SOF1 = 0xC1, M_SOF2 = 0xC2, M_SOF3 = 0xC3, M_SOF5 = 0xC5, M_SOF6 = 0xC6, M_SOF7 = 0xC7, M_JPG = 0xC8, - M_SOF9 = 0xC9, M_SOF10 = 0xCA, M_SOF11 = 0xCB, M_SOF13 = 0xCD, M_SOF14 = 0xCE, M_SOF15 = 0xCF, M_DHT = 0xC4, M_DAC = 0xCC, - M_RST0 = 0xD0, M_RST1 = 0xD1, M_RST2 = 0xD2, M_RST3 = 0xD3, M_RST4 = 0xD4, M_RST5 = 0xD5, M_RST6 = 0xD6, M_RST7 = 0xD7, - M_SOI = 0xD8, M_EOI = 0xD9, M_SOS = 0xDA, M_DQT = 0xDB, M_DNL = 0xDC, M_DRI = 0xDD, M_DHP = 0xDE, M_EXP = 0xDF, - M_APP0 = 0xE0, M_APP15 = 0xEF, M_JPG0 = 0xF0, M_JPG13 = 0xFD, M_COM = 0xFE, M_TEM = 0x01, M_ERROR = 0x100, RST0 = 0xD0 -}; + enum JPEG_MARKER + { + M_SOF0 = 0xC0, M_SOF1 = 0xC1, M_SOF2 = 0xC2, M_SOF3 = 0xC3, M_SOF5 = 0xC5, M_SOF6 = 0xC6, M_SOF7 = 0xC7, M_JPG = 0xC8, + M_SOF9 = 0xC9, M_SOF10 = 0xCA, M_SOF11 = 0xCB, M_SOF13 = 0xCD, M_SOF14 = 0xCE, M_SOF15 = 0xCF, M_DHT = 0xC4, M_DAC = 0xCC, + M_RST0 = 0xD0, M_RST1 = 0xD1, M_RST2 = 0xD2, M_RST3 = 0xD3, M_RST4 = 0xD4, M_RST5 = 0xD5, M_RST6 = 0xD6, M_RST7 = 0xD7, + M_SOI = 0xD8, M_EOI = 0xD9, M_SOS = 0xDA, M_DQT = 0xDB, M_DNL = 0xDC, M_DRI = 0xDD, M_DHP = 0xDE, M_EXP = 0xDF, + M_APP0 = 0xE0, M_APP15 = 0xEF, M_JPG0 = 0xF0, M_JPG13 = 0xFD, M_COM = 0xFE, M_TEM = 0x01, M_ERROR = 0x100, RST0 = 0xD0 + }; -enum JPEG_SUBSAMPLING { JPGD_GRAYSCALE = 0, JPGD_YH1V1, JPGD_YH2V1, JPGD_YH1V2, JPGD_YH2V2 }; + enum JPEG_SUBSAMPLING { JPGD_GRAYSCALE = 0, JPGD_YH1V1, JPGD_YH2V1, JPGD_YH1V2, JPGD_YH2V2 }; + +#if JPGD_USE_SSE2 +#include "jpgd_idct.h" +#endif #define CONST_BITS 13 #define PASS1_BITS 2 @@ -76,3130 +104,3182 @@ enum JPEG_SUBSAMPLING { JPGD_GRAYSCALE = 0, JPGD_YH1V1, JPGD_YH2V1, JPGD_YH1V2, #define CLAMP(i) ((static_cast<uint>(i) > 255) ? (((~i) >> 31) & 0xFF) : (i)) -// Compiler creates a fast path 1D IDCT for X non-zero columns -template <int NONZERO_COLS> -struct Row -{ - static void idct(int* pTemp, const jpgd_block_t* pSrc) - { - // ACCESS_COL() will be optimized at compile time to either an array access, or 0. - #define ACCESS_COL(x) (((x) < NONZERO_COLS) ? (int)pSrc[x] : 0) - - const int z2 = ACCESS_COL(2), z3 = ACCESS_COL(6); - - const int z1 = MULTIPLY(z2 + z3, FIX_0_541196100); - const int tmp2 = z1 + MULTIPLY(z3, - FIX_1_847759065); - const int tmp3 = z1 + MULTIPLY(z2, FIX_0_765366865); - - const int tmp0 = (ACCESS_COL(0) + ACCESS_COL(4)) << CONST_BITS; - const int tmp1 = (ACCESS_COL(0) - ACCESS_COL(4)) << CONST_BITS; - - const int tmp10 = tmp0 + tmp3, tmp13 = tmp0 - tmp3, tmp11 = tmp1 + tmp2, tmp12 = tmp1 - tmp2; - - const int atmp0 = ACCESS_COL(7), atmp1 = ACCESS_COL(5), atmp2 = ACCESS_COL(3), atmp3 = ACCESS_COL(1); - - const int bz1 = atmp0 + atmp3, bz2 = atmp1 + atmp2, bz3 = atmp0 + atmp2, bz4 = atmp1 + atmp3; - const int bz5 = MULTIPLY(bz3 + bz4, FIX_1_175875602); - - const int az1 = MULTIPLY(bz1, - FIX_0_899976223); - const int az2 = MULTIPLY(bz2, - FIX_2_562915447); - const int az3 = MULTIPLY(bz3, - FIX_1_961570560) + bz5; - const int az4 = MULTIPLY(bz4, - FIX_0_390180644) + bz5; - - const int btmp0 = MULTIPLY(atmp0, FIX_0_298631336) + az1 + az3; - const int btmp1 = MULTIPLY(atmp1, FIX_2_053119869) + az2 + az4; - const int btmp2 = MULTIPLY(atmp2, FIX_3_072711026) + az2 + az3; - const int btmp3 = MULTIPLY(atmp3, FIX_1_501321110) + az1 + az4; - - pTemp[0] = DESCALE(tmp10 + btmp3, CONST_BITS-PASS1_BITS); - pTemp[7] = DESCALE(tmp10 - btmp3, CONST_BITS-PASS1_BITS); - pTemp[1] = DESCALE(tmp11 + btmp2, CONST_BITS-PASS1_BITS); - pTemp[6] = DESCALE(tmp11 - btmp2, CONST_BITS-PASS1_BITS); - pTemp[2] = DESCALE(tmp12 + btmp1, CONST_BITS-PASS1_BITS); - pTemp[5] = DESCALE(tmp12 - btmp1, CONST_BITS-PASS1_BITS); - pTemp[3] = DESCALE(tmp13 + btmp0, CONST_BITS-PASS1_BITS); - pTemp[4] = DESCALE(tmp13 - btmp0, CONST_BITS-PASS1_BITS); - } -}; - -template <> -struct Row<0> -{ - static void idct(int* pTemp, const jpgd_block_t* pSrc) - { -#ifdef _MSC_VER - pTemp; pSrc; + static inline int left_shifti(int val, uint32_t bits) + { + return static_cast<int>(static_cast<uint32_t>(val) << bits); + } + + // Compiler creates a fast path 1D IDCT for X non-zero columns + template <int NONZERO_COLS> + struct Row + { + static void idct(int* pTemp, const jpgd_block_coeff_t* pSrc) + { + // ACCESS_COL() will be optimized at compile time to either an array access, or 0. Good compilers will then optimize out muls against 0. +#define ACCESS_COL(x) (((x) < NONZERO_COLS) ? (int)pSrc[x] : 0) + + const int z2 = ACCESS_COL(2), z3 = ACCESS_COL(6); + + const int z1 = MULTIPLY(z2 + z3, FIX_0_541196100); + const int tmp2 = z1 + MULTIPLY(z3, -FIX_1_847759065); + const int tmp3 = z1 + MULTIPLY(z2, FIX_0_765366865); + + const int tmp0 = left_shifti(ACCESS_COL(0) + ACCESS_COL(4), CONST_BITS); + const int tmp1 = left_shifti(ACCESS_COL(0) - ACCESS_COL(4), CONST_BITS); + + const int tmp10 = tmp0 + tmp3, tmp13 = tmp0 - tmp3, tmp11 = tmp1 + tmp2, tmp12 = tmp1 - tmp2; + + const int atmp0 = ACCESS_COL(7), atmp1 = ACCESS_COL(5), atmp2 = ACCESS_COL(3), atmp3 = ACCESS_COL(1); + + const int bz1 = atmp0 + atmp3, bz2 = atmp1 + atmp2, bz3 = atmp0 + atmp2, bz4 = atmp1 + atmp3; + const int bz5 = MULTIPLY(bz3 + bz4, FIX_1_175875602); + + const int az1 = MULTIPLY(bz1, -FIX_0_899976223); + const int az2 = MULTIPLY(bz2, -FIX_2_562915447); + const int az3 = MULTIPLY(bz3, -FIX_1_961570560) + bz5; + const int az4 = MULTIPLY(bz4, -FIX_0_390180644) + bz5; + + const int btmp0 = MULTIPLY(atmp0, FIX_0_298631336) + az1 + az3; + const int btmp1 = MULTIPLY(atmp1, FIX_2_053119869) + az2 + az4; + const int btmp2 = MULTIPLY(atmp2, FIX_3_072711026) + az2 + az3; + const int btmp3 = MULTIPLY(atmp3, FIX_1_501321110) + az1 + az4; + + pTemp[0] = DESCALE(tmp10 + btmp3, CONST_BITS - PASS1_BITS); + pTemp[7] = DESCALE(tmp10 - btmp3, CONST_BITS - PASS1_BITS); + pTemp[1] = DESCALE(tmp11 + btmp2, CONST_BITS - PASS1_BITS); + pTemp[6] = DESCALE(tmp11 - btmp2, CONST_BITS - PASS1_BITS); + pTemp[2] = DESCALE(tmp12 + btmp1, CONST_BITS - PASS1_BITS); + pTemp[5] = DESCALE(tmp12 - btmp1, CONST_BITS - PASS1_BITS); + pTemp[3] = DESCALE(tmp13 + btmp0, CONST_BITS - PASS1_BITS); + pTemp[4] = DESCALE(tmp13 - btmp0, CONST_BITS - PASS1_BITS); + } + }; + + template <> + struct Row<0> + { + static void idct(int* pTemp, const jpgd_block_coeff_t* pSrc) + { + (void)pTemp; + (void)pSrc; + } + }; + + template <> + struct Row<1> + { + static void idct(int* pTemp, const jpgd_block_coeff_t* pSrc) + { + const int dcval = left_shifti(pSrc[0], PASS1_BITS); + + pTemp[0] = dcval; + pTemp[1] = dcval; + pTemp[2] = dcval; + pTemp[3] = dcval; + pTemp[4] = dcval; + pTemp[5] = dcval; + pTemp[6] = dcval; + pTemp[7] = dcval; + } + }; + + // Compiler creates a fast path 1D IDCT for X non-zero rows + template <int NONZERO_ROWS> + struct Col + { + static void idct(uint8* pDst_ptr, const int* pTemp) + { + // ACCESS_ROW() will be optimized at compile time to either an array access, or 0. +#define ACCESS_ROW(x) (((x) < NONZERO_ROWS) ? pTemp[x * 8] : 0) + + const int z2 = ACCESS_ROW(2); + const int z3 = ACCESS_ROW(6); + + const int z1 = MULTIPLY(z2 + z3, FIX_0_541196100); + const int tmp2 = z1 + MULTIPLY(z3, -FIX_1_847759065); + const int tmp3 = z1 + MULTIPLY(z2, FIX_0_765366865); + + const int tmp0 = left_shifti(ACCESS_ROW(0) + ACCESS_ROW(4), CONST_BITS); + const int tmp1 = left_shifti(ACCESS_ROW(0) - ACCESS_ROW(4), CONST_BITS); + + const int tmp10 = tmp0 + tmp3, tmp13 = tmp0 - tmp3, tmp11 = tmp1 + tmp2, tmp12 = tmp1 - tmp2; + + const int atmp0 = ACCESS_ROW(7), atmp1 = ACCESS_ROW(5), atmp2 = ACCESS_ROW(3), atmp3 = ACCESS_ROW(1); + + const int bz1 = atmp0 + atmp3, bz2 = atmp1 + atmp2, bz3 = atmp0 + atmp2, bz4 = atmp1 + atmp3; + const int bz5 = MULTIPLY(bz3 + bz4, FIX_1_175875602); + + const int az1 = MULTIPLY(bz1, -FIX_0_899976223); + const int az2 = MULTIPLY(bz2, -FIX_2_562915447); + const int az3 = MULTIPLY(bz3, -FIX_1_961570560) + bz5; + const int az4 = MULTIPLY(bz4, -FIX_0_390180644) + bz5; + + const int btmp0 = MULTIPLY(atmp0, FIX_0_298631336) + az1 + az3; + const int btmp1 = MULTIPLY(atmp1, FIX_2_053119869) + az2 + az4; + const int btmp2 = MULTIPLY(atmp2, FIX_3_072711026) + az2 + az3; + const int btmp3 = MULTIPLY(atmp3, FIX_1_501321110) + az1 + az4; + + int i = DESCALE_ZEROSHIFT(tmp10 + btmp3, CONST_BITS + PASS1_BITS + 3); + pDst_ptr[8 * 0] = (uint8)CLAMP(i); + + i = DESCALE_ZEROSHIFT(tmp10 - btmp3, CONST_BITS + PASS1_BITS + 3); + pDst_ptr[8 * 7] = (uint8)CLAMP(i); + + i = DESCALE_ZEROSHIFT(tmp11 + btmp2, CONST_BITS + PASS1_BITS + 3); + pDst_ptr[8 * 1] = (uint8)CLAMP(i); + + i = DESCALE_ZEROSHIFT(tmp11 - btmp2, CONST_BITS + PASS1_BITS + 3); + pDst_ptr[8 * 6] = (uint8)CLAMP(i); + + i = DESCALE_ZEROSHIFT(tmp12 + btmp1, CONST_BITS + PASS1_BITS + 3); + pDst_ptr[8 * 2] = (uint8)CLAMP(i); + + i = DESCALE_ZEROSHIFT(tmp12 - btmp1, CONST_BITS + PASS1_BITS + 3); + pDst_ptr[8 * 5] = (uint8)CLAMP(i); + + i = DESCALE_ZEROSHIFT(tmp13 + btmp0, CONST_BITS + PASS1_BITS + 3); + pDst_ptr[8 * 3] = (uint8)CLAMP(i); + + i = DESCALE_ZEROSHIFT(tmp13 - btmp0, CONST_BITS + PASS1_BITS + 3); + pDst_ptr[8 * 4] = (uint8)CLAMP(i); + } + }; + + template <> + struct Col<1> + { + static void idct(uint8* pDst_ptr, const int* pTemp) + { + int dcval = DESCALE_ZEROSHIFT(pTemp[0], PASS1_BITS + 3); + const uint8 dcval_clamped = (uint8)CLAMP(dcval); + pDst_ptr[0 * 8] = dcval_clamped; + pDst_ptr[1 * 8] = dcval_clamped; + pDst_ptr[2 * 8] = dcval_clamped; + pDst_ptr[3 * 8] = dcval_clamped; + pDst_ptr[4 * 8] = dcval_clamped; + pDst_ptr[5 * 8] = dcval_clamped; + pDst_ptr[6 * 8] = dcval_clamped; + pDst_ptr[7 * 8] = dcval_clamped; + } + }; + + static const uint8 s_idct_row_table[] = + { + 1,0,0,0,0,0,0,0, 2,0,0,0,0,0,0,0, 2,1,0,0,0,0,0,0, 2,1,1,0,0,0,0,0, 2,2,1,0,0,0,0,0, 3,2,1,0,0,0,0,0, 4,2,1,0,0,0,0,0, 4,3,1,0,0,0,0,0, + 4,3,2,0,0,0,0,0, 4,3,2,1,0,0,0,0, 4,3,2,1,1,0,0,0, 4,3,2,2,1,0,0,0, 4,3,3,2,1,0,0,0, 4,4,3,2,1,0,0,0, 5,4,3,2,1,0,0,0, 6,4,3,2,1,0,0,0, + 6,5,3,2,1,0,0,0, 6,5,4,2,1,0,0,0, 6,5,4,3,1,0,0,0, 6,5,4,3,2,0,0,0, 6,5,4,3,2,1,0,0, 6,5,4,3,2,1,1,0, 6,5,4,3,2,2,1,0, 6,5,4,3,3,2,1,0, + 6,5,4,4,3,2,1,0, 6,5,5,4,3,2,1,0, 6,6,5,4,3,2,1,0, 7,6,5,4,3,2,1,0, 8,6,5,4,3,2,1,0, 8,7,5,4,3,2,1,0, 8,7,6,4,3,2,1,0, 8,7,6,5,3,2,1,0, + 8,7,6,5,4,2,1,0, 8,7,6,5,4,3,1,0, 8,7,6,5,4,3,2,0, 8,7,6,5,4,3,2,1, 8,7,6,5,4,3,2,2, 8,7,6,5,4,3,3,2, 8,7,6,5,4,4,3,2, 8,7,6,5,5,4,3,2, + 8,7,6,6,5,4,3,2, 8,7,7,6,5,4,3,2, 8,8,7,6,5,4,3,2, 8,8,8,6,5,4,3,2, 8,8,8,7,5,4,3,2, 8,8,8,7,6,4,3,2, 8,8,8,7,6,5,3,2, 8,8,8,7,6,5,4,2, + 8,8,8,7,6,5,4,3, 8,8,8,7,6,5,4,4, 8,8,8,7,6,5,5,4, 8,8,8,7,6,6,5,4, 8,8,8,7,7,6,5,4, 8,8,8,8,7,6,5,4, 8,8,8,8,8,6,5,4, 8,8,8,8,8,7,5,4, + 8,8,8,8,8,7,6,4, 8,8,8,8,8,7,6,5, 8,8,8,8,8,7,6,6, 8,8,8,8,8,7,7,6, 8,8,8,8,8,8,7,6, 8,8,8,8,8,8,8,6, 8,8,8,8,8,8,8,7, 8,8,8,8,8,8,8,8, + }; + + static const uint8 s_idct_col_table[] = + { + 1, 1, 2, 3, 3, 3, 3, 3, 3, 4, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 6, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + 7, 7, 7, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8 + }; + + // Scalar "fast pathing" IDCT. + static void idct(const jpgd_block_coeff_t* pSrc_ptr, uint8* pDst_ptr, int block_max_zag, bool use_simd) + { + (void)use_simd; + + assert(block_max_zag >= 1); + assert(block_max_zag <= 64); + + if (block_max_zag <= 1) + { + int k = ((pSrc_ptr[0] + 4) >> 3) + 128; + k = CLAMP(k); + k = k | (k << 8); + k = k | (k << 16); + + for (int i = 8; i > 0; i--) + { + *(int*)&pDst_ptr[0] = k; + *(int*)&pDst_ptr[4] = k; + pDst_ptr += 8; + } + return; + } + +#if JPGD_USE_SSE2 + if (use_simd) + { + assert((((uintptr_t)pSrc_ptr) & 15) == 0); + assert((((uintptr_t)pDst_ptr) & 15) == 0); + idctSSEShortU8(pSrc_ptr, pDst_ptr); + return; + } #endif - } -}; - -template <> -struct Row<1> -{ - static void idct(int* pTemp, const jpgd_block_t* pSrc) - { - const int dcval = (pSrc[0] << PASS1_BITS); - - pTemp[0] = dcval; - pTemp[1] = dcval; - pTemp[2] = dcval; - pTemp[3] = dcval; - pTemp[4] = dcval; - pTemp[5] = dcval; - pTemp[6] = dcval; - pTemp[7] = dcval; - } -}; - -// Compiler creates a fast path 1D IDCT for X non-zero rows -template <int NONZERO_ROWS> -struct Col -{ - static void idct(uint8* pDst_ptr, const int* pTemp) - { - // ACCESS_ROW() will be optimized at compile time to either an array access, or 0. - #define ACCESS_ROW(x) (((x) < NONZERO_ROWS) ? pTemp[x * 8] : 0) - - const int z2 = ACCESS_ROW(2); - const int z3 = ACCESS_ROW(6); - - const int z1 = MULTIPLY(z2 + z3, FIX_0_541196100); - const int tmp2 = z1 + MULTIPLY(z3, - FIX_1_847759065); - const int tmp3 = z1 + MULTIPLY(z2, FIX_0_765366865); - - const int tmp0 = (ACCESS_ROW(0) + ACCESS_ROW(4)) << CONST_BITS; - const int tmp1 = (ACCESS_ROW(0) - ACCESS_ROW(4)) << CONST_BITS; - - const int tmp10 = tmp0 + tmp3, tmp13 = tmp0 - tmp3, tmp11 = tmp1 + tmp2, tmp12 = tmp1 - tmp2; - - const int atmp0 = ACCESS_ROW(7), atmp1 = ACCESS_ROW(5), atmp2 = ACCESS_ROW(3), atmp3 = ACCESS_ROW(1); - - const int bz1 = atmp0 + atmp3, bz2 = atmp1 + atmp2, bz3 = atmp0 + atmp2, bz4 = atmp1 + atmp3; - const int bz5 = MULTIPLY(bz3 + bz4, FIX_1_175875602); - - const int az1 = MULTIPLY(bz1, - FIX_0_899976223); - const int az2 = MULTIPLY(bz2, - FIX_2_562915447); - const int az3 = MULTIPLY(bz3, - FIX_1_961570560) + bz5; - const int az4 = MULTIPLY(bz4, - FIX_0_390180644) + bz5; - - const int btmp0 = MULTIPLY(atmp0, FIX_0_298631336) + az1 + az3; - const int btmp1 = MULTIPLY(atmp1, FIX_2_053119869) + az2 + az4; - const int btmp2 = MULTIPLY(atmp2, FIX_3_072711026) + az2 + az3; - const int btmp3 = MULTIPLY(atmp3, FIX_1_501321110) + az1 + az4; - - int i = DESCALE_ZEROSHIFT(tmp10 + btmp3, CONST_BITS+PASS1_BITS+3); - pDst_ptr[8*0] = (uint8)CLAMP(i); - - i = DESCALE_ZEROSHIFT(tmp10 - btmp3, CONST_BITS+PASS1_BITS+3); - pDst_ptr[8*7] = (uint8)CLAMP(i); - - i = DESCALE_ZEROSHIFT(tmp11 + btmp2, CONST_BITS+PASS1_BITS+3); - pDst_ptr[8*1] = (uint8)CLAMP(i); - - i = DESCALE_ZEROSHIFT(tmp11 - btmp2, CONST_BITS+PASS1_BITS+3); - pDst_ptr[8*6] = (uint8)CLAMP(i); - - i = DESCALE_ZEROSHIFT(tmp12 + btmp1, CONST_BITS+PASS1_BITS+3); - pDst_ptr[8*2] = (uint8)CLAMP(i); - - i = DESCALE_ZEROSHIFT(tmp12 - btmp1, CONST_BITS+PASS1_BITS+3); - pDst_ptr[8*5] = (uint8)CLAMP(i); - - i = DESCALE_ZEROSHIFT(tmp13 + btmp0, CONST_BITS+PASS1_BITS+3); - pDst_ptr[8*3] = (uint8)CLAMP(i); - - i = DESCALE_ZEROSHIFT(tmp13 - btmp0, CONST_BITS+PASS1_BITS+3); - pDst_ptr[8*4] = (uint8)CLAMP(i); - } -}; - -template <> -struct Col<1> -{ - static void idct(uint8* pDst_ptr, const int* pTemp) - { - int dcval = DESCALE_ZEROSHIFT(pTemp[0], PASS1_BITS+3); - const uint8 dcval_clamped = (uint8)CLAMP(dcval); - pDst_ptr[0*8] = dcval_clamped; - pDst_ptr[1*8] = dcval_clamped; - pDst_ptr[2*8] = dcval_clamped; - pDst_ptr[3*8] = dcval_clamped; - pDst_ptr[4*8] = dcval_clamped; - pDst_ptr[5*8] = dcval_clamped; - pDst_ptr[6*8] = dcval_clamped; - pDst_ptr[7*8] = dcval_clamped; - } -}; - -static const uint8 s_idct_row_table[] = -{ - 1,0,0,0,0,0,0,0, 2,0,0,0,0,0,0,0, 2,1,0,0,0,0,0,0, 2,1,1,0,0,0,0,0, 2,2,1,0,0,0,0,0, 3,2,1,0,0,0,0,0, 4,2,1,0,0,0,0,0, 4,3,1,0,0,0,0,0, - 4,3,2,0,0,0,0,0, 4,3,2,1,0,0,0,0, 4,3,2,1,1,0,0,0, 4,3,2,2,1,0,0,0, 4,3,3,2,1,0,0,0, 4,4,3,2,1,0,0,0, 5,4,3,2,1,0,0,0, 6,4,3,2,1,0,0,0, - 6,5,3,2,1,0,0,0, 6,5,4,2,1,0,0,0, 6,5,4,3,1,0,0,0, 6,5,4,3,2,0,0,0, 6,5,4,3,2,1,0,0, 6,5,4,3,2,1,1,0, 6,5,4,3,2,2,1,0, 6,5,4,3,3,2,1,0, - 6,5,4,4,3,2,1,0, 6,5,5,4,3,2,1,0, 6,6,5,4,3,2,1,0, 7,6,5,4,3,2,1,0, 8,6,5,4,3,2,1,0, 8,7,5,4,3,2,1,0, 8,7,6,4,3,2,1,0, 8,7,6,5,3,2,1,0, - 8,7,6,5,4,2,1,0, 8,7,6,5,4,3,1,0, 8,7,6,5,4,3,2,0, 8,7,6,5,4,3,2,1, 8,7,6,5,4,3,2,2, 8,7,6,5,4,3,3,2, 8,7,6,5,4,4,3,2, 8,7,6,5,5,4,3,2, - 8,7,6,6,5,4,3,2, 8,7,7,6,5,4,3,2, 8,8,7,6,5,4,3,2, 8,8,8,6,5,4,3,2, 8,8,8,7,5,4,3,2, 8,8,8,7,6,4,3,2, 8,8,8,7,6,5,3,2, 8,8,8,7,6,5,4,2, - 8,8,8,7,6,5,4,3, 8,8,8,7,6,5,4,4, 8,8,8,7,6,5,5,4, 8,8,8,7,6,6,5,4, 8,8,8,7,7,6,5,4, 8,8,8,8,7,6,5,4, 8,8,8,8,8,6,5,4, 8,8,8,8,8,7,5,4, - 8,8,8,8,8,7,6,4, 8,8,8,8,8,7,6,5, 8,8,8,8,8,7,6,6, 8,8,8,8,8,7,7,6, 8,8,8,8,8,8,7,6, 8,8,8,8,8,8,8,6, 8,8,8,8,8,8,8,7, 8,8,8,8,8,8,8,8, -}; - -static const uint8 s_idct_col_table[] = { 1, 1, 2, 3, 3, 3, 3, 3, 3, 4, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 6, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8 }; - -void idct(const jpgd_block_t* pSrc_ptr, uint8* pDst_ptr, int block_max_zag) -{ - JPGD_ASSERT(block_max_zag >= 1); - JPGD_ASSERT(block_max_zag <= 64); - - if (block_max_zag <= 1) - { - int k = ((pSrc_ptr[0] + 4) >> 3) + 128; - k = CLAMP(k); - k = k | (k<<8); - k = k | (k<<16); - - for (int i = 8; i > 0; i--) - { - *(int*)&pDst_ptr[0] = k; - *(int*)&pDst_ptr[4] = k; - pDst_ptr += 8; - } - return; - } - - int temp[64]; - - const jpgd_block_t* pSrc = pSrc_ptr; - int* pTemp = temp; - - const uint8* pRow_tab = &s_idct_row_table[(block_max_zag - 1) * 8]; - int i; - for (i = 8; i > 0; i--, pRow_tab++) - { - switch (*pRow_tab) - { - case 0: Row<0>::idct(pTemp, pSrc); break; - case 1: Row<1>::idct(pTemp, pSrc); break; - case 2: Row<2>::idct(pTemp, pSrc); break; - case 3: Row<3>::idct(pTemp, pSrc); break; - case 4: Row<4>::idct(pTemp, pSrc); break; - case 5: Row<5>::idct(pTemp, pSrc); break; - case 6: Row<6>::idct(pTemp, pSrc); break; - case 7: Row<7>::idct(pTemp, pSrc); break; - case 8: Row<8>::idct(pTemp, pSrc); break; - } - - pSrc += 8; - pTemp += 8; - } - - pTemp = temp; - - const int nonzero_rows = s_idct_col_table[block_max_zag - 1]; - for (i = 8; i > 0; i--) - { - switch (nonzero_rows) - { - case 1: Col<1>::idct(pDst_ptr, pTemp); break; - case 2: Col<2>::idct(pDst_ptr, pTemp); break; - case 3: Col<3>::idct(pDst_ptr, pTemp); break; - case 4: Col<4>::idct(pDst_ptr, pTemp); break; - case 5: Col<5>::idct(pDst_ptr, pTemp); break; - case 6: Col<6>::idct(pDst_ptr, pTemp); break; - case 7: Col<7>::idct(pDst_ptr, pTemp); break; - case 8: Col<8>::idct(pDst_ptr, pTemp); break; - } - - pTemp++; - pDst_ptr++; - } -} - -void idct_4x4(const jpgd_block_t* pSrc_ptr, uint8* pDst_ptr) -{ - int temp[64]; - int* pTemp = temp; - const jpgd_block_t* pSrc = pSrc_ptr; - - for (int i = 4; i > 0; i--) - { - Row<4>::idct(pTemp, pSrc); - pSrc += 8; - pTemp += 8; - } - - pTemp = temp; - for (int i = 8; i > 0; i--) - { - Col<4>::idct(pDst_ptr, pTemp); - pTemp++; - pDst_ptr++; - } -} - -// Retrieve one character from the input stream. -inline uint jpeg_decoder::get_char() -{ - // Any bytes remaining in buffer? - if (!m_in_buf_left) - { - // Try to get more bytes. - prep_in_buffer(); - // Still nothing to get? - if (!m_in_buf_left) - { - // Pad the end of the stream with 0xFF 0xD9 (EOI marker) - int t = m_tem_flag; - m_tem_flag ^= 1; - if (t) - return 0xD9; - else - return 0xFF; - } - } - - uint c = *m_pIn_buf_ofs++; - m_in_buf_left--; - - return c; -} - -// Same as previous method, except can indicate if the character is a pad character or not. -inline uint jpeg_decoder::get_char(bool *pPadding_flag) -{ - if (!m_in_buf_left) - { - prep_in_buffer(); - if (!m_in_buf_left) - { - *pPadding_flag = true; - int t = m_tem_flag; - m_tem_flag ^= 1; - if (t) - return 0xD9; - else - return 0xFF; - } - } - - *pPadding_flag = false; - - uint c = *m_pIn_buf_ofs++; - m_in_buf_left--; - - return c; -} - -// Inserts a previously retrieved character back into the input buffer. -inline void jpeg_decoder::stuff_char(uint8 q) -{ - *(--m_pIn_buf_ofs) = q; - m_in_buf_left++; -} - -// Retrieves one character from the input stream, but does not read past markers. Will continue to return 0xFF when a marker is encountered. -inline uint8 jpeg_decoder::get_octet() -{ - bool padding_flag; - int c = get_char(&padding_flag); - - if (c == 0xFF) - { - if (padding_flag) - return 0xFF; - - c = get_char(&padding_flag); - if (padding_flag) - { - stuff_char(0xFF); - return 0xFF; - } - - if (c == 0x00) - return 0xFF; - else - { - stuff_char(static_cast<uint8>(c)); - stuff_char(0xFF); - return 0xFF; - } - } - - return static_cast<uint8>(c); -} - -// Retrieves a variable number of bits from the input stream. Does not recognize markers. -inline uint jpeg_decoder::get_bits(int num_bits) -{ - if (!num_bits) - return 0; - - uint i = m_bit_buf >> (32 - num_bits); - - if ((m_bits_left -= num_bits) <= 0) - { - m_bit_buf <<= (num_bits += m_bits_left); - - uint c1 = get_char(); - uint c2 = get_char(); - m_bit_buf = (m_bit_buf & 0xFFFF0000) | (c1 << 8) | c2; - - m_bit_buf <<= -m_bits_left; - - m_bits_left += 16; - - JPGD_ASSERT(m_bits_left >= 0); - } - else - m_bit_buf <<= num_bits; - - return i; -} - -// Retrieves a variable number of bits from the input stream. Markers will not be read into the input bit buffer. Instead, an infinite number of all 1's will be returned when a marker is encountered. -inline uint jpeg_decoder::get_bits_no_markers(int num_bits) -{ - if (!num_bits) - return 0; - - uint i = m_bit_buf >> (32 - num_bits); - - if ((m_bits_left -= num_bits) <= 0) - { - m_bit_buf <<= (num_bits += m_bits_left); - - if ((m_in_buf_left < 2) || (m_pIn_buf_ofs[0] == 0xFF) || (m_pIn_buf_ofs[1] == 0xFF)) - { - uint c1 = get_octet(); - uint c2 = get_octet(); - m_bit_buf |= (c1 << 8) | c2; - } - else - { - m_bit_buf |= ((uint)m_pIn_buf_ofs[0] << 8) | m_pIn_buf_ofs[1]; - m_in_buf_left -= 2; - m_pIn_buf_ofs += 2; - } - - m_bit_buf <<= -m_bits_left; - - m_bits_left += 16; - - JPGD_ASSERT(m_bits_left >= 0); - } - else - m_bit_buf <<= num_bits; - - return i; -} - -// Decodes a Huffman encoded symbol. -inline int jpeg_decoder::huff_decode(huff_tables *pH) -{ - JPGD_ASSERT(pH); - - int symbol; - // Check first 8-bits: do we have a complete symbol? - if ((symbol = pH->look_up[m_bit_buf >> 24]) < 0) - { - // Decode more bits, use a tree traversal to find symbol. - int ofs = 23; - do - { - unsigned int idx = -(int)(symbol + ((m_bit_buf >> ofs) & 1)); - JPGD_ASSERT(idx < JPGD_HUFF_TREE_MAX_LENGTH); - symbol = pH->tree[idx]; - ofs--; - } while (symbol < 0); - - get_bits_no_markers(8 + (23 - ofs)); - } - else - { - JPGD_ASSERT(symbol < JPGD_HUFF_CODE_SIZE_MAX_LENGTH); - get_bits_no_markers(pH->code_size[symbol]); - } - - return symbol; -} - -// Decodes a Huffman encoded symbol. -inline int jpeg_decoder::huff_decode(huff_tables *pH, int& extra_bits) -{ - int symbol; - - JPGD_ASSERT(pH); - - // Check first 8-bits: do we have a complete symbol? - if ((symbol = pH->look_up2[m_bit_buf >> 24]) < 0) - { - // Use a tree traversal to find symbol. - int ofs = 23; - do - { - unsigned int idx = -(int)(symbol + ((m_bit_buf >> ofs) & 1)); - JPGD_ASSERT(idx < JPGD_HUFF_TREE_MAX_LENGTH); - symbol = pH->tree[idx]; - ofs--; - } while (symbol < 0); - - get_bits_no_markers(8 + (23 - ofs)); - - extra_bits = get_bits_no_markers(symbol & 0xF); - } - else - { - JPGD_ASSERT(((symbol >> 8) & 31) == pH->code_size[symbol & 255] + ((symbol & 0x8000) ? (symbol & 15) : 0)); - - if (symbol & 0x8000) - { - get_bits_no_markers((symbol >> 8) & 31); - extra_bits = symbol >> 16; - } - else - { - int code_size = (symbol >> 8) & 31; - int num_extra_bits = symbol & 0xF; - int bits = code_size + num_extra_bits; - if (bits <= (m_bits_left + 16)) - extra_bits = get_bits_no_markers(bits) & ((1 << num_extra_bits) - 1); - else - { - get_bits_no_markers(code_size); - extra_bits = get_bits_no_markers(num_extra_bits); - } - } - - symbol &= 0xFF; - } - - return symbol; -} - -// Tables and macro used to fully decode the DPCM differences. -static const int s_extend_test[16] = { 0, 0x0001, 0x0002, 0x0004, 0x0008, 0x0010, 0x0020, 0x0040, 0x0080, 0x0100, 0x0200, 0x0400, 0x0800, 0x1000, 0x2000, 0x4000 }; -static const int s_extend_offset[16] = { 0, ((-1)<<1) + 1, ((-1)<<2) + 1, ((-1)<<3) + 1, ((-1)<<4) + 1, ((-1)<<5) + 1, ((-1)<<6) + 1, ((-1)<<7) + 1, ((-1)<<8) + 1, ((-1)<<9) + 1, ((-1)<<10) + 1, ((-1)<<11) + 1, ((-1)<<12) + 1, ((-1)<<13) + 1, ((-1)<<14) + 1, ((-1)<<15) + 1 }; -static const int s_extend_mask[] = { 0, (1<<0), (1<<1), (1<<2), (1<<3), (1<<4), (1<<5), (1<<6), (1<<7), (1<<8), (1<<9), (1<<10), (1<<11), (1<<12), (1<<13), (1<<14), (1<<15), (1<<16) }; -// The logical AND's in this macro are to shut up static code analysis (aren't really necessary - couldn't find another way to do this) + + int temp[64]; + + const jpgd_block_coeff_t* pSrc = pSrc_ptr; + int* pTemp = temp; + + const uint8* pRow_tab = &s_idct_row_table[(block_max_zag - 1) * 8]; + int i; + for (i = 8; i > 0; i--, pRow_tab++) + { + switch (*pRow_tab) + { + case 0: Row<0>::idct(pTemp, pSrc); break; + case 1: Row<1>::idct(pTemp, pSrc); break; + case 2: Row<2>::idct(pTemp, pSrc); break; + case 3: Row<3>::idct(pTemp, pSrc); break; + case 4: Row<4>::idct(pTemp, pSrc); break; + case 5: Row<5>::idct(pTemp, pSrc); break; + case 6: Row<6>::idct(pTemp, pSrc); break; + case 7: Row<7>::idct(pTemp, pSrc); break; + case 8: Row<8>::idct(pTemp, pSrc); break; + } + + pSrc += 8; + pTemp += 8; + } + + pTemp = temp; + + const int nonzero_rows = s_idct_col_table[block_max_zag - 1]; + for (i = 8; i > 0; i--) + { + switch (nonzero_rows) + { + case 1: Col<1>::idct(pDst_ptr, pTemp); break; + case 2: Col<2>::idct(pDst_ptr, pTemp); break; + case 3: Col<3>::idct(pDst_ptr, pTemp); break; + case 4: Col<4>::idct(pDst_ptr, pTemp); break; + case 5: Col<5>::idct(pDst_ptr, pTemp); break; + case 6: Col<6>::idct(pDst_ptr, pTemp); break; + case 7: Col<7>::idct(pDst_ptr, pTemp); break; + case 8: Col<8>::idct(pDst_ptr, pTemp); break; + } + + pTemp++; + pDst_ptr++; + } + } + + // Retrieve one character from the input stream. + inline uint jpeg_decoder::get_char() + { + // Any bytes remaining in buffer? + if (!m_in_buf_left) + { + // Try to get more bytes. + prep_in_buffer(); + // Still nothing to get? + if (!m_in_buf_left) + { + // Pad the end of the stream with 0xFF 0xD9 (EOI marker) + int t = m_tem_flag; + m_tem_flag ^= 1; + if (t) + return 0xD9; + else + return 0xFF; + } + } + + uint c = *m_pIn_buf_ofs++; + m_in_buf_left--; + + return c; + } + + // Same as previous method, except can indicate if the character is a pad character or not. + inline uint jpeg_decoder::get_char(bool* pPadding_flag) + { + if (!m_in_buf_left) + { + prep_in_buffer(); + if (!m_in_buf_left) + { + *pPadding_flag = true; + int t = m_tem_flag; + m_tem_flag ^= 1; + if (t) + return 0xD9; + else + return 0xFF; + } + } + + *pPadding_flag = false; + + uint c = *m_pIn_buf_ofs++; + m_in_buf_left--; + + return c; + } + + // Inserts a previously retrieved character back into the input buffer. + inline void jpeg_decoder::stuff_char(uint8 q) + { + // This could write before the input buffer, but we've placed another array there. + *(--m_pIn_buf_ofs) = q; + m_in_buf_left++; + } + + // Retrieves one character from the input stream, but does not read past markers. Will continue to return 0xFF when a marker is encountered. + inline uint8 jpeg_decoder::get_octet() + { + bool padding_flag; + int c = get_char(&padding_flag); + + if (c == 0xFF) + { + if (padding_flag) + return 0xFF; + + c = get_char(&padding_flag); + if (padding_flag) + { + stuff_char(0xFF); + return 0xFF; + } + + if (c == 0x00) + return 0xFF; + else + { + stuff_char(static_cast<uint8>(c)); + stuff_char(0xFF); + return 0xFF; + } + } + + return static_cast<uint8>(c); + } + + // Retrieves a variable number of bits from the input stream. Does not recognize markers. + inline uint jpeg_decoder::get_bits(int num_bits) + { + if (!num_bits) + return 0; + + uint i = m_bit_buf >> (32 - num_bits); + + if ((m_bits_left -= num_bits) <= 0) + { + m_bit_buf <<= (num_bits += m_bits_left); + + uint c1 = get_char(); + uint c2 = get_char(); + m_bit_buf = (m_bit_buf & 0xFFFF0000) | (c1 << 8) | c2; + + m_bit_buf <<= -m_bits_left; + + m_bits_left += 16; + + assert(m_bits_left >= 0); + } + else + m_bit_buf <<= num_bits; + + return i; + } + + // Retrieves a variable number of bits from the input stream. Markers will not be read into the input bit buffer. Instead, an infinite number of all 1's will be returned when a marker is encountered. + inline uint jpeg_decoder::get_bits_no_markers(int num_bits) + { + if (!num_bits) + return 0; + + assert(num_bits <= 16); + + uint i = m_bit_buf >> (32 - num_bits); + + if ((m_bits_left -= num_bits) <= 0) + { + m_bit_buf <<= (num_bits += m_bits_left); + + if ((m_in_buf_left < 2) || (m_pIn_buf_ofs[0] == 0xFF) || (m_pIn_buf_ofs[1] == 0xFF)) + { + uint c1 = get_octet(); + uint c2 = get_octet(); + m_bit_buf |= (c1 << 8) | c2; + } + else + { + m_bit_buf |= ((uint)m_pIn_buf_ofs[0] << 8) | m_pIn_buf_ofs[1]; + m_in_buf_left -= 2; + m_pIn_buf_ofs += 2; + } + + m_bit_buf <<= -m_bits_left; + + m_bits_left += 16; + + assert(m_bits_left >= 0); + } + else + m_bit_buf <<= num_bits; + + return i; + } + + // Decodes a Huffman encoded symbol. + inline int jpeg_decoder::huff_decode(huff_tables* pH) + { + if (!pH) + stop_decoding(JPGD_DECODE_ERROR); + + int symbol; + // Check first 8-bits: do we have a complete symbol? + if ((symbol = pH->look_up[m_bit_buf >> 24]) < 0) + { + // Decode more bits, use a tree traversal to find symbol. + int ofs = 23; + do + { + unsigned int idx = -(int)(symbol + ((m_bit_buf >> ofs) & 1)); + + // This should never happen, but to be safe I'm turning these asserts into a run-time check. + if ((idx >= JPGD_HUFF_TREE_MAX_LENGTH) || (ofs < 0)) + stop_decoding(JPGD_DECODE_ERROR); + + symbol = pH->tree[idx]; + ofs--; + } while (symbol < 0); + + get_bits_no_markers(8 + (23 - ofs)); + } + else + { + assert(symbol < JPGD_HUFF_CODE_SIZE_MAX_LENGTH); + get_bits_no_markers(pH->code_size[symbol]); + } + + return symbol; + } + + // Decodes a Huffman encoded symbol. + inline int jpeg_decoder::huff_decode(huff_tables* pH, int& extra_bits) + { + int symbol; + + if (!pH) + stop_decoding(JPGD_DECODE_ERROR); + + // Check first 8-bits: do we have a complete symbol? + if ((symbol = pH->look_up2[m_bit_buf >> 24]) < 0) + { + // Use a tree traversal to find symbol. + int ofs = 23; + do + { + unsigned int idx = -(int)(symbol + ((m_bit_buf >> ofs) & 1)); + + // This should never happen, but to be safe I'm turning these asserts into a run-time check. + if ((idx >= JPGD_HUFF_TREE_MAX_LENGTH) || (ofs < 0)) + stop_decoding(JPGD_DECODE_ERROR); + + symbol = pH->tree[idx]; + ofs--; + } while (symbol < 0); + + get_bits_no_markers(8 + (23 - ofs)); + + extra_bits = get_bits_no_markers(symbol & 0xF); + } + else + { + if (symbol & 0x8000) + { + //get_bits_no_markers((symbol >> 8) & 31); + assert(((symbol >> 8) & 31) <= 15); + get_bits_no_markers((symbol >> 8) & 15); + extra_bits = symbol >> 16; + } + else + { + int code_size = (symbol >> 8) & 31; + int num_extra_bits = symbol & 0xF; + int bits = code_size + num_extra_bits; + + if (bits <= 16) + extra_bits = get_bits_no_markers(bits) & ((1 << num_extra_bits) - 1); + else + { + get_bits_no_markers(code_size); + extra_bits = get_bits_no_markers(num_extra_bits); + } + } + + symbol &= 0xFF; + } + + return symbol; + } + + // Tables and macro used to fully decode the DPCM differences. + static const int s_extend_test[16] = { 0, 0x0001, 0x0002, 0x0004, 0x0008, 0x0010, 0x0020, 0x0040, 0x0080, 0x0100, 0x0200, 0x0400, 0x0800, 0x1000, 0x2000, 0x4000 }; + static const int s_extend_offset[16] = { 0, -1, -3, -7, -15, -31, -63, -127, -255, -511, -1023, -2047, -4095, -8191, -16383, -32767 }; + //static const int s_extend_mask[] = { 0, (1 << 0), (1 << 1), (1 << 2), (1 << 3), (1 << 4), (1 << 5), (1 << 6), (1 << 7), (1 << 8), (1 << 9), (1 << 10), (1 << 11), (1 << 12), (1 << 13), (1 << 14), (1 << 15), (1 << 16) }; + #define JPGD_HUFF_EXTEND(x, s) (((x) < s_extend_test[s & 15]) ? ((x) + s_extend_offset[s & 15]) : (x)) -// Clamps a value between 0-255. -inline uint8 jpeg_decoder::clamp(int i) -{ - if (static_cast<uint>(i) > 255) - i = (((~i) >> 31) & 0xFF); - - return static_cast<uint8>(i); -} - -namespace DCT_Upsample -{ - struct Matrix44 - { - typedef int Element_Type; - enum { NUM_ROWS = 4, NUM_COLS = 4 }; - - Element_Type v[NUM_ROWS][NUM_COLS]; - - inline int rows() const { return NUM_ROWS; } - inline int cols() const { return NUM_COLS; } - - inline const Element_Type & at(int r, int c) const { return v[r][c]; } - inline Element_Type & at(int r, int c) { return v[r][c]; } - - inline Matrix44() { } - - inline Matrix44& operator += (const Matrix44& a) - { - for (int r = 0; r < NUM_ROWS; r++) - { - at(r, 0) += a.at(r, 0); - at(r, 1) += a.at(r, 1); - at(r, 2) += a.at(r, 2); - at(r, 3) += a.at(r, 3); - } - return *this; - } - - inline Matrix44& operator -= (const Matrix44& a) - { - for (int r = 0; r < NUM_ROWS; r++) - { - at(r, 0) -= a.at(r, 0); - at(r, 1) -= a.at(r, 1); - at(r, 2) -= a.at(r, 2); - at(r, 3) -= a.at(r, 3); - } - return *this; - } - - friend inline Matrix44 operator + (const Matrix44& a, const Matrix44& b) - { - Matrix44 ret; - for (int r = 0; r < NUM_ROWS; r++) - { - ret.at(r, 0) = a.at(r, 0) + b.at(r, 0); - ret.at(r, 1) = a.at(r, 1) + b.at(r, 1); - ret.at(r, 2) = a.at(r, 2) + b.at(r, 2); - ret.at(r, 3) = a.at(r, 3) + b.at(r, 3); - } - return ret; - } - - friend inline Matrix44 operator - (const Matrix44& a, const Matrix44& b) - { - Matrix44 ret; - for (int r = 0; r < NUM_ROWS; r++) - { - ret.at(r, 0) = a.at(r, 0) - b.at(r, 0); - ret.at(r, 1) = a.at(r, 1) - b.at(r, 1); - ret.at(r, 2) = a.at(r, 2) - b.at(r, 2); - ret.at(r, 3) = a.at(r, 3) - b.at(r, 3); - } - return ret; - } - - static inline void add_and_store(jpgd_block_t* pDst, const Matrix44& a, const Matrix44& b) - { - for (int r = 0; r < 4; r++) - { - pDst[0*8 + r] = static_cast<jpgd_block_t>(a.at(r, 0) + b.at(r, 0)); - pDst[1*8 + r] = static_cast<jpgd_block_t>(a.at(r, 1) + b.at(r, 1)); - pDst[2*8 + r] = static_cast<jpgd_block_t>(a.at(r, 2) + b.at(r, 2)); - pDst[3*8 + r] = static_cast<jpgd_block_t>(a.at(r, 3) + b.at(r, 3)); - } - } - - static inline void sub_and_store(jpgd_block_t* pDst, const Matrix44& a, const Matrix44& b) - { - for (int r = 0; r < 4; r++) - { - pDst[0*8 + r] = static_cast<jpgd_block_t>(a.at(r, 0) - b.at(r, 0)); - pDst[1*8 + r] = static_cast<jpgd_block_t>(a.at(r, 1) - b.at(r, 1)); - pDst[2*8 + r] = static_cast<jpgd_block_t>(a.at(r, 2) - b.at(r, 2)); - pDst[3*8 + r] = static_cast<jpgd_block_t>(a.at(r, 3) - b.at(r, 3)); - } - } - }; - - const int FRACT_BITS = 10; - const int SCALE = 1 << FRACT_BITS; - - typedef int Temp_Type; - #define D(i) (((i) + (SCALE >> 1)) >> FRACT_BITS) - #define F(i) ((int)((i) * SCALE + .5f)) - - // Any decent C++ compiler will optimize this at compile time to a 0, or an array access. - #define AT(c, r) ((((c)>=NUM_COLS)||((r)>=NUM_ROWS)) ? 0 : pSrc[(c)+(r)*8]) - - // NUM_ROWS/NUM_COLS = # of non-zero rows/cols in input matrix - template<int NUM_ROWS, int NUM_COLS> - struct P_Q - { - static void calc(Matrix44& P, Matrix44& Q, const jpgd_block_t* pSrc) - { - // 4x8 = 4x8 times 8x8, matrix 0 is constant - const Temp_Type X000 = AT(0, 0); - const Temp_Type X001 = AT(0, 1); - const Temp_Type X002 = AT(0, 2); - const Temp_Type X003 = AT(0, 3); - const Temp_Type X004 = AT(0, 4); - const Temp_Type X005 = AT(0, 5); - const Temp_Type X006 = AT(0, 6); - const Temp_Type X007 = AT(0, 7); - const Temp_Type X010 = D(F(0.415735f) * AT(1, 0) + F(0.791065f) * AT(3, 0) + F(-0.352443f) * AT(5, 0) + F(0.277785f) * AT(7, 0)); - const Temp_Type X011 = D(F(0.415735f) * AT(1, 1) + F(0.791065f) * AT(3, 1) + F(-0.352443f) * AT(5, 1) + F(0.277785f) * AT(7, 1)); - const Temp_Type X012 = D(F(0.415735f) * AT(1, 2) + F(0.791065f) * AT(3, 2) + F(-0.352443f) * AT(5, 2) + F(0.277785f) * AT(7, 2)); - const Temp_Type X013 = D(F(0.415735f) * AT(1, 3) + F(0.791065f) * AT(3, 3) + F(-0.352443f) * AT(5, 3) + F(0.277785f) * AT(7, 3)); - const Temp_Type X014 = D(F(0.415735f) * AT(1, 4) + F(0.791065f) * AT(3, 4) + F(-0.352443f) * AT(5, 4) + F(0.277785f) * AT(7, 4)); - const Temp_Type X015 = D(F(0.415735f) * AT(1, 5) + F(0.791065f) * AT(3, 5) + F(-0.352443f) * AT(5, 5) + F(0.277785f) * AT(7, 5)); - const Temp_Type X016 = D(F(0.415735f) * AT(1, 6) + F(0.791065f) * AT(3, 6) + F(-0.352443f) * AT(5, 6) + F(0.277785f) * AT(7, 6)); - const Temp_Type X017 = D(F(0.415735f) * AT(1, 7) + F(0.791065f) * AT(3, 7) + F(-0.352443f) * AT(5, 7) + F(0.277785f) * AT(7, 7)); - const Temp_Type X020 = AT(4, 0); - const Temp_Type X021 = AT(4, 1); - const Temp_Type X022 = AT(4, 2); - const Temp_Type X023 = AT(4, 3); - const Temp_Type X024 = AT(4, 4); - const Temp_Type X025 = AT(4, 5); - const Temp_Type X026 = AT(4, 6); - const Temp_Type X027 = AT(4, 7); - const Temp_Type X030 = D(F(0.022887f) * AT(1, 0) + F(-0.097545f) * AT(3, 0) + F(0.490393f) * AT(5, 0) + F(0.865723f) * AT(7, 0)); - const Temp_Type X031 = D(F(0.022887f) * AT(1, 1) + F(-0.097545f) * AT(3, 1) + F(0.490393f) * AT(5, 1) + F(0.865723f) * AT(7, 1)); - const Temp_Type X032 = D(F(0.022887f) * AT(1, 2) + F(-0.097545f) * AT(3, 2) + F(0.490393f) * AT(5, 2) + F(0.865723f) * AT(7, 2)); - const Temp_Type X033 = D(F(0.022887f) * AT(1, 3) + F(-0.097545f) * AT(3, 3) + F(0.490393f) * AT(5, 3) + F(0.865723f) * AT(7, 3)); - const Temp_Type X034 = D(F(0.022887f) * AT(1, 4) + F(-0.097545f) * AT(3, 4) + F(0.490393f) * AT(5, 4) + F(0.865723f) * AT(7, 4)); - const Temp_Type X035 = D(F(0.022887f) * AT(1, 5) + F(-0.097545f) * AT(3, 5) + F(0.490393f) * AT(5, 5) + F(0.865723f) * AT(7, 5)); - const Temp_Type X036 = D(F(0.022887f) * AT(1, 6) + F(-0.097545f) * AT(3, 6) + F(0.490393f) * AT(5, 6) + F(0.865723f) * AT(7, 6)); - const Temp_Type X037 = D(F(0.022887f) * AT(1, 7) + F(-0.097545f) * AT(3, 7) + F(0.490393f) * AT(5, 7) + F(0.865723f) * AT(7, 7)); - - // 4x4 = 4x8 times 8x4, matrix 1 is constant - P.at(0, 0) = X000; - P.at(0, 1) = D(X001 * F(0.415735f) + X003 * F(0.791065f) + X005 * F(-0.352443f) + X007 * F(0.277785f)); - P.at(0, 2) = X004; - P.at(0, 3) = D(X001 * F(0.022887f) + X003 * F(-0.097545f) + X005 * F(0.490393f) + X007 * F(0.865723f)); - P.at(1, 0) = X010; - P.at(1, 1) = D(X011 * F(0.415735f) + X013 * F(0.791065f) + X015 * F(-0.352443f) + X017 * F(0.277785f)); - P.at(1, 2) = X014; - P.at(1, 3) = D(X011 * F(0.022887f) + X013 * F(-0.097545f) + X015 * F(0.490393f) + X017 * F(0.865723f)); - P.at(2, 0) = X020; - P.at(2, 1) = D(X021 * F(0.415735f) + X023 * F(0.791065f) + X025 * F(-0.352443f) + X027 * F(0.277785f)); - P.at(2, 2) = X024; - P.at(2, 3) = D(X021 * F(0.022887f) + X023 * F(-0.097545f) + X025 * F(0.490393f) + X027 * F(0.865723f)); - P.at(3, 0) = X030; - P.at(3, 1) = D(X031 * F(0.415735f) + X033 * F(0.791065f) + X035 * F(-0.352443f) + X037 * F(0.277785f)); - P.at(3, 2) = X034; - P.at(3, 3) = D(X031 * F(0.022887f) + X033 * F(-0.097545f) + X035 * F(0.490393f) + X037 * F(0.865723f)); - // 40 muls 24 adds - - // 4x4 = 4x8 times 8x4, matrix 1 is constant - Q.at(0, 0) = D(X001 * F(0.906127f) + X003 * F(-0.318190f) + X005 * F(0.212608f) + X007 * F(-0.180240f)); - Q.at(0, 1) = X002; - Q.at(0, 2) = D(X001 * F(-0.074658f) + X003 * F(0.513280f) + X005 * F(0.768178f) + X007 * F(-0.375330f)); - Q.at(0, 3) = X006; - Q.at(1, 0) = D(X011 * F(0.906127f) + X013 * F(-0.318190f) + X015 * F(0.212608f) + X017 * F(-0.180240f)); - Q.at(1, 1) = X012; - Q.at(1, 2) = D(X011 * F(-0.074658f) + X013 * F(0.513280f) + X015 * F(0.768178f) + X017 * F(-0.375330f)); - Q.at(1, 3) = X016; - Q.at(2, 0) = D(X021 * F(0.906127f) + X023 * F(-0.318190f) + X025 * F(0.212608f) + X027 * F(-0.180240f)); - Q.at(2, 1) = X022; - Q.at(2, 2) = D(X021 * F(-0.074658f) + X023 * F(0.513280f) + X025 * F(0.768178f) + X027 * F(-0.375330f)); - Q.at(2, 3) = X026; - Q.at(3, 0) = D(X031 * F(0.906127f) + X033 * F(-0.318190f) + X035 * F(0.212608f) + X037 * F(-0.180240f)); - Q.at(3, 1) = X032; - Q.at(3, 2) = D(X031 * F(-0.074658f) + X033 * F(0.513280f) + X035 * F(0.768178f) + X037 * F(-0.375330f)); - Q.at(3, 3) = X036; - // 40 muls 24 adds - } - }; - - template<int NUM_ROWS, int NUM_COLS> - struct R_S - { - static void calc(Matrix44& R, Matrix44& S, const jpgd_block_t* pSrc) - { - // 4x8 = 4x8 times 8x8, matrix 0 is constant - const Temp_Type X100 = D(F(0.906127f) * AT(1, 0) + F(-0.318190f) * AT(3, 0) + F(0.212608f) * AT(5, 0) + F(-0.180240f) * AT(7, 0)); - const Temp_Type X101 = D(F(0.906127f) * AT(1, 1) + F(-0.318190f) * AT(3, 1) + F(0.212608f) * AT(5, 1) + F(-0.180240f) * AT(7, 1)); - const Temp_Type X102 = D(F(0.906127f) * AT(1, 2) + F(-0.318190f) * AT(3, 2) + F(0.212608f) * AT(5, 2) + F(-0.180240f) * AT(7, 2)); - const Temp_Type X103 = D(F(0.906127f) * AT(1, 3) + F(-0.318190f) * AT(3, 3) + F(0.212608f) * AT(5, 3) + F(-0.180240f) * AT(7, 3)); - const Temp_Type X104 = D(F(0.906127f) * AT(1, 4) + F(-0.318190f) * AT(3, 4) + F(0.212608f) * AT(5, 4) + F(-0.180240f) * AT(7, 4)); - const Temp_Type X105 = D(F(0.906127f) * AT(1, 5) + F(-0.318190f) * AT(3, 5) + F(0.212608f) * AT(5, 5) + F(-0.180240f) * AT(7, 5)); - const Temp_Type X106 = D(F(0.906127f) * AT(1, 6) + F(-0.318190f) * AT(3, 6) + F(0.212608f) * AT(5, 6) + F(-0.180240f) * AT(7, 6)); - const Temp_Type X107 = D(F(0.906127f) * AT(1, 7) + F(-0.318190f) * AT(3, 7) + F(0.212608f) * AT(5, 7) + F(-0.180240f) * AT(7, 7)); - const Temp_Type X110 = AT(2, 0); - const Temp_Type X111 = AT(2, 1); - const Temp_Type X112 = AT(2, 2); - const Temp_Type X113 = AT(2, 3); - const Temp_Type X114 = AT(2, 4); - const Temp_Type X115 = AT(2, 5); - const Temp_Type X116 = AT(2, 6); - const Temp_Type X117 = AT(2, 7); - const Temp_Type X120 = D(F(-0.074658f) * AT(1, 0) + F(0.513280f) * AT(3, 0) + F(0.768178f) * AT(5, 0) + F(-0.375330f) * AT(7, 0)); - const Temp_Type X121 = D(F(-0.074658f) * AT(1, 1) + F(0.513280f) * AT(3, 1) + F(0.768178f) * AT(5, 1) + F(-0.375330f) * AT(7, 1)); - const Temp_Type X122 = D(F(-0.074658f) * AT(1, 2) + F(0.513280f) * AT(3, 2) + F(0.768178f) * AT(5, 2) + F(-0.375330f) * AT(7, 2)); - const Temp_Type X123 = D(F(-0.074658f) * AT(1, 3) + F(0.513280f) * AT(3, 3) + F(0.768178f) * AT(5, 3) + F(-0.375330f) * AT(7, 3)); - const Temp_Type X124 = D(F(-0.074658f) * AT(1, 4) + F(0.513280f) * AT(3, 4) + F(0.768178f) * AT(5, 4) + F(-0.375330f) * AT(7, 4)); - const Temp_Type X125 = D(F(-0.074658f) * AT(1, 5) + F(0.513280f) * AT(3, 5) + F(0.768178f) * AT(5, 5) + F(-0.375330f) * AT(7, 5)); - const Temp_Type X126 = D(F(-0.074658f) * AT(1, 6) + F(0.513280f) * AT(3, 6) + F(0.768178f) * AT(5, 6) + F(-0.375330f) * AT(7, 6)); - const Temp_Type X127 = D(F(-0.074658f) * AT(1, 7) + F(0.513280f) * AT(3, 7) + F(0.768178f) * AT(5, 7) + F(-0.375330f) * AT(7, 7)); - const Temp_Type X130 = AT(6, 0); - const Temp_Type X131 = AT(6, 1); - const Temp_Type X132 = AT(6, 2); - const Temp_Type X133 = AT(6, 3); - const Temp_Type X134 = AT(6, 4); - const Temp_Type X135 = AT(6, 5); - const Temp_Type X136 = AT(6, 6); - const Temp_Type X137 = AT(6, 7); - // 80 muls 48 adds - - // 4x4 = 4x8 times 8x4, matrix 1 is constant - R.at(0, 0) = X100; - R.at(0, 1) = D(X101 * F(0.415735f) + X103 * F(0.791065f) + X105 * F(-0.352443f) + X107 * F(0.277785f)); - R.at(0, 2) = X104; - R.at(0, 3) = D(X101 * F(0.022887f) + X103 * F(-0.097545f) + X105 * F(0.490393f) + X107 * F(0.865723f)); - R.at(1, 0) = X110; - R.at(1, 1) = D(X111 * F(0.415735f) + X113 * F(0.791065f) + X115 * F(-0.352443f) + X117 * F(0.277785f)); - R.at(1, 2) = X114; - R.at(1, 3) = D(X111 * F(0.022887f) + X113 * F(-0.097545f) + X115 * F(0.490393f) + X117 * F(0.865723f)); - R.at(2, 0) = X120; - R.at(2, 1) = D(X121 * F(0.415735f) + X123 * F(0.791065f) + X125 * F(-0.352443f) + X127 * F(0.277785f)); - R.at(2, 2) = X124; - R.at(2, 3) = D(X121 * F(0.022887f) + X123 * F(-0.097545f) + X125 * F(0.490393f) + X127 * F(0.865723f)); - R.at(3, 0) = X130; - R.at(3, 1) = D(X131 * F(0.415735f) + X133 * F(0.791065f) + X135 * F(-0.352443f) + X137 * F(0.277785f)); - R.at(3, 2) = X134; - R.at(3, 3) = D(X131 * F(0.022887f) + X133 * F(-0.097545f) + X135 * F(0.490393f) + X137 * F(0.865723f)); - // 40 muls 24 adds - // 4x4 = 4x8 times 8x4, matrix 1 is constant - S.at(0, 0) = D(X101 * F(0.906127f) + X103 * F(-0.318190f) + X105 * F(0.212608f) + X107 * F(-0.180240f)); - S.at(0, 1) = X102; - S.at(0, 2) = D(X101 * F(-0.074658f) + X103 * F(0.513280f) + X105 * F(0.768178f) + X107 * F(-0.375330f)); - S.at(0, 3) = X106; - S.at(1, 0) = D(X111 * F(0.906127f) + X113 * F(-0.318190f) + X115 * F(0.212608f) + X117 * F(-0.180240f)); - S.at(1, 1) = X112; - S.at(1, 2) = D(X111 * F(-0.074658f) + X113 * F(0.513280f) + X115 * F(0.768178f) + X117 * F(-0.375330f)); - S.at(1, 3) = X116; - S.at(2, 0) = D(X121 * F(0.906127f) + X123 * F(-0.318190f) + X125 * F(0.212608f) + X127 * F(-0.180240f)); - S.at(2, 1) = X122; - S.at(2, 2) = D(X121 * F(-0.074658f) + X123 * F(0.513280f) + X125 * F(0.768178f) + X127 * F(-0.375330f)); - S.at(2, 3) = X126; - S.at(3, 0) = D(X131 * F(0.906127f) + X133 * F(-0.318190f) + X135 * F(0.212608f) + X137 * F(-0.180240f)); - S.at(3, 1) = X132; - S.at(3, 2) = D(X131 * F(-0.074658f) + X133 * F(0.513280f) + X135 * F(0.768178f) + X137 * F(-0.375330f)); - S.at(3, 3) = X136; - // 40 muls 24 adds - } - }; -} // end namespace DCT_Upsample - -// Unconditionally frees all allocated m_blocks. -void jpeg_decoder::free_all_blocks() -{ - m_pStream = NULL; - for (mem_block *b = m_pMem_blocks; b; ) - { - mem_block *n = b->m_pNext; - jpgd_free(b); - b = n; - } - m_pMem_blocks = NULL; -} - -// This method handles all errors. It will never return. -// It could easily be changed to use C++ exceptions. -JPGD_NORETURN void jpeg_decoder::stop_decoding(jpgd_status status) -{ - m_error_code = status; - free_all_blocks(); - longjmp(m_jmp_state, status); -} - -void *jpeg_decoder::alloc(size_t nSize, bool zero) -{ - nSize = (JPGD_MAX(nSize, 1) + 3) & ~3; - char *rv = NULL; - for (mem_block *b = m_pMem_blocks; b; b = b->m_pNext) - { - if ((b->m_used_count + nSize) <= b->m_size) - { - rv = b->m_data + b->m_used_count; - b->m_used_count += nSize; - break; - } - } - if (!rv) - { - int capacity = JPGD_MAX(32768 - 256, (nSize + 2047) & ~2047); - mem_block *b = (mem_block*)jpgd_malloc(sizeof(mem_block) + capacity); - if (!b) { stop_decoding(JPGD_NOTENOUGHMEM); } - b->m_pNext = m_pMem_blocks; m_pMem_blocks = b; - b->m_used_count = nSize; - b->m_size = capacity; - rv = b->m_data; - } - if (zero) memset(rv, 0, nSize); - return rv; -} - -void jpeg_decoder::word_clear(void *p, uint16 c, uint n) -{ - uint8 *pD = (uint8*)p; - const uint8 l = c & 0xFF, h = (c >> 8) & 0xFF; - while (n) - { - pD[0] = l; pD[1] = h; pD += 2; - n--; - } -} - -// Refill the input buffer. -// This method will sit in a loop until (A) the buffer is full or (B) -// the stream's read() method reports and end of file condition. -void jpeg_decoder::prep_in_buffer() -{ - m_in_buf_left = 0; - m_pIn_buf_ofs = m_in_buf; - - if (m_eof_flag) - return; - - do - { - int bytes_read = m_pStream->read(m_in_buf + m_in_buf_left, JPGD_IN_BUF_SIZE - m_in_buf_left, &m_eof_flag); - if (bytes_read == -1) - stop_decoding(JPGD_STREAM_READ); - - m_in_buf_left += bytes_read; - } while ((m_in_buf_left < JPGD_IN_BUF_SIZE) && (!m_eof_flag)); - - m_total_bytes_read += m_in_buf_left; - - // Pad the end of the block with M_EOI (prevents the decompressor from going off the rails if the stream is invalid). - // (This dates way back to when this decompressor was written in C/asm, and the all-asm Huffman decoder did some fancy things to increase perf.) - word_clear(m_pIn_buf_ofs + m_in_buf_left, 0xD9FF, 64); -} - -// Read a Huffman code table. -void jpeg_decoder::read_dht_marker() -{ - int i, index, count; - uint8 huff_num[17]; - uint8 huff_val[256]; - - uint num_left = get_bits(16); - - if (num_left < 2) - stop_decoding(JPGD_BAD_DHT_MARKER); - - num_left -= 2; - - while (num_left) - { - index = get_bits(8); - - huff_num[0] = 0; - - count = 0; - - for (i = 1; i <= 16; i++) - { - huff_num[i] = static_cast<uint8>(get_bits(8)); - count += huff_num[i]; - } - - if (count > 255) - stop_decoding(JPGD_BAD_DHT_COUNTS); - - for (i = 0; i < count; i++) - huff_val[i] = static_cast<uint8>(get_bits(8)); + // Unconditionally frees all allocated m_blocks. + void jpeg_decoder::free_all_blocks() + { + m_pStream = nullptr; + for (mem_block* b = m_pMem_blocks; b; ) + { + mem_block* n = b->m_pNext; + jpgd_free(b); + b = n; + } + m_pMem_blocks = nullptr; + } + + // This method handles all errors. It will never return. + // It could easily be changed to use C++ exceptions. + JPGD_NORETURN void jpeg_decoder::stop_decoding(jpgd_status status) + { + m_error_code = status; + free_all_blocks(); + longjmp(m_jmp_state, status); + } + + void* jpeg_decoder::alloc(size_t nSize, bool zero) + { + nSize = (JPGD_MAX(nSize, 1) + 3) & ~3; + char* rv = nullptr; + for (mem_block* b = m_pMem_blocks; b; b = b->m_pNext) + { + if ((b->m_used_count + nSize) <= b->m_size) + { + rv = b->m_data + b->m_used_count; + b->m_used_count += nSize; + break; + } + } + if (!rv) + { + int capacity = JPGD_MAX(32768 - 256, (nSize + 2047) & ~2047); + mem_block* b = (mem_block*)jpgd_malloc(sizeof(mem_block) + capacity); + if (!b) + { + stop_decoding(JPGD_NOTENOUGHMEM); + } + + b->m_pNext = m_pMem_blocks; + m_pMem_blocks = b; + b->m_used_count = nSize; + b->m_size = capacity; + rv = b->m_data; + } + if (zero) memset(rv, 0, nSize); + return rv; + } + + void* jpeg_decoder::alloc_aligned(size_t nSize, uint32_t align, bool zero) + { + assert((align >= 1U) && ((align & (align - 1U)) == 0U)); + void *p = alloc(nSize + align - 1U, zero); + p = (void *)( ((uintptr_t)p + (align - 1U)) & ~((uintptr_t)(align - 1U)) ); + return p; + } + + void jpeg_decoder::word_clear(void* p, uint16 c, uint n) + { + uint8* pD = (uint8*)p; + const uint8 l = c & 0xFF, h = (c >> 8) & 0xFF; + while (n) + { + pD[0] = l; + pD[1] = h; + pD += 2; + n--; + } + } + + // Refill the input buffer. + // This method will sit in a loop until (A) the buffer is full or (B) + // the stream's read() method reports and end of file condition. + void jpeg_decoder::prep_in_buffer() + { + m_in_buf_left = 0; + m_pIn_buf_ofs = m_in_buf; + + if (m_eof_flag) + return; + + do + { + int bytes_read = m_pStream->read(m_in_buf + m_in_buf_left, JPGD_IN_BUF_SIZE - m_in_buf_left, &m_eof_flag); + if (bytes_read == -1) + stop_decoding(JPGD_STREAM_READ); + + m_in_buf_left += bytes_read; + } while ((m_in_buf_left < JPGD_IN_BUF_SIZE) && (!m_eof_flag)); + + m_total_bytes_read += m_in_buf_left; + + // Pad the end of the block with M_EOI (prevents the decompressor from going off the rails if the stream is invalid). + // (This dates way back to when this decompressor was written in C/asm, and the all-asm Huffman decoder did some fancy things to increase perf.) + word_clear(m_pIn_buf_ofs + m_in_buf_left, 0xD9FF, 64); + } + + // Read a Huffman code table. + void jpeg_decoder::read_dht_marker() + { + int i, index, count; + uint8 huff_num[17]; + uint8 huff_val[256]; + + uint num_left = get_bits(16); + + if (num_left < 2) + stop_decoding(JPGD_BAD_DHT_MARKER); + + num_left -= 2; + + while (num_left) + { + index = get_bits(8); + + huff_num[0] = 0; + + count = 0; + + for (i = 1; i <= 16; i++) + { + huff_num[i] = static_cast<uint8>(get_bits(8)); + count += huff_num[i]; + } + + if (count > 255) + stop_decoding(JPGD_BAD_DHT_COUNTS); + + bool symbol_present[256]; + memset(symbol_present, 0, sizeof(symbol_present)); - i = 1 + 16 + count; + for (i = 0; i < count; i++) + { + const int s = get_bits(8); + + // Check for obviously bogus tables. + if (symbol_present[s]) + stop_decoding(JPGD_BAD_DHT_COUNTS); + + huff_val[i] = static_cast<uint8_t>(s); + symbol_present[s] = true; + } - if (num_left < (uint)i) - stop_decoding(JPGD_BAD_DHT_MARKER); + i = 1 + 16 + count; - num_left -= i; + if (num_left < (uint)i) + stop_decoding(JPGD_BAD_DHT_MARKER); - if ((index & 0x10) > 0x10) - stop_decoding(JPGD_BAD_DHT_INDEX); + num_left -= i; - index = (index & 0x0F) + ((index & 0x10) >> 4) * (JPGD_MAX_HUFF_TABLES >> 1); + if ((index & 0x10) > 0x10) + stop_decoding(JPGD_BAD_DHT_INDEX); - if (index >= JPGD_MAX_HUFF_TABLES) - stop_decoding(JPGD_BAD_DHT_INDEX); + index = (index & 0x0F) + ((index & 0x10) >> 4) * (JPGD_MAX_HUFF_TABLES >> 1); - if (!m_huff_num[index]) - m_huff_num[index] = (uint8 *)alloc(17); + if (index >= JPGD_MAX_HUFF_TABLES) + stop_decoding(JPGD_BAD_DHT_INDEX); - if (!m_huff_val[index]) - m_huff_val[index] = (uint8 *)alloc(256); + if (!m_huff_num[index]) + m_huff_num[index] = (uint8*)alloc(17); - m_huff_ac[index] = (index & 0x10) != 0; - memcpy(m_huff_num[index], huff_num, 17); - memcpy(m_huff_val[index], huff_val, 256); - } -} + if (!m_huff_val[index]) + m_huff_val[index] = (uint8*)alloc(256); -// Read a quantization table. -void jpeg_decoder::read_dqt_marker() -{ - int n, i, prec; - uint num_left; - uint temp; + m_huff_ac[index] = (index & 0x10) != 0; + memcpy(m_huff_num[index], huff_num, 17); + memcpy(m_huff_val[index], huff_val, 256); + } + } - num_left = get_bits(16); + // Read a quantization table. + void jpeg_decoder::read_dqt_marker() + { + int n, i, prec; + uint num_left; + uint temp; - if (num_left < 2) - stop_decoding(JPGD_BAD_DQT_MARKER); + num_left = get_bits(16); - num_left -= 2; + if (num_left < 2) + stop_decoding(JPGD_BAD_DQT_MARKER); - while (num_left) - { - n = get_bits(8); - prec = n >> 4; - n &= 0x0F; + num_left -= 2; - if (n >= JPGD_MAX_QUANT_TABLES) - stop_decoding(JPGD_BAD_DQT_TABLE); + while (num_left) + { + n = get_bits(8); + prec = n >> 4; + n &= 0x0F; - if (!m_quant[n]) - m_quant[n] = (jpgd_quant_t *)alloc(64 * sizeof(jpgd_quant_t)); + if (n >= JPGD_MAX_QUANT_TABLES) + stop_decoding(JPGD_BAD_DQT_TABLE); - // read quantization entries, in zag order - for (i = 0; i < 64; i++) - { - temp = get_bits(8); + if (!m_quant[n]) + m_quant[n] = (jpgd_quant_t*)alloc(64 * sizeof(jpgd_quant_t)); - if (prec) - temp = (temp << 8) + get_bits(8); + // read quantization entries, in zag order + for (i = 0; i < 64; i++) + { + temp = get_bits(8); - m_quant[n][i] = static_cast<jpgd_quant_t>(temp); - } + if (prec) + temp = (temp << 8) + get_bits(8); - i = 64 + 1; + m_quant[n][i] = static_cast<jpgd_quant_t>(temp); + } - if (prec) - i += 64; + i = 64 + 1; - if (num_left < (uint)i) - stop_decoding(JPGD_BAD_DQT_LENGTH); + if (prec) + i += 64; - num_left -= i; - } -} + if (num_left < (uint)i) + stop_decoding(JPGD_BAD_DQT_LENGTH); -// Read the start of frame (SOF) marker. -void jpeg_decoder::read_sof_marker() -{ - int i; - uint num_left; + num_left -= i; + } + } - num_left = get_bits(16); + // Read the start of frame (SOF) marker. + void jpeg_decoder::read_sof_marker() + { + int i; + uint num_left; - if (get_bits(8) != 8) /* precision: sorry, only 8-bit precision is supported right now */ - stop_decoding(JPGD_BAD_PRECISION); + num_left = get_bits(16); - m_image_y_size = get_bits(16); + /* precision: sorry, only 8-bit precision is supported */ + if (get_bits(8) != 8) + stop_decoding(JPGD_BAD_PRECISION); - if ((m_image_y_size < 1) || (m_image_y_size > JPGD_MAX_HEIGHT)) - stop_decoding(JPGD_BAD_HEIGHT); + m_image_y_size = get_bits(16); - m_image_x_size = get_bits(16); + if ((m_image_y_size < 1) || (m_image_y_size > JPGD_MAX_HEIGHT)) + stop_decoding(JPGD_BAD_HEIGHT); - if ((m_image_x_size < 1) || (m_image_x_size > JPGD_MAX_WIDTH)) - stop_decoding(JPGD_BAD_WIDTH); + m_image_x_size = get_bits(16); - m_comps_in_frame = get_bits(8); + if ((m_image_x_size < 1) || (m_image_x_size > JPGD_MAX_WIDTH)) + stop_decoding(JPGD_BAD_WIDTH); - if (m_comps_in_frame > JPGD_MAX_COMPONENTS) - stop_decoding(JPGD_TOO_MANY_COMPONENTS); + m_comps_in_frame = get_bits(8); - if (num_left != (uint)(m_comps_in_frame * 3 + 8)) - stop_decoding(JPGD_BAD_SOF_LENGTH); + if (m_comps_in_frame > JPGD_MAX_COMPONENTS) + stop_decoding(JPGD_TOO_MANY_COMPONENTS); - for (i = 0; i < m_comps_in_frame; i++) - { - m_comp_ident[i] = get_bits(8); - m_comp_h_samp[i] = get_bits(4); - m_comp_v_samp[i] = get_bits(4); - m_comp_quant[i] = get_bits(8); - } -} + if (num_left != (uint)(m_comps_in_frame * 3 + 8)) + stop_decoding(JPGD_BAD_SOF_LENGTH); -// Used to skip unrecognized markers. -void jpeg_decoder::skip_variable_marker() -{ - uint num_left; + for (i = 0; i < m_comps_in_frame; i++) + { + m_comp_ident[i] = get_bits(8); + m_comp_h_samp[i] = get_bits(4); + m_comp_v_samp[i] = get_bits(4); - num_left = get_bits(16); + if (!m_comp_h_samp[i] || !m_comp_v_samp[i] || (m_comp_h_samp[i] > 2) || (m_comp_v_samp[i] > 2)) + stop_decoding(JPGD_UNSUPPORTED_SAMP_FACTORS); - if (num_left < 2) - stop_decoding(JPGD_BAD_VARIABLE_MARKER); + m_comp_quant[i] = get_bits(8); + if (m_comp_quant[i] >= JPGD_MAX_QUANT_TABLES) + stop_decoding(JPGD_DECODE_ERROR); + } + } + + // Used to skip unrecognized markers. + void jpeg_decoder::skip_variable_marker() + { + uint num_left; + + num_left = get_bits(16); + + if (num_left < 2) + stop_decoding(JPGD_BAD_VARIABLE_MARKER); + + num_left -= 2; + + while (num_left) + { + get_bits(8); + num_left--; + } + } + + // Read a define restart interval (DRI) marker. + void jpeg_decoder::read_dri_marker() + { + if (get_bits(16) != 4) + stop_decoding(JPGD_BAD_DRI_LENGTH); + + m_restart_interval = get_bits(16); + } + + // Read a start of scan (SOS) marker. + void jpeg_decoder::read_sos_marker() + { + uint num_left; + int i, ci, n, c, cc; + + num_left = get_bits(16); + + n = get_bits(8); + + m_comps_in_scan = n; + + num_left -= 3; + + if ((num_left != (uint)(n * 2 + 3)) || (n < 1) || (n > JPGD_MAX_COMPS_IN_SCAN)) + stop_decoding(JPGD_BAD_SOS_LENGTH); + + for (i = 0; i < n; i++) + { + cc = get_bits(8); + c = get_bits(8); + num_left -= 2; + + for (ci = 0; ci < m_comps_in_frame; ci++) + if (cc == m_comp_ident[ci]) + break; + + if (ci >= m_comps_in_frame) + stop_decoding(JPGD_BAD_SOS_COMP_ID); + + if (ci >= JPGD_MAX_COMPONENTS) + stop_decoding(JPGD_DECODE_ERROR); + + m_comp_list[i] = ci; + + m_comp_dc_tab[ci] = (c >> 4) & 15; + m_comp_ac_tab[ci] = (c & 15) + (JPGD_MAX_HUFF_TABLES >> 1); + + if (m_comp_dc_tab[ci] >= JPGD_MAX_HUFF_TABLES) + stop_decoding(JPGD_DECODE_ERROR); + + if (m_comp_ac_tab[ci] >= JPGD_MAX_HUFF_TABLES) + stop_decoding(JPGD_DECODE_ERROR); + } + + m_spectral_start = get_bits(8); + m_spectral_end = get_bits(8); + m_successive_high = get_bits(4); + m_successive_low = get_bits(4); + + if (!m_progressive_flag) + { + m_spectral_start = 0; + m_spectral_end = 63; + } + + num_left -= 3; + + /* read past whatever is num_left */ + while (num_left) + { + get_bits(8); + num_left--; + } + } + + // Finds the next marker. + int jpeg_decoder::next_marker() + { + uint c, bytes; + + bytes = 0; + + do + { + do + { + bytes++; + c = get_bits(8); + } while (c != 0xFF); - num_left -= 2; + do + { + c = get_bits(8); + } while (c == 0xFF); + + } while (c == 0); + + // If bytes > 0 here, there where extra bytes before the marker (not good). + + return c; + } + + // Process markers. Returns when an SOFx, SOI, EOI, or SOS marker is + // encountered. + int jpeg_decoder::process_markers() + { + int c; + + for (; ; ) + { + c = next_marker(); + + switch (c) + { + case M_SOF0: + case M_SOF1: + case M_SOF2: + case M_SOF3: + case M_SOF5: + case M_SOF6: + case M_SOF7: + // case M_JPG: + case M_SOF9: + case M_SOF10: + case M_SOF11: + case M_SOF13: + case M_SOF14: + case M_SOF15: + case M_SOI: + case M_EOI: + case M_SOS: + { + return c; + } + case M_DHT: + { + read_dht_marker(); + break; + } + // No arithmitic support - dumb patents! + case M_DAC: + { + stop_decoding(JPGD_NO_ARITHMITIC_SUPPORT); + break; + } + case M_DQT: + { + read_dqt_marker(); + break; + } + case M_DRI: + { + read_dri_marker(); + break; + } + //case M_APP0: /* no need to read the JFIF marker */ + case M_JPG: + case M_RST0: /* no parameters */ + case M_RST1: + case M_RST2: + case M_RST3: + case M_RST4: + case M_RST5: + case M_RST6: + case M_RST7: + case M_TEM: + { + stop_decoding(JPGD_UNEXPECTED_MARKER); + break; + } + default: /* must be DNL, DHP, EXP, APPn, JPGn, COM, or RESn or APP0 */ + { + skip_variable_marker(); + break; + } + } + } + } + + // Finds the start of image (SOI) marker. + void jpeg_decoder::locate_soi_marker() + { + uint lastchar, thischar; + uint bytesleft; + + lastchar = get_bits(8); + + thischar = get_bits(8); + + /* ok if it's a normal JPEG file without a special header */ + + if ((lastchar == 0xFF) && (thischar == M_SOI)) + return; + + bytesleft = 4096; + + for (; ; ) + { + if (--bytesleft == 0) + stop_decoding(JPGD_NOT_JPEG); + + lastchar = thischar; + + thischar = get_bits(8); + + if (lastchar == 0xFF) + { + if (thischar == M_SOI) + break; + else if (thischar == M_EOI) // get_bits will keep returning M_EOI if we read past the end + stop_decoding(JPGD_NOT_JPEG); + } + } + + // Check the next character after marker: if it's not 0xFF, it can't be the start of the next marker, so the file is bad. + thischar = (m_bit_buf >> 24) & 0xFF; + + if (thischar != 0xFF) + stop_decoding(JPGD_NOT_JPEG); + } + + // Find a start of frame (SOF) marker. + void jpeg_decoder::locate_sof_marker() + { + locate_soi_marker(); + + int c = process_markers(); + + switch (c) + { + case M_SOF2: + { + m_progressive_flag = JPGD_TRUE; + read_sof_marker(); + break; + } + case M_SOF0: /* baseline DCT */ + case M_SOF1: /* extended sequential DCT */ + { + read_sof_marker(); + break; + } + case M_SOF9: /* Arithmitic coding */ + { + stop_decoding(JPGD_NO_ARITHMITIC_SUPPORT); + break; + } + default: + { + stop_decoding(JPGD_UNSUPPORTED_MARKER); + break; + } + } + } - while (num_left) - { - get_bits(8); - num_left--; - } -} + // Find a start of scan (SOS) marker. + int jpeg_decoder::locate_sos_marker() + { + int c; -// Read a define restart interval (DRI) marker. -void jpeg_decoder::read_dri_marker() -{ - if (get_bits(16) != 4) - stop_decoding(JPGD_BAD_DRI_LENGTH); + c = process_markers(); - m_restart_interval = get_bits(16); -} + if (c == M_EOI) + return JPGD_FALSE; + else if (c != M_SOS) + stop_decoding(JPGD_UNEXPECTED_MARKER); -// Read a start of scan (SOS) marker. -void jpeg_decoder::read_sos_marker() -{ - uint num_left; - int i, ci, n, c, cc; + read_sos_marker(); - num_left = get_bits(16); + return JPGD_TRUE; + } - n = get_bits(8); - - m_comps_in_scan = n; - - num_left -= 3; - - if ( (num_left != (uint)(n * 2 + 3)) || (n < 1) || (n > JPGD_MAX_COMPS_IN_SCAN) ) - stop_decoding(JPGD_BAD_SOS_LENGTH); - - for (i = 0; i < n; i++) - { - cc = get_bits(8); - c = get_bits(8); - num_left -= 2; - - for (ci = 0; ci < m_comps_in_frame; ci++) - if (cc == m_comp_ident[ci]) - break; - - if (ci >= m_comps_in_frame) - stop_decoding(JPGD_BAD_SOS_COMP_ID); - - m_comp_list[i] = ci; - m_comp_dc_tab[ci] = (c >> 4) & 15; - m_comp_ac_tab[ci] = (c & 15) + (JPGD_MAX_HUFF_TABLES >> 1); - } - - m_spectral_start = get_bits(8); - m_spectral_end = get_bits(8); - m_successive_high = get_bits(4); - m_successive_low = get_bits(4); - - if (!m_progressive_flag) - { - m_spectral_start = 0; - m_spectral_end = 63; - } - - num_left -= 3; - - while (num_left) /* read past whatever is num_left */ - { - get_bits(8); - num_left--; - } -} - -// Finds the next marker. -int jpeg_decoder::next_marker() -{ - uint c, bytes; - - bytes = 0; - - do - { - do - { - bytes++; - c = get_bits(8); - } while (c != 0xFF); - - do - { - c = get_bits(8); - } while (c == 0xFF); - - } while (c == 0); - - // If bytes > 0 here, there where extra bytes before the marker (not good). - - return c; -} - -// Process markers. Returns when an SOFx, SOI, EOI, or SOS marker is -// encountered. -int jpeg_decoder::process_markers() -{ - int c; - - for ( ; ; ) - { - c = next_marker(); - - switch (c) - { - case M_SOF0: - case M_SOF1: - case M_SOF2: - case M_SOF3: - case M_SOF5: - case M_SOF6: - case M_SOF7: -// case M_JPG: - case M_SOF9: - case M_SOF10: - case M_SOF11: - case M_SOF13: - case M_SOF14: - case M_SOF15: - case M_SOI: - case M_EOI: - case M_SOS: - { - return c; - } - case M_DHT: - { - read_dht_marker(); - break; - } - // No arithmitic support - dumb patents! - case M_DAC: - { - stop_decoding(JPGD_NO_ARITHMITIC_SUPPORT); - break; - } - case M_DQT: - { - read_dqt_marker(); - break; - } - case M_DRI: - { - read_dri_marker(); - break; - } - //case M_APP0: /* no need to read the JFIF marker */ - - case M_JPG: - case M_RST0: /* no parameters */ - case M_RST1: - case M_RST2: - case M_RST3: - case M_RST4: - case M_RST5: - case M_RST6: - case M_RST7: - case M_TEM: - { - stop_decoding(JPGD_UNEXPECTED_MARKER); - break; - } - default: /* must be DNL, DHP, EXP, APPn, JPGn, COM, or RESn or APP0 */ - { - skip_variable_marker(); - break; - } - } - } -} - -// Finds the start of image (SOI) marker. -// This code is rather defensive: it only checks the first 512 bytes to avoid -// false positives. -void jpeg_decoder::locate_soi_marker() -{ - uint lastchar, thischar; - uint bytesleft; - - lastchar = get_bits(8); - - thischar = get_bits(8); - - /* ok if it's a normal JPEG file without a special header */ - - if ((lastchar == 0xFF) && (thischar == M_SOI)) - return; - - bytesleft = 4096; //512; - - for ( ; ; ) - { - if (--bytesleft == 0) - stop_decoding(JPGD_NOT_JPEG); - - lastchar = thischar; - - thischar = get_bits(8); - - if (lastchar == 0xFF) - { - if (thischar == M_SOI) - break; - else if (thischar == M_EOI) // get_bits will keep returning M_EOI if we read past the end - stop_decoding(JPGD_NOT_JPEG); - } - } - - // Check the next character after marker: if it's not 0xFF, it can't be the start of the next marker, so the file is bad. - thischar = (m_bit_buf >> 24) & 0xFF; - - if (thischar != 0xFF) - stop_decoding(JPGD_NOT_JPEG); -} - -// Find a start of frame (SOF) marker. -void jpeg_decoder::locate_sof_marker() -{ - locate_soi_marker(); - - int c = process_markers(); - - switch (c) - { - case M_SOF2: - m_progressive_flag = JPGD_TRUE; - case M_SOF0: /* baseline DCT */ - case M_SOF1: /* extended sequential DCT */ - { - read_sof_marker(); - break; - } - case M_SOF9: /* Arithmitic coding */ - { - stop_decoding(JPGD_NO_ARITHMITIC_SUPPORT); - break; - } - default: - { - stop_decoding(JPGD_UNSUPPORTED_MARKER); - break; - } - } -} - -// Find a start of scan (SOS) marker. -int jpeg_decoder::locate_sos_marker() -{ - int c; - - c = process_markers(); - - if (c == M_EOI) - return JPGD_FALSE; - else if (c != M_SOS) - stop_decoding(JPGD_UNEXPECTED_MARKER); - - read_sos_marker(); - - return JPGD_TRUE; -} - -// Reset everything to default/uninitialized state. -void jpeg_decoder::init(jpeg_decoder_stream *pStream) -{ - m_pMem_blocks = NULL; - m_error_code = JPGD_SUCCESS; - m_ready_flag = false; - m_image_x_size = m_image_y_size = 0; - m_pStream = pStream; - m_progressive_flag = JPGD_FALSE; - - memset(m_huff_ac, 0, sizeof(m_huff_ac)); - memset(m_huff_num, 0, sizeof(m_huff_num)); - memset(m_huff_val, 0, sizeof(m_huff_val)); - memset(m_quant, 0, sizeof(m_quant)); - - m_scan_type = 0; - m_comps_in_frame = 0; - - memset(m_comp_h_samp, 0, sizeof(m_comp_h_samp)); - memset(m_comp_v_samp, 0, sizeof(m_comp_v_samp)); - memset(m_comp_quant, 0, sizeof(m_comp_quant)); - memset(m_comp_ident, 0, sizeof(m_comp_ident)); - memset(m_comp_h_blocks, 0, sizeof(m_comp_h_blocks)); - memset(m_comp_v_blocks, 0, sizeof(m_comp_v_blocks)); - - m_comps_in_scan = 0; - memset(m_comp_list, 0, sizeof(m_comp_list)); - memset(m_comp_dc_tab, 0, sizeof(m_comp_dc_tab)); - memset(m_comp_ac_tab, 0, sizeof(m_comp_ac_tab)); - - m_spectral_start = 0; - m_spectral_end = 0; - m_successive_low = 0; - m_successive_high = 0; - m_max_mcu_x_size = 0; - m_max_mcu_y_size = 0; - m_blocks_per_mcu = 0; - m_max_blocks_per_row = 0; - m_mcus_per_row = 0; - m_mcus_per_col = 0; - m_expanded_blocks_per_component = 0; - m_expanded_blocks_per_mcu = 0; - m_expanded_blocks_per_row = 0; - m_freq_domain_chroma_upsample = false; - - memset(m_mcu_org, 0, sizeof(m_mcu_org)); - - m_total_lines_left = 0; - m_mcu_lines_left = 0; - m_real_dest_bytes_per_scan_line = 0; - m_dest_bytes_per_scan_line = 0; - m_dest_bytes_per_pixel = 0; - - memset(m_pHuff_tabs, 0, sizeof(m_pHuff_tabs)); - - memset(m_dc_coeffs, 0, sizeof(m_dc_coeffs)); - memset(m_ac_coeffs, 0, sizeof(m_ac_coeffs)); - memset(m_block_y_mcu, 0, sizeof(m_block_y_mcu)); - - m_eob_run = 0; - - memset(m_block_y_mcu, 0, sizeof(m_block_y_mcu)); - - m_pIn_buf_ofs = m_in_buf; - m_in_buf_left = 0; - m_eof_flag = false; - m_tem_flag = 0; - - memset(m_in_buf_pad_start, 0, sizeof(m_in_buf_pad_start)); - memset(m_in_buf, 0, sizeof(m_in_buf)); - memset(m_in_buf_pad_end, 0, sizeof(m_in_buf_pad_end)); - - m_restart_interval = 0; - m_restarts_left = 0; - m_next_restart_num = 0; - - m_max_mcus_per_row = 0; - m_max_blocks_per_mcu = 0; - m_max_mcus_per_col = 0; - - memset(m_last_dc_val, 0, sizeof(m_last_dc_val)); - m_pMCU_coefficients = NULL; - m_pSample_buf = NULL; - - m_total_bytes_read = 0; - - m_pScan_line_0 = NULL; - m_pScan_line_1 = NULL; - - // Ready the input buffer. - prep_in_buffer(); - - // Prime the bit buffer. - m_bits_left = 16; - m_bit_buf = 0; - - get_bits(16); - get_bits(16); - - for (int i = 0; i < JPGD_MAX_BLOCKS_PER_MCU; i++) - m_mcu_block_max_zag[i] = 64; -} + // Reset everything to default/uninitialized state. + void jpeg_decoder::init(jpeg_decoder_stream* pStream, uint32_t flags) + { + m_flags = flags; + m_pMem_blocks = nullptr; + m_error_code = JPGD_SUCCESS; + m_ready_flag = false; + m_image_x_size = m_image_y_size = 0; + m_pStream = pStream; + m_progressive_flag = JPGD_FALSE; + + memset(m_huff_ac, 0, sizeof(m_huff_ac)); + memset(m_huff_num, 0, sizeof(m_huff_num)); + memset(m_huff_val, 0, sizeof(m_huff_val)); + memset(m_quant, 0, sizeof(m_quant)); + + m_scan_type = 0; + m_comps_in_frame = 0; + + memset(m_comp_h_samp, 0, sizeof(m_comp_h_samp)); + memset(m_comp_v_samp, 0, sizeof(m_comp_v_samp)); + memset(m_comp_quant, 0, sizeof(m_comp_quant)); + memset(m_comp_ident, 0, sizeof(m_comp_ident)); + memset(m_comp_h_blocks, 0, sizeof(m_comp_h_blocks)); + memset(m_comp_v_blocks, 0, sizeof(m_comp_v_blocks)); + + m_comps_in_scan = 0; + memset(m_comp_list, 0, sizeof(m_comp_list)); + memset(m_comp_dc_tab, 0, sizeof(m_comp_dc_tab)); + memset(m_comp_ac_tab, 0, sizeof(m_comp_ac_tab)); + + m_spectral_start = 0; + m_spectral_end = 0; + m_successive_low = 0; + m_successive_high = 0; + m_max_mcu_x_size = 0; + m_max_mcu_y_size = 0; + m_blocks_per_mcu = 0; + m_max_blocks_per_row = 0; + m_mcus_per_row = 0; + m_mcus_per_col = 0; + + memset(m_mcu_org, 0, sizeof(m_mcu_org)); + + m_total_lines_left = 0; + m_mcu_lines_left = 0; + m_num_buffered_scanlines = 0; + m_real_dest_bytes_per_scan_line = 0; + m_dest_bytes_per_scan_line = 0; + m_dest_bytes_per_pixel = 0; + + memset(m_pHuff_tabs, 0, sizeof(m_pHuff_tabs)); + + memset(m_dc_coeffs, 0, sizeof(m_dc_coeffs)); + memset(m_ac_coeffs, 0, sizeof(m_ac_coeffs)); + memset(m_block_y_mcu, 0, sizeof(m_block_y_mcu)); + + m_eob_run = 0; + + m_pIn_buf_ofs = m_in_buf; + m_in_buf_left = 0; + m_eof_flag = false; + m_tem_flag = 0; + + memset(m_in_buf_pad_start, 0, sizeof(m_in_buf_pad_start)); + memset(m_in_buf, 0, sizeof(m_in_buf)); + memset(m_in_buf_pad_end, 0, sizeof(m_in_buf_pad_end)); + + m_restart_interval = 0; + m_restarts_left = 0; + m_next_restart_num = 0; + + m_max_mcus_per_row = 0; + m_max_blocks_per_mcu = 0; + m_max_mcus_per_col = 0; + + memset(m_last_dc_val, 0, sizeof(m_last_dc_val)); + m_pMCU_coefficients = nullptr; + m_pSample_buf = nullptr; + m_pSample_buf_prev = nullptr; + m_sample_buf_prev_valid = false; + + m_total_bytes_read = 0; + + m_pScan_line_0 = nullptr; + m_pScan_line_1 = nullptr; + + // Ready the input buffer. + prep_in_buffer(); + + // Prime the bit buffer. + m_bits_left = 16; + m_bit_buf = 0; + + get_bits(16); + get_bits(16); + + for (int i = 0; i < JPGD_MAX_BLOCKS_PER_MCU; i++) + m_mcu_block_max_zag[i] = 64; + + m_has_sse2 = false; + +#if JPGD_USE_SSE2 +#ifdef _MSC_VER + int cpu_info[4]; + __cpuid(cpu_info, 1); + const int cpu_info3 = cpu_info[3]; + m_has_sse2 = ((cpu_info3 >> 26U) & 1U) != 0U; +#else + m_has_sse2 = true; +#endif +#endif + } #define SCALEBITS 16 #define ONE_HALF ((int) 1 << (SCALEBITS-1)) #define FIX(x) ((int) ((x) * (1L<<SCALEBITS) + 0.5f)) -// Create a few tables that allow us to quickly convert YCbCr to RGB. -void jpeg_decoder::create_look_ups() -{ - for (int i = 0; i <= 255; i++) - { - int k = i - 128; - m_crr[i] = ( FIX(1.40200f) * k + ONE_HALF) >> SCALEBITS; - m_cbb[i] = ( FIX(1.77200f) * k + ONE_HALF) >> SCALEBITS; - m_crg[i] = (-FIX(0.71414f)) * k; - m_cbg[i] = (-FIX(0.34414f)) * k + ONE_HALF; - } -} - -// This method throws back into the stream any bytes that where read -// into the bit buffer during initial marker scanning. -void jpeg_decoder::fix_in_buffer() -{ - // In case any 0xFF's where pulled into the buffer during marker scanning. - JPGD_ASSERT((m_bits_left & 7) == 0); - - if (m_bits_left == 16) - stuff_char( (uint8)(m_bit_buf & 0xFF)); - - if (m_bits_left >= 8) - stuff_char( (uint8)((m_bit_buf >> 8) & 0xFF)); - - stuff_char((uint8)((m_bit_buf >> 16) & 0xFF)); - stuff_char((uint8)((m_bit_buf >> 24) & 0xFF)); - - m_bits_left = 16; - get_bits_no_markers(16); - get_bits_no_markers(16); -} - -void jpeg_decoder::transform_mcu(int mcu_row) -{ - jpgd_block_t* pSrc_ptr = m_pMCU_coefficients; - if (m_freq_domain_chroma_upsample) { - JPGD_ASSERT(mcu_row * m_blocks_per_mcu < m_expanded_blocks_per_row); - } - else { - JPGD_ASSERT(mcu_row * m_blocks_per_mcu < m_max_blocks_per_row); - } - uint8* pDst_ptr = m_pSample_buf + mcu_row * m_blocks_per_mcu * 64; - - for (int mcu_block = 0; mcu_block < m_blocks_per_mcu; mcu_block++) - { - idct(pSrc_ptr, pDst_ptr, m_mcu_block_max_zag[mcu_block]); - pSrc_ptr += 64; - pDst_ptr += 64; - } -} - -static const uint8 s_max_rc[64] = -{ - 17, 18, 34, 50, 50, 51, 52, 52, 52, 68, 84, 84, 84, 84, 85, 86, 86, 86, 86, 86, - 102, 118, 118, 118, 118, 118, 118, 119, 120, 120, 120, 120, 120, 120, 120, 136, - 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, - 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136 -}; - -void jpeg_decoder::transform_mcu_expand(int mcu_row) -{ - jpgd_block_t* pSrc_ptr = m_pMCU_coefficients; - uint8* pDst_ptr = m_pSample_buf + mcu_row * m_expanded_blocks_per_mcu * 64; - - // Y IDCT - int mcu_block; - for (mcu_block = 0; mcu_block < m_expanded_blocks_per_component; mcu_block++) - { - idct(pSrc_ptr, pDst_ptr, m_mcu_block_max_zag[mcu_block]); - pSrc_ptr += 64; - pDst_ptr += 64; - } - - // Chroma IDCT, with upsampling - jpgd_block_t temp_block[64]; - - for (int i = 0; i < 2; i++) - { - DCT_Upsample::Matrix44 P, Q, R, S; - - JPGD_ASSERT(m_mcu_block_max_zag[mcu_block] >= 1); - JPGD_ASSERT(m_mcu_block_max_zag[mcu_block] <= 64); - - int max_zag = m_mcu_block_max_zag[mcu_block++] - 1; - if (max_zag <= 0) max_zag = 0; // should never happen, only here to shut up static analysis - switch (s_max_rc[max_zag]) - { - case 1*16+1: - DCT_Upsample::P_Q<1, 1>::calc(P, Q, pSrc_ptr); - DCT_Upsample::R_S<1, 1>::calc(R, S, pSrc_ptr); - break; - case 1*16+2: - DCT_Upsample::P_Q<1, 2>::calc(P, Q, pSrc_ptr); - DCT_Upsample::R_S<1, 2>::calc(R, S, pSrc_ptr); - break; - case 2*16+2: - DCT_Upsample::P_Q<2, 2>::calc(P, Q, pSrc_ptr); - DCT_Upsample::R_S<2, 2>::calc(R, S, pSrc_ptr); - break; - case 3*16+2: - DCT_Upsample::P_Q<3, 2>::calc(P, Q, pSrc_ptr); - DCT_Upsample::R_S<3, 2>::calc(R, S, pSrc_ptr); - break; - case 3*16+3: - DCT_Upsample::P_Q<3, 3>::calc(P, Q, pSrc_ptr); - DCT_Upsample::R_S<3, 3>::calc(R, S, pSrc_ptr); - break; - case 3*16+4: - DCT_Upsample::P_Q<3, 4>::calc(P, Q, pSrc_ptr); - DCT_Upsample::R_S<3, 4>::calc(R, S, pSrc_ptr); - break; - case 4*16+4: - DCT_Upsample::P_Q<4, 4>::calc(P, Q, pSrc_ptr); - DCT_Upsample::R_S<4, 4>::calc(R, S, pSrc_ptr); - break; - case 5*16+4: - DCT_Upsample::P_Q<5, 4>::calc(P, Q, pSrc_ptr); - DCT_Upsample::R_S<5, 4>::calc(R, S, pSrc_ptr); - break; - case 5*16+5: - DCT_Upsample::P_Q<5, 5>::calc(P, Q, pSrc_ptr); - DCT_Upsample::R_S<5, 5>::calc(R, S, pSrc_ptr); - break; - case 5*16+6: - DCT_Upsample::P_Q<5, 6>::calc(P, Q, pSrc_ptr); - DCT_Upsample::R_S<5, 6>::calc(R, S, pSrc_ptr); - break; - case 6*16+6: - DCT_Upsample::P_Q<6, 6>::calc(P, Q, pSrc_ptr); - DCT_Upsample::R_S<6, 6>::calc(R, S, pSrc_ptr); - break; - case 7*16+6: - DCT_Upsample::P_Q<7, 6>::calc(P, Q, pSrc_ptr); - DCT_Upsample::R_S<7, 6>::calc(R, S, pSrc_ptr); - break; - case 7*16+7: - DCT_Upsample::P_Q<7, 7>::calc(P, Q, pSrc_ptr); - DCT_Upsample::R_S<7, 7>::calc(R, S, pSrc_ptr); - break; - case 7*16+8: - DCT_Upsample::P_Q<7, 8>::calc(P, Q, pSrc_ptr); - DCT_Upsample::R_S<7, 8>::calc(R, S, pSrc_ptr); - break; - case 8*16+8: - DCT_Upsample::P_Q<8, 8>::calc(P, Q, pSrc_ptr); - DCT_Upsample::R_S<8, 8>::calc(R, S, pSrc_ptr); - break; - default: - JPGD_ASSERT(false); - } - - DCT_Upsample::Matrix44 a(P + Q); P -= Q; - DCT_Upsample::Matrix44& b = P; - DCT_Upsample::Matrix44 c(R + S); R -= S; - DCT_Upsample::Matrix44& d = R; - - DCT_Upsample::Matrix44::add_and_store(temp_block, a, c); - idct_4x4(temp_block, pDst_ptr); - pDst_ptr += 64; - - DCT_Upsample::Matrix44::sub_and_store(temp_block, a, c); - idct_4x4(temp_block, pDst_ptr); - pDst_ptr += 64; - - DCT_Upsample::Matrix44::add_and_store(temp_block, b, d); - idct_4x4(temp_block, pDst_ptr); - pDst_ptr += 64; - - DCT_Upsample::Matrix44::sub_and_store(temp_block, b, d); - idct_4x4(temp_block, pDst_ptr); - pDst_ptr += 64; - - pSrc_ptr += 64; - } -} - -// Loads and dequantizes the next row of (already decoded) coefficients. -// Progressive images only. -void jpeg_decoder::load_next_row() -{ - int i; - jpgd_block_t *p; - jpgd_quant_t *q; - int mcu_row, mcu_block, row_block = 0; - int component_num, component_id; - int block_x_mcu[JPGD_MAX_COMPONENTS]; - - memset(block_x_mcu, 0, JPGD_MAX_COMPONENTS * sizeof(int)); - - for (mcu_row = 0; mcu_row < m_mcus_per_row; mcu_row++) - { - int block_x_mcu_ofs = 0, block_y_mcu_ofs = 0; - - for (mcu_block = 0; mcu_block < m_blocks_per_mcu; mcu_block++) - { - component_id = m_mcu_org[mcu_block]; - JPGD_ASSERT(m_comp_quant[component_id] < JPGD_MAX_QUANT_TABLES); - q = m_quant[m_comp_quant[component_id]]; - - p = m_pMCU_coefficients + 64 * mcu_block; - - jpgd_block_t* pAC = coeff_buf_getp(m_ac_coeffs[component_id], block_x_mcu[component_id] + block_x_mcu_ofs, m_block_y_mcu[component_id] + block_y_mcu_ofs); - jpgd_block_t* pDC = coeff_buf_getp(m_dc_coeffs[component_id], block_x_mcu[component_id] + block_x_mcu_ofs, m_block_y_mcu[component_id] + block_y_mcu_ofs); - p[0] = pDC[0]; - memcpy(&p[1], &pAC[1], 63 * sizeof(jpgd_block_t)); - - for (i = 63; i > 0; i--) - if (p[g_ZAG[i]]) - break; - - m_mcu_block_max_zag[mcu_block] = i + 1; - - for ( ; i >= 0; i--) - if (p[g_ZAG[i]]) - p[g_ZAG[i]] = static_cast<jpgd_block_t>(p[g_ZAG[i]] * q[i]); - - row_block++; - - if (m_comps_in_scan == 1) - block_x_mcu[component_id]++; - else - { - if (++block_x_mcu_ofs == m_comp_h_samp[component_id]) - { - block_x_mcu_ofs = 0; - - if (++block_y_mcu_ofs == m_comp_v_samp[component_id]) - { - block_y_mcu_ofs = 0; - - block_x_mcu[component_id] += m_comp_h_samp[component_id]; - } - } - } - } - - if (m_freq_domain_chroma_upsample) - transform_mcu_expand(mcu_row); - else - transform_mcu(mcu_row); - } - - if (m_comps_in_scan == 1) - m_block_y_mcu[m_comp_list[0]]++; - else - { - for (component_num = 0; component_num < m_comps_in_scan; component_num++) - { - component_id = m_comp_list[component_num]; - - m_block_y_mcu[component_id] += m_comp_v_samp[component_id]; - } - } -} - -// Restart interval processing. -void jpeg_decoder::process_restart() -{ - int i; - int c = 0; - - // Align to a byte boundry - // FIXME: Is this really necessary? get_bits_no_markers() never reads in markers! - //get_bits_no_markers(m_bits_left & 7); - - // Let's scan a little bit to find the marker, but not _too_ far. - // 1536 is a "fudge factor" that determines how much to scan. - for (i = 1536; i > 0; i--) - if (get_char() == 0xFF) - break; - - if (i == 0) - stop_decoding(JPGD_BAD_RESTART_MARKER); - - for ( ; i > 0; i--) - if ((c = get_char()) != 0xFF) - break; - - if (i == 0) - stop_decoding(JPGD_BAD_RESTART_MARKER); - - // Is it the expected marker? If not, something bad happened. - if (c != (m_next_restart_num + M_RST0)) - stop_decoding(JPGD_BAD_RESTART_MARKER); - - // Reset each component's DC prediction values. - memset(&m_last_dc_val, 0, m_comps_in_frame * sizeof(uint)); - - m_eob_run = 0; - - m_restarts_left = m_restart_interval; - - m_next_restart_num = (m_next_restart_num + 1) & 7; - - // Get the bit buffer going again... - - m_bits_left = 16; - get_bits_no_markers(16); - get_bits_no_markers(16); -} - -static inline int dequantize_ac(int c, int q) { c *= q; return c; } - -// Decodes and dequantizes the next row of coefficients. -void jpeg_decoder::decode_next_row() -{ - int row_block = 0; - - for (int mcu_row = 0; mcu_row < m_mcus_per_row; mcu_row++) - { - if ((m_restart_interval) && (m_restarts_left == 0)) - process_restart(); - - jpgd_block_t* p = m_pMCU_coefficients; - for (int mcu_block = 0; mcu_block < m_blocks_per_mcu; mcu_block++, p += 64) - { - int component_id = m_mcu_org[mcu_block]; - JPGD_ASSERT(m_comp_quant[component_id] < JPGD_MAX_QUANT_TABLES); - jpgd_quant_t* q = m_quant[m_comp_quant[component_id]]; - - int r, s; - s = huff_decode(m_pHuff_tabs[m_comp_dc_tab[component_id]], r); - s = JPGD_HUFF_EXTEND(r, s); - - m_last_dc_val[component_id] = (s += m_last_dc_val[component_id]); - - p[0] = static_cast<jpgd_block_t>(s * q[0]); - - int prev_num_set = m_mcu_block_max_zag[mcu_block]; - - huff_tables *pH = m_pHuff_tabs[m_comp_ac_tab[component_id]]; - - int k; - for (k = 1; k < 64; k++) - { - int extra_bits; - s = huff_decode(pH, extra_bits); - - r = s >> 4; - s &= 15; - - if (s) - { - if (r) - { - if ((k + r) > 63) - stop_decoding(JPGD_DECODE_ERROR); - - if (k < prev_num_set) - { - int n = JPGD_MIN(r, prev_num_set - k); - int kt = k; - while (n--) - p[g_ZAG[kt++]] = 0; - } - - k += r; - } - - s = JPGD_HUFF_EXTEND(extra_bits, s); - - JPGD_ASSERT(k < 64); - - p[g_ZAG[k]] = static_cast<jpgd_block_t>(dequantize_ac(s, q[k])); //s * q[k]; - } - else - { - if (r == 15) - { - if ((k + 16) > 64) - stop_decoding(JPGD_DECODE_ERROR); - - if (k < prev_num_set) - { - int n = JPGD_MIN(16, prev_num_set - k); - int kt = k; - while (n--) - { - JPGD_ASSERT(kt <= 63); - p[g_ZAG[kt++]] = 0; - } - } - - k += 16 - 1; // - 1 because the loop counter is k - JPGD_ASSERT(p[g_ZAG[k]] == 0); - } - else - break; - } - } - - if (k < prev_num_set) - { - int kt = k; - while (kt < prev_num_set) - p[g_ZAG[kt++]] = 0; - } - - m_mcu_block_max_zag[mcu_block] = k; - - row_block++; - } - - if (m_freq_domain_chroma_upsample) - transform_mcu_expand(mcu_row); - else - transform_mcu(mcu_row); - - m_restarts_left--; - } -} - -// YCbCr H1V1 (1x1:1:1, 3 m_blocks per MCU) to RGB -void jpeg_decoder::H1V1Convert() -{ - int row = m_max_mcu_y_size - m_mcu_lines_left; - uint8 *d = m_pScan_line_0; - uint8 *s = m_pSample_buf + row * 8; - - for (int i = m_max_mcus_per_row; i > 0; i--) - { - for (int j = 0; j < 8; j++) - { - int y = s[j]; - int cb = s[64+j]; - int cr = s[128+j]; - - d[0] = clamp(y + m_crr[cr]); - d[1] = clamp(y + ((m_crg[cr] + m_cbg[cb]) >> 16)); - d[2] = clamp(y + m_cbb[cb]); - d[3] = 255; - - d += 4; - } - - s += 64*3; - } -} - -// YCbCr H2V1 (2x1:1:1, 4 m_blocks per MCU) to RGB -void jpeg_decoder::H2V1Convert() -{ - int row = m_max_mcu_y_size - m_mcu_lines_left; - uint8 *d0 = m_pScan_line_0; - uint8 *y = m_pSample_buf + row * 8; - uint8 *c = m_pSample_buf + 2*64 + row * 8; - - for (int i = m_max_mcus_per_row; i > 0; i--) - { - for (int l = 0; l < 2; l++) - { - for (int j = 0; j < 4; j++) - { - int cb = c[0]; - int cr = c[64]; - - int rc = m_crr[cr]; - int gc = ((m_crg[cr] + m_cbg[cb]) >> 16); - int bc = m_cbb[cb]; - - int yy = y[j<<1]; - d0[0] = clamp(yy+rc); - d0[1] = clamp(yy+gc); - d0[2] = clamp(yy+bc); - d0[3] = 255; - - yy = y[(j<<1)+1]; - d0[4] = clamp(yy+rc); - d0[5] = clamp(yy+gc); - d0[6] = clamp(yy+bc); - d0[7] = 255; - - d0 += 8; - - c++; - } - y += 64; - } - - y += 64*4 - 64*2; - c += 64*4 - 8; - } -} - -// YCbCr H2V1 (1x2:1:1, 4 m_blocks per MCU) to RGB -void jpeg_decoder::H1V2Convert() -{ - int row = m_max_mcu_y_size - m_mcu_lines_left; - uint8 *d0 = m_pScan_line_0; - uint8 *d1 = m_pScan_line_1; - uint8 *y; - uint8 *c; - - if (row < 8) - y = m_pSample_buf + row * 8; - else - y = m_pSample_buf + 64*1 + (row & 7) * 8; - - c = m_pSample_buf + 64*2 + (row >> 1) * 8; - - for (int i = m_max_mcus_per_row; i > 0; i--) - { - for (int j = 0; j < 8; j++) - { - int cb = c[0+j]; - int cr = c[64+j]; - - int rc = m_crr[cr]; - int gc = ((m_crg[cr] + m_cbg[cb]) >> 16); - int bc = m_cbb[cb]; - - int yy = y[j]; - d0[0] = clamp(yy+rc); - d0[1] = clamp(yy+gc); - d0[2] = clamp(yy+bc); - d0[3] = 255; - - yy = y[8+j]; - d1[0] = clamp(yy+rc); - d1[1] = clamp(yy+gc); - d1[2] = clamp(yy+bc); - d1[3] = 255; - - d0 += 4; - d1 += 4; - } - - y += 64*4; - c += 64*4; - } -} - -// YCbCr H2V2 (2x2:1:1, 6 m_blocks per MCU) to RGB -void jpeg_decoder::H2V2Convert() -{ - int row = m_max_mcu_y_size - m_mcu_lines_left; - uint8 *d0 = m_pScan_line_0; - uint8 *d1 = m_pScan_line_1; - uint8 *y; - uint8 *c; - - if (row < 8) - y = m_pSample_buf + row * 8; - else - y = m_pSample_buf + 64*2 + (row & 7) * 8; - - c = m_pSample_buf + 64*4 + (row >> 1) * 8; - - for (int i = m_max_mcus_per_row; i > 0; i--) - { - for (int l = 0; l < 2; l++) - { - for (int j = 0; j < 8; j += 2) - { - int cb = c[0]; - int cr = c[64]; + // Create a few tables that allow us to quickly convert YCbCr to RGB. + void jpeg_decoder::create_look_ups() + { + for (int i = 0; i <= 255; i++) + { + int k = i - 128; + m_crr[i] = (FIX(1.40200f) * k + ONE_HALF) >> SCALEBITS; + m_cbb[i] = (FIX(1.77200f) * k + ONE_HALF) >> SCALEBITS; + m_crg[i] = (-FIX(0.71414f)) * k; + m_cbg[i] = (-FIX(0.34414f)) * k + ONE_HALF; + } + } + + // This method throws back into the stream any bytes that where read + // into the bit buffer during initial marker scanning. + void jpeg_decoder::fix_in_buffer() + { + // In case any 0xFF's where pulled into the buffer during marker scanning. + assert((m_bits_left & 7) == 0); + + if (m_bits_left == 16) + stuff_char((uint8)(m_bit_buf & 0xFF)); + + if (m_bits_left >= 8) + stuff_char((uint8)((m_bit_buf >> 8) & 0xFF)); + + stuff_char((uint8)((m_bit_buf >> 16) & 0xFF)); + stuff_char((uint8)((m_bit_buf >> 24) & 0xFF)); + + m_bits_left = 16; + get_bits_no_markers(16); + get_bits_no_markers(16); + } + + void jpeg_decoder::transform_mcu(int mcu_row) + { + jpgd_block_coeff_t* pSrc_ptr = m_pMCU_coefficients; + if (mcu_row * m_blocks_per_mcu >= m_max_blocks_per_row) + stop_decoding(JPGD_DECODE_ERROR); + + uint8* pDst_ptr = m_pSample_buf + mcu_row * m_blocks_per_mcu * 64; + + for (int mcu_block = 0; mcu_block < m_blocks_per_mcu; mcu_block++) + { + idct(pSrc_ptr, pDst_ptr, m_mcu_block_max_zag[mcu_block], ((m_flags & cFlagDisableSIMD) == 0) && m_has_sse2); + pSrc_ptr += 64; + pDst_ptr += 64; + } + } + + // Loads and dequantizes the next row of (already decoded) coefficients. + // Progressive images only. + void jpeg_decoder::load_next_row() + { + int i; + jpgd_block_coeff_t* p; + jpgd_quant_t* q; + int mcu_row, mcu_block, row_block = 0; + int component_num, component_id; + int block_x_mcu[JPGD_MAX_COMPONENTS]; + + memset(block_x_mcu, 0, JPGD_MAX_COMPONENTS * sizeof(int)); + + for (mcu_row = 0; mcu_row < m_mcus_per_row; mcu_row++) + { + int block_x_mcu_ofs = 0, block_y_mcu_ofs = 0; + + for (mcu_block = 0; mcu_block < m_blocks_per_mcu; mcu_block++) + { + component_id = m_mcu_org[mcu_block]; + if (m_comp_quant[component_id] >= JPGD_MAX_QUANT_TABLES) + stop_decoding(JPGD_DECODE_ERROR); + + q = m_quant[m_comp_quant[component_id]]; + + p = m_pMCU_coefficients + 64 * mcu_block; + + jpgd_block_coeff_t* pAC = coeff_buf_getp(m_ac_coeffs[component_id], block_x_mcu[component_id] + block_x_mcu_ofs, m_block_y_mcu[component_id] + block_y_mcu_ofs); + jpgd_block_coeff_t* pDC = coeff_buf_getp(m_dc_coeffs[component_id], block_x_mcu[component_id] + block_x_mcu_ofs, m_block_y_mcu[component_id] + block_y_mcu_ofs); + p[0] = pDC[0]; + memcpy(&p[1], &pAC[1], 63 * sizeof(jpgd_block_coeff_t)); + + for (i = 63; i > 0; i--) + if (p[g_ZAG[i]]) + break; + + m_mcu_block_max_zag[mcu_block] = i + 1; + + for (; i >= 0; i--) + if (p[g_ZAG[i]]) + p[g_ZAG[i]] = static_cast<jpgd_block_coeff_t>(p[g_ZAG[i]] * q[i]); + + row_block++; + + if (m_comps_in_scan == 1) + block_x_mcu[component_id]++; + else + { + if (++block_x_mcu_ofs == m_comp_h_samp[component_id]) + { + block_x_mcu_ofs = 0; + + if (++block_y_mcu_ofs == m_comp_v_samp[component_id]) + { + block_y_mcu_ofs = 0; + + block_x_mcu[component_id] += m_comp_h_samp[component_id]; + } + } + } + } + + transform_mcu(mcu_row); + } + + if (m_comps_in_scan == 1) + m_block_y_mcu[m_comp_list[0]]++; + else + { + for (component_num = 0; component_num < m_comps_in_scan; component_num++) + { + component_id = m_comp_list[component_num]; + + m_block_y_mcu[component_id] += m_comp_v_samp[component_id]; + } + } + } + + // Restart interval processing. + void jpeg_decoder::process_restart() + { + int i; + int c = 0; + + // Align to a byte boundry + // FIXME: Is this really necessary? get_bits_no_markers() never reads in markers! + //get_bits_no_markers(m_bits_left & 7); + + // Let's scan a little bit to find the marker, but not _too_ far. + // 1536 is a "fudge factor" that determines how much to scan. + for (i = 1536; i > 0; i--) + if (get_char() == 0xFF) + break; + + if (i == 0) + stop_decoding(JPGD_BAD_RESTART_MARKER); + + for (; i > 0; i--) + if ((c = get_char()) != 0xFF) + break; + + if (i == 0) + stop_decoding(JPGD_BAD_RESTART_MARKER); + + // Is it the expected marker? If not, something bad happened. + if (c != (m_next_restart_num + M_RST0)) + stop_decoding(JPGD_BAD_RESTART_MARKER); + + // Reset each component's DC prediction values. + memset(&m_last_dc_val, 0, m_comps_in_frame * sizeof(uint)); + + m_eob_run = 0; + + m_restarts_left = m_restart_interval; + + m_next_restart_num = (m_next_restart_num + 1) & 7; + + // Get the bit buffer going again... + + m_bits_left = 16; + get_bits_no_markers(16); + get_bits_no_markers(16); + } + + static inline int dequantize_ac(int c, int q) { c *= q; return c; } + + // Decodes and dequantizes the next row of coefficients. + void jpeg_decoder::decode_next_row() + { + int row_block = 0; + + for (int mcu_row = 0; mcu_row < m_mcus_per_row; mcu_row++) + { + if ((m_restart_interval) && (m_restarts_left == 0)) + process_restart(); + + jpgd_block_coeff_t* p = m_pMCU_coefficients; + for (int mcu_block = 0; mcu_block < m_blocks_per_mcu; mcu_block++, p += 64) + { + int component_id = m_mcu_org[mcu_block]; + if (m_comp_quant[component_id] >= JPGD_MAX_QUANT_TABLES) + stop_decoding(JPGD_DECODE_ERROR); + + jpgd_quant_t* q = m_quant[m_comp_quant[component_id]]; + + int r, s; + s = huff_decode(m_pHuff_tabs[m_comp_dc_tab[component_id]], r); + if (s >= 16) + stop_decoding(JPGD_DECODE_ERROR); + + s = JPGD_HUFF_EXTEND(r, s); + + m_last_dc_val[component_id] = (s += m_last_dc_val[component_id]); + + p[0] = static_cast<jpgd_block_coeff_t>(s * q[0]); + + int prev_num_set = m_mcu_block_max_zag[mcu_block]; + + huff_tables* pH = m_pHuff_tabs[m_comp_ac_tab[component_id]]; + + int k; + for (k = 1; k < 64; k++) + { + int extra_bits; + s = huff_decode(pH, extra_bits); + + r = s >> 4; + s &= 15; + + if (s) + { + if (r) + { + if ((k + r) > 63) + stop_decoding(JPGD_DECODE_ERROR); + + if (k < prev_num_set) + { + int n = JPGD_MIN(r, prev_num_set - k); + int kt = k; + while (n--) + p[g_ZAG[kt++]] = 0; + } + + k += r; + } + + s = JPGD_HUFF_EXTEND(extra_bits, s); + + if (k >= 64) + stop_decoding(JPGD_DECODE_ERROR); + + p[g_ZAG[k]] = static_cast<jpgd_block_coeff_t>(dequantize_ac(s, q[k])); //s * q[k]; + } + else + { + if (r == 15) + { + if ((k + 16) > 64) + stop_decoding(JPGD_DECODE_ERROR); + + if (k < prev_num_set) + { + int n = JPGD_MIN(16, prev_num_set - k); + int kt = k; + while (n--) + { + if (kt > 63) + stop_decoding(JPGD_DECODE_ERROR); + p[g_ZAG[kt++]] = 0; + } + } + + k += 16 - 1; // - 1 because the loop counter is k + + if (p[g_ZAG[k & 63]] != 0) + stop_decoding(JPGD_DECODE_ERROR); + } + else + break; + } + } + + if (k < prev_num_set) + { + int kt = k; + while (kt < prev_num_set) + p[g_ZAG[kt++]] = 0; + } + + m_mcu_block_max_zag[mcu_block] = k; + + row_block++; + } + + transform_mcu(mcu_row); + + m_restarts_left--; + } + } + + // YCbCr H1V1 (1x1:1:1, 3 m_blocks per MCU) to RGB + void jpeg_decoder::H1V1Convert() + { + int row = m_max_mcu_y_size - m_mcu_lines_left; + uint8* d = m_pScan_line_0; + uint8* s = m_pSample_buf + row * 8; + + for (int i = m_max_mcus_per_row; i > 0; i--) + { + for (int j = 0; j < 8; j++) + { + int y = s[j]; + int cb = s[64 + j]; + int cr = s[128 + j]; + + d[0] = clamp(y + m_crr[cr]); + d[1] = clamp(y + ((m_crg[cr] + m_cbg[cb]) >> 16)); + d[2] = clamp(y + m_cbb[cb]); + d[3] = 255; + + d += 4; + } + + s += 64 * 3; + } + } + + // YCbCr H2V1 (2x1:1:1, 4 m_blocks per MCU) to RGB + void jpeg_decoder::H2V1Convert() + { + int row = m_max_mcu_y_size - m_mcu_lines_left; + uint8* d0 = m_pScan_line_0; + uint8* y = m_pSample_buf + row * 8; + uint8* c = m_pSample_buf + 2 * 64 + row * 8; + + for (int i = m_max_mcus_per_row; i > 0; i--) + { + for (int l = 0; l < 2; l++) + { + for (int j = 0; j < 4; j++) + { + int cb = c[0]; + int cr = c[64]; + + int rc = m_crr[cr]; + int gc = ((m_crg[cr] + m_cbg[cb]) >> 16); + int bc = m_cbb[cb]; + + int yy = y[j << 1]; + d0[0] = clamp(yy + rc); + d0[1] = clamp(yy + gc); + d0[2] = clamp(yy + bc); + d0[3] = 255; + + yy = y[(j << 1) + 1]; + d0[4] = clamp(yy + rc); + d0[5] = clamp(yy + gc); + d0[6] = clamp(yy + bc); + d0[7] = 255; + + d0 += 8; + + c++; + } + y += 64; + } + + y += 64 * 4 - 64 * 2; + c += 64 * 4 - 8; + } + } + + // YCbCr H2V1 (2x1:1:1, 4 m_blocks per MCU) to RGB + void jpeg_decoder::H2V1ConvertFiltered() + { + const uint BLOCKS_PER_MCU = 4; + int row = m_max_mcu_y_size - m_mcu_lines_left; + uint8* d0 = m_pScan_line_0; + + const int half_image_x_size = (m_image_x_size >> 1) - 1; + const int row_x8 = row * 8; + + for (int x = 0; x < m_image_x_size; x++) + { + int y = m_pSample_buf[check_sample_buf_ofs((x >> 4) * BLOCKS_PER_MCU * 64 + ((x & 8) ? 64 : 0) + (x & 7) + row_x8)]; + + int c_x0 = (x - 1) >> 1; + int c_x1 = JPGD_MIN(c_x0 + 1, half_image_x_size); + c_x0 = JPGD_MAX(c_x0, 0); + + int a = (c_x0 >> 3) * BLOCKS_PER_MCU * 64 + (c_x0 & 7) + row_x8 + 128; + int cb0 = m_pSample_buf[check_sample_buf_ofs(a)]; + int cr0 = m_pSample_buf[check_sample_buf_ofs(a + 64)]; + + int b = (c_x1 >> 3) * BLOCKS_PER_MCU * 64 + (c_x1 & 7) + row_x8 + 128; + int cb1 = m_pSample_buf[check_sample_buf_ofs(b)]; + int cr1 = m_pSample_buf[check_sample_buf_ofs(b + 64)]; + + int w0 = (x & 1) ? 3 : 1; + int w1 = (x & 1) ? 1 : 3; + + int cb = (cb0 * w0 + cb1 * w1 + 2) >> 2; + int cr = (cr0 * w0 + cr1 * w1 + 2) >> 2; + + int rc = m_crr[cr]; + int gc = ((m_crg[cr] + m_cbg[cb]) >> 16); + int bc = m_cbb[cb]; + + d0[0] = clamp(y + rc); + d0[1] = clamp(y + gc); + d0[2] = clamp(y + bc); + d0[3] = 255; + + d0 += 4; + } + } + + // YCbCr H2V1 (1x2:1:1, 4 m_blocks per MCU) to RGB + void jpeg_decoder::H1V2Convert() + { + int row = m_max_mcu_y_size - m_mcu_lines_left; + uint8* d0 = m_pScan_line_0; + uint8* d1 = m_pScan_line_1; + uint8* y; + uint8* c; + + if (row < 8) + y = m_pSample_buf + row * 8; + else + y = m_pSample_buf + 64 * 1 + (row & 7) * 8; + + c = m_pSample_buf + 64 * 2 + (row >> 1) * 8; + + for (int i = m_max_mcus_per_row; i > 0; i--) + { + for (int j = 0; j < 8; j++) + { + int cb = c[0 + j]; + int cr = c[64 + j]; int rc = m_crr[cr]; int gc = ((m_crg[cr] + m_cbg[cb]) >> 16); int bc = m_cbb[cb]; int yy = y[j]; - d0[0] = clamp(yy+rc); - d0[1] = clamp(yy+gc); - d0[2] = clamp(yy+bc); + d0[0] = clamp(yy + rc); + d0[1] = clamp(yy + gc); + d0[2] = clamp(yy + bc); d0[3] = 255; - yy = y[j+1]; - d0[4] = clamp(yy+rc); - d0[5] = clamp(yy+gc); - d0[6] = clamp(yy+bc); - d0[7] = 255; - - yy = y[j+8]; - d1[0] = clamp(yy+rc); - d1[1] = clamp(yy+gc); - d1[2] = clamp(yy+bc); + yy = y[8 + j]; + d1[0] = clamp(yy + rc); + d1[1] = clamp(yy + gc); + d1[2] = clamp(yy + bc); d1[3] = 255; - yy = y[j+8+1]; - d1[4] = clamp(yy+rc); - d1[5] = clamp(yy+gc); - d1[6] = clamp(yy+bc); - d1[7] = 255; + d0 += 4; + d1 += 4; + } + + y += 64 * 4; + c += 64 * 4; + } + } + + // YCbCr H2V1 (1x2:1:1, 4 m_blocks per MCU) to RGB + void jpeg_decoder::H1V2ConvertFiltered() + { + const uint BLOCKS_PER_MCU = 4; + int y = m_image_y_size - m_total_lines_left; + int row = y & 15; + + const int half_image_y_size = (m_image_y_size >> 1) - 1; + + uint8* d0 = m_pScan_line_0; + + const int w0 = (row & 1) ? 3 : 1; + const int w1 = (row & 1) ? 1 : 3; + + int c_y0 = (y - 1) >> 1; + int c_y1 = JPGD_MIN(c_y0 + 1, half_image_y_size); + + const uint8_t* p_YSamples = m_pSample_buf; + const uint8_t* p_C0Samples = m_pSample_buf; + if ((c_y0 >= 0) && (((row & 15) == 0) || ((row & 15) == 15)) && (m_total_lines_left > 1)) + { + assert(y > 0); + assert(m_sample_buf_prev_valid); + + if ((row & 15) == 15) + p_YSamples = m_pSample_buf_prev; - d0 += 8; - d1 += 8; + p_C0Samples = m_pSample_buf_prev; + } + + const int y_sample_base_ofs = ((row & 8) ? 64 : 0) + (row & 7) * 8; + const int y0_base = (c_y0 & 7) * 8 + 128; + const int y1_base = (c_y1 & 7) * 8 + 128; + + for (int x = 0; x < m_image_x_size; x++) + { + const int base_ofs = (x >> 3) * BLOCKS_PER_MCU * 64 + (x & 7); + + int y_sample = p_YSamples[check_sample_buf_ofs(base_ofs + y_sample_base_ofs)]; + + int a = base_ofs + y0_base; + int cb0_sample = p_C0Samples[check_sample_buf_ofs(a)]; + int cr0_sample = p_C0Samples[check_sample_buf_ofs(a + 64)]; + + int b = base_ofs + y1_base; + int cb1_sample = m_pSample_buf[check_sample_buf_ofs(b)]; + int cr1_sample = m_pSample_buf[check_sample_buf_ofs(b + 64)]; + + int cb = (cb0_sample * w0 + cb1_sample * w1 + 2) >> 2; + int cr = (cr0_sample * w0 + cr1_sample * w1 + 2) >> 2; + + int rc = m_crr[cr]; + int gc = ((m_crg[cr] + m_cbg[cb]) >> 16); + int bc = m_cbb[cb]; + + d0[0] = clamp(y_sample + rc); + d0[1] = clamp(y_sample + gc); + d0[2] = clamp(y_sample + bc); + d0[3] = 255; + + d0 += 4; + } + } + + // YCbCr H2V2 (2x2:1:1, 6 m_blocks per MCU) to RGB + void jpeg_decoder::H2V2Convert() + { + int row = m_max_mcu_y_size - m_mcu_lines_left; + uint8* d0 = m_pScan_line_0; + uint8* d1 = m_pScan_line_1; + uint8* y; + uint8* c; - c++; + if (row < 8) + y = m_pSample_buf + row * 8; + else + y = m_pSample_buf + 64 * 2 + (row & 7) * 8; + + c = m_pSample_buf + 64 * 4 + (row >> 1) * 8; + + for (int i = m_max_mcus_per_row; i > 0; i--) + { + for (int l = 0; l < 2; l++) + { + for (int j = 0; j < 8; j += 2) + { + int cb = c[0]; + int cr = c[64]; + + int rc = m_crr[cr]; + int gc = ((m_crg[cr] + m_cbg[cb]) >> 16); + int bc = m_cbb[cb]; + + int yy = y[j]; + d0[0] = clamp(yy + rc); + d0[1] = clamp(yy + gc); + d0[2] = clamp(yy + bc); + d0[3] = 255; + + yy = y[j + 1]; + d0[4] = clamp(yy + rc); + d0[5] = clamp(yy + gc); + d0[6] = clamp(yy + bc); + d0[7] = 255; + + yy = y[j + 8]; + d1[0] = clamp(yy + rc); + d1[1] = clamp(yy + gc); + d1[2] = clamp(yy + bc); + d1[3] = 255; + + yy = y[j + 8 + 1]; + d1[4] = clamp(yy + rc); + d1[5] = clamp(yy + gc); + d1[6] = clamp(yy + bc); + d1[7] = 255; + + d0 += 8; + d1 += 8; + + c++; + } + y += 64; } - y += 64; - } - - y += 64*6 - 64*2; - c += 64*6 - 8; - } -} - -// Y (1 block per MCU) to 8-bit grayscale -void jpeg_decoder::gray_convert() -{ - int row = m_max_mcu_y_size - m_mcu_lines_left; - uint8 *d = m_pScan_line_0; - uint8 *s = m_pSample_buf + row * 8; - - for (int i = m_max_mcus_per_row; i > 0; i--) - { - *(uint *)d = *(uint *)s; - *(uint *)(&d[4]) = *(uint *)(&s[4]); - - s += 64; - d += 8; - } -} - -void jpeg_decoder::expanded_convert() -{ - int row = m_max_mcu_y_size - m_mcu_lines_left; - - uint8* Py = m_pSample_buf + (row / 8) * 64 * m_comp_h_samp[0] + (row & 7) * 8; - - uint8* d = m_pScan_line_0; - - for (int i = m_max_mcus_per_row; i > 0; i--) - { - for (int k = 0; k < m_max_mcu_x_size; k += 8) - { - const int Y_ofs = k * 8; - const int Cb_ofs = Y_ofs + 64 * m_expanded_blocks_per_component; - const int Cr_ofs = Y_ofs + 64 * m_expanded_blocks_per_component * 2; - for (int j = 0; j < 8; j++) - { - int y = Py[Y_ofs + j]; - int cb = Py[Cb_ofs + j]; - int cr = Py[Cr_ofs + j]; - - d[0] = clamp(y + m_crr[cr]); - d[1] = clamp(y + ((m_crg[cr] + m_cbg[cb]) >> 16)); - d[2] = clamp(y + m_cbb[cb]); - d[3] = 255; - - d += 4; - } - } - - Py += 64 * m_expanded_blocks_per_mcu; - } -} - -// Find end of image (EOI) marker, so we can return to the user the exact size of the input stream. -void jpeg_decoder::find_eoi() -{ - if (!m_progressive_flag) - { - // Attempt to read the EOI marker. - //get_bits_no_markers(m_bits_left & 7); - - // Prime the bit buffer - m_bits_left = 16; - get_bits(16); - get_bits(16); - - // The next marker _should_ be EOI - process_markers(); - } - - m_total_bytes_read -= m_in_buf_left; -} - -int jpeg_decoder::decode(const void** pScan_line, uint* pScan_line_len) -{ - if ((m_error_code) || (!m_ready_flag)) - return JPGD_FAILED; - - if (m_total_lines_left == 0) - return JPGD_DONE; - - if (m_mcu_lines_left == 0) - { - if (setjmp(m_jmp_state)) - return JPGD_FAILED; - - if (m_progressive_flag) - load_next_row(); - else - decode_next_row(); - - // Find the EOI marker if that was the last row. - if (m_total_lines_left <= m_max_mcu_y_size) - find_eoi(); - - m_mcu_lines_left = m_max_mcu_y_size; - } - - if (m_freq_domain_chroma_upsample) - { - expanded_convert(); - *pScan_line = m_pScan_line_0; - } - else - { - switch (m_scan_type) - { - case JPGD_YH2V2: - { - if ((m_mcu_lines_left & 1) == 0) - { - H2V2Convert(); - *pScan_line = m_pScan_line_0; - } - else - *pScan_line = m_pScan_line_1; - - break; - } - case JPGD_YH2V1: - { - H2V1Convert(); - *pScan_line = m_pScan_line_0; - break; - } - case JPGD_YH1V2: - { - if ((m_mcu_lines_left & 1) == 0) - { - H1V2Convert(); - *pScan_line = m_pScan_line_0; - } - else - *pScan_line = m_pScan_line_1; - - break; - } - case JPGD_YH1V1: - { - H1V1Convert(); - *pScan_line = m_pScan_line_0; - break; - } - case JPGD_GRAYSCALE: - { - gray_convert(); - *pScan_line = m_pScan_line_0; - - break; - } - } - } - - *pScan_line_len = m_real_dest_bytes_per_scan_line; - - m_mcu_lines_left--; - m_total_lines_left--; - - return JPGD_SUCCESS; -} - -// Creates the tables needed for efficient Huffman decoding. -void jpeg_decoder::make_huff_table(int index, huff_tables *pH) -{ - int p, i, l, si; - uint8 huffsize[257]; - uint huffcode[257]; - uint code; - uint subtree; - int code_size; - int lastp; - int nextfreeentry; - int currententry; - - pH->ac_table = m_huff_ac[index] != 0; - - p = 0; - - for (l = 1; l <= 16; l++) - { - for (i = 1; i <= m_huff_num[index][l]; i++) - { - JPGD_ASSERT(p < 257); - huffsize[p++] = static_cast<uint8>(l); - } - } - - huffsize[p] = 0; - - lastp = p; - - code = 0; - si = huffsize[0]; - p = 0; - - while (huffsize[p]) - { - while (huffsize[p] == si) - { - JPGD_ASSERT(p < 257); - huffcode[p++] = code; - code++; - } - - code <<= 1; - si++; - } - - memset(pH->look_up, 0, sizeof(pH->look_up)); - memset(pH->look_up2, 0, sizeof(pH->look_up2)); - memset(pH->tree, 0, sizeof(pH->tree)); - memset(pH->code_size, 0, sizeof(pH->code_size)); - - nextfreeentry = -1; - - p = 0; - - while (p < lastp) - { - i = m_huff_val[index][p]; - code = huffcode[p]; - code_size = huffsize[p]; - - pH->code_size[i] = static_cast<uint8>(code_size); - - if (code_size <= 8) - { - code <<= (8 - code_size); - - for (l = 1 << (8 - code_size); l > 0; l--) - { - JPGD_ASSERT(i < JPGD_HUFF_CODE_SIZE_MAX_LENGTH); - JPGD_ASSERT(code < JPGD_HUFF_CODE_SIZE_MAX_LENGTH); - - pH->look_up[code] = i; - - bool has_extrabits = false; - int extra_bits = 0; - int num_extra_bits = i & 15; - - int bits_to_fetch = code_size; - if (num_extra_bits) - { - int total_codesize = code_size + num_extra_bits; - if (total_codesize <= 8) - { - has_extrabits = true; - extra_bits = ((1 << num_extra_bits) - 1) & (code >> (8 - total_codesize)); - JPGD_ASSERT(extra_bits <= 0x7FFF); - bits_to_fetch += num_extra_bits; - } - } - - if (!has_extrabits) - pH->look_up2[code] = i | (bits_to_fetch << 8); - else - pH->look_up2[code] = i | 0x8000 | (extra_bits << 16) | (bits_to_fetch << 8); - - code++; - } - } - else - { - subtree = (code >> (code_size - 8)) & 0xFF; - - currententry = pH->look_up[subtree]; - - if (currententry == 0) - { - pH->look_up[subtree] = currententry = nextfreeentry; - pH->look_up2[subtree] = currententry = nextfreeentry; - - nextfreeentry -= 2; - } - - code <<= (16 - (code_size - 8)); - - for (l = code_size; l > 9; l--) - { - if ((code & 0x8000) == 0) - currententry--; - - unsigned int idx = -currententry - 1; - JPGD_ASSERT(idx < JPGD_HUFF_TREE_MAX_LENGTH); - if (pH->tree[idx] == 0) - { - pH->tree[idx] = nextfreeentry; - - currententry = nextfreeentry; - - nextfreeentry -= 2; - } - else { - currententry = pH->tree[idx]; - } - - code <<= 1; - } - - if ((code & 0x8000) == 0) - currententry--; - - pH->tree[-currententry - 1] = i; - } - - p++; - } -} - -// Verifies the quantization tables needed for this scan are available. -void jpeg_decoder::check_quant_tables() -{ - for (int i = 0; i < m_comps_in_scan; i++) - if (m_quant[m_comp_quant[m_comp_list[i]]] == NULL) - stop_decoding(JPGD_UNDEFINED_QUANT_TABLE); -} - -// Verifies that all the Huffman tables needed for this scan are available. -void jpeg_decoder::check_huff_tables() -{ - for (int i = 0; i < m_comps_in_scan; i++) - { - if ((m_spectral_start == 0) && (m_huff_num[m_comp_dc_tab[m_comp_list[i]]] == NULL)) - stop_decoding(JPGD_UNDEFINED_HUFF_TABLE); - - if ((m_spectral_end > 0) && (m_huff_num[m_comp_ac_tab[m_comp_list[i]]] == NULL)) - stop_decoding(JPGD_UNDEFINED_HUFF_TABLE); - } - - for (int i = 0; i < JPGD_MAX_HUFF_TABLES; i++) - if (m_huff_num[i]) - { - if (!m_pHuff_tabs[i]) - m_pHuff_tabs[i] = (huff_tables *)alloc(sizeof(huff_tables)); - - make_huff_table(i, m_pHuff_tabs[i]); - } -} - -// Determines the component order inside each MCU. -// Also calcs how many MCU's are on each row, etc. -void jpeg_decoder::calc_mcu_block_order() -{ - int component_num, component_id; - int max_h_samp = 0, max_v_samp = 0; - - for (component_id = 0; component_id < m_comps_in_frame; component_id++) - { - if (m_comp_h_samp[component_id] > max_h_samp) - max_h_samp = m_comp_h_samp[component_id]; - - if (m_comp_v_samp[component_id] > max_v_samp) - max_v_samp = m_comp_v_samp[component_id]; - } - - for (component_id = 0; component_id < m_comps_in_frame; component_id++) - { - m_comp_h_blocks[component_id] = ((((m_image_x_size * m_comp_h_samp[component_id]) + (max_h_samp - 1)) / max_h_samp) + 7) / 8; - m_comp_v_blocks[component_id] = ((((m_image_y_size * m_comp_v_samp[component_id]) + (max_v_samp - 1)) / max_v_samp) + 7) / 8; - } - - if (m_comps_in_scan == 1) - { - m_mcus_per_row = m_comp_h_blocks[m_comp_list[0]]; - m_mcus_per_col = m_comp_v_blocks[m_comp_list[0]]; - } - else - { - m_mcus_per_row = (((m_image_x_size + 7) / 8) + (max_h_samp - 1)) / max_h_samp; - m_mcus_per_col = (((m_image_y_size + 7) / 8) + (max_v_samp - 1)) / max_v_samp; - } - - if (m_comps_in_scan == 1) - { - m_mcu_org[0] = m_comp_list[0]; - - m_blocks_per_mcu = 1; - } - else - { - m_blocks_per_mcu = 0; - - for (component_num = 0; component_num < m_comps_in_scan; component_num++) - { - int num_blocks; - - component_id = m_comp_list[component_num]; - - num_blocks = m_comp_h_samp[component_id] * m_comp_v_samp[component_id]; - - while (num_blocks--) - m_mcu_org[m_blocks_per_mcu++] = component_id; - } - } -} - -// Starts a new scan. -int jpeg_decoder::init_scan() -{ - if (!locate_sos_marker()) - return JPGD_FALSE; - - calc_mcu_block_order(); - - check_huff_tables(); - - check_quant_tables(); - - memset(m_last_dc_val, 0, m_comps_in_frame * sizeof(uint)); - - m_eob_run = 0; - - if (m_restart_interval) - { - m_restarts_left = m_restart_interval; - m_next_restart_num = 0; - } - - fix_in_buffer(); - - return JPGD_TRUE; -} - -// Starts a frame. Determines if the number of components or sampling factors -// are supported. -void jpeg_decoder::init_frame() -{ - int i; - - if (m_comps_in_frame == 1) - { - if ((m_comp_h_samp[0] != 1) || (m_comp_v_samp[0] != 1)) - stop_decoding(JPGD_UNSUPPORTED_SAMP_FACTORS); - - m_scan_type = JPGD_GRAYSCALE; - m_max_blocks_per_mcu = 1; - m_max_mcu_x_size = 8; - m_max_mcu_y_size = 8; - } - else if (m_comps_in_frame == 3) - { - if ( ((m_comp_h_samp[1] != 1) || (m_comp_v_samp[1] != 1)) || - ((m_comp_h_samp[2] != 1) || (m_comp_v_samp[2] != 1)) ) - stop_decoding(JPGD_UNSUPPORTED_SAMP_FACTORS); - - if ((m_comp_h_samp[0] == 1) && (m_comp_v_samp[0] == 1)) - { - m_scan_type = JPGD_YH1V1; - - m_max_blocks_per_mcu = 3; - m_max_mcu_x_size = 8; - m_max_mcu_y_size = 8; - } - else if ((m_comp_h_samp[0] == 2) && (m_comp_v_samp[0] == 1)) - { - m_scan_type = JPGD_YH2V1; - m_max_blocks_per_mcu = 4; - m_max_mcu_x_size = 16; - m_max_mcu_y_size = 8; - } - else if ((m_comp_h_samp[0] == 1) && (m_comp_v_samp[0] == 2)) - { - m_scan_type = JPGD_YH1V2; - m_max_blocks_per_mcu = 4; - m_max_mcu_x_size = 8; - m_max_mcu_y_size = 16; - } - else if ((m_comp_h_samp[0] == 2) && (m_comp_v_samp[0] == 2)) - { - m_scan_type = JPGD_YH2V2; - m_max_blocks_per_mcu = 6; - m_max_mcu_x_size = 16; - m_max_mcu_y_size = 16; - } - else - stop_decoding(JPGD_UNSUPPORTED_SAMP_FACTORS); - } - else - stop_decoding(JPGD_UNSUPPORTED_COLORSPACE); - - m_max_mcus_per_row = (m_image_x_size + (m_max_mcu_x_size - 1)) / m_max_mcu_x_size; - m_max_mcus_per_col = (m_image_y_size + (m_max_mcu_y_size - 1)) / m_max_mcu_y_size; - - // These values are for the *destination* pixels: after conversion. - if (m_scan_type == JPGD_GRAYSCALE) - m_dest_bytes_per_pixel = 1; - else - m_dest_bytes_per_pixel = 4; - - m_dest_bytes_per_scan_line = ((m_image_x_size + 15) & 0xFFF0) * m_dest_bytes_per_pixel; - - m_real_dest_bytes_per_scan_line = (m_image_x_size * m_dest_bytes_per_pixel); - - // Initialize two scan line buffers. - m_pScan_line_0 = (uint8 *)alloc(m_dest_bytes_per_scan_line, true); - if ((m_scan_type == JPGD_YH1V2) || (m_scan_type == JPGD_YH2V2)) - m_pScan_line_1 = (uint8 *)alloc(m_dest_bytes_per_scan_line, true); - - m_max_blocks_per_row = m_max_mcus_per_row * m_max_blocks_per_mcu; - - // Should never happen - if (m_max_blocks_per_row > JPGD_MAX_BLOCKS_PER_ROW) - stop_decoding(JPGD_ASSERTION_ERROR); - - // Allocate the coefficient buffer, enough for one MCU - m_pMCU_coefficients = (jpgd_block_t*)alloc(m_max_blocks_per_mcu * 64 * sizeof(jpgd_block_t)); - - for (i = 0; i < m_max_blocks_per_mcu; i++) - m_mcu_block_max_zag[i] = 64; - - m_expanded_blocks_per_component = m_comp_h_samp[0] * m_comp_v_samp[0]; - m_expanded_blocks_per_mcu = m_expanded_blocks_per_component * m_comps_in_frame; - m_expanded_blocks_per_row = m_max_mcus_per_row * m_expanded_blocks_per_mcu; - // Freq. domain chroma upsampling is only supported for H2V2 subsampling factor (the most common one I've seen). - m_freq_domain_chroma_upsample = false; -#if JPGD_SUPPORT_FREQ_DOMAIN_UPSAMPLING - m_freq_domain_chroma_upsample = (m_expanded_blocks_per_mcu == 4*3); -#endif - if (m_freq_domain_chroma_upsample) - m_pSample_buf = (uint8 *)alloc(m_expanded_blocks_per_row * 64); - else - m_pSample_buf = (uint8 *)alloc(m_max_blocks_per_row * 64); - - m_total_lines_left = m_image_y_size; - - m_mcu_lines_left = 0; - - create_look_ups(); -} - -// The coeff_buf series of methods originally stored the coefficients -// into a "virtual" file which was located in EMS, XMS, or a disk file. A cache -// was used to make this process more efficient. Now, we can store the entire -// thing in RAM. -jpeg_decoder::coeff_buf* jpeg_decoder::coeff_buf_open(int block_num_x, int block_num_y, int block_len_x, int block_len_y) -{ - coeff_buf* cb = (coeff_buf*)alloc(sizeof(coeff_buf)); - - cb->block_num_x = block_num_x; - cb->block_num_y = block_num_y; - cb->block_len_x = block_len_x; - cb->block_len_y = block_len_y; - cb->block_size = (block_len_x * block_len_y) * sizeof(jpgd_block_t); - cb->pData = (uint8 *)alloc(cb->block_size * block_num_x * block_num_y, true); - return cb; -} - -inline jpgd_block_t *jpeg_decoder::coeff_buf_getp(coeff_buf *cb, int block_x, int block_y) -{ - JPGD_ASSERT((block_x < cb->block_num_x) && (block_y < cb->block_num_y)); - return (jpgd_block_t *)(cb->pData + block_x * cb->block_size + block_y * (cb->block_size * cb->block_num_x)); -} - -// The following methods decode the various types of m_blocks encountered -// in progressively encoded images. -void jpeg_decoder::decode_block_dc_first(jpeg_decoder *pD, int component_id, int block_x, int block_y) -{ - int s, r; - jpgd_block_t *p = pD->coeff_buf_getp(pD->m_dc_coeffs[component_id], block_x, block_y); - - if ((s = pD->huff_decode(pD->m_pHuff_tabs[pD->m_comp_dc_tab[component_id]])) != 0) - { - r = pD->get_bits_no_markers(s); - s = JPGD_HUFF_EXTEND(r, s); - } - - pD->m_last_dc_val[component_id] = (s += pD->m_last_dc_val[component_id]); - - p[0] = static_cast<jpgd_block_t>(s << pD->m_successive_low); -} - -void jpeg_decoder::decode_block_dc_refine(jpeg_decoder *pD, int component_id, int block_x, int block_y) -{ - if (pD->get_bits_no_markers(1)) - { - jpgd_block_t *p = pD->coeff_buf_getp(pD->m_dc_coeffs[component_id], block_x, block_y); - - p[0] |= (1 << pD->m_successive_low); - } -} - -void jpeg_decoder::decode_block_ac_first(jpeg_decoder *pD, int component_id, int block_x, int block_y) -{ - int k, s, r; - - if (pD->m_eob_run) - { - pD->m_eob_run--; - return; - } - - jpgd_block_t *p = pD->coeff_buf_getp(pD->m_ac_coeffs[component_id], block_x, block_y); - - for (k = pD->m_spectral_start; k <= pD->m_spectral_end; k++) - { - unsigned int idx = pD->m_comp_ac_tab[component_id]; - JPGD_ASSERT(idx < JPGD_MAX_HUFF_TABLES); - s = pD->huff_decode(pD->m_pHuff_tabs[idx]); - - r = s >> 4; - s &= 15; - - if (s) - { - if ((k += r) > 63) - pD->stop_decoding(JPGD_DECODE_ERROR); - - r = pD->get_bits_no_markers(s); - s = JPGD_HUFF_EXTEND(r, s); - - p[g_ZAG[k]] = static_cast<jpgd_block_t>(s << pD->m_successive_low); - } - else - { - if (r == 15) - { - if ((k += 15) > 63) - pD->stop_decoding(JPGD_DECODE_ERROR); - } - else - { - pD->m_eob_run = 1 << r; - - if (r) - pD->m_eob_run += pD->get_bits_no_markers(r); - - pD->m_eob_run--; - - break; - } - } - } -} - -void jpeg_decoder::decode_block_ac_refine(jpeg_decoder *pD, int component_id, int block_x, int block_y) -{ - int s, k, r; - int p1 = 1 << pD->m_successive_low; - int m1 = (-1) << pD->m_successive_low; - jpgd_block_t *p = pD->coeff_buf_getp(pD->m_ac_coeffs[component_id], block_x, block_y); - JPGD_ASSERT(pD->m_spectral_end <= 63); - - k = pD->m_spectral_start; - - if (pD->m_eob_run == 0) - { - for ( ; k <= pD->m_spectral_end; k++) - { - unsigned int idx = pD->m_comp_ac_tab[component_id]; - JPGD_ASSERT(idx < JPGD_MAX_HUFF_TABLES); - s = pD->huff_decode(pD->m_pHuff_tabs[idx]); - - r = s >> 4; - s &= 15; - - if (s) - { - if (s != 1) - pD->stop_decoding(JPGD_DECODE_ERROR); - - if (pD->get_bits_no_markers(1)) - s = p1; - else - s = m1; - } - else - { - if (r != 15) - { - pD->m_eob_run = 1 << r; - - if (r) - pD->m_eob_run += pD->get_bits_no_markers(r); - - break; - } - } - - do - { - jpgd_block_t *this_coef = p + g_ZAG[k & 63]; - - if (*this_coef != 0) - { - if (pD->get_bits_no_markers(1)) - { - if ((*this_coef & p1) == 0) - { - if (*this_coef >= 0) - *this_coef = static_cast<jpgd_block_t>(*this_coef + p1); - else - *this_coef = static_cast<jpgd_block_t>(*this_coef + m1); - } - } - } - else - { - if (--r < 0) - break; - } - - k++; - - } while (k <= pD->m_spectral_end); - - if ((s) && (k < 64)) - { - p[g_ZAG[k]] = static_cast<jpgd_block_t>(s); - } - } - } - - if (pD->m_eob_run > 0) - { - for ( ; k <= pD->m_spectral_end; k++) - { - jpgd_block_t *this_coef = p + g_ZAG[k & 63]; // logical AND to shut up static code analysis - - if (*this_coef != 0) - { - if (pD->get_bits_no_markers(1)) - { - if ((*this_coef & p1) == 0) - { - if (*this_coef >= 0) - *this_coef = static_cast<jpgd_block_t>(*this_coef + p1); - else - *this_coef = static_cast<jpgd_block_t>(*this_coef + m1); - } - } - } - } - - pD->m_eob_run--; - } -} - -// Decode a scan in a progressively encoded image. -void jpeg_decoder::decode_scan(pDecode_block_func decode_block_func) -{ - int mcu_row, mcu_col, mcu_block; - int block_x_mcu[JPGD_MAX_COMPONENTS], m_block_y_mcu[JPGD_MAX_COMPONENTS]; - - memset(m_block_y_mcu, 0, sizeof(m_block_y_mcu)); - - for (mcu_col = 0; mcu_col < m_mcus_per_col; mcu_col++) - { - int component_num, component_id; - - memset(block_x_mcu, 0, sizeof(block_x_mcu)); - - for (mcu_row = 0; mcu_row < m_mcus_per_row; mcu_row++) - { - int block_x_mcu_ofs = 0, block_y_mcu_ofs = 0; - - if ((m_restart_interval) && (m_restarts_left == 0)) - process_restart(); - - for (mcu_block = 0; mcu_block < m_blocks_per_mcu; mcu_block++) - { - component_id = m_mcu_org[mcu_block]; - - decode_block_func(this, component_id, block_x_mcu[component_id] + block_x_mcu_ofs, m_block_y_mcu[component_id] + block_y_mcu_ofs); - - if (m_comps_in_scan == 1) - block_x_mcu[component_id]++; - else - { - if (++block_x_mcu_ofs == m_comp_h_samp[component_id]) - { - block_x_mcu_ofs = 0; - - if (++block_y_mcu_ofs == m_comp_v_samp[component_id]) - { - block_y_mcu_ofs = 0; - block_x_mcu[component_id] += m_comp_h_samp[component_id]; - } - } - } - } - - m_restarts_left--; - } - - if (m_comps_in_scan == 1) - m_block_y_mcu[m_comp_list[0]]++; - else - { - for (component_num = 0; component_num < m_comps_in_scan; component_num++) - { - component_id = m_comp_list[component_num]; - m_block_y_mcu[component_id] += m_comp_v_samp[component_id]; - } - } - } -} - -// Decode a progressively encoded image. -void jpeg_decoder::init_progressive() -{ - int i; - - if (m_comps_in_frame == 4) - stop_decoding(JPGD_UNSUPPORTED_COLORSPACE); - - // Allocate the coefficient buffers. - for (i = 0; i < m_comps_in_frame; i++) - { - m_dc_coeffs[i] = coeff_buf_open(m_max_mcus_per_row * m_comp_h_samp[i], m_max_mcus_per_col * m_comp_v_samp[i], 1, 1); - m_ac_coeffs[i] = coeff_buf_open(m_max_mcus_per_row * m_comp_h_samp[i], m_max_mcus_per_col * m_comp_v_samp[i], 8, 8); - } - - for ( ; ; ) - { - int dc_only_scan, refinement_scan; - pDecode_block_func decode_block_func; - - if (!init_scan()) - break; - - dc_only_scan = (m_spectral_start == 0); - refinement_scan = (m_successive_high != 0); - - if ((m_spectral_start > m_spectral_end) || (m_spectral_end > 63)) - stop_decoding(JPGD_BAD_SOS_SPECTRAL); - - if (dc_only_scan) - { - if (m_spectral_end) - stop_decoding(JPGD_BAD_SOS_SPECTRAL); - } - else if (m_comps_in_scan != 1) /* AC scans can only contain one component */ - stop_decoding(JPGD_BAD_SOS_SPECTRAL); - - if ((refinement_scan) && (m_successive_low != m_successive_high - 1)) - stop_decoding(JPGD_BAD_SOS_SUCCESSIVE); - - if (dc_only_scan) - { - if (refinement_scan) - decode_block_func = decode_block_dc_refine; - else - decode_block_func = decode_block_dc_first; - } - else - { - if (refinement_scan) - decode_block_func = decode_block_ac_refine; - else - decode_block_func = decode_block_ac_first; - } - - decode_scan(decode_block_func); - - m_bits_left = 16; - get_bits(16); - get_bits(16); - } - - m_comps_in_scan = m_comps_in_frame; - - for (i = 0; i < m_comps_in_frame; i++) - m_comp_list[i] = i; - - calc_mcu_block_order(); -} - -void jpeg_decoder::init_sequential() -{ - if (!init_scan()) - stop_decoding(JPGD_UNEXPECTED_MARKER); -} - -void jpeg_decoder::decode_start() -{ - init_frame(); - - if (m_progressive_flag) - init_progressive(); - else - init_sequential(); -} - -void jpeg_decoder::decode_init(jpeg_decoder_stream *pStream) -{ - init(pStream); - locate_sof_marker(); -} - -jpeg_decoder::jpeg_decoder(jpeg_decoder_stream *pStream) -{ - if (setjmp(m_jmp_state)) - return; - decode_init(pStream); -} - -int jpeg_decoder::begin_decoding() -{ - if (m_ready_flag) - return JPGD_SUCCESS; - - if (m_error_code) - return JPGD_FAILED; - - if (setjmp(m_jmp_state)) - return JPGD_FAILED; - - decode_start(); - - m_ready_flag = true; - - return JPGD_SUCCESS; -} - -jpeg_decoder::~jpeg_decoder() -{ - free_all_blocks(); -} - -jpeg_decoder_file_stream::jpeg_decoder_file_stream() -{ - m_pFile = NULL; - m_eof_flag = false; - m_error_flag = false; -} - -void jpeg_decoder_file_stream::close() -{ - if (m_pFile) - { - fclose(m_pFile); - m_pFile = NULL; - } - - m_eof_flag = false; - m_error_flag = false; -} - -jpeg_decoder_file_stream::~jpeg_decoder_file_stream() -{ - close(); -} - -bool jpeg_decoder_file_stream::open(const char *Pfilename) -{ - close(); - - m_eof_flag = false; - m_error_flag = false; + y += 64 * 6 - 64 * 2; + c += 64 * 6 - 8; + } + } + + uint32_t jpeg_decoder::H2V2ConvertFiltered() + { + const uint BLOCKS_PER_MCU = 6; + int y = m_image_y_size - m_total_lines_left; + int row = y & 15; + + const int half_image_y_size = (m_image_y_size >> 1) - 1; + + uint8* d0 = m_pScan_line_0; + + int c_y0 = (y - 1) >> 1; + int c_y1 = JPGD_MIN(c_y0 + 1, half_image_y_size); + + const uint8_t* p_YSamples = m_pSample_buf; + const uint8_t* p_C0Samples = m_pSample_buf; + if ((c_y0 >= 0) && (((row & 15) == 0) || ((row & 15) == 15)) && (m_total_lines_left > 1)) + { + assert(y > 0); + assert(m_sample_buf_prev_valid); + + if ((row & 15) == 15) + p_YSamples = m_pSample_buf_prev; + + p_C0Samples = m_pSample_buf_prev; + } + + const int y_sample_base_ofs = ((row & 8) ? 128 : 0) + (row & 7) * 8; + const int y0_base = (c_y0 & 7) * 8 + 256; + const int y1_base = (c_y1 & 7) * 8 + 256; + + const int half_image_x_size = (m_image_x_size >> 1) - 1; + + static const uint8_t s_muls[2][2][4] = + { + { { 1, 3, 3, 9 }, { 3, 9, 1, 3 }, }, + { { 3, 1, 9, 3 }, { 9, 3, 3, 1 } } + }; + + if (((row & 15) >= 1) && ((row & 15) <= 14)) + { + assert((row & 1) == 1); + assert(((y + 1 - 1) >> 1) == c_y0); + + assert(p_YSamples == m_pSample_buf); + assert(p_C0Samples == m_pSample_buf); + + uint8* d1 = m_pScan_line_1; + const int y_sample_base_ofs1 = (((row + 1) & 8) ? 128 : 0) + ((row + 1) & 7) * 8; + + for (int x = 0; x < m_image_x_size; x++) + { + int k = (x >> 4) * BLOCKS_PER_MCU * 64 + ((x & 8) ? 64 : 0) + (x & 7); + int y_sample0 = p_YSamples[check_sample_buf_ofs(k + y_sample_base_ofs)]; + int y_sample1 = p_YSamples[check_sample_buf_ofs(k + y_sample_base_ofs1)]; + + int c_x0 = (x - 1) >> 1; + int c_x1 = JPGD_MIN(c_x0 + 1, half_image_x_size); + c_x0 = JPGD_MAX(c_x0, 0); + + int a = (c_x0 >> 3) * BLOCKS_PER_MCU * 64 + (c_x0 & 7); + int cb00_sample = p_C0Samples[check_sample_buf_ofs(a + y0_base)]; + int cr00_sample = p_C0Samples[check_sample_buf_ofs(a + y0_base + 64)]; + + int cb01_sample = m_pSample_buf[check_sample_buf_ofs(a + y1_base)]; + int cr01_sample = m_pSample_buf[check_sample_buf_ofs(a + y1_base + 64)]; + + int b = (c_x1 >> 3) * BLOCKS_PER_MCU * 64 + (c_x1 & 7); + int cb10_sample = p_C0Samples[check_sample_buf_ofs(b + y0_base)]; + int cr10_sample = p_C0Samples[check_sample_buf_ofs(b + y0_base + 64)]; + + int cb11_sample = m_pSample_buf[check_sample_buf_ofs(b + y1_base)]; + int cr11_sample = m_pSample_buf[check_sample_buf_ofs(b + y1_base + 64)]; + + { + const uint8_t* pMuls = &s_muls[row & 1][x & 1][0]; + int cb = (cb00_sample * pMuls[0] + cb01_sample * pMuls[1] + cb10_sample * pMuls[2] + cb11_sample * pMuls[3] + 8) >> 4; + int cr = (cr00_sample * pMuls[0] + cr01_sample * pMuls[1] + cr10_sample * pMuls[2] + cr11_sample * pMuls[3] + 8) >> 4; + + int rc = m_crr[cr]; + int gc = ((m_crg[cr] + m_cbg[cb]) >> 16); + int bc = m_cbb[cb]; + + d0[0] = clamp(y_sample0 + rc); + d0[1] = clamp(y_sample0 + gc); + d0[2] = clamp(y_sample0 + bc); + d0[3] = 255; + + d0 += 4; + } + + { + const uint8_t* pMuls = &s_muls[(row + 1) & 1][x & 1][0]; + int cb = (cb00_sample * pMuls[0] + cb01_sample * pMuls[1] + cb10_sample * pMuls[2] + cb11_sample * pMuls[3] + 8) >> 4; + int cr = (cr00_sample * pMuls[0] + cr01_sample * pMuls[1] + cr10_sample * pMuls[2] + cr11_sample * pMuls[3] + 8) >> 4; + + int rc = m_crr[cr]; + int gc = ((m_crg[cr] + m_cbg[cb]) >> 16); + int bc = m_cbb[cb]; + + d1[0] = clamp(y_sample1 + rc); + d1[1] = clamp(y_sample1 + gc); + d1[2] = clamp(y_sample1 + bc); + d1[3] = 255; + + d1 += 4; + } + + if (((x & 1) == 1) && (x < m_image_x_size - 1)) + { + const int nx = x + 1; + assert(c_x0 == (nx - 1) >> 1); + + k = (nx >> 4) * BLOCKS_PER_MCU * 64 + ((nx & 8) ? 64 : 0) + (nx & 7); + y_sample0 = p_YSamples[check_sample_buf_ofs(k + y_sample_base_ofs)]; + y_sample1 = p_YSamples[check_sample_buf_ofs(k + y_sample_base_ofs1)]; + + { + const uint8_t* pMuls = &s_muls[row & 1][nx & 1][0]; + int cb = (cb00_sample * pMuls[0] + cb01_sample * pMuls[1] + cb10_sample * pMuls[2] + cb11_sample * pMuls[3] + 8) >> 4; + int cr = (cr00_sample * pMuls[0] + cr01_sample * pMuls[1] + cr10_sample * pMuls[2] + cr11_sample * pMuls[3] + 8) >> 4; + + int rc = m_crr[cr]; + int gc = ((m_crg[cr] + m_cbg[cb]) >> 16); + int bc = m_cbb[cb]; + + d0[0] = clamp(y_sample0 + rc); + d0[1] = clamp(y_sample0 + gc); + d0[2] = clamp(y_sample0 + bc); + d0[3] = 255; + + d0 += 4; + } + + { + const uint8_t* pMuls = &s_muls[(row + 1) & 1][nx & 1][0]; + int cb = (cb00_sample * pMuls[0] + cb01_sample * pMuls[1] + cb10_sample * pMuls[2] + cb11_sample * pMuls[3] + 8) >> 4; + int cr = (cr00_sample * pMuls[0] + cr01_sample * pMuls[1] + cr10_sample * pMuls[2] + cr11_sample * pMuls[3] + 8) >> 4; + + int rc = m_crr[cr]; + int gc = ((m_crg[cr] + m_cbg[cb]) >> 16); + int bc = m_cbb[cb]; + + d1[0] = clamp(y_sample1 + rc); + d1[1] = clamp(y_sample1 + gc); + d1[2] = clamp(y_sample1 + bc); + d1[3] = 255; + + d1 += 4; + } + + ++x; + } + } + + return 2; + } + else + { + for (int x = 0; x < m_image_x_size; x++) + { + int y_sample = p_YSamples[check_sample_buf_ofs((x >> 4) * BLOCKS_PER_MCU * 64 + ((x & 8) ? 64 : 0) + (x & 7) + y_sample_base_ofs)]; + + int c_x0 = (x - 1) >> 1; + int c_x1 = JPGD_MIN(c_x0 + 1, half_image_x_size); + c_x0 = JPGD_MAX(c_x0, 0); + + int a = (c_x0 >> 3) * BLOCKS_PER_MCU * 64 + (c_x0 & 7); + int cb00_sample = p_C0Samples[check_sample_buf_ofs(a + y0_base)]; + int cr00_sample = p_C0Samples[check_sample_buf_ofs(a + y0_base + 64)]; + + int cb01_sample = m_pSample_buf[check_sample_buf_ofs(a + y1_base)]; + int cr01_sample = m_pSample_buf[check_sample_buf_ofs(a + y1_base + 64)]; + + int b = (c_x1 >> 3) * BLOCKS_PER_MCU * 64 + (c_x1 & 7); + int cb10_sample = p_C0Samples[check_sample_buf_ofs(b + y0_base)]; + int cr10_sample = p_C0Samples[check_sample_buf_ofs(b + y0_base + 64)]; + + int cb11_sample = m_pSample_buf[check_sample_buf_ofs(b + y1_base)]; + int cr11_sample = m_pSample_buf[check_sample_buf_ofs(b + y1_base + 64)]; + + const uint8_t* pMuls = &s_muls[row & 1][x & 1][0]; + int cb = (cb00_sample * pMuls[0] + cb01_sample * pMuls[1] + cb10_sample * pMuls[2] + cb11_sample * pMuls[3] + 8) >> 4; + int cr = (cr00_sample * pMuls[0] + cr01_sample * pMuls[1] + cr10_sample * pMuls[2] + cr11_sample * pMuls[3] + 8) >> 4; + + int rc = m_crr[cr]; + int gc = ((m_crg[cr] + m_cbg[cb]) >> 16); + int bc = m_cbb[cb]; + + d0[0] = clamp(y_sample + rc); + d0[1] = clamp(y_sample + gc); + d0[2] = clamp(y_sample + bc); + d0[3] = 255; + + d0 += 4; + } + + return 1; + } + } + + // Y (1 block per MCU) to 8-bit grayscale + void jpeg_decoder::gray_convert() + { + int row = m_max_mcu_y_size - m_mcu_lines_left; + uint8* d = m_pScan_line_0; + uint8* s = m_pSample_buf + row * 8; + + for (int i = m_max_mcus_per_row; i > 0; i--) + { + *(uint*)d = *(uint*)s; + *(uint*)(&d[4]) = *(uint*)(&s[4]); + + s += 64; + d += 8; + } + } + + // Find end of image (EOI) marker, so we can return to the user the exact size of the input stream. + void jpeg_decoder::find_eoi() + { + if (!m_progressive_flag) + { + // Attempt to read the EOI marker. + //get_bits_no_markers(m_bits_left & 7); + + // Prime the bit buffer + m_bits_left = 16; + get_bits(16); + get_bits(16); + + // The next marker _should_ be EOI + process_markers(); + } + + m_total_bytes_read -= m_in_buf_left; + } + + int jpeg_decoder::decode_next_mcu_row() + { + if (::setjmp(m_jmp_state)) + return JPGD_FAILED; + + const bool chroma_y_filtering = ((m_flags & cFlagBoxChromaFiltering) == 0) && ((m_scan_type == JPGD_YH2V2) || (m_scan_type == JPGD_YH1V2)); + if (chroma_y_filtering) + { + std::swap(m_pSample_buf, m_pSample_buf_prev); + + m_sample_buf_prev_valid = true; + } + + if (m_progressive_flag) + load_next_row(); + else + decode_next_row(); + + // Find the EOI marker if that was the last row. + if (m_total_lines_left <= m_max_mcu_y_size) + find_eoi(); + + m_mcu_lines_left = m_max_mcu_y_size; + return 0; + } + + int jpeg_decoder::decode(const void** pScan_line, uint* pScan_line_len) + { + if ((m_error_code) || (!m_ready_flag)) + return JPGD_FAILED; + + if (m_total_lines_left == 0) + return JPGD_DONE; + + const bool chroma_y_filtering = ((m_flags & cFlagBoxChromaFiltering) == 0) && ((m_scan_type == JPGD_YH2V2) || (m_scan_type == JPGD_YH1V2)); + + bool get_another_mcu_row = false; + bool got_mcu_early = false; + if (chroma_y_filtering) + { + if (m_total_lines_left == m_image_y_size) + get_another_mcu_row = true; + else if ((m_mcu_lines_left == 1) && (m_total_lines_left > 1)) + { + get_another_mcu_row = true; + got_mcu_early = true; + } + } + else + { + get_another_mcu_row = (m_mcu_lines_left == 0); + } + + if (get_another_mcu_row) + { + int status = decode_next_mcu_row(); + if (status != 0) + return status; + } + + switch (m_scan_type) + { + case JPGD_YH2V2: + { + if ((m_flags & cFlagBoxChromaFiltering) == 0) + { + if (m_num_buffered_scanlines == 1) + { + *pScan_line = m_pScan_line_1; + } + else if (m_num_buffered_scanlines == 0) + { + m_num_buffered_scanlines = H2V2ConvertFiltered(); + *pScan_line = m_pScan_line_0; + } + + m_num_buffered_scanlines--; + } + else + { + if ((m_mcu_lines_left & 1) == 0) + { + H2V2Convert(); + *pScan_line = m_pScan_line_0; + } + else + *pScan_line = m_pScan_line_1; + } + + break; + } + case JPGD_YH2V1: + { + if ((m_flags & cFlagBoxChromaFiltering) == 0) + H2V1ConvertFiltered(); + else + H2V1Convert(); + *pScan_line = m_pScan_line_0; + break; + } + case JPGD_YH1V2: + { + if (chroma_y_filtering) + { + H1V2ConvertFiltered(); + *pScan_line = m_pScan_line_0; + } + else + { + if ((m_mcu_lines_left & 1) == 0) + { + H1V2Convert(); + *pScan_line = m_pScan_line_0; + } + else + *pScan_line = m_pScan_line_1; + } + + break; + } + case JPGD_YH1V1: + { + H1V1Convert(); + *pScan_line = m_pScan_line_0; + break; + } + case JPGD_GRAYSCALE: + { + gray_convert(); + *pScan_line = m_pScan_line_0; + + break; + } + } + + *pScan_line_len = m_real_dest_bytes_per_scan_line; + + if (!got_mcu_early) + { + m_mcu_lines_left--; + } + + m_total_lines_left--; + + return JPGD_SUCCESS; + } + + // Creates the tables needed for efficient Huffman decoding. + void jpeg_decoder::make_huff_table(int index, huff_tables* pH) + { + int p, i, l, si; + uint8 huffsize[258]; + uint huffcode[258]; + uint code; + uint subtree; + int code_size; + int lastp; + int nextfreeentry; + int currententry; + + pH->ac_table = m_huff_ac[index] != 0; + + p = 0; + + for (l = 1; l <= 16; l++) + { + for (i = 1; i <= m_huff_num[index][l]; i++) + { + if (p >= 257) + stop_decoding(JPGD_DECODE_ERROR); + huffsize[p++] = static_cast<uint8>(l); + } + } + + assert(p < 258); + huffsize[p] = 0; + + lastp = p; + + code = 0; + si = huffsize[0]; + p = 0; + + while (huffsize[p]) + { + while (huffsize[p] == si) + { + if (p >= 257) + stop_decoding(JPGD_DECODE_ERROR); + huffcode[p++] = code; + code++; + } + + code <<= 1; + si++; + } + + memset(pH->look_up, 0, sizeof(pH->look_up)); + memset(pH->look_up2, 0, sizeof(pH->look_up2)); + memset(pH->tree, 0, sizeof(pH->tree)); + memset(pH->code_size, 0, sizeof(pH->code_size)); + + nextfreeentry = -1; + + p = 0; + + while (p < lastp) + { + i = m_huff_val[index][p]; + + code = huffcode[p]; + code_size = huffsize[p]; + + assert(i < JPGD_HUFF_CODE_SIZE_MAX_LENGTH); + pH->code_size[i] = static_cast<uint8>(code_size); + + if (code_size <= 8) + { + code <<= (8 - code_size); + + for (l = 1 << (8 - code_size); l > 0; l--) + { + if (code >= 256) + stop_decoding(JPGD_DECODE_ERROR); + + pH->look_up[code] = i; + + bool has_extrabits = false; + int extra_bits = 0; + int num_extra_bits = i & 15; + + int bits_to_fetch = code_size; + if (num_extra_bits) + { + int total_codesize = code_size + num_extra_bits; + if (total_codesize <= 8) + { + has_extrabits = true; + extra_bits = ((1 << num_extra_bits) - 1) & (code >> (8 - total_codesize)); + + if (extra_bits > 0x7FFF) + stop_decoding(JPGD_DECODE_ERROR); + + bits_to_fetch += num_extra_bits; + } + } + + if (!has_extrabits) + pH->look_up2[code] = i | (bits_to_fetch << 8); + else + pH->look_up2[code] = i | 0x8000 | (extra_bits << 16) | (bits_to_fetch << 8); + + code++; + } + } + else + { + subtree = (code >> (code_size - 8)) & 0xFF; + + currententry = pH->look_up[subtree]; + + if (currententry == 0) + { + pH->look_up[subtree] = currententry = nextfreeentry; + pH->look_up2[subtree] = currententry = nextfreeentry; + + nextfreeentry -= 2; + } + + code <<= (16 - (code_size - 8)); + + for (l = code_size; l > 9; l--) + { + if ((code & 0x8000) == 0) + currententry--; + + unsigned int idx = -currententry - 1; + + if (idx >= JPGD_HUFF_TREE_MAX_LENGTH) + stop_decoding(JPGD_DECODE_ERROR); + + if (pH->tree[idx] == 0) + { + pH->tree[idx] = nextfreeentry; + + currententry = nextfreeentry; + + nextfreeentry -= 2; + } + else + { + currententry = pH->tree[idx]; + } + + code <<= 1; + } + + if ((code & 0x8000) == 0) + currententry--; + + if ((-currententry - 1) >= JPGD_HUFF_TREE_MAX_LENGTH) + stop_decoding(JPGD_DECODE_ERROR); + + pH->tree[-currententry - 1] = i; + } + + p++; + } + } + + // Verifies the quantization tables needed for this scan are available. + void jpeg_decoder::check_quant_tables() + { + for (int i = 0; i < m_comps_in_scan; i++) + if (m_quant[m_comp_quant[m_comp_list[i]]] == nullptr) + stop_decoding(JPGD_UNDEFINED_QUANT_TABLE); + } + + // Verifies that all the Huffman tables needed for this scan are available. + void jpeg_decoder::check_huff_tables() + { + for (int i = 0; i < m_comps_in_scan; i++) + { + if ((m_spectral_start == 0) && (m_huff_num[m_comp_dc_tab[m_comp_list[i]]] == nullptr)) + stop_decoding(JPGD_UNDEFINED_HUFF_TABLE); + + if ((m_spectral_end > 0) && (m_huff_num[m_comp_ac_tab[m_comp_list[i]]] == nullptr)) + stop_decoding(JPGD_UNDEFINED_HUFF_TABLE); + } + + for (int i = 0; i < JPGD_MAX_HUFF_TABLES; i++) + if (m_huff_num[i]) + { + if (!m_pHuff_tabs[i]) + m_pHuff_tabs[i] = (huff_tables*)alloc(sizeof(huff_tables)); + + make_huff_table(i, m_pHuff_tabs[i]); + } + } + + // Determines the component order inside each MCU. + // Also calcs how many MCU's are on each row, etc. + bool jpeg_decoder::calc_mcu_block_order() + { + int component_num, component_id; + int max_h_samp = 0, max_v_samp = 0; + + for (component_id = 0; component_id < m_comps_in_frame; component_id++) + { + if (m_comp_h_samp[component_id] > max_h_samp) + max_h_samp = m_comp_h_samp[component_id]; + + if (m_comp_v_samp[component_id] > max_v_samp) + max_v_samp = m_comp_v_samp[component_id]; + } + + for (component_id = 0; component_id < m_comps_in_frame; component_id++) + { + m_comp_h_blocks[component_id] = ((((m_image_x_size * m_comp_h_samp[component_id]) + (max_h_samp - 1)) / max_h_samp) + 7) / 8; + m_comp_v_blocks[component_id] = ((((m_image_y_size * m_comp_v_samp[component_id]) + (max_v_samp - 1)) / max_v_samp) + 7) / 8; + } + + if (m_comps_in_scan == 1) + { + m_mcus_per_row = m_comp_h_blocks[m_comp_list[0]]; + m_mcus_per_col = m_comp_v_blocks[m_comp_list[0]]; + } + else + { + m_mcus_per_row = (((m_image_x_size + 7) / 8) + (max_h_samp - 1)) / max_h_samp; + m_mcus_per_col = (((m_image_y_size + 7) / 8) + (max_v_samp - 1)) / max_v_samp; + } + + if (m_comps_in_scan == 1) + { + m_mcu_org[0] = m_comp_list[0]; + + m_blocks_per_mcu = 1; + } + else + { + m_blocks_per_mcu = 0; + + for (component_num = 0; component_num < m_comps_in_scan; component_num++) + { + int num_blocks; + + component_id = m_comp_list[component_num]; + + num_blocks = m_comp_h_samp[component_id] * m_comp_v_samp[component_id]; + + while (num_blocks--) + m_mcu_org[m_blocks_per_mcu++] = component_id; + } + } + + if (m_blocks_per_mcu > m_max_blocks_per_mcu) + return false; + + for (int mcu_block = 0; mcu_block < m_blocks_per_mcu; mcu_block++) + { + int comp_id = m_mcu_org[mcu_block]; + if (comp_id >= JPGD_MAX_QUANT_TABLES) + return false; + } + + return true; + } + + // Starts a new scan. + int jpeg_decoder::init_scan() + { + if (!locate_sos_marker()) + return JPGD_FALSE; + + if (!calc_mcu_block_order()) + return JPGD_FALSE; + + check_huff_tables(); + + check_quant_tables(); + + memset(m_last_dc_val, 0, m_comps_in_frame * sizeof(uint)); + + m_eob_run = 0; + + if (m_restart_interval) + { + m_restarts_left = m_restart_interval; + m_next_restart_num = 0; + } + + fix_in_buffer(); + + return JPGD_TRUE; + } + + // Starts a frame. Determines if the number of components or sampling factors + // are supported. + void jpeg_decoder::init_frame() + { + int i; + + if (m_comps_in_frame == 1) + { + if ((m_comp_h_samp[0] != 1) || (m_comp_v_samp[0] != 1)) + stop_decoding(JPGD_UNSUPPORTED_SAMP_FACTORS); + + m_scan_type = JPGD_GRAYSCALE; + m_max_blocks_per_mcu = 1; + m_max_mcu_x_size = 8; + m_max_mcu_y_size = 8; + } + else if (m_comps_in_frame == 3) + { + if (((m_comp_h_samp[1] != 1) || (m_comp_v_samp[1] != 1)) || + ((m_comp_h_samp[2] != 1) || (m_comp_v_samp[2] != 1))) + stop_decoding(JPGD_UNSUPPORTED_SAMP_FACTORS); + + if ((m_comp_h_samp[0] == 1) && (m_comp_v_samp[0] == 1)) + { + m_scan_type = JPGD_YH1V1; + + m_max_blocks_per_mcu = 3; + m_max_mcu_x_size = 8; + m_max_mcu_y_size = 8; + } + else if ((m_comp_h_samp[0] == 2) && (m_comp_v_samp[0] == 1)) + { + m_scan_type = JPGD_YH2V1; + m_max_blocks_per_mcu = 4; + m_max_mcu_x_size = 16; + m_max_mcu_y_size = 8; + } + else if ((m_comp_h_samp[0] == 1) && (m_comp_v_samp[0] == 2)) + { + m_scan_type = JPGD_YH1V2; + m_max_blocks_per_mcu = 4; + m_max_mcu_x_size = 8; + m_max_mcu_y_size = 16; + } + else if ((m_comp_h_samp[0] == 2) && (m_comp_v_samp[0] == 2)) + { + m_scan_type = JPGD_YH2V2; + m_max_blocks_per_mcu = 6; + m_max_mcu_x_size = 16; + m_max_mcu_y_size = 16; + } + else + stop_decoding(JPGD_UNSUPPORTED_SAMP_FACTORS); + } + else + stop_decoding(JPGD_UNSUPPORTED_COLORSPACE); + + m_max_mcus_per_row = (m_image_x_size + (m_max_mcu_x_size - 1)) / m_max_mcu_x_size; + m_max_mcus_per_col = (m_image_y_size + (m_max_mcu_y_size - 1)) / m_max_mcu_y_size; + + // These values are for the *destination* pixels: after conversion. + if (m_scan_type == JPGD_GRAYSCALE) + m_dest_bytes_per_pixel = 1; + else + m_dest_bytes_per_pixel = 4; + + m_dest_bytes_per_scan_line = ((m_image_x_size + 15) & 0xFFF0) * m_dest_bytes_per_pixel; + + m_real_dest_bytes_per_scan_line = (m_image_x_size * m_dest_bytes_per_pixel); + + // Initialize two scan line buffers. + m_pScan_line_0 = (uint8*)alloc_aligned(m_dest_bytes_per_scan_line, true); + if ((m_scan_type == JPGD_YH1V2) || (m_scan_type == JPGD_YH2V2)) + m_pScan_line_1 = (uint8*)alloc_aligned(m_dest_bytes_per_scan_line, true); + + m_max_blocks_per_row = m_max_mcus_per_row * m_max_blocks_per_mcu; + + // Should never happen + if (m_max_blocks_per_row > JPGD_MAX_BLOCKS_PER_ROW) + stop_decoding(JPGD_DECODE_ERROR); + + // Allocate the coefficient buffer, enough for one MCU + m_pMCU_coefficients = (jpgd_block_coeff_t *)alloc_aligned(m_max_blocks_per_mcu * 64 * sizeof(jpgd_block_coeff_t)); + + for (i = 0; i < m_max_blocks_per_mcu; i++) + m_mcu_block_max_zag[i] = 64; + + m_pSample_buf = (uint8*)alloc_aligned(m_max_blocks_per_row * 64); + m_pSample_buf_prev = (uint8*)alloc_aligned(m_max_blocks_per_row * 64); + + m_total_lines_left = m_image_y_size; + + m_mcu_lines_left = 0; + + create_look_ups(); + } + + // The coeff_buf series of methods originally stored the coefficients + // into a "virtual" file which was located in EMS, XMS, or a disk file. A cache + // was used to make this process more efficient. Now, we can store the entire + // thing in RAM. + jpeg_decoder::coeff_buf* jpeg_decoder::coeff_buf_open(int block_num_x, int block_num_y, int block_len_x, int block_len_y) + { + coeff_buf* cb = (coeff_buf*)alloc(sizeof(coeff_buf)); + + cb->block_num_x = block_num_x; + cb->block_num_y = block_num_y; + cb->block_len_x = block_len_x; + cb->block_len_y = block_len_y; + cb->block_size = (block_len_x * block_len_y) * sizeof(jpgd_block_coeff_t); + cb->pData = (uint8*)alloc(cb->block_size * block_num_x * block_num_y, true); + return cb; + } + + inline jpgd_block_coeff_t* jpeg_decoder::coeff_buf_getp(coeff_buf* cb, int block_x, int block_y) + { + if ((block_x >= cb->block_num_x) || (block_y >= cb->block_num_y)) + stop_decoding(JPGD_DECODE_ERROR); + + return (jpgd_block_coeff_t*)(cb->pData + block_x * cb->block_size + block_y * (cb->block_size * cb->block_num_x)); + } + + // The following methods decode the various types of m_blocks encountered + // in progressively encoded images. + void jpeg_decoder::decode_block_dc_first(jpeg_decoder* pD, int component_id, int block_x, int block_y) + { + int s, r; + jpgd_block_coeff_t* p = pD->coeff_buf_getp(pD->m_dc_coeffs[component_id], block_x, block_y); + + if ((s = pD->huff_decode(pD->m_pHuff_tabs[pD->m_comp_dc_tab[component_id]])) != 0) + { + if (s >= 16) + pD->stop_decoding(JPGD_DECODE_ERROR); + + r = pD->get_bits_no_markers(s); + s = JPGD_HUFF_EXTEND(r, s); + } + + pD->m_last_dc_val[component_id] = (s += pD->m_last_dc_val[component_id]); + + p[0] = static_cast<jpgd_block_coeff_t>(s << pD->m_successive_low); + } + + void jpeg_decoder::decode_block_dc_refine(jpeg_decoder* pD, int component_id, int block_x, int block_y) + { + if (pD->get_bits_no_markers(1)) + { + jpgd_block_coeff_t* p = pD->coeff_buf_getp(pD->m_dc_coeffs[component_id], block_x, block_y); + + p[0] |= (1 << pD->m_successive_low); + } + } + + void jpeg_decoder::decode_block_ac_first(jpeg_decoder* pD, int component_id, int block_x, int block_y) + { + int k, s, r; + + if (pD->m_eob_run) + { + pD->m_eob_run--; + return; + } + + jpgd_block_coeff_t* p = pD->coeff_buf_getp(pD->m_ac_coeffs[component_id], block_x, block_y); + + for (k = pD->m_spectral_start; k <= pD->m_spectral_end; k++) + { + unsigned int idx = pD->m_comp_ac_tab[component_id]; + if (idx >= JPGD_MAX_HUFF_TABLES) + pD->stop_decoding(JPGD_DECODE_ERROR); + + s = pD->huff_decode(pD->m_pHuff_tabs[idx]); + + r = s >> 4; + s &= 15; + + if (s) + { + if ((k += r) > 63) + pD->stop_decoding(JPGD_DECODE_ERROR); + + r = pD->get_bits_no_markers(s); + s = JPGD_HUFF_EXTEND(r, s); + + p[g_ZAG[k]] = static_cast<jpgd_block_coeff_t>(s << pD->m_successive_low); + } + else + { + if (r == 15) + { + if ((k += 15) > 63) + pD->stop_decoding(JPGD_DECODE_ERROR); + } + else + { + pD->m_eob_run = 1 << r; + + if (r) + pD->m_eob_run += pD->get_bits_no_markers(r); + + pD->m_eob_run--; + + break; + } + } + } + } + + void jpeg_decoder::decode_block_ac_refine(jpeg_decoder* pD, int component_id, int block_x, int block_y) + { + int s, k, r; + + int p1 = 1 << pD->m_successive_low; + + //int m1 = (-1) << pD->m_successive_low; + int m1 = static_cast<int>((UINT32_MAX << pD->m_successive_low)); + + jpgd_block_coeff_t* p = pD->coeff_buf_getp(pD->m_ac_coeffs[component_id], block_x, block_y); + if (pD->m_spectral_end > 63) + pD->stop_decoding(JPGD_DECODE_ERROR); + + k = pD->m_spectral_start; + + if (pD->m_eob_run == 0) + { + for (; k <= pD->m_spectral_end; k++) + { + unsigned int idx = pD->m_comp_ac_tab[component_id]; + if (idx >= JPGD_MAX_HUFF_TABLES) + pD->stop_decoding(JPGD_DECODE_ERROR); + + s = pD->huff_decode(pD->m_pHuff_tabs[idx]); + + r = s >> 4; + s &= 15; + + if (s) + { + if (s != 1) + pD->stop_decoding(JPGD_DECODE_ERROR); + + if (pD->get_bits_no_markers(1)) + s = p1; + else + s = m1; + } + else + { + if (r != 15) + { + pD->m_eob_run = 1 << r; + + if (r) + pD->m_eob_run += pD->get_bits_no_markers(r); + + break; + } + } + + do + { + jpgd_block_coeff_t* this_coef = p + g_ZAG[k & 63]; + + if (*this_coef != 0) + { + if (pD->get_bits_no_markers(1)) + { + if ((*this_coef & p1) == 0) + { + if (*this_coef >= 0) + *this_coef = static_cast<jpgd_block_coeff_t>(*this_coef + p1); + else + *this_coef = static_cast<jpgd_block_coeff_t>(*this_coef + m1); + } + } + } + else + { + if (--r < 0) + break; + } + + k++; + + } while (k <= pD->m_spectral_end); + + if ((s) && (k < 64)) + { + p[g_ZAG[k]] = static_cast<jpgd_block_coeff_t>(s); + } + } + } + + if (pD->m_eob_run > 0) + { + for (; k <= pD->m_spectral_end; k++) + { + jpgd_block_coeff_t* this_coef = p + g_ZAG[k & 63]; // logical AND to shut up static code analysis + + if (*this_coef != 0) + { + if (pD->get_bits_no_markers(1)) + { + if ((*this_coef & p1) == 0) + { + if (*this_coef >= 0) + *this_coef = static_cast<jpgd_block_coeff_t>(*this_coef + p1); + else + *this_coef = static_cast<jpgd_block_coeff_t>(*this_coef + m1); + } + } + } + } + + pD->m_eob_run--; + } + } + + // Decode a scan in a progressively encoded image. + void jpeg_decoder::decode_scan(pDecode_block_func decode_block_func) + { + int mcu_row, mcu_col, mcu_block; + int block_x_mcu[JPGD_MAX_COMPONENTS], block_y_mcu[JPGD_MAX_COMPONENTS]; + + memset(block_y_mcu, 0, sizeof(block_y_mcu)); + + for (mcu_col = 0; mcu_col < m_mcus_per_col; mcu_col++) + { + int component_num, component_id; + + memset(block_x_mcu, 0, sizeof(block_x_mcu)); + + for (mcu_row = 0; mcu_row < m_mcus_per_row; mcu_row++) + { + int block_x_mcu_ofs = 0, block_y_mcu_ofs = 0; + + if ((m_restart_interval) && (m_restarts_left == 0)) + process_restart(); + + for (mcu_block = 0; mcu_block < m_blocks_per_mcu; mcu_block++) + { + component_id = m_mcu_org[mcu_block]; + + decode_block_func(this, component_id, block_x_mcu[component_id] + block_x_mcu_ofs, block_y_mcu[component_id] + block_y_mcu_ofs); + + if (m_comps_in_scan == 1) + block_x_mcu[component_id]++; + else + { + if (++block_x_mcu_ofs == m_comp_h_samp[component_id]) + { + block_x_mcu_ofs = 0; + + if (++block_y_mcu_ofs == m_comp_v_samp[component_id]) + { + block_y_mcu_ofs = 0; + block_x_mcu[component_id] += m_comp_h_samp[component_id]; + } + } + } + } + + m_restarts_left--; + } + + if (m_comps_in_scan == 1) + block_y_mcu[m_comp_list[0]]++; + else + { + for (component_num = 0; component_num < m_comps_in_scan; component_num++) + { + component_id = m_comp_list[component_num]; + block_y_mcu[component_id] += m_comp_v_samp[component_id]; + } + } + } + } + + // Decode a progressively encoded image. + void jpeg_decoder::init_progressive() + { + int i; + + if (m_comps_in_frame == 4) + stop_decoding(JPGD_UNSUPPORTED_COLORSPACE); + + // Allocate the coefficient buffers. + for (i = 0; i < m_comps_in_frame; i++) + { + m_dc_coeffs[i] = coeff_buf_open(m_max_mcus_per_row * m_comp_h_samp[i], m_max_mcus_per_col * m_comp_v_samp[i], 1, 1); + m_ac_coeffs[i] = coeff_buf_open(m_max_mcus_per_row * m_comp_h_samp[i], m_max_mcus_per_col * m_comp_v_samp[i], 8, 8); + } + + // See https://libjpeg-turbo.org/pmwiki/uploads/About/TwoIssueswiththeJPEGStandard.pdf + uint32_t total_scans = 0; + const uint32_t MAX_SCANS_TO_PROCESS = 1000; + + for (; ; ) + { + int dc_only_scan, refinement_scan; + pDecode_block_func decode_block_func; + + if (!init_scan()) + break; + + dc_only_scan = (m_spectral_start == 0); + refinement_scan = (m_successive_high != 0); + + if ((m_spectral_start > m_spectral_end) || (m_spectral_end > 63)) + stop_decoding(JPGD_BAD_SOS_SPECTRAL); + + if (dc_only_scan) + { + if (m_spectral_end) + stop_decoding(JPGD_BAD_SOS_SPECTRAL); + } + else if (m_comps_in_scan != 1) /* AC scans can only contain one component */ + stop_decoding(JPGD_BAD_SOS_SPECTRAL); + + if ((refinement_scan) && (m_successive_low != m_successive_high - 1)) + stop_decoding(JPGD_BAD_SOS_SUCCESSIVE); + + if (dc_only_scan) + { + if (refinement_scan) + decode_block_func = decode_block_dc_refine; + else + decode_block_func = decode_block_dc_first; + } + else + { + if (refinement_scan) + decode_block_func = decode_block_ac_refine; + else + decode_block_func = decode_block_ac_first; + } + + decode_scan(decode_block_func); + + m_bits_left = 16; + get_bits(16); + get_bits(16); + + total_scans++; + if (total_scans > MAX_SCANS_TO_PROCESS) + stop_decoding(JPGD_TOO_MANY_SCANS); + } + + m_comps_in_scan = m_comps_in_frame; + + for (i = 0; i < m_comps_in_frame; i++) + m_comp_list[i] = i; + + if (!calc_mcu_block_order()) + stop_decoding(JPGD_DECODE_ERROR); + } + + void jpeg_decoder::init_sequential() + { + if (!init_scan()) + stop_decoding(JPGD_UNEXPECTED_MARKER); + } + + void jpeg_decoder::decode_start() + { + init_frame(); + + if (m_progressive_flag) + init_progressive(); + else + init_sequential(); + } + + void jpeg_decoder::decode_init(jpeg_decoder_stream* pStream, uint32_t flags) + { + init(pStream, flags); + locate_sof_marker(); + } + + jpeg_decoder::jpeg_decoder(jpeg_decoder_stream* pStream, uint32_t flags) + { + if (::setjmp(m_jmp_state)) + return; + decode_init(pStream, flags); + } + + int jpeg_decoder::begin_decoding() + { + if (m_ready_flag) + return JPGD_SUCCESS; + + if (m_error_code) + return JPGD_FAILED; + + if (::setjmp(m_jmp_state)) + return JPGD_FAILED; + + decode_start(); + + m_ready_flag = true; + + return JPGD_SUCCESS; + } + + jpeg_decoder::~jpeg_decoder() + { + free_all_blocks(); + } + + jpeg_decoder_file_stream::jpeg_decoder_file_stream() + { + m_pFile = nullptr; + m_eof_flag = false; + m_error_flag = false; + } + + void jpeg_decoder_file_stream::close() + { + if (m_pFile) + { + fclose(m_pFile); + m_pFile = nullptr; + } + + m_eof_flag = false; + m_error_flag = false; + } + + jpeg_decoder_file_stream::~jpeg_decoder_file_stream() + { + close(); + } + + bool jpeg_decoder_file_stream::open(const char* Pfilename) + { + close(); + + m_eof_flag = false; + m_error_flag = false; #if defined(_MSC_VER) - m_pFile = NULL; - fopen_s(&m_pFile, Pfilename, "rb"); + m_pFile = nullptr; + fopen_s(&m_pFile, Pfilename, "rb"); #else - m_pFile = fopen(Pfilename, "rb"); + m_pFile = fopen(Pfilename, "rb"); #endif - return m_pFile != NULL; -} - -int jpeg_decoder_file_stream::read(uint8 *pBuf, int max_bytes_to_read, bool *pEOF_flag) -{ - if (!m_pFile) - return -1; - - if (m_eof_flag) - { - *pEOF_flag = true; - return 0; - } - - if (m_error_flag) - return -1; - - int bytes_read = static_cast<int>(fread(pBuf, 1, max_bytes_to_read, m_pFile)); - if (bytes_read < max_bytes_to_read) - { - if (ferror(m_pFile)) - { - m_error_flag = true; - return -1; - } - - m_eof_flag = true; - *pEOF_flag = true; - } - - return bytes_read; -} - -bool jpeg_decoder_mem_stream::open(const uint8 *pSrc_data, uint size) -{ - close(); - m_pSrc_data = pSrc_data; - m_ofs = 0; - m_size = size; - return true; -} - -int jpeg_decoder_mem_stream::read(uint8 *pBuf, int max_bytes_to_read, bool *pEOF_flag) -{ - *pEOF_flag = false; - - if (!m_pSrc_data) - return -1; - - uint bytes_remaining = m_size - m_ofs; - if ((uint)max_bytes_to_read > bytes_remaining) - { - max_bytes_to_read = bytes_remaining; - *pEOF_flag = true; - } - - memcpy(pBuf, m_pSrc_data + m_ofs, max_bytes_to_read); - m_ofs += max_bytes_to_read; - - return max_bytes_to_read; -} - -unsigned char *decompress_jpeg_image_from_stream(jpeg_decoder_stream *pStream, int *width, int *height, int *actual_comps, int req_comps) -{ - if (!actual_comps) - return NULL; - *actual_comps = 0; - - if ((!pStream) || (!width) || (!height) || (!req_comps)) - return NULL; - - if ((req_comps != 1) && (req_comps != 3) && (req_comps != 4)) - return NULL; - - jpeg_decoder decoder(pStream); - if (decoder.get_error_code() != JPGD_SUCCESS) - return NULL; - - const int image_width = decoder.get_width(), image_height = decoder.get_height(); - *width = image_width; - *height = image_height; - *actual_comps = decoder.get_num_components(); - - if (decoder.begin_decoding() != JPGD_SUCCESS) - return NULL; - - const int dst_bpl = image_width * req_comps; - - uint8 *pImage_data = (uint8*)jpgd_malloc(dst_bpl * image_height); - if (!pImage_data) - return NULL; - - for (int y = 0; y < image_height; y++) - { - const uint8* pScan_line; - uint scan_line_len; - if (decoder.decode((const void**)&pScan_line, &scan_line_len) != JPGD_SUCCESS) - { - jpgd_free(pImage_data); - return NULL; - } - - uint8 *pDst = pImage_data + y * dst_bpl; - - if (((req_comps == 1) && (decoder.get_num_components() == 1)) || ((req_comps == 4) && (decoder.get_num_components() == 3))) - memcpy(pDst, pScan_line, dst_bpl); - else if (decoder.get_num_components() == 1) - { - if (req_comps == 3) - { - for (int x = 0; x < image_width; x++) - { - uint8 luma = pScan_line[x]; - pDst[0] = luma; - pDst[1] = luma; - pDst[2] = luma; - pDst += 3; - } - } - else - { - for (int x = 0; x < image_width; x++) - { - uint8 luma = pScan_line[x]; - pDst[0] = luma; - pDst[1] = luma; - pDst[2] = luma; - pDst[3] = 255; - pDst += 4; - } - } - } - else if (decoder.get_num_components() == 3) - { - if (req_comps == 1) - { - const int YR = 19595, YG = 38470, YB = 7471; - for (int x = 0; x < image_width; x++) - { - int r = pScan_line[x*4+0]; - int g = pScan_line[x*4+1]; - int b = pScan_line[x*4+2]; - *pDst++ = static_cast<uint8>((r * YR + g * YG + b * YB + 32768) >> 16); - } - } - else - { - for (int x = 0; x < image_width; x++) - { - pDst[0] = pScan_line[x*4+0]; - pDst[1] = pScan_line[x*4+1]; - pDst[2] = pScan_line[x*4+2]; - pDst += 3; - } - } - } - } - - return pImage_data; -} - -unsigned char *decompress_jpeg_image_from_memory(const unsigned char *pSrc_data, int src_data_size, int *width, int *height, int *actual_comps, int req_comps) -{ - jpgd::jpeg_decoder_mem_stream mem_stream(pSrc_data, src_data_size); - return decompress_jpeg_image_from_stream(&mem_stream, width, height, actual_comps, req_comps); -} - -unsigned char *decompress_jpeg_image_from_file(const char *pSrc_filename, int *width, int *height, int *actual_comps, int req_comps) -{ - jpgd::jpeg_decoder_file_stream file_stream; - if (!file_stream.open(pSrc_filename)) - return NULL; - return decompress_jpeg_image_from_stream(&file_stream, width, height, actual_comps, req_comps); -} - -} // namespace jpgd
\ No newline at end of file + return m_pFile != nullptr; + } + + int jpeg_decoder_file_stream::read(uint8* pBuf, int max_bytes_to_read, bool* pEOF_flag) + { + if (!m_pFile) + return -1; + + if (m_eof_flag) + { + *pEOF_flag = true; + return 0; + } + + if (m_error_flag) + return -1; + + int bytes_read = static_cast<int>(fread(pBuf, 1, max_bytes_to_read, m_pFile)); + if (bytes_read < max_bytes_to_read) + { + if (ferror(m_pFile)) + { + m_error_flag = true; + return -1; + } + + m_eof_flag = true; + *pEOF_flag = true; + } + + return bytes_read; + } + + bool jpeg_decoder_mem_stream::open(const uint8* pSrc_data, uint size) + { + close(); + m_pSrc_data = pSrc_data; + m_ofs = 0; + m_size = size; + return true; + } + + int jpeg_decoder_mem_stream::read(uint8* pBuf, int max_bytes_to_read, bool* pEOF_flag) + { + *pEOF_flag = false; + + if (!m_pSrc_data) + return -1; + + uint bytes_remaining = m_size - m_ofs; + if ((uint)max_bytes_to_read > bytes_remaining) + { + max_bytes_to_read = bytes_remaining; + *pEOF_flag = true; + } + + memcpy(pBuf, m_pSrc_data + m_ofs, max_bytes_to_read); + m_ofs += max_bytes_to_read; + + return max_bytes_to_read; + } + + unsigned char* decompress_jpeg_image_from_stream(jpeg_decoder_stream* pStream, int* width, int* height, int* actual_comps, int req_comps, uint32_t flags) + { + if (!actual_comps) + return nullptr; + *actual_comps = 0; + + if ((!pStream) || (!width) || (!height) || (!req_comps)) + return nullptr; + + if ((req_comps != 1) && (req_comps != 3) && (req_comps != 4)) + return nullptr; + + jpeg_decoder decoder(pStream, flags); + if (decoder.get_error_code() != JPGD_SUCCESS) + return nullptr; + + const int image_width = decoder.get_width(), image_height = decoder.get_height(); + *width = image_width; + *height = image_height; + *actual_comps = decoder.get_num_components(); + + if (decoder.begin_decoding() != JPGD_SUCCESS) + return nullptr; + + const int dst_bpl = image_width * req_comps; + + uint8* pImage_data = (uint8*)jpgd_malloc(dst_bpl * image_height); + if (!pImage_data) + return nullptr; + + for (int y = 0; y < image_height; y++) + { + const uint8* pScan_line; + uint scan_line_len; + if (decoder.decode((const void**)&pScan_line, &scan_line_len) != JPGD_SUCCESS) + { + jpgd_free(pImage_data); + return nullptr; + } + + uint8* pDst = pImage_data + y * dst_bpl; + + if (((req_comps == 1) && (decoder.get_num_components() == 1)) || ((req_comps == 4) && (decoder.get_num_components() == 3))) + memcpy(pDst, pScan_line, dst_bpl); + else if (decoder.get_num_components() == 1) + { + if (req_comps == 3) + { + for (int x = 0; x < image_width; x++) + { + uint8 luma = pScan_line[x]; + pDst[0] = luma; + pDst[1] = luma; + pDst[2] = luma; + pDst += 3; + } + } + else + { + for (int x = 0; x < image_width; x++) + { + uint8 luma = pScan_line[x]; + pDst[0] = luma; + pDst[1] = luma; + pDst[2] = luma; + pDst[3] = 255; + pDst += 4; + } + } + } + else if (decoder.get_num_components() == 3) + { + if (req_comps == 1) + { + const int YR = 19595, YG = 38470, YB = 7471; + for (int x = 0; x < image_width; x++) + { + int r = pScan_line[x * 4 + 0]; + int g = pScan_line[x * 4 + 1]; + int b = pScan_line[x * 4 + 2]; + *pDst++ = static_cast<uint8>((r * YR + g * YG + b * YB + 32768) >> 16); + } + } + else + { + for (int x = 0; x < image_width; x++) + { + pDst[0] = pScan_line[x * 4 + 0]; + pDst[1] = pScan_line[x * 4 + 1]; + pDst[2] = pScan_line[x * 4 + 2]; + pDst += 3; + } + } + } + } + + return pImage_data; + } + + unsigned char* decompress_jpeg_image_from_memory(const unsigned char* pSrc_data, int src_data_size, int* width, int* height, int* actual_comps, int req_comps, uint32_t flags) + { + jpgd::jpeg_decoder_mem_stream mem_stream(pSrc_data, src_data_size); + return decompress_jpeg_image_from_stream(&mem_stream, width, height, actual_comps, req_comps, flags); + } + + unsigned char* decompress_jpeg_image_from_file(const char* pSrc_filename, int* width, int* height, int* actual_comps, int req_comps, uint32_t flags) + { + jpgd::jpeg_decoder_file_stream file_stream; + if (!file_stream.open(pSrc_filename)) + return nullptr; + return decompress_jpeg_image_from_stream(&file_stream, width, height, actual_comps, req_comps, flags); + } + +} // namespace jpgd diff --git a/thirdparty/jpeg-compressor/jpgd.h b/thirdparty/jpeg-compressor/jpgd.h index 150b9a0b26..39136696ba 100644 --- a/thirdparty/jpeg-compressor/jpgd.h +++ b/thirdparty/jpeg-compressor/jpgd.h @@ -1,319 +1,351 @@ // jpgd.h - C++ class for JPEG decompression. -// Public domain, Rich Geldreich <richgel99@gmail.com> +// Richard Geldreich <richgel99@gmail.com> +// See jpgd.cpp for license (Public Domain or Apache 2.0). #ifndef JPEG_DECODER_H #define JPEG_DECODER_H #include <stdlib.h> #include <stdio.h> #include <setjmp.h> +#include <assert.h> +#include <stdint.h> #ifdef _MSC_VER - #define JPGD_NORETURN __declspec(noreturn) +#define JPGD_NORETURN __declspec(noreturn) #elif defined(__GNUC__) - #define JPGD_NORETURN __attribute__ ((noreturn)) +#define JPGD_NORETURN __attribute__ ((noreturn)) #else - #define JPGD_NORETURN +#define JPGD_NORETURN #endif +#define JPGD_HUFF_TREE_MAX_LENGTH 512 +#define JPGD_HUFF_CODE_SIZE_MAX_LENGTH 256 + namespace jpgd { - typedef unsigned char uint8; - typedef signed short int16; - typedef unsigned short uint16; - typedef unsigned int uint; - typedef signed int int32; - - // Loads a JPEG image from a memory buffer or a file. - // req_comps can be 1 (grayscale), 3 (RGB), or 4 (RGBA). - // On return, width/height will be set to the image's dimensions, and actual_comps will be set to the either 1 (grayscale) or 3 (RGB). - // Notes: For more control over where and how the source data is read, see the decompress_jpeg_image_from_stream() function below, or call the jpeg_decoder class directly. - // Requesting a 8 or 32bpp image is currently a little faster than 24bpp because the jpeg_decoder class itself currently always unpacks to either 8 or 32bpp. - unsigned char *decompress_jpeg_image_from_memory(const unsigned char *pSrc_data, int src_data_size, int *width, int *height, int *actual_comps, int req_comps); - unsigned char *decompress_jpeg_image_from_file(const char *pSrc_filename, int *width, int *height, int *actual_comps, int req_comps); - - // Success/failure error codes. - enum jpgd_status - { - JPGD_SUCCESS = 0, JPGD_FAILED = -1, JPGD_DONE = 1, - JPGD_BAD_DHT_COUNTS = -256, JPGD_BAD_DHT_INDEX, JPGD_BAD_DHT_MARKER, JPGD_BAD_DQT_MARKER, JPGD_BAD_DQT_TABLE, - JPGD_BAD_PRECISION, JPGD_BAD_HEIGHT, JPGD_BAD_WIDTH, JPGD_TOO_MANY_COMPONENTS, - JPGD_BAD_SOF_LENGTH, JPGD_BAD_VARIABLE_MARKER, JPGD_BAD_DRI_LENGTH, JPGD_BAD_SOS_LENGTH, - JPGD_BAD_SOS_COMP_ID, JPGD_W_EXTRA_BYTES_BEFORE_MARKER, JPGD_NO_ARITHMITIC_SUPPORT, JPGD_UNEXPECTED_MARKER, - JPGD_NOT_JPEG, JPGD_UNSUPPORTED_MARKER, JPGD_BAD_DQT_LENGTH, JPGD_TOO_MANY_BLOCKS, - JPGD_UNDEFINED_QUANT_TABLE, JPGD_UNDEFINED_HUFF_TABLE, JPGD_NOT_SINGLE_SCAN, JPGD_UNSUPPORTED_COLORSPACE, - JPGD_UNSUPPORTED_SAMP_FACTORS, JPGD_DECODE_ERROR, JPGD_BAD_RESTART_MARKER, JPGD_ASSERTION_ERROR, - JPGD_BAD_SOS_SPECTRAL, JPGD_BAD_SOS_SUCCESSIVE, JPGD_STREAM_READ, JPGD_NOTENOUGHMEM - }; - - // Input stream interface. - // Derive from this class to read input data from sources other than files or memory. Set m_eof_flag to true when no more data is available. - // The decoder is rather greedy: it will keep on calling this method until its internal input buffer is full, or until the EOF flag is set. - // It the input stream contains data after the JPEG stream's EOI (end of image) marker it will probably be pulled into the internal buffer. - // Call the get_total_bytes_read() method to determine the actual size of the JPEG stream after successful decoding. - class jpeg_decoder_stream - { - public: - jpeg_decoder_stream() { } - virtual ~jpeg_decoder_stream() { } - - // The read() method is called when the internal input buffer is empty. - // Parameters: - // pBuf - input buffer - // max_bytes_to_read - maximum bytes that can be written to pBuf - // pEOF_flag - set this to true if at end of stream (no more bytes remaining) - // Returns -1 on error, otherwise return the number of bytes actually written to the buffer (which may be 0). - // Notes: This method will be called in a loop until you set *pEOF_flag to true or the internal buffer is full. - virtual int read(uint8 *pBuf, int max_bytes_to_read, bool *pEOF_flag) = 0; - }; - - // stdio FILE stream class. - class jpeg_decoder_file_stream : public jpeg_decoder_stream - { - jpeg_decoder_file_stream(const jpeg_decoder_file_stream &); - jpeg_decoder_file_stream &operator =(const jpeg_decoder_file_stream &); - - FILE *m_pFile; - bool m_eof_flag, m_error_flag; - - public: - jpeg_decoder_file_stream(); - virtual ~jpeg_decoder_file_stream(); - - bool open(const char *Pfilename); - void close(); - - virtual int read(uint8 *pBuf, int max_bytes_to_read, bool *pEOF_flag); - }; - - // Memory stream class. - class jpeg_decoder_mem_stream : public jpeg_decoder_stream - { - const uint8 *m_pSrc_data; - uint m_ofs, m_size; - - public: - jpeg_decoder_mem_stream() : m_pSrc_data(NULL), m_ofs(0), m_size(0) { } - jpeg_decoder_mem_stream(const uint8 *pSrc_data, uint size) : m_pSrc_data(pSrc_data), m_ofs(0), m_size(size) { } - - virtual ~jpeg_decoder_mem_stream() { } - - bool open(const uint8 *pSrc_data, uint size); - void close() { m_pSrc_data = NULL; m_ofs = 0; m_size = 0; } - - virtual int read(uint8 *pBuf, int max_bytes_to_read, bool *pEOF_flag); - }; - - // Loads JPEG file from a jpeg_decoder_stream. - unsigned char *decompress_jpeg_image_from_stream(jpeg_decoder_stream *pStream, int *width, int *height, int *actual_comps, int req_comps); - - enum - { - JPGD_IN_BUF_SIZE = 8192, JPGD_MAX_BLOCKS_PER_MCU = 10, JPGD_MAX_HUFF_TABLES = 8, JPGD_MAX_QUANT_TABLES = 4, - JPGD_MAX_COMPONENTS = 4, JPGD_MAX_COMPS_IN_SCAN = 4, JPGD_MAX_BLOCKS_PER_ROW = 8192, JPGD_MAX_HEIGHT = 16384, JPGD_MAX_WIDTH = 16384 - }; - - typedef int16 jpgd_quant_t; - typedef int16 jpgd_block_t; - - class jpeg_decoder - { - public: - // Call get_error_code() after constructing to determine if the stream is valid or not. You may call the get_width(), get_height(), etc. - // methods after the constructor is called. You may then either destruct the object, or begin decoding the image by calling begin_decoding(), then decode() on each scanline. - jpeg_decoder(jpeg_decoder_stream *pStream); - - ~jpeg_decoder(); - - // Call this method after constructing the object to begin decompression. - // If JPGD_SUCCESS is returned you may then call decode() on each scanline. - int begin_decoding(); - - // Returns the next scan line. - // For grayscale images, pScan_line will point to a buffer containing 8-bit pixels (get_bytes_per_pixel() will return 1). - // Otherwise, it will always point to a buffer containing 32-bit RGBA pixels (A will always be 255, and get_bytes_per_pixel() will return 4). - // Returns JPGD_SUCCESS if a scan line has been returned. - // Returns JPGD_DONE if all scan lines have been returned. - // Returns JPGD_FAILED if an error occurred. Call get_error_code() for a more info. - int decode(const void** pScan_line, uint* pScan_line_len); - - inline jpgd_status get_error_code() const { return m_error_code; } - - inline int get_width() const { return m_image_x_size; } - inline int get_height() const { return m_image_y_size; } - - inline int get_num_components() const { return m_comps_in_frame; } - - inline int get_bytes_per_pixel() const { return m_dest_bytes_per_pixel; } - inline int get_bytes_per_scan_line() const { return m_image_x_size * get_bytes_per_pixel(); } - - // Returns the total number of bytes actually consumed by the decoder (which should equal the actual size of the JPEG file). - inline int get_total_bytes_read() const { return m_total_bytes_read; } - - private: - jpeg_decoder(const jpeg_decoder &); - jpeg_decoder &operator =(const jpeg_decoder &); - - typedef void (*pDecode_block_func)(jpeg_decoder *, int, int, int); - - struct huff_tables - { - bool ac_table; - uint look_up[256]; - uint look_up2[256]; - uint8 code_size[256]; - uint tree[512]; - }; - - struct coeff_buf - { - uint8 *pData; - int block_num_x, block_num_y; - int block_len_x, block_len_y; - int block_size; - }; - - struct mem_block - { - mem_block *m_pNext; - size_t m_used_count; - size_t m_size; - char m_data[1]; - }; - - jmp_buf m_jmp_state; - mem_block *m_pMem_blocks; - int m_image_x_size; - int m_image_y_size; - jpeg_decoder_stream *m_pStream; - int m_progressive_flag; - uint8 m_huff_ac[JPGD_MAX_HUFF_TABLES]; - uint8* m_huff_num[JPGD_MAX_HUFF_TABLES]; // pointer to number of Huffman codes per bit size - uint8* m_huff_val[JPGD_MAX_HUFF_TABLES]; // pointer to Huffman codes per bit size - jpgd_quant_t* m_quant[JPGD_MAX_QUANT_TABLES]; // pointer to quantization tables - int m_scan_type; // Gray, Yh1v1, Yh1v2, Yh2v1, Yh2v2 (CMYK111, CMYK4114 no longer supported) - int m_comps_in_frame; // # of components in frame - int m_comp_h_samp[JPGD_MAX_COMPONENTS]; // component's horizontal sampling factor - int m_comp_v_samp[JPGD_MAX_COMPONENTS]; // component's vertical sampling factor - int m_comp_quant[JPGD_MAX_COMPONENTS]; // component's quantization table selector - int m_comp_ident[JPGD_MAX_COMPONENTS]; // component's ID - int m_comp_h_blocks[JPGD_MAX_COMPONENTS]; - int m_comp_v_blocks[JPGD_MAX_COMPONENTS]; - int m_comps_in_scan; // # of components in scan - int m_comp_list[JPGD_MAX_COMPS_IN_SCAN]; // components in this scan - int m_comp_dc_tab[JPGD_MAX_COMPONENTS]; // component's DC Huffman coding table selector - int m_comp_ac_tab[JPGD_MAX_COMPONENTS]; // component's AC Huffman coding table selector - int m_spectral_start; // spectral selection start - int m_spectral_end; // spectral selection end - int m_successive_low; // successive approximation low - int m_successive_high; // successive approximation high - int m_max_mcu_x_size; // MCU's max. X size in pixels - int m_max_mcu_y_size; // MCU's max. Y size in pixels - int m_blocks_per_mcu; - int m_max_blocks_per_row; - int m_mcus_per_row, m_mcus_per_col; - int m_mcu_org[JPGD_MAX_BLOCKS_PER_MCU]; - int m_total_lines_left; // total # lines left in image - int m_mcu_lines_left; // total # lines left in this MCU - int m_real_dest_bytes_per_scan_line; - int m_dest_bytes_per_scan_line; // rounded up - int m_dest_bytes_per_pixel; // 4 (RGB) or 1 (Y) - huff_tables* m_pHuff_tabs[JPGD_MAX_HUFF_TABLES]; - coeff_buf* m_dc_coeffs[JPGD_MAX_COMPONENTS]; - coeff_buf* m_ac_coeffs[JPGD_MAX_COMPONENTS]; - int m_eob_run; - int m_block_y_mcu[JPGD_MAX_COMPONENTS]; - uint8* m_pIn_buf_ofs; - int m_in_buf_left; - int m_tem_flag; - bool m_eof_flag; - uint8 m_in_buf_pad_start[128]; - uint8 m_in_buf[JPGD_IN_BUF_SIZE + 128]; - uint8 m_in_buf_pad_end[128]; - int m_bits_left; - uint m_bit_buf; - int m_restart_interval; - int m_restarts_left; - int m_next_restart_num; - int m_max_mcus_per_row; - int m_max_blocks_per_mcu; - int m_expanded_blocks_per_mcu; - int m_expanded_blocks_per_row; - int m_expanded_blocks_per_component; - bool m_freq_domain_chroma_upsample; - int m_max_mcus_per_col; - uint m_last_dc_val[JPGD_MAX_COMPONENTS]; - jpgd_block_t* m_pMCU_coefficients; - int m_mcu_block_max_zag[JPGD_MAX_BLOCKS_PER_MCU]; - uint8* m_pSample_buf; - int m_crr[256]; - int m_cbb[256]; - int m_crg[256]; - int m_cbg[256]; - uint8* m_pScan_line_0; - uint8* m_pScan_line_1; - jpgd_status m_error_code; - bool m_ready_flag; - int m_total_bytes_read; - - void free_all_blocks(); - JPGD_NORETURN void stop_decoding(jpgd_status status); - void *alloc(size_t n, bool zero = false); - void word_clear(void *p, uint16 c, uint n); - void prep_in_buffer(); - void read_dht_marker(); - void read_dqt_marker(); - void read_sof_marker(); - void skip_variable_marker(); - void read_dri_marker(); - void read_sos_marker(); - int next_marker(); - int process_markers(); - void locate_soi_marker(); - void locate_sof_marker(); - int locate_sos_marker(); - void init(jpeg_decoder_stream * pStream); - void create_look_ups(); - void fix_in_buffer(); - void transform_mcu(int mcu_row); - void transform_mcu_expand(int mcu_row); - coeff_buf* coeff_buf_open(int block_num_x, int block_num_y, int block_len_x, int block_len_y); - inline jpgd_block_t *coeff_buf_getp(coeff_buf *cb, int block_x, int block_y); - void load_next_row(); - void decode_next_row(); - void make_huff_table(int index, huff_tables *pH); - void check_quant_tables(); - void check_huff_tables(); - void calc_mcu_block_order(); - int init_scan(); - void init_frame(); - void process_restart(); - void decode_scan(pDecode_block_func decode_block_func); - void init_progressive(); - void init_sequential(); - void decode_start(); - void decode_init(jpeg_decoder_stream * pStream); - void H2V2Convert(); - void H2V1Convert(); - void H1V2Convert(); - void H1V1Convert(); - void gray_convert(); - void expanded_convert(); - void find_eoi(); - inline uint get_char(); - inline uint get_char(bool *pPadding_flag); - inline void stuff_char(uint8 q); - inline uint8 get_octet(); - inline uint get_bits(int num_bits); - inline uint get_bits_no_markers(int numbits); - inline int huff_decode(huff_tables *pH); - inline int huff_decode(huff_tables *pH, int& extrabits); - static inline uint8 clamp(int i); - static void decode_block_dc_first(jpeg_decoder *pD, int component_id, int block_x, int block_y); - static void decode_block_dc_refine(jpeg_decoder *pD, int component_id, int block_x, int block_y); - static void decode_block_ac_first(jpeg_decoder *pD, int component_id, int block_x, int block_y); - static void decode_block_ac_refine(jpeg_decoder *pD, int component_id, int block_x, int block_y); - }; - + typedef unsigned char uint8; + typedef signed short int16; + typedef unsigned short uint16; + typedef unsigned int uint; + typedef signed int int32; + + // Loads a JPEG image from a memory buffer or a file. + // req_comps can be 1 (grayscale), 3 (RGB), or 4 (RGBA). + // On return, width/height will be set to the image's dimensions, and actual_comps will be set to the either 1 (grayscale) or 3 (RGB). + // Notes: For more control over where and how the source data is read, see the decompress_jpeg_image_from_stream() function below, or call the jpeg_decoder class directly. + // Requesting a 8 or 32bpp image is currently a little faster than 24bpp because the jpeg_decoder class itself currently always unpacks to either 8 or 32bpp. + unsigned char* decompress_jpeg_image_from_memory(const unsigned char* pSrc_data, int src_data_size, int* width, int* height, int* actual_comps, int req_comps, uint32_t flags = 0); + unsigned char* decompress_jpeg_image_from_file(const char* pSrc_filename, int* width, int* height, int* actual_comps, int req_comps, uint32_t flags = 0); + + // Success/failure error codes. + enum jpgd_status + { + JPGD_SUCCESS = 0, JPGD_FAILED = -1, JPGD_DONE = 1, + JPGD_BAD_DHT_COUNTS = -256, JPGD_BAD_DHT_INDEX, JPGD_BAD_DHT_MARKER, JPGD_BAD_DQT_MARKER, JPGD_BAD_DQT_TABLE, + JPGD_BAD_PRECISION, JPGD_BAD_HEIGHT, JPGD_BAD_WIDTH, JPGD_TOO_MANY_COMPONENTS, + JPGD_BAD_SOF_LENGTH, JPGD_BAD_VARIABLE_MARKER, JPGD_BAD_DRI_LENGTH, JPGD_BAD_SOS_LENGTH, + JPGD_BAD_SOS_COMP_ID, JPGD_W_EXTRA_BYTES_BEFORE_MARKER, JPGD_NO_ARITHMITIC_SUPPORT, JPGD_UNEXPECTED_MARKER, + JPGD_NOT_JPEG, JPGD_UNSUPPORTED_MARKER, JPGD_BAD_DQT_LENGTH, JPGD_TOO_MANY_BLOCKS, + JPGD_UNDEFINED_QUANT_TABLE, JPGD_UNDEFINED_HUFF_TABLE, JPGD_NOT_SINGLE_SCAN, JPGD_UNSUPPORTED_COLORSPACE, + JPGD_UNSUPPORTED_SAMP_FACTORS, JPGD_DECODE_ERROR, JPGD_BAD_RESTART_MARKER, + JPGD_BAD_SOS_SPECTRAL, JPGD_BAD_SOS_SUCCESSIVE, JPGD_STREAM_READ, JPGD_NOTENOUGHMEM, JPGD_TOO_MANY_SCANS + }; + + // Input stream interface. + // Derive from this class to read input data from sources other than files or memory. Set m_eof_flag to true when no more data is available. + // The decoder is rather greedy: it will keep on calling this method until its internal input buffer is full, or until the EOF flag is set. + // It the input stream contains data after the JPEG stream's EOI (end of image) marker it will probably be pulled into the internal buffer. + // Call the get_total_bytes_read() method to determine the actual size of the JPEG stream after successful decoding. + class jpeg_decoder_stream + { + public: + jpeg_decoder_stream() { } + virtual ~jpeg_decoder_stream() { } + + // The read() method is called when the internal input buffer is empty. + // Parameters: + // pBuf - input buffer + // max_bytes_to_read - maximum bytes that can be written to pBuf + // pEOF_flag - set this to true if at end of stream (no more bytes remaining) + // Returns -1 on error, otherwise return the number of bytes actually written to the buffer (which may be 0). + // Notes: This method will be called in a loop until you set *pEOF_flag to true or the internal buffer is full. + virtual int read(uint8* pBuf, int max_bytes_to_read, bool* pEOF_flag) = 0; + }; + + // stdio FILE stream class. + class jpeg_decoder_file_stream : public jpeg_decoder_stream + { + jpeg_decoder_file_stream(const jpeg_decoder_file_stream&); + jpeg_decoder_file_stream& operator =(const jpeg_decoder_file_stream&); + + FILE* m_pFile; + bool m_eof_flag, m_error_flag; + + public: + jpeg_decoder_file_stream(); + virtual ~jpeg_decoder_file_stream(); + + bool open(const char* Pfilename); + void close(); + + virtual int read(uint8* pBuf, int max_bytes_to_read, bool* pEOF_flag); + }; + + // Memory stream class. + class jpeg_decoder_mem_stream : public jpeg_decoder_stream + { + const uint8* m_pSrc_data; + uint m_ofs, m_size; + + public: + jpeg_decoder_mem_stream() : m_pSrc_data(NULL), m_ofs(0), m_size(0) { } + jpeg_decoder_mem_stream(const uint8* pSrc_data, uint size) : m_pSrc_data(pSrc_data), m_ofs(0), m_size(size) { } + + virtual ~jpeg_decoder_mem_stream() { } + + bool open(const uint8* pSrc_data, uint size); + void close() { m_pSrc_data = NULL; m_ofs = 0; m_size = 0; } + + virtual int read(uint8* pBuf, int max_bytes_to_read, bool* pEOF_flag); + }; + + // Loads JPEG file from a jpeg_decoder_stream. + unsigned char* decompress_jpeg_image_from_stream(jpeg_decoder_stream* pStream, int* width, int* height, int* actual_comps, int req_comps, uint32_t flags = 0); + + enum + { + JPGD_IN_BUF_SIZE = 8192, JPGD_MAX_BLOCKS_PER_MCU = 10, JPGD_MAX_HUFF_TABLES = 8, JPGD_MAX_QUANT_TABLES = 4, + JPGD_MAX_COMPONENTS = 4, JPGD_MAX_COMPS_IN_SCAN = 4, JPGD_MAX_BLOCKS_PER_ROW = 16384, JPGD_MAX_HEIGHT = 32768, JPGD_MAX_WIDTH = 32768 + }; + + typedef int16 jpgd_quant_t; + typedef int16 jpgd_block_coeff_t; + + class jpeg_decoder + { + public: + enum + { + cFlagBoxChromaFiltering = 1, + cFlagDisableSIMD = 2 + }; + + // Call get_error_code() after constructing to determine if the stream is valid or not. You may call the get_width(), get_height(), etc. + // methods after the constructor is called. You may then either destruct the object, or begin decoding the image by calling begin_decoding(), then decode() on each scanline. + jpeg_decoder(jpeg_decoder_stream* pStream, uint32_t flags = 0); + + ~jpeg_decoder(); + + // Call this method after constructing the object to begin decompression. + // If JPGD_SUCCESS is returned you may then call decode() on each scanline. + + int begin_decoding(); + + // Returns the next scan line. + // For grayscale images, pScan_line will point to a buffer containing 8-bit pixels (get_bytes_per_pixel() will return 1). + // Otherwise, it will always point to a buffer containing 32-bit RGBA pixels (A will always be 255, and get_bytes_per_pixel() will return 4). + // Returns JPGD_SUCCESS if a scan line has been returned. + // Returns JPGD_DONE if all scan lines have been returned. + // Returns JPGD_FAILED if an error occurred. Call get_error_code() for a more info. + int decode(const void** pScan_line, uint* pScan_line_len); + + inline jpgd_status get_error_code() const { return m_error_code; } + + inline int get_width() const { return m_image_x_size; } + inline int get_height() const { return m_image_y_size; } + + inline int get_num_components() const { return m_comps_in_frame; } + + inline int get_bytes_per_pixel() const { return m_dest_bytes_per_pixel; } + inline int get_bytes_per_scan_line() const { return m_image_x_size * get_bytes_per_pixel(); } + + // Returns the total number of bytes actually consumed by the decoder (which should equal the actual size of the JPEG file). + inline int get_total_bytes_read() const { return m_total_bytes_read; } + + private: + jpeg_decoder(const jpeg_decoder&); + jpeg_decoder& operator =(const jpeg_decoder&); + + typedef void (*pDecode_block_func)(jpeg_decoder*, int, int, int); + + struct huff_tables + { + bool ac_table; + uint look_up[256]; + uint look_up2[256]; + uint8 code_size[JPGD_HUFF_CODE_SIZE_MAX_LENGTH]; + uint tree[JPGD_HUFF_TREE_MAX_LENGTH]; + }; + + struct coeff_buf + { + uint8* pData; + int block_num_x, block_num_y; + int block_len_x, block_len_y; + int block_size; + }; + + struct mem_block + { + mem_block* m_pNext; + size_t m_used_count; + size_t m_size; + char m_data[1]; + }; + + jmp_buf m_jmp_state; + uint32_t m_flags; + mem_block* m_pMem_blocks; + int m_image_x_size; + int m_image_y_size; + jpeg_decoder_stream* m_pStream; + + int m_progressive_flag; + + uint8 m_huff_ac[JPGD_MAX_HUFF_TABLES]; + uint8* m_huff_num[JPGD_MAX_HUFF_TABLES]; // pointer to number of Huffman codes per bit size + uint8* m_huff_val[JPGD_MAX_HUFF_TABLES]; // pointer to Huffman codes per bit size + jpgd_quant_t* m_quant[JPGD_MAX_QUANT_TABLES]; // pointer to quantization tables + int m_scan_type; // Gray, Yh1v1, Yh1v2, Yh2v1, Yh2v2 (CMYK111, CMYK4114 no longer supported) + int m_comps_in_frame; // # of components in frame + int m_comp_h_samp[JPGD_MAX_COMPONENTS]; // component's horizontal sampling factor + int m_comp_v_samp[JPGD_MAX_COMPONENTS]; // component's vertical sampling factor + int m_comp_quant[JPGD_MAX_COMPONENTS]; // component's quantization table selector + int m_comp_ident[JPGD_MAX_COMPONENTS]; // component's ID + int m_comp_h_blocks[JPGD_MAX_COMPONENTS]; + int m_comp_v_blocks[JPGD_MAX_COMPONENTS]; + int m_comps_in_scan; // # of components in scan + int m_comp_list[JPGD_MAX_COMPS_IN_SCAN]; // components in this scan + int m_comp_dc_tab[JPGD_MAX_COMPONENTS]; // component's DC Huffman coding table selector + int m_comp_ac_tab[JPGD_MAX_COMPONENTS]; // component's AC Huffman coding table selector + int m_spectral_start; // spectral selection start + int m_spectral_end; // spectral selection end + int m_successive_low; // successive approximation low + int m_successive_high; // successive approximation high + int m_max_mcu_x_size; // MCU's max. X size in pixels + int m_max_mcu_y_size; // MCU's max. Y size in pixels + int m_blocks_per_mcu; + int m_max_blocks_per_row; + int m_mcus_per_row, m_mcus_per_col; + int m_mcu_org[JPGD_MAX_BLOCKS_PER_MCU]; + int m_total_lines_left; // total # lines left in image + int m_mcu_lines_left; // total # lines left in this MCU + int m_num_buffered_scanlines; + int m_real_dest_bytes_per_scan_line; + int m_dest_bytes_per_scan_line; // rounded up + int m_dest_bytes_per_pixel; // 4 (RGB) or 1 (Y) + huff_tables* m_pHuff_tabs[JPGD_MAX_HUFF_TABLES]; + coeff_buf* m_dc_coeffs[JPGD_MAX_COMPONENTS]; + coeff_buf* m_ac_coeffs[JPGD_MAX_COMPONENTS]; + int m_eob_run; + int m_block_y_mcu[JPGD_MAX_COMPONENTS]; + uint8* m_pIn_buf_ofs; + int m_in_buf_left; + int m_tem_flag; + + uint8 m_in_buf_pad_start[64]; + uint8 m_in_buf[JPGD_IN_BUF_SIZE + 128]; + uint8 m_in_buf_pad_end[64]; + + int m_bits_left; + uint m_bit_buf; + int m_restart_interval; + int m_restarts_left; + int m_next_restart_num; + int m_max_mcus_per_row; + int m_max_blocks_per_mcu; + + int m_max_mcus_per_col; + uint m_last_dc_val[JPGD_MAX_COMPONENTS]; + jpgd_block_coeff_t* m_pMCU_coefficients; + int m_mcu_block_max_zag[JPGD_MAX_BLOCKS_PER_MCU]; + uint8* m_pSample_buf; + uint8* m_pSample_buf_prev; + int m_crr[256]; + int m_cbb[256]; + int m_crg[256]; + int m_cbg[256]; + uint8* m_pScan_line_0; + uint8* m_pScan_line_1; + jpgd_status m_error_code; + int m_total_bytes_read; + + bool m_ready_flag; + bool m_eof_flag; + bool m_sample_buf_prev_valid; + bool m_has_sse2; + + inline int check_sample_buf_ofs(int ofs) const { assert(ofs >= 0); assert(ofs < m_max_blocks_per_row * 64); return ofs; } + void free_all_blocks(); + JPGD_NORETURN void stop_decoding(jpgd_status status); + void* alloc(size_t n, bool zero = false); + void* alloc_aligned(size_t nSize, uint32_t align = 16, bool zero = false); + void word_clear(void* p, uint16 c, uint n); + void prep_in_buffer(); + void read_dht_marker(); + void read_dqt_marker(); + void read_sof_marker(); + void skip_variable_marker(); + void read_dri_marker(); + void read_sos_marker(); + int next_marker(); + int process_markers(); + void locate_soi_marker(); + void locate_sof_marker(); + int locate_sos_marker(); + void init(jpeg_decoder_stream* pStream, uint32_t flags); + void create_look_ups(); + void fix_in_buffer(); + void transform_mcu(int mcu_row); + coeff_buf* coeff_buf_open(int block_num_x, int block_num_y, int block_len_x, int block_len_y); + inline jpgd_block_coeff_t* coeff_buf_getp(coeff_buf* cb, int block_x, int block_y); + void load_next_row(); + void decode_next_row(); + void make_huff_table(int index, huff_tables* pH); + void check_quant_tables(); + void check_huff_tables(); + bool calc_mcu_block_order(); + int init_scan(); + void init_frame(); + void process_restart(); + void decode_scan(pDecode_block_func decode_block_func); + void init_progressive(); + void init_sequential(); + void decode_start(); + void decode_init(jpeg_decoder_stream* pStream, uint32_t flags); + void H2V2Convert(); + uint32_t H2V2ConvertFiltered(); + void H2V1Convert(); + void H2V1ConvertFiltered(); + void H1V2Convert(); + void H1V2ConvertFiltered(); + void H1V1Convert(); + void gray_convert(); + void find_eoi(); + inline uint get_char(); + inline uint get_char(bool* pPadding_flag); + inline void stuff_char(uint8 q); + inline uint8 get_octet(); + inline uint get_bits(int num_bits); + inline uint get_bits_no_markers(int numbits); + inline int huff_decode(huff_tables* pH); + inline int huff_decode(huff_tables* pH, int& extrabits); + + // Clamps a value between 0-255. + static inline uint8 clamp(int i) + { + if (static_cast<uint>(i) > 255) + i = (((~i) >> 31) & 0xFF); + return static_cast<uint8>(i); + } + int decode_next_mcu_row(); + + static void decode_block_dc_first(jpeg_decoder* pD, int component_id, int block_x, int block_y); + static void decode_block_dc_refine(jpeg_decoder* pD, int component_id, int block_x, int block_y); + static void decode_block_ac_first(jpeg_decoder* pD, int component_id, int block_x, int block_y); + static void decode_block_ac_refine(jpeg_decoder* pD, int component_id, int block_x, int block_y); + }; + } // namespace jpgd #endif // JPEG_DECODER_H diff --git a/thirdparty/jpeg-compressor/jpgd_idct.h b/thirdparty/jpeg-compressor/jpgd_idct.h new file mode 100644 index 0000000000..876425a959 --- /dev/null +++ b/thirdparty/jpeg-compressor/jpgd_idct.h @@ -0,0 +1,462 @@ +// Copyright 2009 Intel Corporation +// All Rights Reserved +// +// Permission is granted to use, copy, distribute and prepare derivative works of this +// software for any purpose and without fee, provided, that the above copyright notice +// and this statement appear in all copies. Intel makes no representations about the +// suitability of this software for any purpose. THIS SOFTWARE IS PROVIDED "AS IS." +// INTEL SPECIFICALLY DISCLAIMS ALL WARRANTIES, EXPRESS OR IMPLIED, AND ALL LIABILITY, +// INCLUDING CONSEQUENTIAL AND OTHER INDIRECT DAMAGES, FOR THE USE OF THIS SOFTWARE, +// INCLUDING LIABILITY FOR INFRINGEMENT OF ANY PROPRIETARY RIGHTS, AND INCLUDING THE +// WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. Intel does not +// assume any responsibility for any errors which may appear in this software nor any +// responsibility to update it. +// +// From: +// https://software.intel.com/sites/default/files/m/d/4/1/d/8/UsingIntelAVXToImplementIDCT-r1_5.pdf +// https://software.intel.com/file/29048 +// +// Requires SSE +// +#ifdef _MSC_VER +#include <intrin.h> +#endif +#include <immintrin.h> + +#ifdef _MSC_VER + #define JPGD_SIMD_ALIGN(type, name) __declspec(align(16)) type name +#else + #define JPGD_SIMD_ALIGN(type, name) type name __attribute__((aligned(16))) +#endif + +#define BITS_INV_ACC 4 +#define SHIFT_INV_ROW 16 - BITS_INV_ACC +#define SHIFT_INV_COL 1 + BITS_INV_ACC +const short IRND_INV_ROW = 1024 * (6 - BITS_INV_ACC); //1 << (SHIFT_INV_ROW-1) +const short IRND_INV_COL = 16 * (BITS_INV_ACC - 3); // 1 << (SHIFT_INV_COL-1) +const short IRND_INV_CORR = IRND_INV_COL - 1; // correction -1.0 and round + +JPGD_SIMD_ALIGN(short, shortM128_one_corr[8]) = {1, 1, 1, 1, 1, 1, 1, 1}; +JPGD_SIMD_ALIGN(short, shortM128_round_inv_row[8]) = {IRND_INV_ROW, 0, IRND_INV_ROW, 0, IRND_INV_ROW, 0, IRND_INV_ROW, 0}; +JPGD_SIMD_ALIGN(short, shortM128_round_inv_col[8]) = {IRND_INV_COL, IRND_INV_COL, IRND_INV_COL, IRND_INV_COL, IRND_INV_COL, IRND_INV_COL, IRND_INV_COL, IRND_INV_COL}; +JPGD_SIMD_ALIGN(short, shortM128_round_inv_corr[8])= {IRND_INV_CORR, IRND_INV_CORR, IRND_INV_CORR, IRND_INV_CORR, IRND_INV_CORR, IRND_INV_CORR, IRND_INV_CORR, IRND_INV_CORR}; +JPGD_SIMD_ALIGN(short, shortM128_tg_1_16[8]) = {13036, 13036, 13036, 13036, 13036, 13036, 13036, 13036}; // tg * (2<<16) + 0.5 +JPGD_SIMD_ALIGN(short, shortM128_tg_2_16[8]) = {27146, 27146, 27146, 27146, 27146, 27146, 27146, 27146}; // tg * (2<<16) + 0.5 +JPGD_SIMD_ALIGN(short, shortM128_tg_3_16[8]) = {-21746, -21746, -21746, -21746, -21746, -21746, -21746, -21746}; // tg * (2<<16) + 0.5 +JPGD_SIMD_ALIGN(short, shortM128_cos_4_16[8]) = {-19195, -19195, -19195, -19195, -19195, -19195, -19195, -19195};// cos * (2<<16) + 0.5 + +//----------------------------------------------------------------------------- +// Table for rows 0,4 - constants are multiplied on cos_4_16 +// w15 w14 w11 w10 w07 w06 w03 w02 +// w29 w28 w25 w24 w21 w20 w17 w16 +// w31 w30 w27 w26 w23 w22 w19 w18 +//movq -> w05 w04 w01 w00 +JPGD_SIMD_ALIGN(short, shortM128_tab_i_04[]) = { + 16384, 21407, 16384, 8867, + 16384, -8867, 16384, -21407, // w13 w12 w09 w08 + 16384, 8867, -16384, -21407, // w07 w06 w03 w02 + -16384, 21407, 16384, -8867, // w15 w14 w11 w10 + 22725, 19266, 19266, -4520, // w21 w20 w17 w16 + 12873, -22725, 4520, -12873, // w29 w28 w25 w24 + 12873, 4520, -22725, -12873, // w23 w22 w19 w18 + 4520, 19266, 19266, -22725}; // w31 w30 w27 w26 + + // Table for rows 1,7 - constants are multiplied on cos_1_16 +//movq -> w05 w04 w01 w00 +JPGD_SIMD_ALIGN(short, shortM128_tab_i_17[]) = { + 22725, 29692, 22725, 12299, + 22725, -12299, 22725, -29692, // w13 w12 w09 w08 + 22725, 12299, -22725, -29692, // w07 w06 w03 w02 + -22725, 29692, 22725, -12299, // w15 w14 w11 w10 + 31521, 26722, 26722, -6270, // w21 w20 w17 w16 + 17855, -31521, 6270, -17855, // w29 w28 w25 w24 + 17855, 6270, -31521, -17855, // w23 w22 w19 w18 + 6270, 26722, 26722, -31521}; // w31 w30 w27 w26 + +// Table for rows 2,6 - constants are multiplied on cos_2_16 +//movq -> w05 w04 w01 w00 +JPGD_SIMD_ALIGN(short, shortM128_tab_i_26[]) = { + 21407, 27969, 21407, 11585, + 21407, -11585, 21407, -27969, // w13 w12 w09 w08 + 21407, 11585, -21407, -27969, // w07 w06 w03 w02 + -21407, 27969, 21407, -11585, // w15 w14 w11 w10 + 29692, 25172, 25172, -5906, // w21 w20 w17 w16 + 16819, -29692, 5906, -16819, // w29 w28 w25 w24 + 16819, 5906, -29692, -16819, // w23 w22 w19 w18 + 5906, 25172, 25172, -29692}; // w31 w30 w27 w26 +// Table for rows 3,5 - constants are multiplied on cos_3_16 +//movq -> w05 w04 w01 w00 +JPGD_SIMD_ALIGN(short, shortM128_tab_i_35[]) = { + 19266, 25172, 19266, 10426, + 19266, -10426, 19266, -25172, // w13 w12 w09 w08 + 19266, 10426, -19266, -25172, // w07 w06 w03 w02 + -19266, 25172, 19266, -10426, // w15 w14 w11 w10 + 26722, 22654, 22654, -5315, // w21 w20 w17 w16 + 15137, -26722, 5315, -15137, // w29 w28 w25 w24 + 15137, 5315, -26722, -15137, // w23 w22 w19 w18 + 5315, 22654, 22654, -26722}; // w31 w30 w27 w26 + +JPGD_SIMD_ALIGN(short, shortM128_128[8]) = { 128, 128, 128, 128, 128, 128, 128, 128 }; + +void idctSSEShortU8(const short *pInput, uint8_t * pOutputUB) +{ + __m128i r_xmm0, r_xmm4; + __m128i r_xmm1, r_xmm2, r_xmm3, r_xmm5, r_xmm6, r_xmm7; + __m128i row0, row1, row2, row3, row4, row5, row6, row7; + short * pTab_i_04 = shortM128_tab_i_04; + short * pTab_i_26 = shortM128_tab_i_26; + + //Get pointers for this input and output + pTab_i_04 = shortM128_tab_i_04; + pTab_i_26 = shortM128_tab_i_26; + + //Row 1 and Row 3 + r_xmm0 = _mm_load_si128((__m128i *) pInput); + r_xmm4 = _mm_load_si128((__m128i *) (&pInput[2*8])); + + // *** Work on the data in xmm0 + //low shuffle mask = 0xd8 = 11 01 10 00 + //get short 2 and short 0 into ls 32-bits + r_xmm0 = _mm_shufflelo_epi16(r_xmm0, 0xd8); + + // copy short 2 and short 0 to all locations + r_xmm1 = _mm_shuffle_epi32(r_xmm0, 0); + + // add to those copies + r_xmm1 = _mm_madd_epi16(r_xmm1, *((__m128i *) pTab_i_04)); + + // shuffle mask = 0x55 = 01 01 01 01 + // copy short 3 and short 1 to all locations + r_xmm3 = _mm_shuffle_epi32(r_xmm0, 0x55); + + // high shuffle mask = 0xd8 = 11 01 10 00 + // get short 6 and short 4 into bit positions 64-95 + // get short 7 and short 5 into bit positions 96-127 + r_xmm0 = _mm_shufflehi_epi16(r_xmm0, 0xd8); + + // add to short 3 and short 1 + r_xmm3 = _mm_madd_epi16(r_xmm3, *((__m128i *) &pTab_i_04[16])); + + // shuffle mask = 0xaa = 10 10 10 10 + // copy short 6 and short 4 to all locations + r_xmm2 = _mm_shuffle_epi32(r_xmm0, 0xaa); + + // shuffle mask = 0xaa = 11 11 11 11 + // copy short 7 and short 5 to all locations + r_xmm0 = _mm_shuffle_epi32(r_xmm0, 0xff); + + // add to short 6 and short 4 + r_xmm2 = _mm_madd_epi16(r_xmm2, *((__m128i *) &pTab_i_04[8])); + + // *** Work on the data in xmm4 + // high shuffle mask = 0xd8 11 01 10 00 + // get short 6 and short 4 into bit positions 64-95 + // get short 7 and short 5 into bit positions 96-127 + r_xmm4 = _mm_shufflehi_epi16(r_xmm4, 0xd8); + + // (xmm0 short 2 and short 0 plus pSi) + some constants + r_xmm1 = _mm_add_epi32(r_xmm1, *((__m128i *) shortM128_round_inv_row)); + r_xmm4 = _mm_shufflelo_epi16(r_xmm4, 0xd8); + r_xmm0 = _mm_madd_epi16(r_xmm0, *((__m128i *) &pTab_i_04[24])); + r_xmm5 = _mm_shuffle_epi32(r_xmm4, 0); + r_xmm6 = _mm_shuffle_epi32(r_xmm4, 0xaa); + r_xmm5 = _mm_madd_epi16(r_xmm5, *((__m128i *) &shortM128_tab_i_26[0])); + r_xmm1 = _mm_add_epi32(r_xmm1, r_xmm2); + r_xmm2 = r_xmm1; + r_xmm7 = _mm_shuffle_epi32(r_xmm4, 0x55); + r_xmm6 = _mm_madd_epi16(r_xmm6, *((__m128i *) &shortM128_tab_i_26[8])); + r_xmm0 = _mm_add_epi32(r_xmm0, r_xmm3); + r_xmm4 = _mm_shuffle_epi32(r_xmm4, 0xff); + r_xmm2 = _mm_sub_epi32(r_xmm2, r_xmm0); + r_xmm7 = _mm_madd_epi16(r_xmm7, *((__m128i *) &shortM128_tab_i_26[16])); + r_xmm0 = _mm_add_epi32(r_xmm0, r_xmm1); + r_xmm2 = _mm_srai_epi32(r_xmm2, 12); + r_xmm5 = _mm_add_epi32(r_xmm5, *((__m128i *) shortM128_round_inv_row)); + r_xmm4 = _mm_madd_epi16(r_xmm4, *((__m128i *) &shortM128_tab_i_26[24])); + r_xmm5 = _mm_add_epi32(r_xmm5, r_xmm6); + r_xmm6 = r_xmm5; + r_xmm0 = _mm_srai_epi32(r_xmm0, 12); + r_xmm2 = _mm_shuffle_epi32(r_xmm2, 0x1b); + row0 = _mm_packs_epi32(r_xmm0, r_xmm2); + r_xmm4 = _mm_add_epi32(r_xmm4, r_xmm7); + r_xmm6 = _mm_sub_epi32(r_xmm6, r_xmm4); + r_xmm4 = _mm_add_epi32(r_xmm4, r_xmm5); + r_xmm6 = _mm_srai_epi32(r_xmm6, 12); + r_xmm4 = _mm_srai_epi32(r_xmm4, 12); + r_xmm6 = _mm_shuffle_epi32(r_xmm6, 0x1b); + row2 = _mm_packs_epi32(r_xmm4, r_xmm6); + + //Row 5 and row 7 + r_xmm0 = _mm_load_si128((__m128i *) (&pInput[4*8])); + r_xmm4 = _mm_load_si128((__m128i *) (&pInput[6*8])); + + r_xmm0 = _mm_shufflelo_epi16(r_xmm0, 0xd8); + r_xmm1 = _mm_shuffle_epi32(r_xmm0, 0); + r_xmm1 = _mm_madd_epi16(r_xmm1, *((__m128i *) pTab_i_04)); + r_xmm3 = _mm_shuffle_epi32(r_xmm0, 0x55); + r_xmm0 = _mm_shufflehi_epi16(r_xmm0, 0xd8); + r_xmm3 = _mm_madd_epi16(r_xmm3, *((__m128i *) &pTab_i_04[16])); + r_xmm2 = _mm_shuffle_epi32(r_xmm0, 0xaa); + r_xmm0 = _mm_shuffle_epi32(r_xmm0, 0xff); + r_xmm2 = _mm_madd_epi16(r_xmm2, *((__m128i *) &pTab_i_04[8])); + r_xmm4 = _mm_shufflehi_epi16(r_xmm4, 0xd8); + r_xmm1 = _mm_add_epi32(r_xmm1, *((__m128i *) shortM128_round_inv_row)); + r_xmm4 = _mm_shufflelo_epi16(r_xmm4, 0xd8); + r_xmm0 = _mm_madd_epi16(r_xmm0, *((__m128i *) &pTab_i_04[24])); + r_xmm5 = _mm_shuffle_epi32(r_xmm4, 0); + r_xmm6 = _mm_shuffle_epi32(r_xmm4, 0xaa); + r_xmm5 = _mm_madd_epi16(r_xmm5, *((__m128i *) &shortM128_tab_i_26[0])); + r_xmm1 = _mm_add_epi32(r_xmm1, r_xmm2); + r_xmm2 = r_xmm1; + r_xmm7 = _mm_shuffle_epi32(r_xmm4, 0x55); + r_xmm6 = _mm_madd_epi16(r_xmm6, *((__m128i *) &shortM128_tab_i_26[8])); + r_xmm0 = _mm_add_epi32(r_xmm0, r_xmm3); + r_xmm4 = _mm_shuffle_epi32(r_xmm4, 0xff); + r_xmm2 = _mm_sub_epi32(r_xmm2, r_xmm0); + r_xmm7 = _mm_madd_epi16(r_xmm7, *((__m128i *) &shortM128_tab_i_26[16])); + r_xmm0 = _mm_add_epi32(r_xmm0, r_xmm1); + r_xmm2 = _mm_srai_epi32(r_xmm2, 12); + r_xmm5 = _mm_add_epi32(r_xmm5, *((__m128i *) shortM128_round_inv_row)); + r_xmm4 = _mm_madd_epi16(r_xmm4, *((__m128i *) &shortM128_tab_i_26[24])); + r_xmm5 = _mm_add_epi32(r_xmm5, r_xmm6); + r_xmm6 = r_xmm5; + r_xmm0 = _mm_srai_epi32(r_xmm0, 12); + r_xmm2 = _mm_shuffle_epi32(r_xmm2, 0x1b); + row4 = _mm_packs_epi32(r_xmm0, r_xmm2); + r_xmm4 = _mm_add_epi32(r_xmm4, r_xmm7); + r_xmm6 = _mm_sub_epi32(r_xmm6, r_xmm4); + r_xmm4 = _mm_add_epi32(r_xmm4, r_xmm5); + r_xmm6 = _mm_srai_epi32(r_xmm6, 12); + r_xmm4 = _mm_srai_epi32(r_xmm4, 12); + r_xmm6 = _mm_shuffle_epi32(r_xmm6, 0x1b); + row6 = _mm_packs_epi32(r_xmm4, r_xmm6); + + //Row 4 and row 2 + pTab_i_04 = shortM128_tab_i_35; + pTab_i_26 = shortM128_tab_i_17; + r_xmm0 = _mm_load_si128((__m128i *) (&pInput[3*8])); + r_xmm4 = _mm_load_si128((__m128i *) (&pInput[1*8])); + + r_xmm0 = _mm_shufflelo_epi16(r_xmm0, 0xd8); + r_xmm1 = _mm_shuffle_epi32(r_xmm0, 0); + r_xmm1 = _mm_madd_epi16(r_xmm1, *((__m128i *) pTab_i_04)); + r_xmm3 = _mm_shuffle_epi32(r_xmm0, 0x55); + r_xmm0 = _mm_shufflehi_epi16(r_xmm0, 0xd8); + r_xmm3 = _mm_madd_epi16(r_xmm3, *((__m128i *) &pTab_i_04[16])); + r_xmm2 = _mm_shuffle_epi32(r_xmm0, 0xaa); + r_xmm0 = _mm_shuffle_epi32(r_xmm0, 0xff); + r_xmm2 = _mm_madd_epi16(r_xmm2, *((__m128i *) &pTab_i_04[8])); + r_xmm4 = _mm_shufflehi_epi16(r_xmm4, 0xd8); + r_xmm1 = _mm_add_epi32(r_xmm1, *((__m128i *) shortM128_round_inv_row)); + r_xmm4 = _mm_shufflelo_epi16(r_xmm4, 0xd8); + r_xmm0 = _mm_madd_epi16(r_xmm0, *((__m128i *) &pTab_i_04[24])); + r_xmm5 = _mm_shuffle_epi32(r_xmm4, 0); + r_xmm6 = _mm_shuffle_epi32(r_xmm4, 0xaa); + r_xmm5 = _mm_madd_epi16(r_xmm5, *((__m128i *) &pTab_i_26[0])); + r_xmm1 = _mm_add_epi32(r_xmm1, r_xmm2); + r_xmm2 = r_xmm1; + r_xmm7 = _mm_shuffle_epi32(r_xmm4, 0x55); + r_xmm6 = _mm_madd_epi16(r_xmm6, *((__m128i *) &pTab_i_26[8])); + r_xmm0 = _mm_add_epi32(r_xmm0, r_xmm3); + r_xmm4 = _mm_shuffle_epi32(r_xmm4, 0xff); + r_xmm2 = _mm_sub_epi32(r_xmm2, r_xmm0); + r_xmm7 = _mm_madd_epi16(r_xmm7, *((__m128i *) &pTab_i_26[16])); + r_xmm0 = _mm_add_epi32(r_xmm0, r_xmm1); + r_xmm2 = _mm_srai_epi32(r_xmm2, 12); + r_xmm5 = _mm_add_epi32(r_xmm5, *((__m128i *) shortM128_round_inv_row)); + r_xmm4 = _mm_madd_epi16(r_xmm4, *((__m128i *) &pTab_i_26[24])); + r_xmm5 = _mm_add_epi32(r_xmm5, r_xmm6); + r_xmm6 = r_xmm5; + r_xmm0 = _mm_srai_epi32(r_xmm0, 12); + r_xmm2 = _mm_shuffle_epi32(r_xmm2, 0x1b); + row3 = _mm_packs_epi32(r_xmm0, r_xmm2); + r_xmm4 = _mm_add_epi32(r_xmm4, r_xmm7); + r_xmm6 = _mm_sub_epi32(r_xmm6, r_xmm4); + r_xmm4 = _mm_add_epi32(r_xmm4, r_xmm5); + r_xmm6 = _mm_srai_epi32(r_xmm6, 12); + r_xmm4 = _mm_srai_epi32(r_xmm4, 12); + r_xmm6 = _mm_shuffle_epi32(r_xmm6, 0x1b); + row1 = _mm_packs_epi32(r_xmm4, r_xmm6); + + //Row 6 and row 8 + r_xmm0 = _mm_load_si128((__m128i *) (&pInput[5*8])); + r_xmm4 = _mm_load_si128((__m128i *) (&pInput[7*8])); + + r_xmm0 = _mm_shufflelo_epi16(r_xmm0, 0xd8); + r_xmm1 = _mm_shuffle_epi32(r_xmm0, 0); + r_xmm1 = _mm_madd_epi16(r_xmm1, *((__m128i *) pTab_i_04)); + r_xmm3 = _mm_shuffle_epi32(r_xmm0, 0x55); + r_xmm0 = _mm_shufflehi_epi16(r_xmm0, 0xd8); + r_xmm3 = _mm_madd_epi16(r_xmm3, *((__m128i *) &pTab_i_04[16])); + r_xmm2 = _mm_shuffle_epi32(r_xmm0, 0xaa); + r_xmm0 = _mm_shuffle_epi32(r_xmm0, 0xff); + r_xmm2 = _mm_madd_epi16(r_xmm2, *((__m128i *) &pTab_i_04[8])); + r_xmm4 = _mm_shufflehi_epi16(r_xmm4, 0xd8); + r_xmm1 = _mm_add_epi32(r_xmm1, *((__m128i *) shortM128_round_inv_row)); + r_xmm4 = _mm_shufflelo_epi16(r_xmm4, 0xd8); + r_xmm0 = _mm_madd_epi16(r_xmm0, *((__m128i *) &pTab_i_04[24])); + r_xmm5 = _mm_shuffle_epi32(r_xmm4, 0); + r_xmm6 = _mm_shuffle_epi32(r_xmm4, 0xaa); + r_xmm5 = _mm_madd_epi16(r_xmm5, *((__m128i *) &pTab_i_26[0])); + r_xmm1 = _mm_add_epi32(r_xmm1, r_xmm2); + r_xmm2 = r_xmm1; + r_xmm7 = _mm_shuffle_epi32(r_xmm4, 0x55); + r_xmm6 = _mm_madd_epi16(r_xmm6, *((__m128i *) &pTab_i_26[8])); + r_xmm0 = _mm_add_epi32(r_xmm0, r_xmm3); + r_xmm4 = _mm_shuffle_epi32(r_xmm4, 0xff); + r_xmm2 = _mm_sub_epi32(r_xmm2, r_xmm0); + r_xmm7 = _mm_madd_epi16(r_xmm7, *((__m128i *) &pTab_i_26[16])); + r_xmm0 = _mm_add_epi32(r_xmm0, r_xmm1); + r_xmm2 = _mm_srai_epi32(r_xmm2, 12); + r_xmm5 = _mm_add_epi32(r_xmm5, *((__m128i *) shortM128_round_inv_row)); + r_xmm4 = _mm_madd_epi16(r_xmm4, *((__m128i *) &pTab_i_26[24])); + r_xmm5 = _mm_add_epi32(r_xmm5, r_xmm6); + r_xmm6 = r_xmm5; + r_xmm0 = _mm_srai_epi32(r_xmm0, 12); + r_xmm2 = _mm_shuffle_epi32(r_xmm2, 0x1b); + row5 = _mm_packs_epi32(r_xmm0, r_xmm2); + r_xmm4 = _mm_add_epi32(r_xmm4, r_xmm7); + r_xmm6 = _mm_sub_epi32(r_xmm6, r_xmm4); + r_xmm4 = _mm_add_epi32(r_xmm4, r_xmm5); + r_xmm6 = _mm_srai_epi32(r_xmm6, 12); + r_xmm4 = _mm_srai_epi32(r_xmm4, 12); + r_xmm6 = _mm_shuffle_epi32(r_xmm6, 0x1b); + row7 = _mm_packs_epi32(r_xmm4, r_xmm6); + + r_xmm1 = _mm_load_si128((__m128i *) shortM128_tg_3_16); + r_xmm2 = row5; + r_xmm3 = row3; + r_xmm0 = _mm_mulhi_epi16(row5, r_xmm1); + + r_xmm1 = _mm_mulhi_epi16(r_xmm1, r_xmm3); + r_xmm5 = _mm_load_si128((__m128i *) shortM128_tg_1_16); + r_xmm6 = row7; + r_xmm4 = _mm_mulhi_epi16(row7, r_xmm5); + + r_xmm0 = _mm_adds_epi16(r_xmm0, r_xmm2); + r_xmm5 = _mm_mulhi_epi16(r_xmm5, row1); + r_xmm1 = _mm_adds_epi16(r_xmm1, r_xmm3); + r_xmm7 = row6; + + r_xmm0 = _mm_adds_epi16(r_xmm0, r_xmm3); + r_xmm3 = _mm_load_si128((__m128i *) shortM128_tg_2_16); + r_xmm2 = _mm_subs_epi16(r_xmm2, r_xmm1); + r_xmm7 = _mm_mulhi_epi16(r_xmm7, r_xmm3); + r_xmm1 = r_xmm0; + r_xmm3 = _mm_mulhi_epi16(r_xmm3, row2); + r_xmm5 = _mm_subs_epi16(r_xmm5, r_xmm6); + r_xmm4 = _mm_adds_epi16(r_xmm4, row1); + r_xmm0 = _mm_adds_epi16(r_xmm0, r_xmm4); + r_xmm0 = _mm_adds_epi16(r_xmm0, *((__m128i *) shortM128_one_corr)); + r_xmm4 = _mm_subs_epi16(r_xmm4, r_xmm1); + r_xmm6 = r_xmm5; + r_xmm5 = _mm_subs_epi16(r_xmm5, r_xmm2); + r_xmm5 = _mm_adds_epi16(r_xmm5, *((__m128i *) shortM128_one_corr)); + r_xmm6 = _mm_adds_epi16(r_xmm6, r_xmm2); + + //Intermediate results, needed later + __m128i temp3, temp7; + temp7 = r_xmm0; + + r_xmm1 = r_xmm4; + r_xmm0 = _mm_load_si128((__m128i *) shortM128_cos_4_16); + r_xmm4 = _mm_adds_epi16(r_xmm4, r_xmm5); + r_xmm2 = _mm_load_si128((__m128i *) shortM128_cos_4_16); + r_xmm2 = _mm_mulhi_epi16(r_xmm2, r_xmm4); + + //Intermediate results, needed later + temp3 = r_xmm6; + + r_xmm1 = _mm_subs_epi16(r_xmm1, r_xmm5); + r_xmm7 = _mm_adds_epi16(r_xmm7, row2); + r_xmm3 = _mm_subs_epi16(r_xmm3, row6); + r_xmm6 = row0; + r_xmm0 = _mm_mulhi_epi16(r_xmm0, r_xmm1); + r_xmm5 = row4; + r_xmm5 = _mm_adds_epi16(r_xmm5, r_xmm6); + r_xmm6 = _mm_subs_epi16(r_xmm6, row4); + r_xmm4 = _mm_adds_epi16(r_xmm4, r_xmm2); + + r_xmm4 = _mm_or_si128(r_xmm4, *((__m128i *) shortM128_one_corr)); + r_xmm0 = _mm_adds_epi16(r_xmm0, r_xmm1); + r_xmm0 = _mm_or_si128(r_xmm0, *((__m128i *) shortM128_one_corr)); + + r_xmm2 = r_xmm5; + r_xmm5 = _mm_adds_epi16(r_xmm5, r_xmm7); + r_xmm1 = r_xmm6; + r_xmm5 = _mm_adds_epi16(r_xmm5, *((__m128i *) shortM128_round_inv_col)); + r_xmm2 = _mm_subs_epi16(r_xmm2, r_xmm7); + r_xmm7 = temp7; + r_xmm6 = _mm_adds_epi16(r_xmm6, r_xmm3); + r_xmm6 = _mm_adds_epi16(r_xmm6, *((__m128i *) shortM128_round_inv_col)); + r_xmm7 = _mm_adds_epi16(r_xmm7, r_xmm5); + r_xmm7 = _mm_srai_epi16(r_xmm7, SHIFT_INV_COL); + r_xmm1 = _mm_subs_epi16(r_xmm1, r_xmm3); + r_xmm1 = _mm_adds_epi16(r_xmm1, *((__m128i *) shortM128_round_inv_corr)); + r_xmm3 = r_xmm6; + r_xmm2 = _mm_adds_epi16(r_xmm2, *((__m128i *) shortM128_round_inv_corr)); + r_xmm6 = _mm_adds_epi16(r_xmm6, r_xmm4); + + //Store results for row 0 + //_mm_store_si128((__m128i *) pOutput, r_xmm7); + __m128i r0 = r_xmm7; + + r_xmm6 = _mm_srai_epi16(r_xmm6, SHIFT_INV_COL); + r_xmm7 = r_xmm1; + r_xmm1 = _mm_adds_epi16(r_xmm1, r_xmm0); + + //Store results for row 1 + //_mm_store_si128((__m128i *) (&pOutput[1*8]), r_xmm6); + __m128i r1 = r_xmm6; + + r_xmm1 = _mm_srai_epi16(r_xmm1, SHIFT_INV_COL); + r_xmm6 = temp3; + r_xmm7 = _mm_subs_epi16(r_xmm7, r_xmm0); + r_xmm7 = _mm_srai_epi16(r_xmm7, SHIFT_INV_COL); + + //Store results for row 2 + //_mm_store_si128((__m128i *) (&pOutput[2*8]), r_xmm1); + __m128i r2 = r_xmm1; + + r_xmm5 = _mm_subs_epi16(r_xmm5, temp7); + r_xmm5 = _mm_srai_epi16(r_xmm5, SHIFT_INV_COL); + + //Store results for row 7 + //_mm_store_si128((__m128i *) (&pOutput[7*8]), r_xmm5); + __m128i r7 = r_xmm5; + + r_xmm3 = _mm_subs_epi16(r_xmm3, r_xmm4); + r_xmm6 = _mm_adds_epi16(r_xmm6, r_xmm2); + r_xmm2 = _mm_subs_epi16(r_xmm2, temp3); + r_xmm6 = _mm_srai_epi16(r_xmm6, SHIFT_INV_COL); + r_xmm2 = _mm_srai_epi16(r_xmm2, SHIFT_INV_COL); + + //Store results for row 3 + //_mm_store_si128((__m128i *) (&pOutput[3*8]), r_xmm6); + __m128i r3 = r_xmm6; + + r_xmm3 = _mm_srai_epi16(r_xmm3, SHIFT_INV_COL); + + //Store results for rows 4, 5, and 6 + //_mm_store_si128((__m128i *) (&pOutput[4*8]), r_xmm2); + //_mm_store_si128((__m128i *) (&pOutput[5*8]), r_xmm7); + //_mm_store_si128((__m128i *) (&pOutput[6*8]), r_xmm3); + + __m128i r4 = r_xmm2; + __m128i r5 = r_xmm7; + __m128i r6 = r_xmm3; + + r0 = _mm_add_epi16(*(const __m128i *)shortM128_128, r0); + r1 = _mm_add_epi16(*(const __m128i *)shortM128_128, r1); + r2 = _mm_add_epi16(*(const __m128i *)shortM128_128, r2); + r3 = _mm_add_epi16(*(const __m128i *)shortM128_128, r3); + r4 = _mm_add_epi16(*(const __m128i *)shortM128_128, r4); + r5 = _mm_add_epi16(*(const __m128i *)shortM128_128, r5); + r6 = _mm_add_epi16(*(const __m128i *)shortM128_128, r6); + r7 = _mm_add_epi16(*(const __m128i *)shortM128_128, r7); + + ((__m128i *)pOutputUB)[0] = _mm_packus_epi16(r0, r1); + ((__m128i *)pOutputUB)[1] = _mm_packus_epi16(r2, r3); + ((__m128i *)pOutputUB)[2] = _mm_packus_epi16(r4, r5); + ((__m128i *)pOutputUB)[3] = _mm_packus_epi16(r6, r7); +} diff --git a/thirdparty/jpeg-compressor/patches/fix-msvc2017-build.patch b/thirdparty/jpeg-compressor/patches/fix-msvc2017-build.patch new file mode 100644 index 0000000000..7b338de084 --- /dev/null +++ b/thirdparty/jpeg-compressor/patches/fix-msvc2017-build.patch @@ -0,0 +1,31 @@ +diff --git a/thirdparty/jpeg-compressor/jpgd.cpp b/thirdparty/jpeg-compressor/jpgd.cpp +index a0c494db61..257d0b7574 100644 +--- a/thirdparty/jpeg-compressor/jpgd.cpp ++++ b/thirdparty/jpeg-compressor/jpgd.cpp +@@ -2126,7 +2126,7 @@ namespace jpgd { + + int jpeg_decoder::decode_next_mcu_row() + { +- if (setjmp(m_jmp_state)) ++ if (::setjmp(m_jmp_state)) + return JPGD_FAILED; + + const bool chroma_y_filtering = ((m_flags & cFlagBoxChromaFiltering) == 0) && ((m_scan_type == JPGD_YH2V2) || (m_scan_type == JPGD_YH1V2)); +@@ -3042,7 +3042,7 @@ namespace jpgd { + + jpeg_decoder::jpeg_decoder(jpeg_decoder_stream* pStream, uint32_t flags) + { +- if (setjmp(m_jmp_state)) ++ if (::setjmp(m_jmp_state)) + return; + decode_init(pStream, flags); + } +@@ -3055,7 +3055,7 @@ namespace jpgd { + if (m_error_code) + return JPGD_FAILED; + +- if (setjmp(m_jmp_state)) ++ if (::setjmp(m_jmp_state)) + return JPGD_FAILED; + + decode_start(); diff --git a/thirdparty/mbedtls/include/mbedtls/check_config.h b/thirdparty/mbedtls/include/mbedtls/check_config.h index d076c2352f..93de091c4d 100644 --- a/thirdparty/mbedtls/include/mbedtls/check_config.h +++ b/thirdparty/mbedtls/include/mbedtls/check_config.h @@ -546,6 +546,23 @@ #error "MBEDTLS_SSL_PROTO_TLS1_2 defined, but not all prerequisites" #endif +#if (defined(MBEDTLS_SSL_PROTO_SSL3) || defined(MBEDTLS_SSL_PROTO_TLS1) || \ + defined(MBEDTLS_SSL_PROTO_TLS1_1) || defined(MBEDTLS_SSL_PROTO_TLS1_2)) && \ + !(defined(MBEDTLS_KEY_EXCHANGE_RSA_ENABLED) || \ + defined(MBEDTLS_KEY_EXCHANGE_DHE_RSA_ENABLED) || \ + defined(MBEDTLS_KEY_EXCHANGE_ECDHE_RSA_ENABLED) || \ + defined(MBEDTLS_KEY_EXCHANGE_ECDHE_ECDSA_ENABLED) || \ + defined(MBEDTLS_KEY_EXCHANGE_ECDH_RSA_ENABLED) || \ + defined(MBEDTLS_KEY_EXCHANGE_ECDH_ECDSA_ENABLED) || \ + defined(MBEDTLS_KEY_EXCHANGE_PSK_ENABLED) || \ + defined(MBEDTLS_KEY_EXCHANGE_DHE_PSK_ENABLED) || \ + defined(MBEDTLS_KEY_EXCHANGE_RSA_PSK_ENABLED) || \ + defined(MBEDTLS_KEY_EXCHANGE_ECDHE_PSK_ENABLED) || \ + defined(MBEDTLS_KEY_EXCHANGE_ECJPAKE_ENABLED) ) +#error "One or more versions of the TLS protocol are enabled " \ + "but no key exchange methods defined with MBEDTLS_KEY_EXCHANGE_xxxx" +#endif + #if defined(MBEDTLS_SSL_PROTO_DTLS) && \ !defined(MBEDTLS_SSL_PROTO_TLS1_1) && \ !defined(MBEDTLS_SSL_PROTO_TLS1_2) @@ -669,6 +686,10 @@ #error "MBEDTLS_X509_CREATE_C defined, but not all prerequisites" #endif +#if defined(MBEDTLS_CERTS_C) && !defined(MBEDTLS_X509_USE_C) +#error "MBEDTLS_CERTS_C defined, but not all prerequisites" +#endif + #if defined(MBEDTLS_X509_CRT_PARSE_C) && ( !defined(MBEDTLS_X509_USE_C) ) #error "MBEDTLS_X509_CRT_PARSE_C defined, but not all prerequisites" #endif diff --git a/thirdparty/mbedtls/include/mbedtls/version.h b/thirdparty/mbedtls/include/mbedtls/version.h index 8e2ce03c32..e0a2e7f6d6 100644 --- a/thirdparty/mbedtls/include/mbedtls/version.h +++ b/thirdparty/mbedtls/include/mbedtls/version.h @@ -40,16 +40,16 @@ */ #define MBEDTLS_VERSION_MAJOR 2 #define MBEDTLS_VERSION_MINOR 16 -#define MBEDTLS_VERSION_PATCH 5 +#define MBEDTLS_VERSION_PATCH 6 /** * The single version number has the following structure: * MMNNPP00 * Major version | Minor version | Patch version */ -#define MBEDTLS_VERSION_NUMBER 0x02100500 -#define MBEDTLS_VERSION_STRING "2.16.5" -#define MBEDTLS_VERSION_STRING_FULL "mbed TLS 2.16.5" +#define MBEDTLS_VERSION_NUMBER 0x02100600 +#define MBEDTLS_VERSION_STRING "2.16.6" +#define MBEDTLS_VERSION_STRING_FULL "mbed TLS 2.16.6" #if defined(MBEDTLS_VERSION_C) diff --git a/thirdparty/mbedtls/library/ecp.c b/thirdparty/mbedtls/library/ecp.c index 040c20bd38..725e176df2 100644 --- a/thirdparty/mbedtls/library/ecp.c +++ b/thirdparty/mbedtls/library/ecp.c @@ -1938,6 +1938,20 @@ static int ecp_mul_comb_after_precomp( const mbedtls_ecp_group *grp, final_norm: #endif + /* + * Knowledge of the jacobian coordinates may leak the last few bits of the + * scalar [1], and since our MPI implementation isn't constant-flow, + * inversion (used for coordinate normalization) may leak the full value + * of its input via side-channels [2]. + * + * [1] https://eprint.iacr.org/2003/191 + * [2] https://eprint.iacr.org/2020/055 + * + * Avoid the leak by randomizing coordinates before we normalize them. + */ + if( f_rng != 0 ) + MBEDTLS_MPI_CHK( ecp_randomize_jac( grp, RR, f_rng, p_rng ) ); + MBEDTLS_ECP_BUDGET( MBEDTLS_ECP_OPS_INV ); MBEDTLS_MPI_CHK( ecp_normalize_jac( grp, RR ) ); @@ -2308,6 +2322,20 @@ static int ecp_mul_mxz( mbedtls_ecp_group *grp, mbedtls_ecp_point *R, MBEDTLS_MPI_CHK( mbedtls_mpi_safe_cond_swap( &R->Z, &RP.Z, b ) ); } + /* + * Knowledge of the projective coordinates may leak the last few bits of the + * scalar [1], and since our MPI implementation isn't constant-flow, + * inversion (used for coordinate normalization) may leak the full value + * of its input via side-channels [2]. + * + * [1] https://eprint.iacr.org/2003/191 + * [2] https://eprint.iacr.org/2020/055 + * + * Avoid the leak by randomizing coordinates before we normalize them. + */ + if( f_rng != NULL ) + MBEDTLS_MPI_CHK( ecp_randomize_mxz( grp, R, f_rng, p_rng ) ); + MBEDTLS_MPI_CHK( ecp_normalize_mxz( grp, R ) ); cleanup: diff --git a/thirdparty/mbedtls/library/ssl_cli.c b/thirdparty/mbedtls/library/ssl_cli.c index afced7a99c..c5c3af69df 100644 --- a/thirdparty/mbedtls/library/ssl_cli.c +++ b/thirdparty/mbedtls/library/ssl_cli.c @@ -1417,6 +1417,19 @@ static int ssl_parse_hello_verify_request( mbedtls_ssl_context *ssl ) MBEDTLS_SSL_DEBUG_MSG( 2, ( "=> parse hello verify request" ) ); + /* Check that there is enough room for: + * - 2 bytes of version + * - 1 byte of cookie_len + */ + if( mbedtls_ssl_hs_hdr_len( ssl ) + 3 > ssl->in_msglen ) + { + MBEDTLS_SSL_DEBUG_MSG( 1, + ( "incoming HelloVerifyRequest message is too short" ) ); + mbedtls_ssl_send_alert_message( ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL, + MBEDTLS_SSL_ALERT_MSG_DECODE_ERROR ); + return( MBEDTLS_ERR_SSL_BAD_HS_SERVER_HELLO ); + } + /* * struct { * ProtocolVersion server_version; @@ -1445,8 +1458,6 @@ static int ssl_parse_hello_verify_request( mbedtls_ssl_context *ssl ) } cookie_len = *p++; - MBEDTLS_SSL_DEBUG_BUF( 3, "cookie", p, cookie_len ); - if( ( ssl->in_msg + ssl->in_msglen ) - p < cookie_len ) { MBEDTLS_SSL_DEBUG_MSG( 1, @@ -1455,6 +1466,7 @@ static int ssl_parse_hello_verify_request( mbedtls_ssl_context *ssl ) MBEDTLS_SSL_ALERT_MSG_DECODE_ERROR ); return( MBEDTLS_ERR_SSL_BAD_HS_SERVER_HELLO ); } + MBEDTLS_SSL_DEBUG_BUF( 3, "cookie", p, cookie_len ); mbedtls_free( ssl->handshake->verify_cookie ); diff --git a/thirdparty/mbedtls/library/ssl_tls.c b/thirdparty/mbedtls/library/ssl_tls.c index b8f35fec5d..cbec74fe8c 100644 --- a/thirdparty/mbedtls/library/ssl_tls.c +++ b/thirdparty/mbedtls/library/ssl_tls.c @@ -1004,8 +1004,6 @@ int mbedtls_ssl_derive_keys( mbedtls_ssl_context *ssl ) #if defined(MBEDTLS_SSL_HW_RECORD_ACCEL) if( mbedtls_ssl_hw_record_init != NULL ) { - int ret = 0; - MBEDTLS_SSL_DEBUG_MSG( 2, ( "going for mbedtls_ssl_hw_record_init()" ) ); if( ( ret = mbedtls_ssl_hw_record_init( ssl, key1, key2, transform->keylen, @@ -2885,15 +2883,18 @@ static void ssl_dtls_replay_reset( mbedtls_ssl_context *ssl ); /* * Swap transform_out and out_ctr with the alternative ones */ -static void ssl_swap_epochs( mbedtls_ssl_context *ssl ) +static int ssl_swap_epochs( mbedtls_ssl_context *ssl ) { mbedtls_ssl_transform *tmp_transform; unsigned char tmp_out_ctr[8]; +#if defined(MBEDTLS_SSL_HW_RECORD_ACCEL) + int ret; +#endif /* MBEDTLS_SSL_HW_RECORD_ACCEL */ if( ssl->transform_out == ssl->handshake->alt_transform_out ) { MBEDTLS_SSL_DEBUG_MSG( 3, ( "skip swap epochs" ) ); - return; + return( 0 ); } MBEDTLS_SSL_DEBUG_MSG( 3, ( "swap epochs" ) ); @@ -2920,7 +2921,9 @@ static void ssl_swap_epochs( mbedtls_ssl_context *ssl ) return( MBEDTLS_ERR_SSL_HW_ACCEL_FAILED ); } } -#endif +#endif /* MBEDTLS_SSL_HW_RECORD_ACCEL */ + + return( 0 ); } /* @@ -2957,7 +2960,8 @@ int mbedtls_ssl_flight_transmit( mbedtls_ssl_context *ssl ) ssl->handshake->cur_msg = ssl->handshake->flight; ssl->handshake->cur_msg_p = ssl->handshake->flight->p + 12; - ssl_swap_epochs( ssl ); + if( ( ret = ssl_swap_epochs( ssl ) ) != 0 ) + return( ret ); ssl->handshake->retransmit_state = MBEDTLS_SSL_RETRANS_SENDING; } @@ -2980,7 +2984,8 @@ int mbedtls_ssl_flight_transmit( mbedtls_ssl_context *ssl ) if( is_finished && ssl->handshake->cur_msg_p == ( cur->p + 12 ) ) { MBEDTLS_SSL_DEBUG_MSG( 2, ( "swap epochs to send finished message" ) ); - ssl_swap_epochs( ssl ); + if( ( ret = ssl_swap_epochs( ssl ) ) != 0 ) + return( ret ); } ret = ssl_get_remaining_payload_in_datagram( ssl ); @@ -3017,7 +3022,10 @@ int mbedtls_ssl_flight_transmit( mbedtls_ssl_context *ssl ) if( ( max_frag_len < 12 ) || ( max_frag_len == 12 && hs_len != 0 ) ) { if( is_finished ) - ssl_swap_epochs( ssl ); + { + if( ( ret = ssl_swap_epochs( ssl ) ) != 0 ) + return( ret ); + } if( ( ret = mbedtls_ssl_flush_output( ssl ) ) != 0 ) return( ret ); @@ -3997,17 +4005,23 @@ static int ssl_handle_possible_reconnect( mbedtls_ssl_context *ssl ) if( ret == MBEDTLS_ERR_SSL_HELLO_VERIFY_REQUIRED ) { + int send_ret; + MBEDTLS_SSL_DEBUG_MSG( 1, ( "sending HelloVerifyRequest" ) ); + MBEDTLS_SSL_DEBUG_BUF( 4, "output record sent to network", + ssl->out_buf, len ); /* Don't check write errors as we can't do anything here. * If the error is permanent we'll catch it later, * if it's not, then hopefully it'll work next time. */ - (void) ssl->f_send( ssl->p_bio, ssl->out_buf, len ); + send_ret = ssl->f_send( ssl->p_bio, ssl->out_buf, len ); + MBEDTLS_SSL_DEBUG_RET( 2, "ssl->f_send", send_ret ); + (void) send_ret; return( MBEDTLS_ERR_SSL_HELLO_VERIFY_REQUIRED ); } if( ret == 0 ) { - /* Got a valid cookie, partially reset context */ + MBEDTLS_SSL_DEBUG_MSG( 1, ( "cookie is valid, resetting context" ) ); if( ( ret = ssl_session_reset_int( ssl, 1 ) ) != 0 ) { MBEDTLS_SSL_DEBUG_RET( 1, "reset", ret ); diff --git a/thirdparty/mbedtls/library/x509.c b/thirdparty/mbedtls/library/x509.c index 2e0b0e8f6c..4d25303206 100644 --- a/thirdparty/mbedtls/library/x509.c +++ b/thirdparty/mbedtls/library/x509.c @@ -1063,7 +1063,7 @@ cleanup: mbedtls_x509_crt_free( &clicert ); #else ((void) verbose); -#endif /* MBEDTLS_CERTS_C && MBEDTLS_SHA1_C */ +#endif /* MBEDTLS_CERTS_C && MBEDTLS_SHA256_C */ return( ret ); } 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..b28944a4d9 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; @@ -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/vulkan/android/vk_mem_alloc.cpp b/thirdparty/vulkan/android/vk_mem_alloc.cpp new file mode 100644 index 0000000000..a28454cf6e --- /dev/null +++ b/thirdparty/vulkan/android/vk_mem_alloc.cpp @@ -0,0 +1,8 @@ +#define VMA_IMPLEMENTATION +#ifdef DEBUG_ENABLED +#ifndef _DEBUG +#define _DEBUG +#endif +#endif +// Include memory allocator from Android NDK +#include <vk_mem_alloc.h> |